diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index a05ef6d..2999c6b 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -23,11 +23,14 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
+import android.database.ContentObserver;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Handler;
 import android.provider.CallLog.Calls;
 import android.provider.ContactsContract.QuickContact;
+import android.provider.VoicemailContract;
 import android.support.annotation.Nullable;
 import android.support.design.widget.FloatingActionButton;
 import android.support.design.widget.Snackbar;
@@ -91,9 +94,15 @@
 import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.util.DialerUtils;
+import com.android.dialer.util.PermissionsUtil;
 import com.android.dialer.util.TransactionSafeActivity;
+import com.android.dialer.voicemail.listui.error.VoicemailStatusCorruptionHandler;
+import com.android.dialer.voicemail.listui.error.VoicemailStatusCorruptionHandler.Source;
+import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker;
+import com.android.dialer.voicemailstatus.VoicemailStatusHelper;
 import com.android.voicemail.VoicemailComponent;
 import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -273,7 +282,7 @@
     if (VoicemailComponent.get(context)
         .getVoicemailClient()
         .isVoicemailEnabled(context, defaultUserSelectedAccount)) {
-      LogUtil.i("OldMainActivityPeer.canVoicemailTabBeShown", "Voicemail is not enabled");
+      LogUtil.i("OldMainActivityPeer.canVoicemailTabBeShown", "Voicemail is enabled");
       return true;
     }
     LogUtil.i("OldMainActivityPeer.canVoicemailTabBeShown", "returning false");
@@ -706,7 +715,6 @@
    *   <li>Marking missed calls as read when appropriate. See {@link
    *       #markMissedCallsAsReadAndRemoveNotification()}
    *   <li>TODO(calderwoodra): multiselect
-   *   <li>TODO(calderwoodra): voicemail status
    * </ul>
    *
    * @see CallLogFragmentListener
@@ -727,6 +735,15 @@
     private long timeSelected = -1;
     private boolean activityIsAlive;
 
+    private final ContentObserver voicemailStatusObserver =
+        new ContentObserver(new Handler()) {
+          @Override
+          public void onChange(boolean selfChange) {
+            super.onChange(selfChange);
+            callLogQueryHandler.fetchVoicemailStatus();
+          }
+        };
+
     MainCallLogFragmentListener(
         Context context,
         ContentResolver contentResolver,
@@ -738,6 +755,21 @@
       this.toolbar = toolbar;
     }
 
+    private void registerVoicemailStatusContentObserver(Context context) {
+
+      if (PermissionsUtil.hasReadVoicemailPermissions(context)
+          && PermissionsUtil.hasAddVoicemailPermissions(context)) {
+        context
+            .getContentResolver()
+            .registerContentObserver(
+                VoicemailContract.Status.CONTENT_URI, true, voicemailStatusObserver);
+      } else {
+        LogUtil.w(
+            "MainCallLogFragmentListener.registerVoicemailStatusContentObserver",
+            "no voicemail read/add permissions");
+      }
+    }
+
     @Override
     public void updateTabUnreadCounts() {
       callLogQueryHandler.fetchMissedCallsUnreadCount();
@@ -752,7 +784,42 @@
 
     @Override
     public void onVoicemailStatusFetched(Cursor statusCursor) {
-      // TODO(calderwoodra): handle this when voicemail is implemented
+      LogUtil.i("OldMainActivityPeer.MainCallLogFragmentListener", "onVoicemailStatusFetched");
+      VoicemailStatusCorruptionHandler.maybeFixVoicemailStatus(
+          context, statusCursor, Source.Activity);
+
+      // Update hasActiveVoicemailProvider, which controls the number of tabs displayed.
+      int numberOfActiveVoicemailSources =
+          VoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor);
+
+      boolean hasActiveVoicemailProvider = numberOfActiveVoicemailSources > 0;
+      LogUtil.i(
+          "OldMainActivityPeer.onVoicemailStatusFetched",
+          String.format(
+              Locale.US,
+              "hasActiveVoicemailProvider:%b, number of active voicemail sources:%d",
+              hasActiveVoicemailProvider,
+              numberOfActiveVoicemailSources));
+
+      if (hasActiveVoicemailProvider) {
+        // TODO(yueg): Use new logging for VVM_TAB_VISIBLE
+        // Logger.get(context).logImpression(DialerImpression.Type.VVM_TAB_VISIBLE);
+        bottomNavBar.showVoicemail(true);
+        callLogQueryHandler.fetchVoicemailUnreadCount();
+      } else {
+        bottomNavBar.showVoicemail(false);
+      }
+
+      StorageComponent.get(context)
+          .unencryptedSharedPrefs()
+          .edit()
+          .putBoolean(
+              VisualVoicemailEnabledChecker.PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER,
+              hasActiveVoicemailProvider)
+          .apply();
+
+      // TODO(uabdullah): Check if we need to force move to the VM tab (e.g in the event of
+      // clicking a vm notification and a status wasn't yet fetched).
     }
 
     @Override
@@ -812,6 +879,7 @@
 
     public void onActivityResume() {
       activityIsAlive = true;
+      registerVoicemailStatusContentObserver(context);
       callLogQueryHandler.fetchVoicemailStatus();
       callLogQueryHandler.fetchMissedCallsUnreadCount();
       // Reset the tab on resume to restart the timer
@@ -820,6 +888,7 @@
 
     /** Should be called when {@link Activity#onStop()} is called. */
     public void onActivityStop(boolean changingConfigurations, boolean keyguardLocked) {
+      context.getContentResolver().unregisterContentObserver(voicemailStatusObserver);
       activityIsAlive = false;
       if (viewedCallLogTabPastTimeThreshold() && !changingConfigurations && !keyguardLocked) {
         markMissedCallsAsReadAndRemoveNotification();
diff --git a/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java b/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java
index d9a446f..5ee33fc 100644
--- a/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java
+++ b/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java
@@ -23,6 +23,7 @@
 import android.view.View;
 import android.widget.LinearLayout;
 import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
@@ -123,8 +124,25 @@
     }
   }
 
+  /**
+   * Displays or hides the voicemail tab.
+   *
+   * <p>In the event that the voicemail tab was earlier visible but is now no longer visible, we
+   * move to the speed dial tab.
+   *
+   * @param showTab whether to hide or show the voicemail
+   */
   public void showVoicemail(boolean showTab) {
+    LogUtil.i("OldMainActivityPeer.showVoicemail", "showing Tab:%b", showTab);
+    int voicemailpreviousVisibility = voicemail.getVisibility();
     voicemail.setVisibility(showTab ? View.VISIBLE : View.GONE);
+    int voicemailcurrentVisibility = voicemail.getVisibility();
+
+    if (voicemailpreviousVisibility != voicemailcurrentVisibility
+        && voicemailpreviousVisibility == View.VISIBLE) {
+      LogUtil.i("OldMainActivityPeer.showVoicemail", "hid VM tab and moved to speed dial tab");
+      selectTab(TabIndex.SPEED_DIAL);
+    }
   }
 
   public void setNotificationCount(@TabIndex int tab, int count) {
