diff --git a/src/com/android/ons/ONSProfileSelector.java b/src/com/android/ons/ONSProfileSelector.java
index 261a7ef..95287fc 100644
--- a/src/com/android/ons/ONSProfileSelector.java
+++ b/src/com/android/ons/ONSProfileSelector.java
@@ -378,19 +378,27 @@
     protected int getAvailableESIMPortIndex() {
         //Check if an opportunistic subscription is already active. If yes then, use the same port.
         List<SubscriptionInfo> subscriptionInfos = mSubscriptionManager
-                .getOpportunisticSubscriptions();
-        if (subscriptionInfos != null && subscriptionInfos.size() > 0) {
-            return subscriptionInfos.get(0).getPortIndex();
+                .getCompleteActiveSubscriptionInfoList();
+        if (subscriptionInfos != null) {
+            logDebug("[getAvailableESIMPortIndex] subscriptionInfos size:"
+                    + subscriptionInfos.size());
+            for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
+                if (subscriptionInfo.isEmbedded() && subscriptionInfo.isOpportunistic()) {
+                    return subscriptionInfo.getPortIndex();
+                }
+            }
         }
 
         //Look for available port.
         for (UiccCardInfo uiccCardInfo : mTelephonyManager.getUiccCardsInfo()) {
+            logDebug("[getAvailableESIMPortIndex] CardInfo: " + uiccCardInfo.toString());
             if (!uiccCardInfo.isEuicc()) {
                 continue;
             }
 
             EuiccManager euiccManager = mEuiccManager.createForCardId(uiccCardInfo.getCardId());
             for (UiccPortInfo uiccPortInfo : uiccCardInfo.getPorts()) {
+                logDebug("[getAvailableESIMPortIndex] PortInfo: " + uiccPortInfo.toString());
                 //Port is available if no profiles enabled on it.
                 if (euiccManager.isSimPortAvailable(uiccPortInfo.getPortIndex())) {
                     return uiccPortInfo.getPortIndex();
@@ -398,6 +406,7 @@
             }
         }
 
+        logDebug("[getAvailableESIMPortIndex] No Port is available.");
         return TelephonyManager.INVALID_PORT_INDEX;
     }
 
diff --git a/tests/src/com/android/ons/ONSProfileSelectorTest.java b/tests/src/com/android/ons/ONSProfileSelectorTest.java
index 116d1a5..68925f7 100644
--- a/tests/src/com/android/ons/ONSProfileSelectorTest.java
+++ b/tests/src/com/android/ons/ONSProfileSelectorTest.java
@@ -268,6 +268,8 @@
                     .getOpportunisticSubscriptions();
                 doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
                         .getActiveSubscriptionInfoList();
+                doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                        .getCompleteActiveSubscriptionInfoList();
                 doReturn(true).when(mSubscriptionManager).isActiveSubId(subId);
                 doReturn(true).when(mSubscriptionBoundTelephonyManager).enableModemForSlot(
                     anyInt(), anyBoolean());
@@ -310,13 +312,18 @@
 
         List<SubscriptionInfo> subscriptionInfoList = new ArrayList<SubscriptionInfo>();
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
-                "123", 1, null, "310", "210", "", false, null, "1");
+                "123", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1, 1, 1,
+                null, null, false, 0);
         subscriptionInfoList.add(subscriptionInfo);
         SubscriptionInfo subscriptionInfo_2 = new SubscriptionInfo(8, "", 1, "Vzw", "Vzw", 1, 1,
-                "123", 1, null, "311", "480", "", false, null, "1");
+                "456", 1, null, "311", "480", "", true, null, "1", 1, true, null, false, 1, 1, 1,
+                null, null, false, 1);
         subscriptionInfoList.add(subscriptionInfo_2);
         doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
         doReturn(subscriptionInfo_2).when(mSubscriptionManager).getActiveSubscriptionInfo(8);
+        doReturn(subscriptionInfoList).when(mSubscriptionManager)
+                .getCompleteActiveSubscriptionInfoList();
+        doReturn(subscriptionInfoList).when(mSubscriptionManager).getOpportunisticSubscriptions();
 
         List<CellInfo> results2 = new ArrayList<CellInfo>();
         CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1);
@@ -353,8 +360,6 @@
             @Override
             public void run() {
                 Looper.prepare();
-                doReturn(subscriptionInfoList).when(mSubscriptionManager)
-                        .getOpportunisticSubscriptions();
                 doReturn(true).when(mSubscriptionManager).isActiveSubId(anyInt());
                 doReturn(true).when(mSubscriptionBoundTelephonyManager).enableModemForSlot(
                         anyInt(), anyBoolean());
@@ -628,7 +633,7 @@
         activeSubscriptionInfoList.add(subscriptionInfo1);
         activeSubscriptionInfoList.add(subscriptionInfo2);
         doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
-                .getActiveSubscriptionInfoList();
+                .getCompleteActiveSubscriptionInfoList();
 
         List<CellInfo> results2 = new ArrayList<CellInfo>();
         CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1);
@@ -821,31 +826,43 @@
         }).start();
         waitUntilReady();
         waitForMs(500);
-        assertEquals(mONSProfileSelector.getCurrentPreferredData(), 5);
+        assertEquals(5, mONSProfileSelector.getCurrentPreferredData());
     }
 
     @Test
     public void testAvailablePortWhenTwoPrimarySIMsAreActive() {
+        /**
+         * 2 - Primary active subscriptions and
+         * 1 - Inactive opportunistic subscription
+         */
+
         List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
         List<SubscriptionInfo> opportunisticInfoList = new ArrayList<SubscriptionInfo>();
 
-        SubscriptionInfo subscriptionInfo1 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
-                "123", 1, null, "310", "210", "", true, null, "1", 1, false, null, false, 1839, 1,
-                1, null, null, false, 1);
-        SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
-                "456", 1, null, "310", "211", "", true, null, "1", 1, false, null, false, 1839, 1,
-                1, null, null, false, 2);
+        SubscriptionInfo oppSubInfo = new SubscriptionInfo(4, "", -1, "TMO", "TMO", 1, 1,
+                "001", 1, null, "110", "210", "", true, null, "1", 1, true, null, false, 2839, 1,
+                1, null, null, false, TelephonyManager.INVALID_PORT_INDEX);
 
-        activeSubscriptionInfoList.add(subscriptionInfo1);
-        activeSubscriptionInfoList.add(subscriptionInfo2);
+        SubscriptionInfo primarySubInfo1 = new SubscriptionInfo(5, "", 0, "TMO", "TMO", 1, 1,
+                "123", 1, null, "310", "210", "", true, null, "1", 1, false, null, false, 1839, 1,
+                1, null, null, false, 0);
+        SubscriptionInfo primarySubInfo2 = new SubscriptionInfo(6, "", 0, "TMO", "TMO", 1, 1,
+                "456", 1, null, "310", "211", "", true, null, "1", 1, false, null, false, 1839, 1,
+                1, null, null, false, 1);
+
+        activeSubscriptionInfoList.add(primarySubInfo1);
+        activeSubscriptionInfoList.add(primarySubInfo2);
+        opportunisticInfoList.add(oppSubInfo);
 
         doReturn(opportunisticInfoList).when(mSubscriptionManager).getOpportunisticSubscriptions();
         doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
-                .getActiveSubscriptionInfoList();
+                .getCompleteActiveSubscriptionInfoList();
 
-        UiccPortInfo uiccPortInfo = new UiccPortInfo("", 1, 1, true);
+        UiccPortInfo uiccPortInfo1 = new UiccPortInfo("", 0, 0, true);
+        UiccPortInfo uiccPortInfo2 = new UiccPortInfo("", 1, 0, true);
         ArrayList<UiccPortInfo> uiccPortInfoList = new ArrayList<>();
-        uiccPortInfoList.add(uiccPortInfo);
+        uiccPortInfoList.add(uiccPortInfo1);
+        uiccPortInfoList.add(uiccPortInfo2);
 
         UiccCardInfo uiccCardInfo = new UiccCardInfo(true, 1, "", 0, false, true, uiccPortInfoList);
         ArrayList<UiccCardInfo> uiccCardInfoList = new ArrayList<>();
@@ -853,34 +870,177 @@
 
         doReturn(uiccCardInfoList).when(mMockTelephonyManager).getUiccCardsInfo();
         doReturn(mMockEuiccManager).when(mMockEuiccManager).createForCardId(1);
+        doReturn(false).when(mMockEuiccManager).isSimPortAvailable(0);
         doReturn(false).when(mMockEuiccManager).isSimPortAvailable(1);
 
         mONSProfileSelector = new MyONSProfileSelector(mContext, null);
+        mONSProfileSelector.mTelephonyManager = mMockTelephonyManager;
+        mONSProfileSelector.mEuiccManager = mMockEuiccManager;
+
         int portIdx = mONSProfileSelector.getAvailableESIMPortIndex();
-        assertEquals(portIdx, TelephonyManager.INVALID_PORT_INDEX);
+        assertEquals(TelephonyManager.INVALID_PORT_INDEX, portIdx);
     }
 
     @Test
     public void testAvailablePortWhenOpportunisticEsimIsActive() {
+        /**
+         * 1 - Primary active subscriptions and
+         * 1 - Active opportunistic subscription
+         */
+
         List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
         List<SubscriptionInfo> opportunisticInfoList = new ArrayList<SubscriptionInfo>();
 
-        SubscriptionInfo subscriptionInfo1 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+        SubscriptionInfo oppSubInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
                 "123", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
-                1, null, null, false, 1);
-        SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
+                1, null, null, false, 0);
+
+        SubscriptionInfo primarySubInfo = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
                 "456", 1, null, "310", "211", "", true, null, "1", 1, false, null, false, 1839, 1,
-                1, null, null, false, 2);
+                1, null, null, false, 1);
 
-        opportunisticInfoList.add(subscriptionInfo1);
-        activeSubscriptionInfoList.add(subscriptionInfo1);
-        activeSubscriptionInfoList.add(subscriptionInfo2);
+        opportunisticInfoList.add(oppSubInfo);
+        activeSubscriptionInfoList.add(oppSubInfo);
+        activeSubscriptionInfoList.add(primarySubInfo);
 
-        doReturn(opportunisticInfoList).when(mSubscriptionManager).getOpportunisticSubscriptions();
+        doReturn(opportunisticInfoList).when(mSubscriptionManager)
+                .getOpportunisticSubscriptions();
+        doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                .getCompleteActiveSubscriptionInfoList();
 
         mONSProfileSelector = new MyONSProfileSelector(mContext, null);
         int portIdx = mONSProfileSelector.getAvailableESIMPortIndex();
-        assertEquals(portIdx, 1);
+        assertEquals(0, portIdx);
+    }
+
+    @Test
+    public void testAvailablePortWhenTwoOpportunisticEsimsAreActive() {
+        /**
+         * 2 - Active opportunistic subscriptions.
+         */
+
+        List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
+        List<SubscriptionInfo> opportunisticInfoList = new ArrayList<SubscriptionInfo>();
+
+        SubscriptionInfo opportunisticSubInfo1 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+                "123", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, 0);
+
+        SubscriptionInfo opportunisticSubInfo2 = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
+                "456", 1, null, "310", "211", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, 1);
+
+        opportunisticInfoList.add(opportunisticSubInfo1);
+        opportunisticInfoList.add(opportunisticSubInfo2);
+        activeSubscriptionInfoList.add(opportunisticSubInfo1);
+        activeSubscriptionInfoList.add(opportunisticSubInfo2);
+
+        doReturn(opportunisticInfoList).when(mSubscriptionManager)
+                .getOpportunisticSubscriptions();
+        doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                .getCompleteActiveSubscriptionInfoList();
+
+        mONSProfileSelector = new MyONSProfileSelector(mContext, null);
+        int portIdx = mONSProfileSelector.getAvailableESIMPortIndex();
+
+        /* one of the opportunistic eSIM port should be selected */
+        assertTrue(portIdx == 0 || portIdx == 1);
+    }
+
+    @Test
+    public void testAvailablePortWhenOpportunisticEsimIsActiveAndInactiveSubscriptions() {
+        /**
+         * 1 - Primary active subscription and
+         * 1 - Active opportunistic subscription and
+         * 2 - Inactive opportunistic subscriptions
+         */
+
+        List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
+        List<SubscriptionInfo> opportunisticInfoList = new ArrayList<SubscriptionInfo>();
+
+        SubscriptionInfo opportunisticSubInfo1 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+                "123", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, 1);
+        SubscriptionInfo primarySubInfo = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
+                "456", 1, null, "310", "211", "", true, null, "1", 1, false, null, false, 1839, 1,
+                1, null, null, false, 0);
+
+        SubscriptionInfo opportunisticSubInfo2 = new SubscriptionInfo(7, "", 1, "TMO", "TMO", 1, 1,
+                "789", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, TelephonyManager.INVALID_PORT_INDEX);
+
+        SubscriptionInfo oppSubInfo3 = new SubscriptionInfo(8, "", 1, "TMO", "TMO", 1, 1,
+                "012", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, TelephonyManager.INVALID_PORT_INDEX);
+
+        opportunisticInfoList.add(opportunisticSubInfo1);
+        opportunisticInfoList.add(opportunisticSubInfo2);
+        opportunisticInfoList.add(oppSubInfo3);
+        activeSubscriptionInfoList.add(opportunisticSubInfo1);
+        activeSubscriptionInfoList.add(primarySubInfo);
+
+        doReturn(opportunisticInfoList).when(mSubscriptionManager)
+                .getOpportunisticSubscriptions();
+        doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                .getCompleteActiveSubscriptionInfoList();
+
+        mONSProfileSelector = new MyONSProfileSelector(mContext, null);
+        int portIdx = mONSProfileSelector.getAvailableESIMPortIndex();
+        assertEquals(1, portIdx);
+    }
+
+    @Test
+    public void testAvailablePortWhenOnlyInactiveSubscriptions() {
+        /**
+         * 1 - Primary inactive subscription and
+         * 2 - Inactive opportunistic subscriptions
+         */
+
+        List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
+        List<SubscriptionInfo> opportunisticInfoList = new ArrayList<SubscriptionInfo>();
+
+        SubscriptionInfo oppSubInfo1 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+                "123", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, TelephonyManager.INVALID_PORT_INDEX);
+
+        // Not used in activeSubscriptionInfoList or opportunisticInfoList
+        /*SubscriptionInfo primarySubInfo = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
+                "456", 1, null, "310", "211", "", true, null, "1", 1, false, null, false, 1839, 1,
+                1, null, null, false, 2);*/
+
+        SubscriptionInfo oppSubInfo2 = new SubscriptionInfo(7, "", 1, "TMO", "TMO", 1, 1,
+                "789", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, TelephonyManager.INVALID_PORT_INDEX);
+
+        opportunisticInfoList.add(oppSubInfo1);
+        opportunisticInfoList.add(oppSubInfo2);
+
+        doReturn(opportunisticInfoList).when(mSubscriptionManager)
+                .getOpportunisticSubscriptions();
+        doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                .getCompleteActiveSubscriptionInfoList();
+
+        UiccPortInfo uiccPortInfo1 = new UiccPortInfo("", 0, 0, false);
+        UiccPortInfo uiccPortInfo2 = new UiccPortInfo("", 1, 0, false);
+        ArrayList<UiccPortInfo> uiccPortInfoList = new ArrayList<>();
+        uiccPortInfoList.add(uiccPortInfo1);
+        uiccPortInfoList.add(uiccPortInfo2);
+
+        UiccCardInfo uiccCardInfo = new UiccCardInfo(true, 1, "", 0, false, true, uiccPortInfoList);
+        ArrayList<UiccCardInfo> uiccCardInfoList = new ArrayList<>();
+        uiccCardInfoList.add(uiccCardInfo);
+
+        doReturn(uiccCardInfoList).when(mMockTelephonyManager).getUiccCardsInfo();
+        doReturn(mMockEuiccManager).when(mMockEuiccManager).createForCardId(1);
+        doReturn(true).when(mMockEuiccManager).isSimPortAvailable(0);
+        doReturn(true).when(mMockEuiccManager).isSimPortAvailable(1);
+
+        mONSProfileSelector = new MyONSProfileSelector(mContext, null);
+        mONSProfileSelector.mTelephonyManager = mMockTelephonyManager;
+        mONSProfileSelector.mEuiccManager = mMockEuiccManager;
+
+        int portIdx = mONSProfileSelector.getAvailableESIMPortIndex();
+        assertTrue(portIdx == 0 || portIdx == 1);
     }
 
     @Test
