diff --git a/dap_chain_global_db.h b/dap_chain_global_db.h
index 17a9aae76976d9e63ec4e63ad74dc89e060fa155..381b3ac9687fc144c12e8f8c3835436982dfd8d8 100755
--- a/dap_chain_global_db.h
+++ b/dap_chain_global_db.h
@@ -15,6 +15,7 @@
 #define GROUP_LOCAL_GENERAL "local.general"
 
 typedef struct dap_global_db_obj {
+    uint64_t id;
     char *key;
     uint8_t *value;
     size_t value_len;
@@ -104,10 +105,10 @@ void* dap_db_log_unpack(const void *a_data, size_t a_data_size, size_t *a_store_
 // Get timestamp from dap_db_log_pack()
 //time_t dap_db_log_unpack_get_timestamp(uint8_t *a_data, size_t a_data_size);
 
-// Get last timestamp in log
-time_t dap_db_log_get_last_timestamp(void);
+// Get last id in log
+uint64_t dap_db_log_get_last_id(void);
 // Get log diff as list
-dap_list_t* dap_db_log_get_list(time_t first_timestamp);
+dap_list_t* dap_db_log_get_list(uint64_t first_id);
 // Free list getting from dap_db_log_get_list()
 void dap_db_log_del_list(dap_list_t *a_list);
 // Get log diff as string
diff --git a/dap_chain_global_db_driver.c b/dap_chain_global_db_driver.c
index 0ffefe6a1104d27aa5a74846f04d8397a6673516..745887fb89122b3bd34029b4f2ce7cb6a5aaa3bc 100755
--- a/dap_chain_global_db_driver.c
+++ b/dap_chain_global_db_driver.c
@@ -176,7 +176,7 @@ void dap_store_obj_free(dap_store_obj_t *a_store_obj, size_t a_store_count)
 static size_t dap_db_get_size_pdap_store_obj_t(pdap_store_obj_t store_obj)
 {
     size_t size = sizeof(uint32_t) + 2 * sizeof(uint16_t) + sizeof(size_t) + sizeof(time_t)
-            + dap_strlen(store_obj->group) +
+            + sizeof(uint64_t) + dap_strlen(store_obj->group) +
             dap_strlen(store_obj->key) + store_obj->value_len;
     return size;
 }
@@ -220,6 +220,8 @@ dap_store_obj_pkt_t *dap_store_packet_multiple(pdap_store_obj_t a_store_obj, tim
         l_offset += sizeof(uint16_t);
         memcpy(l_pkt->data + l_offset, obj.group, group_size);
         l_offset += group_size;
+        memcpy(l_pkt->data + l_offset, &obj.id, sizeof(uint64_t));
+        l_offset += sizeof(uint64_t);
         memcpy(l_pkt->data + l_offset, &obj.timestamp, sizeof(time_t));
         l_offset += sizeof(time_t);
         memcpy(l_pkt->data + l_offset, &key_size, sizeof(uint16_t));
@@ -267,6 +269,9 @@ dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, siz
         memcpy(obj->group, pkt->data + offset, str_size);
         offset += str_size;
 
+        memcpy(&obj->id, pkt->data + offset, sizeof(uint64_t));
+        offset += sizeof(uint64_t);
+
         memcpy(&obj->timestamp, pkt->data + offset, sizeof(time_t));
         offset += sizeof(time_t);
 
diff --git a/dap_chain_global_db_driver_sqlite.c b/dap_chain_global_db_driver_sqlite.c
index d9f7251a4d3b3d74a315577dc2d9014832abface..626506289758ac959151d7686477679c8abdb25f 100755
--- a/dap_chain_global_db_driver_sqlite.c
+++ b/dap_chain_global_db_driver_sqlite.c
@@ -451,16 +451,16 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
     char *l_error_message = NULL;
     if(a_store_obj->type == 'a') {
         if(!a_store_obj->key || !a_store_obj->value || !a_store_obj->value_len)
-                return -1;
-        dap_chain_hash_fast_t l_hash;
-        dap_hash_fast(a_store_obj->value, a_store_obj->value_len, &l_hash);
+            return -1;
+        //dap_chain_hash_fast_t l_hash;
+        //dap_hash_fast(a_store_obj->value, a_store_obj->value_len, &l_hash);
 
-        char *l_blob_hash = dap_db_driver_get_string_from_blob((uint8_t*) &l_hash, sizeof(dap_chain_hash_fast_t));
+        char *l_blob_hash = ""; //dap_db_driver_get_string_from_blob((uint8_t*) &l_hash, sizeof(dap_chain_hash_fast_t));
         char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, a_store_obj->value_len);
         //add one record
         l_query = sqlite3_mprintf("insert into '%s' values(NULL, '%s', x'%s', '%lld', x'%s')",
                 a_store_obj->group, a_store_obj->key, l_blob_hash, a_store_obj->timestamp, l_blob_value);
-        dap_db_driver_sqlite_free(l_blob_hash);
+        //dap_db_driver_sqlite_free(l_blob_hash);
         dap_db_driver_sqlite_free(l_blob_value);
     }
     else if(a_store_obj->type == 'd') {
@@ -476,27 +476,41 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
         log_it(L_ERROR, "Unknown store_obj type '0x%x'", a_store_obj->type);
         return -1;
     }
-    int l_ret = dap_db_driver_sqlite_exec(s_db, l_query, NULL);
-    // missing database
+    // execute request
+    int l_ret = dap_db_driver_sqlite_exec(s_db, l_query, &l_error_message);
     if(l_ret == SQLITE_ERROR) {
+        dap_db_driver_sqlite_free(l_error_message);
+        l_error_message = NULL;
         // create table
         dap_db_driver_sqlite_create_group_table(a_store_obj->group);
+        // repeat request
         l_ret = dap_db_driver_sqlite_exec(s_db, l_query, &l_error_message);
+
     }
-    dap_db_driver_sqlite_free(l_query);
     // entry with the same hash is already present
     if(l_ret == SQLITE_CONSTRAINT) {
-        log_it(L_INFO, "Entry with the same key is already present, %s", l_error_message);
         dap_db_driver_sqlite_free(l_error_message);
-        return 0;
+        l_error_message = NULL;
+        //delete exist record
+        char *l_query_del = sqlite3_mprintf("delete from '%s' where key = '%s'", a_store_obj->group, a_store_obj->key);
+        l_ret = dap_db_driver_sqlite_exec(s_db, l_query_del, &l_error_message);
+        dap_db_driver_sqlite_free(l_query_del);
+        if(l_ret != SQLITE_OK) {
+            log_it(L_INFO, "Entry with the same key is already present and can't delete, %s", l_error_message);
+            dap_db_driver_sqlite_free(l_error_message);
+            l_error_message = NULL;
+        }
+        // repeat request
+        l_ret = dap_db_driver_sqlite_exec(s_db, l_query, &l_error_message);
     }
-    if(l_ret != SQLITE_OK)
-    {
+    // missing database
+    if(l_ret != SQLITE_OK) {
         log_it(L_ERROR, "sqlite apply error: %s", l_error_message);
         dap_db_driver_sqlite_free(l_error_message);
-        return -1;
+        l_ret = -1;
     }
-    return 0;
+    dap_db_driver_sqlite_free(l_query);
+    return l_ret;
 }
 
 static void fill_one_item(const char *a_group, dap_store_obj_t *a_obj, SQLITE_ROW_VALUE *a_row)
diff --git a/dap_chain_global_db_hist.c b/dap_chain_global_db_hist.c
index b3704aa2c6f29b8ddeb944bf9e0afa5d79823b27..8d63d2c949dc5f3ec942aa31400cbf09bf2f2508 100755
--- a/dap_chain_global_db_hist.c
+++ b/dap_chain_global_db_hist.c
@@ -73,11 +73,14 @@ uint8_t* dap_db_log_pack(dap_global_db_obj_t *a_obj, size_t *a_data_size_out)
     while(l_keys[i]) {
         dap_store_obj_t *l_obj = NULL;
         // add record - read record
-        if(l_rec.type == 'a')
+        if(l_rec.type == 'a'){
             l_obj = (dap_store_obj_t*) dap_chain_global_db_obj_get(l_keys[i], l_rec.group);
+            l_obj->id = a_obj->id;
+        }
         // delete record - save only key for record
         else if(l_rec.type == 'd') { // //section=strdup("kelvin_nodes");
             l_obj = (dap_store_obj_t*) DAP_NEW_Z(dap_store_obj_t);
+            l_obj->id = a_obj->id;
             l_obj->group = dap_strdup(l_rec.group);
             l_obj->key = dap_strdup(l_keys[i]);
         }
@@ -167,7 +170,7 @@ bool dap_db_history_truncate(void)
 /**
  * Get last timestamp in log
  */
-time_t dap_db_log_get_last_timestamp(void)
+uint64_t dap_db_log_get_last_id(void)
 {
     //dap_store_obj_t *l_last_obj = dap_chain_global_db_driver_read_last(
     dap_store_obj_t *l_last_obj = dap_chain_global_db_get_last(GROUP_LOCAL_HISTORY);
@@ -192,26 +195,27 @@ time_t dap_db_log_get_last_timestamp(void)
      return l_ret_time;*/
 }
 
-static int compare_items(const void * l_a, const void * l_b)
+/*static int compare_items(const void * l_a, const void * l_b)
 {
     const dap_global_db_obj_t *l_item_a = (const dap_global_db_obj_t*) l_a;
     const dap_global_db_obj_t *l_item_b = (const dap_global_db_obj_t*) l_b;
     int l_ret = strcmp(l_item_a->key, l_item_b->key);
     return l_ret;
-}
+}*/
 
 /**
  * Get log diff as list
  */
-dap_list_t* dap_db_log_get_list(time_t first_timestamp)
+dap_list_t* dap_db_log_get_list(uint64_t first_id)
 {
     dap_list_t *l_list = NULL;
     size_t l_data_size_out = 0;
-    dap_store_obj_t *l_objs = dap_chain_global_db_cond_load(GROUP_LOCAL_HISTORY, first_timestamp, &l_data_size_out);
+    dap_store_obj_t *l_objs = dap_chain_global_db_cond_load(GROUP_LOCAL_HISTORY, first_id, &l_data_size_out);
     //dap_global_db_obj_t **l_objs = dap_chain_global_db_gr_load(GROUP_LOCAL_HISTORY, first_timestamp, &l_data_size_out);
     for(size_t i = 0; i < l_data_size_out; i++) {
         dap_store_obj_t *l_obj_cur = l_objs + i;
         dap_global_db_obj_t *l_item = DAP_NEW(dap_global_db_obj_t);
+        l_item->id = l_obj_cur->id;
         l_item->key = dap_strdup(l_obj_cur->key);
         l_item->value = (uint8_t*) dap_strdup((char*) l_obj_cur->value);
         l_list = dap_list_append(l_list, l_item);