diff --git a/src/java/com/android/internal/telephony/CommandsInterface.java b/src/java/com/android/internal/telephony/CommandsInterface.java
index e4298ad..a7e5b0a 100644
--- a/src/java/com/android/internal/telephony/CommandsInterface.java
+++ b/src/java/com/android/internal/telephony/CommandsInterface.java
@@ -1831,7 +1831,7 @@
      */
     void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
                        boolean allowRoaming, int reason, LinkProperties linkProperties,
-                       Message result);
+                       int pduSessionId, Message result);
 
     /**
      * Deactivate packet data connection
@@ -2543,4 +2543,39 @@
      * @param result Message will be sent back to handler and result.obj will be the AsycResult.
      */
     default void getBarringInfo(Message result) {};
+
+    /**
+     * Allocates a pdu session id
+     *
+     * AsyncResult.result is the allocated pdu session id
+     *
+     * @param result Message will be sent back to handler and result.obj will be the AsycResult.
+     *
+     */
+    default void allocatePduSessionId(Message result) {};
+
+    /**
+     * Release the pdu session id
+     *
+     * @param result Message that will be sent back to handler.
+     * @param pduSessionId The id that was allocated and should now be released.
+     *
+     */
+    default void releasePduSessionId(Message result, int pduSessionId) {};
+
+    /**
+     * Indicates that a handover has started
+     *
+     * @param result Message that will be sent back to handler.
+     * @param callId Identifier associated with the data call
+     */
+    default void startHandover(Message result, int callId) {};
+
+    /**
+     * Indicates that a handover has been cancelled
+     *
+     * @param result Message that will be sent back to handler.
+     * @param callId Identifier associated with the data call
+     */
+    default void cancelHandover(Message result, int callId) {};
 }
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index 1823c1d..1882c85 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -1893,8 +1893,7 @@
     @Override
     public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
                               boolean allowRoaming, int reason, LinkProperties linkProperties,
-                              Message result) {
-
+                              int pduSessionId, Message result) {
         IRadio radioProxy = getRadioProxy(result);
 
         if (radioProxy != null) {
@@ -1942,11 +1941,12 @@
                                 + ",accessNetworkType="
                                 + AccessNetworkType.toString(accessNetworkType) + ",isRoaming="
                                 + isRoaming + ",allowRoaming=" + allowRoaming + "," + dataProfile
-                                + ",addresses=" + addresses15 + ",dnses=" + dnses);
+                                + ",addresses=" + addresses15 + ",dnses=" + dnses
+                                + ",pduSessionId=" + pduSessionId);
                     }
 
                     radioProxy16.setupDataCall_1_6(rr.mSerial, accessNetworkType, dpi, allowRoaming,
-                            reason, addresses15, dnses);
+                            reason, addresses15, dnses, pduSessionId);
                 } else if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_5)) {
                     // IRadio V1.5
                     android.hardware.radio.V1_5.IRadio radioProxy15 =
@@ -5596,7 +5596,115 @@
         }
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void allocatePduSessionId(Message result) {
+        android.hardware.radio.V1_6.IRadio radioProxy16 = getRadioV16(result);
+
+        if (radioProxy16 != null) {
+            RILRequest rr = obtainRequest(RIL_REQUEST_ALLOCATE_PDU_SESSION_ID, result,
+                    mRILDefaultWorkSource);
+            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+            try {
+                radioProxy16.allocatePduSessionId(rr.mSerial);
+            } catch (RemoteException e) {
+                handleRadioProxyExceptionForRR(rr, "allocatePduSessionId", e);
+            }
+        } else {
+            AsyncResult.forMessage(result, null,
+                    CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
+            result.sendToTarget();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void releasePduSessionId(Message result, int pduSessionId) {
+        android.hardware.radio.V1_6.IRadio radioProxy16 = getRadioV16(result);
+
+        if (radioProxy16 != null) {
+            RILRequest rr = obtainRequest(RIL_REQUEST_RELEASE_PDU_SESSION_ID, result,
+                    mRILDefaultWorkSource);
+            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+            try {
+                radioProxy16.releasePduSessionId(rr.mSerial, pduSessionId);
+            } catch (RemoteException e) {
+                handleRadioProxyExceptionForRR(rr, "releasePduSessionId", e);
+            }
+        } else {
+            AsyncResult.forMessage(result, null,
+                    CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
+            result.sendToTarget();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void startHandover(Message result, int callId) {
+        android.hardware.radio.V1_6.IRadio radioProxy16 = getRadioV16(result);
+
+        if (radioProxy16 != null) {
+            RILRequest rr = obtainRequest(RIL_REQUEST_START_HANDOVER, result,
+                    mRILDefaultWorkSource);
+            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+            try {
+                radioProxy16.startHandover(rr.mSerial, callId);
+            } catch (RemoteException e) {
+                handleRadioProxyExceptionForRR(rr, "startHandover", e);
+            }
+        } else {
+            if (RILJ_LOGD) Rlog.d(RILJ_LOG_TAG, "startHandover: REQUEST_NOT_SUPPORTED");
+            AsyncResult.forMessage(result, null,
+                    CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
+            result.sendToTarget();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void cancelHandover(Message result, int callId) {
+        android.hardware.radio.V1_6.IRadio radioProxy16 = getRadioV16(result);
+
+        if (radioProxy16 != null) {
+            RILRequest rr = obtainRequest(RIL_REQUEST_CANCEL_HANDOVER, result,
+                    mRILDefaultWorkSource);
+            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+            try {
+                radioProxy16.cancelHandover(rr.mSerial, callId);
+            } catch (RemoteException e) {
+                handleRadioProxyExceptionForRR(rr, "cancelHandover", e);
+            }
+        } else {
+            if (RILJ_LOGD) Rlog.d(RILJ_LOG_TAG, "cancelHandover: REQUEST_NOT_SUPPORTED");
+            AsyncResult.forMessage(result, null,
+                    CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
+            result.sendToTarget();
+        }
+    }
+
     //***** Private Methods
+    /** Helper that gets V1.6 of the radio interface OR sends back REQUEST_NOT_SUPPORTED */
+    @Nullable private android.hardware.radio.V1_6.IRadio getRadioV16(Message msg) {
+        IRadio radioProxy = getRadioProxy(msg);
+        if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
+            return (android.hardware.radio.V1_6.IRadio) radioProxy;
+        } else {
+            return (android.hardware.radio.V1_6.IRadio) null;
+        }
+    }
+
 
     /**
      * This is a helper function to be called when a RadioIndication callback is called.
@@ -6544,6 +6652,14 @@
                 return "RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY";
             case RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED:
                 return "RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED";
+            case RIL_REQUEST_ALLOCATE_PDU_SESSION_ID:
+                return "RIL_REQUEST_ALLOCATE_PDU_SESSION_ID";
+            case RIL_REQUEST_RELEASE_PDU_SESSION_ID:
+                return "RIL_REQUEST_RELEASE_PDU_SESSION_ID";
+            case RIL_REQUEST_START_HANDOVER:
+                return "RIL_REQUEST_START_HANDOVER";
+            case RIL_REQUEST_CANCEL_HANDOVER:
+                return "RIL_REQUEST_CANCEL_HANDOVER";
             default: return "<unknown request>";
         }
     }
@@ -7044,6 +7160,8 @@
         @HandoverFailureMode
         int handoverFailureMode = DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY;
 
+        int pduSessionId = DataCallResponse.PDU_SESSION_ID_NOT_SET;
+
         List<LinkAddress> laList = new ArrayList<>();
 
         if (dcResult instanceof android.hardware.radio.V1_0.SetupDataCallResult) {
@@ -7131,6 +7249,7 @@
             mtuV4 = result.mtuV4;
             mtuV6 = result.mtuV6;
             handoverFailureMode = result.handoverFailureMode;
+            pduSessionId = result.pduSessionId;
         } else {
             Rlog.e(RILJ_LOG_TAG, "Unsupported SetupDataCallResult " + dcResult);
             return null;
@@ -7196,6 +7315,7 @@
                 .setMtuV4(mtuV4)
                 .setMtuV6(mtuV6)
                 .setHandoverFailureMode(handoverFailureMode)
+                .setPduSessionId(pduSessionId)
                 .build();
     }
 
diff --git a/src/java/com/android/internal/telephony/RadioResponse.java b/src/java/com/android/internal/telephony/RadioResponse.java
index 6332ef1..dbf8ff3 100644
--- a/src/java/com/android/internal/telephony/RadioResponse.java
+++ b/src/java/com/android/internal/telephony/RadioResponse.java
@@ -37,6 +37,7 @@
 import android.hardware.radio.V1_4.CarrierRestrictionsWithPriority;
 import android.hardware.radio.V1_4.SimLockMultiSimPolicy;
 import android.hardware.radio.V1_6.IRadioResponse;
+import android.hardware.radio.V1_6.SetupDataCallResult;
 import android.os.AsyncResult;
 import android.os.Message;
 import android.os.SystemClock;
@@ -115,7 +116,7 @@
      * @param cardStatus ICC card status as defined by CardStatus in 1.2/types.hal
      */
     public void getIccCardStatusResponse_1_2(RadioResponseInfo responseInfo,
-                                             android.hardware.radio.V1_2.CardStatus cardStatus) {
+            android.hardware.radio.V1_2.CardStatus cardStatus) {
         responseIccCardStatus_1_2(responseInfo, cardStatus);
     }
 
@@ -124,7 +125,7 @@
      * @param cardStatus ICC card status as defined by CardStatus in 1.4/types.hal
      */
     public void getIccCardStatusResponse_1_4(RadioResponseInfo responseInfo,
-                                             android.hardware.radio.V1_4.CardStatus cardStatus) {
+            android.hardware.radio.V1_4.CardStatus cardStatus) {
         responseIccCardStatus_1_4(responseInfo, cardStatus);
     }
 
@@ -190,7 +191,7 @@
      * @param retriesRemaining Number of retries remaining, must be equal to -1 if unknown.
      */
     public void supplyNetworkDepersonalizationResponse(RadioResponseInfo responseInfo,
-                                                       int retriesRemaining) {
+            int retriesRemaining) {
         responseInts(responseInfo, retriesRemaining);
     }
 
@@ -211,7 +212,7 @@
      * @param calls Current call list
      */
     public void getCurrentCallsResponse(RadioResponseInfo responseInfo,
-                                        ArrayList<android.hardware.radio.V1_0.Call> calls) {
+            ArrayList<android.hardware.radio.V1_0.Call> calls) {
         responseCurrentCalls(responseInfo, calls);
     }
 
@@ -220,7 +221,7 @@
      * @param calls Current call list
      */
     public void getCurrentCallsResponse_1_2(RadioResponseInfo responseInfo,
-                                        ArrayList<android.hardware.radio.V1_2.Call> calls) {
+            ArrayList<android.hardware.radio.V1_2.Call> calls) {
         responseCurrentCalls_1_2(responseInfo, calls);
     }
 
@@ -289,12 +290,12 @@
      *        described in the "CDMA IS-2000 Release A (C.S0005-A v6.0)" standard.
      */
     public void getLastCallFailCauseResponse(RadioResponseInfo responseInfo,
-                                             LastCallFailCauseInfo fcInfo) {
+            LastCallFailCauseInfo fcInfo) {
         responseLastCallFailCauseInfo(responseInfo, fcInfo);
     }
 
     public void getSignalStrengthResponse(RadioResponseInfo responseInfo,
-                                          android.hardware.radio.V1_0.SignalStrength sigStrength) {
+            android.hardware.radio.V1_0.SignalStrength sigStrength) {
         responseSignalStrength(responseInfo, sigStrength);
     }
 
@@ -307,7 +308,7 @@
             android.hardware.radio.V1_2.SignalStrength signalStrength) {
         responseSignalStrength_1_2(responseInfo, signalStrength);
     }
-     /**
+    /**
      * @param responseInfo Response info struct containing response type, serial no. and error
      * @param signalStrength Current signal strength of camped/connected cells
      */
@@ -323,7 +324,7 @@
      *        in types.hal
      */
     public void getVoiceRegistrationStateResponse(RadioResponseInfo responseInfo,
-                                                  VoiceRegStateResult voiceRegResponse) {
+            VoiceRegStateResult voiceRegResponse) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -387,7 +388,7 @@
      *        types.hal
      */
     public void getDataRegistrationStateResponse(RadioResponseInfo responseInfo,
-                                                 DataRegStateResult dataRegResponse) {
+            DataRegStateResult dataRegResponse) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -469,9 +470,9 @@
      * @param numeric is 5 or 6 digit numeric code (MCC + MNC) or empty string if unregistered
      */
     public void getOperatorResponse(RadioResponseInfo responseInfo,
-                                    String longName,
-                                    String shortName,
-                                    String numeric) {
+            String longName,
+            String shortName,
+            String numeric) {
         responseStrings(responseInfo, longName, shortName, numeric);
     }
 
@@ -495,7 +496,7 @@
      * @param sms Response to sms sent as defined by SendSmsResult in types.hal
      */
     public void sendSmsResponse(RadioResponseInfo responseInfo,
-                                SendSmsResult sms) {
+            SendSmsResult sms) {
         responseSms(responseInfo, sms);
     }
 
@@ -514,7 +515,7 @@
      * @param sms Response to sms sent as defined by SendSmsResult in types.hal
      */
     public void sendSMSExpectMoreResponse(RadioResponseInfo responseInfo,
-                                          SendSmsResult sms) {
+            SendSmsResult sms) {
         responseSms(responseInfo, sms);
     }
 
@@ -559,12 +560,43 @@
         responseSetupDataCall(responseInfo, setupDataCallResult);
     }
 
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     * @param setupDataCallResult Response to data call setup as defined by setupDataCallResult in
+     *                            1.6/types.hal
+     */
+    public void setupDataCallResponse_1_6(
+            android.hardware.radio.V1_6.RadioResponseInfo responseInfo,
+            android.hardware.radio.V1_6.SetupDataCallResult setupDataCallResult) {
+        responseSetupDataCall_1_6(responseInfo, setupDataCallResult);
+    }
+
+    @Override
+    public void getDataCallListResponse_1_6(android.hardware.radio.V1_6.RadioResponseInfo info,
+            ArrayList<SetupDataCallResult> dcResponse) {
+        responseDataCallList(info, dcResponse);
+    }
+
+    @Override
+    public void setSimCardPowerResponse_1_6(android.hardware.radio.V1_6.RadioResponseInfo info) {
+        /* This method was missing a response, will let the owner know */
+        responseVoid_1_6(info);
+    }
+
+    @Override
+    public void setAllowedNetworkTypeBitmapResponse(
+            android.hardware.radio.V1_6.RadioResponseInfo info) {
+        /* This method was missing a response, will let the owner know */
+        responseVoid_1_6(info);
+    }
+
     /**
      * @param responseInfo Response info struct containing response type, serial no. and error
      * @param iccIo ICC io operation response as defined by IccIoResult in types.hal
      */
     public void iccIOForAppResponse(RadioResponseInfo responseInfo,
-                            android.hardware.radio.V1_0.IccIoResult iccIo) {
+            android.hardware.radio.V1_0.IccIoResult iccIo) {
         responseIccIo(responseInfo, iccIo);
     }
 
@@ -604,8 +636,8 @@
      *        each distinct registered phone number.
      */
     public void getCallForwardStatusResponse(RadioResponseInfo responseInfo,
-                                             ArrayList<android.hardware.radio.V1_0.CallForwardInfo>
-                                                     callForwardInfos) {
+            ArrayList<android.hardware.radio.V1_0.CallForwardInfo>
+                    callForwardInfos) {
         responseCallForwardInfo(responseInfo, callForwardInfos);
     }
 
@@ -627,8 +659,8 @@
      *        and voice and disabled for everything else.
      */
     public void getCallWaitingResponse(RadioResponseInfo responseInfo,
-                                   boolean enable,
-                                   int serviceClass) {
+            boolean enable,
+            int serviceClass) {
         responseInts(responseInfo, enable ? 1 : 0, serviceClass);
     }
 
@@ -724,8 +756,8 @@
      *                     types.hal
      */
     public void getAvailableNetworksResponse(RadioResponseInfo responseInfo,
-                                             ArrayList<android.hardware.radio.V1_0.OperatorInfo>
-                                                     networkInfos) {
+            ArrayList<android.hardware.radio.V1_0.OperatorInfo>
+                    networkInfos) {
         responseOperatorInfos(responseInfo, networkInfos);
     }
 
@@ -850,7 +882,7 @@
     }
 
     public void sendOemRilRequestRawResponse(RadioResponseInfo responseInfo,
-                                             ArrayList<Byte> var2) {}
+            ArrayList<Byte> var2) {}
 
     /**
      * @param responseInfo Response info struct containing response type, serial no. and error
@@ -887,7 +919,7 @@
      * @param bandModes List of RadioBandMode listing supported modes
      */
     public void getAvailableBandModesResponse(RadioResponseInfo responseInfo,
-                                              ArrayList<Integer> bandModes) {
+            ArrayList<Integer> bandModes) {
         responseIntArrayList(responseInfo, bandModes);
     }
 
@@ -968,7 +1000,7 @@
      * @param cells Vector of neighboring radio cell information
      */
     public void getNeighboringCidsResponse(RadioResponseInfo responseInfo,
-                                           ArrayList<NeighboringCell> cells) {
+            ArrayList<NeighboringCell> cells) {
         responseCellList(responseInfo, cells);
     }
 
@@ -1032,7 +1064,7 @@
      *        true for Enhanced Privacy Mode (Private Long Code Mask)
      */
     public void getPreferredVoicePrivacyResponse(RadioResponseInfo responseInfo,
-                                                 boolean enable) {
+            boolean enable) {
         responseInts(responseInfo, enable ? 1 : 0);
     }
 
@@ -1111,7 +1143,7 @@
      * @param configs Vector of GSM/WCDMA Cell broadcast configs
      */
     public void getGsmBroadcastConfigResponse(RadioResponseInfo responseInfo,
-                                              ArrayList<GsmBroadcastSmsConfigInfo> configs) {
+            ArrayList<GsmBroadcastSmsConfigInfo> configs) {
         responseGmsBroadcastConfig(responseInfo, configs);
     }
 
@@ -1135,7 +1167,7 @@
      * @param configs Vector of CDMA Broadcast SMS configs.
      */
     public void getCdmaBroadcastConfigResponse(RadioResponseInfo responseInfo,
-                                               ArrayList<CdmaBroadcastSmsConfigInfo> configs) {
+            ArrayList<CdmaBroadcastSmsConfigInfo> configs) {
         responseCdmaBroadcastConfig(responseInfo, configs);
     }
 
@@ -1165,7 +1197,7 @@
      * @param prl PRL version if CDMA subscription is available
      */
     public void getCDMASubscriptionResponse(RadioResponseInfo responseInfo, String mdn,
-                                            String hSid, String hNid, String min, String prl) {
+            String hSid, String hNid, String min, String prl) {
         responseStrings(responseInfo, mdn, hSid, hNid, min, prl);
     }
 
@@ -1193,7 +1225,7 @@
      * @param meid MEID if CDMA subscription is available
      */
     public void getDeviceIdentityResponse(RadioResponseInfo responseInfo, String imei,
-                                          String imeisv, String esn, String meid) {
+            String imeisv, String esn, String meid) {
         responseStrings(responseInfo, imei, imeisv, esn, meid);
     }
 
@@ -1265,7 +1297,7 @@
      * @param iccIo IccIoResult as defined in types.hal corresponding to ICC IO response
      */
     public void sendEnvelopeWithStatusResponse(RadioResponseInfo responseInfo,
-                                               android.hardware.radio.V1_0.IccIoResult iccIo) {
+            android.hardware.radio.V1_0.IccIoResult iccIo) {
         responseIccIo(responseInfo, iccIo);
     }
 
@@ -1279,7 +1311,7 @@
     }
 
     public void getCellInfoListResponse(RadioResponseInfo responseInfo,
-                                        ArrayList<android.hardware.radio.V1_0.CellInfo> cellInfo) {
+            ArrayList<android.hardware.radio.V1_0.CellInfo> cellInfo) {
         responseCellInfoList(responseInfo, cellInfo);
     }
 
@@ -1342,7 +1374,7 @@
      *        isRegistered is true.
      */
     public void getImsRegistrationStateResponse(RadioResponseInfo responseInfo,
-                                                boolean isRegistered, int ratFamily) {
+            boolean isRegistered, int ratFamily) {
         responseInts(
                 responseInfo,
                 isRegistered ? 1 : 0,
@@ -1366,8 +1398,8 @@
      * @param result IccIoResult as defined in types.hal
      */
     public void iccTransmitApduBasicChannelResponse(RadioResponseInfo responseInfo,
-                                                    android.hardware.radio.V1_0.IccIoResult
-                                                            result) {
+            android.hardware.radio.V1_0.IccIoResult
+                    result) {
         responseIccIo(responseInfo, result);
     }
 
@@ -1379,7 +1411,7 @@
      *        byte per integer
      */
     public void iccOpenLogicalChannelResponse(RadioResponseInfo responseInfo, int channelId,
-                                              ArrayList<Byte> selectResponse) {
+            ArrayList<Byte> selectResponse) {
         ArrayList<Integer> arr = new ArrayList<>();
         arr.add(channelId);
         for (int i = 0; i < selectResponse.size(); i++) {
@@ -1462,8 +1494,8 @@
      * @param result IccIoResult as defined in types.hal
      */
     public void requestIccSimAuthenticationResponse(RadioResponseInfo responseInfo,
-                                                    android.hardware.radio.V1_0.IccIoResult
-                                                            result) {
+            android.hardware.radio.V1_0.IccIoResult
+                    result) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -1501,7 +1533,7 @@
     }
 
     public void getRadioCapabilityResponse(RadioResponseInfo responseInfo,
-                                           android.hardware.radio.V1_0.RadioCapability rc) {
+            android.hardware.radio.V1_0.RadioCapability rc) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -1521,7 +1553,7 @@
     }
 
     public void setRadioCapabilityResponse(RadioResponseInfo responseInfo,
-                                           android.hardware.radio.V1_0.RadioCapability rc) {
+            android.hardware.radio.V1_0.RadioCapability rc) {
         responseRadioCapability(responseInfo, rc);
     }
 
@@ -1553,7 +1585,7 @@
      * @param activityInfo modem activity information
      */
     public void getModemActivityInfoResponse(RadioResponseInfo responseInfo,
-                                             ActivityStatsInfo activityInfo) {
+            ActivityStatsInfo activityInfo) {
         responseActivityData(responseInfo, activityInfo);
     }
 
@@ -1578,87 +1610,11 @@
 
     /**
      *
-     * @param responseInfo Response info struct containing response type, serial no. and error
+     * @param info Response info struct containing response type, serial no. and error
      */
     public void setNrDualConnectivityStateResponse(
-            android.hardware.radio.V1_6.RadioResponseInfo  responseInfo) {
-        responseVoid_1_6(responseInfo);
-    }
-
-    /**
-     *
-     * @param responseInfo Response info struct containing response type, serial no. and error
-     * @param dcResponse SetupDataCallResult
-     */
-    public void setupDataCallResponse_1_6(
-            android.hardware.radio.V1_6.RadioResponseInfo  responseInfo,
-            android.hardware.radio.V1_6.SetupDataCallResult dcResponse) {
-        responseVoid_1_6(responseInfo);
-    }
-
-    /**
-     *
-     * @param responseInfo Response info struct containing response type, serial no. and error
-     * @param dcResponse List of SetupDataCallResult
-     */
-    public void getDataCallListResponse_1_6(
-            android.hardware.radio.V1_6.RadioResponseInfo  responseInfo,
-            ArrayList<android.hardware.radio.V1_6.SetupDataCallResult> dcResponse) {
-        responseVoid_1_6(responseInfo);
-    }
-
-    /**
-     *
-     * @param responseInfo Response info struct containing response type, serial no. and error
-     * @param id The allocated id. On an error, this is set to -1     */
-    public void allocatePduSessionIdResponse(
-            android.hardware.radio.V1_6.RadioResponseInfo responseInfo, int id) {
-        responseVoid_1_6(responseInfo);
-    }
-
-    /**
-     *
-     * @param responseInfo Response info struct containing response type, serial no. and error
-     */
-    public void releasePduSessionIdResponse(
-            android.hardware.radio.V1_6.RadioResponseInfo responseInfo) {
-        responseVoid_1_6(responseInfo);
-    }
-
-    /**
-     *
-     * @param responseInfo Response info struct containing response type, serial no. and error
-     */
-    public void beginHandoverResponse(
-            android.hardware.radio.V1_6.RadioResponseInfo responseInfo) {
-        responseVoid_1_6(responseInfo);
-    }
-
-    /**
-     *
-     * @param responseInfo Response info struct containing response type, serial no. and error
-     */
-    public void cancelHandoverResponse(
-            android.hardware.radio.V1_6.RadioResponseInfo responseInfo) {
-        responseVoid_1_6(responseInfo);
-    }
-
-    /**
-     *
-     * @param responseInfo Response info struct containing response type, serial no. and error
-     */
-    public void setAllowedNetworkTypeBitmapResponse(
-            android.hardware.radio.V1_6.RadioResponseInfo responseInfo) {
-        responseVoid_1_6(responseInfo);
-    }
-
-    /**
-     *
-     * @param responseInfo Response info struct containing response type, serial no. and error
-     */
-    public void setSimCardPowerResponse_1_6(
-            android.hardware.radio.V1_6.RadioResponseInfo responseInfo) {
-        responseVoid_1_6(responseInfo);
+            android.hardware.radio.V1_6.RadioResponseInfo info) {
+        responseVoid_1_6(info);
     }
 
     /**
@@ -1895,7 +1851,7 @@
         if (numApplications
                 > com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS) {
             numApplications =
-                com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS;
+                    com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS;
         }
         iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications];
         for (int i = 0; i < numApplications; i++) {
@@ -1904,7 +1860,7 @@
             appStatus.app_type       = appStatus.AppTypeFromRILInt(rilAppStatus.appType);
             appStatus.app_state      = appStatus.AppStateFromRILInt(rilAppStatus.appState);
             appStatus.perso_substate = appStatus.PersoSubstateFromRILInt(
-                rilAppStatus.persoSubstate);
+                    rilAppStatus.persoSubstate);
             appStatus.aid            = rilAppStatus.aidPtr;
             appStatus.app_label      = rilAppStatus.appLabelPtr;
             appStatus.pin1_replaced  = rilAppStatus.pin1Replaced;
@@ -1972,7 +1928,7 @@
     }
 
     private void responseIccCardStatus_1_2(RadioResponseInfo responseInfo,
-                                           android.hardware.radio.V1_2.CardStatus cardStatus) {
+            android.hardware.radio.V1_2.CardStatus cardStatus) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -1989,7 +1945,7 @@
     }
 
     private void responseIccCardStatus_1_4(RadioResponseInfo responseInfo,
-                                           android.hardware.radio.V1_4.CardStatus cardStatus) {
+            android.hardware.radio.V1_4.CardStatus cardStatus) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2051,7 +2007,7 @@
     }
 
     private void responseCurrentCalls(RadioResponseInfo responseInfo,
-                                      ArrayList<android.hardware.radio.V1_0.Call> calls) {
+            ArrayList<android.hardware.radio.V1_0.Call> calls) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2130,7 +2086,7 @@
     }
 
     private void responseCurrentCalls_1_2(RadioResponseInfo responseInfo,
-                                      ArrayList<android.hardware.radio.V1_2.Call> calls) {
+            ArrayList<android.hardware.radio.V1_2.Call> calls) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2255,7 +2211,7 @@
     }
 
     static void responseStringArrayList(RIL ril, RadioResponseInfo responseInfo,
-                                        ArrayList<String> strings) {
+            ArrayList<String> strings) {
         RILRequest rr = ril.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2271,7 +2227,7 @@
     }
 
     private void responseLastCallFailCauseInfo(RadioResponseInfo responseInfo,
-                                               LastCallFailCauseInfo fcInfo) {
+            LastCallFailCauseInfo fcInfo) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2355,7 +2311,7 @@
     }
 
     private void responseSetupDataCall(RadioResponseInfo responseInfo,
-                                       Object setupDataCallResult) {
+            Object setupDataCallResult) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2367,8 +2323,22 @@
         }
     }
 
+    private void responseSetupDataCall_1_6(
+            android.hardware.radio.V1_6.RadioResponseInfo responseInfo,
+            Object setupDataCallResult) {
+        RILRequest rr = mRil.processResponse_1_6(responseInfo);
+
+        if (rr != null) {
+            DataCallResponse response = RIL.convertDataCallResult(setupDataCallResult);
+            if (responseInfo.error == RadioError.NONE) {
+                sendMessageResponse(rr.mResult, response);
+            }
+            mRil.processResponseDone_1_6(rr, responseInfo, response);
+        }
+    }
+
     private void responseIccIo(RadioResponseInfo responseInfo,
-                               android.hardware.radio.V1_0.IccIoResult result) {
+            android.hardware.radio.V1_0.IccIoResult result) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2381,8 +2351,8 @@
     }
 
     private void responseCallForwardInfo(RadioResponseInfo responseInfo,
-                                         ArrayList<android.hardware.radio.V1_0.CallForwardInfo>
-                                                 callForwardInfos) {
+            ArrayList<android.hardware.radio.V1_0.CallForwardInfo>
+                    callForwardInfos) {
         RILRequest rr = mRil.processResponse(responseInfo);
         if (rr != null) {
             CallForwardInfo[] ret = new CallForwardInfo[callForwardInfos.size()];
@@ -2417,8 +2387,8 @@
     }
 
     private void responseOperatorInfos(RadioResponseInfo responseInfo,
-                                       ArrayList<android.hardware.radio.V1_0.OperatorInfo>
-                                               networkInfos) {
+            ArrayList<android.hardware.radio.V1_0.OperatorInfo>
+                    networkInfos) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2469,7 +2439,7 @@
     }
 
     private void responseDataCallList(RadioResponseInfo responseInfo,
-                                      List<? extends Object> dataCallResultList) {
+            List<? extends Object> dataCallResultList) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2482,8 +2452,22 @@
         }
     }
 
+    private void responseDataCallList(android.hardware.radio.V1_6.RadioResponseInfo responseInfo,
+            List<? extends Object> dataCallResultList) {
+        RILRequest rr = mRil.processResponse_1_6(responseInfo);
+
+        if (rr != null) {
+            ArrayList<DataCallResponse> response =
+                    RIL.convertDataCallResultList(dataCallResultList);
+            if (responseInfo.error == RadioError.NONE) {
+                sendMessageResponse(rr.mResult, response);
+            }
+            mRil.processResponseDone_1_6(rr, responseInfo, response);
+        }
+    }
+
     private void responseCellList(RadioResponseInfo responseInfo,
-                                  ArrayList<NeighboringCell> cells) {
+            ArrayList<NeighboringCell> cells) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2513,7 +2497,7 @@
     }
 
     private void responseGmsBroadcastConfig(RadioResponseInfo responseInfo,
-                                            ArrayList<GsmBroadcastSmsConfigInfo> configs) {
+            ArrayList<GsmBroadcastSmsConfigInfo> configs) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2531,7 +2515,7 @@
     }
 
     private void responseCdmaBroadcastConfig(RadioResponseInfo responseInfo,
-                                            ArrayList<CdmaBroadcastSmsConfigInfo> configs) {
+            ArrayList<CdmaBroadcastSmsConfigInfo> configs) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2579,7 +2563,7 @@
     }
 
     private void responseCellInfoList(RadioResponseInfo responseInfo,
-                                      ArrayList<android.hardware.radio.V1_0.CellInfo> cellInfo) {
+            ArrayList<android.hardware.radio.V1_0.CellInfo> cellInfo) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2633,7 +2617,7 @@
     }
 
     private void responseActivityData(RadioResponseInfo responseInfo,
-                                      ActivityStatsInfo activityInfo) {
+            ActivityStatsInfo activityInfo) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2673,7 +2657,7 @@
     }
 
     private void responseRadioCapability(RadioResponseInfo responseInfo,
-                                         android.hardware.radio.V1_0.RadioCapability rc) {
+            android.hardware.radio.V1_0.RadioCapability rc) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
@@ -2734,8 +2718,8 @@
     }
 
     private void responseCarrierRestrictions(RadioResponseInfo responseInfo, boolean allAllowed,
-                                            CarrierRestrictionsWithPriority carriers,
-                                            int multiSimPolicy) {
+            CarrierRestrictionsWithPriority carriers,
+            int multiSimPolicy) {
         RILRequest rr = mRil.processResponse(responseInfo);
         if (rr == null) {
             return;
@@ -2867,4 +2851,40 @@
             mRil.processResponseDone(rr, responseInfo, bi);
         }
     }
-}
+
+    /**
+     * @param info Response info struct containing response type, serial no. and error
+     * @param id The pdu session id allocated
+     */
+    public void allocatePduSessionIdResponse(android.hardware.radio.V1_6.RadioResponseInfo info,
+            int id) {
+        RILRequest rr = mRil.processResponse_1_6(info);
+        if (rr != null) {
+            if (info.error == RadioError.NONE) {
+                sendMessageResponse(rr.mResult, id);
+            }
+            mRil.processResponseDone_1_6(rr, info, id);
+        }
+    }
+
+    /**
+     * @param info Response info struct containing response type, serial no. and error
+     */
+    public void releasePduSessionIdResponse(android.hardware.radio.V1_6.RadioResponseInfo info) {
+        responseVoid_1_6(info);
+    }
+
+    /**
+     * @param info Response info struct containing response type, serial no. and error
+     */
+    public void startHandoverResponse(android.hardware.radio.V1_6.RadioResponseInfo info) {
+        responseVoid_1_6(info);
+    }
+
+    /**
+     * @param info Response info struct containing response type, serial no. and error
+     */
+    public void cancelHandoverResponse(android.hardware.radio.V1_6.RadioResponseInfo info) {
+        responseVoid_1_6(info);
+    }
+}
\ No newline at end of file
diff --git a/src/java/com/android/internal/telephony/dataconnection/CellularDataService.java b/src/java/com/android/internal/telephony/dataconnection/CellularDataService.java
index a4b5929..520e90c 100644
--- a/src/java/com/android/internal/telephony/dataconnection/CellularDataService.java
+++ b/src/java/com/android/internal/telephony/dataconnection/CellularDataService.java
@@ -16,6 +16,9 @@
 
 package com.android.internal.telephony.dataconnection;
 
+import static android.telephony.data.DataServiceCallback.RESULT_SUCCESS;
+
+import android.annotation.Nullable;
 import android.net.LinkProperties;
 import android.os.AsyncResult;
 import android.os.Handler;
@@ -27,6 +30,7 @@
 import android.telephony.data.DataService;
 import android.telephony.data.DataServiceCallback;
 
+import com.android.internal.telephony.CommandException;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
 import com.android.telephony.Rlog;
@@ -50,6 +54,8 @@
     private static final int SET_DATA_PROFILE_COMPLETE              = 4;
     private static final int REQUEST_DATA_CALL_LIST_COMPLETE        = 5;
     private static final int DATA_CALL_LIST_CHANGED                 = 6;
+    private static final int START_HANDOVER                         = 7;
+    private static final int CANCEL_HANDOVER                        = 8;
 
     private class CellularDataServiceProvider extends DataService.DataServiceProvider {
 
@@ -75,29 +81,29 @@
                             DataCallResponse response = (DataCallResponse) ar.result;
                             callback.onSetupDataCallComplete(ar.exception != null
                                     ? DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE
-                                    : DataServiceCallback.RESULT_SUCCESS,
+                                    : RESULT_SUCCESS,
                                     response);
                             break;
                         case DEACTIVATE_DATA_ALL_COMPLETE:
                             callback.onDeactivateDataCallComplete(ar.exception != null
                                     ? DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE
-                                    : DataServiceCallback.RESULT_SUCCESS);
+                                    : RESULT_SUCCESS);
                             break;
                         case SET_INITIAL_ATTACH_APN_COMPLETE:
                             callback.onSetInitialAttachApnComplete(ar.exception != null
                                     ? DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE
-                                    : DataServiceCallback.RESULT_SUCCESS);
+                                    : RESULT_SUCCESS);
                             break;
                         case SET_DATA_PROFILE_COMPLETE:
                             callback.onSetDataProfileComplete(ar.exception != null
                                     ? DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE
-                                    : DataServiceCallback.RESULT_SUCCESS);
+                                    : RESULT_SUCCESS);
                             break;
                         case REQUEST_DATA_CALL_LIST_COMPLETE:
                             callback.onRequestDataCallListComplete(
                                     ar.exception != null
                                             ? DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE
-                                            : DataServiceCallback.RESULT_SUCCESS,
+                                            : RESULT_SUCCESS,
                                     ar.exception != null
                                             ? null : (List<DataCallResponse>) ar.result
                                     );
@@ -105,9 +111,14 @@
                         case DATA_CALL_LIST_CHANGED:
                             notifyDataCallListChanged((List<DataCallResponse>) ar.result);
                             break;
+                        case START_HANDOVER:
+                            callback.onHandoverStarted(toResultCode(ar.exception));
+                            break;
+                        case CANCEL_HANDOVER:
+                            callback.onHandoverCancelled(toResultCode(ar.exception));
+                            break;
                         default:
                             loge("Unexpected event: " + message.what);
-                            return;
                     }
                 }
             };
@@ -116,10 +127,31 @@
             mPhone.mCi.registerForDataCallListChanged(mHandler, DATA_CALL_LIST_CHANGED, null);
         }
 
+
+        /* Converts the result code for start handover and cancel handover */
+        @DataServiceCallback.ResultCode private int toResultCode(@Nullable Throwable t) {
+            if (t == null) {
+                return RESULT_SUCCESS;
+            } else {
+                if (t instanceof CommandException) {
+                    CommandException ce = (CommandException) t;
+                    if (ce.getCommandError() == CommandException.Error.REQUEST_NOT_SUPPORTED) {
+                        return DataServiceCallback.RESULT_ERROR_UNSUPPORTED;
+                    } else {
+                        return DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE;
+                    }
+                } else {
+                    loge("Throwable is of type " + t.getClass().getSimpleName()
+                            + " but should be CommandException");
+                    return DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE;
+                }
+            }
+        }
+
         @Override
-        public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
-                                  boolean allowRoaming, int reason, LinkProperties linkProperties,
-                                  DataServiceCallback callback) {
+        public void setupDataCall(int accessNetworkType, DataProfile dataProfile,
+                boolean isRoaming, boolean allowRoaming, int reason, LinkProperties linkProperties,
+                int pduSessionId, DataServiceCallback callback) {
             if (DBG) log("setupDataCall " + getSlotIndex());
 
             Message message = null;
@@ -131,7 +163,7 @@
             }
 
             mPhone.mCi.setupDataCall(accessNetworkType, dataProfile, isRoaming, allowRoaming,
-                    reason, linkProperties, message);
+                    reason, linkProperties, pduSessionId, message);
         }
 
         @Override
@@ -196,6 +228,31 @@
         }
 
         @Override
+        public void startHandover(int cid, DataServiceCallback callback) {
+            if (DBG) log("startHandover " + getSlotIndex());
+            Message message = null;
+            // Only obtain the message when the caller wants a callback. If the caller doesn't care
+            // the request completed or results, then no need to pass the message down.
+            if (callback != null) {
+                message = Message.obtain(mHandler, START_HANDOVER);
+                mCallbackMap.put(message, callback);
+            }
+            mPhone.mCi.startHandover(message, cid);
+        }
+
+        @Override
+        public void cancelHandover(int cid, DataServiceCallback callback) {
+            Message message = null;
+            // Only obtain the message when the caller wants a callback. If the caller doesn't care
+            // the request completed or results, then no need to pass the message down.
+            if (callback != null) {
+                message = Message.obtain(mHandler, CANCEL_HANDOVER);
+                mCallbackMap.put(message, callback);
+            }
+            mPhone.mCi.cancelHandover(message, cid);
+        }
+
+        @Override
         public void close() {
             mPhone.mCi.unregisterForDataCallListChanged(mHandler);
         }
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
index 6a7f472..d3fd4fb 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
@@ -19,7 +19,10 @@
 import static android.net.NetworkPolicyManager.SUBSCRIPTION_OVERRIDE_CONGESTED;
 import static android.net.NetworkPolicyManager.SUBSCRIPTION_OVERRIDE_UNMETERED;
 
+import static com.android.internal.telephony.dataconnection.DcTracker.REQUEST_TYPE_HANDOVER;
+
 import android.annotation.IntDef;
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -105,6 +108,7 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
 
 /**
  * {@hide}
@@ -273,6 +277,7 @@
     private DataServiceManager mDataServiceManager;
     private final int mTransportType;
     private LinkProperties mLinkProperties = new LinkProperties();
+    private int mPduSessionId;
     private long mCreateTime;
     private long mLastFailTime;
     @DataFailureCause
@@ -343,7 +348,10 @@
     static final int EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED = BASE + 31;
     static final int EVENT_CSS_INDICATOR_CHANGED = BASE + 32;
     static final int EVENT_UPDATE_SUSPENDED_STATE = BASE + 33;
-    private static final int CMD_TO_STRING_COUNT = EVENT_UPDATE_SUSPENDED_STATE - BASE + 1;
+    static final int EVENT_START_HANDOVER = BASE + 34;
+    static final int EVENT_CANCEL_HANDOVER = BASE + 35;
+    static final int EVENT_START_HANDOVER_ON_TARGET = BASE + 36;
+    private static final int CMD_TO_STRING_COUNT = EVENT_START_HANDOVER_ON_TARGET - BASE + 1;
 
     private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT];
     static {
@@ -389,6 +397,9 @@
                 "EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED";
         sCmdToString[EVENT_CSS_INDICATOR_CHANGED - BASE] = "EVENT_CSS_INDICATOR_CHANGED";
         sCmdToString[EVENT_UPDATE_SUSPENDED_STATE - BASE] = "EVENT_UPDATE_SUSPENDED_STATE";
+        sCmdToString[EVENT_START_HANDOVER - BASE] = "EVENT_START_HANDOVER";
+        sCmdToString[EVENT_CANCEL_HANDOVER - BASE] = "EVENT_CANCEL_HANDOVER";
+        sCmdToString[EVENT_START_HANDOVER_ON_TARGET - BASE] = "EVENT_START_HANDOVER_ON_TARGET";
     }
     // Convert cmd to string or null if unknown
     static String cmdToString(int cmd) {
@@ -573,6 +584,10 @@
         return ret;
     }
 
+    public int getPduSessionId() {
+        return mPduSessionId;
+    }
+
     @VisibleForTesting
     public UpdateLinkPropertyResult updateLinkProperty(DataCallResponse newState) {
         UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties);
@@ -609,6 +624,14 @@
         return result;
     }
 
+    void setPduSessionId(int pduSessionId) {
+        if (mPduSessionId != pduSessionId) {
+            logd("Changing pdu session id from: " + mPduSessionId + " to: " + pduSessionId + ", "
+                    + "Handover state: " + handoverStateToString(this.mHandoverState));
+            mPduSessionId = pduSessionId;
+        }
+    }
+
     /**
      * Read the MTU value from link properties where it can be set from network. In case
      * not set by the network, set it again using the mtu szie value defined in the APN
@@ -771,42 +794,47 @@
         // Check if this data setup is a handover.
         LinkProperties linkProperties = null;
         int reason = DataService.REQUEST_REASON_NORMAL;
-        if (cp.mRequestType == DcTracker.REQUEST_TYPE_HANDOVER) {
+        if (cp.mRequestType == REQUEST_TYPE_HANDOVER) {
             // If this is a data setup for handover, we need to pass the link properties
             // of the existing data connection to the modem.
-            DcTracker dcTracker = mPhone.getDcTracker(getHandoverSourceTransport());
-            if (dcTracker == null || cp.mApnContext == null) {
-                loge("connect: Handover failed. dcTracker=" + dcTracker + ", apnContext="
+            DcTracker srcDcTracker = mPhone.getDcTracker(getHandoverSourceTransport());
+            if (srcDcTracker == null || cp.mApnContext == null) {
+                loge("connect: Handover failed. dcTracker=" + srcDcTracker + ", apnContext="
                         + cp.mApnContext);
                 return DataFailCause.HANDOVER_FAILED;
             }
 
-            DataConnection dc = dcTracker.getDataConnectionByApnType(cp.mApnContext.getApnType());
-            if (dc == null) {
+
+            // srcDc is the source data connection while the current instance is the target
+            DataConnection srcDc =
+                    srcDcTracker.getDataConnectionByApnType(cp.mApnContext.getApnType());
+            if (srcDc == null) {
                 loge("connect: Can't find data connection for handover.");
                 return DataFailCause.HANDOVER_FAILED;
             }
 
-            // Preserve the potential network agent from the source data connection. The ownership
-            // is not transferred at this moment.
-            mHandoverSourceNetworkAgent = dc.getNetworkAgent();
-            if (mHandoverSourceNetworkAgent == null) {
-                loge("Cannot get network agent from the source dc " + dc.getName());
-                return DataFailCause.HANDOVER_FAILED;
-            }
+            // Helpful for logging purposes
+            DataServiceManager srcDsm = srcDc.mDataServiceManager;
+            String srcDsmTag = (srcDsm == null ? "(null)" : srcDsm.getTag());
+            logd("connect: REQUEST_TYPE_HANDOVER - Request handover from " + srcDc.getName()
+                    + ", targetDsm=" + mDataServiceManager.getTag()
+                    + ", sourceDsm=" + srcDsmTag);
 
-            linkProperties = dc.getLinkProperties();
-            if (linkProperties == null || linkProperties.getLinkAddresses().isEmpty()) {
-                loge("connect: Can't find link properties of handover data connection. dc="
-                        + dc);
-                return DataFailCause.HANDOVER_FAILED;
-            }
 
-            mHandoverLocalLog.log("Handover started. Preserved the agent.");
-            log("Get the handover source network agent: " + mHandoverSourceNetworkAgent);
-
-            dc.setHandoverState(HANDOVER_STATE_BEING_TRANSFERRED);
-            reason = DataService.REQUEST_REASON_HANDOVER;
+            /* startHandover is called on the source data connection, and if successful,
+               we ask the target data connection (which is the current instance) to call
+               #setupDataCall with request type handover.
+            */
+            Consumer<Integer> onCompleted = (dataServiceCallbackResultCode) ->
+                    /* startHandover is called on the srcDc handler, but the callback needs to
+                       be called on the current (which is the targetDc) handler which is why we
+                       call sendRunnableMessage. */
+                    sendRunnableMessage(EVENT_START_HANDOVER_ON_TARGET,
+                        (inCorrectState) -> requestHandover(inCorrectState, srcDc,
+                            dataServiceCallbackResultCode,
+                            cp, msg, dp, isModemRoaming, allowRoaming));
+            srcDc.startHandover(onCompleted);
+            return DataFailCause.NONE;
         }
 
         mDataServiceManager.setupDataCall(
@@ -816,12 +844,129 @@
                 allowRoaming,
                 reason,
                 linkProperties,
+                DataCallResponse.PDU_SESSION_ID_NOT_SET,
                 msg);
         TelephonyMetrics.getInstance().writeSetupDataCall(mPhone.getPhoneId(), cp.mRilRat,
                 dp.getProfileId(), dp.getApn(), dp.getProtocolType());
         return DataFailCause.NONE;
     }
 
+    private void requestHandover(boolean inCorrectState, DataConnection srcDc,
+            @DataServiceCallback.ResultCode int resultCode,
+            ConnectionParams cp, Message msg, DataProfile dp, boolean isModemRoaming,
+            boolean allowRoaming) {
+
+        if (!inCorrectState) {
+            logd("requestHandover: Not in correct state");
+            if (isResultCodeSuccess(resultCode)) {
+                if (srcDc != null) {
+                    logd("requestHandover: Not in correct state - Success result code");
+                    // We need to cancel the handover on source if we ended up in the wrong state.
+                    srcDc.cancelHandover();
+                } else {
+                    logd("requestHandover: Not in correct state - Success result code - "
+                            + "srcdc = null");
+                }
+            }
+            notifyConnectCompleted(cp, DataFailCause.UNKNOWN,
+                    DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, false);
+            return;
+        } else if (!isResultCodeSuccess(resultCode)) {
+            if (DBG) {
+                logd("requestHandover: Non success result code from DataService, "
+                        + "setupDataCall will not be called, result code = "
+                        + DataServiceCallback.resultCodeToString(resultCode));
+            }
+            notifyConnectCompleted(cp, DataFailCause.UNKNOWN,
+                    DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, false);
+            return;
+        }
+
+        if (srcDc == null) {
+            return;
+        }
+
+        LinkProperties linkProperties;
+        int reason;
+
+        // Preserve the potential network agent from the source data connection. The ownership
+        // is not transferred at this moment.
+        mHandoverSourceNetworkAgent = srcDc.getNetworkAgent();
+        if (mHandoverSourceNetworkAgent == null) {
+            loge("requestHandover: Cannot get network agent from the source dc " + srcDc.getName());
+            notifyConnectCompleted(cp, DataFailCause.UNKNOWN,
+                    DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, false);
+            return;
+        }
+
+        linkProperties = srcDc.getLinkProperties();
+        if (linkProperties == null || linkProperties.getLinkAddresses().isEmpty()) {
+            loge("requestHandover: Can't find link properties of handover data connection. dc="
+                    + srcDc);
+            notifyConnectCompleted(cp, DataFailCause.UNKNOWN,
+                    DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN, false);
+            return;
+        }
+
+        mHandoverLocalLog.log("Handover started. Preserved the agent.");
+        log("Get the handover source network agent: " + mHandoverSourceNetworkAgent);
+
+        reason = DataService.REQUEST_REASON_HANDOVER;
+
+        mDataServiceManager.setupDataCall(
+                ServiceState.rilRadioTechnologyToAccessNetworkType(cp.mRilRat),
+                dp,
+                isModemRoaming,
+                allowRoaming,
+                reason,
+                linkProperties,
+                srcDc.getPduSessionId(),
+                msg);
+        TelephonyMetrics.getInstance().writeSetupDataCall(mPhone.getPhoneId(), cp.mRilRat,
+                dp.getProfileId(), dp.getApn(), dp.getProtocolType());
+    }
+
+    /**
+     * Called on the source data connection from the target data connection.
+     */
+    private void startHandover(Consumer<Integer> onTargetDcComplete) {
+        logd("startHandover: " + toStringSimple());
+        // Set the handover state to being transferred on "this" data connection which is the src.
+        setHandoverState(HANDOVER_STATE_BEING_TRANSFERRED);
+
+        Consumer<Integer> onSrcDcComplete =
+                resultCode -> onHandoverStarted(resultCode, onTargetDcComplete);
+        /*
+            The flow here is:
+            srcDc#startHandover -> dataService#startHandover -> (onHandoverStarted) ->
+                onSrcDcComplete -> onTargetDcComplete
+         */
+        mDataServiceManager.startHandover(mCid,
+                this.obtainMessage(EVENT_START_HANDOVER,
+                        onSrcDcComplete));
+    }
+
+    /**
+     * Called on the source data connection when the async call to start handover is complete
+     */
+    private void onHandoverStarted(@DataServiceCallback.ResultCode int resultCode,
+            Consumer<Integer> onTargetDcComplete) {
+        logd("onHandoverStarted: " + toStringSimple());
+        if (!isResultCodeSuccess(resultCode)) {
+            setHandoverState(HANDOVER_STATE_IDLE);
+        }
+        onTargetDcComplete.accept(resultCode);
+    }
+
+    private void cancelHandover() {
+        if (mHandoverState != HANDOVER_STATE_BEING_TRANSFERRED) {
+            logd("cancelHandover: handover state is " + handoverStateToString(mHandoverState)
+                    + ", expecting HANDOVER_STATE_BEING_TRANSFERRED");
+        }
+        mDataServiceManager.cancelHandover(mCid, this.obtainMessage(EVENT_CANCEL_HANDOVER));
+        setHandoverState(HANDOVER_STATE_IDLE);
+    }
+
     public void onSubscriptionOverride(int overrideMask, int overrideValue) {
         mSubscriptionOverride = (mSubscriptionOverride & ~overrideMask)
                 | (overrideValue & overrideMask);
@@ -959,6 +1104,10 @@
         if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp);
     }
 
+    private void sendRunnableMessage(int eventCode, @NonNull final Consumer<Boolean> r) {
+        sendMessage(eventCode, r);
+    }
+
     /*
      * **************************************************************************
      * Begin Members and methods owned by DataConnectionTracker but stored
@@ -1048,12 +1197,20 @@
             if (DBG) log("onSetupConnectionCompleted received successful DataCallResponse");
             mCid = response.getId();
             updatePcscfAddr(response);
+
             result = updateLinkProperty(response).setupResult;
+
+            setPduSessionId(response.getPduSessionId());
         }
 
         return result;
     }
 
+    private static boolean isResultCodeSuccess(int resultCode) {
+        return resultCode == DataServiceCallback.RESULT_SUCCESS
+                || resultCode == DataServiceCallback.RESULT_ERROR_UNSUPPORTED;
+    }
+
     private boolean isDnsOk(String[] domainNameServers) {
         if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1])
                 && !mPhone.isDnsCheckDisabled()) {
@@ -1817,6 +1974,29 @@
                                 + " mRilRat=" + mRilRat);
                     }
                     break;
+
+                case EVENT_START_HANDOVER:  //calls startHandover()
+                    if (DBG) {
+                        log("DcDefaultState: EVENT_START_HANDOVER not expected.");
+                    }
+                    Consumer<Integer> r = (Consumer<Integer>) msg.obj;
+                    r.accept(DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE);
+                    break;
+                case EVENT_START_HANDOVER_ON_TARGET:
+                    if (DBG) {
+                        log("DcDefaultState: EVENT_START_HANDOVER not expected, but will "
+                                + "clean up, result code: "
+                                + DataServiceCallback.resultCodeToString(msg.arg1));
+                    }
+                    ((Consumer<Boolean>) msg.obj).accept(false /* is in correct state*/);
+                    break;
+                case EVENT_CANCEL_HANDOVER:
+                    // We don't need to do anything in this case
+                    if (DBG) {
+                        log("DcDefaultState: EVENT_CANCEL_HANDOVER resultCode="
+                                + DataServiceCallback.resultCodeToString(msg.arg1));
+                    }
+                    break;
                 default:
                     if (DBG) {
                         log("DcDefaultState: ignore msg.what=" + getWhatToString(msg.what));
@@ -1907,7 +2087,7 @@
                     mHandoverLocalLog.log(
                             "Handover failed. Reset the source dc " + sourceDc.getName()
                                     + " state to idle");
-                    sourceDc.setHandoverState(HANDOVER_STATE_IDLE);
+                    sourceDc.cancelHandover();
                 } else {
                     // The agent is now a dangling agent. No data connection owns this agent.
                     // Gracefully notify connectivity service disconnected.
@@ -1927,7 +2107,8 @@
                     log("DcInactiveState: enter notifyConnectCompleted +ALL failCause="
                             + mDcFailCause);
                 }
-                notifyConnectCompleted(mConnectionParams, mDcFailCause, mHandoverFailureMode, true);
+                notifyConnectCompleted(mConnectionParams, mDcFailCause, mHandoverFailureMode,
+                        true);
             }
             if (mDisconnectParams != null) {
                 if (DBG) {
@@ -2148,6 +2329,11 @@
                     mAdministratorUids = Arrays.copyOf(administratorUids, administratorUids.length);
                     retVal = HANDLED;
                     break;
+                case EVENT_START_HANDOVER_ON_TARGET:
+                    //called after startHandover on target transport
+                    ((Consumer<Boolean>) msg.obj).accept(true /* is in correct state*/);
+                    retVal = HANDLED;
+                    break;
                 default:
                     if (VDBG) {
                         log("DcActivatingState not handled msg.what=" +
@@ -2219,7 +2405,7 @@
             }
 
             if (mConnectionParams != null
-                    && mConnectionParams.mRequestType == DcTracker.REQUEST_TYPE_HANDOVER) {
+                    && mConnectionParams.mRequestType == REQUEST_TYPE_HANDOVER) {
                 // If this is a data setup for handover, we need to reuse the existing network agent
                 // instead of creating a new one. This should be transparent to connectivity
                 // service.
@@ -2657,6 +2843,11 @@
                     }
                     retVal = HANDLED;
                     break;
+                case EVENT_START_HANDOVER:  //calls startHandover()
+                    Consumer<Integer> r = (Consumer<Integer>) msg.obj;
+                    r.accept(msg.arg1);
+                    retVal = HANDLED;
+                    break;
                 default:
                     if (VDBG) {
                         log("DcActiveState not handled msg.what=" + getWhatToString(msg.what));
@@ -2952,8 +3143,10 @@
 
     void setHandoverState(@HandoverState int state) {
         if (mHandoverState != state) {
-            mHandoverLocalLog.log("State changed from " + handoverStateToString(mHandoverState)
-                    + " to " + handoverStateToString(state));
+            String logStr = "State changed from " + handoverStateToString(mHandoverState)
+                    + " to " + handoverStateToString(state);
+            mHandoverLocalLog.log(logStr);
+            logd(logStr);
             mHandoverState = state;
         }
     }
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataServiceManager.java b/src/java/com/android/internal/telephony/dataconnection/DataServiceManager.java
index 78f0e02..0b4bc0a 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataServiceManager.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataServiceManager.java
@@ -20,6 +20,7 @@
 import static android.text.format.DateUtils.SECOND_IN_MILLIS;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.app.AppOpsManager;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -108,6 +109,16 @@
 
     private CellularDataServiceConnection mServiceConnection;
 
+    /**
+     * Helpful for logging
+     * @return the tag name
+     *
+     * @hide
+     */
+    public String getTag() {
+        return mTag;
+    }
+
     private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -290,6 +301,20 @@
             mDataCallListChangedRegistrants.notifyRegistrants(
                     new AsyncResult(null, dataCallList, null));
         }
+
+        @Override
+        public void onHandoverStarted(@DataServiceCallback.ResultCode int resultCode) {
+            if (DBG) log("onHandoverStarted. resultCode = " + resultCode);
+            Message msg = mMessageMap.remove(asBinder());
+            sendCompleteMessage(msg, resultCode);
+        }
+
+        @Override
+        public void onHandoverCancelled(@DataServiceCallback.ResultCode int resultCode) {
+            if (DBG) log("onHandoverCancelled. resultCode = " + resultCode);
+            Message msg = mMessageMap.remove(asBinder());
+            sendCompleteMessage(msg, resultCode);
+        }
     }
 
     /**
@@ -551,7 +576,7 @@
         return className;
     }
 
-    private void sendCompleteMessage(Message msg, int code) {
+    private void sendCompleteMessage(Message msg, @DataServiceCallback.ResultCode int code) {
         if (msg != null) {
             msg.arg1 = code;
             msg.sendToTarget();
@@ -572,15 +597,18 @@
      *        {@link DataService#REQUEST_REASON_HANDOVER}.
      * @param linkProperties If {@code reason} is {@link DataService#REQUEST_REASON_HANDOVER}, this
      *        is the link properties of the existing data connection, otherwise null.
+     * @param pduSessionId The pdu session id to be used for this data call.  A value of -1 means
+     *                     no pdu session id was attached to this call.
+     *                     Reference: 3GPP TS 24.007 section 11.2.3.1b
      * @param onCompleteMessage The result message for this request. Null if the client does not
      *        care about the result.
      */
     public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
                               boolean allowRoaming, int reason, LinkProperties linkProperties,
-                              Message onCompleteMessage) {
+                              int pduSessionId, Message onCompleteMessage) {
         if (DBG) log("setupDataCall");
         if (!mBound) {
-            loge("Data service not bound.");
+            loge("setupDataCall: Data service not bound.");
             sendCompleteMessage(onCompleteMessage, DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE);
             return;
         }
@@ -593,9 +621,9 @@
             sendMessageDelayed(obtainMessage(EVENT_WATCHDOG_TIMEOUT, callback),
                     REQUEST_UNRESPONDED_TIMEOUT);
             mIDataService.setupDataCall(mPhone.getPhoneId(), accessNetworkType, dataProfile,
-                    isRoaming, allowRoaming, reason, linkProperties, callback);
+                    isRoaming, allowRoaming, reason, linkProperties, pduSessionId, callback);
         } catch (RemoteException e) {
-            loge("Cannot invoke setupDataCall on data service.");
+            loge("setupDataCall: Cannot invoke setupDataCall on data service.");
             mMessageMap.remove(callback.asBinder());
             sendCompleteMessage(onCompleteMessage, DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE);
         }
@@ -639,6 +667,91 @@
     }
 
     /**
+     * Indicates that a handover has begun.  This is called on the source transport.
+     *
+     * Any resources being transferred cannot be released while a
+     * handover is underway.
+     *
+     * If a handover was unsuccessful, then the framework calls DataServiceManager#cancelHandover.
+     * The target transport retains ownership over any of the resources being transferred.
+     *
+     * If a handover was successful, the framework calls DataServiceManager#deactivateDataCall with
+     * reason HANDOVER. The target transport now owns the transferred resources and is
+     * responsible for releasing them.
+     *
+     * @param cid The identifier of the data call which is provided in DataCallResponse
+     * @param onCompleteMessage The result callback for this request.
+     */
+    public void startHandover(int cid, @NonNull Message onCompleteMessage) {
+        CellularDataServiceCallback callback =
+                setupCallbackHelper("startHandover", onCompleteMessage);
+        if (callback == null) {
+            loge("startHandover: callback == null");
+            sendCompleteMessage(onCompleteMessage, DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE);
+            return;
+        }
+
+        try {
+            sendMessageDelayed(obtainMessage(EVENT_WATCHDOG_TIMEOUT, callback),
+                    REQUEST_UNRESPONDED_TIMEOUT);
+            mIDataService.startHandover(mPhone.getPhoneId(), cid, callback);
+        } catch (RemoteException e) {
+            loge("Cannot invoke startHandover on data service.");
+            mMessageMap.remove(callback.asBinder());
+            sendCompleteMessage(onCompleteMessage, DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE);
+        }
+    }
+
+    /**
+     * Indicates that a handover was cancelled after a call to DataServiceManager#startHandover.
+     * This is called on the source transport.
+     *
+     * Since the handover was unsuccessful, the source transport retains ownership over any of
+     * the resources being transferred and is still responsible for releasing them.
+     *
+     * @param cid The identifier of the data call which is provided in DataCallResponse
+     * @param onCompleteMessage The result callback for this request.
+     */
+    public void cancelHandover(int cid, @NonNull Message onCompleteMessage) {
+        CellularDataServiceCallback callback =
+                setupCallbackHelper("cancelHandover", onCompleteMessage);
+        if (callback == null) {
+            sendCompleteMessage(onCompleteMessage, DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE);
+            return;
+        }
+
+        try {
+            sendMessageDelayed(obtainMessage(EVENT_WATCHDOG_TIMEOUT, callback),
+                    REQUEST_UNRESPONDED_TIMEOUT);
+            mIDataService.cancelHandover(mPhone.getPhoneId(), cid, callback);
+        } catch (RemoteException e) {
+            loge("Cannot invoke cancelHandover on data service.");
+            mMessageMap.remove(callback.asBinder());
+            sendCompleteMessage(onCompleteMessage, DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE);
+        }
+    }
+
+    @Nullable
+    private CellularDataServiceCallback setupCallbackHelper(
+            @NonNull final String operationName, @NonNull final Message onCompleteMessage) {
+        if (DBG) log(operationName);
+        if (!mBound) {
+            sendCompleteMessage(onCompleteMessage, DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE);
+            return null;
+        }
+
+        CellularDataServiceCallback callback =
+                new CellularDataServiceCallback(operationName);
+        if (onCompleteMessage != null) {
+            if (DBG) log(operationName + ": onCompleteMessage set");
+            mMessageMap.put(callback.asBinder(), onCompleteMessage);
+        } else {
+            if (DBG) log(operationName + ": onCompleteMessage not set");
+        }
+        return callback;
+    }
+
+    /**
      * Set an APN to initial attach network.
      *
      * @param dataProfile Data profile used for data call setup. See {@link DataProfile}.
diff --git a/src/java/com/android/internal/telephony/dataconnection/DcController.java b/src/java/com/android/internal/telephony/dataconnection/DcController.java
index 3505453..59dafca 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DcController.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DcController.java
@@ -296,7 +296,11 @@
                         }
                     }
                 } else {
+                    // Update the pdu session id
+                    dc.setPduSessionId(newState.getPduSessionId());
+
                     dc.updatePcscfAddr(newState);
+
                     // Its active so update the DataConnections link properties
                     UpdateLinkPropertyResult result = dc.updateLinkProperty(newState);
                     if (result.oldLp.equals(result.newLp)) {
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
index 9dcb06f..e9cf8b0 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
@@ -31,9 +31,9 @@
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.RadioCapability;
 import com.android.internal.telephony.UUSInfo;
-import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
 import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
 import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
+import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
 
 /**
  * Volte doesn't need CommandsInterface. The class does nothing but made to work
@@ -283,7 +283,7 @@
     @Override
     public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
                               boolean allowRoaming, int reason, LinkProperties linkProperties,
-                              Message result) {
+                              int pduSessionId, Message result) {
     }
 
     @Override
@@ -663,4 +663,20 @@
     @Override
     public void stopNattKeepalive(int sessionHandle, Message result) {
     }
+
+    @Override
+    public void allocatePduSessionId(Message result) {
+    }
+
+    @Override
+    public void releasePduSessionId(Message result, int pduSessionId) {
+    }
+
+    @Override
+    public void startHandover(Message result, int callId) {
+    }
+
+    @Override
+    public void cancelHandover(Message result, int callId) {
+    }
 }
diff --git a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
index e57c12f..e4dfae7 100644
--- a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
+++ b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
@@ -30,9 +30,9 @@
 import com.android.internal.telephony.BaseCommands;
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.UUSInfo;
-import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
 import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
 import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
+import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
 
 /**
  * SIP doesn't need CommandsInterface. The class does nothing but made to work
@@ -284,7 +284,7 @@
     @Override
     public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
                               boolean allowRoaming, int reason, LinkProperties linkProperties,
-                              Message result) {
+                              int pduSessionId, Message result) {
     }
 
     @Override
@@ -663,4 +663,20 @@
     @Override
     public void stopNattKeepalive(int sessionHandle, Message result) {
     }
+
+    @Override
+    public void allocatePduSessionId(Message result) {
+    }
+
+    @Override
+    public void releasePduSessionId(Message result, int pduSessionId) {
+    }
+
+    @Override
+    public void startHandover(Message result, int callId) {
+    }
+
+    @Override
+    public void cancelHandover(Message result, int callId) {
+    }
 }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/RILTest.java b/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
index d74b5ff..cc693b8 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
@@ -2505,7 +2505,8 @@
                 .build();
 
         mRILUnderTest.setupDataCall(AccessNetworkConstants.AccessNetworkType.EUTRAN, dp, false,
-                false, 0, null, obtainMessage());
+                false, 0, null,
+                DataCallResponse.PDU_SESSION_ID_NOT_SET, obtainMessage());
         ArgumentCaptor<DataProfileInfo> dpiCaptor = ArgumentCaptor.forClass(DataProfileInfo.class);
         verify(mRadioProxy).setupDataCall(
                 mSerialNumberCaptor.capture(), eq(AccessNetworkConstants.AccessNetworkType.EUTRAN),
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommands.java b/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommands.java
index 029812d..e231599 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommands.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommands.java
@@ -1177,10 +1177,10 @@
     @Override
     public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
                               boolean allowRoaming, int reason, LinkProperties linkProperties,
-                              Message result) {
+                              int pduSessionId, Message result) {
 
         SimulatedCommandsVerifier.getInstance().setupDataCall(accessNetworkType, dataProfile,
-                isRoaming, allowRoaming, reason, linkProperties, result);
+                isRoaming, allowRoaming, reason, linkProperties, pduSessionId, result);
 
         if (mSetupDataCallResult == null) {
             try {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommandsVerifier.java b/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommandsVerifier.java
index 314ae28..632e13f 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommandsVerifier.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommandsVerifier.java
@@ -31,9 +31,9 @@
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.RadioCapability;
 import com.android.internal.telephony.UUSInfo;
-import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
 import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
 import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
+import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
 
 public class SimulatedCommandsVerifier implements CommandsInterface {
     private static SimulatedCommandsVerifier sInstance;
@@ -1181,7 +1181,7 @@
     @Override
     public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
                               boolean allowRoaming, int reason, LinkProperties linkProperties,
-                              Message result) {
+                              int pduSessionId, Message result) {
     }
 
     @Override
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java
index 2939ff5..68a8fc5 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java
@@ -385,7 +385,8 @@
         ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.UTRAN), dpCaptor.capture(), eq(false),
-                eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class));
+                eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
+                anyInt(), any(Message.class));
 
         assertEquals("spmode.ne.jp", dpCaptor.getValue().getApn());
 
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 a3f2e72..6b0cda0 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java
@@ -691,7 +691,7 @@
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), any(DataProfile.class),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
     }
 
     // Test the normal data call setup scenario.
@@ -720,7 +720,7 @@
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
 
         verifyDataConnected(FAKE_APN1);
@@ -762,7 +762,7 @@
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
 
         // This time we'll let RIL command succeed.
@@ -781,7 +781,7 @@
         verify(mSimulatedCommandsVerifier, times(2)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN2, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
 
         // Verify connected with APN2 setting.
@@ -806,7 +806,7 @@
         verify(mSimulatedCommandsVerifier, times(2)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, NETWORK_TYPE_LTE_BITMASK);
 
         logd("Sending DATA_DISABLED_CMD");
@@ -842,7 +842,7 @@
         verify(mSimulatedCommandsVerifier, times(2)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
 
 
         List<DataProfile> dataProfiles = dpCaptor.getAllValues();
@@ -888,7 +888,7 @@
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT));
         assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_MMS));
     }
@@ -918,7 +918,7 @@
         verify(mSimulatedCommandsVerifier, times(2)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
 
         //user is in roaming
@@ -969,7 +969,7 @@
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN3, 2, 64, 0, 0);
 
         assertTrue(mDct.isAnyDataConnected());
@@ -1018,7 +1018,7 @@
         verify(mSimulatedCommandsVerifier, times(2)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, NETWORK_TYPE_LTE_BITMASK);
         assertTrue(mDct.isAnyDataConnected());
 
@@ -1066,7 +1066,7 @@
 
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), any(DataProfile.class), eq(false), eq(false),
-                eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class));
+                eq(DataService.REQUEST_REASON_NORMAL), any(), anyInt(), any(Message.class));
     }
 
     // Test the XCAP APN setup.
@@ -1080,7 +1080,7 @@
 
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), any(DataProfile.class), eq(false), eq(false),
-                eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class));
+                eq(DataService.REQUEST_REASON_NORMAL), any(), anyInt(), any(Message.class));
     }
 
     @Test
@@ -1119,7 +1119,7 @@
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), any(DataProfile.class),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
     }
 
     // Test the unmetered default APN setup when data is disabled. Default APN should always honor
@@ -1141,7 +1141,7 @@
         verify(mSimulatedCommandsVerifier, never()).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), any(DataProfile.class),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
     }
 
 
@@ -1162,7 +1162,7 @@
 
         verify(mSimulatedCommandsVerifier, times(0)).setupDataCall(anyInt(), any(DataProfile.class),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
     }
 
     // Test the restricted data request when data is disabled.
@@ -1189,7 +1189,7 @@
         waitForMs(200);
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(anyInt(), any(DataProfile.class),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
     }
 
     // Test the restricted data request when roaming is disabled.
@@ -1217,7 +1217,7 @@
         waitForMs(200);
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(anyInt(), any(DataProfile.class),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
     }
 
     // Test the default data when data is not connectable.
@@ -1234,7 +1234,7 @@
 
         verify(mSimulatedCommandsVerifier, times(0)).setupDataCall(anyInt(), any(DataProfile.class),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
     }
 
     // Test the default data on IWLAN.
@@ -1257,7 +1257,7 @@
 
         verify(mSimulatedCommandsVerifier, times(0)).setupDataCall(anyInt(), any(DataProfile.class),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
     }
 
     // Test the default data when the phone is in ECBM.
@@ -1274,7 +1274,7 @@
 
         verify(mSimulatedCommandsVerifier, times(0)).setupDataCall(anyInt(), any(DataProfile.class),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
     }
 
     // Test update waiting apn list when on data rat change
@@ -1301,7 +1301,7 @@
         verify(mSimulatedCommandsVerifier).setupDataCall(
                 eq(AccessNetworkType.CDMA2000), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN4, 0, 21, 2, NETWORK_TYPE_EHRPD_BITMASK);
         assertTrue(mDct.isAnyDataConnected());
 
@@ -1338,7 +1338,7 @@
         verify(mSimulatedCommandsVerifier).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
         assertTrue(mDct.isAnyDataConnected());
     }
@@ -1516,7 +1516,7 @@
         verify(mSimulatedCommandsVerifier).setupDataCall(
                 eq(AccessNetworkType.CDMA2000), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN4, 0, 21, 2, NETWORK_TYPE_EHRPD_BITMASK);
         assertTrue(mDct.isAnyDataConnected());
 
@@ -1642,7 +1642,7 @@
         verify(mSimulatedCommandsVerifier, times(2)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
 
         logd("Sending EVENT_NETWORK_STATUS_CHANGED");
@@ -1681,7 +1681,7 @@
         verify(mSimulatedCommandsVerifier, timeout(TEST_TIMEOUT).times(2)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
 
@@ -1722,7 +1722,7 @@
         verify(mSimulatedCommandsVerifier, timeout(TEST_TIMEOUT).times(2)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
 
         logd("Sending EVENT_NETWORK_STATUS_CHANGED false");
@@ -1760,7 +1760,7 @@
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
 
         logd("Sending EVENT_NETWORK_STATUS_CHANGED false");
@@ -1793,7 +1793,7 @@
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
 
         logd("Sending EVENT_NETWORK_STATUS_CHANGED false");
@@ -2146,7 +2146,7 @@
         verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
                 eq(AccessNetworkType.EUTRAN), dpCaptor.capture(),
                 eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(),
-                any(Message.class));
+                anyInt(), any(Message.class));
         verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK);
 
         verifyDataConnected(FAKE_APN1);
