diff --git a/src/com/android/ons/ONSProfileSelector.java b/src/com/android/ons/ONSProfileSelector.java
index 335ff96..fbd39ed 100644
--- a/src/com/android/ons/ONSProfileSelector.java
+++ b/src/com/android/ons/ONSProfileSelector.java
@@ -380,6 +380,31 @@
         return new HashSet<>(availableNetworks1).equals(new HashSet<>(availableNetworks2));
     }
 
+    private boolean isPrimaryActiveOnOpportunisticSlot(
+            ArrayList<AvailableNetworkInfo> availableNetworks) {
+        /* Check if any of the available network is an embedded profile. if none are embedded,
+         * return false
+         * Todo <b/130535071> */
+        if (!isOpportunisticSubEmbedded(availableNetworks)) {
+            return false;
+        }
+
+        List<SubscriptionInfo> subscriptionInfos =
+            mSubscriptionManager.getActiveSubscriptionInfoList(false);
+        if (subscriptionInfos == null) {
+            return false;
+        }
+
+        /* if there is a primary subscription active on the eSIM, return true */
+        for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
+            if (!subscriptionInfo.isOpportunistic() && subscriptionInfo.isEmbedded()) {
+                return true;
+            }
+        }
+
+        return false;
+
+    }
     private void sendUpdateNetworksCallbackHelper(IUpdateAvailableNetworksCallback callback,
             int result) {
         if (callback == null) {
@@ -404,6 +429,15 @@
                     TelephonyManager.UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS);
             return;
         }
+
+        /* if primary subscription is active on opportunistic slot, do not switch out the same. */
+        if (isPrimaryActiveOnOpportunisticSlot(availableNetworks)) {
+            logDebug("primary subscription active on opportunistic sub");
+            sendUpdateNetworksCallbackHelper(callbackStub,
+                TelephonyManager.UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS);
+            return;
+        }
+
         if (isSame(availableNetworks, mAvailableNetworkInfos)) {
             return;
         }
@@ -481,6 +515,22 @@
         return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
     }
 
+    private boolean isOpportunisticSubEmbedded(
+            ArrayList<AvailableNetworkInfo> availableNetworks) {
+        List<SubscriptionInfo> subscriptionInfos =
+            mSubscriptionManager.getOpportunisticSubscriptions();
+        for (AvailableNetworkInfo availableNetworkInfo : availableNetworks) {
+            for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
+                if (subscriptionInfo.getSubscriptionId() == availableNetworkInfo.getSubId()
+                        && subscriptionInfo.isEmbedded()) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
     private int getActiveOpportunisticSubId() {
         List<SubscriptionInfo> subscriptionInfos =
             mSubscriptionManager.getActiveSubscriptionInfoList(false);
diff --git a/tests/src/com/android/ons/ONSProfileSelectorTest.java b/tests/src/com/android/ons/ONSProfileSelectorTest.java
index 0847f44..a5d3a7c 100644
--- a/tests/src/com/android/ons/ONSProfileSelectorTest.java
+++ b/tests/src/com/android/ons/ONSProfileSelectorTest.java
@@ -135,7 +135,8 @@
             public void run() {
                 Looper.prepare();
                 doReturn(true).when(mONSNetworkScanCtlr).startFastNetworkScan(anyObject());
-                doReturn(null).when(mSubscriptionManager).getOpportunisticSubscriptions();
+                doReturn(new ArrayList<>()).when(mSubscriptionManager)
+                        .getOpportunisticSubscriptions();
                 mONSProfileSelector = new MyONSProfileSelector(mContext,
                         mONSProfileSelectionCallback);
                 mONSProfileSelector.updateOppSubs();
@@ -228,6 +229,71 @@
         assertTrue(mReady);
     }
 
+    @Test
+    public void testStartProfileSelectionWithActivePrimarySimOnESim() {
+        List<SubscriptionInfo> opportunisticSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
+        List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
+        SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+            "123", 1, null, "310", "210", "", true, null, "1", true, null, 1839, 1);
+        SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
+            "123", 1, null, "310", "211", "", true, null, "1", false, null, 1839, 1);
+        opportunisticSubscriptionInfoList.add(subscriptionInfo);
+        activeSubscriptionInfoList.add(subscriptionInfo2);
+
+        ArrayList<String> mccMncs = new ArrayList<>();
+        mccMncs.add("310210");
+        AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(5, 2, mccMncs,
+            new ArrayList<Integer>());
+        ArrayList<AvailableNetworkInfo> availableNetworkInfos = new ArrayList<AvailableNetworkInfo>();
+        availableNetworkInfos.add(availableNetworkInfo);
+
+        IUpdateAvailableNetworksCallback mCallback = new IUpdateAvailableNetworksCallback.Stub() {
+            @Override
+            public void onComplete(int result) {
+                mResult = result;
+            }
+        };
+
+        mResult = -1;
+        mReady = false;
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                Looper.prepare();
+                doReturn(opportunisticSubscriptionInfoList).when(mSubscriptionManager).getOpportunisticSubscriptions();
+                doReturn(false).when(mSubscriptionManager).isActiveSubId(anyInt());
+                doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                    .getActiveSubscriptionInfoList(anyBoolean());
+                mONSProfileSelector = new MyONSProfileSelector(mContext,
+                    new MyONSProfileSelector.ONSProfileSelectionCallback() {
+                        public void onProfileSelectionDone() {
+                            setReady(true);
+                        }
+                    });
+                mONSProfileSelector.updateOppSubs();
+                mONSProfileSelector.startProfileSelection(availableNetworkInfos, mCallback);
+                mLooper = Looper.myLooper();
+                setReady(true);
+                Looper.loop();
+            }
+        }).start();
+
+        // Wait till initialization is complete.
+        waitUntilReady();
+        mReady = false;
+        mDataSubId = -1;
+
+        // Testing startProfileSelection with opportunistic sub.
+        // On success onProfileSelectionDone must get invoked.
+        assertFalse(mReady);
+        waitForMs(100);
+        Intent callbackIntent = new Intent(MyONSProfileSelector.ACTION_SUB_SWITCH);
+        callbackIntent.putExtra("sequenceId", 1);
+        callbackIntent.putExtra("subId", 5);
+        waitUntilReady();
+        assertEquals(TelephonyManager.UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS, mResult);
+    }
+
     public static void waitForMs(long ms) {
         try {
             Thread.sleep(ms);
@@ -239,7 +305,7 @@
     @Test
     public void testselectProfileForDataWithNoOpportunsticSub() {
         mReady = false;
-        doReturn(null).when(mSubscriptionManager).getOpportunisticSubscriptions();
+        doReturn(new ArrayList<>()).when(mSubscriptionManager).getOpportunisticSubscriptions();
         new Thread(new Runnable() {
             @Override
             public void run() {
@@ -269,7 +335,7 @@
                 "123", 1, null, "310", "210", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
         mReady = false;
-        doReturn(null).when(mSubscriptionManager).getOpportunisticSubscriptions();
+        doReturn(new ArrayList<>()).when(mSubscriptionManager).getOpportunisticSubscriptions();
         new Thread(new Runnable() {
             @Override
             public void run() {
