diff --git a/src/com/android/dialer/calllog/CallLogActivity.java b/src/com/android/dialer/calllog/CallLogActivity.java
index 00e5e6b..d5444de 100644
--- a/src/com/android/dialer/calllog/CallLogActivity.java
+++ b/src/com/android/dialer/calllog/CallLogActivity.java
@@ -41,42 +41,22 @@
 import com.android.dialer.voicemail.VoicemailStatusHelper;
 import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
 
-public class CallLogActivity extends Activity implements CallLogQueryHandler.Listener,
-    ViewPager.OnPageChangeListener {
-    private Handler mHandler;
+public class CallLogActivity extends Activity implements ViewPager.OnPageChangeListener {
     private ViewPager mViewPager;
     private ViewPagerTabs mViewPagerTabs;
     private ViewPagerAdapter mViewPagerAdapter;
     private CallLogFragment mAllCallsFragment;
     private CallLogFragment mMissedCallsFragment;
-    private CallLogFragment mVoicemailFragment;
-    private VoicemailStatusHelper mVoicemailStatusHelper;
-
-    private static final int WAIT_FOR_VOICEMAIL_PROVIDER_TIMEOUT_MS = 300;
-    private boolean mSwitchToVoicemailTab;
 
     private String[] mTabTitles;
 
     private static final int TAB_INDEX_ALL = 0;
     private static final int TAB_INDEX_MISSED = 1;
-    private static final int TAB_INDEX_VOICEMAIL = 2;
 
-    private static final int TAB_INDEX_COUNT_DEFAULT = 2;
-    private static final int TAB_INDEX_COUNT_WITH_VOICEMAIL = 3;
-
-    private boolean mHasActiveVoicemailProvider;
+    private static final int TAB_INDEX_COUNT = 2;
 
     private boolean mIsResumed;
 
-    private final Runnable mWaitForVoicemailTimeoutRunnable = new Runnable() {
-        @Override
-        public void run() {
-            mViewPagerTabs.setViewPager(mViewPager);
-            mViewPager.setCurrentItem(TAB_INDEX_ALL);
-            mSwitchToVoicemailTab = false;
-        }
-    };
-
     public class ViewPagerAdapter extends FragmentPagerAdapter {
         public ViewPagerAdapter(FragmentManager fm) {
             super(fm);
@@ -89,8 +69,6 @@
                     return new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL);
                 case TAB_INDEX_MISSED:
                     return new CallLogFragment(Calls.MISSED_TYPE);
-                case TAB_INDEX_VOICEMAIL:
-                    return new CallLogFragment(Calls.VOICEMAIL_TYPE);
             }
             throw new IllegalStateException("No fragment at position " + position);
         }
@@ -106,9 +84,6 @@
                 case TAB_INDEX_MISSED:
                     mMissedCallsFragment = fragment;
                     break;
-                case TAB_INDEX_VOICEMAIL:
-                    mVoicemailFragment = fragment;
-                    break;
             }
             return fragment;
         }
@@ -120,8 +95,7 @@
 
         @Override
         public int getCount() {
-            return mHasActiveVoicemailProvider ? TAB_INDEX_COUNT_WITH_VOICEMAIL :
-                    TAB_INDEX_COUNT_DEFAULT;
+            return TAB_INDEX_COUNT;
         }
     }
 
@@ -137,8 +111,6 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        mHandler = new Handler();
-
         setContentView(R.layout.call_log_activity);
         getWindow().setBackgroundDrawable(null);
 
@@ -154,47 +126,30 @@
             final int callType = intent.getIntExtra(CallLog.Calls.EXTRA_CALL_TYPE_FILTER, -1);
             if (callType == CallLog.Calls.MISSED_TYPE) {
                 startingTab = TAB_INDEX_MISSED;
-            } else if (callType == CallLog.Calls.VOICEMAIL_TYPE) {
-                startingTab = TAB_INDEX_VOICEMAIL;
             }
         }
 
-        mTabTitles = new String[TAB_INDEX_COUNT_WITH_VOICEMAIL];
+        mTabTitles = new String[TAB_INDEX_COUNT];
         mTabTitles[0] = getString(R.string.call_log_all_title);
         mTabTitles[1] = getString(R.string.call_log_missed_title);
-        mTabTitles[2] = getString(R.string.call_log_voicemail_title);
 
         mViewPager = (ViewPager) findViewById(R.id.call_log_pager);
 
         mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager());
         mViewPager.setAdapter(mViewPagerAdapter);
-        mViewPager.setOffscreenPageLimit(2);
+        mViewPager.setOffscreenPageLimit(1);
         mViewPager.setOnPageChangeListener(this);
 
         mViewPagerTabs = (ViewPagerTabs) findViewById(R.id.viewpager_header);
 
-        if (startingTab == TAB_INDEX_VOICEMAIL) {
-            // The addition of the voicemail tab is an asynchronous process, so wait till the tab
-            // is added, before attempting to switch to it. If the querying of CP2 for voicemail
-            // providers takes too long, give up and show the first tab instead.
-            mSwitchToVoicemailTab = true;
-            mHandler.postDelayed(mWaitForVoicemailTimeoutRunnable,
-                    WAIT_FOR_VOICEMAIL_PROVIDER_TIMEOUT_MS);
-        } else {
-            mViewPagerTabs.setViewPager(mViewPager);
-            mViewPager.setCurrentItem(startingTab);
-        }
-
-        mVoicemailStatusHelper = new VoicemailStatusHelperImpl();
+        mViewPagerTabs.setViewPager(mViewPager);
+        mViewPager.setCurrentItem(startingTab);
     }
 
     @Override
     protected void onResume() {
         mIsResumed = true;
         super.onResume();
-        CallLogQueryHandler callLogQueryHandler =
-                new CallLogQueryHandler(this, this.getContentResolver(), this);
-        callLogQueryHandler.fetchVoicemailStatus();
         sendScreenViewForChildFragment(mViewPager.getCurrentItem());
     }
 
@@ -238,36 +193,6 @@
     }
 
     @Override
-    public void onVoicemailStatusFetched(Cursor statusCursor) {
-        if (this.isFinishing()) {
-            return;
-        }
-
-        mHandler.removeCallbacks(mWaitForVoicemailTimeoutRunnable);
-        // Update mHasActiveVoicemailProvider, which controls the number of tabs displayed.
-        boolean hasActiveVoicemailProvider =
-                mVoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor) > 0;
-        if (hasActiveVoicemailProvider != mHasActiveVoicemailProvider) {
-            mHasActiveVoicemailProvider = hasActiveVoicemailProvider;
-            mViewPagerAdapter.notifyDataSetChanged();
-            mViewPagerTabs.setViewPager(mViewPager);
-            if (mSwitchToVoicemailTab) {
-                mViewPager.setCurrentItem(TAB_INDEX_VOICEMAIL, false);
-            }
-        } else if (mSwitchToVoicemailTab) {
-            // The voicemail tab was requested, but it does not exist because there are no
-            // voicemail sources. Just fallback to the first item instead.
-            mViewPagerTabs.setViewPager(mViewPager);
-        }
-    }
-
-    @Override
-    public boolean onCallsFetched(Cursor statusCursor) {
-        // Return false; did not take ownership of cursor
-        return false;
-    }
-
-    @Override
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
         mViewPagerTabs.onPageScrolled(position, positionOffset, positionOffsetPixels);
     }
@@ -300,8 +225,6 @@
                 return "All";
             case TAB_INDEX_MISSED:
                 return "Missed";
-            case TAB_INDEX_VOICEMAIL:
-                return "Voicemail";
         }
         return null;
     }
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
index 92bc089..4597d35 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
@@ -286,7 +286,9 @@
             mMediaPlayer = null;
         }
 
-        mActivity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
+        if (mActivity != null) {
+            mActivity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
+        }
         disableProximitySensor(false /* waitForFarState */);
     }
 
