diff --git a/include/telephony/ril.h b/include/telephony/ril.h
index e7070d2..66f6494 100644
--- a/include/telephony/ril.h
+++ b/include/telephony/ril.h
@@ -92,7 +92,7 @@
 #define CDMA_NUMBER_INFO_BUFFER_LENGTH 81
 
 #define MAX_RILDS 3
-#define MAX_SOCKET_NAME_LENGTH 6
+#define MAX_SERVICE_NAME_LENGTH 6
 #define MAX_CLIENT_ID_LENGTH 2
 #define MAX_DEBUG_SOCKET_NAME_LENGTH 12
 #define MAX_QEMU_PIPE_NAME_LENGTH  11
diff --git a/libril/RilSapSocket.cpp b/libril/RilSapSocket.cpp
index e153ef5..cf99773 100644
--- a/libril/RilSapSocket.cpp
+++ b/libril/RilSapSocket.cpp
@@ -30,15 +30,6 @@
 
 static RilSapSocket::RilSapSocketList *head = NULL;
 
-void ril_sap_on_request_complete (
-        RIL_Token t, RIL_Errno e,
-        void *response, size_t responselen
-);
-
-void ril_sap_on_unsolicited_response (
-        int unsolResponse, const void *data,
-        size_t datalen
-);
 extern "C" void
 RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
         const struct timeval *relativeTime);
@@ -123,14 +114,14 @@
 void RilSapSocket::initSapSocket(const char *socketName,
         RIL_RadioFunctions *uimFuncs) {
 
-    if (strcmp(socketName, "sap_uim_socket1") == 0) {
+    if (strcmp(socketName, RIL1_SERVICE_NAME) == 0) {
         if(!SocketExists(socketName)) {
             addSocketToList(socketName, RIL_SOCKET_1, uimFuncs);
         }
     }
 
 #if (SIM_COUNT >= 2)
-    if (strcmp(socketName, "sap_uim_socket2") == 0) {
+    if (strcmp(socketName, RIL2_SERVICE_NAME) == 0) {
         if(!SocketExists(socketName)) {
             addSocketToList(socketName, RIL_SOCKET_2, uimFuncs);
         }
@@ -138,7 +129,7 @@
 #endif
 
 #if (SIM_COUNT >= 3)
-    if (strcmp(socketName, "sap_uim_socket3") == 0) {
+    if (strcmp(socketName, RIL3_SERVICE_NAME) == 0) {
         if(!SocketExists(socketName)) {
             addSocketToList(socketName, RIL_SOCKET_3, uimFuncs);
         }
@@ -146,7 +137,7 @@
 #endif
 
 #if (SIM_COUNT >= 4)
-    if (strcmp(socketName, "sap_uim_socket4") == 0) {
+    if (strcmp(socketName, RIL4_SERVICE_NAME) == 0) {
         if(!SocketExists(socketName)) {
             addSocketToList(socketName, RIL_SOCKET_4, uimFuncs);
         }
@@ -207,49 +198,6 @@
     }
 }
 
-#define BYTES_PER_LINE 16
-
-#define NIBBLE_TO_HEX(n) ({ \
-  uint8_t __n = (uint8_t) (n) & 0x0f; \
-  __nibble >= 10 ? 'A' + __n - 10: '0' + __n; \
-})
-
-#define HEX_HIGH(b) ({ \
-  uint8_t __b = (uint8_t) (b); \
-  uint8_t __nibble = (__b >> 4) & 0x0f; \
-  NIBBLE_TO_HEX(__nibble); \
-})
-
-#define HEX_LOW(b) ({ \
-  uint8_t __b = (uint8_t) (b); \
-  uint8_t __nibble = __b & 0x0f; \
-  NIBBLE_TO_HEX(__nibble); \
-})
-
-void log_hex(const char *who, const uint8_t *buffer, int length) {
-    char out[80];
-    int source = 0;
-    int dest = 0;
-    int dest_len = sizeof(out);
-    int per_line = 0;
-
-    do {
-        dest += snprintf(out, sizeof(out), "%8.8s [%8.8x] ", who, source);
-        for(; source < length && dest_len - dest > 3 && per_line < BYTES_PER_LINE; source++,
-        per_line ++) {
-            out[dest++] = HEX_HIGH(buffer[source]);
-            out[dest++] = HEX_LOW(buffer[source]);
-            out[dest++] = ' ';
-        }
-        if (dest < dest_len && (per_line == BYTES_PER_LINE || source >= length)) {
-            out[dest++] = 0;
-            per_line = 0;
-            dest = 0;
-            RLOGD("%s\n", out);
-        }
-    } while(source < length && dest < dest_len);
-}
-
 void RilSapSocket::dispatchRequest(MsgHeader *req) {
     // SapSocketRequest will be deallocated in onRequestComplete()
     SapSocketRequest* currRequest=(SapSocketRequest*)malloc(sizeof(SapSocketRequest));
diff --git a/libril/ril.cpp b/libril/ril.cpp
index 5054cec..45a06c0 100644
--- a/libril/ril.cpp
+++ b/libril/ril.cpp
@@ -105,7 +105,9 @@
 extern "C" const char * rilSocketIdToString(RIL_SOCKET_ID socket_id);
 
 extern "C"
-char rild[MAX_SOCKET_NAME_LENGTH] = SOCKET_NAME_RIL;
+char ril_service_name_base[MAX_SERVICE_NAME_LENGTH] = RIL_SERVICE_NAME_BASE;
+extern "C"
+char ril_service_name[MAX_SERVICE_NAME_LENGTH] = RIL1_SERVICE_NAME;
 /*******************************************************************/
 
 RIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};
@@ -211,13 +213,13 @@
 #include "ril_unsol_commands.h"
 };
 
-char * RIL_getRilSocketName() {
-    return rild;
+char * RIL_getServiceName() {
+    return ril_service_name;
 }
 
 extern "C"
-void RIL_setRilSocketName(const char * s) {
-    strncpy(rild, s, MAX_SOCKET_NAME_LENGTH);
+void RIL_setServiceName(const char * s) {
+    strncpy(ril_service_name, s, MAX_SERVICE_NAME_LENGTH);
 }
 
 RequestInfo *
@@ -272,34 +274,6 @@
     return pRI;
 }
 
-static int
-blockingWrite(int fd, const void *buffer, size_t len) {
-    size_t writeOffset = 0;
-    const uint8_t *toWrite;
-
-    toWrite = (const uint8_t *)buffer;
-
-    while (writeOffset < len) {
-        ssize_t written;
-        do {
-            written = write (fd, toWrite + writeOffset,
-                                len - writeOffset);
-        } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN)));
-
-        if (written >= 0) {
-            writeOffset += written;
-        } else {   // written < 0
-            RLOGE ("RIL Response: unexpected error on write errno:%d", errno);
-            close(fd);
-            return -1;
-        }
-    }
-#if VDBG
-    RLOGE("RIL Response bytes written:%d", writeOffset);
-#endif
-    return 0;
-}
-
 static void triggerEvLoop() {
     int ret;
     if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
@@ -333,50 +307,6 @@
     } while (ret > 0 || (ret < 0 && errno == EINTR));
 }
 
-static void onCommandsSocketClosed(RIL_SOCKET_ID socket_id) {
-    int ret;
-    RequestInfo *p_cur;
-    /* Hook for current context
-       pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
-    pthread_mutex_t * pendingRequestsMutexHook = &s_pendingRequestsMutex;
-    /* pendingRequestsHook refer to &s_pendingRequests */
-    RequestInfo **    pendingRequestsHook = &s_pendingRequests;
-
-#if (SIM_COUNT >= 2)
-    if (socket_id == RIL_SOCKET_2) {
-        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
-        pendingRequestsHook = &s_pendingRequests_socket2;
-    }
-#if (SIM_COUNT >= 3)
-    else if (socket_id == RIL_SOCKET_3) {
-        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
-        pendingRequestsHook = &s_pendingRequests_socket3;
-    }
-#endif
-#if (SIM_COUNT >= 4)
-    else if (socket_id == RIL_SOCKET_4) {
-        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
-        pendingRequestsHook = &s_pendingRequests_socket4;
-    }
-#endif
-#endif
-    /* mark pending requests as "cancelled" so we dont report responses */
-    ret = pthread_mutex_lock(pendingRequestsMutexHook);
-    assert (ret == 0);
-
-    p_cur = *pendingRequestsHook;
-
-    for (p_cur = *pendingRequestsHook
-            ; p_cur != NULL
-            ; p_cur  = p_cur->p_next
-    ) {
-        p_cur->cancelled = 1;
-    }
-
-    ret = pthread_mutex_unlock(pendingRequestsMutexHook);
-    assert (ret == 0);
-}
-
 static void resendLastNITZTimeData(RIL_SOCKET_ID socket_id) {
     if (s_lastNITZTimeData != NULL) {
         int responseType = (s_callbacks.version >= 13)
@@ -564,18 +494,18 @@
 
         switch(socketType) {
             case RIL_SAP_SOCKET:
-                RilSapSocket::initSapSocket("sap_uim_socket1", UimFuncs);
+                RilSapSocket::initSapSocket(RIL1_SERVICE_NAME, UimFuncs);
 
 #if (SIM_COUNT >= 2)
-                RilSapSocket::initSapSocket("sap_uim_socket2", UimFuncs);
+                RilSapSocket::initSapSocket(RIL2_SERVICE_NAME, UimFuncs);
 #endif
 
 #if (SIM_COUNT >= 3)
-                RilSapSocket::initSapSocket("sap_uim_socket3", UimFuncs);
+                RilSapSocket::initSapSocket(RIL3_SERVICE_NAME, UimFuncs);
 #endif
 
 #if (SIM_COUNT >= 4)
-                RilSapSocket::initSapSocket("sap_uim_socket4", UimFuncs);
+                RilSapSocket::initSapSocket(RIL4_SERVICE_NAME, UimFuncs);
 #endif
                 break;
             default:;
@@ -1320,12 +1250,4 @@
     }
 }
 
-} /* namespace android */
-
-void rilEventAddWakeup_helper(struct ril_event *ev) {
-    android::rilEventAddWakeup(ev);
-}
-
-int blockingWrite_helper(int fd, void *buffer, size_t len) {
-    return android::blockingWrite(fd, buffer, len);
-}
+} /* namespace android */
\ No newline at end of file
diff --git a/libril/ril_internal.h b/libril/ril_internal.h
index 68d3863..646d9b7 100644
--- a/libril/ril_internal.h
+++ b/libril/ril_internal.h
@@ -21,15 +21,11 @@
 
 namespace android {
 
-#define SOCKET_NAME_RIL "rild"
-#define SOCKET2_NAME_RIL "rild2"
-#define SOCKET3_NAME_RIL "rild3"
-#define SOCKET4_NAME_RIL "rild4"
-
-#define OEM_HOOK_SERVICE_NAME "oemhook"
-#define OEM_HOOK2_SERVICE_NAME "oemhook2"
-#define OEM_HOOK3_SERVICE_NAME "oemhook3"
-#define OEM_HOOK4_SERVICE_NAME "oemhook4"
+#define RIL_SERVICE_NAME_BASE "slot"
+#define RIL1_SERVICE_NAME "slot1"
+#define RIL2_SERVICE_NAME "slot2"
+#define RIL3_SERVICE_NAME "slot3"
+#define RIL4_SERVICE_NAME "slot4"
 
 /* Constants for response types */
 #define RESPONSE_SOLICITED 0
@@ -93,7 +89,7 @@
 
 RequestInfo * addRequestToList(int serial, int slotId, int request);
 
-char * RIL_getRilSocketName();
+char * RIL_getServiceName();
 
 void releaseWakeLock();
 
diff --git a/libril/ril_service.cpp b/libril/ril_service.cpp
index 306d7cb..6618ddb 100644
--- a/libril/ril_service.cpp
+++ b/libril/ril_service.cpp
@@ -7931,26 +7931,13 @@
     using namespace android::hardware;
     int simCount = 1;
     const char *serviceNames[] = {
-            android::RIL_getRilSocketName()
+            android::RIL_getServiceName()
             #if (SIM_COUNT >= 2)
-            , SOCKET2_NAME_RIL
+            , RIL2_SERVICE_NAME
             #if (SIM_COUNT >= 3)
-            , SOCKET3_NAME_RIL
+            , RIL3_SERVICE_NAME
             #if (SIM_COUNT >= 4)
-            , SOCKET4_NAME_RIL
-            #endif
-            #endif
-            #endif
-            };
-
-    const char *oemHookServiceNames[] = {
-            OEM_HOOK_SERVICE_NAME
-            #if (SIM_COUNT >= 2)
-            , OEM_HOOK2_SERVICE_NAME
-            #if (SIM_COUNT >= 3)
-            , OEM_HOOK3_SERVICE_NAME
-            #if (SIM_COUNT >= 4)
-            , OEM_HOOK4_SERVICE_NAME
+            , RIL4_SERVICE_NAME
             #endif
             #endif
             #endif
@@ -7972,7 +7959,7 @@
         oemHookService[i]->mSlotId = i;
         RLOGD("registerService: starting IRadio %s", serviceNames[i]);
         android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
-        status = oemHookService[i]->registerAsService(oemHookServiceNames[i]);
+        status = oemHookService[i]->registerAsService(serviceNames[i]);
 
         ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
         assert(ret == 0);
diff --git a/libril/sap_service.cpp b/libril/sap_service.cpp
index 29c2f38..7bed05a 100644
--- a/libril/sap_service.cpp
+++ b/libril/sap_service.cpp
@@ -919,13 +919,13 @@
     using namespace android::hardware;
     int simCount = 1;
     const char *serviceNames[] = {
-        "sap_uim_socket1"
+        android::RIL_getServiceName()
         #if (SIM_COUNT >= 2)
-        , "sap_uim_socket2"
+        , RIL2_SERVICE_NAME
         #if (SIM_COUNT >= 3)
-        , "sap_uim_socket3"
+        , RIL3_SERVICE_NAME
         #if (SIM_COUNT >= 4)
-        , "sap_uim_socket4"
+        , RIL4_SERVICE_NAME
         #endif
         #endif
         #endif
diff --git a/rild/rild.c b/rild/rild.c
index 0ce9eaf..4c28fc0 100644
--- a/rild/rild.c
+++ b/rild/rild.c
@@ -46,7 +46,8 @@
     exit(EXIT_FAILURE);
 }
 
-extern char rild[MAX_SOCKET_NAME_LENGTH];
+extern char ril_service_name_base[MAX_SERVICE_NAME_LENGTH];
+extern char ril_service_name[MAX_SERVICE_NAME_LENGTH];
 
 extern void RIL_register (const RIL_RadioFunctions *callbacks);
 extern void rilc_thread_pool ();
@@ -59,7 +60,7 @@
 
 extern void RIL_onRequestAck(RIL_Token t);
 
-extern void RIL_setRilSocketName(char *);
+extern void RIL_setServiceName(char *);
 
 #if defined(ANDROID_MULTI_SIM)
 extern void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
@@ -147,8 +148,9 @@
         exit(0);
     }
     if (strncmp(clientId, "0", MAX_CLIENT_ID_LENGTH)) {
-        strlcat(rild, clientId, MAX_SOCKET_NAME_LENGTH);
-        RIL_setRilSocketName(rild);
+        strncpy(ril_service_name, ril_service_name_base, MAX_SERVICE_NAME_LENGTH);
+        strncat(ril_service_name, clientId, MAX_SERVICE_NAME_LENGTH);
+        RIL_setServiceName(ril_service_name);
     }
 
     if (rilLibPath == NULL) {
