diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index f63fcf3..2e2bea8 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -445,11 +445,11 @@
     private void updateBlockActionItem() {
         if (mBlockedNumberId == null) {
             mBlockNumberActionItem.setText(R.string.action_block_number);
-            mBlockNumberActionItem.setCompoundDrawablesWithIntrinsicBounds(
+            mBlockNumberActionItem.setCompoundDrawablesRelativeWithIntrinsicBounds(
                     R.drawable.ic_call_detail_block, 0, 0, 0);
         } else {
             mBlockNumberActionItem.setText(R.string.action_unblock_number);
-            mBlockNumberActionItem.setCompoundDrawablesWithIntrinsicBounds(
+            mBlockNumberActionItem.setCompoundDrawablesRelativeWithIntrinsicBounds(
                     R.drawable.ic_call_detail_unblock, 0, 0, 0);
         }
 
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 0087506..89596f2 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -467,7 +467,8 @@
         }
 
         // For voicemail calls, show the voicemail playback layout; hide otherwise.
-        if (callType == Calls.VOICEMAIL_TYPE && mVoicemailPlaybackPresenter != null) {
+        if (callType == Calls.VOICEMAIL_TYPE && mVoicemailPlaybackPresenter != null
+                && !TextUtils.isEmpty(voicemailUri)) {
             voicemailPlaybackView.setVisibility(View.VISIBLE);
 
             Uri uri = Uri.parse(voicemailUri);
diff --git a/src/com/android/dialer/list/BlockedListSearchFragment.java b/src/com/android/dialer/list/BlockedListSearchFragment.java
index 2d04c69..daa384a 100644
--- a/src/com/android/dialer/list/BlockedListSearchFragment.java
+++ b/src/com/android/dialer/list/BlockedListSearchFragment.java
@@ -32,7 +32,6 @@
 
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.common.list.ContactEntryListAdapter;
-import com.android.contacts.common.list.ContactListItemView;
 import com.android.contacts.common.util.ContactDisplayUtils;
 import com.android.dialer.R;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
@@ -49,22 +48,18 @@
     private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
 
     private EditText mSearchView;
-    private String mSearchQuery;
 
     private final TextWatcher mPhoneSearchQueryTextListener = new TextWatcher() {
         @Override
-        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-        }
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
 
         @Override
         public void onTextChanged(CharSequence s, int start, int before, int count) {
-            mSearchQuery = s.toString();
-            setQueryString(mSearchQuery, false);
+            setQueryString(s.toString(), false);
         }
 
         @Override
-        public void afterTextChanged(Editable s) {
-        }
+        public void afterTextChanged(Editable s) {}
     };
 
     private final SearchEditTextLayout.Callback mSearchLayoutCallback =
@@ -83,14 +78,17 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        // Show list of all phone numbers when search query is empty.
-        setShowEmptyListForNullQuery(false);
-
+        setShowEmptyListForNullQuery(true);
+        /*
+         * Pass in the empty string here so ContactEntryListFragment#setQueryString interprets it as
+         * an empty search query, rather than as an uninitalized value. In the latter case, the
+         * adapter returned by #createListAdapter is used, which populates the view with contacts.
+         * Passing in the empty string forces ContactEntryListFragment to interpret it as an empty
+         * query, which results in showing an empty view
+         */
+        setQueryString(getQueryString() == null ? "" : getQueryString(), false);
         mFilteredNumberAsyncQueryHandler = new FilteredNumberAsyncQueryHandler(
                 getContext().getContentResolver());
-        if (savedInstanceState != null) {
-            mSearchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY);
-        }
     }
 
     @Override
@@ -116,8 +114,8 @@
         searchEditTextLayout.findViewById(R.id.search_box_expanded)
                 .setBackgroundColor(getContext().getResources().getColor(android.R.color.white));
 
-        if (!TextUtils.isEmpty(mSearchQuery)) {
-            mSearchView.setText(mSearchQuery);
+        if (!TextUtils.isEmpty(getQueryString())) {
+            mSearchView.setText(getQueryString());
         }
 
         // TODO: Don't set custom text size; use default search text size.
@@ -126,21 +124,17 @@
     }
 
     @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putString(KEY_SEARCH_QUERY, getAdapter().getQueryString());
-    }
-
-    @Override
     protected ContactEntryListAdapter createListAdapter() {
         BlockedListSearchAdapter adapter = new BlockedListSearchAdapter(getActivity());
         adapter.setDisplayPhotos(true);
         // Don't show SIP addresses.
         adapter.setUseCallableUri(false);
-        adapter.setQueryString(mSearchQuery);
+        // Keep in sync with the queryString set in #onCreate
+        adapter.setQueryString(getQueryString() == null ? "" : getQueryString());
         return adapter;
     }
 
+
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         super.onItemClick(parent, view, position, id);
@@ -153,7 +147,7 @@
             case DialerPhoneNumberListAdapter.SHORTCUT_INVALID:
                 // Handles click on a search result, either contact or nearby places result.
                 number = adapter.getPhoneNumber(adapterPosition);
-                blockContactNumber(adapter, (ContactListItemView) view, number, blockId);
+                blockContactNumber(number, blockId);
                 break;
             case DialerPhoneNumberListAdapter.SHORTCUT_BLOCK_NUMBER:
                 // Handles click on 'Block number' shortcut to add the user query as a number.
@@ -218,11 +212,7 @@
         getAdapter().notifyDataSetChanged();
     }
 
-    private void blockContactNumber(
-            final BlockedListSearchAdapter adapter,
-            final ContactListItemView view,
-            final String number,
-            final Integer blockId) {
+    private void blockContactNumber(final String number, final Integer blockId) {
         if (blockId != null) {
             Toast.makeText(getContext(), ContactDisplayUtils.getTtsSpannedPhoneNumber(
                             getResources(), R.string.alreadyBlocked, number),
diff --git a/src/com/android/dialer/logging/ScreenEvent.java b/src/com/android/dialer/logging/ScreenEvent.java
index c88a7b7..7af3f6e 100644
--- a/src/com/android/dialer/logging/ScreenEvent.java
+++ b/src/com/android/dialer/logging/ScreenEvent.java
@@ -121,6 +121,9 @@
         sScreenNameMap.put(ScreenEvent.INCOMING_CALL, AnswerFragment.class.getSimpleName());
         sScreenNameMap.put(ScreenEvent.CONFERENCE_MANAGEMENT,
                 ConferenceManagerFragment.class.getSimpleName());
+        sScreenNameMap.put(ScreenEvent.INCALL_DIALPAD,
+                getScreenNameWithTag(DialpadFragment.class.getSimpleName(), "InCall"));
+
     }
 
     /**
