diff --git a/mbtk/liblynq_lib/src/lynq_gnss.c b/mbtk/liblynq_lib/src/lynq_gnss.c
index c0dfc14..2bb1fc1 100755
--- a/mbtk/liblynq_lib/src/lynq_gnss.c
+++ b/mbtk/liblynq_lib/src/lynq_gnss.c
@@ -12,7 +12,7 @@
 
 /**********************************VARIABLE***********************************/
 static bool inited = FALSE;
-static uint32_t qser_h_sim = 0x5F6F7F8F;
+static uint32_t qser_h_gnss = 0x5F6F7F8F;
 gnss_handler_func_t qser_gnss_callback = NULL;
 static time_t qser_gnss_time = 0;
 qser_agps_info qser_agps_info_save = {0};
@@ -125,7 +125,7 @@
 {
     qser_gnss_error_e state = QSER_GNSS_ERROR_SUCCESS;
     gnss_async_func_t cb = qser_gnss_async_get_cb();
-    int ret = qser_Gnss_Start(qser_h_sim);
+    int ret = qser_Gnss_Start(qser_h_gnss);
     if(ret != QSER_RESULT_SUCCESS)
     {
         LOGE("[qser_gnss] gnss_async_thread() fail.");
@@ -212,7 +212,7 @@
             return QSER_RESULT_FAIL;
         }
     }
-    *h_gnss = qser_h_sim;
+    *h_gnss = qser_h_gnss;
 
     return QSER_RESULT_SUCCESS;
 }
@@ -220,36 +220,38 @@
 int qser_Gnss_Deinit (uint32_t h_gnss)
 {
     //UNUSED(h_gnss);
-    if(h_gnss != qser_h_sim)
+    if(h_gnss != qser_h_gnss)
     {
-        LOGE("[qser_gnss] h_sim is error.");
+        LOGE("[qser_gnss] h_gnss is error.");
         return QSER_RESULT_FAIL;
     }
     
     gnss_err_enum ret = GNSS_ERR_UNKNOWN;
 
-    ret = mbtk_gnss_deinit();
-    if(ret == GNSS_ERR_OK)
+    if(inited)
     {
-        inited = FALSE;
-    }
-    else
-    {
-        LOGE("[qser_gnss] mbtk_gnss_init() fail.");
-        return QSER_RESULT_FAIL;
+        ret = mbtk_gnss_deinit();
+        if(ret == GNSS_ERR_OK)
+        {
+            inited = FALSE;
+        }
+        else
+        {
+            LOGE("[qser_gnss] mbtk_gnss_init() fail.");
+            return QSER_RESULT_FAIL;
+        }
     }
 
     return QSER_RESULT_SUCCESS;
 }
 
-
 int qser_AddRxIndMsgHandler (gnss_handler_func_t handler_ptr,uint32_t h_gnss)
 {
     //UNUSED(handler_ptr);
     //UNUSED(h_gnss);
-    if(h_gnss != qser_h_sim)
+    if(h_gnss != qser_h_gnss)
     {
-        LOGE("[qser_gnss] h_sim is error.");
+        LOGE("[qser_gnss] h_gnss is error.");
         return QSER_RESULT_FAIL;
     }
 
@@ -263,14 +265,13 @@
     return QSER_RESULT_SUCCESS;
 }
 
-
 int qser_Set_Indications (uint32_t h_gnss,e_msg_id_t type)
 {
     //UNUSED(h_gnss);
     //UNUSED(type);
-    if(h_gnss != qser_h_sim)
+    if(h_gnss != qser_h_gnss)
     {
-        LOGE("[qser_gnss] h_sim is error.");
+        LOGE("[qser_gnss] h_gnss is error.");
         return QSER_RESULT_FAIL;
     }
 
@@ -303,13 +304,12 @@
     return QSER_RESULT_SUCCESS;
 }
 
-
 int qser_Gnss_Start (uint32_t h_gnss)
 {
     //UNUSED(h_gnss);
-    if(h_gnss != qser_h_sim)
+    if(h_gnss != qser_h_gnss)
     {
-        LOGE("[qser_gnss] h_sim is error.");
+        LOGE("[qser_gnss] h_gnss is error.");
         return QSER_RESULT_FAIL;
     }
 
@@ -325,14 +325,12 @@
     return QSER_RESULT_SUCCESS;
 }
 
-
-
 int qser_Gnss_Start_Async(uint32_t h_gnss)
 {
     //UNUSED(h_gnss);
-    if(h_gnss != qser_h_sim)
+    if(h_gnss != qser_h_gnss)
     {
-        LOGE("[qser_gnss] h_sim is error.");
+        LOGE("[qser_gnss] h_gnss is error.");
         return QSER_RESULT_FAIL;
     }
 
@@ -356,13 +354,12 @@
     return QSER_RESULT_SUCCESS;
 }
 
-
 int qser_Gnss_Stop (uint32_t h_gnss)
 {
     //UNUSED(h_gnss);
-    if(h_gnss != qser_h_sim)
+    if(h_gnss != qser_h_gnss)
     {
-        LOGE("[qser_gnss] h_sim is error.");
+        LOGE("[qser_gnss] h_gnss is error.");
         return QSER_RESULT_FAIL;
     }
 
@@ -379,65 +376,29 @@
 
 int qser_Gnss_InjectTime (uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info)
 {
-    UNUSED(h_gnss);
+    //UNUSED(h_gnss);
     UNUSED(time_info);
 
-    return 0;
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
 }
 
-/*
 int qser_Gnss_Delete_Aiding_Data (uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags)
 {
     //UNUSED(h_gnss);
     //UNUSED(flags);
     
-    if(h_gnss != qser_h_sim)
+    if(h_gnss != qser_h_gnss)
     {
-        LOGE("[qser_gnss] h_sim is error.");
-        return QSER_RESULT_FAIL;
-    }
-
-    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
-    char param_buf[32] = {0};
-    int  length = 0;
-
-    switch(flags)
-    {
-        case DELETE_NOTHING:
-        {
-            memcpy(param_buf, "RESET,1", strlen("RESET,1"));
-            break;
-        }
-        case DELETE_EPHEMERIS:
-        case DELETE_ALMANAC:
-        case DELETE_POSITION_TIME:
-        case DELETE_UTC:
-        {
-            memcpy(param_buf, "RESET,2", strlen("RESET,2"));
-            break;
-        }
-        case DELETE_ALL:
-        {
-            memcpy(param_buf, "RESET,3", strlen("RESET,3"));
-            break;
-        }
-        default:
-        {
-            LOGE("[qser_gnss] flags UNKOWN.");
-            return QSER_RESULT_FAIL;
-        }
-    }
-
-    length = strlen(param_buf);
-    ret = mbtk_gnss_param_config(param_buf, length);
-    if(ret != MBTK_GNSS_RESULT_SUCCESS)
-    {
-        LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
+        LOGE("[qser_gnss] h_gnss is error.");
         return QSER_RESULT_FAIL;
     }
     return QSER_RESULT_SUCCESS;
 }
-*/
 
 int qser_Gnss_Server_Configuration(char *host, char *id, char *password)
 {
@@ -445,6 +406,12 @@
     //UNUSED(id);
     //UNUSED(password);
 
+    if(!inited)
+    {
+        LOGE("[qser_gnss] api not init.");
+        return QSER_RESULT_FAIL;
+    }
+    
     if(host != NULL)
     {
         memcpy(qser_agps_info_save.host, host, QSER_LEN_MAX);
@@ -462,28 +429,36 @@
     return QSER_RESULT_SUCCESS;
 }
 
-
-int qser_Gnss_download(const char *fw_path, int timeout)
+int qser_Gnss_download_tle()
 {
-    gnss_err_enum ret = GNSS_ERR_UNKNOWN;    
-    ret = mbtk_gnss_dl(fw_path, timeout);
-    if(ret != GNSS_ERR_OK)
+    if(!inited)
     {
-        LOGE("[qser_gnss] mbtk_gnss_download  is error.");
+        LOGE("[qser_gnss] api not init.");
         return QSER_RESULT_FAIL;
     }
     return QSER_RESULT_SUCCESS;
 }
 
-/*
+int qser_Gnss_injectEphemeris(uint32_t h_gnss)
+{
+    //UNUSED(h_gnss);
+
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
 int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency)
 {
     //UNUSED(h_gnss);
     //UNUSED(frequency);
 
-    if(h_gnss != qser_h_sim)
+    if(h_gnss != qser_h_gnss)
     {
-        LOGE("[qser_gnss] h_sim is error.");
+        LOGE("[qser_gnss] h_gnss is error.");
         return QSER_RESULT_FAIL;
     }
 
@@ -496,16 +471,15 @@
     gnss_err_enum ret = GNSS_ERR_UNKNOWN;    
     char param_buf[32] = {0};
     int  length = 0;
-    length = snprintf(param_buf, 32, "NAVISYSCFG,7,%d", frequency);
-    ret = mbtk_gnss_dl(param_buf, length);
-    if(ret != MBTK_GNSS_RESULT_SUCCESS)
+    length = snprintf(param_buf, 32, "$FREQCFG,%d", frequency);
+    ret = mbtk_gnss_setting(param_buf, QSER_GNSS_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
     {
-        LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
+        LOGE("[qser_gnss] mbtk_gnss_setting fail.");
         return QSER_RESULT_FAIL;
     }
     return QSER_RESULT_SUCCESS;
 }
-*/
 /**********************************API***********************************/
 
 
