diff --git a/include/telephony/ril.h b/include/telephony/ril.h
index 56a94fb..329767c 100644
--- a/include/telephony/ril.h
+++ b/include/telephony/ril.h
@@ -57,15 +57,13 @@
                                                    call on a Class C GPRS device */
     RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW = 9,  /* data ops are not allowed before device
                                                    registers in network */
-    RIL_E_SMS_SEND_FAIL_RETRY = 10,             /* fail to send sms and need retry */    
-    RIL_E_SIM_ABSENT = 11,                      /* fail to set the location where CDMA subscription 
-                                                   shall be retrieved because of SIM or RUIM 
+    RIL_E_SMS_SEND_FAIL_RETRY = 10,             /* fail to send sms and need retry */
+    RIL_E_SIM_ABSENT = 11,                      /* fail to set the location where CDMA subscription
+                                                   shall be retrieved because of SIM or RUIM
                                                    card absent */
-#ifdef FEATURE_MULTIMODE_ANDROID 
-    RIL_E_SUBSCRIPTION_NOT_AVAILABLE = 12,      /* fail to find CDMA subscription from specified 
+    RIL_E_SUBSCRIPTION_NOT_AVAILABLE = 12,      /* fail to find CDMA subscription from specified
                                                    location */
     RIL_E_MODE_NOT_SUPPORTED = 13               /* HW does not support preferred network type */
-#endif 
 } RIL_Errno;
 
 typedef enum {
@@ -206,14 +204,14 @@
                                  * 4 = erasure
                                  */
 
-    int             reason;       /* from TS 27.007 7.11 "reason" */
-    int             serviceClass; /* From 27.007 +CCFC/+CLCK "class"
-                                     See table for Android mapping from
-                                     MMI service code
-                                     0 means user doesn't input class */
-    int             toa;          /* "type" from TS 27.007 7.11 */
-    char *          number;       /* "number" from TS 27.007 7.11. May be NULL */
-    int             timeSeconds;  /* for CF no reply only */
+    int             reason;      /* from TS 27.007 7.11 "reason" */
+    int             serviceClass;/* From 27.007 +CCFC/+CLCK "class"
+                                    See table for Android mapping from
+                                    MMI service code
+                                    0 means user doesn't input class */
+    int             toa;         /* "type" from TS 27.007 7.11 */
+    char *          number;      /* "number" from TS 27.007 7.11. May be NULL */
+    int             timeSeconds; /* for CF no reply only */
 }RIL_CallForwardInfo;
 
 typedef struct {
@@ -273,15 +271,15 @@
                                    (MT only, may be NULL). */
 } RIL_SuppSvcNotification;
 
-#define RIL_SIM_ABSENT              0
-#define RIL_SIM_NOT_READY           1
+#define RIL_SIM_ABSENT                  0
+#define RIL_SIM_NOT_READY               1
 /* RIL_SIM_READY means that the radio state is RADIO_STATE_SIM_READY. 
  * This is more
  * than "+CPIN: READY". It also means the radio is ready for SIM I/O
  */
-#define RIL_SIM_READY               2
-#define RIL_SIM_PIN                 3
-#define RIL_SIM_PUK                 4
+#define RIL_SIM_READY                   2
+#define RIL_SIM_PIN                     3
+#define RIL_SIM_PUK                     4
 #define RIL_SIM_NETWORK_PERSONALIZATION 5
 
 /* see RIL_REQUEST_GET_SIM_STATUS */
@@ -389,7 +387,7 @@
     char *          number;             /* Remote party number */
     int             numberPresentation; /* 0=Allowed, 1=Restricted, 2=Not Specified/Unknown */
     char *          name;               /* Remote party name */
-    RIL_CDMA_SignalInfoRecord * signalInfoRecord;
+    RIL_CDMA_SignalInfoRecord signalInfoRecord;
 } RIL_CDMA_CallWaiting;
 
 /* Used by RIL_REQUEST_GET_BROADCAST_CONFIG and RIL_REQUEST_SET_BROADCAST_CONFIG */
@@ -405,7 +403,6 @@
   RIL_BroadcastServiceInfo *entries;
 } RIL_BroadcastSMSConfig;
 
-
 /* No restriction at all including voice/SMS/USSD/SS/AV64 and packet data. */
 #define RIL_RESTRICTED_STATE_NONE           0x00
 /* Block emergency call due to restriction. But allow all normal voice/SMS/USSD/SS/AV64. */
@@ -966,8 +963,8 @@
  *  SUCCESS
  *  RADIO_NOT_AVAILABLE
  */
-
 #define RIL_REQUEST_SIGNAL_STRENGTH 19
+
 /**
  * RIL_REQUEST_REGISTRATION_STATE
  *
@@ -1225,7 +1222,7 @@
  *                          and NULL for CDMA
  *
  * FIXME may need way to configure QoS settings
- * 
+ *
  * replaces  RIL_REQUEST_SETUP_DEFAULT_PDP
  *
  * Valid errors:
@@ -2293,7 +2290,7 @@
 
 /**
  * RIL_REQUEST_SET_LOCATION_UPDATES
- * 
+ *
  * Enables/disables network state change notifications due to changes in
  * LAC and/or CID (basically, +CREG=2 vs. +CREG=1).  
  *
@@ -2305,7 +2302,7 @@
  * ((int *)data)[0] is == 0 for updates disabled (+CREG=1)
  *
  * "response" is NULL
- * 
+ *
  * Valid errors:
  *  SUCCESS
  *  RADIO_NOT_AVAILABLE
@@ -3062,7 +3059,8 @@
  *
  * Ring indication for an incoming call (eg, RING or CRING event).
  *
- * "data" is const RIL_CDMA_SignalInfoRecord *
+ * "data" is null for GSM
+ * "data" is const RIL_CDMA_SignalInfoRecord * if CDMA
  */
 #define RIL_UNSOL_CALL_RING 1018
 
@@ -3070,7 +3068,7 @@
  * RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED
  *
  * Indicates that SIM state changes.
- * 
+ *
  * Callee will invoke RIL_REQUEST_GET_SIM_STATUS on main thread
 
  * "data" is null
@@ -3081,15 +3079,15 @@
  * RIL_UNSOL_RESPONSE_CDMA_NEW_SMS
  *
  * Called when new CDMA SMS is received
- * 
+ *
  * "data" is const RIL_CDMA_SMS_Message *
- * 
+ *
  * Callee will subsequently confirm the receipt of the SMS with
  * a RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE
- * 
+ *
  * No new RIL_UNSOL_RESPONSE_CDMA_NEW_SMS should be sent until
  * RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE has been received
- * 
+ *
  */
 #define RIL_UNSOL_RESPONSE_CDMA_NEW_SMS 1020
 
@@ -3315,7 +3313,7 @@
  * RIL_onRequestComplete will return as soon as possible
  *
  * @param t is parameter passed in on previous call to RIL_Notification
- * routine.
+ *          routine.
  * @param e error code
  *          if "e" != SUCCESS, then response can be null/is ignored
  * @param response is owned by caller, and should not be modified or
diff --git a/libril/ril.cpp b/libril/ril.cpp
index fd1d508..d06f0f3 100644
--- a/libril/ril.cpp
+++ b/libril/ril.cpp
@@ -135,7 +135,7 @@
     char local;         // responses to local commands do not go back to command process
 } RequestInfo;
 
-typedef struct UserCallbackInfo{
+typedef struct UserCallbackInfo {
     RIL_TimedCallback p_callback;
     void *userParam;
     struct ril_event event;
@@ -223,6 +223,11 @@
 static int responseCdmaBrCnf(Parcel &p, void *response, size_t responselen);
 static int responseCdmaSms(Parcel &p, void *response, size_t responselen);
 static int responseCellList(Parcel &p, void *response, size_t responselen);
+static int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen);
+static int responseRilSignalStrength(Parcel &p,void *response, size_t responselen);
+static int responseCallRing(Parcel &p, void *response, size_t responselen);
+static int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen);
+static int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen);
 
 extern "C" const char * requestToString(int request);
 extern "C" const char * failCauseToString(RIL_Errno);
@@ -973,8 +978,6 @@
     status = p.readInt32(&t);
     rcbsc.size = (int) t;
 
-    LOGE("RIL_CPP: dispatchCdmaBrSmsCnf(), isize=%d", rcbsc.size);
-
     if (rcbsc.size != 0) {
         RIL_CDMA_BroadcastServiceInfo cdmaBsi[rcbsc.size];
         for (int i = 0 ; i < rcbsc.size ; i++ ) {
@@ -1287,7 +1290,7 @@
     }
 
     if (responselen % sizeof (RIL_Call *) != 0) {
-        LOGE("invalid response length %d expected multiple of %d\n", 
+        LOGE("invalid response length %d expected multiple of %d\n",
             (int)responselen, (int)sizeof (RIL_Call *));
         return RIL_ERRNO_INVALID_RESPONSE;
     }
@@ -1315,16 +1318,20 @@
         p.writeInt32(p_cur->numberPresentation);
         writeStringToParcel(p, p_cur->name);
         p.writeInt32(p_cur->namePresentation);
-        appendPrintBuf("%s[id=%d,%s,toa=%d,%s,%s,als=%d,%s,%s,%s,cli=%d,name='%s',%d],",
+        appendPrintBuf("%s[id=%d,%s,toa=%d,",
             printBuf,
             p_cur->index,
             callStateToString(p_cur->state),
-            p_cur->toa,
+            p_cur->toa);
+        appendPrintBuf("%s%s,%s,als=%d,%s,%s,",
+            printBuf,
             (p_cur->isMpty)?"conf":"norm",
             (p_cur->isMT)?"mt":"mo",
             p_cur->als,
             (p_cur->isVoice)?"voc":"nonvoc",
-            (p_cur->isVoicePrivacy)?"evp":"noevp",
+            (p_cur->isVoicePrivacy)?"evp":"noevp");
+        appendPrintBuf("%s%s,cli=%d,name='%s',%d]",
+            printBuf,
             p_cur->number,
             p_cur->numberPresentation,
             p_cur->name,
@@ -1345,20 +1352,21 @@
         p.writeInt32(p_cur->numberPresentation);
         writeStringToParcel (p, "a-person");
         p.writeInt32(2); // p_cur->namePresentation);
-        appendPrintBuf("%s[id=%d,%s,toa=%d,%s,%s,als=%d,%s,%s,%s,cli=%d,name='%s',%d],",
+        appendPrintBuf("%s[id=%d,%s,toa=%d,",
             printBuf,
             p_cur->index,
             callStateToString(p_cur->state),
-            p_cur->toa,
+            p_cur->toa);
+        appendPrintBuf("%s%s,%s,als=%d,%s,%s,",
+            printBuf,
             (p_cur->isMpty)?"conf":"norm",
             (p_cur->isMT)?"mt":"mo",
             p_cur->als,
-            (p_cur->isVoice)?"voc":"nonvoc",
-            (p_cur->isVoicePrivacy)?"evp":"noevp",
+            (p_cur->isVoice)?"voc":"nonvoc");
+        appendPrintBuf("%s%s,cli=%d]",
+            printBuf,
             p_cur->number,
-            p_cur->numberPresentation,
-            p_cur->name,
-            p_cur->namePresentation);
+            p_cur->numberPresentation);
 #endif
     }
     removeLastChar;
@@ -1543,8 +1551,7 @@
     return 0;
 }
 
-static int responseCellList(Parcel &p, void *response, size_t responselen)
-{
+static int responseCellList(Parcel &p, void *response, size_t responselen) {
     int num;
 
     if (response == NULL && responselen != 0) {
@@ -1559,14 +1566,13 @@
     }
 
     startResponse;
-    /* number of cell info's */
+    /* number of records */
     num = responselen / sizeof(RIL_NeighboringCell *);
     p.writeInt32(num);
 
     for (int i = 0 ; i < num ; i++) {
         RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i];
 
-        /* each cell info */
         p.writeInt32(p_cur->rssi);
         writeStringToParcel (p, p_cur->cid);
 
@@ -1579,8 +1585,317 @@
     return 0;
 }
 
-static void triggerEvLoop()
-{
+/**
+ * Marshall the signalInfoRecord into the parcel if it exists.
+ */
+static void marshallSignalInfoRecord(Parcel &p, RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) {
+    p.writeInt32(p_signalInfoRecord.isPresent);
+    p.writeInt32(p_signalInfoRecord.signalType);
+    p.writeInt32(p_signalInfoRecord.alertPitch);
+    p.writeInt32(p_signalInfoRecord.signal);
+}
+
+static int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen) {
+    int num;
+    int digitCount;
+    int digitLimit;
+
+    if (response == NULL && responselen != 0) {
+        LOGE("invalid response: NULL");
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    if (responselen != sizeof(RIL_CDMA_InformationRecords)) {
+        LOGE("invalid response length %d expected %d\n",
+            (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords));
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+
+    /* TODO(Teleca): Wink believes this should be deleted? */
+//    num = responselen / sizeof(RIL_CDMA_InformationRecords *);
+//    p.writeInt32(num);
+
+    RIL_CDMA_InformationRecords *p_cur = ((RIL_CDMA_InformationRecords *) response);
+
+    /* Number of records */
+    p.writeInt32(p_cur->numberOfInfoRecs);
+
+    startResponse;
+
+    digitLimit = MIN((p_cur->numberOfInfoRecs),RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
+    for (digitCount = 0 ; digitCount < digitLimit; digitCount ++) {
+        switch(p_cur->infoRec[digitCount].name){
+            case RIL_CDMA_DISPLAY_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.display.alpha_len);
+                for(int i =0;i<(int)(p_cur->infoRec[digitCount].rec.display.alpha_len);i++){
+                    p.writeInt32(p_cur->infoRec[digitCount].rec.display.alpha_buf[i]);
+                }
+                appendPrintBuf("%s[rec.display.alpha_len%c, rec.display.alpha_buf%s],",
+                        printBuf,
+                    p_cur->infoRec[digitCount].rec.display.alpha_len,
+                    p_cur->infoRec[digitCount].rec.display.alpha_buf);
+                break;
+            case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.len);
+                for(int i =0;i<(int)(p_cur->infoRec[digitCount].rec.number.len);i++){
+                    p.writeInt32(p_cur->infoRec[digitCount].rec.number.buf[i]);
+                }
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_type);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_plan);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.pi);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.si);
+                appendPrintBuf("%s[len=%c,buf=%s,number_type=%c,number_plan=%c,",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.len,
+                        p_cur->infoRec[digitCount].rec.number.buf,
+                        p_cur->infoRec[digitCount].rec.number.number_type,
+                        p_cur->infoRec[digitCount].rec.number.number_plan);
+                appendPrintBuf("%spi=%c,si=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.pi,
+                        p_cur->infoRec[digitCount].rec.number.si);
+                break;
+            case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.len);
+                for (int i =0;i<(int)(p_cur->infoRec[digitCount].rec.number.len);i++) {
+                    p.writeInt32(p_cur->infoRec[digitCount].rec.number.buf[i]);
+                }
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_type);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_plan);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.pi);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.si);
+                appendPrintBuf("%s[len=%c,buf=%s,number_type=%c,number_plan=%c,",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.len,
+                        p_cur->infoRec[digitCount].rec.number.buf,
+                        p_cur->infoRec[digitCount].rec.number.number_type,
+                        p_cur->infoRec[digitCount].rec.number.number_plan);
+                appendPrintBuf("%spi=%c,si=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.pi,
+                        p_cur->infoRec[digitCount].rec.number.si);
+                break;
+            case RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.len);
+                for(int i =0;i<(int)(p_cur->infoRec[digitCount].rec.number.len);i++){
+                    p.writeInt32(p_cur->infoRec[digitCount].rec.number.buf[i]);
+                }
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_type);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_plan);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.pi);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.si);
+                appendPrintBuf("%s[len=%c,buf=%s,number_type=%c,number_plan=%c,",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.len,
+                        p_cur->infoRec[digitCount].rec.number.buf,
+                        p_cur->infoRec[digitCount].rec.number.number_type,
+                        p_cur->infoRec[digitCount].rec.number.number_plan);
+                appendPrintBuf("%spi=%c,si=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.pi,
+                        p_cur->infoRec[digitCount].rec.number.si);
+                break;
+            case RIL_CDMA_SIGNAL_INFO_REC:
+                marshallSignalInfoRecord(p, p_cur->infoRec[digitCount].rec.signal);
+                appendPrintBuf("%s[isPresent=%c,signalType=%c,alertPitch=%c,signal=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.signal.isPresent,
+                        p_cur->infoRec[digitCount].rec.signal.signalType,
+                        p_cur->infoRec[digitCount].rec.signal.alertPitch,
+                        p_cur->infoRec[digitCount].rec.signal.signal);
+                break;
+            case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.len);
+                for (int i =0;\
+                        i<(int)(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.len);i++){
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.buf[i]);
+                }
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.number_type);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.number_plan);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.pi);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.si);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingReason);
+                appendPrintBuf("%s[len=%c,buf=%s,number_type=%c,number_plan=%c,",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.len,
+                        p_cur->infoRec[digitCount].rec.number.buf,
+                        p_cur->infoRec[digitCount].rec.number.number_type,
+                        p_cur->infoRec[digitCount].rec.number.number_plan);
+                appendPrintBuf("%spi=%c,si=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.pi,
+                        p_cur->infoRec[digitCount].rec.number.si);
+                break;
+            case RIL_CDMA_LINE_CONTROL_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlPolarityIncluded);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlToggle);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlReverse);
+                p.writeInt32( p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlPowerDenial);
+                appendPrintBuf("%s[PolarityIncluded=%c,CtrlToggle=%c,CtrlReverse=%c,\
+                        CtrlPowerDenial=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlPolarityIncluded,
+                        p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlToggle,
+                        p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlReverse,
+                        p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlPowerDenial);
+                break;
+            case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
+                break;
+            case RIL_CDMA_T53_CLIR_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.clir.cause);
+                appendPrintBuf("%s[cause=%c]",printBuf,p_cur->infoRec[digitCount].rec.clir.cause);
+                break;
+
+            case RIL_CDMA_T53_RELEASE_INFO_REC:
+                break;
+            case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.audioCtrl.upLink);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.audioCtrl.downLink);
+                appendPrintBuf("%s[uplink=%c,downlink=%c]",
+                        printBuf,p_cur->infoRec[digitCount].rec.audioCtrl.upLink,
+                        p_cur->infoRec[digitCount].rec.audioCtrl.downLink);
+                 break;
+            default:
+                LOGE ("Invalid request");
+                break;
+        }
+    }
+
+
+   closeResponse;
+
+  return 0;
+}
+
+static int responseRilSignalStrength(Parcel &p, void *response, size_t responselen) {
+     if (response == NULL && responselen != 0) {
+        LOGE("invalid response: NULL");
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    if ((responselen != sizeof (RIL_SignalStrength))
+         && (responselen % sizeof (void *) == 0)) {
+        // Old RIL deprecated
+        RIL_GW_SignalStrength *p_cur = ((RIL_GW_SignalStrength *) response);
+
+        p.writeInt32(7);
+        p.writeInt32(p_cur->signalStrength);
+        p.writeInt32(p_cur->bitErrorRate);
+        for (int i = 0; i < 5; i++) {
+            p.writeInt32(0);
+        }
+    } else if (responselen == sizeof (RIL_SignalStrength)) {
+        // New RIL
+        RIL_SignalStrength *p_cur = ((RIL_SignalStrength *) response);
+
+        p.writeInt32(7);
+        p.writeInt32(p_cur->GW_SignalStrength.signalStrength);
+        p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);
+        p.writeInt32(p_cur->CDMA_SignalStrength.dbm);
+        p.writeInt32(p_cur->CDMA_SignalStrength.ecio);
+        p.writeInt32(p_cur->EVDO_SignalStrength.dbm);
+        p.writeInt32(p_cur->EVDO_SignalStrength.ecio);
+        p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio);
+    } else {
+        LOGE("invalid response length");
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    startResponse;
+    appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\
+            CDMA_SignalStrength.dbm=%d,CDMA_SignalStrength.ecio=%d,\
+            EVDO_SignalStrength.dbm =%d,EVDO_SignalStrength.ecio=%d,\
+            EVDO_SignalStrength.signalNoiseRatio=%d]",
+            printBuf,
+            p_cur->GW_SignalStrength.signalStrength,
+            p_cur->GW_SignalStrength.bitErrorRate,
+            p_cur->CDMA_SignalStrength.dbm,
+            p_cur->CDMA_SignalStrength.ecio,
+            p_cur->EVDO_SignalStrength.dbm,
+            p_cur->EVDO_SignalStrength.ecio,
+            p_cur->EVDO_SignalStrength.signalNoiseRatio);
+
+    closeResponse;
+
+    return 0;
+}
+
+static int responseCallRing(Parcel &p, void *response, size_t responselen) {
+    if ((response == NULL) || (responselen == 0)) {
+        return responseVoid(p, response, responselen);
+    } else {
+        return responseCdmaSignalInfoRecord(p, response, responselen);
+    }
+}
+
+static int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) {
+    if (response == NULL || responselen == 0) {
+        LOGE("invalid response: NULL");
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) {
+        LOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n",
+            (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord));
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    startResponse;
+
+    RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response);
+    marshallSignalInfoRecord(p, *p_cur);
+
+    appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\
+              signal=%d]",
+              printBuf,
+              p_cur->isPresent,
+              p_cur->signalType,
+              p_cur->alertPitch,
+              p_cur->signal);
+
+    closeResponse;
+    return 0;
+}
+
+static int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen) {
+    if (response == NULL && responselen != 0) {
+        LOGE("invalid response: NULL");
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    if (responselen != sizeof(RIL_CDMA_CallWaiting)) {
+        LOGE("invalid response length %d expected %d\n",
+            (int)responselen, (int)sizeof(RIL_CDMA_CallWaiting));
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    startResponse;
+    RIL_CDMA_CallWaiting *p_cur = ((RIL_CDMA_CallWaiting *) response);
+
+    writeStringToParcel (p, p_cur->number);
+    p.writeInt32(p_cur->numberPresentation);
+    writeStringToParcel (p, p_cur->name);
+    marshallSignalInfoRecord(p, p_cur->signalInfoRecord);
+
+    appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\
+            signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\
+            signal=%d]",
+            printBuf,
+            p_cur->number,
+            p_cur->numberPresentation,
+            p_cur->name,
+            p_cur->signalInfoRecord.isPresent,
+            p_cur->signalInfoRecord.signalType,
+            p_cur->signalInfoRecord.alertPitch,
+            p_cur->signalInfoRecord.signal);
+
+    closeResponse;
+
+    return 0;
+}
+
+static void triggerEvLoop() {
     int ret;
     if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
         /* trigger event loop to wakeup. No reason to do this,
@@ -1591,8 +1906,7 @@
     }
 }
 
-static void rilEventAddWakeup(struct ril_event *ev)
-{
+static void rilEventAddWakeup(struct ril_event *ev) {
     ril_event_add(ev);
     triggerEvLoop();
 }
@@ -1606,7 +1920,7 @@
     }
 
     if (responselen % sizeof (RIL_CardStatus *) != 0) {
-        LOGE("invalid response length %d expected multiple of %d\n", 
+        LOGE("invalid response length %d expected multiple of %d\n",
             (int)responselen, (int)sizeof (RIL_CardStatus *));
         return RIL_ERRNO_INVALID_RESPONSE;
     }
@@ -1644,7 +1958,7 @@
     closeResponse;
 
     return 0;
-} 
+}
 
 static int responseBrSmsCnf(Parcel &p, void *response, size_t responselen) {
     int num;
@@ -1655,7 +1969,7 @@
     }
 
     if (responselen % sizeof(RIL_BroadcastSMSConfig) != 0) {
-        LOGE("invalid response length %d expected multiple of %d", 
+        LOGE("invalid response length %d expected multiple of %d",
                 (int)responselen, (int)sizeof(RIL_BroadcastSMSConfig));
         return RIL_ERRNO_INVALID_RESPONSE;
     }
@@ -1669,7 +1983,7 @@
     p.writeInt32(p_cur->entries->uFromServiceID);
     p.writeInt32(p_cur->entries->uToserviceID);
     p.write(&(p_cur->entries->bSelected),sizeof(p_cur->entries->bSelected));
-    
+
     startResponse;
     appendPrintBuf("%s size=%d, entries.uFromServiceID=%d, \
             entries.uToserviceID=%d, entries.bSelected =%d, ",
@@ -2529,7 +2843,6 @@
     return;
 
 error_exit:
-    // There was an error and we've got the wake lock so release it.
     if (shouldScheduleTimeout) {
         releaseWakeLock();
     }
@@ -2755,11 +3068,15 @@
         case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
         case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
         case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
-        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
         case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
         case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
         case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
         case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
+        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
+        case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
+        case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
+        case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
+        case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
         case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
         default: return "<unknown request>";
     }
diff --git a/libril/ril_unsol_commands.h b/libril/ril_unsol_commands.h
index 4cfa3aa..7eff708 100644
--- a/libril/ril_unsol_commands.h
+++ b/libril/ril_unsol_commands.h
@@ -23,7 +23,7 @@
     {RIL_UNSOL_ON_USSD, responseStrings, WAKE_PARTIAL},
     {RIL_UNSOL_ON_USSD_REQUEST, responseVoid, DONT_WAKE},
     {RIL_UNSOL_NITZ_TIME_RECEIVED, responseString, WAKE_PARTIAL},
-    {RIL_UNSOL_SIGNAL_STRENGTH, responseInts, DONT_WAKE},
+    {RIL_UNSOL_SIGNAL_STRENGTH, responseRilSignalStrength, DONT_WAKE},
     {RIL_UNSOL_DATA_CALL_LIST_CHANGED, responseDataCallList, WAKE_PARTIAL},
     {RIL_UNSOL_SUPP_SVC_NOTIFICATION, responseSsn, WAKE_PARTIAL},
     {RIL_UNSOL_STK_SESSION_END, responseVoid, WAKE_PARTIAL},
@@ -32,16 +32,14 @@
     {RIL_UNSOL_STK_CALL_SETUP, responseInts, WAKE_PARTIAL},
     {RIL_UNSOL_SIM_SMS_STORAGE_FULL, responseVoid, WAKE_PARTIAL},
     {RIL_UNSOL_SIM_REFRESH, responseInts, WAKE_PARTIAL},
-    {RIL_UNSOL_CALL_RING, responseVoid, WAKE_PARTIAL},
+    {RIL_UNSOL_CALL_RING, responseCallRing, WAKE_PARTIAL},
     {RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, responseVoid, WAKE_PARTIAL},
     {RIL_UNSOL_RESPONSE_CDMA_NEW_SMS, responseCdmaSms, WAKE_PARTIAL},
     {RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS, responseString, WAKE_PARTIAL},
     {RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL, responseVoid, WAKE_PARTIAL},
     {RIL_UNSOL_RESTRICTED_STATE_CHANGED, responseInts, WAKE_PARTIAL},
-    // TODO(): Need to update the response func for the following 4 commands,
-    // once they've been implemented.
     {RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE, responseVoid, WAKE_PARTIAL},
-    {RIL_UNSOL_CDMA_CALL_WAITING, responseVoid, WAKE_PARTIAL},
+    {RIL_UNSOL_CDMA_CALL_WAITING, responseCdmaCallWaiting, WAKE_PARTIAL},
     {RIL_UNSOL_CDMA_OTA_PROVISION_STATUS, responseInts, WAKE_PARTIAL},
-    {RIL_UNSOL_CDMA_INFO_REC, responseVoid, WAKE_PARTIAL},
+    {RIL_UNSOL_CDMA_INFO_REC, responseCdmaInformationRecords, WAKE_PARTIAL},
     {RIL_UNSOL_OEM_HOOK_RAW, responseRaw, WAKE_PARTIAL}
diff --git a/reference-ril/reference-ril.c b/reference-ril/reference-ril.c
index bf3889c..348234d 100644
--- a/reference-ril/reference-ril.c
+++ b/reference-ril/reference-ril.c
@@ -141,7 +141,11 @@
  * Note: directly modified line and has *p_call point directly into
  * modified line
  */
+#if NEWRIL
+static int callFromCLCCLine(char *line, RIL_Call *p_call)
+#else
 static int callFromCLCCLine(char *line, RIL_CallOld *p_call)
+#endif
 {
         //+CLCC: 1,0,2,0,0,\"+18005551212\",145
         //     index,isMT,state,mode,isMpty(,number,TOA)?
@@ -470,8 +474,13 @@
     ATLine *p_cur;
     int countCalls;
     int countValidCalls;
+#if NEWRIL
+    RIL_Call *p_calls;
+    RIL_Call **pp_calls;
+#else
     RIL_CallOld *p_calls;
     RIL_CallOld **pp_calls;
+#endif
     int i;
     int needRepoll = 0;
 
@@ -499,9 +508,15 @@
 
     /* yes, there's an array of pointers and then an array of structures */
 
+#if NEWRIL
+    pp_calls = (RIL_Call **)alloca(countCalls * sizeof(RIL_Call *));
+    p_calls = (RIL_Call *)alloca(countCalls * sizeof(RIL_Call));
+    memset (p_calls, 0, countCalls * sizeof(RIL_Call));
+#else
     pp_calls = (RIL_CallOld **)alloca(countCalls * sizeof(RIL_CallOld *));
     p_calls = (RIL_CallOld *)alloca(countCalls * sizeof(RIL_CallOld));
     memset (p_calls, 0, countCalls * sizeof(RIL_CallOld));
+#endif
 
     /* init the pointer array */
     for(i = 0; i < countCalls ; i++) {
@@ -566,8 +581,13 @@
     s_repollCallsCount = 0;
 #endif /*WORKAROUND_ERRONEOUS_ANSWER*/
 
+#if NEWRIL
+    RIL_onRequestComplete(t, RIL_E_SUCCESS, pp_calls,
+            countValidCalls * sizeof (RIL_Call *));
+#else
     RIL_onRequestComplete(t, RIL_E_SUCCESS, pp_calls,
             countValidCalls * sizeof (RIL_CallOld *));
+#endif
 
     at_response_free(p_response);
 
