diff --git a/Android.bp b/Android.bp
index fe7c040..297565e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -19,7 +19,10 @@
     name: "ONS",
     platform_apis: true,
     privileged: true,
-    libs: ["telephony-common"],
+    libs: [
+        "telephony-common",
+        "app-compat-annotations",
+    ],
     srcs: ["src/**/*.java"],
     aaptflags: ["--auto-add-overlay"],
     certificate: "platform",
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b1163dd..dfee080 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -35,7 +35,7 @@
 
         <service android:name=".OpportunisticNetworkService"
                  android:enabled="true"
-                 android:exported="true"
+                 android:exported="false"
                  android:directBootAware="true"
                  android:singleUser="true" />
 
diff --git a/CleanSpec.mk b/CleanSpec.mk
index fbabcab..c21bc41 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -48,6 +48,7 @@
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/ANS_intermediates)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/ANS)
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/ANS_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/ONSLib)
 
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
diff --git a/src/com/android/ons/ONSProfileSelector.java b/src/com/android/ons/ONSProfileSelector.java
index 7266660..3e903c9 100644
--- a/src/com/android/ons/ONSProfileSelector.java
+++ b/src/com/android/ons/ONSProfileSelector.java
@@ -28,13 +28,13 @@
 import android.os.HandlerThread;
 import android.os.Message;
 import android.os.RemoteException;
-import android.os.ServiceManager;
 import android.telephony.AvailableNetworkInfo;
 import android.telephony.CellInfo;
 import android.telephony.CellInfoLte;
 import android.telephony.SignalStrength;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
@@ -148,7 +148,8 @@
                                                     .UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS);
                                 } else {
                                     if (Compatibility.isChangeEnabled(
-                                            TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                                            OpportunisticNetworkService
+                                                    .CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                                         sendUpdateNetworksCallbackHelper(mNetworkScanCallback,
                                                 TelephonyManager
                                                         .UPDATE_AVAILABLE_NETWORKS_SERVICE_IS_DISABLED);
@@ -172,7 +173,8 @@
                                 TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SUCCESS);
                         } else {
                             if (Compatibility.isChangeEnabled(
-                                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                                    OpportunisticNetworkService
+                                            .CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                                 sendUpdateNetworksCallbackHelper(mNetworkScanCallback,
                                         TelephonyManager
                                                 .UPDATE_AVAILABLE_NETWORKS_ENABLE_MODEM_FAIL);
@@ -294,7 +296,6 @@
                 }
             }
         }
-
         return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
     }
 
@@ -379,7 +380,7 @@
                 TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SUCCESS);
         } else {
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 sendUpdateNetworksCallbackHelper(mNetworkScanCallback,
                         TelephonyManager.UPDATE_AVAILABLE_NETWORKS_ENABLE_MODEM_FAIL);
             } else {
@@ -484,7 +485,7 @@
         if (mOppSubscriptionInfos == null) {
             logDebug("null subscription infos");
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 sendUpdateNetworksCallbackHelper(callbackStub,
                         TelephonyManager.UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE);
             } else {
@@ -538,14 +539,13 @@
                             TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SUCCESS);
                     } else {
                         if (Compatibility.isChangeEnabled(
-                                TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                                OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                             sendUpdateNetworksCallbackHelper(callbackStub,
                                     TelephonyManager.UPDATE_AVAILABLE_NETWORKS_ENABLE_MODEM_FAIL);
                         } else {
                             sendUpdateNetworksCallbackHelper(callbackStub,
                                     TelephonyManager.UPDATE_AVAILABLE_NETWORKS_ABORTED);
                         }
-
                     }
                     mProfileSelectionCallback.onProfileSelectionDone();
                     mAvailableNetworkInfos = null;
@@ -557,7 +557,7 @@
             }
         } else if (mOppSubscriptionInfos.size() == 0) {
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 sendUpdateNetworksCallbackHelper(callbackStub,
                         TelephonyManager.UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE);
             } else {
@@ -647,7 +647,7 @@
         int subId = getActiveOpportunisticSubId();
         if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 sendUpdateNetworksCallbackHelper(callbackStub,
                         TelephonyManager.UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE);
             } else {
@@ -661,7 +661,7 @@
                 TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SUCCESS);
         } else {
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 sendUpdateNetworksCallbackHelper(callbackStub,
                         TelephonyManager.UPDATE_AVAILABLE_NETWORKS_DISABLE_MODEM_FAIL);
             } else {
@@ -672,7 +672,9 @@
     }
 
     private boolean enableModem(int subId, boolean enable) {
-        if (!mSubscriptionManager.isActiveSubId(subId)) {
+        SubscriptionInfo info = mSubscriptionManager.getActiveSubscriptionInfo(subId);
+        if (info == null) {
+            // Subscription is not active. Do nothing.
             return false;
         }
 
@@ -682,7 +684,7 @@
                 selectProfileForData(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, false, null);
             }
         }
-        int phoneId = SubscriptionManager.getPhoneId(subId);
+        int phoneId = info.getSimSlotIndex();
         /*  Todo: b/135067156
          *  Reenable this code once 135067156 is fixed
         if (mSubscriptionBoundTelephonyManager.isModemEnabledForSlot(phoneId) == enable) {
@@ -800,11 +802,15 @@
             ISetOpportunisticDataCallback callbackStub) {
         if ((subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)
                 || (isOpprotunisticSub(subId) && mSubscriptionManager.isActiveSubId(subId))) {
-            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
+            ISub iSub = ISub.Stub.asInterface(
+                    TelephonyFrameworkInitializer
+                            .getTelephonyServiceManager()
+                            .getSubscriptionServiceRegisterer()
+                            .get());
             if (iSub == null) {
                 log("Could not get Subscription Service handle");
                 if (Compatibility.isChangeEnabled(
-                        TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                        OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                     sendSetOpptCallbackHelper(callbackStub,
                             TelephonyManager.SET_OPPORTUNISTIC_SUB_REMOTE_SERVICE_EXCEPTION);
                 } else {
@@ -818,7 +824,7 @@
             } catch (RemoteException ex) {
                 log("Could not connect to Subscription Service");
                 if (Compatibility.isChangeEnabled(
-                        TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                        OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                     sendSetOpptCallbackHelper(callbackStub,
                             TelephonyManager.SET_OPPORTUNISTIC_SUB_REMOTE_SERVICE_EXCEPTION);
                 } else {
@@ -831,7 +837,7 @@
         } else {
             log("Inactive sub passed for preferred data " + subId);
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 if (isOpprotunisticSub(subId)) {
                     sendSetOpptCallbackHelper(callbackStub,
                             TelephonyManager.SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION);
@@ -863,9 +869,14 @@
     protected void updateOpportunisticSubscriptions() {
         synchronized (mLock) {
             mOppSubscriptionInfos = mSubscriptionManager
-                .getOpportunisticSubscriptions().stream()
-                .filter(subInfo -> subInfo.isGroupDisabled() != true)
-                .collect(Collectors.toList());
+                    .getOpportunisticSubscriptions().stream()
+                    .filter(subInfo -> subInfo.isGroupDisabled() != true)
+                    .collect(Collectors.toList());
+            if (mOppSubscriptionInfos != null) {
+                mStandaloneOppSubInfos = mOppSubscriptionInfos.stream()
+                        .filter(subInfo -> subInfo.getGroupUuid() == null)
+                        .collect(Collectors.toList());
+            }
         }
     }
 
diff --git a/src/com/android/ons/OpportunisticNetworkService.java b/src/com/android/ons/OpportunisticNetworkService.java
index 62e292b..1178538 100644
--- a/src/com/android/ons/OpportunisticNetworkService.java
+++ b/src/com/android/ons/OpportunisticNetworkService.java
@@ -18,6 +18,8 @@
 
 import android.app.Service;
 import android.compat.Compatibility;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledAfter;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -25,14 +27,16 @@
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.os.Binder;
+import android.os.Build;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.RemoteException;
-import android.os.ServiceManager;
+import android.os.TelephonyServiceManager.ServiceRegisterer;
 import android.telephony.AvailableNetworkInfo;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.TelephonyManager;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -66,7 +70,6 @@
     private static final String TAG = "ONS";
     private static final String PREF_NAME = TAG;
     private static final String PREF_ENABLED = "isEnabled";
-    private static final String SERVICE_NAME = "ions";
     private static final String CARRIER_APP_CONFIG_NAME = "carrierApp";
     private static final String SYSTEM_APP_CONFIG_NAME = "systemApp";
     private static final boolean DBG = true;
@@ -74,6 +77,14 @@
     private static final int MSG_SIM_STATE_CHANGE = 1;
 
     /**
+     * To expand the error codes for {@link TelephonyManager#updateAvailableNetworks} and
+     * {@link TelephonyManager#setPreferredOpportunisticDataSubscription}.
+     */
+    @ChangeId
+    @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q)
+    static final long CALLBACK_ON_MORE_ERROR_CODE_CHANGE = 130595455L;
+
+    /**
      * Profile selection callback. Will be called once Profile selector decides on
      * the opportunistic data profile.
      */
@@ -325,8 +336,11 @@
         initialize(getBaseContext());
 
         /* register the service */
-        if (ServiceManager.getService(SERVICE_NAME) == null) {
-            ServiceManager.addService(SERVICE_NAME, mBinder);
+        ServiceRegisterer opportunisticNetworkServiceRegisterer = TelephonyFrameworkInitializer
+                .getTelephonyServiceManager()
+                .getOpportunisticNetworkServiceRegisterer();
+        if (opportunisticNetworkServiceRegisterer.get() == null) {
+            opportunisticNetworkServiceRegisterer.register(mBinder);
         }
     }
 
@@ -388,8 +402,7 @@
             /* carrier apps should report only subscription */
             if (availableNetworks.size() > 1) {
                 log("Carrier app should not pass more than one subscription");
-                if (Compatibility.isChangeEnabled(
-                        TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                     sendUpdateNetworksCallbackHelper(callbackStub,
                             TelephonyManager
                                     .UPDATE_AVAILABLE_NETWORKS_MULTIPLE_NETWORKS_NOT_SUPPORTED);
@@ -402,8 +415,7 @@
 
             if (!mProfileSelector.hasOpprotunisticSub(availableNetworks)) {
                 log("No opportunistic subscriptions received");
-                if (Compatibility.isChangeEnabled(
-                        TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                     sendUpdateNetworksCallbackHelper(callbackStub,
                             TelephonyManager
                                     .UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE);
@@ -415,9 +427,15 @@
             }
 
             for (AvailableNetworkInfo availableNetworkInfo : availableNetworks) {
-                if (Binder.withCleanCallingIdentity(
-                            () -> mSubscriptionManager.isActiveSubId(
-                                    availableNetworkInfo.getSubId()))) {
+                final long identity = Binder.clearCallingIdentity();
+                boolean isActiveSubId = false;
+                try {
+                    isActiveSubId =
+                            mSubscriptionManager.isActiveSubId(availableNetworkInfo.getSubId());
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+                if (isActiveSubId) {
                     TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(mContext,
                         availableNetworkInfo.getSubId(), "updateAvailableNetworks");
                 } else {
@@ -454,8 +472,7 @@
                     /*  if carrier is reporting availability, then it takes higher priority. */
                     mProfileSelector.startProfileSelection(availableNetworks, callbackStub);
                 } else {
-                    if (Compatibility.isChangeEnabled(
-                            TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                         sendUpdateNetworksCallbackHelper(callbackStub,
                                 TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SERVICE_IS_DISABLED);
                     } else {
@@ -521,8 +538,7 @@
                 /* all subscriptions should be opportunistic subscriptions */
                 if (!mProfileSelector.hasOpprotunisticSub(availableNetworks)) {
                     log("No opportunistic subscriptions received");
-                    if (Compatibility.isChangeEnabled(
-                            TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                         sendUpdateNetworksCallbackHelper(callbackStub,
                                 TelephonyManager
                                         .UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE);
@@ -534,7 +550,6 @@
                 }
                 mONSConfigInputHashMap.put(SYSTEM_APP_CONFIG_NAME,
                         new ONSConfigInput(availableNetworks, callbackStub));
-
                 /* reporting availability. proceed if carrier app has not requested any, but
                    standalone opportunistic subscription should be handled in priority. */
                 if (mIsEnabled) {
@@ -543,8 +558,7 @@
                         mProfileSelector.startProfileSelection(availableNetworks, callbackStub);
                     }
                 } else {
-                    if (Compatibility.isChangeEnabled(
-                            TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                         sendUpdateNetworksCallbackHelper(callbackStub,
                                 TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SERVICE_IS_DISABLED);
                     } else {
diff --git a/tests/src/com/android/ons/ONSProfileSelectorTest.java b/tests/src/com/android/ons/ONSProfileSelectorTest.java
index 4816ec6..e86726a 100644
--- a/tests/src/com/android/ons/ONSProfileSelectorTest.java
+++ b/tests/src/com/android/ons/ONSProfileSelectorTest.java
@@ -20,7 +20,9 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.os.IBinder;
 import android.os.Looper;
+import android.os.ServiceManager;
 import android.telephony.AvailableNetworkInfo;
 import android.telephony.CellIdentityLte;
 import android.telephony.CellInfo;
@@ -30,6 +32,7 @@
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
+import com.android.internal.telephony.ISub;
 import com.android.internal.telephony.IUpdateAvailableNetworksCallback;
 
 import org.junit.After;
@@ -38,8 +41,10 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 public class ONSProfileSelectorTest extends ONSBaseTest {
 
@@ -52,6 +57,12 @@
     ONSNetworkScanCtlr mONSNetworkScanCtlr;
     @Mock
     TelephonyManager mSubscriptionBoundTelephonyManager;
+    @Mock
+    ISub mISubMock;
+    @Mock
+    IBinder mISubBinderMock;
+    @Mock
+    SubscriptionInfo mSubInfo;
     private Looper mLooper;
     private static final String TAG = "ONSProfileSelectorTest";
 
@@ -103,15 +114,30 @@
         }
     }
 
+    private void addISubService() throws Exception {
+        Field field = ServiceManager.class.getDeclaredField("sCache");
+        field.setAccessible(true);
+        ((Map<String, IBinder>)field.get(null)).put("isub", mISubBinderMock);
+        doReturn(mISubMock).when(mISubBinderMock).queryLocalInterface(any());
+    }
+
+    private void removeISubService() throws Exception {
+        Field field = ServiceManager.class.getDeclaredField("sCache");
+        field.setAccessible(true);
+        ((Map<String, IBinder>)field.get(null)).remove("isub");
+    }
+
     @Before
     public void setUp() throws Exception {
         super.setUp("ONSTest");
         mLooper = null;
         MockitoAnnotations.initMocks(this);
+        addISubService();
     }
 
     @After
     public void tearDown() throws Exception {
+        removeISubService();
         super.tearDown();
         if (mLooper != null) {
             mLooper.quit();
@@ -174,15 +200,16 @@
         assertFalse(mCallbackInvoked);
     }
 
-
     @Test
     public void testStartProfileSelectionSuccess() {
+        int subId = 5;
         List<SubscriptionInfo> subscriptionInfoList = new ArrayList<SubscriptionInfo>();
-        SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+        SubscriptionInfo subscriptionInfo = new SubscriptionInfo(subId, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "210", "", false, null, "1");
         SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "211", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(subId);
 
         List<CellInfo> results2 = new ArrayList<CellInfo>();
         CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1);
@@ -191,7 +218,7 @@
         results2.add((CellInfo) cellInfoLte);
         ArrayList<String> mccMncs = new ArrayList<>();
         mccMncs.add("310210");
-        AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(1, 1, mccMncs,
+        AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(subId, 1, mccMncs,
             new ArrayList<Integer>());
         ArrayList<AvailableNetworkInfo> availableNetworkInfos = new ArrayList<AvailableNetworkInfo>();
         availableNetworkInfos.add(availableNetworkInfo);
@@ -211,7 +238,7 @@
                 Looper.prepare();
                 doReturn(subscriptionInfoList).when(mSubscriptionManager)
                     .getOpportunisticSubscriptions();
-                doReturn(true).when(mSubscriptionManager).isActiveSubId(anyInt());
+                doReturn(true).when(mSubscriptionManager).isActiveSubId(subId);
                 doReturn(true).when(mSubscriptionBoundTelephonyManager).enableModemForSlot(
                     anyInt(), anyBoolean());
                 mONSProfileSelector = new MyONSProfileSelector(mContext,
@@ -240,7 +267,7 @@
         mONSProfileSelector.mNetworkAvailableCallBackCpy.onNetworkAvailability(results2);
         Intent callbackIntent = new Intent(MyONSProfileSelector.ACTION_SUB_SWITCH);
         callbackIntent.putExtra("sequenceId", 1);
-        callbackIntent.putExtra("subId", 5);
+        callbackIntent.putExtra("subId", subId);
         waitUntilReady();
         assertEquals(TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SUCCESS, mResult);
         assertTrue(mReady);
@@ -258,6 +285,8 @@
         SubscriptionInfo subscriptionInfo_2 = new SubscriptionInfo(8, "", 1, "Vzw", "Vzw", 1, 1,
                 "123", 1, null, "311", "480", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo_2);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
+        doReturn(subscriptionInfo_2).when(mSubscriptionManager).getActiveSubscriptionInfo(8);
 
         List<CellInfo> results2 = new ArrayList<CellInfo>();
         CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1);
@@ -331,6 +360,8 @@
             "123", 1, null, "310", "211", "", true, null, "1", false, null, 1839, 1);
         opportunisticSubscriptionInfoList.add(subscriptionInfo);
         activeSubscriptionInfoList.add(subscriptionInfo2);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
+        doReturn(subscriptionInfo2).when(mSubscriptionManager).getActiveSubscriptionInfo(6);
 
         ArrayList<String> mccMncs = new ArrayList<>();
         mccMncs.add("310210");
@@ -428,6 +459,7 @@
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "210", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
         mReady = false;
         doReturn(new ArrayList<>()).when(mSubscriptionManager).getOpportunisticSubscriptions();
         new Thread(new Runnable() {
@@ -458,6 +490,7 @@
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "210", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
         mReady = false;
         doReturn(subscriptionInfoList).when(mSubscriptionManager).getOpportunisticSubscriptions();
         doNothing().when(mSubscriptionManager).setPreferredDataSubscriptionId(
@@ -492,6 +525,7 @@
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "210", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
         mReady = false;
         doReturn(subscriptionInfoList).when(mSubscriptionManager)
             .getActiveSubscriptionInfoList();
@@ -528,9 +562,11 @@
         List<SubscriptionInfo> subscriptionInfoList = new ArrayList<SubscriptionInfo>();
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "210", "", false, null, "1");
-        SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+        SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "211", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
+        doReturn(subscriptionInfo2).when(mSubscriptionManager).getActiveSubscriptionInfo(6);
 
         List<CellInfo> results2 = new ArrayList<CellInfo>();
         CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1);
@@ -539,7 +575,7 @@
         results2.add((CellInfo) cellInfoLte);
         ArrayList<String> mccMncs = new ArrayList<>();
         mccMncs.add("310210");
-        AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(1, 1, mccMncs,
+        AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(5, 1, mccMncs,
             new ArrayList<Integer>());
         ArrayList<AvailableNetworkInfo> availableNetworkInfos = new ArrayList<AvailableNetworkInfo>();
         availableNetworkInfos.add(availableNetworkInfo);
@@ -634,6 +670,7 @@
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
                 "123", 1, null, "310", "210", "", true, null, "1", true, null, 0, 0);
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
 
         IUpdateAvailableNetworksCallback mCallback = new IUpdateAvailableNetworksCallback.Stub() {
             @Override
@@ -673,7 +710,7 @@
         }).start();
         waitUntilReady();
         waitForMs(500);
-        assertEquals(mONSProfileSelector.getCurrentPreferredData(), SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        assertEquals(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, mONSProfileSelector.getCurrentPreferredData());
     }
 
     @Test
@@ -682,6 +719,7 @@
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
                 "123", 1, null, "310", "210", "", true, null, "1", true, null, 0, 0);
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
 
         IUpdateAvailableNetworksCallback mCallback = new IUpdateAvailableNetworksCallback.Stub() {
             @Override
@@ -723,5 +761,4 @@
         waitForMs(500);
         assertEquals(mONSProfileSelector.getCurrentPreferredData(), 5);
     }
-
 }
diff --git a/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java b/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java
index 05a7f17..0a75371 100644
--- a/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java
+++ b/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java
@@ -15,6 +15,7 @@
  */
 package com.android.ons;
 
+import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
@@ -23,13 +24,15 @@
 import android.content.Intent;
 import android.os.Looper;
 import android.os.RemoteException;
-import android.os.ServiceManager;
 import android.telephony.AvailableNetworkInfo;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
+import androidx.test.runner.AndroidJUnit4;
+
 import com.android.internal.telephony.IOns;
 import com.android.internal.telephony.ISetOpportunisticDataCallback;
 import com.android.internal.telephony.IUpdateAvailableNetworksCallback;
@@ -39,13 +42,10 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import static org.mockito.Mockito.any;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 
-import androidx.test.runner.AndroidJUnit4;
-
 @RunWith(AndroidJUnit4.class)
 public class OpportunisticNetworkServiceTest extends ONSBaseTest {
     private static final String TAG = "ONSTest";
@@ -67,30 +67,22 @@
     public void setUp() throws Exception {
         super.setUp("ONSTest");
         pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
-        pkgForFeature = null;
+        pkgForFeature = mContext != null ? mContext.getAttributionTag() : null;
         Intent intent = new Intent(mContext, OpportunisticNetworkService.class);
         new Thread(new Runnable() {
             @Override
             public void run() {
                 Looper.prepare();
                 mOpportunisticNetworkService = new OpportunisticNetworkService();
-                mContext.startService(intent);
                 mOpportunisticNetworkService.initialize(mContext);
-                mOpportunisticNetworkService.mContext = mContext;
                 mOpportunisticNetworkService.mSubscriptionManager = mSubscriptionManager;
+                iOpportunisticNetworkService = (IOns) mOpportunisticNetworkService.onBind(null);
                 mLooper = Looper.myLooper();
+                setReady(true);
                 Looper.loop();
             }
         }).start();
-        iOpportunisticNetworkService = getIOns();
-        for (int i = 0; i < 5; i++) {
-            if (iOpportunisticNetworkService == null) {
-                waitForMs(500);
-                iOpportunisticNetworkService = getIOns();
-            } else {
-                break;
-            }
-        }
+        waitUntilReady(200);
     }
 
     @After
@@ -359,7 +351,11 @@
     }
 
     private IOns getIOns() {
-        return IOns.Stub.asInterface(ServiceManager.getService("ions"));
+        return IOns.Stub.asInterface(
+                TelephonyFrameworkInitializer
+                        .getTelephonyServiceManager()
+                        .getOpportunisticNetworkServiceRegisterer()
+                        .get());
     }
 
     public static void waitForMs(long ms) {
