diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9e54312..50741ac 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -667,5 +667,12 @@
             android:name="com.android.phone.vvm.omtp.sync.OmtpVvmSyncService"
             android:exported="false"
        />
+       <receiver android:name="com.android.phone.vvm.omtp.VvmPackageInstallReceiver">
+          <intent-filter>
+              <action android:name="android.intent.action.PACKAGE_INSTALL" />
+              <action android:name="android.intent.action.PACKAGE_ADDED" />
+              <data android:scheme="package"/>
+          </intent-filter>
+       </receiver>
     </application>
 </manifest>
diff --git a/src/com/android/phone/settings/VoicemailSettingsActivity.java b/src/com/android/phone/settings/VoicemailSettingsActivity.java
index 7df0c98..f70ee65 100644
--- a/src/com/android/phone/settings/VoicemailSettingsActivity.java
+++ b/src/com/android/phone/settings/VoicemailSettingsActivity.java
@@ -268,7 +268,6 @@
             prefSet.removePreference(mVoicemailVisualVoicemail);
         }
 
-
         updateVMPreferenceWidgets(mVoicemailProviders.getValue());
 
         // check the intent that started this activity and pop up the voicemail
@@ -388,9 +387,8 @@
             VoicemailNotificationSettingsUtil.setVibrationEnabled(
                     mPhone, Boolean.TRUE.equals(objValue));
         } else if (preference.getKey().equals(mVoicemailVisualVoicemail.getKey())) {
-            boolean isEnabled = (Boolean) objValue;
-            VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(mPhone, isEnabled);
-            if (isEnabled) {
+            if ((Boolean) objValue) {
+                VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(mPhone, true);
                 mOmtpVvmCarrierConfigHelper.startActivation();
             } else {
                 OmtpVvmSourceManager.getInstance(mPhone.getContext()).removeSource(mPhone);
diff --git a/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java b/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java
index 6fe2059..6300622 100644
--- a/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java
+++ b/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java
@@ -16,6 +16,7 @@
 package com.android.phone.vvm.omtp;
 
 import android.content.Context;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.PersistableBundle;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SmsManager;
@@ -55,11 +56,38 @@
                 CarrierConfigManager.STRING_VVM_TYPE, null);
     }
 
+    public String getCarrierVvmPackageName() {
+        if (mCarrierConfig == null) {
+            return null;
+        }
+
+        return mCarrierConfig.getString(
+                CarrierConfigManager.STRING_CARRIER_VVM_PACKAGE_NAME, null);
+    }
+
     public boolean isOmtpVvmType() {
         return (TelephonyManager.VVM_TYPE_OMTP.equals(mVvmType) ||
                 TelephonyManager.VVM_TYPE_CVVM.equals(mVvmType));
     }
 
+    /**
+     * For checking upon sim insertion whether visual voicemail should be enabled. This method does
+     * so by checking if the carrier's voicemail app is installed.
+     */
+    public boolean isEnabledByDefault() {
+        String packageName = mCarrierConfig.getString(
+                CarrierConfigManager.STRING_CARRIER_VVM_PACKAGE_NAME);
+        if (packageName == null) {
+            return true;
+        }
+        try {
+            mContext.getPackageManager().getPackageInfo(packageName, 0);
+            return false;
+        } catch (NameNotFoundException e) {
+            return true;
+        }
+    }
+
     public void startActivation() {
         OmtpMessageSender messageSender = getMessageSender();
         if (messageSender != null) {
diff --git a/src/com/android/phone/vvm/omtp/SimChangeReceiver.java b/src/com/android/phone/vvm/omtp/SimChangeReceiver.java
index 940f3a0..3ac1096 100644
--- a/src/com/android/phone/vvm/omtp/SimChangeReceiver.java
+++ b/src/com/android/phone/vvm/omtp/SimChangeReceiver.java
@@ -68,13 +68,15 @@
                     PhoneAccountHandle phoneAccount = PhoneUtils.makePstnPhoneAccountHandle(
                             SubscriptionManager.getPhoneId(subId));
 
-                    if (TelephonyManager.VVM_TYPE_OMTP.equals(carrierConfigHelper.getVvmType())) {
-                        carrierConfigHelper.startActivation();
+                    if (carrierConfigHelper.isEnabledByDefault()) {
                         VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(
                                 context, phoneAccount, true);
+                        carrierConfigHelper.startActivation();
                     } else {
-                        VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(
-                                context, phoneAccount, false);
+                        // It may be that the source was not registered to begin with but we want
+                        // to run through the steps to remove the source just in case.
+                        OmtpVvmSourceManager.getInstance(context).removeSource(phoneAccount);
+                        carrierConfigHelper.startDeactivation();
                     }
                 }
                 break;
diff --git a/src/com/android/phone/vvm/omtp/VvmPackageInstallReceiver.java b/src/com/android/phone/vvm/omtp/VvmPackageInstallReceiver.java
new file mode 100644
index 0000000..1541f2d
--- /dev/null
+++ b/src/com/android/phone/vvm/omtp/VvmPackageInstallReceiver.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.phone.vvm.omtp;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.telecom.PhoneAccountHandle;
+
+import com.android.phone.PhoneUtils;
+import com.android.phone.vvm.omtp.sync.OmtpVvmSourceManager;
+
+import java.util.Set;
+
+/**
+ * When a new package is installed, check if it matches any of the vvm carrier apps of the currently
+ * enabled dialer vvm sources.
+ */
+public class VvmPackageInstallReceiver extends BroadcastReceiver {
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (intent.getData() == null) {
+            return;
+        }
+
+        String packageName = intent.getData().getSchemeSpecificPart();
+        if (packageName == null) {
+            return;
+        }
+
+        OmtpVvmSourceManager vvmSourceManager = OmtpVvmSourceManager.getInstance(context);
+        Set<PhoneAccountHandle> phoneAccounts = vvmSourceManager.getOmtpVvmSources();
+        for (PhoneAccountHandle phoneAccount : phoneAccounts) {
+            OmtpVvmCarrierConfigHelper carrierConfigHelper = new OmtpVvmCarrierConfigHelper(
+                    context, PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccount));
+            if (packageName.equals(carrierConfigHelper.getCarrierVvmPackageName())) {
+                OmtpVvmSourceManager.getInstance(context).removeSource(phoneAccount);
+                carrierConfigHelper.startDeactivation();
+            }
+        }
+    }
+}
