diff --git a/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java b/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
index fb4025d..37a4ae5 100755
--- a/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
@@ -160,9 +160,10 @@
         updatePhoneType(false);
     }
 
-    private void updatePhoneType(boolean init) {
-        if (!init) {
+    private void updatePhoneType(boolean duringInit) {
+        if (!duringInit) {
             reset();
+            pollCallsWhenSafe();
         }
         if (mPhone.isPhoneTypeGsm()) {
             mConnections = new GsmCdmaConnection[MAX_CONNECTIONS_GSM];
diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
index a23cddb..173f25e 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
@@ -266,8 +266,6 @@
     private void initRatSpecific(int precisePhoneType) {
         mPendingMMIs.clear();
         mIccPhoneBookIntManager.updateIccRecords(null);
-        //todo: maybe not needed?? should the count also be updated on sim_state_absent?
-        mVmCount = 0;
         mEsn = null;
         mMeid = null;
 
diff --git a/src/java/com/android/internal/telephony/InboundSmsHandler.java b/src/java/com/android/internal/telephony/InboundSmsHandler.java
index 607f01d..ac3beb2 100644
--- a/src/java/com/android/internal/telephony/InboundSmsHandler.java
+++ b/src/java/com/android/internal/telephony/InboundSmsHandler.java
@@ -789,12 +789,12 @@
             return false;
         }
 
-        if (!mUserManager.isUserUnlocked()) {
-            return processMessagePartWithUserLocked(tracker, pdus, destPort);
-        }
-
         SmsBroadcastReceiver resultReceiver = new SmsBroadcastReceiver(tracker);
 
+        if (!mUserManager.isUserUnlocked()) {
+            return processMessagePartWithUserLocked(tracker, pdus, destPort, resultReceiver);
+        }
+
         if (destPort == SmsHeader.PORT_WAP_PUSH) {
             // Build up the data stream
             ByteArrayOutputStream output = new ByteArrayOutputStream();
@@ -849,7 +849,7 @@
      * @return true if an ordered broadcast was sent to the carrier app; false otherwise.
      */
     private boolean processMessagePartWithUserLocked(InboundSmsTracker tracker,
-            byte[][] pdus, int destPort) {
+            byte[][] pdus, int destPort, SmsBroadcastReceiver resultReceiver) {
         log("Credential-encrypted storage not available. Port: " + destPort);
         if (destPort == SmsHeader.PORT_WAP_PUSH && mWapPush.isWapPushForMms(pdus[0], this)) {
             showNewMessageNotification();
@@ -858,7 +858,7 @@
         if (destPort == -1) {
             // This is a regular SMS - hand it to the carrier or system app for filtering.
             boolean filterInvoked = filterSms(
-                pdus, destPort, tracker, null, false /* userUnlocked */);
+                pdus, destPort, tracker, resultReceiver, false /* userUnlocked */);
             if (filterInvoked) {
                 // filter invoked, wait for it to return the result.
                 return true;
@@ -929,19 +929,34 @@
         } else {
             loge("UiccCard not initialized.");
         }
-        List<String> systemPackages =
-            getSystemAppForIntent(new Intent(CarrierMessagingService.SERVICE_INTERFACE));
 
         if (carrierPackages != null && carrierPackages.size() == 1) {
             log("Found carrier package.");
             CarrierSmsFilter smsFilter = new CarrierSmsFilter(pdus, destPort,
                     tracker.getFormat(), resultReceiver);
             CarrierSmsFilterCallback smsFilterCallback = new CarrierSmsFilterCallback(smsFilter,
-                    userUnlocked, true /* filterWithVvm */);
+                    userUnlocked);
             smsFilter.filterSms(carrierPackages.get(0), smsFilterCallback);
             return true;
         }
 
+        // It is possible that carrier app is not present as a CarrierPackage, but instead as a
+        // system app
+        List<String> systemPackages =
+                getSystemAppForIntent(new Intent(CarrierMessagingService.SERVICE_INTERFACE));
+
+        if (systemPackages != null && systemPackages.size() == 1) {
+            log("Found system package.");
+            CarrierSmsFilter smsFilter = new CarrierSmsFilter(pdus, destPort,
+                    tracker.getFormat(), resultReceiver);
+            CarrierSmsFilterCallback smsFilterCallback = new CarrierSmsFilterCallback(smsFilter,
+                    userUnlocked);
+            smsFilter.filterSms(systemPackages.get(0), smsFilterCallback);
+            return true;
+        }
+        logv("Unable to find carrier package: " + carrierPackages
+                + ", nor systemPackages: " + systemPackages);
+
         if (VisualVoicemailSmsFilter.filter(
                 mContext, pdus, tracker.getFormat(), destPort, mPhone.getSubId())) {
             log("Visual voicemail SMS dropped");
@@ -949,17 +964,6 @@
             return true;
         }
 
-        if (systemPackages != null && systemPackages.size() == 1) {
-            log("Found system package.");
-            CarrierSmsFilter smsFilter = new CarrierSmsFilter(pdus, destPort,
-                    tracker.getFormat(), resultReceiver);
-            CarrierSmsFilterCallback smsFilterCallback = new CarrierSmsFilterCallback(smsFilter,
-                    userUnlocked, false);
-            smsFilter.filterSms(systemPackages.get(0), smsFilterCallback);
-            return true;
-        }
-        logv("Unable to find carrier package: " + carrierPackages
-                + ", nor systemPackages: " + systemPackages);
         return false;
     }
 
@@ -1387,13 +1391,10 @@
     private final class CarrierSmsFilterCallback extends ICarrierMessagingCallback.Stub {
         private final CarrierSmsFilter mSmsFilter;
         private final boolean mUserUnlocked;
-        private final boolean mFilterWithVvm;
 
-        CarrierSmsFilterCallback(CarrierSmsFilter smsFilter, boolean userUnlocked,
-                boolean filterWithVvm) {
+        CarrierSmsFilterCallback(CarrierSmsFilter smsFilter, boolean userUnlocked) {
             mSmsFilter = smsFilter;
             mUserUnlocked = userUnlocked;
-            mFilterWithVvm = filterWithVvm;
         }
 
         /**
@@ -1408,13 +1409,11 @@
             try {
                 logv("onFilterComplete: result is " + result);
                 if ((result & CarrierMessagingService.RECEIVE_OPTIONS_DROP) == 0) {
-                    if (mFilterWithVvm) {
-                        if (VisualVoicemailSmsFilter.filter(mContext, mSmsFilter.mPdus,
-                                mSmsFilter.mSmsFormat, mSmsFilter.mDestPort, mPhone.getSubId())) {
-                            log("Visual voicemail SMS dropped");
-                            dropSms(mSmsFilter.mSmsBroadcastReceiver);
-                            return;
-                        }
+                    if (VisualVoicemailSmsFilter.filter(mContext, mSmsFilter.mPdus,
+                            mSmsFilter.mSmsFormat, mSmsFilter.mDestPort, mPhone.getSubId())) {
+                        log("Visual voicemail SMS dropped");
+                        dropSms(mSmsFilter.mSmsBroadcastReceiver);
+                        return;
                     }
 
                     if (mUserUnlocked) {
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index 0196bdd..195eedd 100644
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -636,6 +636,7 @@
     public boolean getDesiredPowerState() {
         return mDesiredPowerState;
     }
+    public boolean getPowerStateFromCarrier() { return !mRadioDisabledByCarrier; }
 
     private SignalStrength mLastSignalStrength = null;
     protected boolean notifySignalStrength() {
@@ -808,7 +809,7 @@
      */
     public void setRadioPowerFromCarrier(boolean enable) {
         mRadioDisabledByCarrier = !enable;
-        setRadioPower(enable);
+        setPowerStateToDesired();
     }
 
     /**
@@ -2291,11 +2292,10 @@
         }
 
         // If we want it on and it's off, turn it on
-        if (mDesiredPowerState
-                && mCi.getRadioState() == CommandsInterface.RadioState.RADIO_OFF &&
-                !mRadioDisabledByCarrier) {
+        if (mDesiredPowerState && !mRadioDisabledByCarrier
+                && mCi.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
             mCi.setRadioPower(true, null);
-        } else if (!mDesiredPowerState && mCi.getRadioState().isOn()) {
+        } else if ((!mDesiredPowerState || mRadioDisabledByCarrier) && mCi.getRadioState().isOn()) {
             // If it's on and available and we want it off gracefully
             if (mPhone.isPhoneTypeGsm() && mPowerOffDelayNeed) {
                 if (mImsRegistrationOnOff && !mAlarmSwitch) {
diff --git a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
index 8ba3b34..9821733 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
@@ -208,7 +208,8 @@
         PS_RESTRICTED(" - mIsPsRestricted= true"),
         UNDESIRED_POWER_STATE(" - desiredPowerState= false"),
         INTERNAL_DATA_DISABLED(" - mInternalDataEnabled= false"),
-        DEFAULT_DATA_UNSELECTED(" - defaultDataSelected= false");
+        DEFAULT_DATA_UNSELECTED(" - defaultDataSelected= false"),
+        RADIO_DISABLED_BY_CARRIER(" - powerStateFromCarrier= false");
 
         public String mFailReasonStr;
 
@@ -1369,9 +1370,11 @@
 
         boolean attachedState = mAttached.get();
         boolean desiredPowerState = mPhone.getServiceStateTracker().getDesiredPowerState();
+        boolean radioStateFromCarrier = mPhone.getServiceStateTracker().getPowerStateFromCarrier();
         int radioTech = mPhone.getServiceState().getRilDataRadioTechnology();
         if (radioTech == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN) {
             desiredPowerState = true;
+            radioStateFromCarrier = true;
         }
 
         IccRecords r = mIccRecords.get();
@@ -1433,6 +1436,10 @@
             if(failureReason == null) return false;
             failureReason.addDataAllowFailReason(DataAllowFailReasonType.UNDESIRED_POWER_STATE);
         }
+        if (!radioStateFromCarrier) {
+            if(failureReason == null) return false;
+            failureReason.addDataAllowFailReason(DataAllowFailReasonType.RADIO_DISABLED_BY_CARRIER);
+        }
 
         return failureReason == null || !failureReason.isFailed();
     }
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsExternalConnection.java b/src/java/com/android/internal/telephony/imsphone/ImsExternalConnection.java
index d0b9ece..071aebb 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsExternalConnection.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsExternalConnection.java
@@ -16,6 +16,7 @@
 
 package com.android.internal.telephony.imsphone;
 
+import com.android.internal.R;
 import com.android.internal.telephony.Call;
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection;
@@ -23,7 +24,9 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.UUSInfo;
 
+import android.content.Context;
 import android.net.Uri;
+import android.telecom.PhoneAccount;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.Rlog;
 import android.util.Log;
@@ -45,6 +48,9 @@
  */
 public class ImsExternalConnection extends Connection {
 
+    private static final String CONFERENCE_PREFIX = "conf";
+    private final Context mContext;
+
     public interface Listener {
         void onPullExternalCall(ImsExternalConnection connection);
     }
@@ -79,6 +85,7 @@
 
     protected ImsExternalConnection(Phone phone, int callId, Uri address, boolean isPullable) {
         super(phone.getPhoneType());
+        mContext = phone.getContext();
         mCall = new ImsExternalCall(phone, this);
         mCallId = callId;
         setExternalConnectionAddress(address);
@@ -215,6 +222,15 @@
     public void setExternalConnectionAddress(Uri address) {
         mOriginalAddress = address;
 
+        if (PhoneAccount.SCHEME_SIP.equals(address.getScheme())) {
+            if (address.getSchemeSpecificPart().startsWith(CONFERENCE_PREFIX)) {
+                mCnapName = mContext.getString(com.android.internal.R.string.conference_call);
+                mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED;
+                mAddress = "";
+                mNumberPresentation = PhoneConstants.PRESENTATION_RESTRICTED;
+                return;
+            }
+        }
         Uri telUri = PhoneNumberUtils.convertSipUriToTelUri(address);
         mAddress = telUri.getSchemeSpecificPart();
     }
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
index 9a270c4..fd48279 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
@@ -1254,6 +1254,8 @@
                 return DisconnectCause.FDN_BLOCKED;
 
             case ImsReasonInfo.CODE_ANSWERED_ELSEWHERE:
+                return DisconnectCause.ANSWERED_ELSEWHERE;
+
             case ImsReasonInfo.CODE_CALL_END_CAUSE_CALL_PULL:
                 return DisconnectCause.CALL_PULLED;
             default:
@@ -1366,7 +1368,8 @@
                 mOnHoldToneStarted = false;
                 mOnHoldToneId = -1;
             }
-            if (conn != null && conn.isIncoming() && conn.getConnectTime() == 0) {
+            if (conn != null && conn.isIncoming() && conn.getConnectTime() == 0
+                    && cause != DisconnectCause.ANSWERED_ELSEWHERE) {
                 // Missed
                 if (cause == DisconnectCause.NORMAL) {
                     cause = DisconnectCause.INCOMING_MISSED;
@@ -2342,7 +2345,10 @@
         // eventually counted when next getVtDataUsage is called.
         if (mState != PhoneConstants.State.IDLE) {
             for (ImsPhoneConnection conn : mConnections) {
-                conn.getVideoProvider().onRequestConnectionDataUsage();
+                android.telecom.Connection.VideoProvider videoProvider = conn.getVideoProvider();
+                if (videoProvider != null) {
+                    videoProvider.onRequestConnectionDataUsage();
+                }
             }
         }
 
diff --git a/src/java/com/android/internal/telephony/test/SimulatedCommands.java b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
index 8fbc2a0..e44b1d8 100644
--- a/src/java/com/android/internal/telephony/test/SimulatedCommands.java
+++ b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
@@ -458,6 +458,7 @@
      */
     @Override
     public void getCurrentCalls (Message result) {
+        SimulatedCommandsVerifier.getInstance().getCurrentCalls(result);
         if ((mState == RadioState.RADIO_ON) && !isSimLocked()) {
             //Rlog.i("GSM", "[SimCmds] getCurrentCalls");
             resultSuccess(result, simulatedCallState.getDriverCalls());
diff --git a/src/java/com/android/internal/telephony/uicc/SIMRecords.java b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
index 57c9fe9..db29bc4 100644
--- a/src/java/com/android/internal/telephony/uicc/SIMRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
@@ -554,7 +554,9 @@
                 // Update dialNumber if not empty and CFU is enabled.
                 // Spec reference for EF_CFIS contents, TS 51.011 section 10.3.46.
                 if (enable && !TextUtils.isEmpty(dialNumber)) {
-                    log("EF_CFIS: updating cf number, " + dialNumber);
+                    if (VDBG) {
+                        logv("EF_CFIS: updating cf number, " + dialNumber);
+                    }
                     byte[] bcdNumber = PhoneNumberUtils.numberToCalledPartyBCD(dialNumber);
 
                     System.arraycopy(bcdNumber, 0, mEfCfis, CFIS_TON_NPI_OFFSET, bcdNumber.length);
@@ -1300,6 +1302,7 @@
             case EF_FDN:
                 if (DBG) log("SIM Refresh called for EF_FDN");
                 mParentApp.queryFdn();
+                mAdnCache.reset();
                 break;
             case EF_MSISDN:
                 mRecordsToLoad++;
diff --git a/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaCallTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaCallTrackerTest.java
index 202e463..29a56d1 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaCallTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaCallTrackerTest.java
@@ -16,13 +16,12 @@
 package com.android.internal.telephony;
 
 import android.os.HandlerThread;
-import android.os.SystemProperties;
 import android.telephony.DisconnectCause;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.ServiceState;
+import android.test.suitebuilder.annotation.MediumTest;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.internal.telephony.test.SimulatedCommandsVerifier;
 import android.os.Message;
 import org.junit.After;
 import org.junit.Assert;
@@ -32,9 +31,7 @@
 import org.mockito.ArgumentCaptor;
 import android.os.Handler;
 
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.doReturn;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.*;
@@ -127,7 +124,7 @@
     }
 
     @Test
-    @SmallTest
+    @MediumTest
     public void testMOCallHangup() {
         testMOCallDial();
         logd("Waiting for POLL CALL response from RIL ");
@@ -142,14 +139,14 @@
             ex.printStackTrace();
             Assert.fail("unexpected exception thrown" + ex.getMessage());
         }
-        waitForMs(200);
+        waitForMs(300);
         assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
         assertEquals(0, mCTUT.mForegroundCall.getConnections().size());
         assertEquals(PhoneConstants.State.IDLE, mCTUT.getState());
     }
 
     @Test
-    @SmallTest
+    @MediumTest
     public void testMOCallDialPickUpHangup() {
         testMOCallPickUp();
         assertEquals(GsmCdmaCall.State.ACTIVE, mCTUT.mForegroundCall.getState());
@@ -166,7 +163,7 @@
             Assert.fail("unexpected exception thrown" + ex.getMessage());
         }
         /* request send to RIL still in disconnecting state */
-        waitForMs(200);
+        waitForMs(300);
         assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
         assertEquals(0, mCTUT.mForegroundCall.getConnections().size());
         assertEquals(PhoneConstants.State.IDLE, mCTUT.getState());
@@ -175,7 +172,7 @@
     }
 
     @Test
-    @SmallTest
+    @MediumTest
     public void testMOCallPendingHangUp() {
         testMOCallDial();
         logd("MO call hangup before established[ getting result from RIL ]");
@@ -187,14 +184,14 @@
             ex.printStackTrace();
             Assert.fail("unexpected exception thrown" + ex.getMessage());
         }
-        waitForMs(200);
+        waitForMs(300);
         assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
         assertEquals(0, mCTUT.mForegroundCall.getConnections().size());
         assertEquals(PhoneConstants.State.IDLE, mCTUT.getState());
     }
 
     @Test
-    @SmallTest
+    @MediumTest
     public void testMOCallSwitch() {
         testMOCallPickUp();
         logd("MO call picked up, initiating a new MO call");
@@ -280,7 +277,7 @@
     }
 
     @Test
-    @SmallTest
+    @MediumTest
     public void testMOCallSwitchHangupForeGround() {
         testMOCallSwitch();
         logd("Hang up the foreground MO call while dialing ");
@@ -290,7 +287,7 @@
             ex.printStackTrace();
             Assert.fail("unexpected exception thrown" + ex.getMessage());
         }
-        waitForMs(200);
+        waitForMs(300);
         logd(" Foreground Call is IDLE and BackGround Call is still HOLDING ");
         /* if we want to hang up foreground call which is alerting state, hangup all */
         assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
@@ -298,7 +295,7 @@
     }
 
     @Test
-    @SmallTest
+    @MediumTest
     public void testMOCallPickUpHangUpResumeBackGround() {
         testMOCallSwitch();
         logd("Pick up the new MO Call");
@@ -321,7 +318,7 @@
             Assert.fail("unexpected exception thrown" + ex.getMessage());
         }
 
-        waitForMs(200);
+        waitForMs(300);
         logd(" BackGround Call switch to ForeGround Call ");
         assertEquals(GsmCdmaCall.State.ACTIVE, mCTUT.mForegroundCall.getState());
         assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mBackgroundCall.getState());
@@ -350,5 +347,17 @@
         verify(mHandler,times(1)).sendMessageAtTime(mCaptorMessage.capture(), mCaptorLong.capture());
         assertEquals(VOICE_CALL_ENDED_EVENT, mCaptorMessage.getValue().what);
     }
+
+    @Test @SmallTest
+    public void testUpdatePhoneType() {
+        // verify getCurrentCalls is called on init
+        verify(mSimulatedCommandsVerifier).getCurrentCalls(any(Message.class));
+
+        // update phone type
+        mCTUT.updatePhoneType();
+
+        // verify getCurrentCalls is called on updating phone type
+        verify(mSimulatedCommandsVerifier, times(2)).getCurrentCalls(any(Message.class));
+    }
 }
 
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
index 8b02a3d..eec6adb 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
@@ -153,6 +153,39 @@
 
     @Test
     @MediumTest
+    public void testSetRadioPowerFromCarrier() {
+        // Carrier disable radio power
+        sst.setRadioPowerFromCarrier(false);
+        waitForMs(100);
+        assertFalse(mSimulatedCommands.getRadioState().isOn());
+        assertTrue(sst.getDesiredPowerState());
+        assertFalse(sst.getPowerStateFromCarrier());
+
+        // User toggle radio power will not overrides carrier settings
+        sst.setRadioPower(true);
+        waitForMs(100);
+        assertFalse(mSimulatedCommands.getRadioState().isOn());
+        assertTrue(sst.getDesiredPowerState());
+        assertFalse(sst.getPowerStateFromCarrier());
+
+        // Carrier re-enable radio power
+        sst.setRadioPowerFromCarrier(true);
+        waitForMs(100);
+        assertTrue(mSimulatedCommands.getRadioState().isOn());
+        assertTrue(sst.getDesiredPowerState());
+        assertTrue(sst.getPowerStateFromCarrier());
+
+        // User toggle radio power off (airplane mode) and set carrier on
+        sst.setRadioPower(false);
+        sst.setRadioPowerFromCarrier(true);
+        waitForMs(100);
+        assertFalse(mSimulatedCommands.getRadioState().isOn());
+        assertFalse(sst.getDesiredPowerState());
+        assertTrue(sst.getPowerStateFromCarrier());
+    }
+
+    @Test
+    @MediumTest
     public void testNoRilTrafficAfterSetRadioPower() {
         sst.setRadioPower(true);
         final int getOperatorCallCount = mSimulatedCommands.getGetOperatorCallCount();
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/ApnContextTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/ApnContextTest.java
index 7e07115..8c49c21 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/ApnContextTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/ApnContextTest.java
@@ -140,9 +140,9 @@
     @SmallTest
     public void testNetworkRequest() throws Exception {
         LocalLog log = new LocalLog(3);
-        NetworkCapabilities nc = new NetworkCapabilities();
-        NetworkRequest nr = new NetworkRequest(nc, 0, 0);
+        NetworkRequest nr = new NetworkRequest.Builder().build();
         mApnContext.requestNetwork(nr, log);
+
         verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(true));
         mApnContext.requestNetwork(nr, log);
         verify(mDcTracker, times(1)).setEnabled(eq(DctConstants.APN_DEFAULT_ID), eq(true));
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java
index 772905b..99b8131 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java
@@ -308,6 +308,7 @@
         doReturn(true).when(mSimRecords).getRecordsLoaded();
         doReturn(PhoneConstants.State.IDLE).when(mCT).getState();
         doReturn(true).when(mSST).getDesiredPowerState();
+        doReturn(true).when(mSST).getPowerStateFromCarrier();
         doAnswer(
                 new Answer<Void>() {
                     @Override
@@ -735,9 +736,8 @@
         mDct.sendMessage(mDct.obtainMessage(intArgumentCaptor.getValue(), null));
         waitForMs(200);
 
-        NetworkCapabilities nc = new NetworkCapabilities();
-        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
-        NetworkRequest nr = new NetworkRequest(nc, 0, 0);
+        NetworkRequest nr = new NetworkRequest.Builder()
+                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
         LocalLog l = new LocalLog(100);
         mDct.requestNetwork(nr, l);
         waitForMs(200);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/mocks/ConnectivityServiceMock.java b/tests/telephonytests/src/com/android/internal/telephony/mocks/ConnectivityServiceMock.java
index 7366526..bb54ead 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/mocks/ConnectivityServiceMock.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/mocks/ConnectivityServiceMock.java
@@ -315,7 +315,7 @@
         NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
         if (nai != null) {
             if (DBG) {
-                log(nai.name() + " got DISCONNECTED, was satisfying " + nai.networkRequests.size());
+                log(nai.name() + " got DISCONNECTED, was satisfying " + nai.numNetworkRequests());
             }
             // A network agent has disconnected.
             // TODO - if we move the logic to the network agent (have them disconnect
@@ -755,9 +755,8 @@
         }
 
         NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType,
-                nextNetworkRequestId());
-        NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder,
-                NetworkRequestInfo.REQUEST);
+                nextNetworkRequestId(), NetworkRequest.Type.REQUEST);
+        NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder, true);
         if (DBG) log("requestNetwork for " + nri);
 
         mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST, nri));
@@ -949,8 +948,8 @@
     }
 
     private void sendUpdatedScoreToFactories(NetworkAgentInfo nai) {
-        for (int i = 0; i < nai.networkRequests.size(); i++) {
-            NetworkRequest nr = nai.networkRequests.valueAt(i);
+        for (int i = 0; i < nai.numNetworkRequests(); i++) {
+            NetworkRequest nr = nai.requestAt(i);
             // Don't send listening requests to factories. b/17393458
             if (!isRequest(nr)) continue;
                 sendUpdatedScoreToFactories(nr, nai.getCurrentScore());
