diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index afd0d15..4e919d6 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -304,6 +304,8 @@
     public static class WifiCallingDisclaimerActivity extends SettingsActivity { /* empty */ }
     public static class MobileNetworkListActivity extends SettingsActivity {}
     public static class PowerMenuSettingsActivity extends SettingsActivity {}
+    public static class SubscriptionSettingsActivity extends SettingsActivity {  /* empty */  }
+
     /**
      * Activity for BugReportHandlerPicker.
      */
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 87e176e..e94fafc 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -123,6 +123,7 @@
 import com.android.settings.network.NetworkProviderSettings;
 import com.android.settings.network.apn.ApnEditor;
 import com.android.settings.network.apn.ApnSettings;
+import com.android.settings.network.telephony.MobileNetworkSettings;
 import com.android.settings.network.telephony.NetworkSelectSettings;
 import com.android.settings.nfc.AndroidBeam;
 import com.android.settings.nfc.PaymentSettings;
@@ -329,7 +330,8 @@
             AlarmsAndRemindersDetails.class.getName(),
             MediaManagementAppsDetails.class.getName(),
             AutoBrightnessSettings.class.getName(),
-            OneHandedSettings.class.getName()
+            OneHandedSettings.class.getName(),
+            MobileNetworkSettings.class.getName()
     };
 
     public static final String[] SETTINGS_FOR_RESTRICTED = {
diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java
index d7e5876..1ba0502 100644
--- a/src/com/android/settings/network/SubscriptionUtil.java
+++ b/src/com/android/settings/network/SubscriptionUtil.java
@@ -24,6 +24,7 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.os.ParcelUuid;
+import android.provider.Settings;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
@@ -37,6 +38,8 @@
 
 import com.android.internal.telephony.MccTable;
 import com.android.settings.R;
+import com.android.settings.network.helper.SelectableSubscriptions;
+import com.android.settings.network.helper.SubscriptionAnnotation;
 import com.android.settings.network.telephony.DeleteEuiccSubscriptionDialogActivity;
 import com.android.settings.network.telephony.ToggleSubscriptionDialogActivity;
 import com.android.settingslib.DeviceInfoUtils;
@@ -48,6 +51,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -643,4 +647,49 @@
     private static int getDefaultDataSubscriptionId() {
         return SubscriptionManager.getDefaultDataSubscriptionId();
     }
+
+
+    /**
+     * Select one of the subscription as the default subscription.
+     * @param subAnnoList a list of {@link SubscriptionAnnotation}
+     * @return ideally the {@link SubscriptionAnnotation} as expected
+     */
+    private static SubscriptionAnnotation getDefaultSubscriptionSelection(
+            List<SubscriptionAnnotation> subAnnoList) {
+        return (subAnnoList == null) ? null :
+                subAnnoList.stream()
+                        .filter(SubscriptionAnnotation::isDisplayAllowed)
+                        .filter(SubscriptionAnnotation::isActive)
+                        .findFirst().orElse(null);
+    }
+
+    public static SubscriptionInfo getSubscriptionOrDefault(Context context, int subscriptionId) {
+        return getSubscription(context, subscriptionId,
+                (subscriptionId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) ? null : (
+                        subAnnoList -> getDefaultSubscriptionSelection(subAnnoList)
+                ));
+    }
+
+    /**
+     * Get the current subscription to display. First check whether intent has {@link
+     * Settings#EXTRA_SUB_ID} and if so find the subscription with that id.
+     * If not, select default one based on {@link Function} provided.
+     *
+     * @param preferredSubscriptionId preferred subscription id
+     * @param selectionOfDefault when true current subscription is absent
+     */
+    private static SubscriptionInfo getSubscription(Context context, int preferredSubscriptionId,
+            Function<List<SubscriptionAnnotation>, SubscriptionAnnotation> selectionOfDefault) {
+        List<SubscriptionAnnotation> subList =
+                (new SelectableSubscriptions(context, true)).call();
+        Log.d(TAG, "get subId=" + preferredSubscriptionId + " from " + subList);
+        SubscriptionAnnotation currentSubInfo = subList.stream()
+                .filter(SubscriptionAnnotation::isDisplayAllowed)
+                .filter(subAnno -> (subAnno.getSubscriptionId() == preferredSubscriptionId))
+                .findFirst().orElse(null);
+        if ((currentSubInfo == null) && (selectionOfDefault != null)) {
+            currentSubInfo = selectionOfDefault.apply(subList);
+        }
+        return (currentSubInfo == null) ? null : currentSubInfo.getSubInfo();
+    }
 }
diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java
index bbff57d..d3ff546 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java
@@ -18,8 +18,8 @@
 
 import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY;
 
-import android.app.ActionBar;
-import android.content.Context;
+import android.app.Activity;
+import android.app.settings.SettingsEnums;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.UserManager;
@@ -29,84 +29,27 @@
 import android.telephony.ims.ImsRcsManager;
 import android.text.TextUtils;
 import android.util.Log;
-import android.view.View;
-import android.widget.Toolbar;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-import androidx.lifecycle.Lifecycle;
 
-import com.android.settings.R;
-import com.android.settings.core.SettingsBaseActivity;
-import com.android.settings.network.ProxySubscriptionManager;
+import com.android.settings.SettingsActivity;
+import com.android.settings.Utils;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
 import com.android.settings.network.SubscriptionUtil;
-import com.android.settings.network.helper.SelectableSubscriptions;
-import com.android.settings.network.helper.SubscriptionAnnotation;
-
-import java.util.List;
-import java.util.function.Function;
 
 /**
- * Activity for displaying MobileNetworkSettings
+ * Activity for displaying MobileNetworkSettings.
+ *
+ * @Deprecated The MobileNetworkActivity should be removed in Android U. Instead of using the
+ * singleTask activity which will cause an additional window transition when users launch the SIMs
+ * page, using the {@link com.android.settings.Settings.SubscriptionSettingsActivity} which can be
+ * managed by {@link SettingsActivity} and be migrated into the Settings architecture.
  */
-public class MobileNetworkActivity extends SettingsBaseActivity
-        implements ProxySubscriptionManager.OnActiveSubscriptionChangedListener {
+@Deprecated
+public class MobileNetworkActivity extends Activity {
 
     private static final String TAG = "MobileNetworkActivity";
-    @VisibleForTesting
-    static final String MOBILE_SETTINGS_TAG = "mobile_settings:";
-    @VisibleForTesting
-    static final int SUB_ID_NULL = Integer.MIN_VALUE;
-
-    @VisibleForTesting
-    ProxySubscriptionManager mProxySubscriptionMgr;
-
-    private int mCurSubscriptionId = SUB_ID_NULL;
-
-    // This flag forces subscription information fragment to be re-created.
-    // Otherwise, fragment will be kept when subscription id has not been changed.
-    //
-    // Set initial value to true allows subscription information fragment to be re-created when
-    // Activity re-create occur.
-    private boolean mPendingSubscriptionChange = true;
-
-    @Override
-    protected void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        validate(intent);
-        setIntent(intent);
-
-        int updateSubscriptionIndex = mCurSubscriptionId;
-        if (intent != null) {
-            updateSubscriptionIndex = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL);
-        }
-        SubscriptionInfo info = getSubscriptionOrDefault(updateSubscriptionIndex);
-        if (info == null) {
-            Log.d(TAG, "Invalid subId request " + mCurSubscriptionId
-                    + " -> " + updateSubscriptionIndex);
-            return;
-        }
-
-        int oldSubId = mCurSubscriptionId;
-        updateSubscriptions(info, null);
-
-        // If the subscription has changed or the new intent doesnt contain the opt in action,
-        // remove the old discovery dialog. If the activity is being recreated, we will see
-        // onCreate -> onNewIntent, so the dialog will first be recreated for the old subscription
-        // and then removed.
-        if (mCurSubscriptionId != oldSubId || !doesIntentContainOptInAction(intent)) {
-            removeContactDiscoveryDialog(oldSubId);
-        }
-        // evaluate showing the new discovery dialog if this intent contains an action to show the
-        // opt-in.
-        if (doesIntentContainOptInAction(intent)) {
-            maybeShowContactDiscoveryDialog(info);
-        }
-    }
-
+    public static final String SHOW_CAPABILITY_DISCOVERY_OPT_IN =
+            "show_capability_discovery_opt_in";
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -116,318 +59,63 @@
             return;
         }
 
-        final Toolbar toolbar = findViewById(R.id.action_bar);
-        toolbar.setVisibility(View.VISIBLE);
-        setActionBar(toolbar);
-
-        final ActionBar actionBar = getActionBar();
-        if (actionBar != null) {
-            actionBar.setDisplayHomeAsUpEnabled(true);
-            actionBar.setDisplayShowTitleEnabled(true);
-        }
-
-        getProxySubscriptionManager().setLifecycle(getLifecycle());
-
-        final Intent startIntent = getIntent();
-        validate(startIntent);
-        mCurSubscriptionId = savedInstanceState != null
-                ? savedInstanceState.getInt(Settings.EXTRA_SUB_ID, SUB_ID_NULL)
-                : ((startIntent != null)
-                ? startIntent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL)
-                : SUB_ID_NULL);
-        // perform registration after mCurSubscriptionId been configured.
-        registerActiveSubscriptionsListener();
-
-        SubscriptionInfo subscription = getSubscriptionOrDefault(mCurSubscriptionId);
-        if (subscription == null) {
-            Log.d(TAG, "Invalid subId request " + mCurSubscriptionId);
-            tryToFinishActivity();
+        // TODO: Move these intent's extra into SubscriptionSettingsActivity if the
+        //  MobileNetworkActivity is removed in Android U.
+        Intent intent = getIntent();
+        if (intent == null) {
+            Log.d(TAG, "onCreate(), intent = null");
+            this.finish();
             return;
         }
 
-        maybeShowContactDiscoveryDialog(subscription);
-
-        updateSubscriptions(subscription, null);
-    }
-
-    @VisibleForTesting
-    ProxySubscriptionManager getProxySubscriptionManager() {
-        if (mProxySubscriptionMgr == null) {
-            mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(this);
-        }
-        return mProxySubscriptionMgr;
-    }
-
-    @VisibleForTesting
-    void registerActiveSubscriptionsListener() {
-        getProxySubscriptionManager().addActiveSubscriptionsListener(this);
-    }
-
-    /**
-     * Implementation of ProxySubscriptionManager.OnActiveSubscriptionChangedListener
-     */
-    public void onChanged() {
-        mPendingSubscriptionChange = false;
-
-        if (mCurSubscriptionId == SUB_ID_NULL) {
-            return;
+        Intent trampolineIntent;
+        final Intent subscriptionSettingsIntent = new Intent(this,
+                com.android.settings.Settings.SubscriptionSettingsActivity.class);
+        if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this) || !isTaskRoot()) {
+            trampolineIntent = subscriptionSettingsIntent;
+        } else {
+            trampolineIntent = new Intent(Settings.ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY)
+                    .setPackage(Utils.SETTINGS_PACKAGE_NAME);
+            trampolineIntent.putExtra(
+                    android.provider.Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI,
+                    subscriptionSettingsIntent.toUri(Intent.URI_INTENT_SCHEME));
         }
 
-        if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
-            mPendingSubscriptionChange = true;
-            return;
+        int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID,
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        SubscriptionInfo subInfo = SubscriptionUtil.getSubscriptionOrDefault(this, subId);
+        CharSequence title = SubscriptionUtil.getUniqueSubscriptionDisplayName(subInfo, this);
+        trampolineIntent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, title);
+        trampolineIntent.putExtra(Settings.EXTRA_SUB_ID, subId);
+        if (Settings.ACTION_MMS_MESSAGE_SETTING.equals(intent.getAction())) {
+            // highlight "mms_message" preference.
+            trampolineIntent.putExtra(EXTRA_FRAGMENT_ARG_KEY, "mms_message");
         }
 
-        SubscriptionInfo subInfo = getSubscription(mCurSubscriptionId, null);
-        if (subInfo != null) {
-            if (mCurSubscriptionId != subInfo.getSubscriptionId()) {
-                // update based on subscription status change
-                removeContactDiscoveryDialog(mCurSubscriptionId);
-                updateSubscriptions(subInfo, null);
-            }
-            return;
+        if (doesIntentContainOptInAction(intent)) {
+            trampolineIntent.putExtra(SHOW_CAPABILITY_DISCOVERY_OPT_IN,
+                    maybeShowContactDiscoveryDialog(subId));
         }
 
-        Log.w(TAG, "subId missing: " + mCurSubscriptionId);
-
-        // When UI is not the active one, avoid from destroy it immediately
-        // but wait until onResume() to see if subscription back online again.
-        // This is to avoid from glitch behavior of subscription which changes
-        // the UI when UI is considered as in the background or only partly
-        // visible.
-        if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) {
-            mPendingSubscriptionChange = true;
-            return;
-        }
-
-        // Subscription could be missing
-        tryToFinishActivity();
-    }
-
-    protected void runSubscriptionUpdate(Runnable onUpdateRemaining) {
-        SubscriptionInfo subInfo = getSubscription(mCurSubscriptionId, null);
-        if (subInfo == null) {
-            onUpdateRemaining.run();
-            tryToFinishActivity();
-            return;
-        }
-        if (mCurSubscriptionId != subInfo.getSubscriptionId()) {
-            removeContactDiscoveryDialog(mCurSubscriptionId);
-            updateSubscriptions(subInfo, null);
-        }
-        onUpdateRemaining.run();
-    }
-
-    protected void tryToFinishActivity() {
-        if ((!isFinishing()) && (!isDestroyed())) {
+        startActivity(trampolineIntent);
+        if (isTaskRoot()) {
+            finishAndRemoveTask();
+        } else {
             finish();
         }
     }
 
-    @Override
-    protected void onStart() {
-        getProxySubscriptionManager().setLifecycle(getLifecycle());
-        if (mPendingSubscriptionChange) {
-            mPendingSubscriptionChange = false;
-            runSubscriptionUpdate(() -> super.onStart());
-            return;
-        }
-        super.onStart();
-    }
-
-    @Override
-    protected void onResume() {
-        if (mPendingSubscriptionChange) {
-            mPendingSubscriptionChange = false;
-            runSubscriptionUpdate(() -> super.onResume());
-            return;
-        }
-        super.onResume();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        if (mProxySubscriptionMgr == null) {
-            return;
-        }
-        mProxySubscriptionMgr.removeActiveSubscriptionsListener(this);
-    }
-
-    @Override
-    protected void onSaveInstanceState(@NonNull Bundle outState) {
-        super.onSaveInstanceState(outState);
-        saveInstanceState(outState);
-    }
-
-    @VisibleForTesting
-    void saveInstanceState(@NonNull Bundle outState) {
-        outState.putInt(Settings.EXTRA_SUB_ID, mCurSubscriptionId);
-    }
-
-    private void updateTitleAndNavigation(SubscriptionInfo subscription) {
-        // Set the title to the name of the subscription. If we don't have subscription info, the
-        // title will just default to the label for this activity that's already specified in
-        // AndroidManifest.xml.
-        if (subscription != null) {
-            setTitle(SubscriptionUtil.getUniqueSubscriptionDisplayName(subscription, this));
-        }
-    }
-
-    @VisibleForTesting
-    void updateSubscriptions(SubscriptionInfo subscription, Bundle savedInstanceState) {
-        if (subscription == null) {
-            return;
-        }
-        final int subscriptionIndex = subscription.getSubscriptionId();
-
-        updateTitleAndNavigation(subscription);
-        if (savedInstanceState == null) {
-            switchFragment(subscription);
-        }
-
-        mCurSubscriptionId = subscriptionIndex;
-    }
-
-    /**
-     * Select one of the subscription as the default subscription.
-     * @param subAnnoList a list of {@link SubscriptionAnnotation}
-     * @return ideally the {@link SubscriptionAnnotation} as expected
-     */
-    protected SubscriptionAnnotation defaultSubscriptionSelection(
-            List<SubscriptionAnnotation> subAnnoList) {
-        return (subAnnoList == null) ? null :
-                subAnnoList.stream()
-                .filter(SubscriptionAnnotation::isDisplayAllowed)
-                .filter(SubscriptionAnnotation::isActive)
-                .findFirst().orElse(null);
-    }
-
-    protected SubscriptionInfo getSubscriptionOrDefault(int subscriptionId) {
-        return getSubscription(subscriptionId,
-                (subscriptionId != SUB_ID_NULL) ? null : (
-                    subAnnoList -> defaultSubscriptionSelection(subAnnoList)
-                ));
-    }
-
-    /**
-     * Get the current subscription to display. First check whether intent has {@link
-     * Settings#EXTRA_SUB_ID} and if so find the subscription with that id.
-     * If not, select default one based on {@link Function} provided.
-     *
-     * @param preferredSubscriptionId preferred subscription id
-     * @param selectionOfDefault when true current subscription is absent
-     */
-    @VisibleForTesting
-    protected SubscriptionInfo getSubscription(int preferredSubscriptionId,
-            Function<List<SubscriptionAnnotation>, SubscriptionAnnotation> selectionOfDefault) {
-        List<SubscriptionAnnotation> subList =
-                (new SelectableSubscriptions(this, true)).call();
-        Log.d(TAG, "get subId=" + preferredSubscriptionId + " from " + subList);
-        SubscriptionAnnotation currentSubInfo = subList.stream()
-                .filter(SubscriptionAnnotation::isDisplayAllowed)
-                .filter(subAnno -> (subAnno.getSubscriptionId() == preferredSubscriptionId))
-                .findFirst().orElse(null);
-        if ((currentSubInfo == null) && (selectionOfDefault != null)) {
-            currentSubInfo = selectionOfDefault.apply(subList);
-        }
-        return (currentSubInfo == null) ? null : currentSubInfo.getSubInfo();
-    }
-
-    @VisibleForTesting
-    SubscriptionInfo getSubscriptionForSubId(int subId) {
-        return SubscriptionUtil.getAvailableSubscription(this,
-                getProxySubscriptionManager(), subId);
-    }
-
-    @VisibleForTesting
-    void switchFragment(SubscriptionInfo subInfo) {
-        final FragmentManager fragmentManager = getSupportFragmentManager();
-        final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
-
-        final int subId = subInfo.getSubscriptionId();
-        final Intent intent = getIntent();
-        final Bundle bundle = new Bundle();
-        bundle.putInt(Settings.EXTRA_SUB_ID, subId);
-        if (intent != null && Settings.ACTION_MMS_MESSAGE_SETTING.equals(intent.getAction())) {
-            // highlight "mms_message" preference.
-            bundle.putString(EXTRA_FRAGMENT_ARG_KEY, "mms_message");
-        }
-
-        final String fragmentTag = buildFragmentTag(subId);
-        if (fragmentManager.findFragmentByTag(fragmentTag) != null) {
-            Log.d(TAG, "Construct fragment: " + fragmentTag);
-        }
-
-        final Fragment fragment = new MobileNetworkSettings();
-        fragment.setArguments(bundle);
-        fragmentTransaction.replace(R.id.content_frame, fragment, fragmentTag);
-        fragmentTransaction.commitAllowingStateLoss();
-    }
-
-    private void removeContactDiscoveryDialog(int subId) {
-        ContactDiscoveryDialogFragment fragment = getContactDiscoveryFragment(subId);
-        if (fragment != null) {
-            fragment.dismiss();
-        }
-    }
-
-    private ContactDiscoveryDialogFragment getContactDiscoveryFragment(int subId) {
-        // In the case that we are rebuilding this activity after it has been destroyed and
-        // recreated, look up the dialog in the fragment manager.
-        return (ContactDiscoveryDialogFragment) getSupportFragmentManager()
-                .findFragmentByTag(ContactDiscoveryDialogFragment.getFragmentTag(subId));
-    }
-
-    private void maybeShowContactDiscoveryDialog(SubscriptionInfo info) {
-        int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-        CharSequence carrierName = "";
-        if (info != null) {
-            subId = info.getSubscriptionId();
-            carrierName = SubscriptionUtil.getUniqueSubscriptionDisplayName(info, this);
-        }
+    private boolean maybeShowContactDiscoveryDialog(int subId) {
         // If this activity was launched using ACTION_SHOW_CAPABILITY_DISCOVERY_OPT_IN, show the
         // associated dialog only if the opt-in has not been granted yet.
-        boolean showOptInDialog = doesIntentContainOptInAction(getIntent())
-                // has the carrier config enabled capability discovery?
-                && MobileNetworkUtils.isContactDiscoveryVisible(this, subId)
+        return MobileNetworkUtils.isContactDiscoveryVisible(this, subId)
                 // has the user already enabled this configuration?
                 && !MobileNetworkUtils.isContactDiscoveryEnabled(this, subId);
-        ContactDiscoveryDialogFragment fragment = getContactDiscoveryFragment(subId);
-        if (showOptInDialog) {
-            if (fragment == null) {
-                fragment = ContactDiscoveryDialogFragment.newInstance(subId, carrierName);
-            }
-            // Only try to show the dialog if it has not already been added, otherwise we may
-            // accidentally add it multiple times, causing multiple dialogs.
-            if (!fragment.isAdded()) {
-                fragment.show(getSupportFragmentManager(),
-                        ContactDiscoveryDialogFragment.getFragmentTag(subId));
-            }
-        }
     }
 
-    private boolean doesIntentContainOptInAction(Intent intent) {
+    public static boolean doesIntentContainOptInAction(Intent intent) {
         String intentAction = (intent != null ? intent.getAction() : null);
         return TextUtils.equals(intentAction,
                 ImsRcsManager.ACTION_SHOW_CAPABILITY_DISCOVERY_OPT_IN);
     }
-
-    private void validate(Intent intent) {
-        // Do not allow ACTION_SHOW_CAPABILITY_DISCOVERY_OPT_IN without a subscription id specified,
-        // since we do not want the user to accidentally turn on capability polling for the wrong
-        // subscription.
-        if (doesIntentContainOptInAction(intent)) {
-            if (SUB_ID_NULL == intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL)) {
-                throw new IllegalArgumentException("Intent with action "
-                        + "SHOW_CAPABILITY_DISCOVERY_OPT_IN must also include the extra "
-                        + "Settings#EXTRA_SUB_ID");
-            }
-        }
-    }
-
-    @VisibleForTesting
-    String buildFragmentTag(int subscriptionId) {
-        return MOBILE_SETTINGS_TAG + subscriptionId;
-    }
 }
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index ba80a8c..cf0f889 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -23,8 +23,10 @@
 import android.os.Bundle;
 import android.os.UserManager;
 import android.provider.Settings;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.ims.ImsRcsManager;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Menu;
@@ -39,6 +41,7 @@
 import com.android.settings.datausage.DataUsageSummaryPreferenceController;
 import com.android.settings.network.ActiveSubscriptionsListener;
 import com.android.settings.network.CarrierWifiTogglePreferenceController;
+import com.android.settings.network.SubscriptionUtil;
 import com.android.settings.network.telephony.cdma.CdmaSubscriptionPreferenceController;
 import com.android.settings.network.telephony.cdma.CdmaSystemSelectPreferenceController;
 import com.android.settings.network.telephony.gsm.AutoSelectPreferenceController;
@@ -115,9 +118,16 @@
 
     @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
-        mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID,
-                MobileNetworkUtils.getSearchableSubscriptionId(context));
-        Log.i(LOG_TAG, "display subId: " + mSubId);
+        Intent intent = getIntent();
+        if (intent != null) {
+            mSubId = intent.getIntExtra(Settings.EXTRA_SUB_ID,
+                    MobileNetworkUtils.getSearchableSubscriptionId(context));
+            Log.i(LOG_TAG, "display subId from intent: " + mSubId);
+        } else {
+            mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID,
+                    MobileNetworkUtils.getSearchableSubscriptionId(context));
+            Log.i(LOG_TAG, "display subId from getArguments(): " + mSubId);
+        }
 
         if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
             return Arrays.asList();
@@ -131,6 +141,30 @@
     public void onAttach(Context context) {
         super.onAttach(context);
 
+        Intent intent = getIntent();
+        SubscriptionInfo info = SubscriptionUtil.getSubscriptionOrDefault(context, mSubId);
+        if (info == null) {
+            Log.d(LOG_TAG, "Invalid subId request " + mSubId);
+            return;
+        }
+
+        int oldSubId = mSubId;
+        updateSubscriptions(info);
+        // If the subscription has changed or the new intent does not contain the opt in action,
+        // remove the old discovery dialog. If the activity is being recreated, we will see
+        // onCreate -> onNewIntent, so the dialog will first be recreated for the old subscription
+        // and then removed.
+        if (!MobileNetworkActivity.doesIntentContainOptInAction(intent)) {
+            removeContactDiscoveryDialog(oldSubId);
+        }
+
+        // evaluate showing the new discovery dialog if this intent contains an action to show the
+        // opt-in.
+        if (MobileNetworkActivity.doesIntentContainOptInAction(intent)) {
+            showContactDiscoveryDialog(
+                    SubscriptionUtil.getSubscriptionOrDefault(context, mSubId));
+        }
+
         final DataUsageSummaryPreferenceController dataUsageSummaryPreferenceController =
                 use(DataUsageSummaryPreferenceController.class);
         if (dataUsageSummaryPreferenceController != null) {
@@ -339,4 +373,49 @@
                     return context.getSystemService(UserManager.class).isAdminUser();
                 }
             };
+
+    private ContactDiscoveryDialogFragment getContactDiscoveryFragment(int subId) {
+        // In the case that we are rebuilding this activity after it has been destroyed and
+        // recreated, look up the dialog in the fragment manager.
+        return (ContactDiscoveryDialogFragment) getChildFragmentManager()
+                .findFragmentByTag(ContactDiscoveryDialogFragment.getFragmentTag(subId));
+    }
+
+
+    private void removeContactDiscoveryDialog(int subId) {
+        ContactDiscoveryDialogFragment fragment = getContactDiscoveryFragment(subId);
+        if (fragment != null) {
+            fragment.dismiss();
+        }
+    }
+
+    private void showContactDiscoveryDialog(SubscriptionInfo info) {
+        if (info == null) {
+            Log.d(LOG_TAG, "Invalid subId request " + mSubId);
+            onDestroy();
+            return;
+        }
+
+        CharSequence carrierName = SubscriptionUtil.getUniqueSubscriptionDisplayName(info,
+                getContext());
+        ContactDiscoveryDialogFragment fragment = getContactDiscoveryFragment(mSubId);
+        if (fragment == null) {
+            fragment = ContactDiscoveryDialogFragment.newInstance(mSubId, carrierName);
+        }
+        // Only try to show the dialog if it has not already been added, otherwise we may
+        // accidentally add it multiple times, causing multiple dialogs.
+        if (!fragment.isAdded()) {
+            fragment.show(getChildFragmentManager(),
+                    ContactDiscoveryDialogFragment.getFragmentTag(mSubId));
+        }
+    }
+
+    private void updateSubscriptions(SubscriptionInfo subscription) {
+        if (subscription == null) {
+            return;
+        }
+        final int subscriptionIndex = subscription.getSubscriptionId();
+
+        mSubId = subscriptionIndex;
+    }
 }
