diff --git a/src/com/android/phone/VoicemailStatus.java b/src/com/android/phone/VoicemailStatus.java
index 062e734..2d8bcc3 100644
--- a/src/com/android/phone/VoicemailStatus.java
+++ b/src/com/android/phone/VoicemailStatus.java
@@ -23,7 +23,6 @@
 import android.provider.VoicemailContract;
 import android.provider.VoicemailContract.Status;
 import android.telecom.PhoneAccountHandle;
-
 import com.android.phone.vvm.omtp.utils.PhoneAccountHandleConverter;
 
 public class VoicemailStatus {
@@ -41,6 +40,10 @@
             mPhoneAccountHandle = phoneAccountHandle;
         }
 
+        public PhoneAccountHandle getPhoneAccountHandle() {
+            return mPhoneAccountHandle;
+        }
+
         public Editor setType(String type) {
             mValues.put(Status.SOURCE_TYPE, type);
             return this;
@@ -79,6 +82,33 @@
             ContentResolver contentResolver = mContext.getContentResolver();
             Uri statusUri = VoicemailContract.Status.buildSourceUri(mContext.getPackageName());
             contentResolver.insert(statusUri, mValues);
+            mValues.clear();
+        }
+
+        public ContentValues getValues() {
+            return mValues;
+        }
+    }
+
+    /**
+     * A voicemail status editor that the decision of whether to actually write to the database can
+     * be deferred. This object will be passed around as a usual {@link Editor}, but {@link
+     * #apply()} doesn't do anything. If later the creator of this object decides any status changes
+     * written to it should be committed, {@link #deferredApply()} should be called.
+     */
+    public static class DeferredEditor extends Editor {
+
+        private DeferredEditor(Context context, PhoneAccountHandle phoneAccountHandle) {
+            super(context, phoneAccountHandle);
+        }
+
+        @Override
+        public void apply() {
+            // Do nothing
+        }
+
+        public void deferredApply() {
+            super.apply();
         }
     }
 
@@ -89,4 +119,8 @@
     public static Editor edit(Context context, int subId) {
         return new Editor(context, PhoneAccountHandleConverter.fromSubId(subId));
     }
+
+    public static DeferredEditor deferredEdit(Context context, int subId) {
+        return new DeferredEditor(context, PhoneAccountHandleConverter.fromSubId(subId));
+    }
 }
diff --git a/src/com/android/phone/settings/VoicemailChangePinActivity.java b/src/com/android/phone/settings/VoicemailChangePinActivity.java
index a963af2..74adb12 100644
--- a/src/com/android/phone/settings/VoicemailChangePinActivity.java
+++ b/src/com/android/phone/settings/VoicemailChangePinActivity.java
@@ -46,6 +46,7 @@
 import android.widget.Toast;
 import com.android.phone.PhoneUtils;
 import com.android.phone.R;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.common.mail.MessagingException;
 import com.android.phone.vvm.omtp.OmtpConstants;
 import com.android.phone.vvm.omtp.OmtpConstants.ChangePinResult;
@@ -181,7 +182,7 @@
                     // Wipe the default old PIN so the old PIN input box will be shown to the user
                     // on the next time.
                     setDefaultOldPIN(activity, activity.mPhoneAccountHandle, null);
-                    activity.mConfig.handleEvent(OmtpEvents.CONFIG_PIN_SET);
+                    activity.handleOmtpEvent(OmtpEvents.CONFIG_PIN_SET);
                     activity.updateState(State.EnterOldPin);
                 }
             }
@@ -271,7 +272,7 @@
                     // Wipe the default old PIN so the old PIN input box will be shown to the user
                     // on the next time.
                     setDefaultOldPIN(activity, activity.mPhoneAccountHandle, null);
-                    activity.mConfig.handleEvent(OmtpEvents.CONFIG_PIN_SET);
+                    activity.handleOmtpEvent(OmtpEvents.CONFIG_PIN_SET);
 
                     activity.finish();
 
@@ -377,6 +378,16 @@
         }
     }
 
+    private void handleOmtpEvent(OmtpEvents event) {
+        mConfig.handleEvent(getVoicemailStatusEditor(), event);
+    }
+
+    private VoicemailStatus.Editor getVoicemailStatusEditor() {
+        // This activity does not have any automatic retry mechanism, errors should be written right
+        // away.
+        return VoicemailStatus.edit(this, mPhoneAccountHandle);
+    }
+
     /**
      * Extracts the pin length requirement sent by the server with a STATUS SMS.
      */
@@ -588,7 +599,8 @@
         private final String mNewPin;
 
         public ChangePinNetworkRequestCallback(String oldPin, String newPin) {
-            super(mConfig, mPhoneAccountHandle);
+            super(mConfig, mPhoneAccountHandle,
+                VoicemailChangePinActivity.this.getVoicemailStatusEditor());
             mOldPin = oldPin;
             mNewPin = newPin;
         }
@@ -597,7 +609,8 @@
         public void onAvailable(Network network) {
             super.onAvailable(network);
             try (ImapHelper helper =
-                new ImapHelper(VoicemailChangePinActivity.this, mPhoneAccountHandle, network)){
+                new ImapHelper(VoicemailChangePinActivity.this, mPhoneAccountHandle, network,
+                    getVoicemailStatusEditor())) {
 
                 @ChangePinResult int result =
                         helper.changePin(mOldPin, mNewPin);
diff --git a/src/com/android/phone/vvm/omtp/ActivationTask.java b/src/com/android/phone/vvm/omtp/ActivationTask.java
index b575b95..5998950 100644
--- a/src/com/android/phone/vvm/omtp/ActivationTask.java
+++ b/src/com/android/phone/vvm/omtp/ActivationTask.java
@@ -29,6 +29,7 @@
 import android.telephony.TelephonyManager;
 import com.android.phone.Assert;
 import com.android.phone.PhoneGlobals;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.protocol.VisualVoicemailProtocol;
 import com.android.phone.vvm.omtp.scheduling.BaseTask;
 import com.android.phone.vvm.omtp.scheduling.RetryPolicy;
@@ -63,11 +64,14 @@
     @Nullable
     private static DeviceProvisionedObserver sDeviceProvisionedObserver;
 
+    private final RetryPolicy mRetryPolicy;
+
     private Bundle mData;
 
     public ActivationTask() {
         super(TASK_ACTIVATION);
-        addPolicy(new RetryPolicy(RETRY_TIMES, RETRY_INTERVAL_MILLIS));
+        mRetryPolicy = new RetryPolicy(RETRY_TIMES, RETRY_INTERVAL_MILLIS);
+        addPolicy(mRetryPolicy);
     }
 
     /**
@@ -123,9 +127,18 @@
         int subId = getSubId();
 
         OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(getContext(), subId);
-        helper.handleEvent(OmtpEvents.CONFIG_ACTIVATING);
-        helper.activateSmsFilter();
         PhoneAccountHandle phoneAccountHandle = PhoneAccountHandleConverter.fromSubId(subId);
+        if (!OmtpVvmSourceManager.getInstance(getContext())
+                .isVvmSourceRegistered(phoneAccountHandle)) {
+            // Only show the "activating" message if activation has not been completed before in
+            // this boot. Subsequent activations are more of a status check and usually does not
+            // concern the user.
+            helper.handleEvent(VoicemailStatus.edit(getContext(), subId),
+                    OmtpEvents.CONFIG_ACTIVATING);
+        }
+
+        helper.activateSmsFilter();
+        VoicemailStatus.Editor status = mRetryPolicy.getVoicemailStatusEditor();
 
         VisualVoicemailProtocol protocol = helper.getProtocol();
 
@@ -144,7 +157,7 @@
             } catch (TimeoutException e) {
                 // The carrier is expected to return an STATUS SMS within STATUS_SMS_TIMEOUT_MILLIS
                 // handleEvent() will do the logging.
-                helper.handleEvent(OmtpEvents.CONFIG_STATUS_SMS_TIME_OUT);
+                helper.handleEvent(status, OmtpEvents.CONFIG_STATUS_SMS_TIME_OUT);
                 fail();
                 return;
             } catch (InterruptedException | ExecutionException | IOException e) {
@@ -160,32 +173,32 @@
 
         if (message.getProvisioningStatus().equals(OmtpConstants.SUBSCRIBER_READY)) {
             VvmLog.d(TAG, "subscriber ready, no activation required");
-            updateSource(getContext(), phoneAccountHandle, getSubId(), message);
+            updateSource(getContext(), phoneAccountHandle, getSubId(), status, message);
         } else {
             if (helper.supportsProvisioning()) {
                 VvmLog.i(TAG, "Subscriber not ready, start provisioning");
-                helper.startProvisioning(this, phoneAccountHandle, message, data);
+                helper.startProvisioning(this, phoneAccountHandle, status, message, data);
 
             } else if (message.getProvisioningStatus().equals(OmtpConstants.SUBSCRIBER_NEW)) {
                 VvmLog.i(TAG, "Subscriber new but provisioning is not supported");
                 // Ignore the non-ready state and attempt to use the provided info as is.
                 // This is probably caused by not completing the new user tutorial.
-                updateSource(getContext(), phoneAccountHandle, getSubId(), message);
+                updateSource(getContext(), phoneAccountHandle, getSubId(), status, message);
             } else {
                 VvmLog.i(TAG, "Subscriber not ready but provisioning is not supported");
-                helper.handleEvent(OmtpEvents.CONFIG_SERVICE_NOT_AVAILABLE);
+                helper.handleEvent(status, OmtpEvents.CONFIG_SERVICE_NOT_AVAILABLE);
             }
         }
     }
 
     public static void updateSource(Context context, PhoneAccountHandle phone, int subId,
-            StatusMessage message) {
+            VoicemailStatus.Editor status, StatusMessage message) {
         OmtpVvmSourceManager vvmSourceManager =
                 OmtpVvmSourceManager.getInstance(context);
 
         if (OmtpConstants.SUCCESS.equals(message.getReturnCode())) {
             OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(context, subId);
-            helper.handleEvent(OmtpEvents.CONFIG_REQUEST_STATUS_SUCCESS);
+            helper.handleEvent(status, OmtpEvents.CONFIG_REQUEST_STATUS_SUCCESS);
 
             // Save the IMAP credentials in preferences so they are persistent and can be retrieved.
             VisualVoicemailPreferences prefs = new VisualVoicemailPreferences(context, phone);
diff --git a/src/com/android/phone/vvm/omtp/DefaultOmtpEventHandler.java b/src/com/android/phone/vvm/omtp/DefaultOmtpEventHandler.java
index 353ba07..88943c9 100644
--- a/src/com/android/phone/vvm/omtp/DefaultOmtpEventHandler.java
+++ b/src/com/android/phone/vvm/omtp/DefaultOmtpEventHandler.java
@@ -27,31 +27,31 @@
     private static final String TAG = "DefErrorCodeHandler";
 
     public static void handleEvent(Context context, OmtpVvmCarrierConfigHelper config,
-            OmtpEvents event) {
+        VoicemailStatus.Editor status, OmtpEvents event) {
         switch (event.getType()) {
             case Type.CONFIGURATION:
-                handleConfigurationEvent(context, config, event);
+                handleConfigurationEvent(context, status, event);
                 break;
             case Type.DATA_CHANNEL:
-                handleDataChannelEvent(context, config, event);
+                handleDataChannelEvent(context, status, event);
                 break;
             case Type.NOTIFICATION_CHANNEL:
-                handleNotificationChannelEvent(context, config, event);
+                handleNotificationChannelEvent(context, config, status, event);
                 break;
             case Type.OTHER:
-                handleOtherEvent(context, config, event);
+                handleOtherEvent(context, status, event);
                 break;
             default:
                 VvmLog.wtf(TAG, "invalid event type " + event.getType() + " for " + event);
         }
     }
 
-    private static void handleConfigurationEvent(Context context, OmtpVvmCarrierConfigHelper config,
+    private static void handleConfigurationEvent(Context context, VoicemailStatus.Editor status,
             OmtpEvents event) {
         switch (event) {
             case CONFIG_REQUEST_STATUS_SUCCESS:
             case CONFIG_PIN_SET:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setConfigurationState(VoicemailContract.Status.CONFIGURATION_STATE_OK)
                         .setNotificationChannelState(Status.NOTIFICATION_CHANNEL_STATE_OK)
                         .apply();
@@ -59,18 +59,18 @@
             case CONFIG_ACTIVATING:
                 // Wipe all errors from the last activation. All errors shown should be new errors
                 // for this activation.
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setConfigurationState(Status.CONFIGURATION_STATE_CONFIGURING)
                         .setDataChannelState(Status.DATA_CHANNEL_STATE_OK)
                         .setNotificationChannelState(Status.NOTIFICATION_CHANNEL_STATE_OK).apply();
                 break;
             case CONFIG_SERVICE_NOT_AVAILABLE:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                     .setConfigurationState(Status.CONFIGURATION_STATE_FAILED)
                     .apply();
                 break;
             case CONFIG_STATUS_SMS_TIME_OUT:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setConfigurationState(Status.CONFIGURATION_STATE_FAILED)
                         .apply();
                 break;
@@ -79,36 +79,36 @@
         }
     }
 
-    private static void handleDataChannelEvent(Context context, OmtpVvmCarrierConfigHelper config,
+    private static void handleDataChannelEvent(Context context, VoicemailStatus.Editor status,
             OmtpEvents event) {
         switch (event) {
             case DATA_IMAP_OPERATION_STARTED:
             case DATA_IMAP_OPERATION_COMPLETED:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setDataChannelState(Status.DATA_CHANNEL_STATE_OK)
                         .apply();
                 break;
 
             case DATA_NO_CONNECTION:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setDataChannelState(Status.DATA_CHANNEL_STATE_NO_CONNECTION)
                         .apply();
                 break;
 
             case DATA_NO_CONNECTION_CELLULAR_REQUIRED:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setDataChannelState(
                                 Status.DATA_CHANNEL_STATE_NO_CONNECTION_CELLULAR_REQUIRED)
                         .apply();
                 break;
             case DATA_INVALID_PORT:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setDataChannelState(
                                 VoicemailContract.Status.DATA_CHANNEL_STATE_BAD_CONFIGURATION)
                         .apply();
                 break;
             case DATA_CANNOT_RESOLVE_HOST_ON_NETWORK:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setDataChannelState(
                                 VoicemailContract.Status.DATA_CHANNEL_STATE_SERVER_CONNECTION_ERROR)
                         .apply();
@@ -116,7 +116,7 @@
             case DATA_SSL_INVALID_HOST_NAME:
             case DATA_CANNOT_ESTABLISH_SSL_SESSION:
             case DATA_IOE_ON_OPEN:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setDataChannelState(
                                 VoicemailContract.Status.DATA_CHANNEL_STATE_COMMUNICATION_ERROR)
                         .apply();
@@ -129,7 +129,7 @@
             case DATA_AUTH_SERVICE_NOT_PROVISIONED:
             case DATA_AUTH_SERVICE_NOT_ACTIVATED:
             case DATA_AUTH_USER_IS_BLOCKED:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setDataChannelState(
                                 VoicemailContract.Status.DATA_CHANNEL_STATE_BAD_CONFIGURATION)
                         .apply();
@@ -139,7 +139,7 @@
             case DATA_INVALID_INITIAL_SERVER_RESPONSE:
             case DATA_SSL_EXCEPTION:
             case DATA_ALL_SOCKET_CONNECTION_FAILED:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setDataChannelState(
                                 VoicemailContract.Status.DATA_CHANNEL_STATE_SERVER_ERROR)
                         .apply();
@@ -151,10 +151,10 @@
     }
 
     private static void handleNotificationChannelEvent(Context context,
-            OmtpVvmCarrierConfigHelper config, OmtpEvents event) {
+        OmtpVvmCarrierConfigHelper config, VoicemailStatus.Editor status, OmtpEvents event) {
         switch (event) {
             case NOTIFICATION_IN_SERVICE:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setNotificationChannelState(Status.NOTIFICATION_CHANNEL_STATE_OK)
                         // Clear the error state. A sync should follow signal return so any error
                         // will be reposted.
@@ -162,24 +162,23 @@
                         .apply();
                 break;
             case NOTIFICATION_SERVICE_LOST:
-                VoicemailStatus.Editor editor = VoicemailStatus.edit(context, config.getSubId());
-                editor.setNotificationChannelState(Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION);
+                status.setNotificationChannelState(Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION);
                 if (config.isCellularDataRequired()) {
-                    editor.setDataChannelState(
+                    status.setDataChannelState(
                             Status.DATA_CHANNEL_STATE_NO_CONNECTION_CELLULAR_REQUIRED);
                 }
-                editor.apply();
+                status.apply();
                 break;
             default:
                 VvmLog.wtf(TAG, "invalid notification channel event " + event);
         }
     }
 
-    private static void handleOtherEvent(Context context, OmtpVvmCarrierConfigHelper config,
+    private static void handleOtherEvent(Context context, VoicemailStatus.Editor status,
             OmtpEvents event) {
         switch (event) {
             case OTHER_SOURCE_REMOVED:
-                VoicemailStatus.edit(context, config.getSubId())
+                status
                         .setConfigurationState(Status.CONFIGURATION_STATE_NOT_CONFIGURED)
                         .setNotificationChannelState(
                                 Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION)
diff --git a/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java b/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java
index 00a70be..5d06d1e 100644
--- a/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java
+++ b/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java
@@ -342,9 +342,9 @@
     }
 
     public void startProvisioning(ActivationTask task, PhoneAccountHandle phone,
-            StatusMessage message, Bundle data) {
+        VoicemailStatus.Editor status, StatusMessage message, Bundle data) {
         if (mProtocol != null) {
-            mProtocol.startProvisioning(task, phone, this, message, data);
+            mProtocol.startProvisioning(task, phone, this, status, message, data);
         }
     }
 
@@ -354,10 +354,10 @@
         }
     }
 
-    public void handleEvent(OmtpEvents event) {
+    public void handleEvent(VoicemailStatus.Editor status, OmtpEvents event) {
         VvmLog.i(TAG, "OmtpEvent:" + event);
         if (mProtocol != null) {
-            mProtocol.handleEvent(mContext, this, event);
+            mProtocol.handleEvent(mContext, this, status, event);
         }
     }
 
diff --git a/src/com/android/phone/vvm/omtp/VvmPhoneStateListener.java b/src/com/android/phone/vvm/omtp/VvmPhoneStateListener.java
index 1cb23d4..f64d15b 100644
--- a/src/com/android/phone/vvm/omtp/VvmPhoneStateListener.java
+++ b/src/com/android/phone/vvm/omtp/VvmPhoneStateListener.java
@@ -19,9 +19,9 @@
 import android.telecom.PhoneAccountHandle;
 import android.telephony.PhoneStateListener;
 import android.telephony.ServiceState;
-
 import com.android.phone.PhoneGlobals;
 import com.android.phone.PhoneUtils;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.sync.OmtpVvmSourceManager;
 import com.android.phone.vvm.omtp.sync.OmtpVvmSyncService;
 import com.android.phone.vvm.omtp.sync.SyncTask;
@@ -66,7 +66,8 @@
                 if (!voicemailStatusQueryHelper.isNotificationsChannelActive(mPhoneAccount)) {
                     VvmLog
                             .v(TAG, "Notifications channel is active for " + subId);
-                    helper.handleEvent(OmtpEvents.NOTIFICATION_IN_SERVICE);
+                    helper.handleEvent(VoicemailStatus.edit(mContext, mPhoneAccount),
+                        OmtpEvents.NOTIFICATION_IN_SERVICE);
                     PhoneGlobals.getInstance().clearMwiIndicator(subId);
                 }
             }
@@ -91,7 +92,8 @@
             if (!OmtpVvmSourceManager.getInstance(mContext).isVvmSourceRegistered(mPhoneAccount)) {
                 return;
             }
-            helper.handleEvent(OmtpEvents.NOTIFICATION_SERVICE_LOST);
+            helper.handleEvent(VoicemailStatus.edit(mContext, mPhoneAccount),
+                OmtpEvents.NOTIFICATION_SERVICE_LOST);
         }
         mPreviousState = state;
     }
diff --git a/src/com/android/phone/vvm/omtp/fetch/FetchVoicemailReceiver.java b/src/com/android/phone/vvm/omtp/fetch/FetchVoicemailReceiver.java
index 5ec190f..d5e627f 100644
--- a/src/com/android/phone/vvm/omtp/fetch/FetchVoicemailReceiver.java
+++ b/src/com/android/phone/vvm/omtp/fetch/FetchVoicemailReceiver.java
@@ -30,15 +30,14 @@
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
-
 import com.android.phone.PhoneUtils;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.OmtpVvmCarrierConfigHelper;
 import com.android.phone.vvm.omtp.VvmLog;
 import com.android.phone.vvm.omtp.imap.ImapHelper;
 import com.android.phone.vvm.omtp.imap.ImapHelper.InitializingException;
 import com.android.phone.vvm.omtp.sync.OmtpVvmSourceManager;
 import com.android.phone.vvm.omtp.sync.VvmNetworkRequestCallback;
-
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 
@@ -142,17 +141,17 @@
 
         public fetchVoicemailNetworkRequestCallback(Context context,
                 PhoneAccountHandle phoneAccount) {
-            super(context, phoneAccount);
+            super(context, phoneAccount, VoicemailStatus.edit(context, phoneAccount));
         }
 
         @Override
         public void onAvailable(final Network network) {
             super.onAvailable(network);
-            fetchVoicemail(network);
+            fetchVoicemail(network, getVoicemailStatusEditor());
         }
     }
 
-    private void fetchVoicemail(final Network network) {
+    private void fetchVoicemail(final Network network, final VoicemailStatus.Editor status) {
         Executor executor = Executors.newCachedThreadPool();
         executor.execute(new Runnable() {
             @Override
@@ -161,7 +160,7 @@
                     while (mRetryCount > 0) {
                         VvmLog.i(TAG, "fetching voicemail, retry count=" + mRetryCount);
                         try (ImapHelper imapHelper = new ImapHelper(mContext, mPhoneAccount,
-                                network)) {
+                            network, status)) {
                             boolean success = imapHelper.fetchVoicemailPayload(
                                     new VoicemailFetchedCallback(mContext, mUri), mUid);
                             if (!success && mRetryCount > 0) {
diff --git a/src/com/android/phone/vvm/omtp/imap/ImapHelper.java b/src/com/android/phone/vvm/omtp/imap/ImapHelper.java
index ce13323..d2df8de 100644
--- a/src/com/android/phone/vvm/omtp/imap/ImapHelper.java
+++ b/src/com/android/phone/vvm/omtp/imap/ImapHelper.java
@@ -72,6 +72,7 @@
     private final Context mContext;
     private final PhoneAccountHandle mPhoneAccount;
     private final Network mNetwork;
+    private final VoicemailStatus.Editor mStatus;
 
     VisualVoicemailPreferences mPrefs;
     private static final String PREF_KEY_QUOTA_OCCUPIED = "quota_occupied_";
@@ -89,17 +90,20 @@
         }
     }
 
-    public ImapHelper(Context context, PhoneAccountHandle phoneAccount, Network network)
+    public ImapHelper(Context context, PhoneAccountHandle phoneAccount, Network network,
+        VoicemailStatus.Editor status)
         throws InitializingException {
         this(context, new OmtpVvmCarrierConfigHelper(context,
-                PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccount)), phoneAccount, network);
+            PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccount)), phoneAccount, network, status);
     }
 
     public ImapHelper(Context context, OmtpVvmCarrierConfigHelper config,
-        PhoneAccountHandle phoneAccount, Network network) throws InitializingException {
+        PhoneAccountHandle phoneAccount, Network network, VoicemailStatus.Editor status)
+        throws InitializingException {
         mContext = context;
         mPhoneAccount = phoneAccount;
         mNetwork = network;
+        mStatus = status;
         mConfig = config;
         mPrefs = new VisualVoicemailPreferences(context,
                 phoneAccount);
@@ -123,7 +127,7 @@
             mImapStore = new ImapStore(
                     context, this, username, password, port, serverName, auth, network);
         } catch (NumberFormatException e) {
-            mConfig.handleEvent(OmtpEvents.DATA_INVALID_PORT);
+            handleEvent(OmtpEvents.DATA_INVALID_PORT);
             LogUtils.w(TAG, "Could not parse port number");
             throw new InitializingException("cannot initialize ImapHelper:" + e.toString());
         }
@@ -172,7 +176,7 @@
     }
 
     public void handleEvent(OmtpEvents event) {
-        mConfig.handleEvent(event);
+        mConfig.handleEvent(mStatus, event);
     }
 
     /**
diff --git a/src/com/android/phone/vvm/omtp/protocol/VisualVoicemailProtocol.java b/src/com/android/phone/vvm/omtp/protocol/VisualVoicemailProtocol.java
index 5f89471..e0b6359 100644
--- a/src/com/android/phone/vvm/omtp/protocol/VisualVoicemailProtocol.java
+++ b/src/com/android/phone/vvm/omtp/protocol/VisualVoicemailProtocol.java
@@ -21,6 +21,7 @@
 import android.os.Bundle;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.SmsManager;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.ActivationTask;
 import com.android.phone.vvm.omtp.DefaultOmtpEventHandler;
 import com.android.phone.vvm.omtp.OmtpEvents;
@@ -52,7 +53,8 @@
     }
 
     public void startProvisioning(ActivationTask task, PhoneAccountHandle handle,
-            OmtpVvmCarrierConfigHelper config, StatusMessage message, Bundle data) {
+        OmtpVvmCarrierConfigHelper config, VoicemailStatus.Editor editor, StatusMessage message,
+        Bundle data) {
         // Do nothing
     }
 
@@ -79,8 +81,8 @@
     }
 
     public void handleEvent(Context context, OmtpVvmCarrierConfigHelper config,
-            OmtpEvents event) {
-        DefaultOmtpEventHandler.handleEvent(context, config, event);
+        VoicemailStatus.Editor status, OmtpEvents event) {
+        DefaultOmtpEventHandler.handleEvent(context, config, status, event);
     }
 
     /**
diff --git a/src/com/android/phone/vvm/omtp/protocol/Vvm3EventHandler.java b/src/com/android/phone/vvm/omtp/protocol/Vvm3EventHandler.java
index 3a3adb8..6fac708 100644
--- a/src/com/android/phone/vvm/omtp/protocol/Vvm3EventHandler.java
+++ b/src/com/android/phone/vvm/omtp/protocol/Vvm3EventHandler.java
@@ -18,7 +18,6 @@
 
 import android.annotation.IntDef;
 import android.content.Context;
-import android.telecom.PhoneAccountHandle;
 import android.util.Log;
 import com.android.phone.VoicemailStatus;
 import com.android.phone.settings.VoicemailChangePinActivity;
@@ -26,7 +25,6 @@
 import com.android.phone.vvm.omtp.OmtpEvents;
 import com.android.phone.vvm.omtp.OmtpEvents.Type;
 import com.android.phone.vvm.omtp.OmtpVvmCarrierConfigHelper;
-import com.android.phone.vvm.omtp.utils.PhoneAccountHandleConverter;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -87,47 +85,46 @@
 
 
     public static void handleEvent(Context context, OmtpVvmCarrierConfigHelper config,
-            OmtpEvents event) {
+        VoicemailStatus.Editor status, OmtpEvents event) {
         boolean handled = false;
         switch (event.getType()) {
             case Type.CONFIGURATION:
-                handled = handleConfigurationEvent(context, config, event);
+                handled = handleConfigurationEvent(context, status, event);
                 break;
             case Type.DATA_CHANNEL:
-                handled = handleDataChannelEvent(context, config, event);
+                handled = handleDataChannelEvent(status, event);
                 break;
             case Type.NOTIFICATION_CHANNEL:
-                handled = handleNotificationChannelEvent(context, config, event);
+                handled = handleNotificationChannelEvent(status, event);
                 break;
             case Type.OTHER:
-                handled = handleOtherEvent(context, config, event);
+                handled = handleOtherEvent(status, event);
                 break;
             default:
                 com.android.services.telephony.Log
                         .wtf(TAG, "invalid event type " + event.getType() + " for " + event);
         }
         if (!handled) {
-            DefaultOmtpEventHandler.handleEvent(context, config, event);
+            DefaultOmtpEventHandler.handleEvent(context, config, status, event);
         }
     }
 
-    private static boolean handleConfigurationEvent(Context context,
-            OmtpVvmCarrierConfigHelper config, OmtpEvents event) {
+    private static boolean handleConfigurationEvent(Context context, VoicemailStatus.Editor status,
+        OmtpEvents event) {
         switch (event) {
             case CONFIG_REQUEST_STATUS_SUCCESS:
-                PhoneAccountHandle handle = PhoneAccountHandleConverter
-                        .fromSubId(config.getSubId());
-                if (!VoicemailChangePinActivity.isDefaultOldPinSet(context, handle)) {
+                if (!VoicemailChangePinActivity
+                    .isDefaultOldPinSet(context, status.getPhoneAccountHandle())) {
                     return false;
                 } else {
-                    postError(context, config, PIN_NOT_SET);
+                    postError(status, PIN_NOT_SET);
                 }
                 break;
             case CONFIG_DEFAULT_PIN_REPLACED:
-                postError(context, config, PIN_NOT_SET);
+                postError(status, PIN_NOT_SET);
                 break;
             case CONFIG_STATUS_SMS_TIME_OUT:
-                postError(context, config, STATUS_SMS_TIMEOUT);
+                postError(status, STATUS_SMS_TIMEOUT);
                 break;
             default:
                 return false;
@@ -135,50 +132,49 @@
         return true;
     }
 
-    private static boolean handleDataChannelEvent(Context context,
-            OmtpVvmCarrierConfigHelper config, OmtpEvents event) {
+    private static boolean handleDataChannelEvent(VoicemailStatus.Editor status, OmtpEvents event) {
         switch (event) {
             case DATA_NO_CONNECTION:
             case DATA_NO_CONNECTION_CELLULAR_REQUIRED:
             case DATA_ALL_SOCKET_CONNECTION_FAILED:
-                postError(context, config, VMS_NO_CELLULAR);
+                postError(status, VMS_NO_CELLULAR);
                 break;
             case DATA_SSL_INVALID_HOST_NAME:
             case DATA_CANNOT_ESTABLISH_SSL_SESSION:
             case DATA_IOE_ON_OPEN:
-                postError(context, config, VMS_TIMEOUT);
+                postError(status, VMS_TIMEOUT);
                 break;
             case DATA_CANNOT_RESOLVE_HOST_ON_NETWORK:
-                postError(context, config, VMS_DNS_FAILURE);
+                postError(status, VMS_DNS_FAILURE);
                 break;
             case DATA_BAD_IMAP_CREDENTIAL:
-                postError(context, config, IMAP_ERROR);
+                postError(status, IMAP_ERROR);
                 break;
             case DATA_AUTH_UNKNOWN_USER:
-                postError(context, config, UNKNOWN_USER);
+                postError(status, UNKNOWN_USER);
                 break;
             case DATA_AUTH_UNKNOWN_DEVICE:
-                postError(context, config, UNKNOWN_DEVICE);
+                postError(status, UNKNOWN_DEVICE);
                 break;
             case DATA_AUTH_INVALID_PASSWORD:
-                postError(context, config, INVALID_PASSWORD);
+                postError(status, INVALID_PASSWORD);
                 break;
             case DATA_AUTH_MAILBOX_NOT_INITIALIZED:
-                postError(context, config, MAILBOX_NOT_INITIALIZED);
+                postError(status, MAILBOX_NOT_INITIALIZED);
                 break;
             case DATA_AUTH_SERVICE_NOT_PROVISIONED:
-                postError(context, config, SERVICE_NOT_PROVISIONED);
+                postError(status, SERVICE_NOT_PROVISIONED);
                 break;
             case DATA_AUTH_SERVICE_NOT_ACTIVATED:
-                postError(context, config, SERVICE_NOT_ACTIVATED);
+                postError(status, SERVICE_NOT_ACTIVATED);
                 break;
             case DATA_AUTH_USER_IS_BLOCKED:
-                postError(context, config, USER_BLOCKED);
+                postError(status, USER_BLOCKED);
                 break;
             case DATA_REJECTED_SERVER_RESPONSE:
             case DATA_INVALID_INITIAL_SERVER_RESPONSE:
             case DATA_SSL_EXCEPTION:
-                postError(context, config, IMAP_ERROR);
+                postError(status, IMAP_ERROR);
                 break;
             default:
                 return false;
@@ -186,40 +182,40 @@
         return true;
     }
 
-    private static boolean handleNotificationChannelEvent(Context context,
-            OmtpVvmCarrierConfigHelper config, OmtpEvents event) {
+    private static boolean handleNotificationChannelEvent(VoicemailStatus.Editor status,
+        OmtpEvents event) {
         return false;
     }
 
-    private static boolean handleOtherEvent(Context context, OmtpVvmCarrierConfigHelper config,
+    private static boolean handleOtherEvent(VoicemailStatus.Editor status,
             OmtpEvents event) {
         switch (event) {
             case VVM3_NEW_USER_SETUP_FAILED:
-                postError(context, config, MAILBOX_NOT_INITIALIZED);
+                postError(status, MAILBOX_NOT_INITIALIZED);
                 break;
             case VVM3_VMG_DNS_FAILURE:
-                postError(context, config, VMG_DNS_FAILURE);
+                postError(status, VMG_DNS_FAILURE);
                 break;
             case VVM3_SPG_DNS_FAILURE:
-                postError(context, config, SPG_DNS_FAILURE);
+                postError(status, SPG_DNS_FAILURE);
                 break;
             case VVM3_VMG_CONNECTION_FAILED:
-                postError(context, config, VMG_NO_CELLULAR);
+                postError(status, VMG_NO_CELLULAR);
                 break;
             case VVM3_SPG_CONNECTION_FAILED:
-                postError(context, config, SPG_NO_CELLULAR);
+                postError(status, SPG_NO_CELLULAR);
                 break;
             case VVM3_VMG_TIMEOUT:
-                postError(context, config, VMG_TIMEOUT);
+                postError(status, VMG_TIMEOUT);
                 break;
             case VVM3_SUBSCRIBER_PROVISIONED:
-                postError(context, config, SERVICE_NOT_ACTIVATED);
+                postError(status, SERVICE_NOT_ACTIVATED);
                 break;
             case VVM3_SUBSCRIBER_BLOCKED:
-                postError(context, config, SUBSCRIBER_BLOCKED);
+                postError(status, SUBSCRIBER_BLOCKED);
                 break;
             case VVM3_SUBSCRIBER_UNKNOWN:
-                postError(context, config, SUBSCRIBER_UNKNOWN);
+                postError(status, SUBSCRIBER_UNKNOWN);
                 break;
             default:
                 return false;
@@ -227,10 +223,7 @@
         return true;
     }
 
-    private static void postError(Context context, OmtpVvmCarrierConfigHelper config,
-            @ErrorCode int errorCode) {
-        VoicemailStatus.Editor editor = VoicemailStatus.edit(context, config.getSubId());
-
+    private static void postError(VoicemailStatus.Editor editor, @ErrorCode int errorCode) {
         switch (errorCode) {
             case VMG_DNS_FAILURE:
             case SPG_DNS_FAILURE:
diff --git a/src/com/android/phone/vvm/omtp/protocol/Vvm3Protocol.java b/src/com/android/phone/vvm/omtp/protocol/Vvm3Protocol.java
index f5c65e2..39d2b34 100644
--- a/src/com/android/phone/vvm/omtp/protocol/Vvm3Protocol.java
+++ b/src/com/android/phone/vvm/omtp/protocol/Vvm3Protocol.java
@@ -23,6 +23,7 @@
 import android.telecom.PhoneAccountHandle;
 import android.telephony.SmsManager;
 import android.text.TextUtils;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.common.mail.MessagingException;
 import com.android.phone.settings.VisualVoicemailSettingsUtil;
 import com.android.phone.settings.VoicemailChangePinActivity;
@@ -102,16 +103,17 @@
 
     @Override
     public void startProvisioning(ActivationTask task, PhoneAccountHandle phoneAccountHandle,
-            OmtpVvmCarrierConfigHelper config, StatusMessage message, Bundle data) {
+            OmtpVvmCarrierConfigHelper config, VoicemailStatus.Editor status, StatusMessage message,
+            Bundle data) {
         VvmLog.i(TAG, "start vvm3 provisioning");
         if (OmtpConstants.SUBSCRIBER_UNKNOWN.equals(message.getProvisioningStatus())) {
             VvmLog.i(TAG, "Provisioning status: Unknown");
             if (VVM3_UNKNOWN_SUBSCRIBER_CAN_SUBSCRIBE_RESPONSE_CODE
                     .equals(message.getReturnCode())) {
                 VvmLog.i(TAG, "Self provisioning available, subscribing");
-                new Vvm3Subscriber(task, phoneAccountHandle, config, data).subscribe();
+                new Vvm3Subscriber(task, phoneAccountHandle, config, status, data).subscribe();
             } else {
-                config.handleEvent(OmtpEvents.VVM3_SUBSCRIBER_UNKNOWN);
+                config.handleEvent(status, OmtpEvents.VVM3_SUBSCRIBER_UNKNOWN);
             }
         } else if (OmtpConstants.SUBSCRIBER_NEW.equals(message.getProvisioningStatus())) {
             VvmLog.i(TAG, "setting up new user");
@@ -120,14 +122,14 @@
                     new VisualVoicemailPreferences(config.getContext(), phoneAccountHandle);
             message.putStatus(prefs.edit()).apply();
 
-            startProvisionNewUser(task, phoneAccountHandle, config, message);
+            startProvisionNewUser(task, phoneAccountHandle, config, status, message);
         } else if (OmtpConstants.SUBSCRIBER_PROVISIONED.equals(message.getProvisioningStatus())) {
             VvmLog.i(TAG, "User provisioned but not activated, disabling VVM");
             VisualVoicemailSettingsUtil
                     .setEnabled(config.getContext(), phoneAccountHandle, false);
         } else if (OmtpConstants.SUBSCRIBER_BLOCKED.equals(message.getProvisioningStatus())) {
             VvmLog.i(TAG, "User blocked");
-            config.handleEvent(OmtpEvents.VVM3_SUBSCRIBER_BLOCKED);
+            config.handleEvent(status, OmtpEvents.VVM3_SUBSCRIBER_BLOCKED);
         }
     }
 
@@ -138,8 +140,9 @@
     }
 
     @Override
-    public void handleEvent(Context context, OmtpVvmCarrierConfigHelper config, OmtpEvents event) {
-        Vvm3EventHandler.handleEvent(context, config, event);
+    public void handleEvent(Context context, OmtpVvmCarrierConfigHelper config,
+            VoicemailStatus.Editor status, OmtpEvents event) {
+        Vvm3EventHandler.handleEvent(context, config, status, event);
     }
 
     @Override
@@ -183,13 +186,15 @@
     }
 
     private void startProvisionNewUser(ActivationTask task, PhoneAccountHandle phoneAccountHandle,
-            OmtpVvmCarrierConfigHelper config, StatusMessage message) {
-        try (NetworkWrapper wrapper = VvmNetworkRequest.getNetwork(config, phoneAccountHandle)) {
+            OmtpVvmCarrierConfigHelper config, VoicemailStatus.Editor status,
+            StatusMessage message) {
+        try (NetworkWrapper wrapper = VvmNetworkRequest
+                .getNetwork(config, phoneAccountHandle, status)) {
             Network network = wrapper.get();
 
             VvmLog.i(TAG, "new user: network available");
             try (ImapHelper helper = new ImapHelper(config.getContext(), phoneAccountHandle,
-                network)) {
+                    network, status)) {
                 // VVM3 has inconsistent error language code to OMTP. Just issue a raw command
                 // here.
                 // TODO(b/29082671): use LocaleList
@@ -213,12 +218,12 @@
                     config.requestStatus();
                 }
             } catch (InitializingException | MessagingException | IOException e) {
-                config.handleEvent(OmtpEvents.VVM3_NEW_USER_SETUP_FAILED);
+                config.handleEvent(status, OmtpEvents.VVM3_NEW_USER_SETUP_FAILED);
                 task.fail();
                 VvmLog.e(TAG, e.toString());
             }
         } catch (RequestFailedException e) {
-            config.handleEvent(OmtpEvents.DATA_NO_CONNECTION_CELLULAR_REQUIRED);
+            config.handleEvent(status, OmtpEvents.DATA_NO_CONNECTION_CELLULAR_REQUIRED);
             task.fail();
         }
 
diff --git a/src/com/android/phone/vvm/omtp/protocol/Vvm3Subscriber.java b/src/com/android/phone/vvm/omtp/protocol/Vvm3Subscriber.java
index 08e9352..ad00aa4 100644
--- a/src/com/android/phone/vvm/omtp/protocol/Vvm3Subscriber.java
+++ b/src/com/android/phone/vvm/omtp/protocol/Vvm3Subscriber.java
@@ -27,6 +27,7 @@
 import android.text.style.URLSpan;
 import android.util.ArrayMap;
 import com.android.phone.Assert;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.ActivationTask;
 import com.android.phone.vvm.omtp.OmtpEvents;
 import com.android.phone.vvm.omtp.OmtpVvmCarrierConfigHelper;
@@ -113,6 +114,7 @@
     private final ActivationTask mTask;
     private final PhoneAccountHandle mHandle;
     private final OmtpVvmCarrierConfigHelper mHelper;
+    private final VoicemailStatus.Editor mStatus;
     private final Bundle mData;
 
     private final String mNumber;
@@ -137,11 +139,12 @@
 
     @WorkerThread
     public Vvm3Subscriber(ActivationTask task, PhoneAccountHandle handle,
-            OmtpVvmCarrierConfigHelper helper, Bundle data) {
+            OmtpVvmCarrierConfigHelper helper, VoicemailStatus.Editor status, Bundle data) {
         Assert.isNotMainThread();
         mTask = task;
         mHandle = handle;
         mHelper = helper;
+        mStatus = status;
         mData = data;
 
         // Assuming getLine1Number() will work with VVM3. For unprovisioned users the IMAP username
@@ -157,14 +160,14 @@
         // processSubscription() is called after network is available.
         VvmLog.i(TAG, "Subscribing");
 
-        try (NetworkWrapper wrapper = VvmNetworkRequest.getNetwork(mHelper, mHandle)) {
+        try (NetworkWrapper wrapper = VvmNetworkRequest.getNetwork(mHelper, mHandle, mStatus)) {
             Network network = wrapper.get();
             VvmLog.d(TAG, "provisioning: network available");
             mRequestQueue = Volley
                     .newRequestQueue(mHelper.getContext(), new NetworkSpecifiedHurlStack(network));
             processSubscription();
         } catch (RequestFailedException e) {
-            mHelper.handleEvent(OmtpEvents.VVM3_VMG_CONNECTION_FAILED);
+            mHelper.handleEvent(mStatus, OmtpEvents.VVM3_VMG_CONNECTION_FAILED);
             mTask.fail();
         }
     }
@@ -219,7 +222,7 @@
         try {
             return future.get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
-            mHelper.handleEvent(OmtpEvents.VVM3_SPG_CONNECTION_FAILED);
+            mHelper.handleEvent(mStatus, OmtpEvents.VVM3_SPG_CONNECTION_FAILED);
             throw new ProvisioningException(e.toString());
         }
     }
@@ -235,7 +238,7 @@
             // A new STATUS SMS will be sent after this request.
             future.get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS);
         } catch (TimeoutException | ExecutionException | InterruptedException e) {
-            mHelper.handleEvent(OmtpEvents.VVM3_SPG_CONNECTION_FAILED);
+            mHelper.handleEvent(mStatus, OmtpEvents.VVM3_SPG_CONNECTION_FAILED);
             throw new ProvisioningException(e.toString());
         }
         // It could take very long for the STATUS SMS to return. Waiting for it is unreliable.
@@ -271,7 +274,7 @@
             }
             return response;
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
-            mHelper.handleEvent(OmtpEvents.VVM3_VMG_CONNECTION_FAILED);
+            mHelper.handleEvent(mStatus, OmtpEvents.VVM3_VMG_CONNECTION_FAILED);
             throw new ProvisioningException(e.toString());
         }
     }
diff --git a/src/com/android/phone/vvm/omtp/scheduling/BaseTask.java b/src/com/android/phone/vvm/omtp/scheduling/BaseTask.java
index 8b3e88e..273d2d3 100644
--- a/src/com/android/phone/vvm/omtp/scheduling/BaseTask.java
+++ b/src/com/android/phone/vvm/omtp/scheduling/BaseTask.java
@@ -23,10 +23,8 @@
 import android.content.Intent;
 import android.os.SystemClock;
 import android.support.annotation.NonNull;
-
 import com.android.phone.Assert;
 import com.android.phone.NeededForTesting;
-
 import java.util.ArrayList;
 import java.util.List;
 
@@ -167,6 +165,7 @@
     }
 
     @Override
+    @CallSuper
     public void onCompleted() {
         if (mHasFailed) {
             for (Policy policy : mPolicies) {
diff --git a/src/com/android/phone/vvm/omtp/scheduling/RetryPolicy.java b/src/com/android/phone/vvm/omtp/scheduling/RetryPolicy.java
index 3c2274f..bd0c75e 100644
--- a/src/com/android/phone/vvm/omtp/scheduling/RetryPolicy.java
+++ b/src/com/android/phone/vvm/omtp/scheduling/RetryPolicy.java
@@ -17,7 +17,7 @@
 package com.android.phone.vvm.omtp.scheduling;
 
 import android.content.Intent;
-
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.VvmLog;
 
 /**
@@ -38,11 +38,26 @@
     private int mRetryCount;
     private boolean mFailed;
 
+    private VoicemailStatus.DeferredEditor mVoicemailStatusEditor;
+
     public RetryPolicy(int retryLimit, int retryDelayMillis) {
         mRetryLimit = retryLimit;
         mRetryDelayMillis = retryDelayMillis;
     }
 
+    private boolean hasMoreRetries() {
+        return mRetryCount < mRetryLimit;
+    }
+
+    /**
+     * Error status should only be set if retries has exhausted or the task is successful. Status
+     * writes to this editor will be deferred until the task has ended, and will only be committed
+     * if the task is successful or there are no retries left.
+     */
+    public VoicemailStatus.Editor getVoicemailStatusEditor() {
+        return mVoicemailStatusEditor;
+    }
+
     @Override
     public void onCreate(BaseTask task, Intent intent, int flags, int startId) {
         mTask = task;
@@ -52,6 +67,8 @@
                     + mRetryDelayMillis);
             mTask.setExecutionTime(mTask.getTimeMillis() + mRetryDelayMillis);
         }
+        mVoicemailStatusEditor = VoicemailStatus.deferredEdit(task.getContext(),
+                task.getSubId());
     }
 
     @Override
@@ -61,14 +78,18 @@
 
     @Override
     public void onCompleted() {
-        if (!mFailed) {
+        if (!mFailed || !hasMoreRetries()) {
+            if (!mFailed) {
+                VvmLog.d(TAG, mTask.toString() + " completed successfully");
+            }
+            if (!hasMoreRetries()) {
+                VvmLog.d(TAG, "Retry limit for " + mTask + " reached");
+            }
+            VvmLog.i(TAG, "committing deferred status: " + mVoicemailStatusEditor.getValues());
+            mVoicemailStatusEditor.deferredApply();
             return;
         }
-        if (mRetryCount >= mRetryLimit) {
-            VvmLog.d(TAG, "Retry limit for " + mTask + " reached");
-            return;
-        }
-
+        VvmLog.i(TAG, "discarding deferred status: " + mVoicemailStatusEditor.getValues());
         Intent intent = mTask.createRestartIntent();
         intent.putExtra(EXTRA_RETRY_COUNT, mRetryCount + 1);
 
diff --git a/src/com/android/phone/vvm/omtp/sync/OmtpVvmSourceManager.java b/src/com/android/phone/vvm/omtp/sync/OmtpVvmSourceManager.java
index 1972ca6..ac4ba0a 100644
--- a/src/com/android/phone/vvm/omtp/sync/OmtpVvmSourceManager.java
+++ b/src/com/android/phone/vvm/omtp/sync/OmtpVvmSourceManager.java
@@ -20,14 +20,13 @@
 import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
-
 import com.android.internal.telephony.Phone;
 import com.android.phone.PhoneUtils;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.OmtpEvents;
 import com.android.phone.vvm.omtp.OmtpVvmCarrierConfigHelper;
 import com.android.phone.vvm.omtp.VvmPhoneStateListener;
 import com.android.phone.vvm.omtp.utils.PhoneAccountHandleConverter;
-
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
@@ -108,7 +107,8 @@
 
     public void removeSource(PhoneAccountHandle phoneAccount) {
         new OmtpVvmCarrierConfigHelper(mContext, PhoneAccountHandleConverter.toSubId(phoneAccount))
-                .handleEvent(OmtpEvents.OTHER_SOURCE_REMOVED);
+            .handleEvent(VoicemailStatus.edit(mContext, phoneAccount),
+                OmtpEvents.OTHER_SOURCE_REMOVED);
         removePhoneStateListener(phoneAccount);
         mActiveVvmSources.remove(phoneAccount);
     }
diff --git a/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncService.java b/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncService.java
index 157f51f..2dc27b2 100644
--- a/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncService.java
+++ b/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncService.java
@@ -24,6 +24,7 @@
 import android.telecom.Voicemail;
 import android.text.TextUtils;
 import com.android.phone.PhoneUtils;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.settings.VisualVoicemailSettingsUtil;
 import com.android.phone.vvm.omtp.ActivationTask;
 import com.android.phone.vvm.omtp.OmtpEvents;
@@ -81,19 +82,19 @@
     }
 
     public void sync(BaseTask task, String action, PhoneAccountHandle phoneAccount,
-            Voicemail voicemail) {
+            Voicemail voicemail, VoicemailStatus.Editor status) {
         VvmLog.log(TAG, "Sync requested: " + action +
                 " for all accounts: " + String.valueOf(phoneAccount == null));
         if (phoneAccount != null) {
             VvmLog.v(TAG, "Sync requested: " + action + " - for account: " + phoneAccount);
-            setupAndSendRequest(task, phoneAccount, voicemail, action);
+            setupAndSendRequest(task, phoneAccount, voicemail, action, status);
         } else {
             VvmLog.v(TAG, "Sync requested: " + action + " - for all accounts");
             OmtpVvmSourceManager vvmSourceManager =
                     OmtpVvmSourceManager.getInstance(mContext);
             Set<PhoneAccountHandle> sources = vvmSourceManager.getOmtpVvmSources();
             for (PhoneAccountHandle source : sources) {
-                setupAndSendRequest(task, source, null, action);
+                setupAndSendRequest(task, source, null, action, status);
             }
             activateUnactivatedAccounts();
         }
@@ -115,7 +116,7 @@
     }
 
     private void setupAndSendRequest(BaseTask task, PhoneAccountHandle phoneAccount,
-            Voicemail voicemail, String action) {
+            Voicemail voicemail, String action, VoicemailStatus.Editor status) {
         if (!VisualVoicemailSettingsUtil.isEnabled(mContext, phoneAccount)) {
             VvmLog.v(TAG, "Sync requested for disabled account");
             return;
@@ -127,23 +128,27 @@
         }
 
         OmtpVvmCarrierConfigHelper config = new OmtpVvmCarrierConfigHelper(mContext, subId);
-        config.handleEvent(OmtpEvents.DATA_IMAP_OPERATION_STARTED);
-        try (NetworkWrapper network = VvmNetworkRequest.getNetwork(config, phoneAccount)) {
+        // DATA_IMAP_OPERATION_STARTED posting should not be deferred. This event clears all data
+        // channel errors, which should happen when the task starts, not when it ends. It is the
+        // "Sync in progress..." status.
+        config.handleEvent(VoicemailStatus.edit(mContext, phoneAccount),
+                OmtpEvents.DATA_IMAP_OPERATION_STARTED);
+        try (NetworkWrapper network = VvmNetworkRequest.getNetwork(config, phoneAccount, status)) {
             if (network == null) {
                 VvmLog.e(TAG, "unable to acquire network");
                 task.fail();
                 return;
             }
-            doSync(task, network.get(), phoneAccount, voicemail, action);
+            doSync(task, network.get(), phoneAccount, voicemail, action, status);
         } catch (RequestFailedException e) {
-            config.handleEvent(OmtpEvents.DATA_NO_CONNECTION_CELLULAR_REQUIRED);
+            config.handleEvent(status, OmtpEvents.DATA_NO_CONNECTION_CELLULAR_REQUIRED);
             task.fail();
         }
     }
 
     private void doSync(BaseTask task, Network network, PhoneAccountHandle phoneAccount,
-            Voicemail voicemail, String action) {
-        try(ImapHelper imapHelper = new ImapHelper(mContext, phoneAccount, network)) {
+            Voicemail voicemail, String action, VoicemailStatus.Editor status) {
+        try (ImapHelper imapHelper = new ImapHelper(mContext, phoneAccount, network, status)) {
             boolean success;
             if (voicemail == null) {
                 success = syncAll(action, imapHelper, phoneAccount);
diff --git a/src/com/android/phone/vvm/omtp/sync/SyncOneTask.java b/src/com/android/phone/vvm/omtp/sync/SyncOneTask.java
index 165f043..510efc7 100644
--- a/src/com/android/phone/vvm/omtp/sync/SyncOneTask.java
+++ b/src/com/android/phone/vvm/omtp/sync/SyncOneTask.java
@@ -20,7 +20,7 @@
 import android.content.Intent;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.Voicemail;
-
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.scheduling.BaseTask;
 import com.android.phone.vvm.omtp.scheduling.RetryPolicy;
 import com.android.phone.vvm.omtp.utils.PhoneAccountHandleConverter;
@@ -67,7 +67,8 @@
     @Override
     public void onExecuteInBackgroundThread() {
         OmtpVvmSyncService service = new OmtpVvmSyncService(getContext());
-        service.sync(this, mSyncType, mPhone, mVoicemail);
+        service.sync(this, mSyncType, mPhone, mVoicemail,
+                VoicemailStatus.edit(getContext(), mPhone));
     }
 
     @Override
diff --git a/src/com/android/phone/vvm/omtp/sync/SyncTask.java b/src/com/android/phone/vvm/omtp/sync/SyncTask.java
index 0d91c5c..7374ee6 100644
--- a/src/com/android/phone/vvm/omtp/sync/SyncTask.java
+++ b/src/com/android/phone/vvm/omtp/sync/SyncTask.java
@@ -37,6 +37,8 @@
     private static final String EXTRA_PHONE_ACCOUNT_HANDLE = "extra_phone_account_handle";
     private static final String EXTRA_SYNC_TYPE = "extra_sync_type";
 
+    private final RetryPolicy mRetryPolicy;
+
     private PhoneAccountHandle mPhone;
     private String mSyncType;
 
@@ -50,7 +52,8 @@
 
     public SyncTask() {
         super(TASK_SYNC);
-        addPolicy(new RetryPolicy(RETRY_TIMES, RETRY_INTERVAL_MILLIS));
+        mRetryPolicy = new RetryPolicy(RETRY_TIMES, RETRY_INTERVAL_MILLIS);
+        addPolicy(mRetryPolicy);
         addPolicy(new MinimalIntervalPolicy(MINIMAL_INTERVAL_MILLIS));
     }
 
@@ -63,7 +66,7 @@
     @Override
     public void onExecuteInBackgroundThread() {
         OmtpVvmSyncService service = new OmtpVvmSyncService(getContext());
-        service.sync(this, mSyncType, mPhone, null);
+        service.sync(this, mSyncType, mPhone, null, mRetryPolicy.getVoicemailStatusEditor());
     }
 
     @Override
diff --git a/src/com/android/phone/vvm/omtp/sync/UploadTask.java b/src/com/android/phone/vvm/omtp/sync/UploadTask.java
index afdee58..7945c08 100644
--- a/src/com/android/phone/vvm/omtp/sync/UploadTask.java
+++ b/src/com/android/phone/vvm/omtp/sync/UploadTask.java
@@ -18,7 +18,7 @@
 
 import android.content.Context;
 import android.content.Intent;
-
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.scheduling.BaseTask;
 import com.android.phone.vvm.omtp.scheduling.PostponePolicy;
 
@@ -44,6 +44,7 @@
     @Override
     public void onExecuteInBackgroundThread() {
         OmtpVvmSyncService service = new OmtpVvmSyncService(getContext());
-        service.sync(this, OmtpVvmSyncService.SYNC_UPLOAD_ONLY, null, null);
+        service.sync(this, OmtpVvmSyncService.SYNC_UPLOAD_ONLY, null, null,
+                VoicemailStatus.edit(getContext(), getSubId()));
     }
 }
diff --git a/src/com/android/phone/vvm/omtp/sync/VvmNetworkRequest.java b/src/com/android/phone/vvm/omtp/sync/VvmNetworkRequest.java
index 798950d..3bdb45b 100644
--- a/src/com/android/phone/vvm/omtp/sync/VvmNetworkRequest.java
+++ b/src/com/android/phone/vvm/omtp/sync/VvmNetworkRequest.java
@@ -19,6 +19,7 @@
 import android.net.Network;
 import android.support.annotation.NonNull;
 import android.telecom.PhoneAccountHandle;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.OmtpVvmCarrierConfigHelper;
 import com.android.phone.vvm.omtp.VvmLog;
 import java.io.Closeable;
@@ -67,8 +68,9 @@
 
     @NonNull
     public static NetworkWrapper getNetwork(OmtpVvmCarrierConfigHelper config,
-            PhoneAccountHandle handle) throws RequestFailedException {
-        FutureNetworkRequestCallback callback = new FutureNetworkRequestCallback(config, handle);
+        PhoneAccountHandle handle, VoicemailStatus.Editor status) throws RequestFailedException {
+        FutureNetworkRequestCallback callback = new FutureNetworkRequestCallback(config, handle,
+            status);
         callback.requestNetwork();
         try {
             return callback.getFuture().get();
@@ -88,8 +90,8 @@
         private final CompletableFuture<NetworkWrapper> mFuture = new CompletableFuture<>();
 
         public FutureNetworkRequestCallback(OmtpVvmCarrierConfigHelper config,
-                PhoneAccountHandle phoneAccount) {
-            super(config, phoneAccount);
+            PhoneAccountHandle phoneAccount, VoicemailStatus.Editor status) {
+            super(config, phoneAccount, status);
         }
 
         public Future<NetworkWrapper> getFuture() {
diff --git a/src/com/android/phone/vvm/omtp/sync/VvmNetworkRequestCallback.java b/src/com/android/phone/vvm/omtp/sync/VvmNetworkRequestCallback.java
index 11526ce..787fdcd 100644
--- a/src/com/android/phone/vvm/omtp/sync/VvmNetworkRequestCallback.java
+++ b/src/com/android/phone/vvm/omtp/sync/VvmNetworkRequestCallback.java
@@ -24,8 +24,8 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.telecom.PhoneAccountHandle;
-
 import com.android.phone.PhoneUtils;
+import com.android.phone.VoicemailStatus;
 import com.android.phone.vvm.omtp.OmtpEvents;
 import com.android.phone.vvm.omtp.OmtpVvmCarrierConfigHelper;
 import com.android.phone.vvm.omtp.VvmLog;
@@ -50,26 +50,34 @@
     private ConnectivityManager mConnectivityManager;
     private final OmtpVvmCarrierConfigHelper mCarrierConfigHelper;
     private final int mSubId;
+    private final VoicemailStatus.Editor mStatus;
     private boolean mRequestSent = false;
     private boolean mResultReceived = false;
 
-    public VvmNetworkRequestCallback(Context context, PhoneAccountHandle phoneAccount) {
+    public VvmNetworkRequestCallback(Context context, PhoneAccountHandle phoneAccount,
+        VoicemailStatus.Editor status) {
         mContext = context;
         mPhoneAccount = phoneAccount;
         mSubId = PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccount);
+        mStatus = status;
         mCarrierConfigHelper = new OmtpVvmCarrierConfigHelper(context, mSubId);
         mNetworkRequest = createNetworkRequest();
     }
 
     public VvmNetworkRequestCallback(OmtpVvmCarrierConfigHelper config,
-            PhoneAccountHandle phoneAccount) {
+        PhoneAccountHandle phoneAccount, VoicemailStatus.Editor status) {
         mContext = config.getContext();
         mPhoneAccount = phoneAccount;
         mSubId = config.getSubId();
+        mStatus = status;
         mCarrierConfigHelper = config;
         mNetworkRequest = createNetworkRequest();
     }
 
+    public VoicemailStatus.Editor getVoicemailStatusEditor() {
+        return mStatus;
+    }
+
     /**
      * @return NetworkRequest for a proper transport type. Use only cellular network if the carrier
      * requires it. Otherwise use whatever available.
@@ -154,9 +162,10 @@
     public void onFailed(String reason) {
         VvmLog.d(TAG, "onFailed: " + reason);
         if (mCarrierConfigHelper.isCellularDataRequired()) {
-            mCarrierConfigHelper.handleEvent(OmtpEvents.DATA_NO_CONNECTION_CELLULAR_REQUIRED);
+            mCarrierConfigHelper
+                .handleEvent(mStatus, OmtpEvents.DATA_NO_CONNECTION_CELLULAR_REQUIRED);
         } else {
-            mCarrierConfigHelper.handleEvent(OmtpEvents.DATA_NO_CONNECTION);
+            mCarrierConfigHelper.handleEvent(mStatus, OmtpEvents.DATA_NO_CONNECTION);
         }
         releaseNetwork();
     }
