diff --git a/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncReceiver.java b/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncReceiver.java
index f0d21d1..0902b6d 100644
--- a/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncReceiver.java
+++ b/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncReceiver.java
@@ -32,6 +32,7 @@
             Log.v(TAG, "Sync intent received");
             Intent syncIntent = OmtpVvmSyncService
                     .getSyncIntent(context, OmtpVvmSyncService.SYNC_FULL_SYNC, null, true);
+            intent.putExtra(OmtpVvmSyncService.EXTRA_IS_MANUAL_SYNC, true);
             context.startService(syncIntent);
         }
     }
diff --git a/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncService.java b/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncService.java
index 36deb08..2d4d33c 100644
--- a/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncService.java
+++ b/src/com/android/phone/vvm/omtp/sync/OmtpVvmSyncService.java
@@ -66,10 +66,14 @@
     public static final String EXTRA_PHONE_ACCOUNT = "phone_account";
     /** The voicemail to fetch. */
     public static final String EXTRA_VOICEMAIL = "voicemail";
-
+    /** The sync request is initiated by the user, should allow shorter sync interval. */
+    public static final String EXTRA_IS_MANUAL_SYNC = "is_manual_sync";
     // Minimum time allowed between full syncs
     private static final int MINIMUM_FULL_SYNC_INTERVAL_MILLIS = 60 * 1000;
 
+    // Minimum time allowed between manual syncs
+    private static final int MINIMUM_MANUAL_SYNC_INTERVAL_MILLIS = 3 * 1000;
+
     private VoicemailsQueryHelper mQueryHelper;
 
     public OmtpVvmSyncService() {
@@ -157,23 +161,24 @@
         LocalLogHelper.log(TAG, "Sync requested: " + action +
                 " for all accounts: " + String.valueOf(phoneAccount == null));
 
+        boolean isManualSync = intent.getBooleanExtra(EXTRA_IS_MANUAL_SYNC, false);
         Voicemail voicemail = intent.getParcelableExtra(EXTRA_VOICEMAIL);
         if (phoneAccount != null) {
             Log.v(TAG, "Sync requested: " + action + " - for account: " + phoneAccount);
-            setupAndSendRequest(phoneAccount, voicemail, action);
+            setupAndSendRequest(phoneAccount, voicemail, action, isManualSync);
         } else {
             Log.v(TAG, "Sync requested: " + action + " - for all accounts");
             OmtpVvmSourceManager vvmSourceManager =
                     OmtpVvmSourceManager.getInstance(this);
             Set<PhoneAccountHandle> sources = vvmSourceManager.getOmtpVvmSources();
             for (PhoneAccountHandle source : sources) {
-                setupAndSendRequest(source, null, action);
+                setupAndSendRequest(source, null, action, isManualSync);
             }
         }
     }
 
     private void setupAndSendRequest(PhoneAccountHandle phoneAccount, Voicemail voicemail,
-            String action) {
+            String action, boolean isManualSync) {
         if (!VisualVoicemailSettingsUtil.isVisualVoicemailEnabled(this, phoneAccount)) {
             Log.v(TAG, "Sync requested for disabled account");
             return;
@@ -183,10 +188,25 @@
             long lastSyncTime = VisualVoicemailSettingsUtil.getVisualVoicemailLastFullSyncTime(
                     this, phoneAccount);
             long currentTime = System.currentTimeMillis();
-            if (currentTime - lastSyncTime < MINIMUM_FULL_SYNC_INTERVAL_MILLIS) {
+            int minimumInterval = isManualSync ? MINIMUM_MANUAL_SYNC_INTERVAL_MILLIS
+                    : MINIMUM_MANUAL_SYNC_INTERVAL_MILLIS;
+            if (currentTime - lastSyncTime < minimumInterval) {
                 // If it's been less than a minute since the last sync, bail.
                 Log.v(TAG, "Avoiding duplicate full sync: synced recently for "
                         + phoneAccount.getId());
+
+                /**
+                 *  Perform a NOOP change to the database so the sender can observe the sync is
+                 *  completed.
+                 *  TODO: Instead of this hack, refactor the sync to be synchronous so the sender
+                 *  can use sendOrderedBroadcast() to register a callback once all syncs are
+                 *  finished
+                 *  b/26937720
+                 */
+                Status.setStatus(this, phoneAccount,
+                        Status.CONFIGURATION_STATE_IGNORE,
+                        Status.DATA_CHANNEL_STATE_IGNORE,
+                        Status.NOTIFICATION_CHANNEL_STATE_IGNORE);
                 return;
             }
             VisualVoicemailSettingsUtil.setVisualVoicemailLastFullSyncTime(
