Code sync from tizen_2.4
[platform/core/telephony/tel-plugin-imc.git] / src / imc_sim.c
index f670077..b057b9e 100644 (file)
@@ -1,7 +1,9 @@
 /*
  * tel-plugin-imc
  *
- * Copyright (c) 2013 Samsung Electronics Co. Ltd. All rights reserved.
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Ankit Jogi <ankit.jogi@samsung.com>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-
 #include <glib.h>
-
 #include <tcore.h>
-#include <server.h>
-#include <plugin.h>
-#include <core_object.h>
 #include <hal.h>
+#include <core_object.h>
+#include <plugin.h>
 #include <queue.h>
-#include <storage.h>
-#include <at.h>
-#include <vconf.h>
-
 #include <co_sim.h>
 #include <co_sms.h>
+#include <storage.h>
+#include <user_request.h>
+#include <server.h>
+#include <at.h>
+#include <ss_manager.h>
 
-#include "imc_sim.h"
 #include "imc_common.h"
+#include "imc_sms.h"
+#include "imc_sim.h"
+
+#define ID_RESERVED_AT 0x0229
+#define SIM_PIN_MAX_RETRY_COUNT         3
+#define SMS_STATE_READY        1
+
+#define SIM_SSM_GROUP_ID "secure-storage::telephony_sim"
+#define SIM_SSM_FILE_IMSI1 "imsi1"
+
+#define SWAPBYTES16(x) \
+       { \
+               unsigned short int data = *(unsigned short int *)&(x);  \
+               data = ((data & 0xff00) >> 8) |   \
+                          ((data & 0x00ff) << 8);        \
+               *(unsigned short int *)&(x) = data;      \
+       }
+
+enum imc_sim_sec_op_e {
+       SEC_PIN1_VERIFY,
+       SEC_PIN2_VERIFY,
+       SEC_PUK1_VERIFY,
+       SEC_PUK2_VERIFY,
+       SEC_SIM_VERIFY,
+       SEC_ADM_VERIFY,
+       SEC_PIN1_CHANGE,
+       SEC_PIN2_CHANGE,
+       SEC_PIN1_ENABLE,
+       SEC_PIN1_DISABLE,
+       SEC_PIN2_ENABLE,
+       SEC_PIN2_DISABLE, /* 10 */
+       SEC_SIM_ENABLE,
+       SEC_SIM_DISABLE,
+       SEC_NET_ENABLE,
+       SEC_NET_DISABLE,
+       SEC_NS_ENABLE,
+       SEC_NS_DISABLE,
+       SEC_SP_ENABLE,
+       SEC_SP_DISABLE,
+       SEC_CP_ENABLE,
+       SEC_CP_DISABLE, /* 20 */
+       SEC_FDN_ENABLE,
+       SEC_FDN_DISABLE,
+       SEC_PIN1_STATUS,
+       SEC_PIN2_STATUS,
+       SEC_FDN_STATUS,
+       SEC_NET_STATUS,
+       SEC_NS_STATUS,
+       SEC_SP_STATUS,
+       SEC_CP_STATUS,
+       SEC_SIM_STATUS,
+       SEC_SIM_UNKNOWN = 0xff
+};
+
+struct imc_sim_property {
+       gboolean b_valid; /**< Valid or not */
+       enum tel_sim_file_id file_id; /**< File identifier */
+       enum tcore_sim_file_type_e file_type; /**< File type and structure */
+       int rec_length; /**< Length of one record in file */
+       int rec_count; /**< Number of records in file */
+       int data_size; /**< File size */
+       int current_index; /**< current index to read */
+       enum imc_sim_sec_op_e current_sec_op; /**< current index to read */
+       int mb_count; /**< Number of MB records in file */
+       struct tel_sim_mbi_list mbi_list;
+       struct tel_sim_mailbox mb_data;
+       struct tresp_sim_read files;
+};
+
+void on_response_update_file(TcorePending *p, int data_len, const void *data, void *user_data);
+static void _next_from_get_file_info(CoreObject *o, UserRequest *ur, enum tel_sim_file_id ef, enum tel_sim_access_result rt);
+static void _next_from_get_file_data(CoreObject *o, UserRequest *ur, enum tel_sim_access_result rt, int decode_ret);
+static gboolean _get_sim_type(CoreObject *o);
+static TReturn _get_file_info(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef);
+static gboolean _get_file_data(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int offset, const int length);
+static gboolean _get_file_record(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int index, const int length);
+static void _sim_status_update(CoreObject *o, enum tel_sim_status sim_status);
+extern gboolean util_byte_to_hex(const char *byte_pdu, char *hex_pdu, int num_bytes);
+
+static void sim_prepare_and_send_pending_request(CoreObject *co, const char *at_cmd, const char *prefix, enum tcore_at_command_type at_cmd_type, TcorePendingResponseCallback callback)
+{
+       TcoreATRequest *req = NULL;
+       TcoreHal *hal = NULL;
+       TcorePending *pending = NULL;
+       TReturn ret;
+
+
+       hal = tcore_object_get_hal(co);
+       dbg("hal: %p", hal);
+
+       pending = tcore_pending_new(co, 0);
+       if (!pending) {
+               dbg("Pending is NULL");
+               return;
+       }
+       req = tcore_at_request_new(at_cmd, prefix, at_cmd_type);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               return;
+       }
+
+       dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
 
-#define ENABLE_FLAG 1
-#define DISABLE_FLAG 2
-
-#define IMC_SIM_ACCESS_READ_BINARY             176
-#define IMC_SIM_ACCESS_READ_RECORD             178
-#define IMC_SIM_ACCESS_GET_RESPONSE            192
-#define IMC_SIM_ACCESS_UPDATE_BINARY           214
-#define IMC_SIM_ACCESS_UPDATE_RECORD           220
-
-#define IMC_SIM_READ_FILE(co, cb, cb_data, fileId, ret) \
-{ \
-       ImcSimMetaInfo file_meta = {0, }; \
-       ImcRespCbData *resp_cb_data = NULL; \
-       \
-       file_meta.file_id = fileId; \
-       file_meta.file_result = TEL_SIM_RESULT_FAILURE; \
-       \
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data, &file_meta, sizeof(ImcSimMetaInfo)); \
-       \
-       ret =  __imc_sim_get_response(co, resp_cb_data); \
-       dbg("Request reading '%s' - [%s]", #fileId, (ret == TEL_RETURN_SUCCESS ? "SUCCESS" : "FAILURE")); \
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, callback, NULL);
+       tcore_pending_link_user_request(pending, NULL); /* set user request to NULL - this is internal request */
+       ret = tcore_hal_send_request(hal, pending);
+       if (ret != TCORE_RETURN_SUCCESS) {
+               err("error: [0x%x]", ret);
+               tcore_pending_free(pending);
+               tcore_at_request_free(req);
+       }
+       return;
 }
 
-typedef enum {
-       IMC_SIM_FILE_TYPE_DEDICATED = 0x00,     /**< Dedicated */
-       IMC_SIM_FILE_TYPE_TRANSPARENT = 0x01,   /**< Transparent -binary type*/
-       IMC_SIM_FILE_TYPE_LINEAR_FIXED = 0x02,  /**< Linear fixed - record type*/
-       IMC_SIM_FILE_TYPE_CYCLIC = 0x04,        /**< Cyclic - record type*/
-       IMC_SIM_FILE_TYPE_INVALID_TYPE = 0xFF   /**< Invalid type */
-} ImcSimFileType;
-
-typedef enum {
-       IMC_SIM_CURR_SEC_OP_PIN1_VERIFY,
-       IMC_SIM_CURR_SEC_OP_PIN2_VERIFY,
-       IMC_SIM_CURR_SEC_OP_PUK1_VERIFY,
-       IMC_SIM_CURR_SEC_OP_PUK2_VERIFY,
-       IMC_SIM_CURR_SEC_OP_SIM_VERIFY,
-       IMC_SIM_CURR_SEC_OP_ADM_VERIFY,
-       IMC_SIM_CURR_SEC_OP_PIN1_CHANGE,
-       IMC_SIM_CURR_SEC_OP_PIN2_CHANGE,
-       IMC_SIM_CURR_SEC_OP_PIN1_ENABLE,
-       IMC_SIM_CURR_SEC_OP_PIN1_DISABLE,
-       IMC_SIM_CURR_SEC_OP_PIN2_ENABLE,
-       IMC_SIM_CURR_SEC_OP_PIN2_DISABLE, // 10
-       IMC_SIM_CURR_SEC_OP_SIM_ENABLE,
-       IMC_SIM_CURR_SEC_OP_SIM_DISABLE,
-       IMC_SIM_CURR_SEC_OP_NET_ENABLE,
-       IMC_SIM_CURR_SEC_OP_NET_DISABLE,
-       IMC_SIM_CURR_SEC_OP_NS_ENABLE,
-       IMC_SIM_CURR_SEC_OP_NS_DISABLE,
-       IMC_SIM_CURR_SEC_OP_SP_ENABLE,
-       IMC_SIM_CURR_SEC_OP_SP_DISABLE,
-       IMC_SIM_CURR_SEC_OP_CP_ENABLE,
-       IMC_SIM_CURR_SEC_OP_CP_DISABLE, // 20
-       IMC_SIM_CURR_SEC_OP_FDN_ENABLE,
-       IMC_SIM_CURR_SEC_OP_FDN_DISABLE,
-       IMC_SIM_CURR_SEC_OP_PIN1_STATUS,
-       IMC_SIM_CURR_SEC_OP_PIN2_STATUS,
-       IMC_SIM_CURR_SEC_OP_FDN_STATUS,
-       IMC_SIM_CURR_SEC_OP_NET_STATUS,
-       IMC_SIM_CURR_SEC_OP_NS_STATUS,
-       IMC_SIM_CURR_SEC_OP_SP_STATUS,
-       IMC_SIM_CURR_SEC_OP_CP_STATUS,
-       IMC_SIM_CURR_SEC_OP_SIM_STATUS,
-       IMC_SIM_CURR_SEC_OP_SIM_UNKNOWN = 0xff
-} ImcSimCurrSecOp;
-
-typedef struct {
-       guint smsp_count;                                       /**< SMSP record count */
-       guint smsp_rec_len;                                     /**< SMSP record length */
-} ImcSimPrivateInfo;
-
-typedef struct {
-       gboolean b_valid;                                       /**< Valid or not */
-       guint rec_length;                                       /**< Length of one record in file */
-       guint rec_count;                                        /**< Number of records in file */
-       guint data_size;                                        /**< File size */
-       guint current_index;                                    /**< Current index to read */
-       ImcSimFileType file_type;                               /**< File type and structure */
-       ImcSimCurrSecOp sec_op;                                 /**< Current index to read */
-       TelSimMailboxList mbi_list;                             /**< Mailbox List */
-       TelSimMailBoxNumber mb_list[TEL_SIM_MSP_CNT_MAX*5];     /**< Mailbox number */
-       TelSimFileId file_id;                                   /**< Current file id */
-       TelSimResult file_result;                               /**< File access result */
-       TelSimFileResult files;                                 /**< File read data */
-       TcoreCommand req_command;                               /**< Request command Id */
-       TelSimImsiInfo imsi;                                    /**< Stored locally as of now,
-                                                                         Need to store in secure storage*/
-} ImcSimMetaInfo;
-
-/* Utility Function Declaration */
-static TelSimResult __imc_sim_decode_status_word(unsigned short status_word1, unsigned short status_word2);
-static void __imc_sim_update_sim_status(CoreObject *co, TelSimCardStatus sim_status);
-static void __imc_sim_notify_sms_state(CoreObject *co, gboolean sms_ready);
-static TelReturn __imc_sim_start_to_cache(CoreObject *co);
-static gboolean __imc_sim_get_sim_type(CoreObject *co, TcoreObjectResponseCallback cb, void *cb_data);
-static void __imc_sim_next_from_read_binary(CoreObject *co, ImcRespCbData *resp_cb_data, TelSimResult sim_result, gboolean decode_ret);
-static void __imc_sim_next_from_get_response(CoreObject *co, ImcRespCbData *resp_cb_data, TelSimResult sim_result);
-static TelReturn __imc_sim_update_file(CoreObject *co, ImcRespCbData *resp_cb_data, int cmd, TelSimFileId ef,
-                                               int p1, int p2, int p3, char *encoded_data);
-static void __imc_sim_read_record(CoreObject *co, ImcRespCbData *resp_cb_data);
-static void __imc_sim_read_binary(CoreObject *co, ImcRespCbData *resp_cb_data);
-static TelReturn __imc_sim_get_response (CoreObject *co, ImcRespCbData *resp_cb_data);
-static TelReturn __imc_sim_get_retry_count(CoreObject *co, ImcRespCbData *resp_cb_data);
-static TelSimLockType __imc_sim_lock_type(int lock_type);
-static char *__imc_sim_get_fac_from_lock_type(TelSimLockType lock_type, ImcSimCurrSecOp *sec_op, int flag);
-static int __imc_sim_get_lock_type(ImcSimCurrSecOp sec_op);
-
-/* Internal Response Functions*/
-static void __on_response_imc_sim_get_sim_type_internal(CoreObject *co, gint result, const void *response, void *user_data);
-static void __on_response_imc_sim_get_sim_type(TcorePending *p, guint data_len, const void *data, void *user_data);
-static void __on_response_imc_sim_read_data(TcorePending *p, guint data_len, const void *data, void *user_data);
-static void __on_response_imc_sim_get_response(TcorePending *p, guint data_len, const void *data, void *user_data);
-static void __on_response_imc_sim_get_retry_count(TcorePending *p, guint data_len, const void *data, void *user_data);
-static void __on_response_imc_sim_update_file(TcorePending *p, guint data_len, const void *data, void *user_data);
-
-/* GET SMSP info for SMS module */
-gboolean imc_sim_get_smsp_info(TcorePlugin *plugin, int *rec_count, int *rec_len)
+
+static enum tcore_response_command _find_resp_command(UserRequest *ur)
 {
-       CoreObject *co = NULL;
-       ImcSimPrivateInfo *priv_info = NULL;
+       enum tcore_request_command command;
 
-       dbg("Entry");
+       command = tcore_user_request_get_command(ur);
+       switch (command) {
+       case TREQ_SIM_VERIFY_PINS:
+               return TRESP_SIM_VERIFY_PINS;
+               break;
 
-       co = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_SIM);
-       priv_info = tcore_sim_ref_userdata(co);
-       if(!priv_info)
-               return FALSE;
+       case TREQ_SIM_VERIFY_PUKS:
+               return TRESP_SIM_VERIFY_PUKS;
+               break;
 
-       *rec_count = priv_info->smsp_count;
-       *rec_len = priv_info->smsp_rec_len;
+       case TREQ_SIM_CHANGE_PINS:
+               return TRESP_SIM_CHANGE_PINS;
+               break;
 
-       dbg("smsp_count:[%d], smsp_rec_len:[%d]", priv_info->smsp_count, priv_info->smsp_rec_len);
-       return TRUE;
+       case TREQ_SIM_GET_FACILITY_STATUS:
+               return TRESP_SIM_GET_FACILITY_STATUS;
+               break;
+
+       case TREQ_SIM_DISABLE_FACILITY:
+               return TRESP_SIM_DISABLE_FACILITY;
+               break;
+
+       case TREQ_SIM_ENABLE_FACILITY:
+               return TRESP_SIM_ENABLE_FACILITY;
+               break;
+
+       case TREQ_SIM_GET_LOCK_INFO:
+               return TRESP_SIM_GET_LOCK_INFO;
+               break;
+
+       case TREQ_SIM_TRANSMIT_APDU:
+               return TRESP_SIM_TRANSMIT_APDU;
+               break;
+
+       case TREQ_SIM_GET_ATR:
+               return TRESP_SIM_GET_ATR;
+               break;
+
+       case TREQ_SIM_GET_ECC:
+               return TRESP_SIM_GET_ECC;
+               break;
+
+       case TREQ_SIM_GET_LANGUAGE:
+               return TRESP_SIM_GET_LANGUAGE;
+               break;
+
+       case TREQ_SIM_SET_LANGUAGE:
+               return TRESP_SIM_SET_LANGUAGE;
+               break;
+
+       case TREQ_SIM_GET_ICCID:
+               return TRESP_SIM_GET_ICCID;
+               break;
+
+       case TREQ_SIM_GET_MAILBOX:
+               return TRESP_SIM_GET_MAILBOX;
+               break;
+
+       case TREQ_SIM_SET_MAILBOX:
+               return TRESP_SIM_SET_MAILBOX;
+               break;
+
+       case TREQ_SIM_GET_CALLFORWARDING:
+               return TRESP_SIM_GET_CALLFORWARDING;
+               break;
+
+       case TREQ_SIM_SET_CALLFORWARDING:
+               return TRESP_SIM_SET_CALLFORWARDING;
+               break;
+
+       case TREQ_SIM_GET_MESSAGEWAITING:
+               return TRESP_SIM_GET_MESSAGEWAITING;
+               break;
+
+       case TREQ_SIM_SET_MESSAGEWAITING:
+               return TRESP_SIM_SET_MESSAGEWAITING;
+               break;
+
+       case TREQ_SIM_GET_CPHS_INFO:
+               return TRESP_SIM_GET_CPHS_INFO;
+               break;
+
+       case TREQ_SIM_GET_MSISDN:
+               return TRESP_SIM_GET_MSISDN;
+               break;
+
+       case TREQ_SIM_GET_SPN:
+               return TRESP_SIM_GET_SPN;
+               break;
+
+       case TREQ_SIM_GET_SPDI:
+               return TRESP_SIM_GET_SPDI;
+               break;
+
+       case TREQ_SIM_GET_OPL:
+               return TRESP_SIM_GET_OPL;
+               break;
+
+       case TREQ_SIM_GET_PNN:
+               return TRESP_SIM_GET_PNN;
+               break;
+
+       case TREQ_SIM_GET_CPHS_NETNAME:
+               return TRESP_SIM_GET_CPHS_NETNAME;
+               break;
+
+       case TREQ_SIM_GET_OPLMNWACT:
+               return TRESP_SIM_GET_OPLMNWACT;
+               break;
+
+       case TREQ_SIM_REQ_AUTHENTICATION:
+               return TRESP_SIM_REQ_AUTHENTICATION;
+               break;
+
+       case TREQ_SIM_GET_SERVICE_TABLE:
+               return TRESP_SIM_GET_SERVICE_TABLE;
+               break;
+
+       default:
+               break;
+       }
+       return TRESP_UNKNOWN;
 }
 
-static void __imc_sim_set_identity(CoreObject *co, TelSimImsiInfo *imsi)
+static int _sim_get_current_pin_facility(enum imc_sim_sec_op_e op)
 {
-       gchar new_imsi[15 + 1] = {0, };
-       gchar *old_imsi;
-
-       memcpy(&new_imsi, imsi->mcc, strlen(imsi->mcc));
-       memcpy(&new_imsi[strlen(imsi->mcc)], imsi->mnc, strlen(imsi->mnc));
-       memcpy(&new_imsi[strlen(imsi->mcc) + strlen(imsi->mnc)], imsi->msin, strlen(imsi->msin));
-
-       /* TODO: This is temporary code, we should use secure storage instead of vconf */
-       old_imsi = vconf_get_str("db/telephony/imsi");
-       if (old_imsi) {
-               if (g_strcmp0(old_imsi, new_imsi) != 0) {
-                       dbg("New SIM");
-                       vconf_set_str("db/telephony/imsi", new_imsi);
-                       tcore_sim_set_identification(co, TRUE);
-               } else {
-                       dbg("Same SIM");
-                       tcore_sim_set_identification(co, FALSE);
-               }
-       } else {
-               dbg("Old IMSI value is NULL, set IMSI");
-               vconf_set_str("db/telephony/imsi", new_imsi);
-               tcore_sim_set_identification(co, TRUE);
+       int ret_type = 0;
+
+       dbg("current sec_op[%d]", op);
+
+       switch (op) {
+       case SEC_PIN1_VERIFY:
+       case SEC_PIN1_CHANGE:
+               ret_type = SIM_PTYPE_PIN1;
+               break;
+
+       case SEC_PIN2_VERIFY:
+       case SEC_PIN2_CHANGE:
+               ret_type = SIM_PTYPE_PIN2;
+               break;
+
+       case SEC_PUK1_VERIFY:
+               ret_type = SIM_PTYPE_PUK1;
+               break;
+
+       case SEC_PUK2_VERIFY:
+               ret_type = SIM_PTYPE_PUK2;
+               break;
+
+       case SEC_SIM_VERIFY:
+               ret_type = SIM_PTYPE_SIM;
+               break;
+
+       case SEC_ADM_VERIFY:
+               ret_type = SIM_PTYPE_ADM;
+               break;
+
+       case SEC_PIN1_ENABLE:
+       case SEC_PIN1_DISABLE:
+       case SEC_PIN1_STATUS:
+               ret_type = SIM_FACILITY_SC;
+               break;
+
+       case SEC_SIM_ENABLE:
+       case SEC_SIM_DISABLE:
+       case SEC_SIM_STATUS:
+               ret_type = SIM_FACILITY_PS;
+               break;
+
+       case SEC_NET_ENABLE:
+       case SEC_NET_DISABLE:
+       case SEC_NET_STATUS:
+               ret_type = SIM_FACILITY_PN;
+               break;
+
+       case SEC_NS_ENABLE:
+       case SEC_NS_DISABLE:
+       case SEC_NS_STATUS:
+               ret_type = SIM_FACILITY_PU;
+               break;
+
+       case SEC_SP_ENABLE:
+       case SEC_SP_DISABLE:
+       case SEC_SP_STATUS:
+               ret_type = SIM_FACILITY_PP;
+               break;
+
+       case SEC_CP_ENABLE:
+       case SEC_CP_DISABLE:
+       case SEC_CP_STATUS:
+               ret_type = SIM_FACILITY_PC;
+               break;
+
+       case SEC_FDN_ENABLE:
+       case SEC_FDN_DISABLE:
+       case SEC_FDN_STATUS:
+               ret_type = SIM_FACILITY_FD;
+               break;
+
+       default:
+               dbg("not handled current sec op[%d]", op);
+               break;
        }
+       return ret_type;
 }
 
-/* Utility Functions */
-static TelSimResult __imc_sim_decode_status_word(unsigned short status_word1, unsigned short status_word2)
+static enum tel_sim_access_result _decode_status_word(unsigned short status_word1, unsigned short status_word2)
 {
-       TelSimResult rst = TEL_SIM_RESULT_FAILURE;
+       enum tel_sim_access_result rst = SIM_ACCESS_FAILED;
 
        if (status_word1 == 0x93 && status_word2 == 0x00) {
+               rst = SIM_ACCESS_FAILED;
                /*Failed SIM request command*/
                dbg("error - SIM application toolkit busy [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x94 && status_word2 == 0x00) {
+               rst = SIM_ACCESS_FAILED;
                /*Failed SIM request command*/
                dbg("error - No EF Selected [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x94 && status_word2 == 0x02) {
+               rst = SIM_ACCESS_FAILED;
                /*Failed SIM request command*/
                dbg("error - Out of Range - Invalid address or record number[%x][%x]",
                        status_word1, status_word2);
        } else if (status_word1 == 0x94 && status_word2 == 0x04) {
+               rst = SIM_ACCESS_FILE_NOT_FOUND;
                /*Failed SIM request command*/
                dbg("error - File ID not found [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x94 && status_word2 == 0x08) {
+               rst = SIM_ACCESS_FAILED; /* MOdem not support */
                /*Failed SIM request command*/
                dbg("error - File is inconsistent with command - Modem not support or USE IPC [%x][%x]",
                        status_word1, status_word2);
        } else if (status_word1 == 0x98 && status_word2 == 0x02) {
+               rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
                /*Failed SIM request command*/
                dbg("error - CHV not initialized [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x98 && status_word2 == 0x04) {
+               rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
                /*Failed SIM request command*/
                dbg("error - Access condition not fullfilled [%x][%x]", status_word1, status_word2);
                dbg("error -Unsuccessful CHV verification - at least one attempt left [%x][%x]",
@@ -235,13 +402,16 @@ static TelSimResult __imc_sim_decode_status_word(unsigned short status_word1, un
                        status_word1, status_word2);
                dbg("error - Authentication failure [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x98 && status_word2 == 0x08) {
+               rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
                /*Failed SIM request command*/
                dbg("error - Contradiction with CHV status [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x98 && status_word2 == 0x10) {
+               rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
                /*Failed SIM request command*/
                dbg("error - Contradiction with invalidation status [%x][%x]",
                        status_word1, status_word2);
        } else if (status_word1 == 0x98 && status_word2 == 0x40) {
+               rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
                /*Failed SIM request command*/
                dbg("error -Unsuccessful CHV verification - no attempt left [%x][%x]",
                        status_word1, status_word2);
@@ -249,449 +419,650 @@ static TelSimResult __imc_sim_decode_status_word(unsigned short status_word1, un
                        status_word1, status_word2);
                dbg("error - CHV blocked [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x67 && status_word2 == 0x00) {
+               rst = SIM_ACCESS_FAILED;
                dbg("error -Incorrect Parameter 3 [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x6B && status_word2 == 0x00) {
+               rst = SIM_ACCESS_FAILED;
                dbg("error -Incorrect Parameter 1 or 2 [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x6D && status_word2 == 0x00) {
+               rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
                dbg("error -Unknown instruction given as command [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x6E && status_word2 == 0x00) {
+               rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
                dbg("error -Unknown instruction given as command [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x69 && status_word2 == 0x82) {
+               rst = SIM_ACCESS_CONDITION_NOT_SATISFIED;
                dbg("error -Access denied [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x6A && status_word2 == 0x87) {
+               rst = SIM_ACCESS_FAILED;
                dbg("error -Incorrect parameters [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x6A && status_word2 == 0x82) {
+               rst = SIM_ACCESS_FILE_NOT_FOUND; /* not sure of the SW1 and SW2 meaning here */
                dbg("error -File Not found [%x][%x]", status_word1, status_word2);
        } else if (status_word1 == 0x6A && status_word2 == 0x83) {
+               rst = SIM_ACCESS_FILE_NOT_FOUND; /* not sure of the SW1 and SW2 meaning here */
                dbg("error -Record Not found [%x][%x]", status_word1, status_word2);
        } else {
-               rst = TEL_SIM_RESULT_CARD_ERROR;
+               rst = SIM_ACCESS_CARD_ERROR;
                dbg("error -Unknown state [%x][%x]", status_word1, status_word2);
        }
        return rst;
 }
 
-static void __imc_sim_update_sim_status(CoreObject *co, TelSimCardStatus sim_status)
+#if 0
+static gboolean _sim_check_identity(CoreObject *co_sim, struct tel_sim_imsi *imsi)
 {
-       TelSimCardStatus curr_sim_status;
+       gboolean is_changed = TRUE;
+       char new_imsi[16 + 1]; /* IMSI is 15 digit, but for distingushing between plmn and msin, define as 16 bytes. */
+       char *imsi_buf = NULL;
+       int ret_val = 0;
 
-       /*
-        * Send SIM Init status, if not sent already
-        */
-       (void)tcore_sim_get_status(co, &curr_sim_status);
-       if (sim_status != curr_sim_status) {
-               TelSimCardStatusInfo sim_status_noti = {0, };
+       dbg("Entry");
+       if (NULL == imsi) {
+               err("imsi is NULL");
+               return FALSE;
+       }
 
-               dbg("Change in SIM State - Old State: [0x%02x] --> New State: [0x%02x]",
-                               curr_sim_status, sim_status);
+       memset(new_imsi, 0x5F, 16);
+       memcpy(new_imsi, imsi->plmn, strlen(imsi->plmn));
+       memcpy(&new_imsi[6], imsi->msin, strlen(imsi->msin));
+       new_imsi[6 + strlen(imsi->msin)] = '\0';
 
-               /* Update SIM Status */
-               tcore_sim_set_status(co, sim_status);
-               sim_status_noti.status = sim_status;
-               tcore_sim_get_identification(co, &sim_status_noti.change_status);
+       ret_val = ssa_get(SIM_SSM_FILE_IMSI1, &imsi_buf, SIM_SSM_GROUP_ID, NULL);
+       if (ret_val >= 0 && imsi_buf != NULL) {
+               if (strncmp(imsi_buf, new_imsi, 16) == 0)
+                       is_changed = FALSE;
+               free(imsi_buf);
+       }
 
-               /* Send notification: SIM Status */
-               tcore_object_send_notification(co,
-                       TCORE_NOTIFICATION_SIM_STATUS,
-                       sizeof(sim_status_noti), &sim_status_noti);
+       if (is_changed) {
+               dbg("NEW SIM");
+               /* Update file */
+               ret_val = ssa_put(SIM_SSM_FILE_IMSI1, new_imsi, strlen(new_imsi) + 1, SIM_SSM_GROUP_ID, NULL);
+               if (ret_val < 0)
+                       err("ssa_put failed. ret_val=[%d]", ret_val);
        }
+
+       /* Update sim identification */
+       tcore_sim_set_identification(co_sim, is_changed);
+       return TRUE;
 }
+#endif
 
-static void __imc_sim_notify_sms_state(CoreObject *co,
-                                               gboolean sms_ready)
+static TReturn __sim_update_file(CoreObject *o, UserRequest *ur, enum tel_sim_file_id ef,
+                                       char *encoded_data, unsigned int encoded_len, int rec_index)
 {
-       TcorePlugin *plugin;
-       CoreObject *co_sms;
-       gboolean sms_status = FALSE;
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
+       char *cmd_str = NULL;
+       struct imc_sim_property *meta_info = NULL;
+       int p1 = 0;
+       int p2 = 0;
+       int p3 = 0;
+       int cmd = 0;
 
        dbg("Entry");
 
-       plugin = tcore_object_ref_plugin(co);
-       co_sms = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_SMS);
-       tcore_check_return_assert(co_sms != NULL);
-
-       (void)tcore_sms_get_ready_status(co_sms, &sms_status);
-       if (sms_status == sms_ready) {
-               dbg("No change in SMS Status: [%s]",
-                       (sms_status ? "INITIALIZED" : "UNINITIALIZED"));
-       } else {
-               TelSimCardStatus sim_status;
-
-               /* Update SMS State */
-               tcore_sms_set_ready_status(co_sms, sms_ready);
-
-               dbg("SMS Status - Changed [%s] --> [%s]",
-                       (sms_status ? "INITIALIZED" : "UNINITIALIZED"),
-                       (sms_ready ? "INITIALIZED" : "UNINITIALIZED"));
-
-               /*
-                * Send SMS device ready notification, if SIM is initialiazed.
-                */
-               (void)tcore_sim_get_status(co, &sim_status);
-               if (sim_status == TEL_SIM_STATUS_SIM_INIT_COMPLETED) {
-                       /* Send notification: SMS Device ready */
-                       tcore_object_send_notification(co_sms,
-                               TCORE_NOTIFICATION_SMS_DEVICE_READY,
-                               sizeof(sms_ready), &sms_ready);
-               }
+       hal = tcore_object_get_hal(o);
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return TCORE_RETURN_FAILURE;
        }
-}
+       meta_info = (struct imc_sim_property *)tcore_user_request_ref_metainfo(ur, NULL);
+
+       meta_info->file_id = ef;
+       dbg("File ID: [0x%x]", meta_info->file_id);
+
+       switch (ef) {
+       case SIM_EF_CPHS_CALL_FORWARD_FLAGS:
+       case SIM_EF_ELP:
+       case SIM_EF_LP:
+       case SIM_EF_CPHS_VOICE_MSG_WAITING:
+               p1 = 0;
+               p2 = 0;
+               p3 = encoded_len;
+               cmd = 214;
+       break;
 
-TelReturn __imc_sim_start_to_cache(CoreObject *co)
-{
-       TelReturn ret;
-       IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_IMSI, ret);
-       IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_CPHS_CPHS_INFO, ret);
-       IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_ICCID, ret);
-       IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_SPN, ret);
-       IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_SST, ret);
-       IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_ECC, ret);
-       IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_MSISDN, ret);
-       IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_SMSP, ret);
+       case SIM_EF_USIM_CFIS:
+       case SIM_EF_USIM_MWIS:
+       case SIM_EF_CPHS_MAILBOX_NUMBERS:
+       case SIM_EF_MBDN:
+       case SIM_EF_USIM_MBI:
+               p1 = rec_index;
+               p2 = 0x04;
+               p3 = encoded_len;
+               cmd = 220;
+       break;
 
-       return ret;
-}
+       default:
+               err("Unhandled File ID[0x%04x]", ef);
+               tcore_pending_free(pending);
+               return TCORE_RETURN_EINVAL;
+       }
 
-static void __on_response_imc_sim_get_sim_type_internal(CoreObject *co,
-       gint result, const void *response, void *user_data)
-{
-       dbg("SIM Response - SIM Type (internal): [+XUICC]");
+       cmd_str = g_strdup_printf("AT+CRSM=%d, %d, %d, %d, %d, \"%s\"", cmd, ef, p1, p2, p3, encoded_data);
 
-       if (result == TEL_SIM_RESULT_SUCCESS) {
-               TelSimCardType *sim_type = (TelSimCardType *)response;
-               dbg("SIM Type: [%d]", *sim_type);
+       req = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return TCORE_RETURN_FAILURE;
+       }
+       g_free(cmd_str);
 
-               /* Update SIM type */
-               tcore_sim_set_type(co, *sim_type);
-               if (*sim_type != TEL_SIM_CARD_TYPE_UNKNOWN) {
-                       TelReturn ret;
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
 
-                       /* Start Caching SIM files */
-                       ret = __imc_sim_start_to_cache(co);
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, on_response_update_file, hal);
+       tcore_pending_link_user_request(pending, ur);
+       tcore_hal_send_request(hal, pending);
 
-                       /* Send SIM Type notification */
-                       tcore_object_send_notification(co,
-                               TCORE_NOTIFICATION_SIM_TYPE,
-                               sizeof(TelSimCardType), sim_type);
-               }
-       }
+       dbg("Exit");
+       return TRUE;
 }
 
-static void __on_response_imc_sim_get_sim_type(TcorePending *p,
-       guint data_len, const void *data, void *user_data)
-{
-       const TcoreAtResponse *at_resp = data;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       ImcRespCbData *resp_cb_data = user_data;
-       TelSimCardType sim_type = TEL_SIM_CARD_TYPE_UNKNOWN;
 
-       TelSimResult result = TEL_SIM_RESULT_FAILURE;
+static TReturn __set_file_data(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef)
+{
+       struct imc_sim_property *meta_info = NULL;
+       TReturn ret_code = TCORE_RETURN_FAILURE;
+       int encoded_len = 0;
+       enum tcore_request_command command;
+       char *tmp = NULL;
+       char *encoded_data = NULL;
+       int rec_index = -1;
 
-       dbg("SIM Response - SIM Type: [+XUICC]");
+       dbg("Entry");
 
-       tcore_check_return_assert(co != NULL);
-       tcore_check_return_assert(resp_cb_data != NULL);
+       if (!o || !ur) {
+               err("NULL data : CoreObject[%p] UR[%p]", o, ur);
+               return TCORE_RETURN_EINVAL;
+       }
+       command = tcore_user_request_get_command(ur);
+       meta_info = (struct imc_sim_property *)tcore_user_request_ref_metainfo(ur, NULL);
+
+       switch (command) {
+       case TREQ_SIM_SET_LANGUAGE: {
+               const struct treq_sim_set_language *lang = NULL;
+               struct tel_sim_language language = {0, };
+
+               lang = tcore_user_request_ref_data(ur, NULL);
+               language.language_count = 1;
+               language.language[0] = lang->language;
+               if (tcore_sim_get_type(o) == SIM_TYPE_GSM && ef == SIM_EF_LP) {
+                       dbg("Encoding EF-LP, language[%d]", lang->language);
+                       tmp = tcore_sim_encode_lp(&encoded_len, &language);
+               } else {
+                       dbg("Encoding EF-ELP, language[%d]", lang->language);
+                       tmp = tcore_sim_encode_li(&encoded_len, &language);
+               }
+       }
+       break;
 
-       if (at_resp && at_resp->success) {
-               if (at_resp->lines) {
-                       const gchar *line;
-                       GSList *tokens;
+       case TREQ_SIM_SET_CALLFORWARDING: {
+               const struct treq_sim_set_callforwarding *cf = NULL;
 
-                       line = (const gchar *)at_resp->lines->data;
+               cf = tcore_user_request_ref_data(ur, NULL);
+               if (ef == SIM_EF_CPHS_CALL_FORWARD_FLAGS) {
+                       if (cf->b_cphs) {
+                               tmp = tcore_sim_encode_cff((const struct tel_sim_cphs_cf *)&cf->cphs_cf, meta_info->data_size);
+                       } else {
+                               /* Convert 3GPP data to CPHS data */
+                               struct tel_sim_cphs_cf cphs_cf;
 
-                       /*
-                        * Tokenize
-                        *
-                        *      +XUICC: <state>
-                        */
-                       tokens = tcore_at_tok_new(line);
+                               dbg("Convert 3GPP data to CPHS data");
+                               memset(&cphs_cf, 0x00, sizeof(struct tel_sim_cphs_cf));
+                               if (cf->cf.cfu_status & 0x01)
+                                       cphs_cf.b_line1 = TRUE;
 
-                       /* <state> */
-                       if (g_slist_length(tokens) == 1) {
-                               guint state = atoi(g_slist_nth_data(tokens, 0));
+                               if (cf->cf.cfu_status & 0x02)
+                                       cphs_cf.b_fax = TRUE;
 
-                               if (state == 0) /* 0 - 2G SIM */
-                                       sim_type = TEL_SIM_CARD_TYPE_GSM;
-                               else if (state == 1)    /* 1 - 3G SIM */
-                                       sim_type = TEL_SIM_CARD_TYPE_USIM;
+                               if (cf->cf.cfu_status & 0x04)
+                                       cphs_cf.b_data = TRUE;
 
-                               result = TEL_SIM_RESULT_SUCCESS;
-                       }
-                       else {
-                               err("Invalid message");
+                               tmp = tcore_sim_encode_cff((const struct tel_sim_cphs_cf *)&cphs_cf, meta_info->data_size);
                        }
 
-                       tcore_at_tok_free(tokens);
+                       if (tmp) {
+                               encoded_len = strlen(tmp);
+                       } else {
+                               err("NULL Encoding Data[%p].. No Updating EF", tmp);
+                               goto EXIT;
+                       }
+               } else if (ef == SIM_EF_USIM_CFIS) {
+                       tmp = tcore_sim_encode_cfis(&encoded_len, (const struct tel_sim_cfis *)&cf->cf);
+                       rec_index = cf->cf.rec_index;
+               } else {
+                       err("Invalid File ID[0x%04x]", ef);
+                       goto EXIT;
                }
        }
+       break;
 
-       /* Invoke callback */
-       if (resp_cb_data->cb)
-               resp_cb_data->cb(co, (gint)result, &sim_type, resp_cb_data->cb_data);
+       case TREQ_SIM_SET_MESSAGEWAITING: {
+               const struct treq_sim_set_messagewaiting *mw = NULL;
 
-       /* Free callback data */
-       imc_destroy_resp_cb_data(resp_cb_data);
-}
+               mw = tcore_user_request_ref_data(ur, NULL);
+               if (ef == SIM_EF_CPHS_VOICE_MSG_WAITING) {
+                       if (mw->b_cphs) {
+                               tmp = tcore_sim_encode_vmwf(&encoded_len, (const struct tel_sim_cphs_mw *)&mw->cphs_mw, meta_info->data_size);
+                       } else {
+                               /* Convert 3GPP data to CPHS data */
+                               struct tel_sim_cphs_mw cphs_mw;
 
-/*
- * Operation - get_sim_type
- *
- * Request -
- * AT-Command: AT+XUICC?
- *
- * Response - sim_type (TelSimCardType)
- * Success: (Single line) -
- *     + XUICC: <state>
- *     OK
- * Failure:
- *     +CME ERROR: <error>
- */
-gboolean __imc_sim_get_sim_type(CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       ImcRespCbData *resp_cb_data;
-       TelReturn ret;
-
-       /* Response callback data */
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
-                               NULL, 0);
-
-       /* Send Request to modem */
-       ret = tcore_at_prepare_and_send_request(co,
-               "AT+XUICC?", "+XUICC:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               __on_response_imc_sim_get_sim_type, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get SIM Type");
+                               dbg("Convert 3GPP data to CPHS data");
+                               memset(&cphs_mw, 0x00, sizeof(struct tel_sim_cphs_mw));
 
-       return ret;
-}
+                               if (mw->mw.indicator_status & 0x01)
+                                       cphs_mw.b_voice1 = TRUE;
 
-static void __imc_sim_process_sim_status(CoreObject *co, guint sim_state)
-{
-       TelSimCardStatus sim_card_status;
+                               if (mw->mw.indicator_status & 0x02)
+                                       cphs_mw.b_fax = TRUE;
 
-       switch (sim_state) {
-       case 0:
-               sim_card_status = TEL_SIM_STATUS_CARD_NOT_PRESENT;
-               dbg("NO SIM");
-       break;
+                               if (mw->mw.indicator_status & 0x04)
+                                       cphs_mw.b_data = TRUE;
 
-       case 1:
-               sim_card_status = TEL_SIM_STATUS_SIM_PIN_REQUIRED;
-               dbg("PIN REQUIRED");
+                               tmp = tcore_sim_encode_vmwf(&encoded_len, (const struct tel_sim_cphs_mw *)&cphs_mw, meta_info->data_size);
+                       }
+               } else if (ef == SIM_EF_USIM_MWIS) {
+                       tmp = tcore_sim_encode_mwis(&encoded_len, (const struct tel_sim_mw *)&mw->mw, meta_info->rec_length);
+                       rec_index = mw->mw.rec_index;
+                       if (tmp)
+                               encoded_len = meta_info->rec_length;
+               } else {
+                       err("Invalid File ID[0x%04x]", ef);
+                       goto EXIT;
+               }
+       }
        break;
 
-       case 2:
-               sim_card_status = TEL_SIM_STATUS_SIM_INITIALIZING;
-               dbg("PIN DISABLED AT BOOT UP");
-       break;
+       case TREQ_SIM_SET_MAILBOX: {
+               const struct treq_sim_set_mailbox *mb = NULL;
 
-       case 3:
-               sim_card_status = TEL_SIM_STATUS_SIM_INITIALIZING;
-               dbg("PIN VERIFIED");
-       break;
+               mb = tcore_user_request_ref_data(ur, NULL);
+               if (ef == SIM_EF_USIM_MBI) {
+                       gboolean mbi_changed = FALSE;
+                       struct tel_sim_mbi mbi;
 
-       case 4:
-               sim_card_status = TEL_SIM_STATUS_SIM_PUK_REQUIRED;
-               dbg("PUK REQUIRED");
-       break;
+                       do {
+                               meta_info->current_index++;
+                               memcpy(&mbi, &meta_info->mbi_list.mbi[meta_info->current_index - 1], sizeof(struct tel_sim_mbi));
 
-       case 5:
-               sim_card_status = TEL_SIM_STATUS_SIM_PUK_REQUIRED;
-               dbg("CARD PERMANENTLY BLOCKED");
-       break;
+                               switch (mb->mb_info.mb_type) {
+                               case SIM_MAILBOX_VOICE:
+                                       if (mbi.voice_index != mb->mb_info.rec_index) {
+                                               mbi_changed = TRUE;
+                                               mbi.voice_index = mb->mb_info.rec_index;
+                                       }
+                               break;
 
-       case 6:
-               sim_card_status = TEL_SIM_STATUS_CARD_ERROR;
-               dbg("SIM CARD ERROR");
-       break;
+                               case SIM_MAILBOX_FAX:
+                                       if (mbi.fax_index != mb->mb_info.rec_index) {
+                                               mbi_changed = TRUE;
+                                               mbi.fax_index = mb->mb_info.rec_index;
+                                       }
+                               break;
 
-       case 7:
-               sim_card_status = TEL_SIM_STATUS_SIM_INIT_COMPLETED;
-               dbg("SIM INIT COMPLETED");
-       break;
+                               case SIM_MAILBOX_EMAIL:
+                                       if (mbi.email_index != mb->mb_info.rec_index) {
+                                               mbi_changed = TRUE;
+                                               mbi.email_index = mb->mb_info.rec_index;
+                                       }
+                               break;
 
-       case 8:
-               sim_card_status = TEL_SIM_STATUS_CARD_ERROR;
-               dbg("SIM CARD ERROR");
-       break;
+                               case SIM_MAILBOX_OTHER:
+                                       if (mbi.other_index != mb->mb_info.rec_index) {
+                                               mbi_changed = TRUE;
+                                               mbi.other_index = mb->mb_info.rec_index;
+                                       }
+                               break;
 
-       case 9:
-               sim_card_status = TEL_SIM_STATUS_CARD_REMOVED;
-               dbg("SIM REMOVED");
-       break;
+                               case SIM_MAILBOX_VIDEO:
+                                       if (mbi.video_index != mb->mb_info.rec_index) {
+                                               mbi_changed = TRUE;
+                                               mbi.video_index = mb->mb_info.rec_index;
+                                       }
+                               break;
 
-       case 12:
-               dbg("SIM SMS Ready");
+                               case SIM_MAILBOX_DATA:
+                               default:
+                               break;
+                               }
 
-               /* Notify SMS status */
-               return __imc_sim_notify_sms_state(co, TRUE);
+                               dbg("mbi_changed[%d], profile_count[%d], index (voice[%d], fax[%d], email[%d], other[%d], video[%d])",
+                                               mbi_changed, meta_info->mbi_list.profile_count,
+                                               mbi.voice_index, mbi.fax_index, mbi.email_index, mbi.other_index, mbi.video_index);
+                       } while (mbi_changed == FALSE && meta_info->current_index < meta_info->mbi_list.profile_count);
 
-       case 99:
-               sim_card_status = TEL_SIM_STATUS_UNKNOWN;
-               dbg("SIM STATE UNKNOWN");
+                       if (mbi_changed == TRUE) {
+                               rec_index = meta_info->current_index;
+                               tmp = tcore_sim_encode_mbi(&mbi, meta_info->rec_length);
+                               if (tmp)
+                                       encoded_len = meta_info->rec_length;
+                       }
+               } else if (ef == SIM_EF_CPHS_MAILBOX_NUMBERS) {
+                       tmp = tcore_sim_encode_xdn(meta_info->rec_length, (struct tel_sim_dialing_number *)&mb->mb_info.number_info);
+                       rec_index = mb->mb_info.rec_index;
+                       if (tmp)
+                               encoded_len = meta_info->rec_length;
+               } else if (ef == SIM_EF_MBDN) {
+                       tmp = tcore_sim_encode_xdn(meta_info->rec_length, (struct tel_sim_dialing_number *)&mb->mb_info.number_info);
+                       rec_index = mb->mb_info.rec_index;
+                       if (tmp)
+                               encoded_len = meta_info->rec_length;
+               } else {
+                       err("Invalid File ID[0x%04x]", ef);
+                       goto EXIT;
+               }
+       }
        break;
 
        default:
-               err("Unknown/Unsupported SIM state: [%d]", sim_state);
-               return;
+               err("Unhandled update REQUEST command[%d]", command);
+               ret_code = TCORE_RETURN_EINVAL;
+               goto EXIT;
        }
 
-       switch (sim_card_status) {
-       case TEL_SIM_STATUS_SIM_INIT_COMPLETED: {
-               TelSimCardType sim_type;
+       if (tmp) {
+               encoded_data = (char *) g_malloc0(2 * (encoded_len) + 1);
+               if (encoded_data == NULL) {
+                       err("Memory allocation failed!!");
+                       free(tmp);
+                       return ret_code;
+               }
 
-               dbg("SIM INIT COMPLETED");
-
-               (void)tcore_sim_get_type(co, &sim_type);
-               if (sim_type == TEL_SIM_CARD_TYPE_UNKNOWN) {
-                       /*
-                        * SIM is initialized for first time, need to
-                        * fetch SIM type
-                        */
-                       (void)__imc_sim_get_sim_type(co,
-                               __on_response_imc_sim_get_sim_type_internal, NULL);
-
-                       return;
-               }
+               memset(encoded_data, 0x00, (2 * encoded_len) + 1);
+               util_byte_to_hex(tmp, encoded_data, encoded_len);
+               free(tmp);
+       } else {
+               err("Failed to Encode data");
+               goto EXIT;
        }
-       break;
 
-       case TEL_SIM_STATUS_CARD_REMOVED:
-               dbg("SIM CARD REMOVED");
-               tcore_sim_set_type(co, TEL_SIM_CARD_TYPE_UNKNOWN);
+       dbg("Encoded Data length =[%d]", encoded_len);
+       tcore_util_hex_dump("[Encoded Data] ", encoded_len, encoded_data);
+
+       switch (ef) {
+       case SIM_EF_CPHS_CALL_FORWARD_FLAGS:
+       case SIM_EF_ELP:
+       case SIM_EF_LP:
+       case SIM_EF_CPHS_VOICE_MSG_WAITING:
+               ret_code = __sim_update_file(o, ur, ef, encoded_data, encoded_len, 0);
        break;
 
-       case TEL_SIM_STATUS_CARD_NOT_PRESENT:
-               dbg("SIM CARD NOT PRESENT");
-               tcore_sim_set_type(co, TEL_SIM_CARD_TYPE_UNKNOWN);
+       case SIM_EF_USIM_CFIS:
+       case SIM_EF_USIM_MWIS:
+       case SIM_EF_CPHS_MAILBOX_NUMBERS:
+       case SIM_EF_MBDN:
+               ret_code = __sim_update_file(o, ur, ef, encoded_data, encoded_len, rec_index);
        break;
 
-       case TEL_SIM_STATUS_CARD_ERROR:
-               dbg("SIM CARD ERROR");
-               tcore_sim_set_type(co, TEL_SIM_CARD_TYPE_UNKNOWN);
+       case SIM_EF_USIM_MBI:
+               if (rec_index > 0)
+                       ret_code = __sim_update_file(o, ur, ef, encoded_data, encoded_len, rec_index);
+               else
+                       memset(meta_info, 0x00, sizeof(struct imc_sim_property));
        break;
 
        default:
-               err("SIM Status: [0x%02x]", sim_card_status);
+               err("Unhandled File ID[0x%04x]", ef);
+               ret_code = TCORE_RETURN_EINVAL;
        break;
        }
 
-       /* Update SIM Status */
-       return __imc_sim_update_sim_status(co, sim_card_status);
+EXIT:
+       if (encoded_data) {
+               free(encoded_data);
+               encoded_data = NULL;
+       }
+
+       return ret_code;
 }
 
-static void __on_response_imc_sim_get_sim_status(TcorePending *p,
-       guint data_len, const void *data, void *user_data)
+static void _next_from_get_file_info(CoreObject *o, UserRequest *ur, enum tel_sim_file_id ef, enum tel_sim_access_result rt)
 {
-       const TcoreAtResponse *at_resp = data;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       ImcRespCbData *resp_cb_data = (ImcRespCbData *)user_data;
-       dbg("Enter");
+       struct tresp_sim_read resp = {0, };
+       struct imc_sim_property *meta_info = NULL;
+       enum tcore_request_command command = TREQ_UNKNOWN;
+       enum tel_sim_type sim_type = SIM_TYPE_UNKNOWN;
+
+       dbg("EF[0x%x] access Result[%d]", ef, rt);
+
+       resp.result = rt;
+       memset(&resp.data, 0x00, sizeof(resp.data));
+       meta_info = (struct imc_sim_property *)tcore_user_request_ref_metainfo(ur, NULL);
+       command = tcore_user_request_get_command(ur);
+       sim_type = tcore_sim_get_type(o);
+
+       if ((ef != SIM_EF_ELP && ef != SIM_EF_LP && ef != SIM_EF_USIM_PL && ef != SIM_EF_CPHS_CPHS_INFO)
+               && (rt != SIM_ACCESS_SUCCESS)) {
+               tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &resp);
+               return;
+       }
 
-       dbg("SIM Response - SIM status: [+XSIMSTATE]");
+       switch (ef) {
+       case SIM_EF_ELP:
+               if (rt == SIM_ACCESS_SUCCESS) {
+                       dbg("[SIM DATA] exist EFELP/PL(0x2F05)");
+                       if (command == TREQ_SIM_SET_LANGUAGE)
+                               __set_file_data(o, ur, ef);
+                       else
+                               _get_file_data(o, ur, ef, 0, meta_info->data_size);
+               } else {
+                       if (sim_type == SIM_TYPE_GSM) {
+                               dbg("[SIM DATA]SIM_EF_ELP(2F05) access fail. Request SIM_EF_LP(0x6F05) info");
+                               /* The ME requests the Language Preference (EFLP) if EFELP is not available */
+                               _get_file_info(o, ur, SIM_EF_LP);
+                       } else if (sim_type == SIM_TYPE_USIM) {
+                               dbg(
+                                       " [SIM DATA]fail to get Language information in USIM(EF-LI(6F05), EF-PL(2F05)). Request SIM_EF_ECC(0x6FB7) info");
+                               /* EFELPand EFLI not present at this point. */
+                               /*                                      po->language.lang_cnt = 0;*/
+                               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                       sizeof(struct tresp_sim_read), &resp);
+                               return;
+                       }
+               }
+               break;
 
-       tcore_check_return_assert(co != NULL);
-       tcore_check_return_assert(resp_cb_data != NULL);
+       case SIM_EF_LP:   /* same with SIM_EF_USIM_LI */
+               if (rt == SIM_ACCESS_SUCCESS) {
+                       dbg("[SIM DATA] exist EFLP/LI(0x6F05)");
+                       if (command == TREQ_SIM_SET_LANGUAGE)
+                               __set_file_data(o, ur, ef);
+                       else
+                               _get_file_data(o, ur, ef, 0, meta_info->data_size);
+               } else {
+                       dbg("[SIM DATA]SIM_EF_LP/LI(6F05) access fail. Current CardType[%d]",
+                               sim_type);
+                       if (sim_type == SIM_TYPE_GSM) {
+                               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                       sizeof(struct tresp_sim_read), &resp);
+                               return;
+                       }
+                       /* if EFLI is not present, then the language selection shall be as defined in EFPL at the MF level      */
+                       else if (sim_type == SIM_TYPE_USIM) {
+                               dbg("[SIM DATA] try USIM EFPL(0x2F05)");
+                               _get_file_info(o, ur, SIM_EF_ELP);
+                       }
+               }
+               break;
 
-       if (at_resp && at_resp->success) {
-               if (at_resp->lines) {
-                       const gchar *line = NULL;
+       case SIM_EF_USIM_PL:
+               if (rt == SIM_ACCESS_SUCCESS) {
+                       dbg("[SIM DATA] exist EFELP/PL(0x2F05)");
+                       if (command == TREQ_SIM_SET_LANGUAGE)
+                               __set_file_data(o, ur, ef);
+                       else
+                               _get_file_data(o, ur, SIM_EF_ELP, 0, meta_info->data_size);
+               } else {
+                       /* EFELIand EFPL not present, so set language count as zero and select ECC */
+                       dbg(" [SIM DATA]SIM_EF_USIM_PL(2A05) access fail. Request SIM_EF_ECC(0x6FB7) info");
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                                        sizeof(struct tresp_sim_read), &resp);
+                       return;
+               }
+               break;
 
-                       /* Process +XSIMSTATE response */
-                       line = (const gchar *) (at_resp->lines->data);
-                       if (line != NULL) {
-                               GSList *tokens;
-                               guint sim_state, sms_state;
+       case SIM_EF_ECC:
+               if (sim_type == SIM_TYPE_GSM) {
+                       _get_file_data(o, ur, ef, 0, meta_info->data_size);
+               } else if (sim_type == SIM_TYPE_USIM) {
+                       if (meta_info->rec_count > SIM_ECC_RECORD_CNT_MAX)
+                               meta_info->rec_count = SIM_ECC_RECORD_CNT_MAX;
 
-                               /*
-                                * Tokenize
-                                *
-                                * +XSIMSTATE: <mode>,<SIM state>,<PB Ready>,<SMS Ready>
-                                */
-                               tokens = tcore_at_tok_new(line);
+                       meta_info->current_index++;
+                       _get_file_record(o, ur, ef, meta_info->current_index, meta_info->rec_length);
+               }
+               break;
 
-                               if (g_slist_length(tokens) == 4) {
-                                       /* <SIM state> */
-                                       sim_state = atoi(g_slist_nth_data(tokens, 1));
+       case SIM_EF_ICCID:
+       case SIM_EF_IMSI:
+       case SIM_EF_SST:
+       case SIM_EF_SPN:
+       case SIM_EF_SPDI:
+       case SIM_EF_CPHS_VOICE_MSG_WAITING:
+       case SIM_EF_CPHS_OPERATOR_NAME_STRING:
+       case SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
+       case SIM_EF_CPHS_DYNAMICFLAGS:
+       case SIM_EF_CPHS_DYNAMIC2FLAG:
+       case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
+       case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2:
+       case SIM_EF_OPLMN_ACT:
+               _get_file_data(o, ur, ef, 0, meta_info->data_size);
+               break;
 
-                                       /* Process SIM Status */
-                                       __imc_sim_process_sim_status(co, sim_state);
+       case SIM_EF_CPHS_CALL_FORWARD_FLAGS:
+               if (command == TREQ_SIM_SET_CALLFORWARDING)
+                       __set_file_data(o, ur, ef);
+               else
+                       _get_file_data(o, ur, ef, 0, meta_info->data_size);
+       break;
 
-                                       /* <SMS Ready> */
-                                       sms_state = atoi(g_slist_nth_data(tokens, 3));
+       case SIM_EF_CPHS_CPHS_INFO:
+               if (rt == SIM_ACCESS_SUCCESS) {
+                       tcore_sim_set_cphs_status(o, TRUE);
+                       if (!tcore_user_request_ref_communicator(ur)) {
+                               dbg("internal CPHS INFO request before sim status update");
+                               _sim_status_update(o, SIM_STATUS_INIT_COMPLETED);
+                       } else {
+                               dbg("external CPHS INFO request");
+                               _get_file_data(o, ur, ef, 0, meta_info->data_size);
+                       }
+               } else {
+                       tcore_sim_set_cphs_status(o, FALSE);
+                       if (!tcore_user_request_ref_communicator(ur)) {
+                               dbg("internal CPHS INFO request before sim status update");
+                               _sim_status_update(o, SIM_STATUS_INIT_COMPLETED);
+                       } else {
+                               dbg("external CPHS INFO request");
+                               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                                                sizeof(struct tresp_sim_read), &resp);
+                       }
+               }
+               break;
 
-                                       /* Notify SMS status */
-                                       __imc_sim_notify_sms_state(co, (sms_state > 0));
+       case SIM_EF_USIM_CFIS:
+               if (command == TREQ_SIM_SET_CALLFORWARDING) {
+                       __set_file_data(o, ur, ef);
+               } else {
+                       if (meta_info->rec_count > SIM_CF_RECORD_CNT_MAX)
+                               meta_info->rec_count = SIM_CF_RECORD_CNT_MAX;
 
-                               } else {
-                                       err("Invalid message");
-                               }
+                       meta_info->current_index++;
+                       _get_file_record(o, ur, ef, meta_info->current_index, meta_info->rec_length);
+               }
+               break;
 
-                               tcore_at_tok_free(tokens);
-                       }
+       case SIM_EF_USIM_MWIS:
+               if (command == TREQ_SIM_SET_MESSAGEWAITING) {
+                       __set_file_data(o, ur, ef);
+               } else {
+                       meta_info->current_index++;
+                       _get_file_record(o, ur, ef, meta_info->current_index, meta_info->rec_length);
                }
-       }
+               break;
 
-       /* Free callback data */
-       imc_destroy_resp_cb_data(resp_cb_data);
-}
+       case SIM_EF_USIM_MBI:
+               if (command == TREQ_SIM_SET_MAILBOX) {
+                       __set_file_data(o, ur, ef);
+               } else {
+                       meta_info->current_index++;
+                       _get_file_record(o, ur, ef, meta_info->current_index, meta_info->rec_length);
+               }
+               break;
 
-/*
- * Operation - get_sim_status
- *
- * Request -
- * AT-Command: AT+XSIMSTATE?
- *
- * Response - sim_status
- * Success: (Single line) -
- *     +XSIMSTATE: <mode>,<SIM state>,<PB Ready>,<SMS Ready>
- *     OK
- * Failure:
- *     +CME ERROR: <error>
- */
-static gboolean __imc_sim_get_sim_status(CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       ImcRespCbData *resp_cb_data;
-       TelReturn ret;
-
-       /* Response callback data */
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
-                               NULL, 0);
-
-       /* Send Request to modem */
-       ret = tcore_at_prepare_and_send_request(co,
-               "AT+XSIMSTATE?", "+XSIMSTATE:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               __on_response_imc_sim_get_sim_status, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get SIM Status");
+       case SIM_EF_OPL:
+       case SIM_EF_PNN:
+       case SIM_EF_CPHS_INFORMATION_NUMBERS:
+       case SIM_EF_MSISDN:
+               meta_info->current_index++;
+               _get_file_record(o, ur, ef, meta_info->current_index, meta_info->rec_length);
+               break;
 
-       return TRUE;
+       case SIM_EF_MBDN:
+       case SIM_EF_CPHS_MAILBOX_NUMBERS:
+               if (command == TREQ_SIM_SET_MAILBOX) {
+                       /* If EF_CPHS_MAILBOX_NUMBERS's structure type is Cyclic then should not allow to update. */
+                       if (meta_info->file_id == SIM_EF_CPHS_MAILBOX_NUMBERS && meta_info->file_type == SIM_FTYPE_CYCLIC) {
+                               err("Cyclic File ID. No update & return error.");
+                               meta_info->files.result = SIM_ACCESS_FAILED;
+                               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                               sizeof(struct tresp_sim_read), &meta_info->files);
+                               break;
+                       } else {
+                               __set_file_data(o, ur, ef);
+                       }
+               } else {
+                       /* Read MailBox */
+                       meta_info->mb_count = 0;
+                       meta_info->current_index = meta_info->mb_data.mb[meta_info->mb_count].rec_index;
+                       if (meta_info->current_index == 0) {
+                               err("Invalid MBDN index");
+                               memcpy(&meta_info->files.data.mb, &meta_info->mb_data, sizeof(struct tel_sim_mailbox));
+                               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                               sizeof(struct tresp_sim_read), &meta_info->files);
+                       } else {
+                               ur = tcore_user_request_ref(ur);
+                               _get_file_record(o, ur, meta_info->file_id, meta_info->current_index, meta_info->rec_length);
+                       }
+                       _get_file_record(o, ur, ef, meta_info->current_index, meta_info->rec_length);
+               }
+               break;
+
+       default:
+               dbg("error - File id for get file info [0x%x]", ef);
+               break;
+       }
 }
 
-static void __imc_sim_next_from_read_binary(CoreObject *co, ImcRespCbData *resp_cb_data, TelSimResult sim_result, gboolean decode_ret)
+static void _next_from_get_file_data(CoreObject *o, UserRequest *ur, enum tel_sim_access_result rt, int decode_ret)
 {
-       ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
-       TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
+       struct imc_sim_property *meta_info = NULL;
 
        dbg("Entry");
 
-       dbg("[SIM]EF[0x%x] read sim_result[%d] Decode rt[%d]", file_meta->file_id, sim_result, decode_ret);
-       switch (file_meta->file_id) {
-       case TEL_SIM_EF_ELP:
-       case TEL_SIM_EF_USIM_PL:
-       case TEL_SIM_EF_LP:
-       case TEL_SIM_EF_USIM_LI:
+       meta_info = (struct imc_sim_property *)tcore_user_request_ref_metainfo(ur, NULL);
+       dbg("[SIM]EF[0x%x] read rt[%d] Decode rt[%d]", meta_info->file_id, rt, decode_ret);
+       switch (meta_info->file_id) {
+       case SIM_EF_ELP:
+       case SIM_EF_USIM_PL:
+       case SIM_EF_LP:
+       case SIM_EF_USIM_LI:
                if (decode_ret == TRUE) {
-                       if (resp_cb_data->cb)
-                               resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
+#if 0
+                       if (meta_info->file_id == SIM_EF_LP || meta_info->file_id == SIM_EF_USIM_LI)
+                               /* po->language_file = SIM_EF_LP;*/
+                       else if (meta_info->file_id == SIM_EF_ELP || meta_info->file_id == SIM_EF_USIM_PL)
+                               /* po->language_file = SIM_EF_ELP;*/
+#endif
+                       tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
                } else {
-                       tcore_sim_get_type(co, &card_type);
                        /* 2G */
                        /* The ME requests the Extended Language Preference. The ME only requests the Language Preference (EFLP) if at least one of the following conditions holds:
                         -      EFELP is not available;
@@ -703,431 +1074,237 @@ static void __imc_sim_next_from_read_binary(CoreObject *co, ImcRespCbData *resp_
                         -      if the EFLI has the value 'FFFF' in its highest priority position
                         -      if the ME does not support any of the language codes indicated in EFLI , or if EFLI is not present
                         */
-                       if (TEL_SIM_CARD_TYPE_GSM == card_type) {
-                               if (file_meta->file_id == TEL_SIM_EF_LP) {
-                                       if (resp_cb_data->cb)
-                                               resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
-                               } else {
-                                       file_meta->file_id = TEL_SIM_EF_LP;
-                                       __imc_sim_get_response(co, resp_cb_data);
-                               }
-                       } else if (TEL_SIM_CARD_TYPE_USIM) {
-                               if (file_meta->file_id == TEL_SIM_EF_LP || file_meta->file_id == TEL_SIM_EF_USIM_LI) {
-                                       file_meta->file_id = TEL_SIM_EF_ELP;
-                                       __imc_sim_get_response(co, resp_cb_data);
-                               } else {
-                                       if (resp_cb_data->cb)
-                                               resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
-                               }
+                       if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
+                               if (meta_info->file_id == SIM_EF_LP)
+                                       tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
+                               else
+                                       _get_file_info(o, ur, SIM_EF_LP);
+                       } else if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
+                               if (meta_info->file_id == SIM_EF_LP || meta_info->file_id == SIM_EF_USIM_LI)
+                                       _get_file_info(o, ur, SIM_EF_ELP);
+                               else
+                                       tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
                        }
                }
-       break;
+               break;
 
-       case TEL_SIM_EF_ECC:
-               tcore_sim_get_type(co, &card_type);
-               if (TEL_SIM_CARD_TYPE_USIM == card_type) {
-                       if (file_meta->current_index == file_meta->rec_count) {
-                               if (resp_cb_data->cb)
-                                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
+       case SIM_EF_ECC:
+               if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
+                       if (meta_info->current_index == meta_info->rec_count) {
+                               tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
                        } else {
-                               file_meta->current_index++;
-                               __imc_sim_read_record(co, resp_cb_data);
-                       }
-               } else if (TEL_SIM_CARD_TYPE_GSM == card_type) {
-                       if (resp_cb_data->cb)
-                               resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
-               } else {
-                       dbg("[SIM DATA]Invalid CardType[%d] Unable to handle", card_type);
-               }
-       break;
-
-       case TEL_SIM_EF_IMSI:
-               if (resp_cb_data->cb) {
-                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->imsi, resp_cb_data->cb_data);
-               } else {
-                       file_meta->file_id = TEL_SIM_EF_CPHS_CPHS_INFO;
-                       file_meta->file_result = TEL_SIM_RESULT_FAILURE;
-                       __imc_sim_get_response(co, resp_cb_data);
-               }
-               /* Update SIM INIT status - INIT COMPLETE */
-               __imc_sim_update_sim_status(co, TEL_SIM_STATUS_SIM_INIT_COMPLETED);
-       break;
-
-       case TEL_SIM_EF_MSISDN:
-               if (file_meta->current_index == file_meta->rec_count) {
-                       guint i;
-                       dbg("rec_count [%d], msisdn_count[%d]", file_meta->rec_count,
-                               file_meta->files.data.msisdn_list.count);
-                       if (resp_cb_data->cb) {
-                               resp_cb_data->cb(co, (gint)sim_result,
-                                       &file_meta->files.data.msisdn_list, resp_cb_data->cb_data);
-                       }
-
-                       /* Free resources */
-                       for (i = 0; i < file_meta->files.data.msisdn_list.count; i++) {
-                               tcore_free(file_meta->files.data.msisdn_list.list[i].alpha_id);
-                               tcore_free(file_meta->files.data.msisdn_list.list[i].num);
+                               meta_info->current_index++;
+                               _get_file_record(o, ur, meta_info->file_id, meta_info->current_index, meta_info->rec_length);
                        }
-                       tcore_free(file_meta->files.data.msisdn_list.list);
+               } else if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
+                       tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
                } else {
-                       file_meta->current_index++;
-                       __imc_sim_read_record(co, resp_cb_data);
+                       dbg("[SIM DATA]Invalid CardType[%d] Unable to handle", tcore_sim_get_type(o));
                }
-       break;
+               break;
 
-       case TEL_SIM_EF_OPL:
-               if (file_meta->current_index == file_meta->rec_count) {
-                       if (resp_cb_data->cb)
-                               resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
+       case SIM_EF_IMSI:
+               ur = tcore_user_request_new(NULL, NULL);   /* this is for using ur metainfo set/ref functionality. */
+               _get_file_info(o, ur, SIM_EF_CPHS_CPHS_INFO);
+               break;
 
+       case SIM_EF_MSISDN:
+               if (meta_info->current_index == meta_info->rec_count) {
+                       tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
                } else {
-                       file_meta->current_index++;
-                       __imc_sim_read_record(co, resp_cb_data);
+                       meta_info->current_index++;
+                       _get_file_record(o, ur, meta_info->file_id, meta_info->current_index, meta_info->rec_length);
                }
-       break;
+               break;
 
-       case TEL_SIM_EF_PNN:
-               if (file_meta->current_index == file_meta->rec_count) {
-                       if (resp_cb_data->cb)
-                               resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
+       case SIM_EF_OPL:
+               if (meta_info->current_index == meta_info->rec_count) {
+                       tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
                } else {
-                       file_meta->current_index++;
-                       __imc_sim_read_record(co, resp_cb_data);
+                       meta_info->current_index++;
+                       _get_file_record(o, ur, meta_info->file_id, meta_info->current_index, meta_info->rec_length);
                }
-       break;
+               break;
 
-       case TEL_SIM_EF_USIM_CFIS:
-       case TEL_SIM_EF_USIM_MWIS:
-       case TEL_SIM_EF_USIM_MBI:
-       case TEL_SIM_EF_MBDN:
-       case TEL_SIM_EF_CPHS_MAILBOX_NUMBERS:
-       case TEL_SIM_EF_CPHS_INFORMATION_NUMBERS:
-               if (file_meta->current_index == file_meta->rec_count) {
-                       if (resp_cb_data->cb)
-                               resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
+       case SIM_EF_PNN:
+               if (meta_info->current_index == meta_info->rec_count) {
+                       tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
                } else {
-                       file_meta->current_index++;
-                       __imc_sim_read_record(co, resp_cb_data);
+                       meta_info->current_index++;
+                       _get_file_record(o, ur, meta_info->file_id, meta_info->current_index, meta_info->rec_length);
                }
-       break;
-
-       case TEL_SIM_EF_CPHS_OPERATOR_NAME_STRING:
-       {
-               ImcSimMetaInfo *file_meta_new = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
-
-               file_meta->files.result = sim_result;
-               if (decode_ret == TRUE && sim_result == TEL_SIM_RESULT_SUCCESS) {
-                       file_meta_new->files.data.cphs_net.full_name = file_meta->files.data.cphs_net.full_name;
-                       dbg("file_meta_new->files.data.cphs_net.full_name[%s]", file_meta_new->files.data.cphs_net.full_name);
-               }
-
-               file_meta_new->file_id = TEL_SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING;
-               file_meta_new->file_result = TEL_SIM_RESULT_FAILURE;
-
-               __imc_sim_get_response(co, resp_cb_data);
-       }
-       break;
-
-       case TEL_SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
-               if (resp_cb_data->cb)
-                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data.cphs_net, resp_cb_data->cb_data);
-
-               tcore_free(file_meta->files.data.cphs_net.full_name);
-               tcore_free(file_meta->files.data.cphs_net.short_name);
-               file_meta->files.data.cphs_net.full_name = NULL;
-               file_meta->files.data.cphs_net.short_name = NULL;
-       break;
-
-       case TEL_SIM_EF_ICCID:
-               if (resp_cb_data->cb)
-                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data.iccid, resp_cb_data->cb_data);
-       break;
-
-       case TEL_SIM_EF_SPDI: {
-               guint i;
-               dbg("spdi count[%d]", file_meta->files.data.spdi.count);
-
-               if (resp_cb_data->cb)
-                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
-
-               /* Free resources */
-               for (i = 0; i < file_meta->files.data.spdi.count; i++)
-                       tcore_free(file_meta->files.data.spdi.list[i].plmn);
-
-               tcore_free(file_meta->files.data.spdi.list);
-       }
-       break;
-
-       case TEL_SIM_EF_SST:
-       case TEL_SIM_EF_SPN:
-       case TEL_SIM_EF_OPLMN_ACT:
-       case TEL_SIM_EF_CPHS_CPHS_INFO:
-       case TEL_SIM_EF_CPHS_CALL_FORWARD_FLAGS:
-       case TEL_SIM_EF_CPHS_VOICE_MSG_WAITING:
-       case TEL_SIM_EF_CPHS_DYNAMICFLAGS:
-       case TEL_SIM_EF_CPHS_DYNAMIC2FLAG:
-       case TEL_SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
-       case TEL_SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2:
-               if (resp_cb_data->cb)
-                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
-       break;
-
-       default:
-               err("File id not handled [0x%x]", file_meta->file_id);
-       break;
-       }
-}
-
-static void __imc_sim_next_from_get_response(CoreObject *co, ImcRespCbData *resp_cb_data, TelSimResult sim_result)
-{
-       ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
-       TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
-
-       dbg("EF[0x%x] access Result[%d]", file_meta->file_id, sim_result);
-
-       file_meta->files.result = sim_result;
-       if (file_meta->file_id != TEL_SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING)
-               memset(&file_meta->files.data, 0x00, sizeof(file_meta->files.data));
-
-       if ((file_meta->file_id != TEL_SIM_EF_ELP && file_meta->file_id != TEL_SIM_EF_LP &&
-               file_meta->file_id != TEL_SIM_EF_USIM_PL && file_meta->file_id != TEL_SIM_EF_CPHS_CPHS_INFO)
-               && (sim_result != TEL_SIM_RESULT_SUCCESS)) {
-               if (resp_cb_data->cb)
-                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
-               return;
-       }
+               break;
 
-       switch (file_meta->file_id) {
-       case TEL_SIM_EF_ELP:
-               if (sim_result == TEL_SIM_RESULT_SUCCESS) {
-                       dbg("[SIM DATA] exist EFELP/PL(0x2F05)");
-                       __imc_sim_read_binary(co, resp_cb_data);
+       case SIM_EF_USIM_MBI:
+               if (meta_info->current_index == meta_info->rec_count) {
+                       _get_file_info(0, ur, SIM_EF_MBDN);
                } else {
-                       tcore_sim_get_type(co, &card_type);
-                       if (TEL_SIM_CARD_TYPE_GSM == card_type) {
-                               ImcSimMetaInfo file_meta_new = {0,};
-
-                               dbg("[SIM DATA]SIM_EF_ELP(2F05) access fail. Request SIM_EF_LP(0x6F05) info");
-                               /* The ME requests the Language Preference (EFLP) if EFELP is not available */
-                               file_meta_new.file_id = TEL_SIM_EF_LP;
-                               file_meta_new.file_result = TEL_SIM_RESULT_FAILURE;
-                               file_meta_new.req_command = TCORE_COMMAND_SIM_GET_LANGUAGE;
-
-                               memcpy(resp_cb_data->data, &file_meta_new, sizeof(ImcSimMetaInfo));
-
-                               __imc_sim_get_response(co, resp_cb_data);
-                       } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
-                               dbg(" [SIM DATA]fail to get Language information in USIM(EF-LI(6F05),EF-PL(2F05))");
-                               if (resp_cb_data->cb)
-                                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
-                               return;
-                       }
+                       meta_info->current_index++;
+                       _get_file_record(o, ur, meta_info->file_id, meta_info->current_index, meta_info->rec_length);
                }
                break;
 
-       case TEL_SIM_EF_LP:
-       case TEL_SIM_EF_USIM_LI:
-               if (sim_result == TEL_SIM_RESULT_SUCCESS) {
-                       dbg("[SIM DATA] exist EFLP/LI(0x6F05)");
-                       __imc_sim_read_binary(co, resp_cb_data);
+       case SIM_EF_MBDN:
+       case SIM_EF_CPHS_MAILBOX_NUMBERS:
+               if (meta_info->mb_count == meta_info->mb_data.count) {
+                       memcpy(&meta_info->files.data.mb, &meta_info->mb_data, sizeof(struct tel_sim_mailbox));
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                       sizeof(struct tresp_sim_read), &meta_info->files);
                } else {
-                       tcore_sim_get_type(co, &card_type);
-                       dbg("[SIM DATA]SIM_EF_LP/LI(6F05) access fail. Current CardType[%d]", card_type);
-                       if (TEL_SIM_CARD_TYPE_GSM == card_type) {
-                               if (resp_cb_data->cb)
-                                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
-                               return;
-                       }
-                       /* if EFLI is not present, then the language selection shall be as defined in EFPL at the MF level      */
-                       else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
-                               ImcSimMetaInfo file_meta_new = {0,};
-
-                               dbg("[SIM DATA] try USIM EFPL(0x2F05)");
-                               file_meta_new.file_id = TEL_SIM_EF_ELP;
-                               file_meta_new.file_result = TEL_SIM_RESULT_FAILURE;
-                               file_meta_new.req_command = TCORE_COMMAND_SIM_GET_LANGUAGE;
-
-                               memcpy(resp_cb_data->data, &file_meta_new, sizeof(ImcSimMetaInfo));
-
-                               __imc_sim_get_response(co, resp_cb_data);
+                       meta_info->current_index = meta_info->mb_data.mb[meta_info->mb_count].rec_index;
+                       if (meta_info->current_index == 0) {
+                               err("Invalid MBDN index");
+                               memcpy(&meta_info->files.data.mb, &meta_info->mb_data, sizeof(struct tel_sim_mailbox));
+                               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                               sizeof(struct tresp_sim_read), &meta_info->files);
+                       } else {
+                               ur = tcore_user_request_ref(ur);
+                               _get_file_record(o, ur, meta_info->file_id, meta_info->current_index, meta_info->rec_length);
                        }
                }
                break;
 
-       case TEL_SIM_EF_USIM_PL:
-               if (sim_result == TEL_SIM_RESULT_SUCCESS) {
-                       dbg("[SIM DATA] exist EFELP/PL(0x2F05)");
-                       __imc_sim_read_binary(co, resp_cb_data);
+       case SIM_EF_USIM_CFIS:
+       case SIM_EF_USIM_MWIS:
+       case SIM_EF_CPHS_INFORMATION_NUMBERS:
+               if (meta_info->current_index == meta_info->rec_count) {
+                       tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
                } else {
-                       /* EFELIand EFPL not present, so set language count as zero and select ECC */
-                       dbg(
-                               " [SIM DATA]SIM_EF_USIM_PL(2A05) access fail. Request SIM_EF_ECC(0x6FB7) info");
-                       if (resp_cb_data->cb)
-                                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
-                       return;
-               }
-               break;
-
-       case TEL_SIM_EF_ECC:
-               tcore_sim_get_type(co, &card_type);
-               if (TEL_SIM_CARD_TYPE_GSM == card_type) {
-                       __imc_sim_read_binary(co, resp_cb_data);
-               } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
-                       if (file_meta->rec_count > TEL_SIM_ECC_LIST_MAX) {
-                               file_meta->rec_count = TEL_SIM_ECC_LIST_MAX;
-                       }
-                       file_meta->current_index++;
-                       __imc_sim_read_record(co, resp_cb_data);
+                       meta_info->current_index++;
+                       _get_file_record(o, ur, meta_info->file_id, meta_info->current_index, meta_info->rec_length);
                }
                break;
 
-       case TEL_SIM_EF_ICCID:
-       case TEL_SIM_EF_IMSI:
-       case TEL_SIM_EF_SST:
-       case TEL_SIM_EF_SPN:
-       case TEL_SIM_EF_SPDI:
-       case TEL_SIM_EF_CPHS_CALL_FORWARD_FLAGS:
-       case TEL_SIM_EF_CPHS_VOICE_MSG_WAITING:
-       case TEL_SIM_EF_CPHS_OPERATOR_NAME_STRING:
-       case TEL_SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
-       case TEL_SIM_EF_CPHS_DYNAMICFLAGS:
-       case TEL_SIM_EF_CPHS_DYNAMIC2FLAG:
-       case TEL_SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
-       case TEL_SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2:
-               __imc_sim_read_binary(co, resp_cb_data);
-               break;
-
-       case TEL_SIM_EF_CPHS_CPHS_INFO:
-               if (sim_result == TEL_SIM_RESULT_SUCCESS) {
-                       tcore_sim_set_cphs_status(co, TRUE);
-                       __imc_sim_read_binary(co, resp_cb_data);
-               } else {
-                       tcore_sim_set_cphs_status(co, FALSE);
-                       if (resp_cb_data->cb)
-                               resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
-               }
+       case SIM_EF_CPHS_OPERATOR_NAME_STRING:
+               meta_info->files.result = rt;
+               _get_file_info(o, ur, SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING);
                break;
 
+       case SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
+               if (rt == SIM_ACCESS_SUCCESS)
+                       meta_info->files.result = SIM_ACCESS_SUCCESS;
 
-       case TEL_SIM_EF_USIM_CFIS:
-               if (file_meta->rec_count > TEL_SIM_CALL_FORWARDING_TYPE_MAX) {
-                       file_meta->rec_count = TEL_SIM_CALL_FORWARDING_TYPE_MAX;
-               }
-               file_meta->current_index++;
-               __imc_sim_read_record(co, resp_cb_data);
+               tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
                break;
 
-       case TEL_SIM_EF_MSISDN:
-               file_meta->files.data.msisdn_list.list =
-                       tcore_malloc0(sizeof(TelSimSubscriberInfo) * file_meta->rec_count);
+       case SIM_EF_ICCID:
+       case SIM_EF_SST:
+       case SIM_EF_SPN:
+       case SIM_EF_SPDI:
+       case SIM_EF_OPLMN_ACT:
+       case SIM_EF_CPHS_CPHS_INFO:
+       case SIM_EF_CPHS_CALL_FORWARD_FLAGS:
+       case SIM_EF_CPHS_VOICE_MSG_WAITING:
+       case SIM_EF_CPHS_DYNAMICFLAGS:
+       case SIM_EF_CPHS_DYNAMIC2FLAG:
+       case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
+       case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2:
+               tcore_user_request_send_response(ur, _find_resp_command(ur), sizeof(struct tresp_sim_read), &meta_info->files);
+               break;
 
-       case TEL_SIM_EF_OPL:
-       case TEL_SIM_EF_PNN:
-       case TEL_SIM_EF_USIM_MWIS:
-       case TEL_SIM_EF_USIM_MBI:
-       case TEL_SIM_EF_MBDN:
-       case TEL_SIM_EF_CPHS_MAILBOX_NUMBERS:
-       case TEL_SIM_EF_CPHS_INFORMATION_NUMBERS:
-               file_meta->current_index++;
-               __imc_sim_read_record(co, resp_cb_data);
+       default:
+               dbg("File id not handled [0x%x]", meta_info->file_id);
                break;
+       }
+}
 
-       case TEL_SIM_EF_SMSP:
-       {
-               ImcSimPrivateInfo *priv_info = NULL;
+static void _sim_status_update(CoreObject *o, enum tel_sim_status sim_status)
+{
+       struct tnoti_sim_status noti_data = {0, };
 
-               priv_info = tcore_sim_ref_userdata(co);
+       if (sim_status != tcore_sim_get_status(o)) {
+               dbg("Change in SIM State - Old State: [0x%02x] New State: [0x%02x]",
+                               tcore_sim_get_status(o), sim_status);
 
-               dbg("SMSP info set to tcore : count:[%d], rec_len:[%d]",file_meta->rec_count, file_meta->rec_length);
-               priv_info->smsp_count = file_meta->rec_count;
-               priv_info->smsp_rec_len = file_meta->rec_length;
-               break;
-       }
+               /* Update SIM Status */
+               tcore_sim_set_status(o, sim_status);
+               noti_data.sim_status = sim_status;
 
-       default:
-               dbg("error - File id for get file info [0x%x]", file_meta->file_id);
-               break;
+               /* Send notification */
+               tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)),
+                               o, TNOTI_SIM_STATUS, sizeof(noti_data), &noti_data);
        }
-       return;
 }
 
-static void __on_response_imc_sim_update_file(TcorePending *p, guint data_len, const void *data, void *user_data)
+static void _response_get_sim_type(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *resp = data;
-       CoreObject *co_sim = NULL;
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       CoreObject *o = NULL;
        GSList *tokens = NULL;
-       TelSimResult sim_result = TEL_SIM_RESULT_CARD_ERROR;
+       enum tel_sim_type sim_type = SIM_TYPE_UNKNOWN;
        const char *line;
-       ImcRespCbData *resp_cb_data = (ImcRespCbData *) user_data;
-       ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
+       int state;
 
        dbg("Entry");
 
-       co_sim = tcore_pending_ref_core_object(p);
-
-       dbg("file_id:[0x%x]", file_meta->file_id);
+       o = tcore_pending_ref_core_object(p);
+       ur = tcore_pending_ref_user_request(p);
 
        if (resp->success > 0) {
-               int sw1 = 0;
-               int sw2 = 0;
                dbg("RESPONSE OK");
                if (resp->lines) {
                        line = (const char *)resp->lines->data;
                        tokens = tcore_at_tok_new(line);
-                       if (g_slist_length(tokens) != 2) {
-                               err("Invalid message");
-                               goto OUT;
+                       if (g_slist_length(tokens) != 1) {
+                               msg("Invalid message");
+                               tcore_at_tok_free(tokens);
+                               return;
                        }
-                       sw1 = atoi(g_slist_nth_data(tokens, 0));
-                       sw2 = atoi(g_slist_nth_data(tokens, 1));
                }
-
-               if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
-                       sim_result = TEL_SIM_RESULT_SUCCESS;
+               state = atoi(g_slist_nth_data(tokens, 0));
+               dbg("SIM Type is %d", state);
+
+               if (state == 0) {
+                       sim_type = SIM_TYPE_GSM;
+                       tcore_sim_set_app_list(o, SIM_APP_TYPE_SIM);
+               } else if (state == 1) {
+                       sim_type = SIM_TYPE_USIM;
+                       tcore_sim_set_app_list(o, SIM_APP_TYPE_USIM);
                } else {
-                       sim_result = __imc_sim_decode_status_word(sw1, sw2);
+                       sim_type = SIM_TYPE_UNKNOWN;
                }
        } else {
-               err("RESPONSE NOK");
-               sim_result = TEL_SIM_RESULT_FAILURE;
+               dbg("RESPONSE NOK");
+               sim_type = SIM_TYPE_UNKNOWN;
+       }
+
+       tcore_sim_set_type(o, sim_type);
+
+       if (sim_type != SIM_TYPE_UNKNOWN) {
+               /* set user request for using ur metainfo set/ref functionality */
+               ur = tcore_user_request_new(NULL, NULL);
+               _get_file_info(o, ur, SIM_EF_IMSI);
        }
-OUT:
-       /* Send Response */
-       if (resp_cb_data->cb)
-               resp_cb_data->cb(co_sim, (gint)sim_result, NULL, resp_cb_data->cb_data);
 
        tcore_at_tok_free(tokens);
        dbg("Exit");
 }
 
-static void __on_response_imc_sim_read_data(TcorePending *p, guint data_len,
-                                                       const void *data, void *user_data)
+static void _response_get_file_info(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *resp = data;
-       CoreObject *co = NULL;
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       CoreObject *o = NULL;
+       struct imc_sim_property *meta_info = NULL;
        GSList *tokens = NULL;
-       TelSimResult sim_result;
-       gboolean dr = FALSE;
+       enum tel_sim_access_result rt;
        const char *line = NULL;
-       char *res = NULL;
-       char *tmp = NULL;
-       int res_len;
        int sw1 = 0;
        int sw2 = 0;
-       TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
-       ImcRespCbData *resp_cb_data = (ImcRespCbData *) user_data;
-       ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
 
        dbg("Entry");
 
-       co = tcore_pending_ref_core_object(p);
+       o = tcore_pending_ref_core_object(p);
+       ur = tcore_pending_ref_user_request(p);
+       meta_info = (struct imc_sim_property *)tcore_user_request_ref_metainfo(ur, NULL);
 
        if (resp->success > 0) {
                dbg("RESPONSE OK");
                if (resp->lines) {
                        line = (const char *)resp->lines->data;
                        tokens = tcore_at_tok_new(line);
-                       if (g_slist_length(tokens) != 3) {
+                       if (g_slist_length(tokens) < 2) {
                                err("Invalid message");
                                tcore_at_tok_free(tokens);
                                return;
@@ -1135,400 +1312,41 @@ static void __on_response_imc_sim_read_data(TcorePending *p, guint data_len,
                }
                sw1 = atoi(g_slist_nth_data(tokens, 0));
                sw2 = atoi(g_slist_nth_data(tokens, 1));
-               res = g_slist_nth_data(tokens, 2);
-
-               tmp = tcore_at_tok_extract(res);
-               tcore_util_hexstring_to_bytes(tmp, &res, (guint *)&res_len);
-               dbg("Response: [%s] Response length: [%d]", res, res_len);
 
+               /*1. SIM access success case*/
                if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
-                       sim_result = TEL_SIM_RESULT_SUCCESS;
-                       file_meta->files.result = sim_result;
-
-                       dbg("File ID: [0x%x]", file_meta->file_id);
-                       switch (file_meta->file_id) {
-                       case TEL_SIM_EF_IMSI: {
-                               dbg("Data: [%s]", res);
-                               dr = tcore_sim_decode_imsi((unsigned char *)res, res_len, &file_meta->imsi);
-                               if (dr == FALSE) {
-                                       err("IMSI decoding failed");
-                               } else {
-                                       __imc_sim_set_identity(co, &file_meta->imsi);
+                       unsigned char tag_len = 0; /*   1 or 2 bytes ??? */
+                       unsigned short record_len = 0;
+                       char num_of_records = 0;
+                       unsigned char file_id_len = 0;
+                       unsigned short file_id = 0;
+                       unsigned short file_size = 0;
+                       unsigned short file_type = 0;
+                       unsigned short arr_file_id = 0;
 
-                                       /* Update IMSI */
-                                       tcore_sim_set_imsi(co, &file_meta->imsi);
-                               }
-                       }
-                       break;
+                       /*      handling only last 3 bits */
+                       unsigned char file_type_tag = 0x07;
+                       unsigned char *ptr_data;
 
-                       case TEL_SIM_EF_ICCID: {
-                               dr = tcore_sim_decode_iccid((unsigned char *)res, res_len,
-                                               file_meta->files.data.iccid);
-                       }
-                       break;
+                       char *hexData;
+                       char *tmp;
+                       char *recordData = NULL;
+                       hexData = g_slist_nth_data(tokens, 2);
+                       dbg("hexData: %s", hexData);
+                       dbg("hexData: %s", hexData + 1);
 
-                       case TEL_SIM_EF_ELP:            /* 2G EF - 2 bytes decoding */
-                       case TEL_SIM_EF_USIM_LI:                /* 3G EF - 2 bytes decoding */
-                       case TEL_SIM_EF_USIM_PL:                /* 3G EF - same as EFELP, so 2 byte decoding */
-                       case TEL_SIM_EF_LP:             /* 1 byte encoding */
-                       {
-                               tcore_sim_get_type(co, &card_type);
-                               if ((TEL_SIM_CARD_TYPE_GSM == card_type)
-                                               && (file_meta->file_id == TEL_SIM_EF_LP)) {
-                                       /*
-                                        * 2G LP(0x6F05) has 1 byte for each language
-                                        */
-                                       dr = tcore_sim_decode_lp((unsigned char *)res, res_len, &file_meta->files.data.language);
-                               } else {
-                                       /*
-                                        * 3G LI(0x6F05)/PL(0x2F05),
-                                        * 2G ELP(0x2F05) has 2 bytes for each language
-                                        */
-                                       dr = tcore_sim_decode_li((unsigned char *)res, res_len,
-                                               file_meta->file_id, &file_meta->files.data.language);
-                               }
+                       tmp = tcore_at_tok_extract(hexData);
+                       recordData = util_hexStringToBytes(tmp);
+                       if (!recordData) {
+                               err("util_hexStringToBytes Failed!!");
+                               tcore_at_tok_free(tokens);
+                               return;
                        }
-                       break;
-
-                       case TEL_SIM_EF_SPN:
-                               dr = tcore_sim_decode_spn((unsigned char *)res, res_len, &file_meta->files.data.spn);
-                       break;
+                       tcore_util_hex_dump("   ", strlen(hexData) / 2, recordData);
+                       g_free(tmp);
 
-                       case TEL_SIM_EF_SPDI:
-                               dr = tcore_sim_decode_spdi((unsigned char *)res, res_len, &file_meta->files.data.spdi);
-                       break;
-
-                       case TEL_SIM_EF_SST:
-                       {
-                               TelSimServiceTable *svct = NULL;
-
-                               svct = g_try_new0(TelSimServiceTable, 1);
-                               tcore_sim_get_type(co, &card_type);
-                               svct->sim_type = card_type;
-                               if (TEL_SIM_CARD_TYPE_GSM == card_type) {
-                                       dr = tcore_sim_decode_sst((unsigned char *)res, res_len, svct->table.sst_service);
-                               } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
-                                       dr = tcore_sim_decode_ust((unsigned char *)res, res_len, svct->table.ust_service);
-                               } else {
-                                       err("Not handled card_type[%d]", card_type);
-                               }
-
-                               if (dr == FALSE) {
-                                       err("SST/UST decoding failed");
-                               } else {
-                                       tcore_sim_set_service_table(co, svct);
-                               }
-
-                               /* Free memory */
-                               g_free(svct);
-                       }
-                       break;
-
-                       case TEL_SIM_EF_ECC:
-                       {
-                               tcore_sim_get_type(co, &card_type);
-                               if (TEL_SIM_CARD_TYPE_GSM == card_type) {
-                                       dr = tcore_sim_decode_ecc((unsigned char *)res, res_len, &file_meta->files.data.ecc);
-                               } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
-                                       TelSimEcc *ecc = NULL;
-
-                                       ecc = g_try_new0(TelSimEcc, 1);
-                                       dbg("Index [%d]", file_meta->current_index);
-
-                                       dr = tcore_sim_decode_uecc((unsigned char *)res, res_len, ecc);
-                                       if (dr == TRUE) {
-                                               memcpy(&file_meta->files.data.ecc.list[file_meta->files.data.ecc.count], ecc, sizeof(TelSimEcc));
-                                               file_meta->files.data.ecc.count++;
-                                       }
-
-                                       /* Free memory */
-                                       g_free(ecc);
-                               } else {
-                                       dbg("Unknown/Unsupported SIM card Type: [%d]", card_type);
-                               }
-                       }
-                       break;
-
-                       case TEL_SIM_EF_MSISDN:
-                       {
-                               TelSimSubscriberInfo *msisdn = NULL;
-
-                               dbg("Index [%d]", file_meta->current_index);
-                               msisdn = tcore_malloc0(sizeof(TelSimSubscriberInfo));
-                               dr = tcore_sim_decode_msisdn((unsigned char *)res, res_len, msisdn);
-                               if (dr == TRUE) {
-                                       memcpy(&file_meta->files.data.msisdn_list.list[file_meta->files.data.msisdn_list.count],
-                                                               msisdn, sizeof(TelSimSubscriberInfo));
-
-                                       file_meta->files.data.msisdn_list.count++;
-                               }
-
-                               /* Free memory */
-                               dbg("Freeing resources");
-                               tcore_free(msisdn);
-                       }
-                       break;
-
-                       case TEL_SIM_EF_OPL:
-                       {
-                               TelSimOpl *opl = NULL;
-
-                               dbg("decode w/ index [%d]", file_meta->current_index);
-                               opl = g_try_new0(TelSimOpl, 1);
-
-                               dr = tcore_sim_decode_opl((unsigned char *)res, res_len, opl);
-                               if (dr == TRUE) {
-                                       memcpy(&file_meta->files.data.opl.list[file_meta->files.data.opl.opl_count],
-                                                       opl, sizeof(TelSimOpl));
-
-                                       file_meta->files.data.opl.opl_count++;
-                               }
-
-                               /* Free memory */
-                               g_free(opl);
-                       }
-                       break;
-
-                       case TEL_SIM_EF_PNN:
-                       {
-                               TelSimPnn *pnn = NULL;
-
-                               dbg("decode w/ index [%d]", file_meta->current_index);
-                               pnn = g_try_new0(TelSimPnn, 1);
-
-                               dr = tcore_sim_decode_pnn((unsigned char *)res, res_len, pnn);
-                               if (dr == TRUE) {
-                                       memcpy(&file_meta->files.data.pnn.list[file_meta->files.data.pnn.pnn_count],
-                                                               pnn, sizeof(TelSimPnn));
-
-                                       file_meta->files.data.pnn.pnn_count++;
-                               }
-
-                               /* Free memory */
-                               g_free(pnn);
-                       }
-                       break;
-
-                       case TEL_SIM_EF_OPLMN_ACT:
-                               /*dr = tcore_sim_decode_oplmnwact(&file_meta->files.data.opwa,
-                                               (unsigned char *)res, res_len);*/
-                       break;
-
-                       case TEL_SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
-                               /*dr = tcore_sim_decode_csp(&po->p_cphs->csp,
-                                       p_data->response, p_data->response_len);*/
-                       break;
-
-                       case TEL_SIM_EF_USIM_MBI:                       /* linear type */
-                       {
-                               TelSimMbi *mbi = NULL;
-
-                               mbi = g_try_new0(TelSimMbi, 1);
-                               dr = tcore_sim_decode_mbi((unsigned char *)res, res_len, mbi);
-                               if (dr == TRUE) {
-                                       memcpy(&file_meta->mbi_list.list[file_meta->mbi_list.count],
-                                                                               mbi, sizeof(TelSimMbi));
-                                       file_meta->mbi_list.count++;
-
-                                       dbg("mbi count[%d]", file_meta->mbi_list.count);
-                               }
-
-                               /* Free memory */
-                               g_free(mbi);
-                       }
-                       break;
-
-                       case TEL_SIM_EF_CPHS_MAILBOX_NUMBERS:           /* linear type */
-                       case TEL_SIM_EF_MBDN:                           /* linear type */
-                               dr = tcore_sim_decode_xdn((unsigned char *)res, res_len,
-                                                                               file_meta->mb_list[file_meta->current_index-1].alpha_id,
-                                                                               file_meta->mb_list[file_meta->current_index-1].number);
-                               file_meta->mb_list[file_meta->current_index-1].alpha_id_len = strlen(file_meta->mb_list[file_meta->current_index-1].alpha_id);
-                               file_meta->mb_list[file_meta->current_index-1].profile_id = file_meta->current_index;
-                       break;
-
-                       case TEL_SIM_EF_CPHS_VOICE_MSG_WAITING:         /* transparent type */
-                               dr = tcore_sim_decode_vmwf((unsigned char *)res, res_len, file_meta->files.data.mw.mw);
-                       break;
-
-                       case TEL_SIM_EF_USIM_MWIS: {                    /* linear type */
-                               TelSimMwis *mw = NULL;
-
-                               mw = g_try_new0(TelSimMwis, 1);
-
-                               dr = tcore_sim_decode_mwis((unsigned char *)res, res_len, mw);
-                               if (dr == TRUE) {
-                                       guint count = file_meta->files.data.mw.profile_count;
-
-                                       memcpy(&file_meta->files.data.mw.mw[count], mw, sizeof(TelSimMwis));
-
-                                       /**
-                                        * The Profile Identity shall be between 1 and 4 as defined
-                                        * in TS 23.097 for MSP
-                                        */
-                                       file_meta->files.data.mw.mw[count].profile_id = count+1;
-
-                                       file_meta->files.data.mw.profile_count++;
-                               }
-
-                               /* Free memory */
-                               g_free(mw);
-                       }
-                       break;
-
-                       case TEL_SIM_EF_CPHS_CALL_FORWARD_FLAGS:        /* transparent type */
-                               dr = tcore_sim_decode_cff((unsigned char *)res, res_len, file_meta->files.data.mw.mw);
-                       break;
-
-                       case TEL_SIM_EF_USIM_CFIS:                      /* linear type */
-                       {
-                               TelSimCfis *cf = NULL;
-
-                               cf = g_try_new0(TelSimCfis, 1);
-                               dr = tcore_sim_decode_cfis((unsigned char *)res, res_len, cf);
-                               if (dr == TRUE) {
-                                       memcpy(&file_meta->files.data.cf.cf[file_meta->files.data.cf.profile_count],
-                                                                       cf, sizeof(TelSimCfis));
-                                       file_meta->files.data.cf.profile_count++;
-                               }
-
-                               /* Free memory */
-                               g_free(cf);
-                       }
-                       break;
-
-                       case TEL_SIM_EF_CPHS_SERVICE_STRING_TABLE:
-                               dbg("not handled - TEL_SIM_EF_CPHS_SERVICE_STRING_TABLE ");
-                       break;
-
-                       case TEL_SIM_EF_CPHS_OPERATOR_NAME_STRING:
-                               file_meta->files.data.cphs_net.full_name = tcore_malloc0(TEL_SIM_CPHS_OPERATOR_NAME_LEN_MAX+1);
-                               dr = tcore_sim_decode_ons((unsigned char *)res, res_len,
-                                                                               (unsigned char*)file_meta->files.data.cphs_net.full_name);
-                               dbg("file_meta->files.result[%d],file_meta->files.data.cphs_net.full_name[%s]",
-                                               file_meta->files.result, file_meta->files.data.cphs_net.full_name);
-                       break;
-
-                       case TEL_SIM_EF_CPHS_DYNAMICFLAGS:
-                               /*dr = tcore_sim_decode_dynamic_flag(&po->p_cphs->dflagsinfo,
-                                                       p_data->response, p_data->response_len);*/
-                       break;
-
-                       case TEL_SIM_EF_CPHS_DYNAMIC2FLAG:
-                               /*dr = tcore_sim_decode_dynamic2_flag(&po->p_cphs->d2flagsinfo, p_data->response,
-                                                       p_data->response_len);*/
-                       break;
-
-                       case TEL_SIM_EF_CPHS_CPHS_INFO:
-                               /*dr = tcore_sim_decode_cphs_info(&file_meta->files.data.cphs,
-                                                       (unsigned char *)res, res_len);*/
-                       break;
-
-                       case TEL_SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
-                               file_meta->files.data.cphs_net.short_name = tcore_malloc0(TEL_SIM_CPHS_OPERATOR_NAME_SHORT_FORM_LEN_MAX+1);
-                               dr = tcore_sim_decode_short_ons((unsigned char *)res, res_len,
-                                                                               (unsigned char*)file_meta->files.data.cphs_net.short_name);
-                               dbg("file_meta->files.result[%d],file_meta->files.data.cphs_net.short_name[%s]",
-                                               file_meta->files.result, file_meta->files.data.cphs_net.short_name);
-                       break;
-
-                       case TEL_SIM_EF_CPHS_INFORMATION_NUMBERS:
-                               /*dr = tcore_sim_decode_information_number(&po->p_cphs->infn, p_data->response, p_data->response_len);*/
-                       break;
-
-                       default:
-                               dbg("File Decoding Failed - not handled File[0x%x]", file_meta->file_id);
-                               dr = 0;
-                       break;
-                       }
-               } else {
-                       sim_result = __imc_sim_decode_status_word(sw1, sw2);
-                       file_meta->files.result = sim_result;
-               }
-
-               /* Free memory */
-               g_free(tmp);
-               g_free(res);
-
-               /* Free tokens */
-               tcore_at_tok_free(tokens);
-       } else {
-               err("RESPONSE NOK");
-               dbg("Error - File ID: [0x%x]", file_meta->file_id);
-               sim_result = TEL_SIM_RESULT_FAILURE;
-       }
-
-       /* Get File data */
-       __imc_sim_next_from_read_binary(tcore_pending_ref_core_object(p), resp_cb_data, sim_result, dr);
-
-       dbg("Exit");
-}
-
-static void __on_response_imc_sim_get_response(TcorePending *p,
-       guint data_len, const void *data, void *user_data)
-{
-       const TcoreAtResponse *resp = data;
-       CoreObject *co = NULL;
-       TelSimResult sim_result;
-       GSList *tokens = NULL;
-       const char *line = NULL;
-       int sw1 = 0;
-       int sw2 = 0;
-       ImcRespCbData *resp_cb_data = (ImcRespCbData *)user_data;
-       ImcSimMetaInfo *file_meta =
-               (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
-
-       dbg("SIM Response - SIM File info: [+CRSM]");
-
-       co = tcore_pending_ref_core_object(p);
-
-       if (resp->success > 0) {
-               dbg("RESPONSE OK");
-               if (resp->lines) {
-                       line = (const char *)resp->lines->data;
-                       tokens = tcore_at_tok_new(line);
-                       if (g_slist_length(tokens) < 2) {
-                               err("Invalid message");
-                               tcore_at_tok_free(tokens);
-                               return;
-                       }
-               }
-               sw1 = atoi(g_slist_nth_data(tokens, 0));
-               sw2 = atoi(g_slist_nth_data(tokens, 1));
-
-               /*1. SIM access success case*/
-               if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
-                       unsigned char tag_len = 0;
-                       unsigned short record_len = 0;
-                       char num_of_records = 0;
-                       unsigned char file_id_len = 0;
-                       unsigned short file_id = 0;
-                       unsigned short file_size = 0;
-                       unsigned short file_type = 0;
-                       unsigned short arr_file_id = 0;
-                       int arr_file_id_rec_num = 0;
-                       TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
-
-                       /* handling only last 3 bits */
-                       unsigned char file_type_tag = 0x07;
-                       unsigned char *ptr_data;
-
-                       char *hexData;
-                       char *tmp;
-                       char *record_data = NULL;
-                       guint record_data_len;
-                       hexData = g_slist_nth_data(tokens, 2);
-                       dbg("hexData: %s", hexData);
-                       dbg("hexData: %s", hexData + 1);
-
-                       tmp = tcore_at_tok_extract(hexData);
-                       tcore_util_hexstring_to_bytes(tmp, &record_data, &record_data_len);
-                       tcore_util_hex_dump("   ", record_data_len, record_data);
-                       g_free(tmp);
-
-                       ptr_data = (unsigned char *)record_data;
-                       tcore_sim_get_type(co, &card_type);
-                       if (TEL_SIM_CARD_TYPE_USIM == card_type) {
+                       ptr_data = (unsigned char *)recordData;
+                       if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
                                /*
                                 ETSI TS 102 221 v7.9.0
                                 - Response Data
@@ -1538,7 +1356,7 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                 '83'   M       File Identifier
                                 'A5'   O       Proprietary information
                                 '8A'   M       Life Cycle Status Integer
-                                '8B', '8C' or 'AB' C1  Security attributes
+                                '8B', '8C' or 'AB'     C1      Security attributes
                                 '80'   M       File size
                                 '81'   O       Total file size
                                 '88'   O       Short File Identifier (SFI)
@@ -1559,6 +1377,9 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                                ptr_data++;
                                                /* 2 or 5 value*/
                                                ptr_data++;
+                                               /*      unsigned char file_desc_len = *ptr_data++;*/
+                                               /*      dbg("file descriptor length: [%d]", file_desc_len);*/
+                                               /* TBD: currently capture only file type : ignore sharable, non sharable, working, internal etc*/
                                                /* consider only last 3 bits*/
                                                dbg("file_type_tag: %02x", file_type_tag);
                                                file_type_tag = file_type_tag & (*ptr_data);
@@ -1566,10 +1387,9 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
 
                                                switch (file_type_tag) {
                                                /* increment to next byte */
-                                               // ptr_data++;
                                                case 0x1:
                                                        dbg("Getting FileType: [Transparent file type]");
-                                                       file_type = IMC_SIM_FILE_TYPE_TRANSPARENT;
+                                                       file_type = SIM_FTYPE_TRANSPARENT;
 
                                                        /* increment to next byte */
                                                        ptr_data++;
@@ -1581,31 +1401,31 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                                        dbg("Getting FileType: [Linear fixed file type]");
                                                        /* increment to next byte */
                                                        ptr_data++;
-                                                       /* data coding byte - value 21 */
+                                                       /*      data coding byte - value 21 */
                                                        ptr_data++;
-                                                       /* 2bytes */
+                                                       /*      2bytes */
                                                        memcpy(&record_len, ptr_data, 2);
                                                        /* swap bytes */
-                                                       IMC_SWAP_BYTES_16(record_len);
+                                                       SWAPBYTES16(record_len);
                                                        ptr_data = ptr_data + 2;
                                                        num_of_records = *ptr_data++;
                                                        /* Data lossy conversation from enum (int) to unsigned char */
-                                                       file_type = IMC_SIM_FILE_TYPE_LINEAR_FIXED;
+                                                       file_type = SIM_FTYPE_LINEAR_FIXED;
                                                        break;
 
                                                case 0x6:
                                                        dbg("Cyclic fixed file type");
                                                        /* increment to next byte */
                                                        ptr_data++;
-                                                       /* data coding byte - value 21 */
+                                                       /*      data coding byte - value 21 */
                                                        ptr_data++;
-                                                       /* 2bytes */
+                                                       /*      2bytes */
                                                        memcpy(&record_len, ptr_data, 2);
                                                        /* swap bytes */
-                                                       IMC_SWAP_BYTES_16(record_len);
+                                                       SWAPBYTES16(record_len);
                                                        ptr_data = ptr_data + 2;
                                                        num_of_records = *ptr_data++;
-                                                       file_type = IMC_SIM_FILE_TYPE_CYCLIC;
+                                                       file_type = SIM_FTYPE_CYCLIC;
                                                        break;
 
                                                default:
@@ -1615,11 +1435,15 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                        } else {
                                                dbg("INVALID FCP received - DEbug!");
                                                tcore_at_tok_free(tokens);
-                                               g_free(record_data);
+                                               g_free(recordData);
                                                return;
                                        }
 
-                                       /*File identifier - 0x84,0x85,0x86 etc are currently ignored and not handled */
+                                       /*
+                                        * File identifier - file id??
+                                        *
+                                        * 0x84, 0x85, 0x86 etc are currently ignored and not handled
+                                        */
                                        if (*ptr_data == 0x83) {
                                                /* increment to next byte */
                                                ptr_data++;
@@ -1630,7 +1454,7 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                                dbg("file_id: %x", file_id);
 
                                                /* swap bytes    */
-                                               IMC_SWAP_BYTES_16(file_id);
+                                               SWAPBYTES16(file_id);
                                                dbg("file_id: %x", file_id);
 
                                                ptr_data = ptr_data + 2;
@@ -1638,11 +1462,11 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                        } else {
                                                dbg("INVALID FCP received - DEbug!");
                                                tcore_at_tok_free(tokens);
-                                               g_free(record_data);
+                                               g_free(recordData);
                                                return;
                                        }
 
-                                       /* proprietary information */
+                                       /*      proprietary information */
                                        if (*ptr_data == 0xA5) {
                                                unsigned short prop_len;
                                                /* increment to next byte */
@@ -1707,21 +1531,19 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                                        /* EFARR file id */
                                                        memcpy(&arr_file_id, ptr_data, 2);
                                                        /* swap byes */
-                                                       IMC_SWAP_BYTES_16(arr_file_id);
+                                                       SWAPBYTES16(arr_file_id);
                                                        ptr_data = ptr_data + 2;
-                                                       arr_file_id_rec_num = *ptr_data++;
-                                                       dbg("arr_file_id_rec_num:[%d]", arr_file_id_rec_num);
+                                                       ptr_data++;     /*arr_file_id_rec_num = *ptr_data++; */
                                                } else {
                                                        /* if tag length is not 3 */
                                                        /* ignoring bytes       */
-                                                       // ptr_data = ptr_data + 4;
                                                        dbg("Useless security attributes, so jump to next tag");
                                                        ptr_data = ptr_data + (*ptr_data + 1);
                                                }
                                        } else {
                                                dbg("INVALID FCP received[0x%x] - DEbug!", *ptr_data);
                                                tcore_at_tok_free(tokens);
-                                               g_free(record_data);
+                                               g_free(recordData);
                                                return;
                                        }
 
@@ -1738,28 +1560,28 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                                ptr_data++;
                                                memcpy(&file_size, ptr_data, 2);
                                                /* swap bytes */
-                                               IMC_SWAP_BYTES_16(file_size);
+                                               SWAPBYTES16(file_size);
                                                ptr_data = ptr_data + 2;
                                        } else {
                                                dbg("INVALID FCP received - DEbug!");
                                                tcore_at_tok_free(tokens);
-                                               g_free(record_data);
+                                               g_free(recordData);
                                                return;
                                        }
 
                                        /* total file size including structural info*/
                                        if (*ptr_data == 0x81) {
-                                               int len;
+                                               /* int len; */
                                                /* increment to next byte */
                                                ptr_data++;
                                                /* length */
-                                               len = *ptr_data;
-                                               dbg("len:[%d]", len);
+                                               /* len = *ptr_data; */
                                                /* ignored bytes */
                                                ptr_data = ptr_data + 3;
                                        } else {
                                                dbg("INVALID FCP received - DEbug!");
                                                /* 0x81 is optional tag?? check out! so do not return -1 from here! */
+                                               /* return -1; */
                                        }
                                        /*short file identifier ignored*/
                                        if (*ptr_data == 0x88) {
@@ -1769,24 +1591,23 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                } else {
                                        dbg("INVALID FCP received - DEbug!");
                                        tcore_at_tok_free(tokens);
-                                       g_free(record_data);
+                                       g_free(recordData);
                                        return;
                                }
-                       } else if (TEL_SIM_CARD_TYPE_GSM == card_type) {
+                       } else if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
                                unsigned char gsm_specific_file_data_len = 0;
-                               /* ignore RFU byte1 and byte2 */
+                               /*      ignore RFU byte1 and byte2 */
                                ptr_data++;
                                ptr_data++;
-                               /* file size */
-                               // file_size = p_info->response_len;
+                               /*      file size */
                                memcpy(&file_size, ptr_data, 2);
                                /* swap bytes */
-                               IMC_SWAP_BYTES_16(file_size);
-                               /* parsed file size */
+                               SWAPBYTES16(file_size);
+                               /*      parsed file size */
                                ptr_data = ptr_data + 2;
                                /* file id */
                                memcpy(&file_id, ptr_data, 2);
-                               IMC_SWAP_BYTES_16(file_id);
+                               SWAPBYTES16(file_id);
                                dbg("FILE id --> [%x]", file_id);
                                ptr_data = ptr_data + 2;
                                /* save file type - transparent, linear fixed or cyclic */
@@ -1818,13 +1639,13 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                                /* increament to next byte as this byte is RFU */
                                                ptr_data++;
                                                file_type =
-                                                       (file_type_tag == 0x00) ? IMC_SIM_FILE_TYPE_TRANSPARENT : IMC_SIM_FILE_TYPE_LINEAR_FIXED;
+                                                       (file_type_tag == 0x00) ? SIM_FTYPE_TRANSPARENT : SIM_FTYPE_LINEAR_FIXED;
                                        } else {
                                                /* increment to next byte */
                                                ptr_data++;
-                                               /* For a cyclic EF all bits except bit 7 are RFU; b7=1 indicates that */
+                                               /*      For a cyclic EF all bits except bit 7 are RFU; b7=1 indicates that */
                                                /* the INCREASE command is allowed on the selected cyclic file. */
-                                               file_type = IMC_SIM_FILE_TYPE_CYCLIC;
+                                               file_type = SIM_FTYPE_CYCLIC;
                                        }
                                        /* bytes 9 to 11 give SIM file access conditions */
                                        ptr_data++;
@@ -1836,13 +1657,14 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                        ptr_data++;
                                        /* byte 13 - GSM specific data */
                                        gsm_specific_file_data_len = *ptr_data;
-                                       dbg("gsm_specific_file_data_len:[%d]", gsm_specific_file_data_len);
+                                       dbg("gsm_specific_file_data_len: %d", gsm_specific_file_data_len);
                                        ptr_data++;
-                                       /* byte 14 - structure of EF - transparent or linear or cyclic , already saved above */
+                                       /*      byte 14 - structure of EF - transparent or linear or cyclic , already saved above */
                                        ptr_data++;
                                        /* byte 15 - length of record for linear and cyclic , for transparent it is set to 0x00. */
                                        record_len = *ptr_data;
                                        dbg("record length[%d], file size[%d]", record_len, file_size);
+
                                        if (record_len != 0)
                                                num_of_records = (file_size / record_len);
 
@@ -1854,181 +1676,440 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
                                        break;
                                }
                        } else {
-                               err("Unknown Card Type - [%d]", card_type);
+                               dbg("Card Type - UNKNOWN [%d]", tcore_sim_get_type(o));
                        }
 
                        dbg("req ef[0x%x] resp ef[0x%x] size[%ld] Type[0x%x] NumOfRecords[%ld] RecordLen[%ld]",
-                               file_meta->file_id, file_id, file_size, file_type, num_of_records, record_len);
-
-                       file_meta->file_type = file_type;
-                       file_meta->data_size = file_size;
-                       file_meta->rec_length = record_len;
-                       file_meta->rec_count = num_of_records;
-                       file_meta->current_index = 0;           /* reset for new record type EF */
-                       sim_result = TEL_SIM_RESULT_SUCCESS;
-                       g_free(record_data);
+                               meta_info->file_id, file_id, file_size, file_type, num_of_records, record_len);
+
+                       meta_info->file_type = file_type;
+                       meta_info->data_size = file_size;
+                       meta_info->rec_length = record_len;
+                       meta_info->rec_count = num_of_records;
+                       meta_info->current_index = 0; /* reset for new record type EF */
+                       rt = SIM_ACCESS_SUCCESS;
+                       g_free(recordData);
                } else {
                        /*2. SIM access fail case*/
-                       err("Failed to get ef[0x%x] (file_meta->file_id) ", file_meta->file_id);
-                       sim_result = __imc_sim_decode_status_word(sw1, sw2);
+                       dbg("error to get ef[0x%x]", meta_info->file_id);
+                       dbg("error to get ef[0x%x] (meta_info->file_id) ", meta_info->file_id);
+                       rt = _decode_status_word(sw1, sw2);
                }
+               ur = tcore_user_request_ref(ur);
 
+               dbg("Calling _next_from_get_file_info");
+               _next_from_get_file_info(o, ur, meta_info->file_id, rt);
                tcore_at_tok_free(tokens);
        } else {
-               err("RESPONSE NOK");
-               err("Failed to get ef[0x%x] (file_meta->file_id) ", file_meta->file_id);
-               sim_result = TEL_SIM_RESULT_FAILURE;
-       }
+               dbg("RESPONSE NOK");
+               dbg("error to get ef[0x%x]", meta_info->file_id);
+               dbg("error to get ef[0x%x] (meta_info->file_id) ", meta_info->file_id);
+               rt = SIM_ACCESS_FAILED;
 
-       dbg("Calling __imc_sim_next_from_get_response");
-       __imc_sim_next_from_get_response(co, resp_cb_data, sim_result);
+               ur = tcore_user_request_ref(ur);
+               _next_from_get_file_info(o, ur, meta_info->file_id, rt);
+       }
        dbg("Exit");
 }
 
-static TelReturn __imc_sim_update_file(CoreObject *co,
-       ImcRespCbData *resp_cb_data, int cmd, TelSimFileId ef,
-       int p1, int p2, int p3, char *encoded_data)
+static void _response_get_file_data(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       char *cmd_str = NULL;
-       TelReturn ret = TEL_RETURN_FAILURE;
-       ImcSimMetaInfo *file_meta =
-               (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       CoreObject *o = NULL;
+       struct imc_sim_property *meta_info = NULL;
+       GSList *tokens = NULL;
+       enum tel_sim_access_result rt;
+       gboolean dr = FALSE;
+       const char *line = NULL;
+       char *res = NULL;
+       char *tmp = NULL;
+       int res_len;
+       int sw1 = 0;
+       int sw2 = 0;
 
-       dbg("Entry File-id:[0x%02x]", file_meta->file_id);
+       dbg("Entry");
 
-       cmd_str = g_strdup_printf("AT+CRSM=%d,%d,%d,%d,%d,\"%s\"",
-               cmd, ef, p1, p2, p3, encoded_data);
+       o = tcore_pending_ref_core_object(p);
+       ur = tcore_pending_ref_user_request(p);
+       meta_info = (struct imc_sim_property *)tcore_user_request_ref_metainfo(ur, NULL);
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, "+CRSM:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               __on_response_imc_sim_update_file, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Update SIM File");
+       if (resp->success > 0) {
+               dbg("RESPONSE OK");
+               if (resp->lines) {
+                       line = (const char *)resp->lines->data;
+                       tokens = tcore_at_tok_new(line);
+                       if (g_slist_length(tokens) != 3) {
+                               msg("Invalid message");
+                               tcore_at_tok_free(tokens);
+                               return;
+                       }
+               }
+               sw1 = atoi(g_slist_nth_data(tokens, 0));
+               sw2 = atoi(g_slist_nth_data(tokens, 1));
+               res = g_slist_nth_data(tokens, 2);
 
-       tcore_free(encoded_data);
-       g_free(cmd_str);
+               tmp = tcore_at_tok_extract(res);
+               if (!tmp)
+                       return;
+               res = util_hexStringToBytes(tmp);
+               res_len = strlen(tmp) / 2;
+               dbg("Response: [%s] Response length: [%d]", res, res_len);
 
-       dbg("Exit");
-       return ret;
-}
-static void __imc_sim_read_record(CoreObject *co, ImcRespCbData *resp_cb_data)
-{
-       gchar *at_cmd = NULL;
-       int p1 = 0;
-       int p2 = 0;
-       int p3 = 0;
-       ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
-       TelReturn ret = TEL_RETURN_FAILURE;
-
-       dbg("Entry File-id:[0x%02x]", file_meta->file_id);
-
-       /* According to TS 102 221, values of p1, p2, p3 can be as below:
-        * 11.1.5 READ RECORD
-        * P1: Record number
-        * P2: Mode, see table 11.11
-        * Lc: Not present
-        * Data: Not present
-        * Le: Number of bytes to be read (P3)
-        */
-
-       p1 = (unsigned char) file_meta->current_index;
-       p2 = (unsigned char) 0x04;                      /* 0x4 for absolute mode */
-       p3 = (unsigned char) file_meta->rec_length;
-
-       at_cmd = g_strdup_printf("AT+CRSM=%d, %d, %d, %d, %d",
-                               IMC_SIM_ACCESS_READ_RECORD, file_meta->file_id, p1, p2, p3);
-
-       ret = tcore_at_prepare_and_send_request(co,
-               at_cmd, "+CRSM:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               __on_response_imc_sim_read_data, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get File Record");
-
-       dbg("ret:[%d]", ret);
-       g_free(at_cmd);
+               if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
+                       rt = SIM_ACCESS_SUCCESS;
+                       meta_info->files.result = rt;
 
-       dbg("Exit");
-}
+                       dbg("File ID: [0x%x]", meta_info->file_id);
+                       switch (meta_info->file_id) {
+                       case SIM_EF_IMSI:
+                       {
+                               struct tel_sim_imsi *imsi = NULL;
 
-static void __imc_sim_read_binary(CoreObject *co, ImcRespCbData *resp_cb_data)
-{
-       gchar *at_cmd = NULL;
-       int p1 = 0;
-       int p2 = 0;
-       int p3 = 0;
-       int offset = 0;
-       ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
-       TelReturn ret = TEL_RETURN_FAILURE;
+                               dbg("Data: [%s]", res);
+                               imsi = g_try_new0(struct tel_sim_imsi, 1);
+                               dr = tcore_sim_decode_imsi(imsi, (unsigned char *)res, res_len);
+                               if (dr == FALSE) {
+                                       err("IMSI decoding failed");
+                               } else {
+                                       //_sim_check_identity(o, imsi);
+                                       tcore_sim_set_imsi(o, imsi);
+                               }
 
-       dbg("Entry File-id:[0x%02x]", file_meta->file_id);
+                               /* Free memory */
+                               g_free(imsi);
+                       }
+                       break;
 
-       /* According to TS 102 221, values of P1, P2, P3 can be as below:
-        * 11.1.3 READ BINARY
-        * P1: See table 11.10
-        * P2: Offset low
-        * Lc: Not present
-        * Data: Not present
-        * Le: Number of bytes to be read (P3)
-        */
+                       case SIM_EF_ICCID:
+                               dr = tcore_sim_decode_iccid(&meta_info->files.data.iccid, (unsigned char *)res, res_len);
+                       break;
 
-       p1 = (unsigned char) (offset & 0xFF00) >> 8;
-       p2 = (unsigned char) offset & 0x00FF;                   /* offset low */
-       p3 = (unsigned char) file_meta->data_size;
+                       case SIM_EF_ELP:                        /* 2G EF - 2 bytes decoding */
+                       case SIM_EF_USIM_LI:            /* 3G EF - 2 bytes decoding */
+                       case SIM_EF_USIM_PL:            /* 3G EF - same as EFELP, so 2 byte decoding */
+                       case SIM_EF_LP:                         /* 1 byte encoding */
+                               if ((tcore_sim_get_type(o) == SIM_TYPE_GSM)
+                                               && (meta_info->file_id == SIM_EF_LP)) {
+                                       /*
+                                        * 2G LP(0x6F05) has 1 byte for each language
+                                        */
+                                       dr = tcore_sim_decode_lp(&meta_info->files.data.language,
+                                                               (unsigned char *)res, res_len);
+                               } else {
+                                       /*
+                                        * 3G LI(0x6F05)/PL(0x2F05),
+                                        * 2G ELP(0x2F05) has 2 bytes for each language
+                                        */
+                                       dr = tcore_sim_decode_li(meta_info->file_id,
+                                                               &meta_info->files.data.language,
+                                                               (unsigned char *)res, res_len);
+                               }
+                       break;
 
-       at_cmd = g_strdup_printf("AT+CRSM=%d, %d, %d, %d, %d",
-                               IMC_SIM_ACCESS_READ_BINARY, file_meta->file_id, p1, p2, p3);
+                       case SIM_EF_SPN:
+                               dr = tcore_sim_decode_spn(&meta_info->files.data.spn,
+                                                               (unsigned char *)res, res_len);
+                       break;
+
+                       case SIM_EF_SPDI:
+                               dr = tcore_sim_decode_spdi(&meta_info->files.data.spdi,
+                                                               (unsigned char *)res, res_len);
+                       break;
+
+                       case SIM_EF_SST: /* EF UST has same address */
+                       {
+                               if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
+                                       dr = tcore_sim_decode_sst(&meta_info->files.data.svct.table.sst , (unsigned char *)res, res_len);
+                                       if (dr == FALSE) {
+                                               dbg("SST decoding failed");
+                                               tcore_sim_set_service_table(o, NULL);
+                                       } else {
+                                               int i = 0, size = sizeof(struct tel_sim_sst);
+                                               char *temp = NULL;
+                                               meta_info->files.data.svct.sim_type = SIM_TYPE_GSM;
+                                               if ((temp = g_try_malloc0(size + 1)) != NULL) {
+                                                       memcpy(temp, &meta_info->files.data.svct.table.sst, size);
+                                                       for (i = 0; i < size; i++) {
+                                                               if (temp[i] == 1)
+                                                                       temp[i] = '1';
+                                                               else
+                                                                       temp[i] = '0';
+                                                       }
+                                                       dbg("svct.table.sst=[%s]", temp);
+                                                       g_free(temp);
+                                               }
+                                               tcore_sim_set_service_table(o, &meta_info->files.data.svct);
+                                       }
+                               } else if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
+                                       dr = tcore_sim_decode_ust(&meta_info->files.data.svct.table.ust , (unsigned char *)res, res_len);
+                                       if (dr == FALSE) {
+                                               dbg("SST decoding failed");
+                                               tcore_sim_set_service_table(o, NULL);
+                                       } else {
+                                               int i = 0, size = sizeof(struct tel_sim_ust);
+                                               char *temp = NULL;
+                                               meta_info->files.data.svct.sim_type = SIM_TYPE_USIM;
+                                               if ((temp = g_try_malloc0(size + 1)) != NULL) {
+                                                       memcpy(temp, &meta_info->files.data.svct.table.ust, size);
+                                                       for (i = 0; i < size; i++) {
+                                                               if (temp[i] == 1)
+                                                                       temp[i] = '1';
+                                                               else
+                                                                       temp[i] = '0';
+                                                       }
+                                                       dbg("svct.table.ust=[%s]", temp);
+                                                       g_free(temp);
+                                               }
+                                               tcore_sim_set_service_table(o, &meta_info->files.data.svct);
+                                       }
+                               } else {
+                                       dbg("err not handled tcore_sim_get_type(o)[%d] in here", tcore_sim_get_type(o));
+                               }
+                       }
+                       break;
 
-       ret = tcore_at_prepare_and_send_request(co,
-               at_cmd, "+CRSM:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               __on_response_imc_sim_read_data, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get File Data");
+                       case SIM_EF_ECC:
+                       {
+                               if (tcore_sim_get_type(o) == SIM_TYPE_GSM) {
+                                       dr = tcore_sim_decode_ecc(&meta_info->files.data.ecc, (unsigned char *)res, res_len);
+                               } else if (tcore_sim_get_type(o) == SIM_TYPE_USIM) {
+                                       struct tel_sim_ecc *ecc = NULL;
 
-       dbg("ret:[%d]", ret);
-       g_free(at_cmd);
+                                       ecc = g_try_new0(struct tel_sim_ecc, 1);
+                                       dbg("Index [%d]", meta_info->current_index);
 
-       dbg("Exit");
-}
+                                       dr = tcore_sim_decode_uecc(ecc, (unsigned char *)res, res_len);
+                                       if (dr == TRUE) {
+                                               memcpy(&meta_info->files.data.ecc.ecc[meta_info->files.data.ecc.ecc_count], ecc, sizeof(struct tel_sim_ecc));
+                                               meta_info->files.data.ecc.ecc_count++;
+                                       }
 
-static TelReturn __imc_sim_get_response(CoreObject *co, ImcRespCbData *resp_cb_data)
-{
-       gchar *at_cmd = NULL;
-       ImcSimMetaInfo *file_meta =
-               (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
-       TelReturn ret = TEL_RETURN_FAILURE;
+                                       /* Free memory */
+                                       g_free(ecc);
+                               } else {
+                                       dbg("Unknown/Unsupported SIM Type: [%d]", tcore_sim_get_type(o));
+                               }
+                       }
+                       break;
+
+                       case SIM_EF_MSISDN:
+                       {
+                               struct tel_sim_msisdn *msisdn = NULL;
+
+                               dbg("Index [%d]", meta_info->current_index);
+                               msisdn = g_try_new0(struct tel_sim_msisdn, 1);
+                               dr = tcore_sim_decode_msisdn(msisdn, (unsigned char *)res, res_len);
+                               if (dr == TRUE) {
+                                       memcpy(&meta_info->files.data.msisdn_list.msisdn[meta_info->files.data.msisdn_list.count],
+                                                               msisdn, sizeof(struct tel_sim_msisdn));
+
+                                       meta_info->files.data.msisdn_list.count++;
+                               }
+
+                               /* Free memory */
+                               g_free(msisdn);
+                       }
+                       break;
+
+                       case SIM_EF_OPL:
+                       {
+                               struct tel_sim_opl *opl = NULL;
+
+                               dbg("decode w/ index [%d]", meta_info->current_index);
+
+                               opl = g_try_new0(struct tel_sim_opl, 1);
+                               dr = tcore_sim_decode_opl(opl, (unsigned char *)res, res_len);
+                               if (dr == TRUE) {
+                                       memcpy(&meta_info->files.data.opl.list[meta_info->files.data.opl.opl_count],
+                                                       opl, sizeof(struct tel_sim_opl));
+                                       meta_info->files.data.opl.opl_count++;
+                               }
+
+                               /* Free memory */
+                               g_free(opl);
+                       }
+                       break;
+
+                       case SIM_EF_PNN:
+                       {
+                               struct tel_sim_pnn *pnn = NULL;
+
+                               dbg("decode w/ index [%d]", meta_info->current_index);
+
+                               pnn = g_try_new0(struct tel_sim_pnn, 1);
+                               dr = tcore_sim_decode_pnn(pnn, (unsigned char *)res, res_len);
+                               if (dr == TRUE) {
+                                       memcpy(&meta_info->files.data.pnn.list[meta_info->files.data.pnn.pnn_count],
+                                                               pnn, sizeof(struct tel_sim_pnn));
+
+                                       meta_info->files.data.pnn.pnn_count++;
+                               }
+
+                               /* Free memory */
+                               g_free(pnn);
+                       }
+                       break;
+
+                       case SIM_EF_OPLMN_ACT:
+                               dr = tcore_sim_decode_oplmnwact(&meta_info->files.data.opwa,
+                                                                               (unsigned char *)res, res_len);
+                       break;
+
+                       case SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
+                               /*dr = tcore_sim_decode_csp(&po->p_cphs->csp, p_data->response, p_data->response_len);*/
+                       break;
+
+                       case SIM_EF_USIM_MBI: /* linear type */
+                       {
+                               struct tel_sim_mbi *mbi = NULL;
+
+                               mbi = g_try_new0(struct tel_sim_mbi, 1);
+                               dr = tcore_sim_decode_mbi(mbi, (unsigned char *)res, res_len);
+                               if (dr == TRUE) {
+                                       memcpy(&meta_info->mbi_list.mbi[meta_info->mbi_list.profile_count],
+                                                                               mbi, sizeof(struct tel_sim_mbi));
+                                       meta_info->mbi_list.profile_count++;
+
+                                       dbg("mbi count[%d]", meta_info->mbi_list.profile_count);
+                                       dbg("voice_index[%d]", meta_info->mbi_list.mbi[meta_info->mbi_list.profile_count - 1].voice_index);
+                                       dbg("fax_index[%d]", meta_info->mbi_list.mbi[meta_info->mbi_list.profile_count - 1].fax_index);
+                                       dbg("email_index[%d]", meta_info->mbi_list.mbi[meta_info->mbi_list.profile_count - 1].email_index);
+                                       dbg("other_index[%d]", meta_info->mbi_list.mbi[meta_info->mbi_list.profile_count - 1].other_index);
+                                       dbg("video_index[%d]", meta_info->mbi_list.mbi[meta_info->mbi_list.profile_count - 1].video_index);
+                               }
+
+                               /* Free memory */
+                               g_free(mbi);
+                       }
+                       break;
+
+                       case SIM_EF_CPHS_MAILBOX_NUMBERS: /* linear type */
+                       case SIM_EF_MBDN: /* linear type */
+                               dr = tcore_sim_decode_xdn(&meta_info->mb_data.mb[meta_info->mb_count].number_info,
+                                                                       (unsigned char *)res, res_len);
+                               meta_info->mb_count++;
+                       break;
+
+                       case SIM_EF_CPHS_VOICE_MSG_WAITING: /* transparent type */
+                               dr = tcore_sim_decode_vmwf(&meta_info->files.data.mw.cphs_mw,
+                                                                       (unsigned char *)res, res_len);
+                       break;
+
+                       case SIM_EF_USIM_MWIS: /* linear type */
+                       {
+                               struct tel_sim_mw *mw = NULL;
+
+                               mw = g_try_new0(struct tel_sim_mw, 1);
+
+                               dr = tcore_sim_decode_mwis(mw, (unsigned char *)res, res_len);
+                               if (dr == TRUE) {
+                                       memcpy(&meta_info->files.data.mw.mw_list.mw[meta_info->files.data.mw.mw_list.profile_count], mw, sizeof(struct tel_sim_mw));
+                                       meta_info->files.data.mw.mw_list.mw[meta_info->files.data.mw.mw_list.profile_count].rec_index = meta_info->current_index;
+                                       meta_info->files.data.mw.mw_list.profile_count++;
+                               }
+
+                               /* Free memory */
+                               g_free(mw);
+                       }
+                       break;
+
+                       case SIM_EF_CPHS_CALL_FORWARD_FLAGS: /* transparent type */
+                               dr = tcore_sim_decode_cff(&meta_info->files.data.cf.cphs_cf,
+                                                                       (unsigned char *)res, res_len);
+                       break;
+
+                       case SIM_EF_USIM_CFIS: /* linear type */
+                       {
+                               struct tel_sim_cfis *cf = NULL;
+
+                               cf = g_try_new0(struct tel_sim_cfis, 1);
+                               dr = tcore_sim_decode_cfis(cf, (unsigned char *)res, res_len);
+                               if (dr == TRUE) {
+                                       memcpy(&meta_info->files.data.cf.cf_list.cf[meta_info->files.data.cf.cf_list.profile_count],
+                                                                       cf, sizeof(struct tel_sim_cfis));
+
+                                       meta_info->files.data.cf.cf_list.cf[meta_info->files.data.cf.cf_list.profile_count].rec_index = meta_info->current_index;
+                                       meta_info->files.data.cf.cf_list.profile_count++;
+                               }
+
+                               /* Free memory */
+                               g_free(cf);
+                       }
+                       break;
+
+                       case SIM_EF_CPHS_SERVICE_STRING_TABLE:
+                               dbg("not handled -SIM_EF_CPHS_SERVICE_STRING_TABLE ");
+                       break;
+
+                       case SIM_EF_CPHS_OPERATOR_NAME_STRING:
+                               dr = tcore_sim_decode_ons((unsigned char *)&meta_info->files.data.cphs_net.full_name,
+                                                                       (unsigned char *)res, res_len);
+                               dbg("meta_info->files.result[%d], meta_info->files.data.cphs_net.full_name[%s]",
+                                               meta_info->files.result, meta_info->files.data.cphs_net.full_name);
+                       break;
 
-       dbg("Entry File-id:[0x%02x]", file_meta->file_id);
+                       case SIM_EF_CPHS_DYNAMICFLAGS:
+                               /*dr = tcore_sim_decode_dynamic_flag(&po->p_cphs->dflagsinfo,
+                                                                               p_data->response, p_data->response_len);*/
+                       break;
+
+                       case SIM_EF_CPHS_DYNAMIC2FLAG:
+                               /*dr = tcore_sim_decode_dynamic2_flag(&po->p_cphs->d2flagsinfo, p_data->response,
+                                                                               p_data->response_len);*/
+                       break;
+
+                       case SIM_EF_CPHS_CPHS_INFO:
+                               dr = tcore_sim_decode_cphs_info(&meta_info->files.data.cphs,
+                                                                               (unsigned char *)res, res_len);
+                       break;
 
-       at_cmd = g_strdup_printf("AT+CRSM=%d, %d",
-               IMC_SIM_ACCESS_GET_RESPONSE, file_meta->file_id);
+                       case SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
+                               dr = tcore_sim_decode_short_ons((unsigned char *)&meta_info->files.data.cphs_net.short_name,
+                                                                               (unsigned char *)res, res_len);
+                       break;
 
-       ret = tcore_at_prepare_and_send_request(co,
-               at_cmd, "+CRSM:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               __on_response_imc_sim_get_response, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get File Info");
+                       case SIM_EF_CPHS_INFORMATION_NUMBERS:
+                               /*dr = tcore_sim_decode_information_number(&po->p_cphs->infn, p_data->response, p_data->response_len);*/
+                       break;
+
+                       default:
+                               dbg("File Decoding Failed - not handled File[0x%x]", meta_info->file_id);
+                               dr = 0;
+                       break;
+                       }
+               } else {
+                       rt = _decode_status_word(sw1, sw2);
+                       meta_info->files.result = rt;
+               }
+
+               /* Free memory */
+               g_free(tmp);
+               g_free(res);
+
+               /* Free tokens */
+               tcore_at_tok_free(tokens);
+       } else {
+               dbg("RESPONSE NOK");
+               dbg("Error - File ID: [0x%x]", meta_info->file_id);
+               rt = SIM_ACCESS_FAILED;
+       }
+
+       /* Reference User Request */
+       ur = tcore_user_request_ref(ur);
+
+       /* Get File data */
+       _next_from_get_file_data(tcore_pending_ref_core_object(p), ur, rt, dr);
 
-       g_free(at_cmd);
        dbg("Exit");
-       return ret;
 }
 
-static void __on_response_imc_sim_get_retry_count(TcorePending *p, guint data_len,
-                       const void *data, void *user_data)
+static void _on_response_get_retry_count(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       TelSimResult result = TEL_SIM_RESULT_INCORRECT_PASSWORD;
-       const TcoreAtResponse *at_resp = data;
-       ImcRespCbData *resp_cb_data = user_data;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       ImcSimCurrSecOp *sec_op = NULL;
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       CoreObject *o = NULL;
+       struct imc_sim_property *sp = NULL;
        GSList *tokens = NULL;
        const char *line = NULL;
        int lock_type = 0;
@@ -2037,20 +2118,23 @@ static void __on_response_imc_sim_get_retry_count(TcorePending *p, guint data_le
 
        dbg("Entry");
 
-       tcore_check_return_assert(co != NULL);
-       tcore_check_return_assert(resp_cb_data != NULL);
-
-       sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
-
-       if (at_resp && at_resp->success) {
-               dbg("Sim Get Retry Count [OK]");
+       o = tcore_pending_ref_core_object(p);
+       sp = tcore_sim_ref_userdata(o);
+       if (!sp) {
+               err("user data is null");
+               return;
+       }
+       ur = tcore_pending_ref_user_request(p);
 
-               if (at_resp->lines) {
-                       line = (const char *)at_resp->lines->data;
+       if (resp->success > 0) {
+               dbg("RESPONSE OK");
+               if (resp->lines) {
+                       line = (const char *)resp->lines->data;
                        tokens = tcore_at_tok_new(line);
                        if (g_slist_length(tokens) < 3) {
-                               err("Invalid message");
-                               goto Failure;
+                               msg("Invalid message");
+                               tcore_at_tok_free(tokens);
+                               return;
                        }
                }
                lock_type = atoi(g_slist_nth_data(tokens, 0));
@@ -2060,1822 +2144,2140 @@ static void __on_response_imc_sim_get_retry_count(TcorePending *p, guint data_le
                dbg("lock_type = %d, attempts_left = %d, time_penalty = %d",
                        lock_type, attempts_left, time_penalty);
 
-               switch (*sec_op) {
-                       case IMC_SIM_CURR_SEC_OP_PIN1_VERIFY:
-                       case IMC_SIM_CURR_SEC_OP_PIN2_VERIFY:
-                       {
-                               TelSimSecPinResult verify_pin = {0, };
+               switch (sp->current_sec_op) {
+               case SEC_PIN1_VERIFY:
+               case SEC_PIN2_VERIFY:
+               case SEC_SIM_VERIFY:
+               case SEC_ADM_VERIFY:
+               {
+                       struct tresp_sim_verify_pins v_pin = {0, };
+
+                       v_pin.result = SIM_INCORRECT_PASSWORD;
+                       v_pin.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+                       v_pin.retry_count = attempts_left;
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                                        sizeof(struct tresp_sim_verify_pins), &v_pin);
+               }
+               break;
 
-                               if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN1_VERIFY)
-                                       verify_pin.pin_type = TEL_SIM_PIN_TYPE_PIN1;
-                               else if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN2_VERIFY)
-                                       verify_pin.pin_type = TEL_SIM_PIN_TYPE_PIN2;
+               case SEC_PUK1_VERIFY:
+               case SEC_PUK2_VERIFY:
+               {
+                       struct tresp_sim_verify_puks v_puk = {0, };
 
-                               verify_pin.retry_count = attempts_left;
+                       v_puk.result = SIM_INCORRECT_PASSWORD;
+                       v_puk.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+                       v_puk.retry_count = attempts_left;
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                                        sizeof(struct tresp_sim_verify_puks), &v_puk);
+               }
+               break;
 
-                               if(resp_cb_data->cb)
-                                       resp_cb_data->cb(co, (gint)result,
-                                               &verify_pin, resp_cb_data->cb_data);
-                               break;
-                       }
-                       case IMC_SIM_CURR_SEC_OP_PUK1_VERIFY:
-                       case IMC_SIM_CURR_SEC_OP_PUK2_VERIFY:
-                       {
-                               TelSimSecPukResult verify_puk = {0, };
+               case SEC_PIN1_CHANGE:
+               case SEC_PIN2_CHANGE:
+               {
+                       struct tresp_sim_change_pins change_pin = {0, };
 
-                               if (*sec_op == IMC_SIM_CURR_SEC_OP_PUK1_VERIFY)
-                                       verify_puk.puk_type = TEL_SIM_PUK_TYPE_PUK1;
-                               else if (*sec_op == IMC_SIM_CURR_SEC_OP_PUK2_VERIFY)
-                                       verify_puk.puk_type = TEL_SIM_PUK_TYPE_PUK2;
+                       change_pin.result = SIM_INCORRECT_PASSWORD;
+                       change_pin.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+                       change_pin.retry_count = attempts_left;
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                                        sizeof(struct tresp_sim_change_pins), &change_pin);
+               }
+               break;
 
-                               verify_puk.retry_count = attempts_left;
+               case SEC_PIN1_DISABLE:
+               case SEC_PIN2_DISABLE:
+               case SEC_FDN_DISABLE:
+               case SEC_SIM_DISABLE:
+               case SEC_NET_DISABLE:
+               case SEC_NS_DISABLE:
+               case SEC_SP_DISABLE:
+               case SEC_CP_DISABLE:
+               {
+                       struct tresp_sim_disable_facility dis_facility = {0, };
+
+                       dis_facility.result = SIM_INCORRECT_PASSWORD;
+                       dis_facility.type = _sim_get_current_pin_facility(sp->current_sec_op);
+                       dis_facility.retry_count = attempts_left;
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                                        sizeof(struct tresp_sim_disable_facility), &dis_facility);
+               }
+               break;
 
-                               if(resp_cb_data->cb)
-                                       resp_cb_data->cb(co, (gint)result,
-                                               &verify_puk, resp_cb_data->cb_data);
-                               break;
-                       }
-                       case IMC_SIM_CURR_SEC_OP_PIN1_CHANGE:
-                       case IMC_SIM_CURR_SEC_OP_PIN2_CHANGE:
-                       {
-                               TelSimSecPinResult change_pin = {0, };
+               case SEC_PIN1_ENABLE:
+               case SEC_PIN2_ENABLE:
+               case SEC_FDN_ENABLE:
+               case SEC_SIM_ENABLE:
+               case SEC_NET_ENABLE:
+               case SEC_NS_ENABLE:
+               case SEC_SP_ENABLE:
+               case SEC_CP_ENABLE:
+               {
+                       struct tresp_sim_enable_facility en_facility = {0, };
+
+                       en_facility.result = SIM_INCORRECT_PASSWORD;
+                       en_facility.type = _sim_get_current_pin_facility(sp->current_sec_op);
+                       en_facility.retry_count = attempts_left;
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                                        sizeof(struct tresp_sim_enable_facility), &en_facility);
+               }
+               break;
 
-                               if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN1_CHANGE)
-                                       change_pin.pin_type = TEL_SIM_PIN_TYPE_PIN1;
-                               else if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN2_CHANGE)
-                                       change_pin.pin_type = TEL_SIM_PIN_TYPE_PIN2;
+               default:
+                       dbg("not handled sec op[%d]", sp->current_sec_op);
+               break;
+               }
 
-                               change_pin.retry_count = attempts_left;
+               /* Free tokens */
+               tcore_at_tok_free(tokens);
+       }
 
-                               if(resp_cb_data->cb)
-                                       resp_cb_data->cb(co, (gint)result,
-                                               &change_pin, resp_cb_data->cb_data);
-                               break;
-                       }
-                       case IMC_SIM_CURR_SEC_OP_PIN1_DISABLE:
-                       case IMC_SIM_CURR_SEC_OP_PIN2_DISABLE:
-                       case IMC_SIM_CURR_SEC_OP_FDN_DISABLE:
-                       case IMC_SIM_CURR_SEC_OP_SIM_DISABLE:
-                       case IMC_SIM_CURR_SEC_OP_NET_DISABLE:
-                       case IMC_SIM_CURR_SEC_OP_NS_DISABLE:
-                       case IMC_SIM_CURR_SEC_OP_SP_DISABLE:
-                       case IMC_SIM_CURR_SEC_OP_CP_DISABLE:
-                       {
-                               TelSimFacilityResult disable_facility = {0, };
-                               int lock_type;
+       dbg("Exit");
+}
 
-                               lock_type = __imc_sim_get_lock_type(*sec_op);
-                               if (lock_type == -1)
-                                       goto Failure;
+static gboolean _get_sim_type(CoreObject *o)
+{
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
+       UserRequest *ur = NULL;
+       char *cmd_str = NULL;
 
-                               disable_facility.type = lock_type;
-                               disable_facility.retry_count = attempts_left;
+       dbg("Entry");
 
-                               if(resp_cb_data->cb)
-                                       resp_cb_data->cb(co, (gint)result,
-                                               &disable_facility, resp_cb_data->cb_data);
-                               break;
-                       }
-                       case IMC_SIM_CURR_SEC_OP_PIN1_ENABLE:
-                       case IMC_SIM_CURR_SEC_OP_PIN2_ENABLE:
-                       case IMC_SIM_CURR_SEC_OP_FDN_ENABLE:
-                       case IMC_SIM_CURR_SEC_OP_SIM_ENABLE:
-                       case IMC_SIM_CURR_SEC_OP_NET_ENABLE:
-                       case IMC_SIM_CURR_SEC_OP_NS_ENABLE:
-                       case IMC_SIM_CURR_SEC_OP_SP_ENABLE:
-                       case IMC_SIM_CURR_SEC_OP_CP_ENABLE:
-                       {
-                               TelSimFacilityResult enable_facility = {0, };
-                               int lock_type;
+       hal = tcore_object_get_hal(o);
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return FALSE;
+       }
+       cmd_str = g_strdup_printf("AT+XUICC?");
+       req = tcore_at_request_new(cmd_str, "+XUICC:", TCORE_AT_SINGLELINE);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return FALSE;
+       }
+       g_free(cmd_str);
+
+       dbg("Command: [%s] Prefix(if any): [%s] Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
+
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, _response_get_sim_type, hal);
+       tcore_pending_link_user_request(pending, ur);
+       tcore_hal_send_request(hal, pending);
+
+       dbg("Exit");
+       return TRUE;
+}
+
+static TReturn _get_file_info(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef)
+{
+       TcoreHal *hal = NULL;
+       TcorePending *pending = NULL;
+       struct imc_sim_property meta_info = {0, };
+       char *cmd_str = NULL;
+       TReturn ret = TCORE_RETURN_FAILURE;
+       int trt = 0;
+
+       dbg("Entry");
+
+       meta_info.file_id = ef;
+       dbg("meta_info.file_id: [0x%02x]", meta_info.file_id);
+       hal = tcore_object_get_hal(o);
+       dbg("hal: %x", hal);
+
+       trt = tcore_user_request_set_metainfo(ur, sizeof(struct imc_sim_property), &meta_info);
+       dbg("trt[%d]", trt);
+       cmd_str = g_strdup_printf("AT+CRSM=192, %d", ef);      /*command - 192 : GET RESPONSE*/
+       dbg("Command: [%s] Command length: [%d]", cmd_str, strlen(cmd_str));
+
+       pending = tcore_at_pending_new(o, cmd_str, "+CRSM:", TCORE_AT_SINGLELINE, _response_get_file_info, NULL);
+       tcore_pending_link_user_request(pending, ur);
+       ret = tcore_hal_send_request(hal, pending);
+       if (TCORE_RETURN_SUCCESS != ret)
+               tcore_user_request_free(ur);
+
+       g_free(cmd_str);
+       dbg("Exit");
+       return TCORE_RETURN_SUCCESS;
+}
+
+static gboolean _get_file_data(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int offset, const int length)
+{
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
+       char *cmd_str = NULL;
+       int p1 = 0;
+       int p2 = 0;
+       int p3 = 0;
+
+       dbg("Entry");
+       hal = tcore_object_get_hal(o);
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return FALSE;
+       }
+
+       dbg("file_id: %x", ef);
+
+       p1 = (unsigned char) (offset & 0xFF00) >> 8;
+       p2 = (unsigned char) offset & 0x00FF; /* offset low */
+       p3 = (unsigned char) length;
+
+       cmd_str = g_strdup_printf("AT+CRSM=176, %d, %d, %d, %d", ef, p1, p2, p3);     /*command - 176 : READ BINARY*/
+
+       req = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return FALSE;
+       }
+       g_free(cmd_str);
+
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
+
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, _response_get_file_data, hal);
+       tcore_pending_link_user_request(pending, ur);
+       tcore_hal_send_request(hal, pending);
+
+       dbg("Exit");
+       return TRUE;
+}
+
+static gboolean _get_file_record(CoreObject *o, UserRequest *ur, const enum tel_sim_file_id ef, const int index, const int length)
+{
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
+       char *cmd_str = NULL;
+       int p1 = 0;
+       int p2 = 0;
+       int p3 = 0;
+
+       dbg("Entry");
+
+       hal = tcore_object_get_hal(o);
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return FALSE;
+       }
+
+       p1 = (unsigned char) index;
+       p2 = (unsigned char) 0x04;    /* 0x4 for absolute mode */
+       p3 = (unsigned char) length;
+
+       cmd_str = g_strdup_printf("AT+CRSM=178, %d, %d, %d, %d", ef, p1, p2, p3);     /*command - 178 : READ RECORD*/
+
+       req = tcore_at_request_new(cmd_str, "+CRSM:", TCORE_AT_SINGLELINE);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return FALSE;
+       }
+       g_free(cmd_str);
+
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
+
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, _response_get_file_data, hal);
+       tcore_pending_link_user_request(pending, ur);
+       tcore_hal_send_request(hal, pending);
+
+       dbg("Exit");
+       return TRUE;
+}
+
+static TReturn _get_retry_count(CoreObject *o, UserRequest *ur)
+{
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
+       char *cmd_str = NULL;
+       int lock_type = 0;
+       struct imc_sim_property *sp = NULL;
+
+       dbg("Entry");
+
+       hal = tcore_object_get_hal(o);
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return TCORE_RETURN_FAILURE;
+       }
+       sp = tcore_sim_ref_userdata(o);
+       if (!sp) {
+               err("user data is null");
+               tcore_pending_free(pending);
+               return TCORE_RETURN_FAILURE;
+       }
+
+       switch (sp->current_sec_op) {
+       case SEC_PIN1_VERIFY:
+       case SEC_PIN1_CHANGE:
+       case SEC_PIN1_ENABLE:
+       case SEC_PIN1_DISABLE:
+               lock_type = 1;
+               break;
+
+       case SEC_PIN2_VERIFY:
+       case SEC_PIN2_CHANGE:
+       case SEC_PIN2_ENABLE:
+       case SEC_PIN2_DISABLE:
+       case SEC_FDN_ENABLE:
+       case SEC_FDN_DISABLE:
+               lock_type = 2;
+               break;
+
+       case SEC_PUK1_VERIFY:
+               lock_type = 3;
+               break;
+
+       case SEC_PUK2_VERIFY:
+               lock_type = 4;
+               break;
+
+       case SEC_NET_ENABLE:
+       case SEC_NET_DISABLE:
+               lock_type = 5;
+               break;
+
+       case SEC_NS_ENABLE:
+       case SEC_NS_DISABLE:
+               lock_type = 6;
+               break;
+
+       case SEC_SP_ENABLE:
+       case SEC_SP_DISABLE:
+               lock_type = 7;
+               break;
+
+       case SEC_CP_ENABLE:
+       case SEC_CP_DISABLE:
+               lock_type = 8;
+               break;
+
+       case SEC_ADM_VERIFY:
+               lock_type = 9;
+               break;
+
+       default:
+               break;
+       }
+
+       cmd_str = g_strdup_printf("AT+XPINCNT=%d", lock_type);
+       req = tcore_at_request_new(cmd_str, "+XPINCNT:", TCORE_AT_SINGLELINE);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return TCORE_RETURN_FAILURE;
+       }
+       g_free(cmd_str);
+
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
+
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, _on_response_get_retry_count, hal);
+       tcore_pending_link_user_request(pending, ur);
+       tcore_hal_send_request(hal, pending);
+
+       dbg("Exit");
+       return TCORE_RETURN_SUCCESS;
+}
+
+static gboolean on_event_facility_lock_status(CoreObject *o, const void *event_info, void *user_data)
+{
+       char *line = NULL;
+       GSList *tokens = NULL;
+       GSList *lines = NULL;
+
+       dbg("Function entry");
+
+       lines = (GSList *)event_info;
+       if (1 != g_slist_length(lines)) {
+               dbg("unsolicited msg but multiple line");
+               goto OUT;
+       }
+       line = (char *)(lines->data);
+       tokens = tcore_at_tok_new(line);
+       if (g_slist_length(tokens) != 1) {
+               msg("Invalid message");
+               tcore_at_tok_free(tokens);
+               return TRUE;
+       }
+
+OUT:
+       dbg("Exit");
+       if (NULL != tokens)
+               tcore_at_tok_free(tokens);
+       return TRUE;
+}
+
+static void notify_sms_state(TcorePlugin *plugin, CoreObject *o,
+                               unsigned int sms_ready)
+{
+       Server *server = tcore_plugin_ref_server(plugin);
+       struct tnoti_sms_ready_status sms_ready_noti;
+       CoreObject *co_sms;
+
+       dbg("Entry");
+
+       co_sms = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_SMS);
+       if (co_sms == NULL) {
+               err("Can't find SMS core object");
+               return;
+       }
+
+       if (tcore_sms_get_ready_status(co_sms) == sms_ready)
+               return;
+
+       tcore_sms_set_ready_status(co_sms, sms_ready);
+
+       if (tcore_sim_get_status(o) == SIM_STATUS_INIT_COMPLETED) {
+               sms_ready_noti.status = sms_ready;
+               tcore_server_send_notification(server, co_sms,
+                                               TNOTI_SMS_DEVICE_READY,
+                                               sizeof(sms_ready_noti),
+                                               &sms_ready_noti);
+       }
+
+       dbg("Exit");
+}
+
+static gboolean on_event_pin_status(CoreObject *o, const void *event_info, void *user_data)
+{
+       TcorePlugin *plugin = tcore_object_ref_plugin(o);
+       enum tel_sim_status sim_status = SIM_STATUS_INITIALIZING;
+       GSList *tokens = NULL;
+       GSList *lines;
+       const char *line;
+       int sim_state = 0;
+       enum telephony_sms_ready_status sms_state = 0;
+
+       dbg("Entry");
+
+       lines = (GSList *)event_info;
+       if (g_slist_length(lines) != 1) {
+               err("Unsolicited message BUT multiple lines");
+               goto out;
+       }
+
+       line = lines->data;
+
+       /* Create 'tokens' */
+       tokens = tcore_at_tok_new(line);
+
+       /* SIM State */
+       if (g_slist_length(tokens) == 4) {
+               sim_state = atoi(g_slist_nth_data(tokens, 1));
+               sms_state = atoi(g_slist_nth_data(tokens, 3));
+
+               notify_sms_state(plugin, o, sms_state);
+       } else if (g_slist_length(tokens) == 1) {
+               sim_state = atoi(g_slist_nth_data(tokens, 0));
+       } else {
+               err("Invalid message");
+               goto out;
+       }
+
+       switch (sim_state) {
+       case 0:
+               sim_status = SIM_STATUS_CARD_NOT_PRESENT;
+               dbg("NO SIM");
+               break;
+
+       case 1:
+               sim_status = SIM_STATUS_PIN_REQUIRED;
+               dbg("PIN REQUIRED");
+               break;
+
+       case 2:
+               sim_status = SIM_STATUS_INITIALIZING;
+               dbg("PIN DISABLED AT BOOT UP");
+               break;
+
+       case 3:
+               sim_status = SIM_STATUS_INITIALIZING;
+               dbg("PIN VERIFIED");
+               break;
+
+       case 4:
+               sim_status = SIM_STATUS_PUK_REQUIRED;
+               dbg("PUK REQUIRED");
+               break;
+
+       case 5:
+               sim_status = SIM_STATUS_CARD_BLOCKED;
+               dbg("CARD PERMANENTLY BLOCKED");
+               break;
+
+       case 6:
+               sim_status = SIM_STATUS_CARD_ERROR;
+               dbg("SIM CARD ERROR");
+               break;
+
+       case 7:
+               sim_status = SIM_STATUS_INIT_COMPLETED;
+               dbg("SIM INIT COMPLETED");
+               break;
+
+       case 8:
+               sim_status = SIM_STATUS_CARD_ERROR;
+               dbg("SIM CARD ERROR");
+               break;
 
-                               lock_type = __imc_sim_get_lock_type(*sec_op);
-                               if (lock_type == -1)
-                                       goto Failure;
+       case 9:
+               sim_status = SIM_STATUS_CARD_REMOVED;
+               dbg("SIM REMOVED");
+               break;
 
-                               enable_facility.type = lock_type;
-                               enable_facility.retry_count = attempts_left;
+       case 12:
+               dbg("SIM SMS Ready");
+               notify_sms_state(plugin, o, SMS_STATE_READY);
+               goto out;
 
-                               if(resp_cb_data->cb)
-                                       resp_cb_data->cb(co, (gint)result,
-                                               &enable_facility, resp_cb_data->cb_data);
-                               break;
-                       }
-                       default:
-                               err("Unhandled sec op [%d]", *sec_op);
-                       break;
-               }
+       case 99:
+               sim_status = SIM_STATUS_UNKNOWN;
+               dbg("SIM STATE UNKNOWN");
+               break;
 
-               tcore_at_tok_free(tokens);
-               imc_destroy_resp_cb_data(resp_cb_data);
-               return;
+       default:
+               err("Unknown/Unsupported SIM state: [%d]", sim_state);
+               goto out;
        }
-       err("Sim Get Retry Count [NOK]");
-Failure :
-       /*TODO - send response for verify pin, puk etc.,
-       * when get_retry_count fails
-       */
-       tcore_at_tok_free(tokens);
-       imc_destroy_resp_cb_data(resp_cb_data);
-}
-
-static TelReturn __imc_sim_get_retry_count(CoreObject *co,
-                       ImcRespCbData *resp_cb_data)
-{
-       TelReturn ret = TEL_RETURN_FAILURE;
-       ImcSimCurrSecOp *sec_op = (
-               ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
-       int lock_type = 0;
-       gchar *cmd_str = NULL;
-
-       dbg("Entry");
 
-       switch (*sec_op) {
-               case IMC_SIM_CURR_SEC_OP_PIN1_VERIFY:
-               case IMC_SIM_CURR_SEC_OP_PIN1_CHANGE:
-               case IMC_SIM_CURR_SEC_OP_PIN1_ENABLE:
-               case IMC_SIM_CURR_SEC_OP_PIN1_DISABLE:
-                       lock_type = 1;
-                       break;
-               case IMC_SIM_CURR_SEC_OP_PIN2_VERIFY:
-               case IMC_SIM_CURR_SEC_OP_PIN2_CHANGE:
-               case IMC_SIM_CURR_SEC_OP_PIN2_ENABLE:
-               case IMC_SIM_CURR_SEC_OP_PIN2_DISABLE:
-               case IMC_SIM_CURR_SEC_OP_FDN_ENABLE:
-               case IMC_SIM_CURR_SEC_OP_FDN_DISABLE:
-                       lock_type = 2;
-                       break;
-               case IMC_SIM_CURR_SEC_OP_PUK1_VERIFY:
-                       lock_type = 3;
-                       break;
-               case IMC_SIM_CURR_SEC_OP_PUK2_VERIFY:
-                       lock_type = 4;
-                       break;
-               case IMC_SIM_CURR_SEC_OP_NET_ENABLE:
-               case IMC_SIM_CURR_SEC_OP_NET_DISABLE:
-                       lock_type = 5;
-                       break;
-               case IMC_SIM_CURR_SEC_OP_NS_ENABLE:
-               case IMC_SIM_CURR_SEC_OP_NS_DISABLE:
-                       lock_type = 6;
-                       break;
-               case IMC_SIM_CURR_SEC_OP_SP_ENABLE:
-               case IMC_SIM_CURR_SEC_OP_SP_DISABLE:
-                       lock_type = 7;
-                       break;
-               case IMC_SIM_CURR_SEC_OP_CP_ENABLE:
-               case IMC_SIM_CURR_SEC_OP_CP_DISABLE:
-                       lock_type = 8;
-                       break;
-               case IMC_SIM_CURR_SEC_OP_ADM_VERIFY:
-                       lock_type = 9;
-                       break;
-               default:
-                       break;
+       switch (sim_status) {
+       case SIM_STATUS_INIT_COMPLETED:
+               dbg("[SIM] SIM INIT COMPLETED");
+               if (tcore_sim_get_type(o) == SIM_TYPE_UNKNOWN) {
+                       _get_sim_type(o);
+                       goto out;
                }
-       cmd_str = g_strdup_printf("AT+XPINCNT=%d", lock_type);
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, NULL,
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               __on_response_imc_sim_get_retry_count, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get Retry Count");
+               break;
 
-       g_free(cmd_str);
-       return ret;
-}
+       case SIM_STATUS_CARD_REMOVED:
+               dbg("[SIM] SIM CARD REMOVED");
+               tcore_sim_set_type(o, SIM_TYPE_UNKNOWN);
+               break;
 
-static TelSimLockType __imc_sim_lock_type(int lock_type)
-{
-       switch(lock_type) {
-               case 1 :
-                       return TEL_SIM_LOCK_SC;
-               case 2 :
-                       return TEL_SIM_LOCK_FD;
-               case 5 :
-                       return TEL_SIM_LOCK_PN;
-               case 6 :
-                       return TEL_SIM_LOCK_PU;
-               case 7 :
-                       return TEL_SIM_LOCK_PP;
-               case 8 :
-                       return TEL_SIM_LOCK_PC ;
-               case 9 :
-                       return TEL_SIM_LOCK_PS ;
-               default :
-                       err("Invalid lock_type [%d]", lock_type);
-                       return -1;
-       }
-}
+       case SIM_STATUS_CARD_NOT_PRESENT:
+               dbg("[SIM] SIM CARD NOT PRESENT");
+               tcore_sim_set_type(o, SIM_TYPE_UNKNOWN);
+               break;
 
-static char *__imc_sim_get_fac_from_lock_type(TelSimLockType lock_type,
-               ImcSimCurrSecOp *sec_op, int flag)
-{
-       char *fac = NULL;
-       switch(lock_type) {
-               case TEL_SIM_LOCK_PS :
-                       fac = "PS";
-                       if (flag == ENABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_SIM_ENABLE;
-                       else if (flag == DISABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_SIM_DISABLE;
-                       else
-                               *sec_op = IMC_SIM_CURR_SEC_OP_SIM_STATUS;
-                       break;
-               case TEL_SIM_LOCK_SC :
-                       fac = "SC";
-                       if (flag == ENABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_PIN1_ENABLE;
-                       else if (flag == DISABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_PIN1_DISABLE;
-                       else
-                               *sec_op = IMC_SIM_CURR_SEC_OP_PIN1_STATUS;
-                       break;
-               case TEL_SIM_LOCK_FD :
-                       fac = "FD";
-                       if (flag == ENABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_FDN_ENABLE;
-                       else if (flag == DISABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_FDN_DISABLE;
-                       else
-                               *sec_op = IMC_SIM_CURR_SEC_OP_FDN_STATUS;
-                       break;
-               case TEL_SIM_LOCK_PN :
-                       fac = "PN";
-                       if (flag == ENABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_NET_ENABLE;
-                       else if (flag == DISABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_NET_DISABLE;
-                       else
-                               *sec_op = IMC_SIM_CURR_SEC_OP_NET_STATUS;
-                       break;
-               case TEL_SIM_LOCK_PU :
-                       fac = "PU";
-                       if (flag == ENABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_NS_ENABLE;
-                       else if (flag == DISABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_NS_DISABLE;
-                       else
-                               *sec_op = IMC_SIM_CURR_SEC_OP_NS_STATUS;
-                       break;
-               case TEL_SIM_LOCK_PP :
-                       fac = "PP";
-                       if (flag == ENABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_SP_ENABLE;
-                       else if (flag == DISABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_SP_DISABLE;
-                       else
-                               *sec_op = IMC_SIM_CURR_SEC_OP_SP_STATUS;
-                       break;
-               case TEL_SIM_LOCK_PC :
-                       fac = "PC";
-                       if (flag == ENABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_CP_ENABLE;
-                       else if (flag == DISABLE_FLAG)
-                               *sec_op = IMC_SIM_CURR_SEC_OP_CP_DISABLE;
-                       else
-                               *sec_op = IMC_SIM_CURR_SEC_OP_CP_STATUS;
-                       break;
-               default :
-                       err("Unhandled sim lock type [%d]", lock_type);
-       }
-       return fac;
-}
+       case SIM_STATUS_CARD_ERROR:
+               dbg("[SIM] SIM CARD ERROR");
+               tcore_sim_set_type(o, SIM_TYPE_UNKNOWN);
+               break;
 
-static int __imc_sim_get_lock_type(ImcSimCurrSecOp sec_op)
-{
-       switch(sec_op) {
-               case IMC_SIM_CURR_SEC_OP_SIM_DISABLE :
-               case IMC_SIM_CURR_SEC_OP_SIM_ENABLE :
-               case IMC_SIM_CURR_SEC_OP_SIM_STATUS :
-                       return TEL_SIM_LOCK_PS;
-               case IMC_SIM_CURR_SEC_OP_PIN1_DISABLE :
-               case IMC_SIM_CURR_SEC_OP_PIN1_ENABLE :
-               case IMC_SIM_CURR_SEC_OP_PIN1_STATUS :
-                       return TEL_SIM_LOCK_SC;
-               case IMC_SIM_CURR_SEC_OP_FDN_DISABLE :
-               case IMC_SIM_CURR_SEC_OP_FDN_ENABLE :
-               case IMC_SIM_CURR_SEC_OP_FDN_STATUS :
-                       return TEL_SIM_LOCK_FD;
-               case IMC_SIM_CURR_SEC_OP_NET_DISABLE :
-               case IMC_SIM_CURR_SEC_OP_NET_ENABLE :
-               case IMC_SIM_CURR_SEC_OP_NET_STATUS :
-                       return TEL_SIM_LOCK_PN;
-               case IMC_SIM_CURR_SEC_OP_NS_DISABLE :
-               case IMC_SIM_CURR_SEC_OP_NS_ENABLE :
-               case IMC_SIM_CURR_SEC_OP_NS_STATUS :
-                       return TEL_SIM_LOCK_PU;
-               case IMC_SIM_CURR_SEC_OP_SP_DISABLE :
-               case IMC_SIM_CURR_SEC_OP_SP_ENABLE :
-               case IMC_SIM_CURR_SEC_OP_SP_STATUS :
-                       return TEL_SIM_LOCK_PP;
-               case IMC_SIM_CURR_SEC_OP_CP_DISABLE :
-               case IMC_SIM_CURR_SEC_OP_CP_ENABLE :
-               case IMC_SIM_CURR_SEC_OP_CP_STATUS :
-                       return TEL_SIM_LOCK_PC ;
-               default :
-                       err("Invalid sec op [%d]", sec_op);
-                       return -1;
+       default:
+               dbg("SIM Status: [0x%02x]", sim_status);
+               break;
        }
-}
 
-/* Notifications */
-/*
- * Notification: +XSIM: <SIM state>
- *
- * Possible values of <SIM state> can be
- * 0   SIM not present
- * 1   PIN verification needed
- * 2   PIN verification not needed - Ready
- * 3   PIN verified - Ready
- * 4   PUK verification needed
- * 5   SIM permanently blocked
- * 6   SIM Error
- * 7   ready for attach (+COPS)
- * 8   SIM Technical Problem
- * 9   SIM Removed
- * 10  SIM Reactivating
- * 11  SIM Reactivated
- * 12  SIM SMS Caching Completed. (Sent only when SMS caching enabled)
- * 99  SIM State Unknown
- */
-static gboolean on_notification_imc_sim_status(CoreObject *co,
-       const void *event_info, void *user_data)
-{
-       GSList *lines = (GSList *)event_info;
-       const gchar *line;
+       _sim_status_update(o, sim_status);
 
-       dbg("SIM notification - SIM status: [+XSIM]");
+out:
+       tcore_at_tok_free(tokens);
 
-       if (g_slist_length(lines) != 1) {
-               err("+XSIM unsolicited message expected to be "
-                       "Single line but received multiple lines");
-               return TRUE;
-       }
+       dbg("Exit");
+       return TRUE;
+}
 
-       line = (const gchar *) (lines->data);
-       if (line != NULL) {
-               GSList *tokens;
-               guint sim_state;
+static void on_response_get_sim_status(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+       const TcoreATResponse *resp = data;
+       CoreObject *o = NULL;
 
-               /*
-                * Tokenize
-                *
-                * +XSIM: <SIM state>
-                */
-               tokens = tcore_at_tok_new(line);
-               if (g_slist_length(tokens) == 1) {
-                       /* <SIM state> */
-                       sim_state = atoi(g_slist_nth_data(tokens, 0));
+       dbg("Entry");
 
-                       /* Process SIM Status */
-                       __imc_sim_process_sim_status(co, sim_state);
-               } else {
-                       err("Invalid message");
-               }
+       o = tcore_pending_ref_core_object(p);
 
-               tcore_at_tok_free(tokens);
+       if (resp->success > 0) {
+               dbg("RESPONSE OK");
+               if (resp->lines)
+                       on_event_pin_status(o, resp->lines, NULL);
+       } else {
+               dbg("RESPONSE NOK");
        }
 
-       return TRUE;
+       dbg("Exit");
 }
 
-/* Hooks */
-static TcoreHookReturn on_hook_imc_modem_power(TcorePlugin *source,
-       TcoreNotification command, guint data_len, void *data, void *user_data)
+static enum tcore_hook_return on_hook_modem_power(Server *s, CoreObject *source, enum tcore_notification_command command,
+                                                                                         unsigned int data_len, void *data, void *user_data)
 {
-       CoreObject *co = (CoreObject *)user_data;
+       TcorePlugin *plugin = tcore_object_ref_plugin(source);
+       CoreObject *o = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_SIM);
 
-       tcore_check_return_value(co != NULL, TCORE_HOOK_RETURN_CONTINUE);
+       if (o == NULL)
+               return TCORE_HOOK_RETURN_CONTINUE;
 
        dbg("Get SIM status");
-       (void)__imc_sim_get_sim_status(co, NULL, NULL);
+
+       sim_prepare_and_send_pending_request(o, "AT+XSIMSTATE?", "+XSIMSTATE:", TCORE_AT_SINGLELINE, on_response_get_sim_status);
 
        return TCORE_HOOK_RETURN_CONTINUE;
 }
 
-/* Response Functions */
-static void on_response_imc_sim_req_authentication(TcorePending *p, guint data_len,
-                       const void *data, void *user_data)
+static void on_response_verify_pins(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *at_resp = data;
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       CoreObject *co_sim = NULL;
+       struct imc_sim_property *sp = NULL;
        GSList *tokens = NULL;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       TelSimAuthenticationResponse auth_resp = {0, };
-       TelSimResult sim_result = TEL_SIM_RESULT_FAILURE;
-       ImcRespCbData *resp_cb_data = user_data;
-       TelSimAuthenticationType *auth_type = (TelSimAuthenticationType *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
+       struct tresp_sim_verify_pins res;
+       const char *line;
+       int err;
 
        dbg("Entry");
 
-       if (NULL == at_resp) {
-               err("at_resp is NULL");
-               auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-               goto out;
+       co_sim = tcore_pending_ref_core_object(p);
+       sp = tcore_sim_ref_userdata(co_sim);
+       if (!sp) {
+               err("user data is null");
+               return;
        }
 
-       auth_resp.auth_type = *auth_type;
+       ur = tcore_pending_ref_user_request(p);
 
-       if (at_resp->success == TRUE) {
-               const char *line;
-               int status;
+       memset(&res, 0, sizeof(struct tresp_sim_verify_pins));
 
+       if (resp->success > 0) {
                dbg("RESPONSE OK");
-               if (at_resp->lines != NULL) {
-                       line = at_resp->lines->data;
-                       dbg("Received data: [%s]", line);
-               } else {
-                       err("at_resp->lines is NULL");
-                       auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                       goto out;
+               res.result = SIM_PIN_OPERATION_SUCCESS;
+
+               /* Get PIN facility */
+               res.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
+               if ((res.pin_type == SIM_PTYPE_PIN1)
+                               || (res.pin_type == SIM_PTYPE_SIM)) {
+                       if (tcore_sim_get_status(co_sim) != SIM_STATUS_INIT_COMPLETED) {
+                               /* Update SIM Status */
+                               _sim_status_update(co_sim, SIM_STATUS_INITIALIZING);
+                       }
                }
 
+               /* Send Response */
+               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                       sizeof(struct tresp_sim_verify_pins), &res);
+       } else {
+               dbg("RESPONSE NOK");
+               line = (const char *)resp->final_response;
                tokens = tcore_at_tok_new(line);
-               if (tokens == NULL) {
-                       err("tokens is NULL");
-                       auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                       goto out;
-               }
+               if (g_slist_length(tokens) < 1) {
+                       dbg("Unkown Error OR String corrupted");
+                       res.result = TCORE_RETURN_3GPP_ERROR;
 
-               status = atoi(g_slist_nth_data(tokens, 0));
-               switch (status) {
-               case 0:
-                       dbg("Authentications successful");
-                       auth_resp.detailed_result = TEL_SIM_AUTH_NO_ERROR;
-                       break;
-               case 1:
-                       err("Synchronize fail");
-                       auth_resp.detailed_result = TEL_SIM_AUTH_SYNCH_FAILURE;
-                       goto out;
-               case 2:
-                       err("MAC wrong");
-                       auth_resp.detailed_result = TEL_SIM_AUTH_MAK_CODE_FAILURE;
-                       goto out;
-               case 3:
-                       err("Does not support security context");
-                       auth_resp.detailed_result = TEL_SIM_AUTH_UNSUPPORTED_CONTEXT;
-                       goto out;
-               default:
-                       err("Other failure");
-                       auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                       goto out;
+                       /* Send Response */
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                               sizeof(struct tresp_sim_verify_pins), &res);
+               } else {
+                       err = atoi(g_slist_nth_data(tokens, 0));
+                       dbg("Error: [%d]", err);
+
+                       ur = tcore_user_request_ref(ur);
+
+                       /* Get retry count */
+                       _get_retry_count(co_sim, ur);
                }
 
-               if (auth_resp.auth_type == TEL_SIM_AUTH_GSM) {
-                       char *kc, *sres;
-                       char *convert_kc, *convert_sres;
+               /* Free tokens */
+               tcore_at_tok_free(tokens);
+       }
 
-                       kc = g_slist_nth_data(tokens, 1);
-                       if (kc != NULL) {
-                               guint convert_kc_len = 0;
-                               kc = tcore_at_tok_extract(kc);
-                               dbg("Kc: [%s]", kc);
+       dbg("Exit");
+}
 
-                               tcore_util_hexstring_to_bytes(kc, &convert_kc, &convert_kc_len);
-                               if (convert_kc_len && convert_kc_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
-                                       auth_resp.authentication_key_length = convert_kc_len;
-                                       memcpy(&auth_resp.authentication_key, convert_kc, convert_kc_len);
-                               } else {
-                                       err("Invalid Kc");
-                                       auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               }
-                               g_free(kc);
-                               g_free(convert_kc);
-                       } else {
-                               err("Invalid Kc");
-                               auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               goto out;
-                       }
+static void on_response_verify_puks(TcorePending *p, int data_len, const void *data, void *user_data)
+{
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       CoreObject *co_sim = NULL;
+       struct imc_sim_property *sp = NULL;
+       GSList *tokens = NULL;
+       struct tresp_sim_verify_puks res;
+       const char *line;
+       int err;
 
-                       sres = g_slist_nth_data(tokens, 2);
-                       if (sres != NULL) {
-                               guint convert_sres_len = 0;
-                               sres = tcore_at_tok_extract(sres);
-                               dbg("SRES: [%s]", sres);
+       dbg("Entry");
 
-                               tcore_util_hexstring_to_bytes(sres, &convert_sres, &convert_sres_len);
-                               if (convert_sres_len && convert_sres_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
-                                       auth_resp.resp_length = convert_sres_len;
-                                       memcpy(&auth_resp.resp_data, convert_sres, convert_sres_len);
-                               } else {
-                                       err("Invalid SRES");
-                                       auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               }
-                               g_free(sres);
-                               g_free(convert_sres);
-                       } else {
-                               err("Invalid SRES");
-                               auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               goto out;
-                       }
-               } else if (auth_resp.auth_type == TEL_SIM_AUTH_3G_CTX) {
-                       char *res, *ck, *ik, *kc;
-                       char *convert_res, *convert_ck;
-                       char *convert_ik, *convert_kc;
-
-                       res = g_slist_nth_data(tokens, 1);
-                       if (res != NULL) {
-                               guint convert_res_len = 0;
-                               res = tcore_at_tok_extract(res);
-                               dbg("RES/AUTS: [%s]", res);
-
-                               tcore_util_hexstring_to_bytes(res, &convert_res, &convert_res_len);
-                               if (convert_res_len && convert_res_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
-                                       auth_resp.resp_length = convert_res_len;
-                                       memcpy(auth_resp.resp_data, convert_res, convert_res_len);
-                               } else {
-                                       err("Invalid RES/AUTS");
-                                       auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               }
-                               g_free(res);
-                               g_free(convert_res);
-                       } else {
-                               err("Invalid RES/AUTS");
-                               auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               goto out;
-                       }
+       co_sim = tcore_pending_ref_core_object(p);
+       sp = tcore_sim_ref_userdata(co_sim);
+       if (!sp) {
+               err("user data is null");
+               return;
+       }
 
-                       ck = g_slist_nth_data(tokens, 2);
-                       if (ck != NULL) {
-                               guint convert_ck_len = 0;
-                               ck = tcore_at_tok_extract(ck);
-                               dbg("CK: [%s]", ck);
+       ur = tcore_pending_ref_user_request(p);
 
-                               tcore_util_hexstring_to_bytes(ck, &convert_ck, &convert_ck_len);
-                               if (convert_ck_len && convert_ck_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
-                                       auth_resp.cipher_length = convert_ck_len;
-                                       memcpy(&auth_resp.cipher_data, convert_ck, convert_ck_len);
-                               } else {
-                                       err("Invalid CK");
-                                       auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               }
-                               g_free(ck);
-                               g_free(convert_ck);
-                       } else {
-                               err("Invalid CK");
-                               auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               goto out;
-                       }
+       memset(&res, 0, sizeof(struct tresp_sim_verify_pins));
 
-                       ik = g_slist_nth_data(tokens, 3);
-                       if (ik != NULL) {
-                               guint convert_ik_len = 0;
-                               ik = tcore_at_tok_extract(ik);
-                               dbg("IK: [%s]", ik);
+       if (resp->success > 0) {
+               dbg("RESPONSE OK");
+               res.result = SIM_PIN_OPERATION_SUCCESS;
+               res.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
 
-                               tcore_util_hexstring_to_bytes(ik, &convert_ik, &convert_ik_len);
-                               if (convert_ik_len && convert_ik_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
-                                       auth_resp.integrity_length = convert_ik_len;
-                                       memcpy(&auth_resp.integrity_data, convert_ik, convert_ik_len);
-                               } else {
-                                       err("Invalid IK");
-                                       auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               }
-                               g_free(ik);
-                               g_free(convert_ik);
-                       } else {
-                               err("Invalid IK");
-                               auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               goto out;
-                       }
+               /* Send Response */
+               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                       sizeof(struct tresp_sim_verify_pins), &res);
+       } else {
+               dbg("RESPONSE NOK");
+               line = (const char *)resp->final_response;
+               tokens = tcore_at_tok_new(line);
 
-                       kc = g_slist_nth_data(tokens, 4);
-                       if (kc != NULL) {
-                               guint convert_kc_len = 0;
-                               kc = tcore_at_tok_extract(kc);
-                               dbg("Kc: [%s]", kc);
+               if (g_slist_length(tokens) < 1) {
+                       dbg("Unkown Error OR String corrupted");
+                       res.result = TCORE_RETURN_3GPP_ERROR;
 
-                               tcore_util_hexstring_to_bytes(kc, &convert_kc, &convert_kc_len);
-                               if (convert_kc_len && convert_kc_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
-                                       auth_resp.authentication_key_length = convert_kc_len;
-                                       memcpy(&auth_resp.authentication_key, convert_kc, convert_kc_len);
-                               } else {
-                                       err("Invalid Kc");
-                                       auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               }
-                               g_free(kc);
-                               g_free(convert_kc);
-                       } else {
-                               err("Invalid Kc");
-                               auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                               goto out;
-                       }
+                       /* Send Response */
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                       sizeof(struct tresp_sim_verify_pins), &res);
                } else {
-                       err("Not supported");
-                       auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
-                       goto out;
+                       err = atoi(g_slist_nth_data(tokens, 0));
+                       dbg("Error: [%d]", err);
+                       ur = tcore_user_request_ref(ur);
+                       _get_retry_count(co_sim, ur);
                }
-               sim_result = TEL_SIM_RESULT_SUCCESS;
-       } else {
-               err("RESPONSE NOK");
-               auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
+               tcore_at_tok_free(tokens);
        }
-
-out:
-       if(resp_cb_data->cb)
-               resp_cb_data->cb(co, (gint)sim_result, &auth_resp, resp_cb_data->cb_data);
-
-       tcore_at_tok_free(tokens);
+       dbg("Exit");
 }
 
-static void on_response_imc_sim_verify_pins(TcorePending *p, guint data_len,
-               const void *data, void *user_data)
+static void on_response_change_pins(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *at_resp = data;
-       ImcRespCbData *resp_cb_data = user_data;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       TelSimResult result = TEL_SIM_RESULT_FAILURE;
-       ImcSimCurrSecOp *sec_op = NULL;
-       TelSimSecPinResult verify_pin_resp = {0, };
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       CoreObject *co_sim = NULL;
+       struct imc_sim_property *sp = NULL;
+       GSList *tokens = NULL;
+       struct tresp_sim_change_pins res;
+       const char *line;
+       int err;
 
        dbg("Entry");
 
-       tcore_check_return_assert(co != NULL);
-       tcore_check_return_assert(resp_cb_data != NULL);
+       co_sim = tcore_pending_ref_core_object(p);
+       sp = tcore_sim_ref_userdata(co_sim);
+       if (!sp) {
+               err("user data is null");
+               return;
+       }
 
-       sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
+       ur = tcore_pending_ref_user_request(p);
 
-       if (at_resp && at_resp->success) {
-               dbg("Sim Verify Pin Response- [OK]");
+       memset(&res, 0, sizeof(struct tresp_sim_change_pins));
 
-               result = TEL_SIM_RESULT_SUCCESS;
+       if (resp->success > 0) {
+               dbg("RESPONSE OK");
+               res.result = SIM_PIN_OPERATION_SUCCESS;
+               res.pin_type = _sim_get_current_pin_facility(sp->current_sec_op);
 
-               if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN1_VERIFY) {
-                       TelSimCardStatus status;
+               /* Send Response */
+               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                       sizeof(struct tresp_sim_change_pins), &res);
+       } else {
+               dbg("RESPONSE NOK");
+               line = (const char *)resp->final_response;
+               tokens = tcore_at_tok_new(line);
 
-                       verify_pin_resp.pin_type = TEL_SIM_PIN_TYPE_PIN1;
+               if (g_slist_length(tokens) < 1) {
+                       dbg("Unkown Error OR String corrupted");
+                       res.result = TCORE_RETURN_3GPP_ERROR;
 
-                       tcore_sim_get_status(co, &status);
-                       if (status != TEL_SIM_STATUS_SIM_INIT_COMPLETED) {
-                               /*Update sim status*/
-                               __imc_sim_update_sim_status(co,
-                                       TEL_SIM_STATUS_SIM_INITIALIZING);
-                       }
-               } else if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN2_VERIFY) {
-                       verify_pin_resp.pin_type = TEL_SIM_PIN_TYPE_PIN2;
+                       /* Send Response */
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                       sizeof(struct tresp_sim_change_pins), &res);
+               } else {
+                       err = atoi(g_slist_nth_data(tokens, 0));
+                       dbg("Error: [%d]", err);
+                       ur = tcore_user_request_ref(ur);
+                       _get_retry_count(co_sim, ur);
                }
 
-               /*Invoke callback*/
-               if(resp_cb_data->cb)
-                       resp_cb_data->cb(co, (gint)result,
-                                       &verify_pin_resp,
-                                       resp_cb_data->cb_data);
-               imc_destroy_resp_cb_data(resp_cb_data);
-       } else {
-               err("Sim Verify Pin Response- [NOK]");
-               /* Get retry count */
-               __imc_sim_get_retry_count(co, resp_cb_data);
+               /* Free tokens */
+               tcore_at_tok_free(tokens);
        }
+       dbg("Exit");
 }
 
-static void on_response_imc_sim_verify_puks(TcorePending *p, guint data_len,
-               const void *data, void *user_data)
+static void on_response_get_facility_status(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *at_resp = data;
-       ImcRespCbData *resp_cb_data = user_data;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       TelSimResult result = TEL_SIM_RESULT_FAILURE;
-       ImcSimCurrSecOp *sec_op = NULL;
-       TelSimSecPukResult verify_puk_resp = {0, };
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       GSList *tokens = NULL;
+       struct tresp_sim_get_facility_status *res = user_data;
+       const char *line;
 
        dbg("Entry");
 
-       tcore_check_return_assert(co != NULL);
-       tcore_check_return_assert(resp_cb_data != NULL);
-
-       sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
+       ur = tcore_pending_ref_user_request(p);
 
-       if (at_resp && at_resp->success) {
-               dbg("Sim Verify Puk Response- [OK]");
+       res->result = SIM_PIN_OPERATION_SUCCESS;
 
-               result = TEL_SIM_RESULT_SUCCESS;
-
-               if (*sec_op == IMC_SIM_CURR_SEC_OP_PUK1_VERIFY) {
-                       verify_puk_resp.puk_type = TEL_SIM_PUK_TYPE_PUK1;
-               } else if (*sec_op == IMC_SIM_CURR_SEC_OP_PUK2_VERIFY) {
-                       verify_puk_resp.puk_type = TEL_SIM_PUK_TYPE_PUK2;
+       if (resp->success > 0) {
+               dbg("RESPONSE OK");
+               if (resp->lines) {
+                       line = (const char *)resp->lines->data;
+                       tokens = tcore_at_tok_new(line);
+                       if (g_slist_length(tokens) != 1) {
+                               msg("Invalid message");
+                               tcore_at_tok_free(tokens);
+                               return;
+                       }
                }
-               /*Invoke callback*/
-               if(resp_cb_data->cb)
-                       resp_cb_data->cb(co, (gint)result,
-                                       &verify_puk_resp,
-                                       resp_cb_data->cb_data);
-               imc_destroy_resp_cb_data(resp_cb_data);
+               res->b_enable = atoi(g_slist_nth_data(tokens, 0));
        } else {
-               err("Sim Verify Puk Response- [NOK]");
-               /* Get retry count */
-               __imc_sim_get_retry_count(co, resp_cb_data);
+               dbg("RESPONSE NOK");
+               res->result = SIM_INCOMPATIBLE_PIN_OPERATION;
+       }
+
+       /* Send Response */
+       if (ur) {
+               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                               sizeof(struct tresp_sim_get_facility_status), res);
        }
+       tcore_at_tok_free(tokens);
+       g_free(res);
+       dbg("Exit");
 }
 
-static void on_response_imc_sim_change_pins(TcorePending *p, guint data_len,
-               const void *data, void *user_data)
+static void on_response_enable_facility(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *at_resp = data;
-       ImcRespCbData *resp_cb_data = user_data;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       TelSimResult result = TEL_SIM_RESULT_FAILURE;
-       ImcSimCurrSecOp *sec_op = NULL;
-       TelSimSecPinResult change_pin_resp = {0, };
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       CoreObject *co_sim = NULL;
+       struct imc_sim_property *sp = NULL;
+       GSList *tokens = NULL;
+       struct tresp_sim_enable_facility res;
+       const char *line;
 
        dbg("Entry");
 
-       tcore_check_return_assert(co != NULL);
-       tcore_check_return_assert(resp_cb_data != NULL);
+       co_sim = tcore_pending_ref_core_object(p);
+       sp = tcore_sim_ref_userdata(co_sim);
+       if (!sp) {
+               err("user data is null");
+               return;
+       }
+
+       ur = tcore_pending_ref_user_request(p);
+
+       memset(&res, 0, sizeof(struct tresp_sim_enable_facility));
+
+       res.result = SIM_CARD_ERROR;
+       res.type = _sim_get_current_pin_facility(sp->current_sec_op);
 
-       sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
+       if (resp->success > 0) {
+               dbg("RESPONSE OK");
+               if (resp->lines) {
+                       line = (const char *)resp->lines->data;
+                       tokens = tcore_at_tok_new(line);
+                       if (g_slist_length(tokens) != 1) {
+                               msg("Invalid message");
 
-       if (at_resp && at_resp->success) {
-               dbg("Sim Change Pin Response- [OK]");
+                               /* Send Response */
+                               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                        sizeof(struct tresp_sim_enable_facility), &res);
+                               tcore_at_tok_free(tokens);
+                               return;
+                       }
+               }
 
-               result = TEL_SIM_RESULT_SUCCESS;
+               res.result = SIM_PIN_OPERATION_SUCCESS;
 
-               if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN1_CHANGE) {
-                       change_pin_resp.pin_type = TEL_SIM_PIN_TYPE_PIN1;
-               } else if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN2_CHANGE) {
-                       change_pin_resp.pin_type = TEL_SIM_PIN_TYPE_PIN2;
+               /* Send Response */
+               if (ur) {
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                sizeof(struct tresp_sim_enable_facility), &res);
                }
-               /*Invoke callback*/
-               if(resp_cb_data->cb)
-                       resp_cb_data->cb(co, (gint)result,
-                                       &change_pin_resp,
-                                       resp_cb_data->cb_data);
-               imc_destroy_resp_cb_data(resp_cb_data);
+
+               /* Free tokens */
+               tcore_at_tok_free(tokens);
        } else {
-               err("Sim Change Pin Response- [NOK]");
-               /* Get retry count */
-               __imc_sim_get_retry_count(co, resp_cb_data);
+               dbg("RESPONSE NOK");
+               ur = tcore_user_request_ref(ur);
+               _get_retry_count(co_sim, ur);
        }
+       dbg("Exit");
 }
 
-static void on_response_imc_sim_disable_facility(TcorePending *p, guint data_len,
-               const void *data, void *user_data)
+static void on_response_disable_facility(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *at_resp = data;
-       ImcRespCbData *resp_cb_data = user_data;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       TelSimResult result = TEL_SIM_RESULT_FAILURE;
-       ImcSimCurrSecOp *sec_op = NULL;
-       TelSimFacilityResult disable_facility_resp = {0, };
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       CoreObject *co_sim = NULL;
+       struct imc_sim_property *sp = NULL;
+       GSList *tokens = NULL;
+       struct tresp_sim_disable_facility res;
+       const char *line;
 
        dbg("Entry");
 
-       tcore_check_return_assert(co != NULL);
-       tcore_check_return_assert(resp_cb_data != NULL);
+       co_sim = tcore_pending_ref_core_object(p);
+       sp = tcore_sim_ref_userdata(co_sim);
+       if (!sp) {
+               err("user data is null");
+               return;
+       }
+
+       ur = tcore_pending_ref_user_request(p);
 
-       sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
+       memset(&res, 0, sizeof(struct tresp_sim_disable_facility));
 
-       if (at_resp && at_resp->success) {
-               int lock_type;
-               dbg("Sim Disable Facility Response- [OK]");
+       res.result = SIM_CARD_ERROR;
+       res.type = _sim_get_current_pin_facility(sp->current_sec_op);
 
-               lock_type = __imc_sim_get_lock_type(*sec_op);
-               if (lock_type == -1) {
-                       result = TEL_SIM_RESULT_INVALID_PARAMETER;
+       if (resp->success > 0) {
+               dbg("RESPONSE OK");
+               if (resp->lines) {
+                       line = (const char *)resp->lines->data;
+                       tokens = tcore_at_tok_new(line);
+                       if (g_slist_length(tokens) != 1) {
+                               msg("Invalid message");
 
-                       /*Invoke callback*/
-                       if(resp_cb_data->cb)
-                               resp_cb_data->cb(co, (gint)result,
-                                               NULL,
-                                               resp_cb_data->cb_data);
-                       imc_destroy_resp_cb_data(resp_cb_data);
-                       return;
+                               /* Send Response */
+                               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                               sizeof(struct tresp_sim_disable_facility), &res);
+                               tcore_at_tok_free(tokens);
+                               return;
+                       }
                }
 
-               disable_facility_resp.type = lock_type;
-               result = TEL_SIM_RESULT_SUCCESS;
+               res.result = SIM_PIN_OPERATION_SUCCESS;
+               /* Send Response */
+               if (ur)
+                       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                                       sizeof(struct tresp_sim_disable_facility), &res);
 
-               /*Invoke callback*/
-               if(resp_cb_data->cb)
-                       resp_cb_data->cb(co, (gint)result,
-                                       &disable_facility_resp,
-                                       resp_cb_data->cb_data);
-               imc_destroy_resp_cb_data(resp_cb_data);
+               /* Free tokens */
+               tcore_at_tok_free(tokens);
        } else {
-               err("Sim Disable Facility Response- [NOK]");
-               /* Get retry count */
-               __imc_sim_get_retry_count(co, resp_cb_data);
+               dbg("RESPONSE NOK");
+               ur = tcore_user_request_ref(ur);
+               _get_retry_count(co_sim, ur);
        }
+       dbg("Exit");
 }
 
-static void on_response_imc_sim_enable_facility(TcorePending *p, guint data_len,
-               const void *data, void *user_data)
+static void on_response_get_lock_info(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *at_resp = data;
-       ImcRespCbData *resp_cb_data = user_data;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       TelSimResult result = TEL_SIM_RESULT_FAILURE;
-       ImcSimCurrSecOp *sec_op = NULL;
-       TelSimFacilityResult enable_facility_resp = {0, };
+       const TcoreATResponse *response = (TcoreATResponse *)data;
+       UserRequest *ur = NULL;
+       GSList *tokens = NULL;
+       struct treq_sim_get_lock_info *req_data = NULL;
+       struct tresp_sim_get_lock_info resp;
+       const char *line;
+       int pin1_attempts_left = 0;
+       int puk1_attempts_left = 0;
+       int pin2_attempts_left = 0;
+       int puk2_attempts_left = 0;
+       int length_tokens = 0;
 
        dbg("Entry");
 
-       tcore_check_return_assert(co != NULL);
-       tcore_check_return_assert(resp_cb_data != NULL);
+       memset(&resp, 0x00, sizeof(struct tresp_sim_get_lock_info));
 
-       sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
+       ur = tcore_pending_ref_user_request(p);
 
-       if (at_resp && at_resp->success) {
-               int lock_type;
-               dbg("Sim Enable Facility Response- [OK]");
-
-               lock_type = __imc_sim_get_lock_type(*sec_op);
-               if (lock_type == -1) {
-                       result = TEL_SIM_RESULT_INVALID_PARAMETER;
+       if (!ur || !response) {
+               err("NULL data : ur[%p], response[%p]", ur, response);
+               resp.result = SIM_CARD_ERROR;
+               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                               sizeof(struct tresp_sim_get_lock_info), &resp);
+               return;
+       }
 
-                       /*Invoke callback*/
-                       if(resp_cb_data->cb)
-                               resp_cb_data->cb(co, (gint)result,
-                                               NULL,
-                                               resp_cb_data->cb_data);
-                       imc_destroy_resp_cb_data(resp_cb_data);
-                       return;
-               }
+       req_data = (struct treq_sim_get_lock_info *) tcore_user_request_ref_data(ur, 0);
 
-               enable_facility_resp.type = lock_type;
-               result = TEL_SIM_RESULT_SUCCESS;
+       resp.result = SIM_PIN_OPERATION_SUCCESS;
+       resp.type = req_data->type;
 
-               /*Invoke callback*/
-               if(resp_cb_data->cb)
-                       resp_cb_data->cb(co, (gint)result,
-                                       &enable_facility_resp,
-                                       resp_cb_data->cb_data);
-               imc_destroy_resp_cb_data(resp_cb_data);
-       } else {
-               err("Sim Enable Facility Response- [NOK]");
-               /* Get retry count */
-               __imc_sim_get_retry_count(co, resp_cb_data);
-       }
-}
+       if (response->success > 0) {
+               dbg("RESPONSE OK");
+               if (response->lines) {
+                       line = (const char *)response->lines->data;
+                       tokens = tcore_at_tok_new(line);
+                       length_tokens = g_slist_length(tokens);
+                       dbg("No of Tokens [%d]", length_tokens);
+                       switch (length_tokens) {
+                       case 4:
+                               puk2_attempts_left = atoi(g_slist_nth_data(tokens, 3));
+                       case 3:
+                               puk1_attempts_left = atoi(g_slist_nth_data(tokens, 2));
+                       case 2:
+                               pin2_attempts_left = atoi(g_slist_nth_data(tokens, 1));
+                       case 1:
+                               pin1_attempts_left = atoi(g_slist_nth_data(tokens, 0));
+                       break;
 
-static void on_response_imc_sim_get_facility(TcorePending *p, guint data_len,
-               const void *data, void *user_data)
-{
-       const TcoreAtResponse *at_resp = data;
-       ImcRespCbData *resp_cb_data = user_data;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       TelSimResult result = TEL_SIM_RESULT_FAILURE;
-       ImcSimCurrSecOp *sec_op = NULL;
-       TelSimFacilityInfo get_facility_resp = {0, };
+                       default:
+                               err("Invalid response");
+                               tcore_at_tok_free(tokens);
+                               resp.result = SIM_CARD_ERROR;
+                               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                               sizeof(struct tresp_sim_get_lock_info), &resp);
+                               return;
+                       }
 
-       dbg("Entry");
 
-       tcore_check_return_assert(co != NULL);
-       tcore_check_return_assert(resp_cb_data != NULL);
+                       dbg("PIN1 attempts = %d, PUK1 attempts = %d",
+                                               pin1_attempts_left, puk1_attempts_left);
+                       dbg("PIN2 attempts = %d, PUK2 attempts = %d",
+                                               pin2_attempts_left, puk2_attempts_left);
 
-       sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
+                       resp.lock_status = SIM_LOCK_STATUS_UNLOCKED;
 
-       if (at_resp && at_resp->success) {
-               GSList *tokens = NULL;
-               const char *line;
-               int lock_type;
+                       switch (resp.type) {
+                       case SIM_FACILITY_SC:
+                               resp.retry_count = pin1_attempts_left;
+                               if (pin1_attempts_left > 0 && pin1_attempts_left < SIM_PIN_MAX_RETRY_COUNT) {
+                                       resp.lock_status = SIM_LOCK_STATUS_PIN;
+                               } else if (pin1_attempts_left == 0) {
+                                       if (puk1_attempts_left) {
+                                               resp.lock_status = SIM_LOCK_STATUS_PUK;
+                                               resp.retry_count = puk1_attempts_left;
+                                       } else {
+                                               resp.lock_status = SIM_LOCK_STATUS_PERM_BLOCKED;
+                                       }
+                               }
+                       break;
 
-               dbg("Sim Get Facility Response- [OK]");
+                       case SIM_FACILITY_FD:
+                               resp.retry_count = pin2_attempts_left;
+                               if (pin2_attempts_left > 0 && pin2_attempts_left < SIM_PIN_MAX_RETRY_COUNT) {
+                                       resp.lock_status = SIM_LOCK_STATUS_PIN2;
+                               } else if (pin2_attempts_left == 0) {
+                                       if (puk2_attempts_left) {
+                                               resp.lock_status = SIM_LOCK_STATUS_PUK2;
+                                               resp.retry_count = puk2_attempts_left;
+                                       } else {
+                                               resp.lock_status = SIM_LOCK_STATUS_PERM_BLOCKED;
+                                       }
+                               }
+                       break;
 
-               lock_type = __imc_sim_get_lock_type(*sec_op);
-               if (lock_type == -1) {
-                       result = TEL_SIM_RESULT_INVALID_PARAMETER;
-                       goto EXIT;
-               }
-               if (at_resp->lines) {
-                       line = (const char *)at_resp->lines->data;
-                       tokens = tcore_at_tok_new(line);
-                       if (g_slist_length(tokens) != 1) {
-                               err("Invalid message");
-                               tcore_at_tok_free(tokens);
-                               goto EXIT;
+                       default:
+                               err("Unhandled facility type : [%d]", resp.type);
+                       break;
                        }
-                       get_facility_resp.f_status = atoi(g_slist_nth_data(tokens, 0));
-                       get_facility_resp.type = lock_type;
-                       result = TEL_SIM_RESULT_SUCCESS;
+                       dbg("Lock type : [%d], Lock status : [%d]", resp.type, resp.lock_status);
+                       tcore_at_tok_free(tokens);
                }
-
-               tcore_at_tok_free(tokens);
        } else {
-               err("Sim Get Facility Response- [NOK]");
+               err("RESPONSE NOK");
+               resp.result = SIM_INCOMPATIBLE_PIN_OPERATION;
        }
-EXIT:
-       /* Invoke callback */
-       if(resp_cb_data->cb)
-               resp_cb_data->cb(co, (gint)result, &get_facility_resp, resp_cb_data->cb_data);
-       imc_destroy_resp_cb_data(resp_cb_data);
+
+       /* Send Response */
+       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                       sizeof(struct tresp_sim_get_lock_info), &resp);
 }
 
-static void on_response_imc_sim_get_lock_info(TcorePending *p, guint data_len,
-               const void *data, void *user_data)
+void on_response_update_file(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *at_resp = data;
-       ImcRespCbData *resp_cb_data = user_data;
-       CoreObject *co = tcore_pending_ref_core_object(p);
-       TelSimResult result = TEL_SIM_RESULT_FAILURE;
-       TelSimLockInfo get_lock_info_resp = {0, };
-
+       UserRequest *ur = NULL;
+       GSList *tokens = NULL;
+       const char *line = NULL;
+       const TcoreATResponse *response = (TcoreATResponse *)data;
+       CoreObject *co_sim = NULL;
+       struct imc_sim_property *meta_info = NULL;
+       struct tresp_sim_set_data resp;
+       int sw1 = 0;
+       int sw2 = 0;
+       gboolean cphs_sim = FALSE;
+       enum tcore_request_command command;
        dbg("Entry");
 
-       tcore_check_return_assert(co != NULL);
-       tcore_check_return_assert(resp_cb_data != NULL);
+       memset(&resp, 0x00, sizeof(struct tresp_sim_set_data));
 
-       if(at_resp && at_resp->success) {
-               GSList *tokens = NULL;
-               const char *line;
-               int lock_type = 0;
-               int attempts_left = 0;
-               int time_penalty = 0;
+       ur = tcore_pending_ref_user_request(p);
+       command = tcore_user_request_get_command(ur);
+       co_sim = tcore_pending_ref_core_object(p);
+       cphs_sim = tcore_sim_get_cphs_status(co_sim);
+       meta_info = (struct imc_sim_property *)tcore_user_request_ref_metainfo(ur, NULL);
 
-               dbg("Sim Get Lock Info Response- [OK]");
+       if (!ur || !co_sim || !meta_info || !response) {
+               err("NULL data : ur[%p], cp_sim[%p], sp[%p], response[%p]", ur, co_sim, meta_info, response);
+               resp.result = SIM_CARD_ERROR;
+               goto EXIT;
+       } else {
+               if (response->success > 0) {
+                       dbg("RESPONSE OK");
+                       if (response->lines) {
+                               line = (const char *)response->lines->data;
+                               tokens = tcore_at_tok_new(line);
+                               if (g_slist_length(tokens) < 2) {
+                                       err("Invalid response");
+                                       resp.result = SIM_CARD_ERROR;
+                               } else {
+                                       sw1 = atoi(g_slist_nth_data(tokens, 0));
+                                       sw2 = atoi(g_slist_nth_data(tokens, 1));
 
-               if (at_resp->lines) {
-                       line = (const char *)at_resp->lines->data;
-                       tokens = tcore_at_tok_new(line);
-                       if (g_slist_length(tokens) < 3) {
-                               err("Invalid message");
+                                       if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91)
+                                               resp.result = SIM_ACCESS_SUCCESS;
+                                       else
+                                               resp.result = _decode_status_word(sw1, sw2);
+                               }
                                tcore_at_tok_free(tokens);
-                               goto EXIT;
                        }
+               } else {
+                       err("RESPONSE NOK");
+                       resp.result = SIM_ACCESS_FAILED;
+               }
+       }
+
+       if (cphs_sim == FALSE) {
+               switch (command) {
+               case TREQ_SIM_SET_MAILBOX:
+                       if (meta_info->file_id == SIM_EF_USIM_MBI) {
+                               if (resp.result == SIM_ACCESS_SUCCESS) {
+                                       ur = tcore_user_request_ref(ur);
+                                       _get_file_info(co_sim, ur, SIM_EF_MBDN);
+                               } else {
+                                       dbg("EF-MBI update failed. but try to update EF-MBDN continuously.");
+                                       memset(meta_info, 0x00, sizeof(struct imc_sim_property));
+                                       ur = tcore_user_request_ref(ur);
+                                       _get_file_info(co_sim, ur, SIM_EF_MBDN);
+                               }
+                               return;
+                       }
+                       break;
+               default:
+                       break;
+               }
+       } else {
+               switch (command) {
+               case TREQ_SIM_SET_MAILBOX:
+                       if (meta_info->file_id != SIM_EF_CPHS_MAILBOX_NUMBERS) {
+                               _get_file_info(co_sim, ur, SIM_EF_CPHS_MAILBOX_NUMBERS);
+                               return;
+                       }
+               break;
 
-                       lock_type = atoi(g_slist_nth_data(tokens, 0));
-                       attempts_left = atoi(g_slist_nth_data(tokens, 1));
-                       time_penalty = atoi(g_slist_nth_data(tokens, 2));
+               case TREQ_SIM_SET_CALLFORWARDING:
+                       if (meta_info->file_id != SIM_EF_CPHS_CALL_FORWARD_FLAGS) {
+                               _get_file_info(co_sim, ur, SIM_EF_CPHS_CALL_FORWARD_FLAGS);
+                               return;
+                       }
+               break;
 
-                       dbg("lock_type = %d, attempts_left = %d, time_penalty = %d",
-                               lock_type, attempts_left, time_penalty);
+               case TREQ_SIM_SET_MESSAGEWAITING:
+                       if (meta_info->file_id != SIM_EF_CPHS_VOICE_MSG_WAITING) {
+                               _get_file_info(co_sim, ur, SIM_EF_CPHS_VOICE_MSG_WAITING);
+                               return;
+                       }
+               break;
 
-                       get_lock_info_resp.lock_type = __imc_sim_lock_type(lock_type);
-                       get_lock_info_resp.retry_count = attempts_left;
-                       result = TEL_SIM_RESULT_SUCCESS;
+               default:
+               break;
                }
-               tcore_at_tok_free(tokens);
-       } else {
-               err("Sim Get Lock Info Response- [NOK]");
        }
+
 EXIT:
-       /* Invoke callback */
-       if(resp_cb_data->cb)
-               resp_cb_data->cb(co, (gint)result, &get_lock_info_resp, resp_cb_data->cb_data);
-       imc_destroy_resp_cb_data(resp_cb_data);
+       /* Send Response */
+       tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                       sizeof(struct tresp_sim_set_data), &resp);
 }
 
-static void on_response_imc_sim_req_apdu (TcorePending *p, guint data_len, const void *data, void *user_data)
+static void on_response_transmit_apdu(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *resp = data;
-       CoreObject *co = NULL;
-       TelSimApduResp apdu_resp = {0,};
-       TelSimResult sim_result = TEL_SIM_RESULT_FAILURE;
-       GSList *tokens = NULL;
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
+       struct tresp_sim_transmit_apdu res;
        const char *line;
-       ImcRespCbData *resp_cb_data = (ImcRespCbData *) user_data;
 
        dbg("Entry");
 
-       co = tcore_pending_ref_core_object(p);
+       ur = tcore_pending_ref_user_request(p);
+
+       memset(&res, 0, sizeof(struct tresp_sim_transmit_apdu));
+       res.result = SIM_ACCESS_FAILED;
 
        if (resp->success > 0) {
                dbg("RESPONSE OK");
                if (resp->lines) {
+                       GSList *tokens = NULL;
                        char *tmp = NULL;
                        char *decoded_data = NULL;
-                       guint decoded_data_len = 0;
                        line = (const char *)resp->lines->data;
                        tokens = tcore_at_tok_new(line);
                        if (g_slist_length(tokens) != 2) {
-                               err("Invalid message");
+                               msg("Invalid message");
+                               tcore_at_tok_free(tokens);
+                               res.result = SIM_CARD_ERROR;
                                goto OUT;
                        }
 
                        tmp = tcore_at_tok_extract(g_slist_nth_data(tokens, 1));
-                       tcore_util_hexstring_to_bytes(tmp, &decoded_data, &decoded_data_len);
-
-                       apdu_resp.apdu_resp_len = decoded_data_len;
-                       memcpy((char *)apdu_resp.apdu_resp, decoded_data, decoded_data_len);
-                       g_free(tmp);
-                       g_free(decoded_data);
-                       sim_result = TEL_SIM_RESULT_SUCCESS;
+                       if (tmp) {
+                               decoded_data = util_hexStringToBytes(tmp);
+                               if (decoded_data) {
+                                       res.apdu_resp_length = strlen(tmp) / 2;
+                                       res.apdu_resp = g_malloc0(res.apdu_resp_length + 1);
+                                       if (res.apdu_resp == NULL) {
+                                               err("Memory allocation failed!!");
+                                               tcore_at_tok_free(tokens);
+                                               g_free(tmp);
+                                               g_free(decoded_data);
+                                               goto OUT;
+                                       }
+                                       memcpy((char *)res.apdu_resp, decoded_data, res.apdu_resp_length);
+                                       g_free(tmp);
+                                       g_free(decoded_data);
+                                       res.result = SIM_ACCESS_SUCCESS;
+                                       tcore_at_tok_free(tokens);
+                               } else {
+                                       err("util_hexStringToBytes Failed!!");
+                                       g_free(tmp);
+                               }
+                       }
                }
        } else {
-               err("RESPONSE NOK");
+               dbg("RESPONSE NOK");
        }
 
 OUT:
        /* Send Response */
-       if (resp_cb_data->cb)
-               resp_cb_data->cb(co, (gint)sim_result, &apdu_resp, resp_cb_data->cb_data);
-       tcore_at_tok_free(tokens);
+       if (ur) {
+               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                       sizeof(struct tresp_sim_transmit_apdu), &res);
+       }
        dbg("Exit");
 }
 
-static void on_response_imc_sim_req_atr(TcorePending *p, guint data_len, const void *data, void *user_data)
+static void on_response_get_atr(TcorePending *p, int data_len, const void *data, void *user_data)
 {
-       const TcoreAtResponse *resp = data;
-       CoreObject *co = NULL;
-       TelSimAtr atr_res = {0,};
-       TelSimResult sim_result = TEL_SIM_RESULT_FAILURE;
+       const TcoreATResponse *resp = data;
+       UserRequest *ur = NULL;
        GSList *tokens = NULL;
+       struct tresp_sim_get_atr res;
        const char *line;
-       ImcRespCbData *resp_cb_data = (ImcRespCbData *) user_data;
 
        dbg("Entry");
 
-       co = tcore_pending_ref_core_object(p);
+       memset(&res, 0, sizeof(struct tresp_sim_get_atr));
+       ur = tcore_pending_ref_user_request(p);
 
+       res.result = SIM_ACCESS_FAILED;
        if (resp->success > 0) {
                dbg("RESPONSE OK");
                if (resp->lines) {
                        char *tmp = NULL;
                        char *decoded_data = NULL;
-                       guint decoded_data_len = 0;
                        line = (const char *)resp->lines->data;
                        tokens = tcore_at_tok_new(line);
                        if (g_slist_length(tokens) < 1) {
-                               err("Invalid message");
+                               msg("Invalid message");
                                goto OUT;
                        }
 
                        tmp = tcore_at_tok_extract(g_slist_nth_data(tokens, 0));
-                       tcore_util_hexstring_to_bytes(tmp, &decoded_data, &decoded_data_len);
+                       if (tmp) {
+                               decoded_data = util_hexStringToBytes(tmp);
+                               if (!decoded_data) {
+                                       err("util_hexStringToBytes Failed!!");
+                                       goto OUT;
+                               }
 
-                       atr_res.atr_len = decoded_data_len;
-                       memcpy((char *)atr_res.atr, decoded_data, decoded_data_len);
-                       g_free(tmp);
-                       g_free(decoded_data);
-                       sim_result = TEL_SIM_RESULT_SUCCESS;
+                               res.atr_length = strlen(tmp) / 2;
+                               memcpy((char *)res.atr, decoded_data, res.atr_length);
+                               g_free(tmp);
+                               g_free(decoded_data);
+                               res.result = SIM_ACCESS_SUCCESS;
+                       }
                }
        } else {
-               err("RESPONSE NOK");
+               dbg("RESPONSE NOK");
        }
 
 OUT:
        /* Send Response */
-       if (resp_cb_data->cb)
-               resp_cb_data->cb(co, (gint)sim_result, &atr_res, resp_cb_data->cb_data);
+       if (ur) {
+               tcore_user_request_send_response(ur, _find_resp_command(ur),
+                                                       sizeof(struct tresp_sim_get_atr), &res);
+       }
        tcore_at_tok_free(tokens);
        dbg("Exit");
 }
 
-/* SIM Operations */
-/*
- * Operation - get_imsi
- *
- * Request -
- * AT-Command: AT+CRSM= <command>[,<fileid>[,<P1>,<P2>,<P3>[,<data>[,<pathid>]]]]
- * where,
- * <command>
- * 176 READ BINARY
- * 178 READ RECORD
- * 192 GET RESPONSE
- * 214 UPDATE BINARY
- * 220 UPDATE RECORD
- * 242 STATUS
- *
- * <fileid>
- * 28423 meaning IMSI file (6F07)
- * 28473 meaning ACM file (6F39)
- * 28481 meaning PUKT file (6F41)
- * 28482 meaning SMS file (6F42)
- *
- * <P1>, <P2>, <P3>
- * Integer type defining the request.
- * These parameters are mandatory for every command, except GET RESPONSE and STATUS.
- *
- * <data>
- * Information which shall be written to the SIM
- *
- * <pathid>
- * String type, contains the path of an elementary file on the SIM/USIM in hexadecimal format
- *
- * <status>
- * 0 not active
- * 1 active
- *
- * Success:
- *     OK
- *     +CRSM: <sw1>,<sw2>[,<response>]
- *
- * <sw1>, <sw2>
- * Integer type containing the SIM information
- *
- * <response>
- * Response of successful completion of the command previously issued
- *
- * Failure:
- *     +CME ERROR: <error>
- */
-static TelReturn imc_sim_get_imsi (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret;
-       dbg("Entry");
-
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_IMSI, ret);
-
-       return ret;
-}
-
-static TelReturn imc_sim_get_ecc (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
+static void on_response_req_authentication(TcorePending *p, int data_len,
+                                       const void *data, void *user_data)
 {
-       TelReturn ret;
-       dbg("Entry");
-
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_ECC, ret);
-
-       return ret;
-}
-
-static TelReturn imc_sim_get_iccid (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret;
-       dbg("Entry");
-
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_ICCID, ret);
-
-       return ret;
-}
-
-static TelReturn imc_sim_get_language (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret;
-       dbg("Entry");
-
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_LP, ret);
-       return ret;
-}
-
-static TelReturn imc_sim_set_language (CoreObject *co,
-       TelSimLanguagePreferenceCode language,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       ImcSimMetaInfo file_meta = {0, };
-       TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
-       ImcRespCbData *resp_cb_data = NULL;
-       char *encoded_data = NULL;
-       int encoded_data_len = 0;
-       int p1 = 0;
-       int p2 = 0;
-       int p3 = 0;
+       const TcoreATResponse *at_resp = data;
+       GSList *tokens = NULL;
+       struct tresp_sim_req_authentication resp_auth;
+       const struct treq_sim_req_authentication *req_data;
+       UserRequest *ur = tcore_pending_ref_user_request(p);
 
        dbg("Entry");
 
-       file_meta.file_id = TEL_SIM_EF_LP;
-       file_meta.file_result = TEL_SIM_RESULT_FAILURE;
-
-       tcore_sim_get_type(co, &card_type);
-
-       dbg("language[%d], card_type[%d]", language, card_type);
-
-       if (TEL_SIM_CARD_TYPE_GSM == card_type) {
-               dbg("2G");
+       memset(&resp_auth, 0, sizeof(struct tresp_sim_req_authentication));
 
-               tcore_sim_encode_lp(language, &encoded_data, &encoded_data_len);
-       } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
-               gchar *tmp;
-               dbg("3G");
-
-               if (tcore_sim_encode_li(language, &tmp, &encoded_data_len)) {
-                       encoded_data = g_strdup_printf("%02x%02x", tmp[0], tmp[1]);
-                       g_free(tmp);
-               }
-               else {
-                       err("Failed to encode Language [%d]", language);
-                       return TEL_RETURN_FAILURE;
-               }
-       } else {
-               err("Invalid card_type:[%d]", card_type);
-               return TEL_RETURN_OPERATION_NOT_SUPPORTED;
+       if (at_resp == NULL) {
+               err("at_resp is NULL");
+               resp_auth.result = SIM_ACCESS_FAILED;
+               resp_auth.auth_result = SIM_AUTH_CANNOT_PERFORM;
+               goto out;
        }
 
-       if (!encoded_data_len) {
-               err("Failed to encode Language [%d]", language);
-               return TEL_RETURN_FAILURE;
+       req_data = tcore_user_request_ref_data(ur, NULL);
+       if (req_data == NULL) {
+               err("req_data is NULL");
+               resp_auth.result = SIM_ACCESS_FAILED;
+               resp_auth.auth_result = SIM_AUTH_CANNOT_PERFORM;
+               goto out;
        }
-       dbg("Encoded Language [%s] len[%d]", encoded_data, encoded_data_len);
+       resp_auth.auth_type = req_data->auth_type;
 
-       p1 = 0;
-       p2 = 0;
-       p3 = encoded_data_len;
+       if (at_resp->success == TRUE) {
+               const char *line;
+               int status;
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
-               &file_meta, sizeof(ImcSimMetaInfo));
+               dbg("RESPONSE OK");
+               if (at_resp->lines != NULL) {
+                       line = at_resp->lines->data;
+                       dbg("Received data: [%s]", line);
+               } else {
+                       err("at_resp->lines is NULL");
+                       resp_auth.result = SIM_ACCESS_FAILED;
+                       resp_auth.auth_result = SIM_AUTH_CANNOT_PERFORM;
+                       goto out;
+               }
 
-       return __imc_sim_update_file(co, resp_cb_data,
-               IMC_SIM_ACCESS_UPDATE_BINARY, TEL_SIM_EF_LP,
-               p1, p2, p3, encoded_data);
-}
+               tokens = tcore_at_tok_new(line);
+               if (tokens == NULL) {
+                       err("tokens is NULL");
+                       resp_auth.result = SIM_ACCESS_FAILED;
+                       resp_auth.auth_result = SIM_AUTH_CANNOT_PERFORM;
+                       goto out;
+               }
 
-static TelReturn imc_sim_get_callforwarding_info (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret;
-       dbg("Entry");
+               status = atoi(g_slist_nth_data(tokens, 0));
+               switch (status) {
+               case 0:
+                       dbg("Authentications successful");
+                       resp_auth.auth_result = SIM_AUTH_NO_ERROR;
+                       break;
+               case 1:
+                       err("Synchronize fail");
+                       resp_auth.auth_result = SIM_AUTH_SYNCH_FAILURE;
+                       goto out;
+               case 2:
+                       err("MAC wrong");
+                       resp_auth.auth_result = SIM_AUTH_MAK_CODE_FAILURE;
+                       goto out;
+               case 3:
+                       err("Does not support security context");
+                       resp_auth.auth_result = SIM_AUTH_UNSUPPORTED_CONTEXT;
+                       goto out;
+               default:
+                       err("Other failure");
+                       resp_auth.auth_result = SIM_AUTH_CANNOT_PERFORM;
+                       goto out;
+               }
 
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_USIM_CFIS, ret);
+               if (resp_auth.auth_type == SIM_AUTH_TYPE_GSM) {
+                       char *kc, *sres;
+                       char *convert_kc, *convert_sres;
 
-       return ret;
-}
+                       kc = g_slist_nth_data(tokens, 1);
+                       if (kc != NULL) {
+                               kc = tcore_at_tok_extract(kc);
+                               dbg("Kc: [%s]", kc);
+                               convert_kc = util_hexStringToBytes(kc);
+                               if (convert_kc && strlen(convert_kc) <= SIM_AUTH_RESP_DATA_LEN_MAX) {
+                                       resp_auth.authentication_key_length = strlen(convert_kc);
+                                       memcpy(&resp_auth.authentication_key, convert_kc, strlen(convert_kc));
+                               } else {
+                                       err("Invalid Kc");
+                                       resp_auth.auth_result = SIM_AUTH_CANNOT_PERFORM;
+                               }
+                               g_free(kc);
+                               g_free(convert_kc);
+                       }
 
-static TelReturn imc_sim_get_messagewaiting_info (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret;
-       dbg("Entry");
+                       sres = g_slist_nth_data(tokens, 2);
+                       if (sres != NULL) {
+                               sres = tcore_at_tok_extract(sres);
+                               dbg("SRES: [%s]", sres);
+                               convert_sres = util_hexStringToBytes(sres);
+                               if (convert_sres && strlen(sres) <= SIM_AUTH_RESP_DATA_LEN_MAX) {
+                                       resp_auth.resp_length = strlen(convert_sres);
+                                       memcpy(&resp_auth.resp_data, convert_sres, strlen(convert_sres));
+                               } else {
+                                       err("Invalid SRES");
+                                       resp_auth.auth_result = SIM_AUTH_CANNOT_PERFORM;
+                               }
+                               g_free(sres);
+                               g_free(convert_sres);
+                       }
+               } else if (resp_auth.auth_type == SIM_AUTH_TYPE_3G
+                               || resp_auth.auth_type == SIM_AUTH_TYPE_IMS) {
+                       /* TODO */
+               }
+       } else {
+               err("RESPONSE NOK");
+               resp_auth.result = SIM_ACCESS_FAILED;
+               resp_auth.auth_result = SIM_AUTH_CANNOT_PERFORM;
+       }
 
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_USIM_MWIS, ret);
+out:
+       tcore_user_request_send_response(ur, TRESP_SIM_REQ_AUTHENTICATION,
+                       sizeof(struct tresp_sim_req_authentication), &resp_auth);
 
-       return ret;
+       tcore_at_tok_free(tokens);
 }
 
-static TelReturn imc_sim_set_messagewaiting_info (CoreObject *co,
-       const TelSimMwis *request, TcoreObjectResponseCallback cb, void *cb_data)
+static TReturn imc_verify_pins(CoreObject *o, UserRequest *ur)
 {
-       ImcSimMetaInfo file_meta = {0, };
-       ImcRespCbData *resp_cb_data = NULL;
-       gchar *encoded_mwis;
-       guint encoded_mwis_len = 0;
-       gchar *encoded_data = NULL;
-       guint encoded_data_len = 0;
-       int p1 = 0;
-       int p2 = 0;
-       int p3 = 0;
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
+       char *cmd_str = NULL;
+       const struct treq_sim_verify_pins *req_data = NULL;
+       struct imc_sim_property *sp = NULL;
+       TReturn ret = TCORE_RETURN_FAILURE;
 
        dbg("Entry");
 
-       /*
-        * Videomail is not supported.
-        */
-       if (!tcore_sim_encode_mwis(request, TEL_SIM_MAILBOX_TYPE_MAX,
-                       &encoded_mwis, &encoded_mwis_len)) {
-               err("Failed to encode mwis");
-               return TEL_RETURN_FAILURE;
-       }
+       if ((o == NULL) || (ur == NULL))
+               return TCORE_RETURN_EINVAL;
 
-       encoded_data_len = 2 * encoded_mwis_len;
-       encoded_data = (char *)tcore_malloc0(encoded_data_len + 1);
-       tcore_util_byte_to_hex(encoded_mwis, encoded_data, encoded_mwis_len);
-       tcore_free(encoded_mwis);
-       dbg("Encoded data: [%s] Encoded data length: [%d]", encoded_data, encoded_data_len);
+       hal = tcore_object_get_hal(o);
+       if (FALSE == tcore_hal_get_power_state(hal)) {
+               err("CP NOT READY");
+               return TCORE_RETURN_ENOSYS;
+       }
 
-       p1 = 1;
-       p2 = 0x04;
-       p3 = TEL_SIM_MAILBOX_TYPE_MAX;  /* Indicator Status | Voicemail | Fax | Electronic Mail | Others */
-       dbg("p1: [%d] p2: [%d] p3: [%d]", p1, p2, p3);
+       sp = tcore_sim_ref_userdata(o);
+       if (!sp) {
+               err("user data is null");
+               return TCORE_RETURN_FAILURE;
+       }
 
-       file_meta.file_id = TEL_SIM_EF_USIM_MWIS;
-       file_meta.file_result = TEL_SIM_RESULT_FAILURE;
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return TCORE_RETURN_FAILURE;
+       }
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data, &file_meta, sizeof(ImcSimMetaInfo));
+       req_data = tcore_user_request_ref_data(ur, NULL);
+
+       if (req_data->pin_type == SIM_PTYPE_PIN1) {
+               sp->current_sec_op = SEC_PIN1_VERIFY;
+               cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", req_data->pin);
+       } else if (req_data->pin_type == SIM_PTYPE_PIN2) {
+               sp->current_sec_op = SEC_PIN2_VERIFY;
+               cmd_str = g_strdup_printf("AT+CPIN2=\"%s\"", req_data->pin);
+       } else if (req_data->pin_type == SIM_PTYPE_SIM) {
+               sp->current_sec_op = SEC_SIM_VERIFY;
+               cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", req_data->pin);
+       } else if (req_data->pin_type == SIM_PTYPE_ADM) {
+               sp->current_sec_op = SEC_ADM_VERIFY;
+               cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", req_data->pin);
+       } else {
+               tcore_pending_free(pending);
+               return TCORE_RETURN_EINVAL;
+       }
 
-       return __imc_sim_update_file(co, resp_cb_data, IMC_SIM_ACCESS_UPDATE_RECORD,
-                                       TEL_SIM_EF_USIM_MWIS, p1, p2, p3, encoded_data);
-}
+       req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return TCORE_RETURN_FAILURE;
+       }
+       g_free(cmd_str);
 
-static TelReturn imc_sim_get_mailbox_info (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret;
-       dbg("Entry");
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
 
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_USIM_MBI, ret);
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, on_response_verify_pins, hal);
+       tcore_pending_link_user_request(pending, ur);
+       ret = tcore_hal_send_request(hal, pending);
 
+       dbg("Exit");
        return ret;
 }
 
-static TelReturn imc_sim_set_mailbox_info (CoreObject *co,
-       const TelSimMailBoxNumber *request, TcoreObjectResponseCallback cb, void *cb_data)
+static TReturn imc_verify_puks(CoreObject *o, UserRequest *ur)
 {
-       ImcSimMetaInfo file_meta = {0, };
-       ImcRespCbData *resp_cb_data = NULL;
-       char *tmp = NULL;
-       int tmp_len = 0;
-       char *encoded_data = NULL;
-       int encoded_data_len = 0;
-       int p1 = 0;
-       int p2 = 0;
-       int p3 = 0;
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
+       char *cmd_str = NULL;
+       const struct treq_sim_verify_puks *req_data;
+       struct imc_sim_property *sp = NULL;
+       TReturn ret = TCORE_RETURN_FAILURE;
 
        dbg("Entry");
 
-       file_meta.file_id = TEL_SIM_EF_USIM_MBI;
-       file_meta.file_result = TEL_SIM_RESULT_FAILURE;
+       if ((o == NULL) || (ur == NULL))
+               return TCORE_RETURN_EINVAL;
 
-       /* TBD - Do Encoding.
-       if (!tcore_sim_encode_mbi(request, sizeof(request), tmp, &tmp_len)) {
-               err("Failed to encode mwis");
-               return TEL_RETURN_FAILURE;
-       } */
-
-       encoded_data_len = tmp_len * 2;
-       encoded_data = (char *)tcore_malloc0(encoded_data_len + 1);
-       tcore_util_byte_to_hex(tmp, encoded_data, tmp_len);
-       if (!encoded_data) {
-               err("Failed to convert byte to hex");
-               tcore_free(encoded_data);
-               return TEL_RETURN_FAILURE;
+       hal = tcore_object_get_hal(o);
+       if (FALSE == tcore_hal_get_power_state(hal)) {
+               err("CP NOT READY");
+               return TCORE_RETURN_ENOSYS;
        }
 
-       p1 = 1;
-       p2 = 0x04;
-       p3 = encoded_data_len;
-       dbg("encoded_data - [%s], encoded_data_len - %d", encoded_data, encoded_data_len);
-
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data, &file_meta, sizeof(ImcSimMetaInfo));
+       sp = tcore_sim_ref_userdata(o);
+       if (!sp) {
+               err("user data is null");
+               return TCORE_RETURN_FAILURE;
+       }
 
-       return __imc_sim_update_file(co, resp_cb_data, IMC_SIM_ACCESS_UPDATE_RECORD,
-                                       TEL_SIM_EF_USIM_MBI, p1, p2, p3, encoded_data);
-}
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return TCORE_RETURN_FAILURE;
+       }
 
-static TelReturn imc_sim_get_msisdn (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret;
-       dbg("Entry");
+       req_data = tcore_user_request_ref_data(ur, NULL);
 
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_MSISDN, ret);
+       if (req_data->puk_type == SIM_PTYPE_PUK1) {
+               sp->current_sec_op = SEC_PUK1_VERIFY;
+               cmd_str = g_strdup_printf("AT+CPIN=\"%s\", \"%s\"", req_data->puk, req_data->pin);
+       } else if (req_data->puk_type == SIM_PTYPE_PUK2) {
+               sp->current_sec_op = SEC_PUK2_VERIFY;
+               cmd_str = g_strdup_printf("AT+CPIN2=\"%s\", \"%s\"", req_data->puk, req_data->pin);
+       } else {
+               tcore_pending_free(pending);
+               return TCORE_RETURN_EINVAL;
+       }
 
-       return ret;
-}
+       req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return TCORE_RETURN_FAILURE;
+       }
+       g_free(cmd_str);
 
-static TelReturn imc_sim_get_spn (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret;
-       dbg("Entry");
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
 
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_SPN, ret);
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, on_response_verify_puks, hal);
+       tcore_pending_link_user_request(pending, ur);
+       ret = tcore_hal_send_request(hal, pending);
 
+       dbg("Exit");
        return ret;
 }
 
-static TelReturn imc_sim_get_cphs_netname (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
+static TReturn imc_change_pins(CoreObject *o, UserRequest *ur)
 {
-       TelReturn ret;
-       dbg("Entry");
-
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_CPHS_OPERATOR_NAME_STRING, ret);
-
-       return ret;
-}
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
+       char *cmd_str = NULL;
+       const struct treq_sim_change_pins *req_data;
+       struct imc_sim_property *sp = NULL;
+       char *pin1 = "SC";
+       char *pin2 = "P2";
+       TReturn ret = TCORE_RETURN_FAILURE;
 
-static TelReturn imc_sim_get_sp_display_info (CoreObject *co,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret;
        dbg("Entry");
 
-       IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_SPDI, ret);
-
-       return ret;
-}
+       if ((o == NULL) || (ur == NULL))
+               return TCORE_RETURN_EINVAL;
 
-static TelReturn imc_sim_req_authentication (CoreObject *co,
-       const TelSimAuthenticationData *request,
-       TcoreObjectResponseCallback cb, void *cb_data)
-{
-       gchar *cmd_str = NULL;
-       ImcRespCbData *resp_cb_data = NULL;
-       TelReturn ret = TEL_RETURN_FAILURE;
-       TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
-       char *convert_rand = NULL;
-       char *convert_autn = NULL;
-       int session_id;
-       int context_type;
+       hal = tcore_object_get_hal(o);
+       if (FALSE == tcore_hal_get_power_state(hal)) {
+               err("CP NOT READY");
+               return TCORE_RETURN_ENOSYS;
+       }
 
-       dbg("Entry");
+       sp = tcore_sim_ref_userdata(o);
+       if (!sp) {
+               err("user data is null");
+               return TCORE_RETURN_FAILURE;
+       }
 
-       tcore_sim_get_type(co, &card_type);
-       if (TEL_SIM_CARD_TYPE_GSM == card_type || TEL_SIM_CARD_TYPE_USIM == card_type) {
-               session_id = 0;
-       } else {
-               err("Not Supported SIM type:[%d]", card_type);
-               return TEL_SIM_RESULT_OPERATION_NOT_SUPPORTED;
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return TCORE_RETURN_FAILURE;
        }
 
-       if (request->rand_data != NULL) {
-               convert_rand = tcore_malloc0(request->rand_length*2 + 1);
-               tcore_util_byte_to_hex(request->rand_data, convert_rand, request->rand_length);
-               dbg("Convert RAND hex to string: [%s]", convert_rand);
+       req_data = tcore_user_request_ref_data(ur, NULL);
+
+       if (req_data->type == SIM_PTYPE_PIN1) {
+               sp->current_sec_op = SEC_PIN1_CHANGE;
+               cmd_str = g_strdup_printf("AT+CPWD=\"%s\", \"%s\", \"%s\"", pin1, req_data->old_pin, req_data->new_pin);
+       } else if (req_data->type == SIM_PTYPE_PIN2) {
+               sp->current_sec_op = SEC_PIN2_CHANGE;
+               cmd_str = g_strdup_printf("AT+CPWD=\"%s\", \"%s\", \"%s\"", pin2, req_data->old_pin, req_data->new_pin);
        } else {
-               err("rand_data is NULL");
-               goto EXIT;
+               tcore_pending_free(pending);
+               return TCORE_RETURN_EINVAL;
        }
-
-       switch (request->auth_type) {
-       case TEL_SIM_AUTH_GSM:
-               context_type = 2;
-               cmd_str = g_strdup_printf("AT+XAUTH=%d,%d,\"%s\"",
-                       session_id, context_type, convert_rand);
-       break;
-       case TEL_SIM_AUTH_3G_CTX:
-               context_type = 1;
-               if (request->autn_data != NULL) {
-                       convert_autn = tcore_malloc0(request->autn_length*2 + 1);
-                       tcore_util_byte_to_hex(request->autn_data, convert_autn, request->autn_length);
-                       dbg("Convert AUTN hex to string: [%s]", convert_autn);
-               } else {
-                       err("autn_data is NULL");
-                       goto EXIT;
-               }
-               cmd_str = g_strdup_printf("AT+XAUTH=%d,%d,\"%s\",\"%s\"",
-                       session_id, context_type, convert_rand, convert_autn);
-       break;
-       default:
-               err("Not supported Authentication type:[%d]", request->auth_type);
-               ret = TEL_SIM_RESULT_OPERATION_NOT_SUPPORTED;
-               goto EXIT;
+       req = tcore_at_request_new(cmd_str, NULL, TCORE_AT_NO_RESULT);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return TCORE_RETURN_FAILURE;
        }
+       g_free(cmd_str);
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data, (void *)&request->auth_type, sizeof(TelSimAuthenticationType));
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, "+XAUTH:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               on_response_imc_sim_req_authentication, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim request authentication");
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, on_response_change_pins, hal);
+       tcore_pending_link_user_request(pending, ur);
+       ret = tcore_hal_send_request(hal, pending);
 
-EXIT:
-       g_free(cmd_str);
-       tcore_free(convert_rand);
-       tcore_free(convert_autn);
        dbg("Exit");
        return ret;
 }
 
-/*
- * Operation - verify_pins/verify_puks
- *
- * Request -
- * For SIM PIN
- * AT-Command: AT+CPIN= <pin> [, <newpin>]
- * where,
- * <pin>, <newpin>
- * String type values
- *
- * For SIM PIN2
- * AT-Command: AT+CPIN2= <puk2/oldpin2> [, <newpin2>]andAT+CPIN2=<oldpin2>
- * where,
- * <puk2/pin2>, <newpin2>
- * String type values
- *
- * Success:
- *     OK
- *
- * Failure:
- *     +CME ERROR: <error>
- */
-static TelReturn imc_sim_verify_pins(CoreObject *co, const TelSimSecPinPw *request,
-               TcoreObjectResponseCallback cb, void *cb_data)
+static TReturn imc_get_facility_status(CoreObject *o, UserRequest *ur)
 {
-       TelReturn ret = TEL_RETURN_FAILURE;
-       ImcRespCbData *resp_cb_data = NULL;
-       ImcSimCurrSecOp sec_op;
-       gchar *cmd_str = NULL;
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
+       char *cmd_str = NULL;
+       const struct treq_sim_get_facility_status *req_data;
+       struct tresp_sim_get_facility_status *res;
+       char *fac = "SC";
+       int mode = 2;    /* 0:unlock, 1:lock, 2:query*/
+       TReturn ret = TCORE_RETURN_FAILURE;
 
        dbg("Entry");
 
-       if (request->pin_type == TEL_SIM_PIN_TYPE_PIN1) {
-               sec_op = IMC_SIM_CURR_SEC_OP_PIN1_VERIFY;
-               cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", request->pw);
-       } else if (request->pin_type == TEL_SIM_PIN_TYPE_PIN2) {
-               sec_op = IMC_SIM_CURR_SEC_OP_PIN2_VERIFY;
-               cmd_str = g_strdup_printf("AT+CPIN2=\"%s\"", request->pw);
-       } else {
-               err("Invalid pin type [%d]", request->pin_type);
-               return TEL_RETURN_INVALID_PARAMETER;
-       }
+       if ((o == NULL) || (ur == NULL))
+               return TCORE_RETURN_EINVAL;
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
-                       &sec_op, sizeof(sec_op));
+       hal = tcore_object_get_hal(o);
+       if (FALSE == tcore_hal_get_power_state(hal)) {
+               err("CP NOT READY");
+               return TCORE_RETURN_ENOSYS;
+       }
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, NULL,
-               TCORE_AT_COMMAND_TYPE_NO_RESULT,
-               NULL,
-               on_response_imc_sim_verify_pins, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Verify Pins");
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return TCORE_RETURN_FAILURE;
+       }
 
-       g_free(cmd_str);
-       return ret;
-}
+       req_data = tcore_user_request_ref_data(ur, NULL);
 
-static TelReturn imc_sim_verify_puks(CoreObject *co, const TelSimSecPukPw *request,
-               TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret = TEL_RETURN_FAILURE;
-       ImcRespCbData *resp_cb_data = NULL;
-       ImcSimCurrSecOp sec_op;
-       gchar *cmd_str = NULL;
+       res = g_try_new0(struct tresp_sim_get_facility_status, 1);
+       if (!res) {
+               tcore_pending_free(pending);
+               return TCORE_RETURN_ENOMEM;
+       }
 
-       dbg("Entry");
+       res->type = req_data->type;
+
+       if (req_data->type == SIM_FACILITY_PS)
+               fac = "PS";               /*PH-SIM, Lock PHone to SIM/UICC card*/
+       else if (req_data->type == SIM_FACILITY_SC)
+               fac = "SC";               /*Lock SIM/UICC card, simply PIN1*/
+       else if (req_data->type == SIM_FACILITY_FD)
+               fac = "FD";               /*Fixed Dialing Number feature, need PIN2*/
+       else if (req_data->type == SIM_FACILITY_PN)
+               fac = "PN";               /*Network Personalization*/
+       else if (req_data->type == SIM_FACILITY_PU)
+               fac = "PU";               /*network sUbset Personalization*/
+       else if (req_data->type == SIM_FACILITY_PP)
+               fac = "PP";               /*service Provider Personalization*/
+       else if (req_data->type == SIM_FACILITY_PC)
+               fac = "PC";               /*Corporate Personalization*/
+       else
+               return TCORE_RETURN_EINVAL;
 
-       if (request->puk_type == TEL_SIM_PUK_TYPE_PUK1) {
-               sec_op = IMC_SIM_CURR_SEC_OP_PUK1_VERIFY;
-               cmd_str = g_strdup_printf("AT+CPIN=\"%s\", \"%s\"",
-                               request->puk_pw, request->new_pin_pw);
-       } else if (request->puk_type == TEL_SIM_PUK_TYPE_PUK2) {
-               sec_op = IMC_SIM_CURR_SEC_OP_PUK2_VERIFY;
-               cmd_str = g_strdup_printf("AT+CPIN2=\"%s\", \"%s\"",
-                               request->puk_pw, request->new_pin_pw);
-       } else {
-               err("Invalid puk type [%d]", request->puk_type);
-               return TEL_RETURN_INVALID_PARAMETER;
+       cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d", fac, mode);
+       req = tcore_at_request_new(cmd_str, "+CLCK:", TCORE_AT_SINGLELINE);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return TCORE_RETURN_FAILURE;
        }
+       g_free(cmd_str);
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
-                       &sec_op, sizeof(sec_op));
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, NULL,
-               TCORE_AT_COMMAND_TYPE_NO_RESULT,
-               NULL,
-               on_response_imc_sim_verify_puks, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Verify Puks");
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, on_response_get_facility_status, res);
+       tcore_pending_link_user_request(pending, ur);
+       ret = tcore_hal_send_request(hal, pending);
 
-       g_free(cmd_str);
+       dbg("Exit");
        return ret;
 }
 
-/*
- * Operation - change_pins
- *
- * Request -
- * AT-Command: AT+CPWD= <fac>,<oldpwd>,<newpwd>
- * where,
- * <fac>
- * SIM facility
- *
- * <oldpwd>
- * Old Password
- *
- * <newpwd>
- * New Password
- *
- * Success:
- *     OK
- *
- * Failure:
- *     +CME ERROR: <error>
- */
-static TelReturn imc_sim_change_pins(CoreObject *co, const TelSimSecChangePinPw *request,
-               TcoreObjectResponseCallback cb, void *cb_data)
+static TReturn imc_enable_facility(CoreObject *o, UserRequest *ur)
 {
-       TelReturn ret = TEL_RETURN_FAILURE;
-       ImcRespCbData *resp_cb_data = NULL;
-       ImcSimCurrSecOp sec_op;
-       gchar *cmd_str = NULL;
-       char *pin1_fac = "SC";
-       char *pin2_fac = "P2";
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
+       char *cmd_str = NULL;
+       const struct treq_sim_enable_facility *req_data;
+       struct imc_sim_property *sp = NULL;
+       char *fac = "SC";
+       int mode = 1;    /* 0:unlock, 1:lock, 2:query*/
+       TReturn ret = TCORE_RETURN_FAILURE;
 
        dbg("Entry");
 
-       if (request->pin_type == TEL_SIM_PIN_TYPE_PIN1) {
-               sec_op = IMC_SIM_CURR_SEC_OP_PIN1_CHANGE;
-               cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"",
-                               pin1_fac, request->old_pw, request->new_pw);
-       } else if (request->pin_type == TEL_SIM_PIN_TYPE_PIN2) {
-               sec_op = IMC_SIM_CURR_SEC_OP_PIN2_CHANGE;
-               cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"",
-                               pin2_fac, request->old_pw, request->new_pw);
-       } else {
-               err("Invalid pin type [%d]", request->pin_type);
-               return TEL_RETURN_INVALID_PARAMETER;
+       if ((o == NULL) || (ur == NULL))
+               return TCORE_RETURN_EINVAL;
+
+       hal = tcore_object_get_hal(o);
+       if (FALSE == tcore_hal_get_power_state(hal)) {
+               err("CP NOT READY");
+               return TCORE_RETURN_ENOSYS;
        }
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
-                       &sec_op, sizeof(sec_op));
+       sp = tcore_sim_ref_userdata(o);
+       if (!sp) {
+               err("user data is null");
+               return TCORE_RETURN_FAILURE;
+       }
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, NULL,
-               TCORE_AT_COMMAND_TYPE_NO_RESULT,
-               NULL,
-               on_response_imc_sim_change_pins, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Change Pins");
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return TCORE_RETURN_FAILURE;
+       }
 
+       req_data = tcore_user_request_ref_data(ur, NULL);
+
+       if (req_data->type == SIM_FACILITY_PS) {
+               fac = "PS";               /*PH-SIM, Lock PHone to SIM/UICC card*/
+               sp->current_sec_op = SEC_SIM_ENABLE;
+       } else if (req_data->type == SIM_FACILITY_SC) {
+               fac = "SC";               /*Lock SIM/UICC card, simply PIN1*/
+               sp->current_sec_op = SEC_PIN1_ENABLE;
+       } else if (req_data->type == SIM_FACILITY_FD) {
+               fac = "FD";               /*Fixed Dialing Number feature, need PIN2*/
+               sp->current_sec_op = SEC_FDN_ENABLE;
+       } else if (req_data->type == SIM_FACILITY_PN) {
+               fac = "PN";               /*Network Personalization*/
+               sp->current_sec_op = SEC_NET_ENABLE;
+       } else if (req_data->type == SIM_FACILITY_PU) {
+               fac = "PU";               /*network sUbset Personalization*/
+               sp->current_sec_op = SEC_NS_ENABLE;
+       } else if (req_data->type == SIM_FACILITY_PP) {
+               fac = "PP";               /*service Provider Personalization*/
+               sp->current_sec_op = SEC_SP_ENABLE;
+       } else if (req_data->type == SIM_FACILITY_PC) {
+               fac = "PC";               /*Corporate Personalization*/
+               sp->current_sec_op = SEC_CP_ENABLE;
+       } else {
+               return TCORE_RETURN_EINVAL;
+       }
+       cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d, \"%s\"", fac, mode, req_data->password);
+       req = tcore_at_request_new(cmd_str, "+CLCK:", TCORE_AT_SINGLELINE);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return TCORE_RETURN_FAILURE;
+       }
        g_free(cmd_str);
+
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
+
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, on_response_enable_facility, hal);
+       tcore_pending_link_user_request(pending, ur);
+       ret = tcore_hal_send_request(hal, pending);
+
+       dbg("Exit");
        return ret;
 }
 
-/*
- * Operation - disable_facility/enable_facility/get_facility
- *
- * Request -
- * AT-Command: AT+CLCK = <fac>, <mode> [, <passwd> [, <class>]]
- * where,
- * <fac>
- * SIM facility
- *
- * <mode>
- * 0 unlock
- * 1 lock
- * 2 query status
- *
- * <passwd>
- * Password string
- *
- * <status>
- * 0 not active
- * 1 active
- *
- * Success: when <mode>=2:
- *     OK
- *     +CLCK: <status>[,<class1> [<CR><LF>
- *     +CLCK: <status>,<class2> [...]]
- *
- * Failure:
- */
-static TelReturn imc_sim_disable_facility(CoreObject *co, const TelSimFacilityPw *request,
-               TcoreObjectResponseCallback cb, void *cb_data)
+static TReturn imc_disable_facility(CoreObject *o, UserRequest *ur)
 {
-       TelReturn ret = TEL_RETURN_FAILURE;
-       ImcRespCbData *resp_cb_data = NULL;
-       ImcSimCurrSecOp sec_op;
-       gchar *cmd_str = NULL;
+       TcoreHal *hal;
+       TcoreATRequest *req;
+       TcorePending *pending = NULL;
+       char *cmd_str = NULL;
+       const struct treq_sim_enable_facility *req_data;
+       struct imc_sim_property *sp = NULL;
        char *fac = "SC";
-       int mode = 0; /*mode = 0 for disable lock*/
+       int mode = 0;    /* 0:unlock, 1:lock, 2:query*/
+       TReturn ret = TCORE_RETURN_FAILURE;
 
        dbg("Entry");
 
-       fac = __imc_sim_get_fac_from_lock_type(request->lock_type,
-                       &sec_op, DISABLE_FLAG);
-       if (!fac)
-               return TEL_RETURN_INVALID_PARAMETER;
+       if ((o == NULL) || (ur == NULL))
+               return TCORE_RETURN_EINVAL;
 
-       cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d, \"%s\"",
-                       fac, mode, request->pw);
+       hal = tcore_object_get_hal(o);
+       if (FALSE == tcore_hal_get_power_state(hal)) {
+               err("CP NOT READY");
+               return TCORE_RETURN_ENOSYS;
+       }
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
-                       &sec_op, sizeof(sec_op));
+       sp = tcore_sim_ref_userdata(o);
+       if (!sp) {
+               err("user data is null");
+               return TCORE_RETURN_FAILURE;
+       }
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, "+CLCK:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               on_response_imc_sim_disable_facility, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Disable Facility");
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return TCORE_RETURN_FAILURE;
+       }
 
+       req_data = tcore_user_request_ref_data(ur, NULL);
+
+       if (req_data->type == SIM_FACILITY_PS) {
+               fac = "PS";               /*PH-SIM, Lock PHone to SIM/UICC card*/
+               sp->current_sec_op = SEC_SIM_DISABLE;
+       } else if (req_data->type == SIM_FACILITY_SC) {
+               fac = "SC";               /*Lock SIM/UICC card, simply PIN1*/
+               sp->current_sec_op = SEC_PIN1_DISABLE;
+       } else if (req_data->type == SIM_FACILITY_FD) {
+               fac = "FD";               /*Fixed Dialing Number feature, need PIN2*/
+               sp->current_sec_op = SEC_FDN_DISABLE;
+       } else if (req_data->type == SIM_FACILITY_PN) {
+               fac = "PN";               /*Network Personalization*/
+               sp->current_sec_op = SEC_NET_DISABLE;
+       } else if (req_data->type == SIM_FACILITY_PU) {
+               fac = "PU";               /*network sUbset Personalization*/
+               sp->current_sec_op = SEC_NS_DISABLE;
+       } else if (req_data->type == SIM_FACILITY_PP) {
+               fac = "PP";               /*service Provider Personalization*/
+               sp->current_sec_op = SEC_SP_DISABLE;
+       } else if (req_data->type == SIM_FACILITY_PC) {
+               fac = "PC";               /*Corporate Personalization*/
+               sp->current_sec_op = SEC_CP_DISABLE;
+       } else {
+               return TCORE_RETURN_EINVAL;
+       }
+       cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d, \"%s\"", fac, mode, req_data->password);
+       req = tcore_at_request_new(cmd_str, "+CLCK:", TCORE_AT_SINGLELINE);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               g_free(cmd_str);
+               return TCORE_RETURN_FAILURE;
+       }
        g_free(cmd_str);
+
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
+
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, on_response_disable_facility, hal);
+       tcore_pending_link_user_request(pending, ur);
+       ret = tcore_hal_send_request(hal, pending);
+
+       dbg("Exit");
        return ret;
 }
 
-static TelReturn imc_sim_enable_facility(CoreObject *co, const TelSimFacilityPw *request,
-               TcoreObjectResponseCallback cb, void *cb_data)
+static TReturn imc_get_lock_info(CoreObject *o, UserRequest *ur)
 {
-       TelReturn ret = TEL_RETURN_FAILURE;
-       ImcRespCbData *resp_cb_data = NULL;
-       ImcSimCurrSecOp sec_op;
-       gchar *cmd_str = NULL;
-       char *fac = "SC";
-       int mode = 1; /*mode = 1 for enable lock*/
+       TcoreHal *hal = NULL;
+       TcoreATRequest *req = NULL;
+       TcorePending *pending = NULL;
 
        dbg("Entry");
 
-       fac = __imc_sim_get_fac_from_lock_type(request->lock_type,
-                       &sec_op, ENABLE_FLAG);
-       if (!fac)
-               return TEL_RETURN_INVALID_PARAMETER;
+       hal = tcore_object_get_hal(o);
+       pending = tcore_pending_new(o, 0);
+       if (!pending) {
+               err("Pending is NULL");
+               return TCORE_RETURN_FAILURE;
+       }
+
+       if ((o == NULL) || (ur == NULL)) {
+               tcore_pending_free(pending);
+               return TCORE_RETURN_EINVAL;
+       }
+       req = tcore_at_request_new("AT+XPINCNT", "+XPINCNT:", TCORE_AT_SINGLELINE);
 
-       cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d, \"%s\"",
-                       fac, mode, request->pw);
+       if (req == NULL) {
+               tcore_pending_free(pending);
+               return TCORE_RETURN_FAILURE;
+       }
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
-                       &sec_op, sizeof(sec_op));
+       dbg("Command: [%s] Prefix(if any): [%s], Command length: [%d]",
+                               req->cmd, req->prefix, strlen(req->cmd));
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, "+CLCK:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               on_response_imc_sim_enable_facility, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Disable Facility");
+       tcore_pending_set_request_data(pending, 0, req);
+       tcore_pending_set_response_callback(pending, on_response_get_lock_info, hal);
+       tcore_pending_link_user_request(pending, ur);
+       tcore_hal_send_request(hal, pending);
 
-       g_free(cmd_str);
-       return ret;
+       dbg("Exit");
+       return TCORE_RETURN_SUCCESS;
 }
 
-static TelReturn imc_sim_get_facility(CoreObject *co, TelSimLockType lock_type,
-               TcoreObjectResponseCallback cb, void *cb_data)
+static TReturn imc_read_file(CoreObject *o, UserRequest *ur)
 {
-       TelReturn ret = TEL_RETURN_FAILURE;
-       ImcRespCbData *resp_cb_data = NULL;
-       ImcSimCurrSecOp sec_op;
-       gchar *cmd_str = NULL;
-       char *fac = "SC";
-       int mode = 2; /*mode = 2 for Get Facility*/
+       TReturn api_ret = TCORE_RETURN_SUCCESS;
+       enum tcore_request_command command;
 
        dbg("Entry");
 
-       fac = __imc_sim_get_fac_from_lock_type(lock_type,
-                       &sec_op, 0);
-       if (!fac)
-               return TEL_RETURN_INVALID_PARAMETER;
+       if ((o == NULL) || (ur == NULL))
+               return TCORE_RETURN_EINVAL;
 
-       cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d", fac, mode);
+       command = tcore_user_request_get_command(ur);
+       if (FALSE == tcore_hal_get_power_state(tcore_object_get_hal(o))) {
+               err("CP NOT READY");
+               return TCORE_RETURN_ENOSYS;
+       }
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
-                               &sec_op, sizeof(sec_op));
+       switch (command) {
+       case TREQ_SIM_GET_ECC:
+               api_ret = _get_file_info(o, ur, SIM_EF_ECC);
+               break;
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, "+CLCK:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               on_response_imc_sim_get_facility, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Get Facility");
+       case TREQ_SIM_GET_LANGUAGE:
+               if (tcore_sim_get_type(o) == SIM_TYPE_GSM)
+                       api_ret = _get_file_info(o, ur, SIM_EF_ELP);
+               else if (tcore_sim_get_type(o) == SIM_TYPE_USIM)
+                       api_ret = _get_file_info(o, ur, SIM_EF_LP);
+               else
+                       api_ret = TCORE_RETURN_ENOSYS;
+               break;
 
-       g_free(cmd_str);
-       return ret;
-}
+       case TREQ_SIM_GET_ICCID:
+               api_ret = _get_file_info(o, ur, SIM_EF_ICCID);
+               break;
 
-static TelReturn imc_sim_get_lock_info(CoreObject *co, TelSimLockType lock_type,
-               TcoreObjectResponseCallback cb, void *cb_data)
-{
-       TelReturn ret = TEL_RETURN_FAILURE;
-       ImcRespCbData *resp_cb_data = NULL;
-       gchar *cmd_str = NULL;
-       int lockType = 0;
+       case TREQ_SIM_GET_MAILBOX:
+               if (tcore_sim_get_cphs_status(o))
+                       api_ret = _get_file_info(o, ur, SIM_EF_CPHS_MAILBOX_NUMBERS);
+               else
+                       api_ret = _get_file_info(o, ur, SIM_EF_MBDN);
+               break;
 
-       dbg("Entry");
+       case TREQ_SIM_GET_CALLFORWARDING:
+               if (tcore_sim_get_cphs_status(o))
+                       api_ret = _get_file_info(o, ur, SIM_EF_CPHS_CALL_FORWARD_FLAGS);
+               else
+                       api_ret = _get_file_info(o, ur, SIM_EF_USIM_CFIS);
+               break;
+
+       case TREQ_SIM_GET_MESSAGEWAITING:
+               if (tcore_sim_get_cphs_status(o))
+                       api_ret = _get_file_info(o, ur, SIM_EF_CPHS_VOICE_MSG_WAITING);
+               else
+                       api_ret = _get_file_info(o, ur, SIM_EF_USIM_MWIS);
+               break;
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data, NULL, 0);
+       case TREQ_SIM_GET_CPHS_INFO:
+               api_ret = _get_file_info(o, ur, SIM_EF_CPHS_CPHS_INFO);
+               break;
+
+       case TREQ_SIM_GET_MSISDN:
+               api_ret = _get_file_info(o, ur, SIM_EF_MSISDN);
+               break;
 
-       switch (lock_type) {
-       case TEL_SIM_LOCK_PS:
-               lockType = 9;
+       case TREQ_SIM_GET_SPN:
+               dbg("enter case SPN");
+               api_ret = _get_file_info(o, ur, SIM_EF_SPN);
                break;
 
-       case TEL_SIM_LOCK_SC:
-               lockType = 1;
+       case TREQ_SIM_GET_SPDI:
+               api_ret = _get_file_info(o, ur, SIM_EF_SPDI);
                break;
 
-       case TEL_SIM_LOCK_FD:
-               lockType = 2;
+       case TREQ_SIM_GET_OPL:
+               api_ret = _get_file_info(o, ur, SIM_EF_OPL);
                break;
 
-       case TEL_SIM_LOCK_PN:
-               lockType = 5;
+       case TREQ_SIM_GET_PNN:
+               api_ret = _get_file_info(o, ur, SIM_EF_PNN);
                break;
 
-       case TEL_SIM_LOCK_PU:
-               lockType = 6;
+       case TREQ_SIM_GET_CPHS_NETNAME:
+               api_ret = _get_file_info(o, ur, SIM_EF_CPHS_OPERATOR_NAME_STRING);
                break;
 
-       case TEL_SIM_LOCK_PP:
-               lockType = 7;
+       case TREQ_SIM_GET_OPLMNWACT:
+               api_ret = _get_file_info(o, ur, SIM_EF_OPLMN_ACT);
                break;
 
-       case TEL_SIM_LOCK_PC:
-               lockType = 8;
+       case TREQ_SIM_GET_SERVICE_TABLE:
+               api_ret = _get_file_info(o, ur, SIM_EF_SST);
                break;
 
        default:
+               dbg("error - not handled read treq command[%d]", command);
+               api_ret = TCORE_RETURN_EINVAL;
                break;
        }
+       dbg("Exit");
+       return api_ret;
+}
 
-       cmd_str = g_strdup_printf("AT+XPINCNT=%d", lockType);
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, "+XPINCNT:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               on_response_imc_sim_get_lock_info, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Get Lock Info");
+static TReturn imc_update_file(CoreObject *co_sim, UserRequest *ur)
+{
+       TReturn ret_code = TCORE_RETURN_SUCCESS;
+       enum tcore_request_command command;
+       enum tel_sim_file_id ef = SIM_EF_INVALID;
+       struct imc_sim_property meta_info = {0, };
+       enum tel_sim_type sim_type;
+       gboolean cphs_sim = FALSE;
+       dbg("Entry");
 
-       g_free(cmd_str);
-       return ret;
+       command = tcore_user_request_get_command(ur);
+       cphs_sim = tcore_sim_get_cphs_status(co_sim);
+       sim_type = tcore_sim_get_type(co_sim);
+
+       if ((co_sim == NULL) || (ur == NULL))
+               return TCORE_RETURN_EINVAL;
+
+       switch (command) {
+       case TREQ_SIM_SET_LANGUAGE:
+               if (sim_type == SIM_TYPE_GSM)
+                       ret_code = _get_file_info(co_sim, ur, SIM_EF_ELP);
+               else if (sim_type == SIM_TYPE_USIM)
+                       ret_code = _get_file_info(co_sim, ur, SIM_EF_LP);
+               else
+                       ret_code = TCORE_RETURN_ENOSYS;
+       break;
+
+       case TREQ_SIM_SET_MAILBOX:
+               if (cphs_sim) {
+                       struct tel_sim_service_table *svct = tcore_sim_get_service_table(co_sim);
+
+                       if (!svct)
+                               break;
+                       if ((sim_type == SIM_TYPE_GSM && svct->table.sst.service[SIM_SST_MBDN]) || (sim_type == SIM_TYPE_USIM && svct->table.ust.service[SIM_UST_MBDN])) {
+                               tcore_user_request_set_metainfo(ur, sizeof(struct imc_sim_property), &meta_info);
+                               ret_code = _get_file_info(co_sim, ur, SIM_EF_USIM_MBI);
+                       } else {
+                               dbg("Service not available in SST/UST - Updating CPHS file : Fild ID[0x%x]", SIM_EF_CPHS_MAILBOX_NUMBERS);
+                               ret_code = _get_file_info(co_sim, ur, SIM_EF_CPHS_MAILBOX_NUMBERS);
+                       }
+                       free(svct);
+               } else {
+                       ret_code = _get_file_info(co_sim, ur, SIM_EF_USIM_MBI);
+               }
+       break;
+
+       case TREQ_SIM_SET_CALLFORWARDING:
+       {
+               const struct treq_sim_set_callforwarding *cf = NULL;
+               cf = (struct treq_sim_set_callforwarding *) tcore_user_request_ref_data(ur, NULL);
+
+               if (cf) {
+                       if (cphs_sim) {
+                               struct tel_sim_service_table *svct = tcore_sim_get_service_table(co_sim);
+                               if (!svct)
+                                       break;
+                               if ((sim_type == SIM_TYPE_GSM && svct->table.sst.service[SIM_SST_CFIS]) || (sim_type == SIM_TYPE_USIM && svct->table.ust.service[SIM_UST_CFIS])) {
+                                       if (cf->b_cphs == FALSE)
+                                               ef = SIM_EF_USIM_CFIS;
+                                       else
+                                               ef = SIM_EF_CPHS_CALL_FORWARD_FLAGS;
+
+                                       tcore_user_request_set_metainfo(ur, sizeof(struct imc_sim_property), &meta_info);
+                                       ret_code = _get_file_info(co_sim, ur, ef);
+                               } else {
+                                       dbg("Service not available in SST/UST - Updating CPHS file : File ID[0x%x]", SIM_EF_CPHS_CALL_FORWARD_FLAGS);
+                                       ret_code = _get_file_info(co_sim, ur, SIM_EF_CPHS_CALL_FORWARD_FLAGS);
+                               }
+                               free(svct);
+                       } else {
+                               ret_code = _get_file_info(co_sim, ur, SIM_EF_USIM_CFIS);
+                       }
+               } else {
+                       ret_code = TCORE_RETURN_EINVAL;
+               }
+       }
+       break;
+
+       case TREQ_SIM_SET_MESSAGEWAITING:
+       {
+               const struct treq_sim_set_messagewaiting *mw = NULL;
+               mw = (struct treq_sim_set_messagewaiting *) tcore_user_request_ref_data(ur, NULL);
+               if (mw) {
+                       if (cphs_sim) {
+                               struct tel_sim_service_table *svct = tcore_sim_get_service_table(co_sim);
+                               if (!svct)
+                                       break;
+                               if ((sim_type == SIM_TYPE_GSM && svct->table.sst.service[SIM_SST_MWIS]) || (sim_type == SIM_TYPE_USIM && svct->table.ust.service[SIM_UST_MWIS])) {
+                                       if (mw->b_cphs == FALSE)
+                                               ef = SIM_EF_USIM_MWIS;
+                                       else
+                                               ef = SIM_EF_CPHS_VOICE_MSG_WAITING;
+
+                                       tcore_user_request_set_metainfo(ur, sizeof(struct imc_sim_property), &meta_info);
+                                       ret_code = _get_file_info(co_sim, ur, ef);
+                               } else {
+                                       dbg("Service not available in SST/UST - Updating CPHS file : File ID[0x%x]", SIM_EF_CPHS_VOICE_MSG_WAITING);
+                                       ret_code = _get_file_info(co_sim, ur, SIM_EF_CPHS_VOICE_MSG_WAITING);
+                               }
+                               free(svct);
+                               } else {
+                                       ret_code = _get_file_info(co_sim, ur, SIM_EF_USIM_MWIS);
+                       }
+               } else{
+                       ret_code = TCORE_RETURN_EINVAL;
+               }
+       }
+       break;
+
+       default:
+               err("Unhandled UPDATE command[%d]", command);
+               return TCORE_RETURN_EINVAL;
+       }
+
+       return ret_code;
 }
 
-static TelReturn imc_sim_req_apdu (CoreObject *co, const TelSimApdu *request, TcoreObjectResponseCallback cb, void *cb_data)
+static TReturn imc_transmit_apdu(CoreObject *o, UserRequest *ur)
 {
-       gchar *cmd_str = NULL;
+       const struct treq_sim_transmit_apdu *req_data;
+       TcoreHal *hal = NULL;
+       char *cmd_str = NULL;
        char *apdu = NULL;
-       ImcRespCbData *resp_cb_data = NULL;
-       TelReturn ret = TEL_RETURN_FAILURE;
+       int result = 0;
+       TReturn ret = TCORE_RETURN_FAILURE;
 
        dbg("Entry");
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data, NULL, 0);
+       if ((o == NULL) || (ur == NULL))
+               return TCORE_RETURN_EINVAL;
+
+       hal = tcore_object_get_hal(o);
+       if (FALSE == tcore_hal_get_power_state(hal)) {
+               err("CP NOT READY");
+               return TCORE_RETURN_ENOSYS;
+       }
 
-       apdu = (char *)tcore_malloc0((2 * request->apdu_len) + 1);
-       tcore_util_byte_to_hex((char *)request->apdu, apdu, request->apdu_len);
+       req_data = tcore_user_request_ref_data(ur, NULL);
 
-       cmd_str = g_strdup_printf("AT+CSIM=%d,\"%s\"", strlen((const char *)apdu), apdu);
+       apdu = (char *)g_try_malloc0((2 * req_data->apdu_length) + 1);
+       if (apdu == NULL) {
+               err("Memory allocation failed!!");
+               return TCORE_RETURN_ENOMEM;
+       }
+       result = util_byte_to_hex((const char *)req_data->apdu, apdu, req_data->apdu_length);
+       dbg("result %d", result);
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, "+CSIM:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               on_response_imc_sim_req_apdu, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Request APDU");
+       cmd_str = g_strdup_printf("AT+CSIM=%d, \"%s\"", strlen(apdu), apdu);
 
+       ret = tcore_prepare_and_send_at_request(o, cmd_str, "+CSIM:",
+                                                               TCORE_AT_SINGLELINE, ur,
+                                                               on_response_transmit_apdu, hal,
+                                                               NULL, NULL, 0, NULL, NULL);
        g_free(cmd_str);
        g_free(apdu);
 
@@ -3883,96 +4285,147 @@ static TelReturn imc_sim_req_apdu (CoreObject *co, const TelSimApdu *request, Tc
        return ret;
 }
 
-static TelReturn imc_sim_req_atr (CoreObject *co, TcoreObjectResponseCallback cb, void *cb_data)
+static TReturn imc_get_atr(CoreObject *o, UserRequest *ur)
+{
+       TcoreHal *hal = NULL;
+
+       dbg("Entry");
+
+       if ((o == NULL) || (ur == NULL)) {
+               err("Invalid parameters");
+               return TCORE_RETURN_EINVAL;
+       }
+
+       hal = tcore_object_get_hal(o);
+       if (FALSE == tcore_hal_get_power_state(hal)) {
+               err("CP NOT READY");
+               return TCORE_RETURN_ENOSYS;
+       }
+
+       return tcore_prepare_and_send_at_request(o, "AT+XGATR", "+XGATR:",
+                                                               TCORE_AT_SINGLELINE, ur,
+                                                               on_response_get_atr, hal,
+                                                               NULL, NULL, 0, NULL, NULL);
+}
+
+static TReturn imc_req_authentication(CoreObject *co, UserRequest *ur)
 {
-       gchar *cmd_str = NULL;
-       ImcRespCbData *resp_cb_data = NULL;
-       TelReturn ret = TEL_RETURN_FAILURE;
+       const struct treq_sim_req_authentication *req_data;
+       char *cmd_str = NULL;
+       enum tel_sim_type sim_type;
+       int session_id;
+       int context_type;
+       TReturn ret = TCORE_RETURN_FAILURE;
+       char *convert_rand = NULL;
+       char *convert_autn = NULL;
 
        dbg("Entry");
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data, NULL, 0);
+       req_data = tcore_user_request_ref_data(ur, NULL);
+       if (req_data == NULL) {
+               err("req_data is NULL");
+               return ret;
+       }
+
+       convert_rand = util_hex_to_string(req_data->rand_data, strlen(req_data->rand_data));
+       dbg("Convert RAND hex to string: [%s]", convert_rand);
+
+       sim_type = tcore_sim_get_type(co);
+       switch (sim_type) {
+       case SIM_TYPE_GSM:
+       case SIM_TYPE_USIM:
+               session_id = 0;
+               break;
+       default:
+               err("Not supported");
+               ret = TCORE_RETURN_ENOSYS;
+               goto out;
+       }
+
+       switch (req_data->auth_type) {
+       case SIM_AUTH_TYPE_GSM:
+               context_type = 2;
+               cmd_str = g_strdup_printf("AT+XAUTH=%d, %d, \"%s\"", session_id,
+                                               context_type, convert_rand);
+               break;
+       case SIM_AUTH_TYPE_3G:
+               context_type = 1;
+               convert_autn = util_hex_to_string(req_data->autn_data, strlen(req_data->autn_data));
+               dbg("Convert AUTN hex to string: [%s]", convert_autn);
 
-       cmd_str = g_strdup_printf("AT+XGATR");
+               cmd_str = g_strdup_printf("AT+XAUTH=%d, %d, \"%s\", \"%s\"",
+                                               session_id, context_type,
+                                               convert_rand, convert_autn);
+               break;
+       default:
+               err("Not supported");
+               ret = TCORE_RETURN_ENOSYS;
+               goto out;
+       }
 
-       ret = tcore_at_prepare_and_send_request(co,
-               cmd_str, "+XGATR:",
-               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               NULL,
-               on_response_imc_sim_req_atr, resp_cb_data,
-               on_send_imc_request, NULL);
-       IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Request ATR");
+       ret = tcore_prepare_and_send_at_request(co, cmd_str, "+XAUTH",
+                       TCORE_AT_SINGLELINE, ur,
+                       on_response_req_authentication, NULL, NULL, NULL, 0, NULL, NULL);
 
+out:
        g_free(cmd_str);
+       g_free(convert_rand);
+       g_free(convert_autn);
 
-       dbg("Exit");
        return ret;
 }
 
 /* SIM Operations */
-static TcoreSimOps imc_sim_ops = {
-       .get_imsi = imc_sim_get_imsi,
-       .get_ecc = imc_sim_get_ecc,
-       .get_iccid = imc_sim_get_iccid,
-       .get_language = imc_sim_get_language,
-       .set_language = imc_sim_set_language,
-       .get_callforwarding_info = imc_sim_get_callforwarding_info,
-       .get_messagewaiting_info = imc_sim_get_messagewaiting_info,
-       .set_messagewaiting_info = imc_sim_set_messagewaiting_info,
-       .get_mailbox_info = imc_sim_get_mailbox_info,
-       .set_mailbox_info = imc_sim_set_mailbox_info,
-       .get_msisdn = imc_sim_get_msisdn,
-       .get_spn = imc_sim_get_spn,
-       .get_cphs_netname = imc_sim_get_cphs_netname,
-       .get_sp_display_info = imc_sim_get_sp_display_info,
-       .req_authentication = imc_sim_req_authentication,
-       .verify_pins = imc_sim_verify_pins,
-       .verify_puks = imc_sim_verify_puks,
-       .change_pins = imc_sim_change_pins,
-       .disable_facility = imc_sim_disable_facility,
-       .enable_facility = imc_sim_enable_facility,
-       .get_facility = imc_sim_get_facility,
-       .get_lock_info = imc_sim_get_lock_info,
-       .req_apdu = imc_sim_req_apdu,
-       .req_atr = imc_sim_req_atr
+static struct tcore_sim_operations sim_ops = {
+       .verify_pins = imc_verify_pins,
+       .verify_puks = imc_verify_puks,
+       .change_pins = imc_change_pins,
+       .get_facility_status = imc_get_facility_status,
+       .enable_facility = imc_enable_facility,
+       .disable_facility = imc_disable_facility,
+       .get_lock_info = imc_get_lock_info,
+       .read_file = imc_read_file,
+       .update_file = imc_update_file,
+       .transmit_apdu = imc_transmit_apdu,
+       .get_atr = imc_get_atr,
+       .req_authentication = imc_req_authentication,
+       .set_powerstate = NULL,
 };
 
-gboolean imc_sim_init(TcorePlugin *p, CoreObject *co)
+gboolean imc_sim_init(TcorePlugin *cp, CoreObject *co_sim)
 {
-       ImcSimPrivateInfo *priv_info = NULL;
+       struct imc_sim_property *meta_info;
 
        dbg("Entry");
 
-       priv_info = g_try_new0(ImcSimPrivateInfo, 1);
-       if (priv_info == NULL)
-               return FALSE;
+       /* Set operations */
+       tcore_sim_set_ops(co_sim, &sim_ops, TCORE_OPS_TYPE_CP);
 
-       tcore_sim_link_userdata(co, priv_info);
+       meta_info = g_try_new0(struct imc_sim_property, 1);
+       if (meta_info == NULL)
+               return FALSE;
 
-       /* Set operations */
-       tcore_sim_set_ops(co, &imc_sim_ops);
+       tcore_sim_link_userdata(co_sim, meta_info);
 
-       /* Add Callbacks */
-       tcore_object_add_callback(co, "+XSIM:",
-               on_notification_imc_sim_status, NULL);
+       tcore_object_add_callback(co_sim, "+XLOCK:",
+                                                       on_event_facility_lock_status, NULL);
+       tcore_object_add_callback(co_sim, "+XSIM:",
+                                                       on_event_pin_status, NULL);
 
-       /* Hooks */
-       tcore_plugin_add_notification_hook(p,
-               TCORE_NOTIFICATION_MODEM_POWER,
-               on_hook_imc_modem_power, co);
+       tcore_server_add_notification_hook(tcore_plugin_ref_server(cp),
+                                                       TNOTI_MODEM_POWER, on_hook_modem_power, co_sim);
 
        dbg("Exit");
+
        return TRUE;
 }
 
-void imc_sim_exit(TcorePlugin *plugin, CoreObject *co)
+void imc_sim_exit(TcorePlugin *cp, CoreObject *co_sim)
 {
-       ImcSimPrivateInfo *priv_info = NULL;
-
-       dbg("Entry");
+       struct imc_sim_property *meta_info;
 
-       priv_info = tcore_sim_ref_userdata(co);
-       g_free(priv_info);
+       meta_info = tcore_sim_ref_userdata(co_sim);
+       g_free(meta_info);
 
        dbg("Exit");
 }