diff --git a/radio/1.0/IRadio.hal b/radio/1.0/IRadio.hal
index 38c36e8..d2ffa82 100644
--- a/radio/1.0/IRadio.hal
+++ b/radio/1.0/IRadio.hal
@@ -21,8 +21,7 @@
 
 /*
  * This interface is used by telephony & telecom to talk to cellular radio.
- * All the functions have minimum two parameters:
- * slotId: which corresponds to sim slot id.
+ * All the functions have minimum one parameter:
  * serial: which corresponds to serial no. of request. Serial numbers must only be memorized for the
  * duration of a method call. If clients provide colliding serials (including passing the same
  * serial to different methods), multiple responses (one for each method call) must still be served.
@@ -31,28 +30,25 @@
     /*
      * Set response functions for radio requests & radio indications.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param radioResponse Object containing response functions
      * @param radioIndication Object containing radio indications
      */
-    setResponseFunctions(int32_t slotId, IRadioResponse radioResponse,
+    setResponseFunctions(IRadioResponse radioResponse,
             IRadioIndication radioIndication);
 
     /*
      * Requests status of the ICC card
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getIccCardStatusResponse()
      *
      */
-    oneway getIccCardStatus(int32_t slotId, int32_t serial);
+    oneway getIccCardStatus(int32_t serial);
 
     /*
      * Supplies ICC PIN. Only called if CardStatus has AppState.PIN state
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param pin PIN value
      * @param aid AID value, See ETSI 102.221 8.1 and 101.220 4, empty string if no value.
@@ -60,12 +56,11 @@
      * Response function is IRadioResponse.supplyIccPinForAppResponse()
      *
      */
-    oneway supplyIccPinForApp(int32_t slotId, int32_t serial, string pin, string aid);
+    oneway supplyIccPinForApp(int32_t serial, string pin, string aid);
 
     /*
      * Supplies ICC PUK and new PIN.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param puk PUK value
      * @param pin New PIN value
@@ -74,13 +69,12 @@
      * Response function is IRadioResponse.supplyIccPukForAppResponse()
      *
      */
-    oneway supplyIccPukForApp(int32_t slotId, int32_t serial, string puk, string pin, string aid);
+    oneway supplyIccPukForApp(int32_t serial, string puk, string pin, string aid);
 
     /*
      * Supplies ICC PIN2. Only called following operation where SIM_PIN2 was
      * returned as a a failure from a previous operation.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param pin2 PIN2 value
      * @param aid AID value, See ETSI 102.221 8.1 and 101.220 4, empty string if no value.
@@ -88,12 +82,11 @@
      * Response function is IRadioResponse.supplyIccPin2ForAppResponse()
      *
      */
-    oneway supplyIccPin2ForApp(int32_t slotId, int32_t serial, string pin2, string aid);
+    oneway supplyIccPin2ForApp(int32_t serial, string pin2, string aid);
 
     /*
      * Supplies ICC PUK2 and new PIN2.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param puk2 PUK2 value
      * @param pin2 New PIN2 value
@@ -102,13 +95,12 @@
      * Response function is IRadioResponse.supplyIccPuk2ForAppResponse()
      *
      */
-    oneway supplyIccPuk2ForApp(int32_t slotId, int32_t serial, string puk2, string pin2,
+    oneway supplyIccPuk2ForApp(int32_t serial, string puk2, string pin2,
             string aid);
 
     /*
      * Supplies old ICC PIN and new PIN.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param oldPin Old pin value
      * @param newPin New pin value
@@ -117,13 +109,12 @@
      * Response function is IRadioResponse.changeIccPinForAppResponse()
      *
      */
-    oneway changeIccPinForApp(int32_t slotId, int32_t serial, string oldPin, string newPin,
+    oneway changeIccPinForApp(int32_t serial, string oldPin, string newPin,
             string aid);
 
     /*
      * Supplies old ICC PIN2 and new PIN2.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param oldPin2 Old pin2 value
      * @param newPin2 New pin2 value
@@ -132,97 +123,90 @@
      * Response function is IRadioResponse.changeIccPin2ForAppResponse()
      *
      */
-    oneway changeIccPin2ForApp(int32_t slotId, int32_t serial, string oldPin2, string newPin2,
+    oneway changeIccPin2ForApp(int32_t serial, string oldPin2, string newPin2,
             string aid);
 
     /*
      * Requests that network personalization be deactivated
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param netPin Network depersonlization code
      *
      * Response function is IRadioResponse.supplyNetworkDepersonalizationResponse()
      *
      */
-    oneway supplyNetworkDepersonalization(int32_t slotId, int32_t serial, string netPin);
+    oneway supplyNetworkDepersonalization(int32_t serial, string netPin);
 
     /*
      * Requests current call list
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getCurrentCallsResponse()
      *
      */
-    oneway getCurrentCalls(int32_t slotId, int32_t serial);
+    oneway getCurrentCalls(int32_t serial);
 
     /*
      * Initiate voice call.
      * This method is never used for supplementary service codes
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param dialInfo Dial struct
      *
      * Response function is IRadioResponse.dialResponse()
      *
      */
-    oneway dial(int32_t slotId, int32_t serial, Dial dialInfo);
+    oneway dial(int32_t serial, Dial dialInfo);
 
     /*
      * Get the SIM IMSI
      * Only valid when radio state is "RADIO_STATE_ON"
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param aid AID value, See ETSI 102.221 8.1 and 101.220 4, empty string if no value.
      *
      * Response function is IRadioResponse.getImsiForAppResponse()
      *
      */
-    oneway getImsiForApp(int32_t slotId, int32_t serial, string aid);
+    oneway getImsiForApp(int32_t serial, string aid);
 
     /*
      * Hang up a specific line (like AT+CHLD=1x)
      * After this HANGUP request returns, Radio must show the connection is NOT
      * active anymore in next requestGetCurrentCalls query.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param gsmIndex Connection index (value of 'x' in CHLD above)
      *
      * Response function is IRadioResponse.hangupResponse()
      *
      */
-    oneway hangup(int32_t slotId, int32_t serial, int32_t gsmIndex);
+    oneway hangup(int32_t serial, int32_t gsmIndex);
 
     /*
      * Hang up waiting or held (like AT+CHLD=0)
      * After this HANGUP request returns, Radio must show the connection is NOT
      * active anymore in next getCurrentCalls() query.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.hangupWaitingOrBackgroundResponse()
      *
      */
-    oneway hangupWaitingOrBackground(int32_t slotId, int32_t serial);
+    oneway hangupWaitingOrBackground(int32_t serial);
 
     /*
      * Hang up waiting or held (like AT+CHLD=1)
      * After this HANGUP request returns, Radio must show the connection is NOT
      * active anymore in next getCurrentCalls query.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.hangupForegroundResumeBackgroundResponse()
      *
      */
-    oneway hangupForegroundResumeBackground(int32_t slotId, int32_t serial);
+    oneway hangupForegroundResumeBackground(int32_t serial);
 
     /*
      * Switch waiting or holding call and active call (like AT+CHLD=2)
@@ -238,88 +222,80 @@
      * ACTIVE   IDLE                   HOLDING     IDLE
      * IDLE     IDLE                   IDLE        IDLE
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.switchWaitingOrHoldingAndActiveResponse()
      *
      */
-    oneway switchWaitingOrHoldingAndActive(int32_t slotId, int32_t serial);
+    oneway switchWaitingOrHoldingAndActive(int32_t serial);
 
     /*
      * Conference holding and active (like AT+CHLD=3)
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.conferenceResponse()
      *
      */
-    oneway conference(int32_t slotId, int32_t serial);
+    oneway conference(int32_t serial);
 
     /*
      * Send UDUB (user determined user busy) to ringing or
      * waiting call answer)
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.rejectCallResponse()
      *
      */
-    oneway rejectCall(int32_t slotId, int32_t serial);
+    oneway rejectCall(int32_t serial);
 
     /*
      * Requests the failure cause code for the most recently terminated call.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getLastCallFailCauseResponse()
      *
      */
-    oneway getLastCallFailCause(int32_t slotId, int32_t serial);
+    oneway getLastCallFailCause(int32_t serial);
 
     /*
      * Requests current signal strength and associated information.
      * Must succeed if radio is on.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getSignalStrengthResponse()
      */
-    oneway getSignalStrength(int32_t slotId, int32_t serial);
+    oneway getSignalStrength(int32_t serial);
 
     /*
      * Request current voice registration state
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getVoiceRegistrationStateResponse()
      */
-    oneway getVoiceRegistrationState(int32_t slotId, int32_t serial);
+    oneway getVoiceRegistrationState(int32_t serial);
 
     /*
      * Request current data registration state
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getDataRegistrationStateResponse()
      */
-    oneway getDataRegistrationState(int32_t slotId, int32_t serial);
+    oneway getDataRegistrationState(int32_t serial);
 
     /*
      * Request current operator ONS or EONS
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getOperatorResponse()
      */
-    oneway getOperator(int32_t slotId, int32_t serial);
+    oneway getOperator(int32_t serial);
 
     /*
      * Toggle radio on and off (for "airplane" mode)
@@ -328,13 +304,12 @@
      * any voice and data calls must be terminated and all associated
      * lists emptied.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param on To turn on radio -> on = true, to turn off radio -> on = false.
      *
      * Response function is IRadioResponse.setRadioPowerResponse()
      */
-    oneway setRadioPower(int32_t slotId, int32_t serial, bool on);
+    oneway setRadioPower(int32_t serial, bool on);
 
     /*
      * Send a DTMF tone
@@ -343,23 +318,18 @@
      * startDtmf(), that tone must be cancelled and the new tone
      * must be played instead
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param s string with single char having one of 12 values: 0-9, *, #
      *
      * Response function is IRadioResponse.sendDtmfResponse()
      */
-    oneway sendDtmf(int32_t slotId, int32_t serial, string s);
+    oneway sendDtmf(int32_t serial, string s);
 
     /*
      * Send an SMS message
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
-     * @param smscPDU is SMSC address in GSM BCD format prefixed by a length byte
-     *        (as expected by TS 27.005) or empty string for default SMSC
-     * @param pdu is SMS in PDU format as an ASCII hex string less the SMSC address
-     *        TP-Layer-Length is be "strlen(pdu)/2"
+     * @param message GsmSmsMessage as defined in types.hal
      *
      * Response function is IRadioResponse.sendSmsResponse()
      *
@@ -367,19 +337,15 @@
      * fails. RadioError:SMS_SEND_FAIL_RETRY means retry (i.e. error cause is 332)
      * and RadioError:GENERIC_FAILURE means no retry (i.e. error cause is 500)
      */
-    oneway sendSms(int32_t slotId, int32_t serial, string smscPDU, string pdu);
+    oneway sendSms(int32_t serial, GsmSmsMessage message);
 
     /*
      * Send an SMS message. Identical to sendSms,
      * except that more messages are expected to be sent soon. If possible,
      * keep SMS relay protocol link open (eg TS 27.005 AT+CMMS command)
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
-     * @param smscPDU is SMSC address in GSM BCD format prefixed by a length byte
-     *        (as expected by TS 27.005) or empty string for default SMSC
-     * @param pdu is SMS in PDU format as an ASCII hex string less the SMSC address
-     *        TP-Layer-Length is be "strlen(pdu)/2"
+     * @param message GsmSmsMessage as defined in types.hal
      *
      * Response function is IRadioResponse.sendSMSExpectMoreResponse()
      *
@@ -387,7 +353,7 @@
      * fails. RadioError:SMS_SEND_FAIL_RETRY means retry (i.e. error cause is 332)
      * and RadioError:GENERIC_FAILURE means no retry (i.e. error cause is 500)
      */
-    oneway sendSMSExpectMore(int32_t slotId, int32_t serial, string smscPDU, string pdu);
+    oneway sendSMSExpectMore(int32_t serial, GsmSmsMessage message);
 
     /*
      * Setup a packet data connection. If DataCallResponse.status
@@ -397,7 +363,7 @@
      * radio is powered off/on. This list is returned by getDataCallList()
      * and dataCallListChanged().
      *
-     * The RIL is expected to:
+     * The Radio is expected to:
      *  - Create one data call context.
      *  - Create and configure a dedicated interface for the context
      *  - The interface must be point to point.
@@ -408,7 +374,6 @@
      *  - Support up to getDataRegistrationState response[5]
      *    number of simultaneous data call contexts.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param radioTechnology Radio technology to use: 0-CDMA, 1-GSM/UMTS, 2...
      *        for values above 2 this is RadioTechnology + 2.
@@ -418,18 +383,14 @@
      * @param user is the username for APN, or empty string
      * @param password is the password for APN, or empty string
      * @param authType is the PAP / CHAP auth type. Values:
-     *        0 => PAP and CHAP is never performed.
-     *        1 => PAP may be performed; CHAP is never performed.
-     *        2 => CHAP may be performed; PAP is never performed.
-     *        3 => PAP / CHAP may be performed - baseband dependent.
      * @param protocol is the connection type to request must be one of the
      *        PDP_type values in TS 27.007 section 10.1.1.
      *        For example, "IP", "IPV6", "IPV4V6", or "PPP".
      *
      * Response function is IRadioResponse.setupDataCallResponse()
      */
-    oneway setupDataCall(int32_t slotId, int32_t serial, int32_t radioTechnology,
-            int32_t profile, string apn, string user, string password, int32_t authType,
+    oneway setupDataCall(int32_t serial, int32_t radioTechnology,
+            int32_t profile, string apn, string user, string password, ApnAuthType authType,
             string protocol);
 
     /*
@@ -441,7 +402,6 @@
      * Arguments and responses that are unused for certain
      * values of "command" must be ignored or set to empty string
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param iccIo IccIo
      *
@@ -451,7 +411,7 @@
      *
      * Response function is IRadioResponse.iccIOForAppResponse()
      */
-    oneway iccIOForApp(int32_t slotId, int32_t serial, IccIo iccIo);
+    oneway iccIOForApp(int32_t serial, IccIo iccIo);
 
     /*
      * Send a USSD message.
@@ -467,7 +427,6 @@
      * b) The implementation sends a unsolOnUssd() with a type code
      * of "0" (USSD-Notify/no further action) or "2" (session terminated)
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param ussd string containing the USSD request in UTF-8 format
      *
@@ -475,91 +434,83 @@
      *
      * See also requestCancelUssd, unsolOnUssd
      */
-    oneway sendUssd(int32_t slotId, int32_t serial, string ussd);
+    oneway sendUssd(int32_t serial, string ussd);
 
     /*
      * Cancel the current USSD session if one exists.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.cancelPendingUssdResponse()
      */
-    oneway cancelPendingUssd(int32_t slotId, int32_t serial);
+    oneway cancelPendingUssd(int32_t serial);
 
     /*
      * Gets current CLIR status
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getClirResponse()
      */
-    oneway getClir(int32_t slotId, int32_t serial);
+    oneway getClir(int32_t serial);
 
     /*
      * Set current CLIR status
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param status "n" parameter from TS 27.007 7.7
      *
      * Response function is IRadioResponse.setClirResponse()
      */
-    oneway setClir(int32_t slotId, int32_t serial, int32_t status);
+    oneway setClir(int32_t serial, int32_t status);
 
     /*
      * Request call forward status.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param callInfo CallForwardInfo
      *
      * Response function is IRadioResponse.getCallForwardStatusResponse()
      */
-    oneway getCallForwardStatus(int32_t slotId, int32_t serial,
+    oneway getCallForwardStatus(int32_t serial,
             CallForwardInfo callInfo);
 
     /*
      * Configure call forward rule
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param callInfo CallForwardInfo
      *
      * Response function is IRadioResponse.setCallForwardResponse()
      */
-    oneway setCallForward(int32_t slotId, int32_t serial, CallForwardInfo callInfo);
+    oneway setCallForward(int32_t serial, CallForwardInfo callInfo);
 
     /*
      * Query current call waiting state
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param serviceClass Service class is the TS 27.007 service class to query
      *
      * Response function is IRadioResponse.getCallWaitingResponse()
      */
-    oneway getCallWaiting(int32_t slotId, int32_t serial, int32_t serviceClass);
+    oneway getCallWaiting(int32_t serial, int32_t serviceClass);
 
     /*
      * Configure current call waiting state
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param enable is false for "disabled" and true for "enabled"
      * @param serviceClass is the TS 27.007 service class bit vector of services to modify
      *
      * Response function is IRadioResponse.setCallWaitingResponse()
      */
-    oneway setCallWaiting(int32_t slotId, int32_t serial, bool enable,
+    oneway setCallWaiting(int32_t serial, bool enable,
             int32_t serviceClass);
 
     /*
      * Acknowledge successful or failed receipt of SMS previously indicated
      * via unsolResponseNewSms
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param success is true on successful receipt
      *        (basically, AT+CNMA=1 from TS 27.005 is 0 on failed receipt
@@ -569,7 +520,7 @@
      *
      * Response function is IRadioResponse.acknowledgeLastIncomingGsmSmsResponse()
      */
-    oneway acknowledgeLastIncomingGsmSms(int32_t slotId, int32_t serial, bool success,
+    oneway acknowledgeLastIncomingGsmSms(int32_t serial, bool success,
             SmsAcknowledgeFailCause cause);
 
     /*
@@ -578,12 +529,11 @@
      * switchWaitingOrHoldingAndActive() must be used in this case
      * instead
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.acceptCallResponse()
      */
-    oneway acceptCall(int32_t slotId, int32_t serial);
+    oneway acceptCall(int32_t serial);
 
     /*
      * Deactivate packet data connection and remove from the
@@ -592,7 +542,6 @@
      * unsolDataCallListChanged must be
      * issued because of an deactivateDataCall.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param cid Indicates CID
      * @param reasonRadioShutDown Indicates Disconnect Reason
@@ -601,13 +550,12 @@
      *
      * Response function is IRadioResponse.deactivateDataCallResponse()
      */
-    oneway deactivateDataCall(int32_t slotId, int32_t serial, int32_t cid,
+    oneway deactivateDataCall(int32_t serial, int32_t cid,
             bool reasonRadioShutDown);
 
     /*
      * Query the status of a facility lock state
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param facility is the facility string code from TS 27.007 7.4
      *        (eg "AO" for BAOC, "SC" for SIM lock)
@@ -618,13 +566,12 @@
      *
      * Response function is IRadioResponse.getFacilityLockForAppResponse()
      */
-    oneway getFacilityLockForApp(int32_t slotId, int32_t serial, string facility,
+    oneway getFacilityLockForApp(int32_t serial, string facility,
             string password, int32_t serviceClass, string appId);
 
     /*
      * Enable/disable one facility lock
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param facility is the facility string code from TS 27.007 7.4 (eg "AO" for BAOC)
      * @param lockState false for "unlock" and true for "lock"
@@ -637,13 +584,12 @@
      *
      * Response function is IRadioResponse.setFacilityLockForAppResponse()
      */
-    oneway setFacilityLockForApp(int32_t slotId, int32_t serial, string facility, bool lockState,
+    oneway setFacilityLockForApp(int32_t serial, string facility, bool lockState,
             string password, int32_t serviceClass, string appId);
 
     /*
      * Change call barring facility password
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param facility facility string code from TS 27.007 7.4 (eg "AO" for BAOC)
      * @param oldPassword old password
@@ -651,52 +597,48 @@
      *
      * Response function is IRadioResponse.setBarringPasswordResponse()
      */
-    oneway setBarringPassword(int32_t slotId, int32_t serial, string facility,
+    oneway setBarringPassword(int32_t serial, string facility,
             string oldPassword, string newPassword);
 
     /*
      * Query current network selection mode
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getNetworkSelectionModeResponse()
      */
-    oneway getNetworkSelectionMode(int32_t slotId, int32_t serial);
+    oneway getNetworkSelectionMode(int32_t serial);
 
     /*
      * Specify that the network must be selected automatically.
      * This request must not respond until the new operator is selected and registered.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.setNetworkSelectionModeAutomaticResponse()
      */
-    oneway setNetworkSelectionModeAutomatic(int32_t slotId, int32_t serial);
+    oneway setNetworkSelectionModeAutomatic(int32_t serial);
 
     /*
      * Manually select a specified network.
      * This request must not respond until the new operator is selected and registered.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param operatorNumeric string specifying MCCMNC of network to select (eg "310170")
      *
      * Response function is IRadioResponse.setNetworkSelectionModeManualResponse()
      */
-    oneway setNetworkSelectionModeManual(int32_t slotId, int32_t serial, string operatorNumeric);
+    oneway setNetworkSelectionModeManual(int32_t serial, string operatorNumeric);
 
     /*
      * Scans for available networks
      * This request must not respond until the new operator is selected and registered.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getAvailableNetworksResponse()
      */
-    oneway getAvailableNetworks(int32_t slotId, int32_t serial);
+    oneway getAvailableNetworks(int32_t serial);
 
     /*
      * Start playing a DTMF tone. Continue playing DTMF tone until
@@ -704,33 +646,30 @@
      * If a startDtmf() is received while a tone is currently playing,
      * it must cancel the previous tone and play the new one.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param s string having a single character with one of 12 values: 0-9,*,#
      *
      * Response function is IRadioResponse.startDtmfResponse()
      */
-    oneway startDtmf(int32_t slotId, int32_t serial, string s);
+    oneway startDtmf(int32_t serial, string s);
 
     /*
      * Stop playing a currently playing DTMF tone.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.stopDtmfResponse()
      */
-    oneway stopDtmf(int32_t slotId, int32_t serial);
+    oneway stopDtmf(int32_t serial);
 
     /*
      * Return string value indicating baseband version, eg response from AT+CGMR
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getBasebandVersionResponse()
      */
-    oneway getBasebandVersion(int32_t slotId, int32_t serial);
+    oneway getBasebandVersion(int32_t serial);
 
     /*
      * Separate a party from a multiparty call placing the multiparty call
@@ -743,47 +682,43 @@
      * TS 22.030 6.5.5 "Entering "2X followed by send"
      * TS 27.007 "AT+CHLD=2x"
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param gsmIndex contains Connection index (value of 'x' in CHLD above)
      *
      * Response function is IRadioResponse.separateConnectionResponse()
      */
-    oneway separateConnection(int32_t slotId, int32_t serial, int32_t gsmIndex);
+    oneway separateConnection(int32_t serial, int32_t gsmIndex);
 
     /*
      * Turn on or off uplink (microphone) mute.
      * Must only be sent while voice call is active.
      * Must always be reset to "disable mute" when a new voice call is initiated
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param enable true for "enable mute" and false for "disable mute"
      *
      * Response function is IRadioResponse.setMuteResponse()
      */
-    oneway setMute(int32_t slotId, int32_t serial, bool enable);
+    oneway setMute(int32_t serial, bool enable);
 
     /*
      * Queries the current state of the uplink mute setting
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getMuteResponse()
      */
-    oneway getMute(int32_t slotId, int32_t serial);
+    oneway getMute(int32_t serial);
 
     /*
      * Queries the status of the CLIP supplementary service
      * (for MMI code "*#30#")
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getClipResponse()
      */
-    oneway getClip(int32_t slotId, int32_t serial);
+    oneway getClip(int32_t serial);
 
     /*
      * Returns the data call list. An entry is added when a
@@ -791,34 +726,31 @@
      * deactivateDataCall(). The list is emptied when
      * setRadioPower() off/on is issued.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getDataCallListResponse()
      */
-    oneway getDataCallList(int32_t slotId, int32_t serial);
+    oneway getDataCallList(int32_t serial);
 
     /*
      * This request is reserved for OEM-specific uses. It passes raw byte arrays back and forth.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param data data passed as raw bytes to oem
      *
-     * Response function is IRadioResponse.sendOemRilRequestRawResponse()
+     * Response function is IRadioResponse.sendOemRadioRequestRawResponse()
      */
-    oneway sendOemRilRequestRaw(int32_t slotId, int32_t serial, vec<uint8_t> data);
+    oneway sendOemRadioRequestRaw(int32_t serial, vec<uint8_t> data);
 
     /*
      * This request is reserved for OEM-specific uses. It passes strings back and forth.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param data data passed as strings to oem
      *
-     * Response function is IRadioResponse.sendOemRilRequestStringsResponse()
+     * Response function is IRadioResponse.sendOemRadioRequestStringsResponse()
      */
-    oneway sendOemRilRequestStrings(int32_t slotId, int32_t serial, vec<string> data);
+    oneway sendOemRadioRequestStrings(int32_t serial, vec<string> data);
 
     /*
      * Indicates the current state of the screen. When the screen is off, the
@@ -827,90 +759,801 @@
      * in an effort to conserve power. These notifications must resume when the
      * screen is on.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param enable true = screen on, false = screen off.
      *
      * Response function is IRadioResponse.sendScreenStateResponse()
      */
-    oneway sendScreenState(int32_t slotId, int32_t serial, bool enable);
+    oneway sendScreenState(int32_t serial, bool enable);
 
     /*
      * Enables/disables supplementary service related notifications from the network.
      * Notifications are reported via unsolSuppSvcNotification().
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param enable true = notifications enabled, false = notifications disabled.
      *
      * Response function is IRadioResponse.setSuppServiceNotificationsResponse()
      */
-    oneway setSuppServiceNotifications(int32_t slotId, int32_t serial, bool enable);
+    oneway setSuppServiceNotifications(int32_t serial, bool enable);
 
     /*
      * Stores a SMS message to SIM memory.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param smsWriteArgs SmsWriteArgs defined in types.hal
      *
      * Response function is IRadioResponse.writeSmsToSimResponse()
      */
-    oneway writeSmsToSim(int32_t slotId, int32_t serial, SmsWriteArgs smsWriteArgs);
+    oneway writeSmsToSim(int32_t serial, SmsWriteArgs smsWriteArgs);
 
     /*
      * Deletes a SMS message from SIM memory.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param index Record index of the message to delete.
      *
      * Response function is IRadioResponse.deleteSmsOnSimResponse()
      */
-    oneway deleteSmsOnSim(int32_t slotId, int32_t serial, int32_t index);
+    oneway deleteSmsOnSim(int32_t serial, int32_t index);
 
     /*
      * Assign a specified band for RF configuration.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param mode RadioBandMode defined in types.hal
      *
      * Response function is IRadioResponse.setBandModeResponse()
      */
-    oneway setBandMode(int32_t slotId, int32_t serial, RadioBandMode mode);
+    oneway setBandMode(int32_t serial, RadioBandMode mode);
 
     /*
      * Get the list of band modes supported by RF.
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      *
      * Response function is IRadioResponse.getAvailableBandModesResponse()
      */
-    oneway getAvailableBandModes(int32_t slotId, int32_t serial);
+    oneway getAvailableBandModes(int32_t serial);
 
     /*
      * Requests to send a SAT/USAT envelope command to SIM.
      * The SAT/USAT envelope command refers to 3GPP TS 11.14 and 3GPP TS 31.111
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param command SAT/USAT command in hexadecimal format string starting with command tag
      *
      * Response function is IRadioResponse.sendEnvelopeResponse()
      */
-    oneway sendEnvelope(int32_t slotId, int32_t serial, string command);
+    oneway sendEnvelope(int32_t serial, string command);
 
     /*
      * Requests to send a terminal response to SIM for a received proactive command
      *
-     * @param slotId SIM slot id for which the function is called; needed for multi-sim
      * @param serial Serial number of request.
      * @param commandResponse SAT/USAT response in hexadecimal format string starting with
      *        first byte of response data
      *
      * Response function is IRadioResponse.sendTerminalResponseResponseToSim()
      */
-    oneway sendTerminalResponseToSim(int32_t slotId, int32_t serial, string commandResponse);
+    oneway sendTerminalResponseToSim(int32_t serial, string commandResponse);
+
+    /*
+     * When STK application gets stkCallSetup(), the call actually has
+     * been initialized by mobile device already. (We could see the call has been in the 'call
+     * list') So, STK application needs to accept/reject the call according to user
+     * operations.
+     *
+     * @param serial Serial number of request.
+     * @param accept true = accept the call setup, false = reject the call setup
+     *
+     * Response callback is IRadioCallback.handleStkCallSetupRequestFromSimResponse()
+     */
+    oneway handleStkCallSetupRequestFromSim(int32_t serial,
+            bool accept);
+
+    /*
+     * Connects the two calls and disconnects the subscriber from both calls.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.explicitCallTransferResponse()
+     */
+    oneway explicitCallTransfer(int32_t serial);
+
+    /*
+     * Requests to set the preferred network type for searching and registering
+     * (CS/PS domain, RAT, and operation mode)
+     *
+     * @param serial Serial number of request.
+     * @param nwType PreferredNetworkType defined in types.hal
+     *
+     * Response callback is IRadioCallback.setPreferredNetworkTypeResponse()
+     */
+    oneway setPreferredNetworkType(int32_t serial,
+            PreferredNetworkType nwType);
+
+    /*
+     * Query the preferred network type (CS/PS domain, RAT, and operation mode)
+     * for searching and registering
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getPreferredNetworkTypeResponse()
+     */
+    oneway getPreferredNetworkType(int32_t serial);
+
+    /*
+     * Request neighboring cell id in GSM network
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getNeighboringCidsResponse()
+     */
+    oneway getNeighboringCids(int32_t serial);
+
+    /*
+     * Enables/disables network state change notifications due to changes in
+     * LAC and/or CID (for GSM) or BID/SID/NID/latitude/longitude (for CDMA).
+     * Basically +CREG=2 vs. +CREG=1 (TS 27.007).
+     * Note:  The Radio implementation must default to "updates enabled"
+     * when the screen is on and "updates disabled" when the screen is off.
+     *
+     * @param serial Serial number of request.
+     * @param enable true = updates enabled (+CREG=2), false = updates disabled (+CREG=1)
+     *
+     * Response callback is IRadioCallback.setLocationUpdatesResponse()
+     */
+    oneway setLocationUpdates(int32_t serial, bool enable);
+
+    /*
+     * Request to set the location where the CDMA subscription shall
+     * be retrieved
+     *
+     * @param serial Serial number of request.
+     * @param cdmaSub CdmaSubscriptionSource
+     *
+     * Response callback is IRadioCallback.setCdmaSubscriptionSourceResponse()
+     */
+    oneway setCdmaSubscriptionSource(int32_t serial,
+            CdmaSubscriptionSource cdmaSub);
+
+    /*
+     * Request to set the roaming preferences in CDMA
+     *
+     * @param serial Serial number of request.
+     * @param type CdmaRoamingType defined in types.hal
+     *
+     * Response callback is IRadioCallback.setCdmaRoamingPreferenceResponse()
+     */
+    oneway setCdmaRoamingPreference(int32_t serial,
+            CdmaRoamingType type);
+
+    /*
+     * Request the actual setting of the roaming preferences in CDMA in the modem
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getCdmaRoamingPreferenceResponse()
+     */
+    oneway getCdmaRoamingPreference(int32_t serial);
+
+    /*
+     * Request to set the TTY mode
+     *
+     * @param serial Serial number of request.
+     * @param mode TtyMode
+     *
+     * Response callback is IRadioCallback.setTTYModeResponse()
+     */
+    oneway setTTYMode(int32_t serial, TtyMode mode);
+
+    /*
+     * Request the setting of TTY mode
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getTTYModeResponse()
+     */
+    oneway getTTYMode(int32_t serial);
+
+    /*
+     * Request to set the preferred voice privacy mode used in voice scrambling.
+     *
+     * @param serial Serial number of request.
+     * @param enable false for Standard Privacy Mode (Public Long Code Mask)
+     *        true for Enhanced Privacy Mode (Private Long Code Mask)
+     *
+     * Response callback is IRadioCallback.setPreferredVoicePrivacyResponse()
+     */
+    oneway setPreferredVoicePrivacy(int32_t serial, bool enable);
+
+    /*
+     * Request the setting of preferred voice privacy mode.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getPreferredVoicePrivacyResponse()
+     */
+    oneway getPreferredVoicePrivacy(int32_t serial);
+
+    /*
+     * Send FLASH command
+     *
+     * @param serial Serial number of request.
+     * @param featureCode String associated with Flash command
+     *
+     * Response callback is IRadioCallback.sendCDMAFeatureCodeResponse()
+     */
+    oneway sendCDMAFeatureCode(int32_t serial, string featureCode);
+
+    /*
+     * Send DTMF string
+     *
+     * @param serial Serial number of request.
+     * @param dtmf DTMF string
+     * @param on DTMF ON length in milliseconds, or 0 to use default
+     * @param off is the DTMF OFF length in milliseconds, or 0 to use default
+     *
+     * Response callback is IRadioCallback.sendBurstDtmfResponse()
+     */
+    oneway sendBurstDtmf(int32_t serial, string dtmf, int32_t on, int32_t off);
+
+    /*
+     * Send a CDMA SMS message
+     *
+     * @param serial Serial number of request.
+     * @param sms Cdma Sms to be sent described by CdmaSmsMessage in types.hal
+     *
+     * Response callback is IRadioCallback.sendCdmaSmsResponse()
+     */
+    oneway sendCdmaSms(int32_t serial, CdmaSmsMessage sms);
+
+    /*
+     * Acknowledge the success or failure in the receipt of SMS
+     * previously indicated via responseCdmaNewSms()
+     *
+     * @param serial Serial number of request.
+     * @param smsAck Cdma Sms ack to be sent described by CdmaSmsAck in types.hal
+     *
+     * Response callback is IRadioCallback.acknowledgeLastIncomingCdmaSmsResponse()
+     */
+    oneway acknowledgeLastIncomingCdmaSms(int32_t serial, CdmaSmsAck smsAck);
+
+    /*
+     * Request the setting of GSM/WCDMA Cell Broadcast SMS config.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getGsmBroadcastConfigResponse()
+     */
+    oneway getGsmBroadcastConfig(int32_t serial);
+
+    /*
+     * Set GSM/WCDMA Cell Broadcast SMS config
+     *
+     * @param serial Serial number of request.
+     * @param configInfo Setting of GSM/WCDMA Cell broadcast config
+     *
+     * Response callback is IRadioCallback.setGsmBroadcastConfigResponse()
+     */
+    oneway setGsmBroadcastConfig(int32_t serial, GsmBroadcastSmsConfigInfo configInfo);
+
+    /*
+     * Enable or disable the reception of GSM/WCDMA Cell Broadcast SMS
+     *
+     * @param serial Serial number of request.
+     * @param activate indicates to activate or turn off the reception of GSM/WCDMA
+     *        Cell Broadcast SMS. true = activate, false = turn off
+     *
+     * Response callback is IRadioCallback.setGsmBroadcastActivationResponse()
+     */
+    oneway setGsmBroadcastActivation(int32_t serial, bool activate);
+
+    /*
+     * Request the setting of CDMA Broadcast SMS config
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getCdmaBroadcastConfigResponse()
+     */
+    oneway getCdmaBroadcastConfig(int32_t serial);
+
+    /*
+     * Set CDMA Broadcast SMS config
+     *
+     * @param serial Serial number of request.
+     * @param configInfo CDMA Broadcast SMS config to be set.
+     *
+     * Response callback is IRadioCallback.setCdmaBroadcastConfigResponse()
+     */
+    oneway setCdmaBroadcastConfig(int32_t serial, CdmaBroadcastSmsConfigInfo configInfo);
+
+    /*
+     * Enable or disable the reception of CDMA Cell Broadcast SMS
+     *
+     * @param serial Serial number of request.
+     * @param activate indicates to activate or turn off the reception of CDMA
+     *        Cell Broadcast SMS. true = activate, false = turn off
+     *
+     * Response callback is IRadioCallback.setCdmaBroadcastActivationResponse()
+     */
+    oneway setCdmaBroadcastActivation(int32_t serial, bool activate);
+
+    /*
+     * Request the device MDN / H_SID / H_NID.
+     * The request is only allowed when CDMA subscription is available. When CDMA
+     * subscription is changed, application layer must re-issue the request to
+     * update the subscription information.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getCDMASubscriptionResponse()
+     */
+    oneway getCDMASubscription(int32_t serial);
+
+    /*
+     * Stores a CDMA SMS message to RUIM memory.
+     *
+     * @param serial Serial number of request.
+     * @param cdmaSms CDMA message as defined by CdmaSmsWriteArgs in types.hal
+     *
+     * Response callback is IRadioCallback.writeSmsToRuimResponse()
+     */
+    oneway writeSmsToRuim(int32_t serial, CdmaSmsWriteArgs cdmaSms);
+
+    /*
+     * Deletes a CDMA SMS message from RUIM memory.
+     *
+     * @param serial Serial number of request.
+     * @param index record index of the message to delete
+     *
+     * Response callback is IRadioCallback.deleteSmsOnRuimResponse()
+     */
+    oneway deleteSmsOnRuim(int32_t serial, int32_t index);
+
+    /*
+     * Request the device ESN / MEID / IMEI / IMEISV.
+     * The request is always allowed and contains GSM and CDMA device identity.
+     * When CDMA subscription is changed the ESN/MEID changes. The application
+     * layer must re-issue the request to update the device identity in this case.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getDeviceIdentityResponse()
+     */
+    oneway getDeviceIdentity(int32_t serial);
+
+    /*
+     * Request the radio's system selection module to exit emergency
+     * callback mode. Radio must not respond with SUCCESS until the modem has
+     * completely exited from Emergency Callback Mode.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.exitEmergencyCallbackModeResponse()
+     */
+    oneway exitEmergencyCallbackMode(int32_t serial);
+
+    /*
+     * Get the default Short Message Service Center address on the device.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getSmscAddressResponse()
+     */
+    oneway getSmscAddress(int32_t serial);
+
+    /*
+     * Set the default Short Message Service Center address on the device.
+     *
+     * @param serial Serial number of request.
+     * @param smsc Short Message Service Center address to set
+     *
+     * Response callback is IRadioCallback.setSmscAddressResponse()
+     */
+    oneway setSmscAddress(int32_t serial, string smsc);
+
+    /*
+     * Indicates whether there is storage available for new SMS messages.
+     *
+     * @param serial Serial number of request.
+     * @param available true if memory is available for storing new messages,
+     *        false if memory capacity is exceeded
+     *
+     * Response callback is IRadioCallback.reportSmsMemoryStatusResponse()
+     */
+    oneway reportSmsMemoryStatus(int32_t serial, bool available);
+
+    /*
+     * Indicates that the StkSerivce is running and is
+     * ready to receive unsolicited stkXXXXX commands.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.reportStkServiceIsRunningResponse()
+     */
+    oneway reportStkServiceIsRunning(int32_t serial);
+
+    /*
+     * Request to query the location where the CDMA subscription shall be retrieved.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getCdmaSubscriptionSourceResponse()
+     */
+    oneway getCdmaSubscriptionSource(int32_t serial);
+
+    /*
+     * Request the ISIM application on the UICC to perform AKA
+     * challenge/response algorithm for IMS authentication
+     *
+     * @param serial Serial number of request.
+     * @param challenge challenge string in Base64 format
+     *
+     * Response callback is IRadioCallback.requestIsimAuthenticationResponse()
+     */
+    oneway requestIsimAuthentication(int32_t serial, string challenge);
+
+    /*
+     * Acknowledge successful or failed receipt of SMS previously indicated
+     * via unsol responseNewSms(), including acknowledgement TPDU to send
+     * as the RP-User-Data element of the RP-ACK or RP-ERROR PDU.
+     *
+     * @param serial Serial number of request.
+     * @param success true on successful receipt (send RP-ACK)
+     *        false on failed receipt (send RP-ERROR)
+     * @param ackPdu acknowledgement TPDU in hexadecimal format
+     *
+     * Response callback is IRadioCallback.acknowledgeIncomingGsmSmsWithPduResponse()
+     */
+    oneway acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success, string ackPdu);
+
+    /*
+     * Requests to send a SAT/USAT envelope command to SIM.
+     * The SAT/USAT envelope command refers to 3GPP TS 11.14 and 3GPP TS 31.111.
+     *
+     * This request has one difference from sendEnvelope():
+     * the SW1 and SW2 status bytes from the UICC response are returned along with
+     * the response data, using the same structure as iccIOForApp().
+     *
+     * The implementation must perform normal processing of a '91XX'
+     * response in SW1/SW2 to retrieve the pending proactive command and send it
+     * as an unsolicited response, as sendEnvelope() does.
+     *
+     * @param serial Serial number of request.
+     * @param contents SAT/USAT command in hexadecimal format starting with command tag
+     *
+     * Response callback is IRadioCallback.sendEnvelopeWithStatusResponse()
+     */
+    oneway sendEnvelopeWithStatus(int32_t serial, string contents);
+
+    /*
+     * Query the radio technology type (3GPP/3GPP2) used for voice. Query is valid only
+     * when radio state is not RADIO_STATE_UNAVAILABLE
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getVoiceRadioTechnologyResponse()
+     */
+    oneway getVoiceRadioTechnology(int32_t serial);
+
+    /*
+     * Request all of the current cell information known to the radio. The radio
+     * must return list of all current cells, including the neighboring cells. If for a particular
+     * cell information isn't known then the appropriate unknown value will be returned.
+     * This does not cause or change the rate of unsolicited cellInfoList().
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getCellInfoListResponse()
+     */
+    oneway getCellInfoList(int32_t serial);
+
+    /*
+     * Sets the minimum time between when unsolicited cellInfoList() must be invoked.
+     * A value of 0, means invoke cellInfoList() when any of the reported
+     * information changes. Setting the value to INT_MAX(0x7fffffff) means never issue
+     * a unsolicited cellInfoList().
+     *
+     * @param serial Serial number of request.
+     * @param rate minimum time in milliseconds to indicate time between unsolicited cellInfoList()
+     *
+     * Response callback is IRadioCallback.setCellInfoListRateResponse()
+     */
+    oneway setCellInfoListRate(int32_t serial, int32_t rate);
+
+    /*
+     * Set an apn to initial attach network
+     *
+     * @param serial Serial number of request.
+     * @param apn is the APN to connect to if radio technology is GSM/UMTS. This APN must
+     *        override the one in the profile. empty string indicates no APN overrride.
+     * @param protocol is the connection type to request must be one of the
+     *        PDP_type values in TS 27.007 section 10.1.1.
+     *        For example, "IP", "IPV6", "IPV4V6", or "PPP".
+     * @param authType is the PAP / CHAP auth type. Values:
+     * @param user is the username for APN, or empty string
+     * @param password is the password for APN, or empty string
+     *
+     * Response callback is IRadioCallback.setInitialAttachApnResponse()
+     */
+    oneway setInitialAttachApn(int32_t serial, string apn, string protocol, ApnAuthType authType,
+            string username, string password);
+
+    /*
+     * Request current IMS registration state
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getImsRegistrationStateResponse()
+     */
+    oneway getImsRegistrationState(int32_t serial);
+
+    /*
+     * Send a SMS message over IMS.
+     * Based on the return error, caller decides to resend if sending sms
+     * fails. SMS_SEND_FAIL_RETRY means retry, and other errors means no retry.
+     * In case of retry, data is encoded based on Voice Technology available.
+     *
+     * @param serial Serial number of request.
+     * @param message ImsSmsMessage as defined in types.hal to be sent
+     *
+     * Response callback is IRadioCallback.sendImsSmsResponse()
+     */
+    oneway sendImsSms(int32_t serial, ImsSmsMessage message);
+
+    /*
+     * Request APDU exchange on the basic channel. This command reflects TS 27.007
+     * "generic SIM access" operation (+CSIM). The modem must ensure proper function
+     * of GSM/CDMA, and filter commands appropriately. It must filter
+     * channel management and SELECT by DF name commands.
+     * "sessionid" field must be ignored.
+     *
+     * @param serial Serial number of request.
+     * @param message SimApdu as defined in types.hal to be sent
+     *
+     * Response callback is IRadioCallback.iccTransmitApduBasicChannelResponse()
+     */
+    oneway iccTransmitApduBasicChannel(int32_t serial, SimApdu message);
+
+    /*
+     * Open a new logical channel and select the given application. This command
+     * reflects TS 27.007 "open logical channel" operation (+CCHO).
+     *
+     * @param serial Serial number of request.
+     * @param aid AID value, See ETSI 102.221 and 101.220.
+     *
+     * Response callback is IRadioCallback.iccOpenLogicalChannelResponse()
+     */
+    oneway iccOpenLogicalChannel(int32_t serial, string aid);
+
+    /*
+     * Close a previously opened logical channel. This command reflects TS 27.007
+     * "close logical channel" operation (+CCHC).
+     *
+     * @param serial Serial number of request.
+     * @param channelId session id of the logical channel (+CCHC).
+     *
+     * Response callback is IRadioCallback.iccCloseLogicalChannelResponse()
+     */
+    oneway iccCloseLogicalChannel(int32_t serial, int32_t channelId);
+
+    /*
+     * Exchange APDUs with a UICC over a previously opened logical channel. This
+     * command reflects TS 27.007 "generic logical channel access" operation
+     * (+CGLA). The modem must filter channel management and SELECT by DF name
+     * commands.
+     *
+     * @param serial Serial number of request.
+     * @param message SimApdu as defined in types.hal to be sent
+     *
+     * Response callback is IRadioCallback.iccTransmitApduLogicalChannelResponse()
+     */
+    oneway iccTransmitApduLogicalChannel(int32_t serial, SimApdu message);
+
+    /*
+     * Read one of the radio NV items.
+     * This is used for device configuration by some CDMA operators.
+     *
+     * @param serial Serial number of request.
+     * @param itemId NvItem is radio NV item as defined in types.hal
+     *
+     * Response callback is IRadioCallback.nvReadItemResponse()
+     */
+    oneway nvReadItem(int32_t serial, NvItem itemId);
+
+    /*
+     * Write one of the radio NV items.
+     * This is used for device configuration by some CDMA operators.
+     *
+     * @param serial Serial number of request.
+     * @param item NvWriteItem as defined in types.hal
+     *
+     * Response callback is IRadioCallback.nvWriteItemResponse()
+     */
+    oneway nvWriteItem(int32_t serial, NvWriteItem item);
+
+    /*
+     * Update the CDMA Preferred Roaming List (PRL) in the radio NV storage.
+     * This is used for device configuration by some CDMA operators.
+     *
+     * @param serial Serial number of request.
+     * @param prl PRL as a byte array
+     *
+     * Response callback is IRadioCallback.nvWriteCdmaPrlResponse()
+     */
+    oneway nvWriteCdmaPrl(int32_t serial, vec<uint8_t> prl);
+
+    /*
+     * Reset the radio NV configuration to the factory state.
+     * This is used for device configuration by some CDMA operators.
+     *
+     * @param serial Serial number of request.
+     * @param resetType ResetNvType as defined in types.hal
+     *
+     * Response callback is IRadioCallback.nvResetConfigResponse()
+     */
+    oneway nvResetConfig(int32_t serial, ResetNvType resetType);
+
+    /*
+     * Selection/de-selection of a subscription from a SIM card
+     *
+     * @param serial Serial number of request.
+     * @param uiccSub SelectUiccSub as defined in types.hal
+     *
+     * Response callback is IRadioCallback.setUiccSubscriptionResponse()
+     */
+    oneway setUiccSubscription(int32_t serial, SelectUiccSub uiccSub);
+
+    /*
+     * Tells the modem whether data calls are allowed or not
+     *
+     * @param serial Serial number of request.
+     * @param allow true to allow data calls, false to disallow data calls
+     *
+     * Response callback is IRadioCallback.setDataAllowedResponse()
+     */
+    oneway setDataAllowed(int32_t serial, bool allow);
+
+    /*
+     * Request all of the current hardware (modem and sim) associated with Radio.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getHardwareConfigResponse()
+     */
+    oneway getHardwareConfig(int32_t serial);
+
+    /*
+     * Returns the response of SIM Authentication through Radio challenge request.
+     *
+     * @param serial Serial number of request.
+     * @param authContext P2 value of authentication command, see P2 parameter in
+     *        3GPP TS 31.102 7.1.2
+     * @param authData the challenge string in Base64 format, see 3GPP TS 31.102 7.1.2
+     * @param aid AID value, See ETSI 102.221 8.1 and 101.220 4, empty string if no value
+     *
+     * Response callback is IRadioCallback.requestIccSimAuthenticationResponse()
+     */
+    oneway requestIccSimAuthentication(int32_t serial, int32_t authContext, string authData,
+            string aid);
+
+    /*
+     * Set data profile in modem.
+     * Modem must erase existed profiles from framework, and apply new profiles
+     *
+     * @param serial Serial number of request.
+     * @param profiles Array of DataProfiles to set.
+     *
+     * Response callback is IRadioCallback.setDataProfileResponse()
+     */
+    oneway setDataProfile(int32_t serial, vec<DataProfileInfo> profiles);
+
+    /*
+     * Device is shutting down. All further commands are ignored
+     * and RADIO_NOT_AVAILABLE must be returned.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.requestShutdownResponse()
+     */
+    oneway requestShutdown(int32_t serial);
+
+    /*
+     * Used to get phone radio capablility.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getRadioCapabilityResponse()
+     */
+    oneway getRadioCapability(int32_t serial);
+
+    /*
+     * Used to set the phones radio capability. Be VERY careful
+     * using this request as it may cause some vendor modems to reset. Because
+     * of the possible modem reset any radio commands after this one may not be
+     * processed.
+     *
+     * @param serial Serial number of request.
+     * @param rc RadioCapability structure to be set
+     *
+     * Response callback is IRadioCallback.setRadioCapabilityResponse()
+     */
+    oneway setRadioCapability(int32_t serial, RadioCapability rc);
+
+    /*
+     * Start Link Capacity Estimate (LCE) service if supported by the radio.
+     *
+     * @param serial Serial number of request.
+     * @param reportInterval desired reporting interval (ms).
+     * @param pullMode LCE service mode. true: PULL; false: PUSH.
+     *
+     * Response callback is IRadioCallback.startLceServiceResponse()
+     */
+    oneway startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
+
+    /*
+     * Stop Link Capacity Estimate (LCE) service, the STOP operation must be
+     * idempotent for the radio modem.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.stopLceServiceResponse()
+     */
+    oneway stopLceService(int32_t serial);
+
+    /*
+     * Pull LCE service for capacity information.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.pullLceDataResponse()
+     */
+    oneway pullLceData(int32_t serial);
+
+    /*
+     * Get modem activity information for power consumption estimation.
+     * Request clear-on-read statistics information that is used for
+     * estimating the per-millisecond power consumption of the cellular
+     * modem.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getModemActivityInfoResponse()
+     */
+    oneway getModemActivityInfo(int32_t serial);
+
+    /*
+     * Set carrier restrictions. Expected modem behavior:
+     *  If never receives this command
+     *  - Must allow all carriers
+     *  Receives this command with allAllowed true
+     *  - Must allow all carriers. If a previously allowed SIM is present, modem must not reload
+     *    the SIM. If a previously disallowed SIM is present, reload the SIM and notify Android.
+     *  Receives this command with a list of carriers & allAllowed = false
+     *  - Only allow specified carriers, persist across power cycles and FDR. If a present SIM
+     *    is in the allowed list, modem must not reload the SIM. If a present SIM is *not* in
+     *    the allowed list, modem must detach from the registered network and only keep emergency
+     *    service, and notify Android SIM refresh reset with new SIM state being
+     *    CardState:RESTRICTED. Emergency service must be enabled.
+     *
+     * @param serial Serial number of request.
+     * @param allAllowed true only when all carriers are allowed. Ignore "carriers" struct.
+     *        If false, consider "carriers" struct
+     * @param carriers CarrierRestrictions consisting allowed and excluded carriers as defined
+     *        in types.hal
+     *
+     * Response callback is IRadioCallback.setAllowedCarriersResponse()
+     */
+    oneway setAllowedCarriers(int32_t serial, bool allAllowed, CarrierRestrictions carriers);
+
+    /*
+     * Get carrier restrictions.
+     *
+     * @param serial Serial number of request.
+     *
+     * Response callback is IRadioCallback.getAllowedCarriersResponse()
+     */
+    oneway getAllowedCarriers(int32_t serial);
 };
\ No newline at end of file
