diff --git a/dap-sdk/core/src/dap_config.c b/dap-sdk/core/src/dap_config.c
index f848b34867036fd722f2ed411a47f52c998983cc..fea4cf8e0dadae744a13b357e12ee3cd36c5e641 100755
--- a/dap-sdk/core/src/dap_config.c
+++ b/dap-sdk/core/src/dap_config.c
@@ -595,7 +595,16 @@ const char * dap_config_get_item_str_default(dap_config_t * a_config, const char
  */
 bool dap_config_get_item_bool(dap_config_t * a_config, const char * a_section_path, const char * a_item_name)
 {
-    return strcmp(dap_config_get_item_str(a_config,a_section_path,a_item_name),"true") == 0;
+char	*cp;
+
+    if ( !(cp = dap_config_get_item_str(a_config, a_section_path, a_item_name)) )
+        return	false;
+
+#ifdef	WIN32
+    return	!strnicmp (cp, "true", 4);
+#else
+    return	!strncasecmp (cp, "true", 4);	/* 0 == True */
+#endif
 }
 
 
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 4eccc38e970fcb3c2099a915ca887ad6e51850c8..b52e5a9669813331319200a916e9152e926908db 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -252,7 +252,7 @@ void dap_chain_ledger_deinit()
 /**
  * @brief dap_chain_ledger_handle_new
  * Create empty dap_ledger_t structure
- * @return dap_ledger_t* 
+ * @return dap_ledger_t*
  */
 static dap_ledger_t * dap_chain_ledger_handle_new(void)
 {
@@ -272,7 +272,7 @@ static dap_ledger_t * dap_chain_ledger_handle_new(void)
 /**
  * @brief dap_chain_ledger_handle_free
  * Remove dap_ledger_t structure
- * @param a_ledger 
+ * @param a_ledger
  */
 void dap_chain_ledger_handle_free(dap_ledger_t *a_ledger)
 {
@@ -374,16 +374,15 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *
     pthread_rwlock_wrlock(&PVT(a_ledger)->tokens_rwlock);
     HASH_ADD_STR(PVT(a_ledger)->tokens, ticker, l_token_item);
     pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
+
     // Add it to cache
-    dap_chain_datum_token_t *l_token_cache = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, a_token_size);
-    memcpy(l_token_cache, a_token, a_token_size);
     char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TOKENS_STR);
-    if (!dap_chain_global_db_gr_set(dap_strdup(a_token->ticker), l_token_cache, a_token_size, l_gdb_group)) {
+    if (!dap_chain_global_db_gr_set( a_token->ticker, a_token, a_token_size, l_gdb_group)) {
         if(s_debug_more)
             log_it(L_WARNING, "Ledger cache mismatch");
-        DAP_DELETE(l_token_cache);
     }
     DAP_DELETE(l_gdb_group);
+
     l_token_item->type = a_token->type;
     switch(a_token->type){
         case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: {// 256
@@ -453,12 +452,12 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *
 
 /**
  * @brief s_token_tsd_parse
- * 
- * @param a_ledger 
- * @param a_token_item 
- * @param a_token 
- * @param a_token_size 
- * @return int 
+ *
+ * @param a_ledger
+ * @param a_token_item
+ * @param a_token
+ * @param a_token_size
+ * @return int
  */
 static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_item_t *a_token_item , dap_chain_datum_token_t * a_token, size_t a_token_size)
 {
@@ -492,7 +491,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite
 
             // set total supply
             case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256:{ // 256
-                a_token_item->total_supply = dap_tsd_get_scalar(l_tsd,uint256_t); 
+                a_token_item->total_supply = dap_tsd_get_scalar(l_tsd,uint256_t);
             }break;
 
             case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY:{ // 128
@@ -927,7 +926,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger)
             case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256
             case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
                 l_type_str = "SIMPLE"; break;
-            case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256
             case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL:
                 l_type_str = "PRIVATE_DECL"; break;
             case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256
@@ -958,7 +957,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger)
  * @param a_ledger
  */
 static void s_treshold_emissions_proc(dap_ledger_t * a_ledger)
-{ 
+{
     bool l_success;
     do {
         l_success = false;
@@ -979,7 +978,7 @@ static void s_treshold_emissions_proc(dap_ledger_t * a_ledger)
             pthread_rwlock_rdlock(&PVT(a_ledger)->treshold_emissions_rwlock);
         }
         pthread_rwlock_unlock(&PVT(a_ledger)->treshold_emissions_rwlock);
-    } while (l_success); 
+    } while (l_success);
 }
 
 /**
@@ -987,7 +986,7 @@ static void s_treshold_emissions_proc(dap_ledger_t * a_ledger)
  * @param a_ledger
  */
 static void s_treshold_txs_proc( dap_ledger_t *a_ledger)
-{  
+{
     bool l_success;
     dap_ledger_private_t * l_ledger_pvt = PVT(a_ledger);
     pthread_rwlock_rdlock(&l_ledger_pvt->treshold_txs_rwlock);
@@ -1107,7 +1106,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
     for (size_t i = 0; i < l_objs_count; i++) {
         dap_ledger_wallet_balance_t *l_balance_item = DAP_NEW_Z(dap_ledger_wallet_balance_t);
         size_t l_v0_size = sizeof(uint128_t); // for old data
-        
+
         l_balance_item->key = DAP_NEW_Z_SIZE(char, strlen(l_objs[i].key) + 1);
         strcpy(l_balance_item->key, l_objs[i].key);
         char *l_ptr = strchr(l_balance_item->key, ' ');
@@ -1127,7 +1126,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
 }
 
 /**
- * @brief 
+ * @brief
  * create ledger for specific net
  * load ledger cache
  * @param a_check_flags checking flags
@@ -1135,7 +1134,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
  *          DAP_CHAIN_LEDGER_CHECK_CELLS_DS
  *          DAP_CHAIN_LEDGER_CHECK_CELLS_DS
  * @param a_net_name char * network name, for example "kelvin-testnet"
- * @return dap_ledger_t* 
+ * @return dap_ledger_t*
  */
 dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags, char *a_net_name)
 {
@@ -2188,34 +2187,41 @@ int dap_chain_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *
 static int s_balance_cache_update(dap_ledger_t *a_ledger, dap_ledger_wallet_balance_t *a_balance)
 {
     char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_BALANCES_STR);
-    uint256_t *l_balance_value = DAP_NEW_Z(uint256_t);
-    *l_balance_value = a_balance->balance;
-    if (!dap_chain_global_db_gr_set(dap_strdup(a_balance->key), l_balance_value, sizeof(uint256_t), l_gdb_group)) {
+
+    if (!dap_chain_global_db_gr_set(a_balance->key, &a_balance->balance, sizeof(uint256_t), l_gdb_group)) {
         if(s_debug_more)
             log_it(L_WARNING, "Ledger cache mismatch");
-        DAP_DELETE(l_balance_value);
         return -1;
     }
+
     DAP_DELETE(l_gdb_group);
     return 0;
 }
 
 static int s_tx_cache_update(dap_ledger_t *a_ledger, dap_chain_ledger_tx_item_t *a_item)
 {
-    size_t l_tx_size = dap_chain_datum_tx_get_size(a_item->tx);
-    uint8_t *l_tx_cache = DAP_NEW_Z_SIZE(uint8_t, l_tx_size + sizeof(a_item->cache_data));
+    int    rc;
+
+    size_t l_tx_size = dap_chain_datum_tx_get_size(a_item->tx),
+            l_tx_cache_sz = l_tx_size + sizeof(a_item->cache_data);
+
+    uint8_t *l_tx_cache = DAP_NEW_Z_SIZE(uint8_t, l_tx_cache_sz);
     memcpy(l_tx_cache, &a_item->cache_data, sizeof(a_item->cache_data));
     memcpy(l_tx_cache + sizeof(a_item->cache_data), a_item->tx, l_tx_size);
+
     char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_STR);
     char *l_tx_hash_str = dap_chain_hash_fast_to_str_new(&a_item->tx_hash_fast);
-    if (!dap_chain_global_db_gr_set(l_tx_hash_str, l_tx_cache, l_tx_size + sizeof(a_item->cache_data), l_gdb_group)) {
+
+    if ( !(rc = dap_chain_global_db_gr_set(l_tx_hash_str, l_tx_cache, l_tx_cache_sz, l_gdb_group)) ) {
         if(s_debug_more)
             log_it(L_WARNING, "Ledger cache mismatch");
-        DAP_DELETE(l_tx_cache);
-        return -1;
     }
+
+    DAP_DELETE(l_tx_hash_str);
+    DAP_DELETE(l_tx_cache);
     DAP_DELETE(l_gdb_group);
-    return 0;
+
+    return (rc == true) ? 0 : -1;
 }
 
 /**
@@ -2306,7 +2312,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
         dap_chain_tx_item_type_t l_type = *(uint8_t *)l_item_in;
         dap_chain_ledger_tx_item_t *l_prev_item_out = bound_item->item_out;
         dap_chain_tx_item_type_t l_out_type = *(uint8_t *)l_prev_item_out;
-        
+
         if ( *l_prev_item_out->cache_data.token_ticker )
             l_ticker_trl = dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_ticker);
         else if ( l_out_type == TX_ITEM_TYPE_OUT_EXT) // 256
@@ -2565,11 +2571,12 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
         memcpy(l_tx_cache, &l_item_tmp->cache_data, sizeof(l_item_tmp->cache_data));
         memcpy(l_tx_cache + sizeof(l_item_tmp->cache_data), a_tx, l_tx_size);
         char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_STR);
-        if (!dap_chain_global_db_gr_set(dap_strdup(l_tx_hash_str), l_tx_cache, l_tx_size + sizeof(l_item_tmp->cache_data), l_gdb_group)) {
+        if (!dap_chain_global_db_gr_set( l_tx_hash_str, l_tx_cache, l_tx_size + sizeof(l_item_tmp->cache_data), l_gdb_group)) {
             if(s_debug_more)
                 log_it(L_WARNING, "Ledger cache mismatch");
-            DAP_DELETE(l_tx_cache);
         }
+
+        DAP_DELETE(l_tx_cache);
         DAP_DELETE(l_gdb_group);
         if (!a_from_threshold)
             s_treshold_txs_proc(a_ledger);        // TODO process thresholds only for non consensus chains
@@ -2636,7 +2643,9 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_
     if(l_item_tmp != NULL) {
         // Remove it from cache
         char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_STR);
-        dap_chain_global_db_gr_del(dap_chain_hash_fast_to_str_new(a_tx_hash), l_gdb_group);
+        char *l_tx_hash_str = dap_chain_hash_fast_to_str_new(a_tx_hash);
+        dap_chain_global_db_gr_del( l_tx_hash_str, l_gdb_group);
+        DAP_DELETE(l_tx_hash_str);
         DAP_DELETE(l_gdb_group);
         l_ret = 1;
         dap_chain_ledger_tx_spent_item_t *l_item_used;
@@ -2646,17 +2655,16 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_
             memcpy(&l_item_used->tx_hash_fast, a_tx_hash, sizeof(dap_chain_hash_fast_t));
             strncpy(l_item_used->token_ticker, l_item_tmp->cache_data.token_ticker, DAP_CHAIN_TICKER_SIZE_MAX);
             HASH_ADD(hh, l_ledger_priv->spent_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_item_used);
+
             // Add it to cache
-            char *l_cache_data = DAP_NEW_Z_SIZE(char, DAP_CHAIN_TICKER_SIZE_MAX);
-            strncpy(l_cache_data, l_item_used->token_ticker, DAP_CHAIN_TICKER_SIZE_MAX);
             l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_SPENT_TXS_STR);
             char *l_tx_hash_str = dap_hash_fast_to_str_new(a_tx_hash);
-            if (!dap_chain_global_db_gr_set(l_tx_hash_str, l_cache_data, -1, l_gdb_group)) {
+            if (!dap_chain_global_db_gr_set(l_tx_hash_str, l_item_used->token_ticker, -1, l_gdb_group)) {
                 if(s_debug_more)
                     log_it(L_WARNING, "Ledger cache mismatch");
-                DAP_DELETE(l_cache_data);
-                DAP_DELETE(l_tx_hash_str);
             }
+
+            DAP_DELETE(l_tx_hash_str);
             DAP_DELETE(l_gdb_group);
         }
         // del struct for hash
@@ -2684,7 +2692,7 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db)
     // delete transactions
     dap_chain_ledger_tx_item_t *l_item_current, *l_item_tmp;
     char *l_gdb_group;
-    HASH_ITER(hh, l_ledger_priv->ledger_items , l_item_current, l_item_tmp) {    
+    HASH_ITER(hh, l_ledger_priv->ledger_items , l_item_current, l_item_tmp) {
         HASH_DEL(l_ledger_priv->ledger_items, l_item_current);
         DAP_DELETE(l_item_current->tx);
         DAP_DELETE(l_item_current);
@@ -3235,14 +3243,14 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c
                     if (!l_out->header.value || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) {
                         continue;
                     }
-                    l_value = GET_256_FROM_64(l_out->header.value);   
+                    l_value = GET_256_FROM_64(l_out->header.value);
                 } break;
                 case TX_ITEM_TYPE_OUT_256: {
                     dap_chain_256_tx_out_t *l_out = (dap_chain_256_tx_out_t *)l_list_tmp->data;
                     if ( IS_ZERO_256(l_out->header.value) || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) {
                         continue;
                     }
-                    l_value = l_out->header.value;   
+                    l_value = l_out->header.value;
                 } break;
                 case TX_ITEM_TYPE_OUT_EXT: {
                     dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data;
diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
index 1feaa3c4b5d7bbde59fc2d286154661dc3dd8917..c14c975de1e166da78f188a1723b8f489c438f9b 100644
--- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
+++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
@@ -428,7 +428,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
                 dap_stream_ch_set_ready_to_write_unsafe(a_ch, false);
             } break;
 
-        	// only for server
+            // only for server
             case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_REQUEST:{
                 if (l_ch_pkt->hdr.size < sizeof(dap_stream_ch_chain_net_srv_pkt_request_hdr_t) ){
                     log_it( L_WARNING, "Wrong request size, less than minimum");
@@ -586,9 +586,11 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
                 // Store receipt if any problems with transactions
                 dap_chain_hash_fast_t l_receipt_hash={0};
                 dap_hash_fast(l_receipt,l_receipt_size,&l_receipt_hash);
+
                 char * l_receipt_hash_str = dap_chain_hash_fast_to_str_new(&l_receipt_hash);
                 dap_chain_global_db_gr_set( l_receipt_hash_str,l_receipt,l_receipt_size,"local.receipts");
-                l_receipt_hash_str = NULL; // To prevent usage of this pointer when it will be free by GDB processor
+                DAP_DELETE(l_receipt_hash_str);
+
                 size_t l_success_size;
                 dap_chain_hash_fast_t *l_tx_in_hash  = NULL;
                 if (!l_usage->is_grace) {
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index a6414b71d0039722ca3d84feb658478c3c68a6b5..c97c38f0a56f1a5c8ad702d2bb7bb24093115dd8 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -131,7 +131,7 @@ int dap_stream_ch_chain_init()
     s_debug_more = dap_config_get_item_bool_default(g_config,"stream_ch_chain","debug_more",false);
     s_update_pack_size = dap_config_get_item_int16_default(g_config,"stream_ch_chain","update_pack_size",100);
     s_list_ban_groups = dap_config_get_array_str(g_config, "stream_ch_chain", "ban_list_sync_groups", &s_size_ban_groups);
-	s_list_white_groups = dap_config_get_array_str(g_config, "stream_ch_chain", "white_list_sync_groups", &s_size_white_groups);
+    s_list_white_groups = dap_config_get_array_str(g_config, "stream_ch_chain", "white_list_sync_groups", &s_size_white_groups);
 
     return 0;
 }
@@ -337,7 +337,7 @@ static void s_sync_out_gdb_first_worker_callback(dap_worker_t *a_worker, void *a
     dap_chain_net_t *l_net = dap_chain_net_by_id(l_ch_chain->request_hdr.net_id);
 
     // Add it to outgoing list
-	if (l_ch_chain->request_db_log == NULL) l_ch_chain->request_db_log = l_sync_request->gdb.db_log;
+    if (l_ch_chain->request_db_log == NULL) l_ch_chain->request_db_log = l_sync_request->gdb.db_log;
     l_ch_chain->state = CHAIN_STATE_SYNC_GLOBAL_DB;
     dap_chain_node_addr_t l_node_addr = { 0 };
     l_node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
@@ -395,13 +395,13 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar
 {
     struct sync_request *l_sync_request = (struct sync_request *)a_arg;
     dap_chain_net_t *l_net = dap_chain_net_by_id(l_sync_request->request_hdr.net_id);
-	dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(DAP_STREAM_WORKER(l_sync_request->worker), l_sync_request->ch_uuid);
-	if (l_ch == NULL) {
-		log_it(L_INFO, "Client disconnected before we sent the reply");
-		s_sync_request_delete(l_sync_request);
+    dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(DAP_STREAM_WORKER(l_sync_request->worker), l_sync_request->ch_uuid);
+    if (l_ch == NULL) {
+        log_it(L_INFO, "Client disconnected before we sent the reply");
+        s_sync_request_delete(l_sync_request);
         return true;
-	}
-	dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
+    }
+    dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
 
     int l_flags = 0;
     if (dap_chain_net_get_add_gdb_group(l_net, l_sync_request->request.node_addr))
@@ -409,10 +409,10 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar
     if (!l_sync_request->request.id_start)
         l_flags |= F_DB_LOG_SYNC_FROM_ZERO;
     dap_db_log_list_t *l_db_log = NULL;
-	if (l_ch_chain->request_db_log == NULL) {
-		l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags);
-		l_ch_chain->request_db_log = l_db_log;
-	}
+    if (l_ch_chain->request_db_log == NULL) {
+        l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags);
+        l_ch_chain->request_db_log = l_db_log;
+    }
 
     if(l_db_log) {
         if (s_debug_more)
@@ -464,10 +464,10 @@ static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a
     if (!l_sync_request->request.id_start)
         l_flags |= F_DB_LOG_SYNC_FROM_ZERO;
     dap_db_log_list_t *l_db_log = NULL;
-	if (l_ch_chain->request_db_log == NULL) {
-		l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags);
-    	l_ch_chain->request_db_log = l_db_log;
-	}
+    if (l_ch_chain->request_db_log == NULL) {
+        l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags);
+        l_ch_chain->request_db_log = l_db_log;
+    }
     l_ch_chain->state = CHAIN_STATE_UPDATE_GLOBAL_DB;
     l_sync_request->request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
     dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_sync_update_gdb_start_worker_callback, l_sync_request);
@@ -665,7 +665,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
 
         uint64_t l_last_id = l_store_obj->id;
         char *l_last_group = l_store_obj->group;
-        char l_last_type = l_store_obj->type;
+        int l_last_type = l_store_obj->type;
         bool l_group_changed = false;
 
 
@@ -700,7 +700,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
                     (l_group_changed || i == l_data_obj_count - 1)) {
                 struct sync_request *l_sync_req_tsd = DAP_DUP(l_sync_request);
                 l_sync_req_tsd->request.id_end = l_last_id;
-                l_sync_req_tsd->gdb.sync_group = l_obj->type == 'a' ? dap_strdup(l_last_group) :
+                l_sync_req_tsd->gdb.sync_group = l_obj->type == DAP_DB$K_OPTYPE_ADD ? dap_strdup(l_last_group) :
                                                                       dap_strdup_printf("%s.del", l_last_group);
                 dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id,
                                                      s_gdb_sync_tsd_worker_callback, l_sync_req_tsd);
@@ -810,11 +810,11 @@ static bool s_chain_timer_callback(void *a_arg)
     if (!l_ch_chain->was_active) {
         if (l_ch_chain->state != CHAIN_STATE_IDLE) {
             dap_stream_ch_chain_go_idle(l_ch_chain);
-		}
+        }
         if (l_ch_chain->callback_notify_packet_out)
             l_ch_chain->callback_notify_packet_out(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_TIMEOUT, NULL, 0,
                                                    l_ch_chain->callback_notify_arg);
-		if (l_ch_chain->request_db_log) s_free_log_list_gdb(l_ch_chain);
+        if (l_ch_chain->request_db_log) s_free_log_list_gdb(l_ch_chain);
         DAP_DELETE(a_arg);
         l_ch_chain->activity_timer = NULL;
         return false;
@@ -1441,7 +1441,7 @@ static void s_free_log_list_gdb ( dap_stream_ch_chain_t * a_ch_chain)
     }
     a_ch_chain->remote_atoms = a_ch_chain->remote_gdbs = NULL;
 #endif
-	a_ch_chain->remote_gdbs = NULL;
+    a_ch_chain->remote_gdbs = NULL;
 }
 /**
  * @brief dap_stream_ch_chain_go_idle
diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
index 236f44c1fb184092f85b0c14c2d57f02b4dda0b6..2d457e059cc608c4676fe3bff9393266aa382aeb 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -86,8 +86,8 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
 static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_callback_timer_arg_t * a_callback_arg);
 static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group,
                                         const char *a_key, const void *a_value, const size_t a_value_size);
-static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, 
-                                            size_t a_event_size, char * a_event_hash_hex_str, 
+static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event,
+                                            size_t a_event_size, char * a_event_hash_hex_str,
                                             dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg);
 static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event,
                                     char * a_event_hash_hex_str, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg);
@@ -176,23 +176,32 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply)
     // event hash may be in hex or base58 format
     char *l_event_hash_hex_str;
     char *l_event_hash_base58_str;
+
     if(!dap_strcmp(l_hash_out_type, "hex")) {
         l_event_hash_hex_str = dap_strdup(l_event_hash_str);
         l_event_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_event_hash_str);
+
         if (!l_event_hash_base58_str) {
             dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid hex hash format");
+            DAP_DELETE(l_event_hash_hex_str);
             return -5;
         }
     }
     else {
         l_event_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_event_hash_str);
         l_event_hash_base58_str = dap_strdup(l_event_hash_str);
+
         if (!l_event_hash_hex_str) {
+            DAP_DELETE(l_event_hash_base58_str);
             dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid base58 hash format");
         }
+
+        DAP_DELETE(l_event_hash_hex_str);
+        DAP_DELETE(l_event_hash_base58_str);
         return -6;
     }
 
+
     if ( l_event_cmd_str != NULL ){
         if (l_poa_pvt->events_sign_cert )
         ret = -1;
@@ -201,6 +210,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply)
             size_t l_event_size = 0;
             dap_chain_cs_dag_event_t * l_event;
             dap_chain_cs_dag_event_round_cfg_t l_event_round_cfg;
+
             if ( (l_event = dap_chain_cs_dag_event_gdb_get( l_event_hash_hex_str, &l_event_size,
                                                             l_gdb_group_events, &l_event_round_cfg )) == NULL  ){
                 dap_chain_node_cli_set_reply_text(a_str_reply,
@@ -209,7 +219,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply)
                 ret = -30;
             }else {
                 size_t l_event_size_new = 0;
-                dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size, 
+                dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size,
                                                         &l_event_size_new,
                                                         l_chain_net, l_poa_pvt->events_sign_cert->enc_key);
                 if ( l_event_new ) {
@@ -225,7 +235,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply)
 
                     if (dap_chain_cs_dag_event_gdb_set(l_event_new_hash_hex_str, l_event_new,
                                                         l_event_size_new, l_gdb_group_events, &l_event_round_cfg) ){
-                        if ( !dap_chain_global_db_gr_del(dap_strdup(l_event_hash_hex_str), l_gdb_group_events) ) { // Delete old event
+                        if ( !dap_chain_global_db_gr_del( l_event_hash_hex_str, l_gdb_group_events) ) { // Delete old event
                             ret = 1;
                             dap_chain_node_cli_set_reply_text(a_str_reply, "Added new sign with cert \"%s\", event %s placed back in round.new\n"
                                                                            "WARNING! Old event %s with same datum is still in round.new, produced DUP!\n",
@@ -269,7 +279,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply)
                     dap_chain_node_cli_set_reply_text(a_str_reply,
                                                   "Can't sign event in round.new\n",
                                                   l_event_hash_str);
-                    ret=-1;              
+                    ret=-1;
                 }
                 //DAP_DELETE(l_event_new);
             }
@@ -282,6 +292,10 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply)
     } else {
         dap_chain_node_cli_set_reply_text(a_str_reply, "Command dag_poa requires subcommand 'event'");
     }
+
+    DAP_DELETE(l_event_hash_hex_str);
+    DAP_DELETE(l_event_hash_base58_str);
+
     return ret;
 }
 
@@ -365,7 +379,7 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev
         // size_t l_event_size = ((dap_chain_cs_dag_event_round_item_t *)l_events_round[l_index].value)->event_size;
         dap_chain_cs_dag_event_round_item_t *l_event_round_item = (dap_chain_cs_dag_event_round_item_t *)l_events_round[l_index].value;
         dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)l_event_round_item->event;
-        if ( memcmp(&l_event_round_cfg.first_event_hash, 
+        if ( memcmp(&l_event_round_cfg.first_event_hash,
                         &l_event_round_item->cfg.first_event_hash, sizeof(dap_chain_hash_fast_t)) == 0 ) {
             event_clean_dup_items_t * l_item = DAP_NEW_Z(event_clean_dup_items_t);
             l_item->signs_count = l_event->header.signs_count;
@@ -384,8 +398,8 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev
     event_clean_dup_items_t *l_clean_item=NULL, *l_clean_tmp=NULL;
     HASH_ITER(hh, s_event_clean_dup_items, l_clean_item, l_clean_tmp) {
         if ( l_clean_item->signs_count < l_max_signs_count ) {
-            // delete dup by min signatures 
-            dap_chain_global_db_gr_del(dap_strdup(l_clean_item->hash_str), l_gdb_group_events);
+            // delete dup by min signatures
+            dap_chain_global_db_gr_del( l_clean_item->hash_str, l_gdb_group_events);
             HASH_DEL(s_event_clean_dup_items, l_clean_item);
             DAP_DELETE(l_clean_item);
         } else if ( l_clean_item->ts_update > l_max_ts_update ) {
@@ -396,7 +410,7 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev
     HASH_ITER(hh, s_event_clean_dup_items, l_clean_item, l_clean_tmp) {
         if ( dap_strcmp(l_max_ts_update_hash, l_clean_item->hash_str) != 0 ) {
             // delete dup by older
-            dap_chain_global_db_gr_del(dap_strdup(l_clean_item->hash_str), l_gdb_group_events);
+            dap_chain_global_db_gr_del(l_clean_item->hash_str, l_gdb_group_events);
         }
         HASH_DEL(s_event_clean_dup_items, l_clean_item);
         DAP_DELETE(l_clean_item);
@@ -405,7 +419,7 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev
     dap_store_obj_free(l_events_round, l_events_round_size);
 }
 
-static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, 
+static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event,
                                             size_t a_event_size, char * a_event_hash_hex_str,
                                             dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) {
     if ( a_event->header.signs_count < a_event_round_cfg->confirmations_minimum ) {
@@ -439,8 +453,8 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_e
 
     if ( a_event->header.signs_count >= PVT(l_poa)->auth_certs_count) {
         // placement in chain now if max signs
-        if (dap_timerfd_start(PVT(l_poa)->wait_sync_before_complete*1000, 
-                            (dap_timerfd_callback_t)s_callback_round_event_to_chain, 
+        if (dap_timerfd_start(PVT(l_poa)->wait_sync_before_complete*1000,
+                            (dap_timerfd_callback_t)s_callback_round_event_to_chain,
                             l_callback_arg) == NULL) {
             log_it(L_ERROR,"Can't run timer for Event %s", a_event_hash_hex_str);
         } else {
@@ -451,16 +465,16 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_e
         l_timeout = l_timeout - ((uint64_t)time(NULL) - a_event_round_cfg->ts_confirmations_minimum_completed);
         // placement in chain by timer
         l_timeout += PVT(l_poa)->wait_sync_before_complete;
-        if (dap_timerfd_start(l_timeout*1000, 
-                            (dap_timerfd_callback_t)s_callback_round_event_to_chain, 
+        if (dap_timerfd_start(l_timeout*1000,
+                            (dap_timerfd_callback_t)s_callback_round_event_to_chain,
                             l_callback_arg) == NULL) {
             log_it(L_ERROR,"Can't run timer for Event %s", a_event_hash_hex_str);
         } else {
             log_it(L_NOTICE,"Run timer %dsec. for Event %s", l_timeout, a_event_hash_hex_str);
         }
     } else { // placement in chain now if timer out
-        if (dap_timerfd_start(PVT(l_poa)->wait_sync_before_complete*1000, 
-                            (dap_timerfd_callback_t)s_callback_round_event_to_chain, 
+        if (dap_timerfd_start(PVT(l_poa)->wait_sync_before_complete*1000,
+                            (dap_timerfd_callback_t)s_callback_round_event_to_chain,
                             l_callback_arg) == NULL) {
             log_it(L_ERROR,"Can't run timer for Event %s", a_event_hash_hex_str);
         } else {
@@ -487,9 +501,9 @@ static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_callback_timer_
 
     if ( (l_event = dap_chain_cs_dag_event_gdb_get( a_callback_arg->l_event_hash_hex_str, &l_event_size,
                                                     l_gdb_group_events, &l_event_round_cfg )) == NULL  ){
-        log_it(L_NOTICE,"Can't find event %s in round.new. The hash may have changed by reason the addition of a new signature.", 
+        log_it(L_NOTICE,"Can't find event %s in round.new. The hash may have changed by reason the addition of a new signature.",
                         a_callback_arg->l_event_hash_hex_str);
-    } 
+    }
     else {
         dap_chain_atom_ptr_t l_new_atom = (dap_chain_atom_ptr_t)dap_chain_cs_dag_event_copy(l_event, l_event_size);
         memcpy(l_new_atom, l_event, l_event_size);
@@ -504,7 +518,7 @@ static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_callback_timer_
 
             if (dap_chain_cell_file_update(l_dag->chain->cells) > 0) {
                 // delete events from db
-                dap_chain_global_db_gr_del(dap_strdup(a_callback_arg->l_event_hash_hex_str), l_dag->gdb_group_events_round_new);
+                dap_chain_global_db_gr_del(a_callback_arg->l_event_hash_hex_str, l_dag->gdb_group_events_round_new);
             }
             dap_chain_cell_close(l_dag->chain->cells);
             // dap_chain_net_sync_all(l_net);
@@ -544,7 +558,7 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c
 }
 
 /**
- * @brief 
+ * @brief
  * delete dap_chain_cs_dag_poa_pvt_t callback
  * @param a_dag dap_chain_cs_dag_t object
  */
@@ -570,14 +584,14 @@ static void s_callback_delete(dap_chain_cs_dag_t * a_dag)
 }
 
 /**
- * @brief 
+ * @brief
  * callback for create event operation
  * @param a_dag dap_chain_cs_dag_t DAG object
  * @param a_datum dap_chain_datum_t
- * @param a_hashes  dap_chain_hash_fast_t 
+ * @param a_hashes  dap_chain_hash_fast_t
  * @param a_hashes_count size_t
  * @param a_dag_event_size size_t
- * @return dap_chain_cs_dag_event_t* 
+ * @return dap_chain_cs_dag_event_t*
  */
 static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum,
                                                           dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size)
@@ -617,20 +631,20 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_
     dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)l_event_round_item->event;
     // dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)DAP_DUP_SIZE(l_event_round_item->event, l_event_size);
     size_t l_event_size_new = 0;
-    dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size, 
+    dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size,
                                             &l_event_size_new, l_net,
                                             PVT(l_poa)->events_sign_cert->enc_key);
-    
+
     if ( l_event_new ) {
         char * l_gdb_group_events = a_dag->gdb_group_events_round_new;
         dap_chain_hash_fast_t l_event_new_hash;
         dap_chain_cs_dag_event_calc_hash(l_event_new, l_event_size_new, &l_event_new_hash);
         char * l_event_new_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash);
-        bool l_event_is_ready = s_round_event_ready_minimum_check(a_dag, l_event_new, l_event_size_new, 
+        bool l_event_is_ready = s_round_event_ready_minimum_check(a_dag, l_event_new, l_event_size_new,
                                                                     l_event_new_hash_hex_str,  &l_event_round_item->cfg);
         if (dap_chain_cs_dag_event_gdb_set(l_event_new_hash_hex_str, l_event_new,
                                             l_event_size_new, l_gdb_group_events, &l_event_round_item->cfg) ){
-            dap_chain_global_db_gr_del(dap_strdup(a_key), l_gdb_group_events); // Delete old event
+            dap_chain_global_db_gr_del( a_key, l_gdb_group_events); // Delete old event
             if (l_event_is_ready && PVT(l_poa)->auto_round_complete) { // cs done (minimum signs & verify passed)
                 s_round_event_cs_done(a_dag, l_event_new, l_event_new_hash_hex_str, &l_event_round_item->cfg);
             }
@@ -650,12 +664,12 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_
 }
 
 /**
- * @brief 
+ * @brief
  * function makes event singing verification
  * @param a_dag dag object
  * @param a_dag_event dap_chain_cs_dag_event_t
  * @param a_dag_event_size size_t size of event object
- * @return int 
+ * @return int
  */
 static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size)
 {
diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c
index 32dd78083267ac875eca7e2fa34fda4442fb00aa..b930ddfec7bf3286af3e538ffc745a95776705b0 100644
--- a/modules/consensus/none/dap_chain_cs_none.c
+++ b/modules/consensus/none/dap_chain_cs_none.c
@@ -373,8 +373,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
     dap_hash_fast(l_datum->data,l_datum->header.data_size,&l_hash_item->datum_data_hash );
     dap_chain_hash_fast_to_str(&l_hash_item->datum_data_hash,l_hash_item->key,sizeof(l_hash_item->key)-1);
     if (!l_gdb_priv->is_load_mode) {
-        dap_chain_global_db_gr_set(dap_strdup(l_hash_item->key), DAP_DUP_SIZE(l_datum, l_datum_size),
-                                   l_datum_size, l_gdb_priv->group_datums);
+	dap_chain_global_db_gr_set(l_hash_item->key, l_datum, l_datum_size, l_gdb_priv->group_datums);
     } else
         log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", l_hash_item->key, l_gdb_priv->group_datums);
 
diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c
index be114e090cd24a3b4579cdf4ab6b0284d8a0af95..da89542409c95420fcdf35af3941426d0e64f1d4 100644
--- a/modules/global-db/dap_chain_global_db.c
+++ b/modules/global-db/dap_chain_global_db.c
@@ -77,10 +77,12 @@ typedef struct sync_group_item
 static sync_group_item_t *s_sync_group_items = NULL;
 static sync_group_item_t *s_sync_group_extra_items = NULL;
 static bool s_track_history = false;
+static bool s_db_drvmode_async = false;
+
 
 /**
  * @brief Adds a group name for synchronization.
- * @param a_group_prefix a prefix of the group name 
+ * @param a_group_prefix a prefix of the group name
  * @param a_callback a callback function
  * @param a_arg a pointer to an argument
  * @return (none)
@@ -127,7 +129,7 @@ dap_list_t *dap_chain_db_get_sync_groups_internal(sync_group_item_t *a_table)
     return l_ret;
 }
 
-/** 
+/**
  * @brief Gets a list of a group mask for s_sync_group_items.
  * @return Returns a pointer to a list of a group mask.
  */
@@ -136,7 +138,7 @@ dap_list_t *dap_chain_db_get_sync_groups()
     return dap_chain_db_get_sync_groups_internal(s_sync_group_items);
 }
 
-/** 
+/**
  * @brief Gets a list of a group mask for s_sync_group_items.
  * @param a_table a table
  * @return Returns a pointer to a list of a group mask.
@@ -163,7 +165,7 @@ void dap_chain_global_db_obj_clean(dap_global_db_obj_t *obj)
 
 /**
  * @brief Deallocates memory of an obj structure.
- * @param obj a pointer to the object 
+ * @param obj a pointer to the object
  * @return (none)
  */
 void dap_chain_global_db_obj_delete(dap_global_db_obj_t *obj)
@@ -187,7 +189,7 @@ void dap_chain_global_db_objs_delete(dap_global_db_obj_t *objs, size_t a_count)
 }
 
 /**
- * @brief Initializes a database by g_config structure. 
+ * @brief Initializes a database by g_config structure.
  * @note You should call this function before calling any other functions in this library.
  * @param g_config a pointer to the configuration structure
  * @return Returns 0 if successful; otherwise, <0.
@@ -197,19 +199,26 @@ int dap_chain_global_db_init(dap_config_t * g_config)
     const char *l_storage_path = dap_config_get_item_str(g_config, "resources", "dap_global_db_path");
     const char *l_driver_name = dap_config_get_item_str_default(g_config, "resources", "dap_global_db_driver", "sqlite");
     //const char *l_driver_name = dap_config_get_item_str_default(g_config, "resources", "dap_global_db_driver", "cdb");
+
     s_track_history = dap_config_get_item_bool_default(g_config, "resources", "dap_global_db_track_history", s_track_history);
+
+    s_db_drvmode_async = dap_config_get_item_bool(g_config, "resources", "dap_global_db_drvmode_async");
+    log_it(L_NOTICE,"DB Driver Async mode: %s", s_db_drvmode_async ? "ON": "Off");
+
     lock();
-    int res = dap_db_driver_init(l_driver_name, l_storage_path);
+    int res = dap_db_driver_init(l_driver_name, l_storage_path, s_db_drvmode_async);
     unlock();
+
     if( res != 0 )
         log_it(L_CRITICAL, "Hadn't initialized db driver \"%s\" on path \"%s\"", l_driver_name, l_storage_path);
     else
         log_it(L_NOTICE,"GlobalDB initialized");
+
     return res;
 }
 
 /**
- * @brief Deinitialize a database. 
+ * @brief Deinitialize a database.
  * @note You should call this function at the end.
  * @return (none)
  */
@@ -266,7 +275,7 @@ void* dap_chain_global_db_obj_get(const char *a_key, const char *a_group)
  * @param a_key an object key string
  * @param a_data_len_out[in] a number of objects to be gotten, if NULL - no limits
  * @param a_data_len_out[out] a number of objects that were gotten
- * @param a_group a group name string  
+ * @param a_group a group name string
  * @return If successful, returns a pointer to the first item in the array; otherwise NULL.
  */
 dap_store_obj_t* dap_chain_global_db_obj_gr_get(const char *a_key, size_t *a_data_len_out, const char *a_group)
@@ -330,48 +339,49 @@ uint8_t * dap_chain_global_db_get(const char *a_key, size_t *a_data_len_out)
  */
 static bool global_db_gr_del_add(char *a_key,const char *a_group, time_t a_timestamp)
 {
-    dap_store_obj_t store_data = {};
-    store_data.type = 'a';
+dap_store_obj_t store_data = {0};
+char	l_group[DAP_DB_K_MAXGRPLEN];
+int l_res = 0;
+
     store_data.key = a_key;
     // group = parent group + '.del'
-    store_data.group = dap_strdup_printf("%s.del", a_group);
+    dap_snprintf(l_group, sizeof(l_group) - 1, "%s.del", a_group);
+    store_data.group = l_group;
     store_data.timestamp = a_timestamp;
+
     lock();
-    int l_res = 0;
     if (!dap_chain_global_db_driver_is(store_data.group, store_data.key))
         l_res = dap_chain_global_db_driver_add(&store_data, 1);
     unlock();
-    DAP_DELETE(store_data.group);
-    if(l_res>=0)
-        return true;
-    return false;
+
+    return  (l_res >= 0);    /*  ? true : false; */
 }
 
 /**
  * @brief Deletes info about the deleted object from the database
  * @param a_key an object key string, looked like "0x8FAFBD00B..."
  * @param a_group a group name string, for example "kelvin-testnet.nodes"
- * @return If successful, returns true; otherwise, false. 
+ * @return If successful, returns true; otherwise, false.
  */
-static bool global_db_gr_del_del(char *a_key, const char *a_group)
+static bool global_db_gr_del_del(const char *a_key, const char *a_group)
 {
+dap_store_obj_t store_data = {0};
+char	l_group[DAP_DB_K_MAXGRPLEN];
+int	l_res = 0;
+
     if(!a_key)
         return NULL;
-    dap_store_obj_t store_data;
-    memset(&store_data, 0, sizeof(dap_store_obj_t));
+
     store_data.key = a_key;
-   // store_data->c_key = a_key;
-    store_data.group = dap_strdup_printf("%s.del", a_group);
-    //store_data->c_group = a_group;
+    dap_snprintf(l_group, sizeof(l_group) - 1, "%s.del", a_group);
+    store_data.group = l_group;
+
     lock();
-    int l_res = 0;
     if(dap_chain_global_db_driver_is(store_data.group, store_data.key))
         l_res = dap_chain_global_db_driver_delete(&store_data, 1);
     unlock();
-    DAP_DELETE(store_data.group);
-    if(l_res>=0)
-        return true;
-    return false;
+
+    return  (l_res >= 0);    /*  ? true : false; */
 }
 
 /**
@@ -486,10 +496,10 @@ dap_global_db_obj_t* dap_chain_global_db_load(size_t *a_data_size_out)
 }
 
 /**
- * @brief Finds item by a_items and a_group 
+ * @brief Finds item by a_items and a_group
  * @param a_items items
  * @param a_group a group name string
- * @return 
+ * @return
  */
 static sync_group_item_t *find_item_by_mask(sync_group_item_t *a_items, const char *a_group)
 {
@@ -503,7 +513,7 @@ static sync_group_item_t *find_item_by_mask(sync_group_item_t *a_items, const ch
 
 /**
  * @brief Adds data to the history log
- * 
+ *
  * @param a_store_data a pointer to an object
  * @return (none)
  */
@@ -514,37 +524,28 @@ void dap_global_db_obj_track_history(void* a_store_data)
     if (l_sync_group_item) {
         if(l_sync_group_item->callback_notify) {
              l_sync_group_item->callback_notify(l_sync_group_item->callback_arg,
-                        (const char)l_obj->type,
+                        l_obj->type,
                         l_obj->group, l_obj->key,
                         l_obj->value, l_obj->value_len);
         }
         if (!s_track_history) {
             lock();
-            dap_db_history_add((char)l_obj->type, l_obj, 1, l_sync_group_item->group_name_for_history);
+            dap_db_history_add(l_obj->type, l_obj, 1, l_sync_group_item->group_name_for_history);
             unlock();
-        } else {
-            DAP_DELETE(l_obj->key);
-            DAP_DEL_Z(l_obj->value);
         }
     } else { // looking for extra group
         sync_group_item_t *l_sync_extra_group_item = find_item_by_mask(s_sync_group_extra_items, l_obj->group);
         if(l_sync_extra_group_item) {
             if(l_sync_extra_group_item->callback_notify) {
                 l_sync_extra_group_item->callback_notify(l_sync_extra_group_item->callback_arg,
-                        (const char)l_obj->type, l_obj->group, l_obj->key,
+                        l_obj->type, l_obj->group, l_obj->key,
                         l_obj->value, l_obj->value_len);
             }
             if (!s_track_history) {
                 lock();
-                dap_db_history_add((char)l_obj->type, l_obj, 1, l_sync_extra_group_item->group_name_for_history);
+                dap_db_history_add(l_obj->type, l_obj, 1, l_sync_extra_group_item->group_name_for_history);
                 unlock();
-            } else {
-                DAP_DELETE(l_obj->key);
-                DAP_DEL_Z(l_obj->value);
             }
-        } else {
-            DAP_DELETE(l_obj->key);
-            DAP_DEL_Z(l_obj->value);
         }
     }
 }
@@ -558,15 +559,16 @@ void dap_global_db_obj_track_history(void* a_store_data)
  * @details Set one entry to base. IMPORTANT: a_key and a_value should be passed without free after (it will be released by gdb itself)
  * @return True if successful, false otherwise.
  */
-bool dap_chain_global_db_gr_set(char *a_key, void *a_value, size_t a_value_len, const char *a_group)
+bool dap_chain_global_db_gr_set(const char *a_key, const void *a_value, size_t a_value_len, const char *a_group)
 {
-    dap_store_obj_t store_data;
-    memset(&store_data, 0, sizeof(dap_store_obj_t));
-    store_data.key = dap_strdup(a_key);
-    store_data.value_len = (a_value_len == (size_t) -1) ? dap_strlen((const char*) a_value) : a_value_len;
-    store_data.value = store_data.value_len ? DAP_DUP_SIZE(a_value, store_data.value_len) : NULL;
-    store_data.group = (char*)a_group;
+dap_store_obj_t store_data = {0};
+
+    store_data.key = a_key;
+    store_data.value_len = (a_value_len == (size_t) -1) ? dap_strlen(a_value) : a_value_len;
+    store_data.value = store_data.value_len ? a_value : NULL;
+    store_data.group = a_group;
     store_data.timestamp = time(NULL);
+
     lock();
     int l_res = dap_chain_global_db_driver_add(&store_data, 1);
     unlock();
@@ -574,13 +576,13 @@ bool dap_chain_global_db_gr_set(char *a_key, void *a_value, size_t a_value_len,
     // Extract prefix if added successfuly, add history log and call notify callback if present
     if(!l_res) {
         // delete info about the deleted entry from the base if one present
-        global_db_gr_del_del(dap_strdup(a_key), a_group);
+        global_db_gr_del_del( a_key, a_group);
+
         store_data.value = a_value;
         store_data.key = a_key;
+
         dap_global_db_obj_track_history(&store_data);
     } else {
-        DAP_DEL_Z(a_value);
-        DAP_DELETE(a_key);
         log_it(L_ERROR, "Save error: %d", l_res);
     }
 
@@ -598,32 +600,32 @@ bool dap_chain_global_db_set( char *a_key,  void *a_value, size_t a_value_len)
     return dap_chain_global_db_gr_set(a_key, a_value, a_value_len, GROUP_LOCAL_GENERAL);
 }
 
-/** 
+/**
  * @brief Deletes object from a database by a a_key and a_group arguments.
  * @param a_key a object key string
  * @param a_group a group name string
  * @return True if object was deleted or false otherwise.
  */
-bool dap_chain_global_db_gr_del(char *a_key,const char *a_group)
+bool dap_chain_global_db_gr_del(const char *a_key, const char *a_group)
 {
-    dap_store_obj_t store_data;
-    memset(&store_data, 0, sizeof(dap_store_obj_t));
-    store_data.key = dap_strdup(a_key);
+dap_store_obj_t store_data = {0};
+
+    store_data.key = a_key;
     store_data.group = (char*)a_group;
+
     lock();
     int l_res = dap_chain_global_db_driver_delete(&store_data, 1);
     unlock();
+
     if (a_key) {
         if (l_res >= 0) {
             // add to Del group
-            global_db_gr_del_add(dap_strdup(a_key), store_data.group, time(NULL));
+            global_db_gr_del_add(a_key, store_data.group, time(NULL));
         }
         // do not add to history if l_res=1 (already deleted)
         if (!l_res) {
-            store_data.key = a_key;
+            store_data.key = (char *) a_key;
             dap_global_db_obj_track_history(&store_data);
-        } else {
-            DAP_DELETE(a_key);
         }
     }
     return !l_res;
@@ -635,41 +637,34 @@ bool dap_chain_global_db_gr_del(char *a_key,const char *a_group)
  * @param a_objs_count a number of objects
  * @return True if object was deleted or false otherwise.
  */
-bool dap_chain_global_db_obj_save(void* a_store_data, size_t a_objs_count)
+bool dap_chain_global_db_obj_save(dap_store_obj_t *a_store_data, size_t a_objs_count)
 {
-    // save/delete data
+dap_store_obj_t *l_store_obj;
+
+    /* Do we need something to do at all ? */
     if(!a_objs_count)
         return true;
 
-    char *l_keys[a_objs_count];
-    void *l_vals[a_objs_count];
-    for(size_t i = 0; i < a_objs_count; i++) {
-        dap_store_obj_t *l_store_obj = (dap_store_obj_t *)a_store_data + i;
-        l_keys[i] = dap_strdup(l_store_obj->key);
-        l_vals[i] = DAP_DUP_SIZE(l_store_obj->value, l_store_obj->value_len);
-    }
     lock();
-    int l_res = dap_chain_global_db_driver_appy(a_store_data, a_objs_count);
+    int l_res = dap_chain_global_db_driver_apply(a_store_data, a_objs_count);
     unlock();
 
-    for(size_t i = 0; i < a_objs_count; i++) {
-        dap_store_obj_t *l_store_obj = (dap_store_obj_t *)a_store_data + i;
-        l_store_obj->key = l_keys[i];
-        l_store_obj->value = l_vals[i];
-        if (l_store_obj->type == 'a' && !l_res)
+    l_store_obj = (dap_store_obj_t *)a_store_data;
+
+    for(int  i = a_objs_count; i--; l_store_obj++) {
+        if (l_store_obj->type == DAP_DB$K_OPTYPE_ADD && !l_res)
             // delete info about the deleted entry from the base if one present
-            global_db_gr_del_del(dap_strdup(l_store_obj->key), l_store_obj->group);
-        else if (l_store_obj->type == 'd' && l_res >= 0)
+            global_db_gr_del_del(l_store_obj->key, l_store_obj->group);
+        else if (l_store_obj->type == DAP_DB$K_OPTYPE_ADD && l_res >= 0)
             // add to Del group
-            global_db_gr_del_add(dap_strdup(l_store_obj->key), l_store_obj->group, l_store_obj->timestamp);
+            global_db_gr_del_add(l_store_obj->key, l_store_obj->group, l_store_obj->timestamp);
+
         if (!l_res) {
             // Extract prefix if added successfuly, add history log and call notify callback if present
             dap_global_db_obj_track_history(l_store_obj);
-        } else {
-            DAP_DELETE(l_store_obj->key);
-            DAP_DELETE(l_store_obj->value);
         }
     }
+
     return !l_res;
 }
 
@@ -682,23 +677,23 @@ bool dap_chain_global_db_obj_save(void* a_store_data, size_t a_objs_count)
  */
 bool dap_chain_global_db_gr_save(dap_global_db_obj_t* a_objs, size_t a_objs_count, const char *a_group)
 {
-    dap_store_obj_t *l_store_data = DAP_NEW_Z_SIZE(dap_store_obj_t, a_objs_count * sizeof(struct dap_store_obj));
-    if (!l_store_data)
-            return false;
-    time_t l_timestamp = time(NULL);
-    for(size_t q = 0; q < a_objs_count; ++q) {
-        dap_store_obj_t *store_data_cur = l_store_data + q;
-        dap_global_db_obj_t *a_obj_cur = a_objs + q;
-        store_data_cur->type = 'a';
-        store_data_cur->key = a_obj_cur->key;
-        store_data_cur->group = (char*)a_group;
-        store_data_cur->value = a_obj_cur->value;
-        store_data_cur->value_len = a_obj_cur->value_len;
+dap_store_obj_t l_store_data[a_objs_count], *store_data_cur;
+dap_global_db_obj_t *l_obj_cur;
+time_t l_timestamp = time(NULL);
+
+    store_data_cur = l_store_data;
+    l_obj_cur = a_objs;
+
+    for(int i = a_objs_count; i--; store_data_cur++, l_obj_cur++ ) {
+        store_data_cur->type = DAP_DB$K_OPTYPE_ADD;
+        store_data_cur->key = l_obj_cur->key;
+        store_data_cur->group = (char*) a_group;
+        store_data_cur->value = l_obj_cur->value;
+        store_data_cur->value_len = l_obj_cur->value_len;
         store_data_cur->timestamp = l_timestamp;
     }
-    int l_res = dap_chain_global_db_obj_save(l_store_data, a_objs_count);
-    DAP_DELETE(l_store_data);
-    return l_res;
+
+    return dap_chain_global_db_obj_save(l_store_data, a_objs_count);
 }
 
 /**
diff --git a/modules/global-db/dap_chain_global_db_driver.c b/modules/global-db/dap_chain_global_db_driver.c
index 98e9e26cac2db2e2ee1f4bb6902de021dc2e239e..45d7dff218ba4d787268f1474e0da7696803ab14 100644
--- a/modules/global-db/dap_chain_global_db_driver.c
+++ b/modules/global-db/dap_chain_global_db_driver.c
@@ -46,41 +46,20 @@
 // A selected database driver.
 static char *s_used_driver = NULL;
 
-//#define USE_WRITE_BUFFER
-
-#ifdef USE_WRITE_BUFFER
-static int save_write_buf(void);
-
-// for write buffer
-pthread_mutex_t s_mutex_add_start = PTHREAD_MUTEX_INITIALIZER;
-pthread_mutex_t s_mutex_add_end = PTHREAD_MUTEX_INITIALIZER;
-//pthread_rwlock_rdlock
-// new data in buffer to write
-pthread_mutex_t s_mutex_cond = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t s_cond_add_end; // = PTHREAD_COND_INITIALIZER;
-// writing ended
-pthread_mutex_t s_mutex_write_end = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t s_cond_write_end; // = PTHREAD_COND_INITIALIZER;
-
-dap_list_t *s_list_begin = NULL;
-dap_list_t *s_list_end = NULL;
-
-pthread_t s_write_buf_thread;
-volatile static bool s_write_buf_state = 0;
-static void* func_write_buf(void * arg);
-#endif //USE_WRITE_BUFFER
-
 static dap_db_driver_callbacks_t s_drv_callback;
+static bool s_db_drvmode_async = false;
 
 /**
- * @brief Initializes a database driver. 
+ * @brief Initializes a database driver.
  * @note You should Call this function before using the driver.
  * @param driver_name a string determining a type of database driver:
  * "сdb", "sqlite" ("sqlite3") or "pgsql"
  * @param a_filename_db a path to a database file
+ * @param db_drvmode_async a flag to switch DB Engine to "Async"  mode
  * @return Returns 0, if successful; otherwise <0.
  */
-int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db)
+int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db,
+               bool db_drvmode_async)
 {
     int l_ret = -1;
     if(s_used_driver)
@@ -88,11 +67,13 @@ int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db)
 
     // Fill callbacks with zeros
     memset(&s_drv_callback, 0, sizeof(dap_db_driver_callbacks_t));
+    s_db_drvmode_async = db_drvmode_async;
 
     // Setup driver name
     s_used_driver = dap_strdup(a_driver_name);
 
     dap_mkdir_with_parents(a_filename_db);
+
     // Compose path
     char l_db_path_ext[strlen(a_driver_name) + strlen(a_filename_db) + 6];
     dap_snprintf(l_db_path_ext, sizeof(l_db_path_ext), "%s/gdb-%s", a_filename_db, a_driver_name);
@@ -101,31 +82,19 @@ int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db)
     if(!dap_strcmp(s_used_driver, "ldb"))
         l_ret = -1;
     else if(!dap_strcmp(s_used_driver, "sqlite") || !dap_strcmp(s_used_driver, "sqlite3") )
-        l_ret = dap_db_driver_sqlite_init(l_db_path_ext, &s_drv_callback);
+    l_ret = dap_db_driver_sqlite_init(l_db_path_ext, &s_drv_callback, db_drvmode_async);
     else if(!dap_strcmp(s_used_driver, "cdb"))
-        l_ret = dap_db_driver_cdb_init(l_db_path_ext, &s_drv_callback);
+    l_ret = dap_db_driver_cdb_init(l_db_path_ext, &s_drv_callback, db_drvmode_async);
 #ifdef DAP_CHAIN_GDB_ENGINE_MDBX
     else if(!dap_strcmp(s_used_driver, "mdbx"))
-        l_ret = dap_db_driver_mdbx_init(l_db_path_ext, &s_drv_callback);
+    l_ret = dap_db_driver_mdbx_init(l_db_path_ext, &s_drv_callback, db_drvmode_async);
 #endif
 #ifdef DAP_CHAIN_GDB_ENGINE_PGSQL
     else if(!dap_strcmp(s_used_driver, "pgsql"))
-        l_ret = dap_db_driver_pgsql_init(l_db_path_ext, &s_drv_callback);
+    l_ret = dap_db_driver_pgsql_init(l_db_path_ext, &s_drv_callback, db_drvmode_async);
 #endif
     else
         log_it(L_ERROR, "Unknown global_db driver \"%s\"", a_driver_name);
-#ifdef USE_WRITE_BUFFER
-    if(!l_ret) {
-        pthread_condattr_t l_condattr;
-        pthread_condattr_init(&l_condattr);
-        pthread_condattr_setclock(&l_condattr, CLOCK_MONOTONIC);
-        pthread_cond_init(&s_cond_add_end, &l_condattr);
-        pthread_cond_init(&s_cond_write_end, &l_condattr);
-        // thread for save buffer to database
-        s_write_buf_state = true;
-        pthread_create(&s_write_buf_thread, NULL, func_write_buf, NULL);
-    }
-#endif
     return l_ret;
 }
 
@@ -136,33 +105,6 @@ int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db)
  */
 void dap_db_driver_deinit(void)
 {
-#ifdef USE_WRITE_BUFFER
-    // wait for close thread
-    {
-        pthread_mutex_lock(&s_mutex_cond);
-        pthread_cond_broadcast(&s_cond_add_end);
-        pthread_mutex_unlock(&s_mutex_cond);
-
-        s_write_buf_state = false;
-        pthread_join(s_write_buf_thread, NULL);
-    }
-
-    //save_write_buf();
-    pthread_mutex_lock(&s_mutex_add_end);
-    pthread_mutex_lock(&s_mutex_add_start);
-    while(s_list_begin != s_list_end) {
-        // free memory
-        dap_store_obj_free((dap_store_obj_t*) s_list_begin->data, 1);
-        dap_list_free1(s_list_begin);
-        s_list_begin = dap_list_next(s_list_begin);
-    }
-    //dap_store_obj_free((dap_store_obj_t*) s_list_begin->data, 1);
-    dap_list_free1(s_list_begin);
-    s_list_begin = s_list_end = NULL;
-    pthread_mutex_unlock(&s_mutex_add_start);
-    pthread_mutex_unlock(&s_mutex_add_end);
-    pthread_cond_destroy(&s_cond_add_end);
-#endif
     // deinit driver
     if(s_drv_callback.deinit)
         s_drv_callback.deinit();
@@ -232,6 +174,7 @@ char* dap_chain_global_db_driver_hash(const uint8_t *data, size_t data_size)
 {
     if(!data || !data_size)
         return NULL;
+
     dap_chain_hash_fast_t l_hash;
     memset(&l_hash, 0, sizeof(dap_chain_hash_fast_t));
     dap_hash_fast(data, data_size, &l_hash);
@@ -245,229 +188,41 @@ char* dap_chain_global_db_driver_hash(const uint8_t *data, size_t data_size)
     return a_str;
 }
 
-/**
- * @brief Waits for a buffer to be written.
- * @param a_mutex a mutex
- * @param a_cond a condition
- * @param l_timeout_ms timeout in ms, if -1 endless waiting
- * @return Returns 0 if successful or 1 when the timeout is due.
- */
-static int wait_data(pthread_mutex_t *a_mutex, pthread_cond_t *a_cond, int l_timeout_ms)
-{
-    int l_res = 0;
-    pthread_mutex_lock(a_mutex);
-    // endless waiting
-    if(l_timeout_ms == -1)
-        l_res = pthread_cond_wait(a_cond, a_mutex);
-    // waiting no more than timeout in milliseconds
-    else {
-        struct timespec l_to;
-        clock_gettime(CLOCK_MONOTONIC, &l_to);
-        int64_t l_nsec_new = l_to.tv_nsec + l_timeout_ms * 1000000ll;
-        // if the new number of nanoseconds is more than a second
-        if(l_nsec_new > (long) 1e9) {
-            l_to.tv_sec += l_nsec_new / (long) 1e9;
-            l_to.tv_nsec = l_nsec_new % (long) 1e9;
-        }
-        else
-            l_to.tv_nsec = (long) l_nsec_new;
-        l_res = pthread_cond_timedwait(a_cond, a_mutex, &l_to);
-    }
-    pthread_mutex_unlock(a_mutex);
-    if(l_res == ETIMEDOUT)
-        return 1;
-    return l_res;
-}
-
-#ifdef USE_WRITE_BUFFER
-/**
- * @brief Checks if a buffer is not empty.
- * @return Returns true if the buffer is not empty, false if it is empty.
- */
-static bool check_fill_buf(void)
-{
-    dap_list_t *l_list_begin;
-    dap_list_t *l_list_end;
-    pthread_mutex_lock(&s_mutex_add_start);
-    pthread_mutex_lock(&s_mutex_add_end);
-    l_list_end = s_list_end;
-    l_list_begin = s_list_begin;
-    pthread_mutex_unlock(&s_mutex_add_end);
-    pthread_mutex_unlock(&s_mutex_add_start);
-
-    bool l_ret = (l_list_begin != l_list_end) ? 1 : 0;
-//    if(l_ret)
-//        printf("** Wait s_beg=0x%x s_end=0x%x \n", l_list_begin, l_list_end);
-    return l_ret;
-}
-
-/**
- * @brief Waits until the buffer is not empty.
- * @return (none)
- */
-static void wait_write_buf()
-{
-//    printf("** Start wait data\n");
-    // wait data
-    while(1) {
-        if(!check_fill_buf())
-            break;
-        if(!wait_data(&s_mutex_write_end, &s_cond_write_end, 50))
-            break;
-    }
-//    printf("** End wait data\n");
-}
-
-/**
- * @brief Saves data from a buffer to a database.
- * @return 0
- */
-static int save_write_buf(void)
-{
-    dap_list_t *l_list_end;
-    // fix end of buffer
-    pthread_mutex_lock(&s_mutex_add_end);
-    l_list_end = s_list_end;
-    pthread_mutex_unlock(&s_mutex_add_end);
-    // save data from begin to fixed end
-    pthread_mutex_lock(&s_mutex_add_start);
-    if(s_list_begin != l_list_end) {
-        if(s_drv_callback.transaction_start)
-            s_drv_callback.transaction_start();
-        int cnt = 0;
-        while(s_list_begin != l_list_end) {
-            // apply to database
-            dap_store_obj_t *l_obj = s_list_begin->data;
-            assert(l_obj);
-            if(s_drv_callback.apply_store_obj) {
-                int l_ret_tmp = s_drv_callback.apply_store_obj(l_obj);
-                if(l_ret_tmp == 1) {
-                    log_it(L_INFO, "item is missing (may be already deleted) %s/%s\n", l_obj->group, l_obj->key);
-                    l_ret = 1;
-                }
-                if(l_ret_tmp < 0) {
-                    log_it(L_ERROR, "Can't write item %s/%s\n", l_obj->group, l_obj->key);
-                    l_ret -= 1;
-                }
-                /*if(!s_drv_callback.apply_store_obj(l_obj)) {
-                    //log_it(L_INFO, "Write item Ok %s/%s\n", l_obj->group, l_obj->key);
-                }
-                else {
-                    log_it(L_ERROR, "Can't write item %s/%s\n", l_obj->group, l_obj->key);
-                }*/
-            }
-
-            s_list_begin = dap_list_next(s_list_begin);
-//            printf("** ap2*record *l_beg=0x%x l_nex=0x%x d_beg=0x%x l_end=0x%x d_end=0x%x sl_end=0x%x\n", s_list_begin,
-            //                  s_list_begin->next, s_list_begin->data, l_list_end, l_list_end->data, s_list_end);
-
-            //printf("** free data=0x%x list=0x%x\n", s_list_begin->prev->data, s_list_begin->prev);
-            // free memory
-            dap_store_obj_free((dap_store_obj_t*) s_list_begin->prev->data, 1);
-            dap_list_free1(s_list_begin->prev);
-            s_list_begin->prev = NULL;
-            cnt++;
-        }
-        if(s_drv_callback.transaction_end)
-            s_drv_callback.transaction_end();
-        //printf("** writing ended cnt=%d\n", cnt);
-        // writing ended
-        pthread_mutex_lock(&s_mutex_write_end);
-        pthread_cond_broadcast(&s_cond_write_end);
-        pthread_mutex_unlock(&s_mutex_write_end);
-    }
-    pthread_mutex_unlock(&s_mutex_add_start);
-    return 0;
-}
-
-/**
- * @brief A thread for saving data from buffer to a database
- * @param arg NULL, is not used
- * @return NULL
- */
-static void* func_write_buf(void * arg)
-{
-    while(1) {
-        if(!s_write_buf_state)
-            break;
-        //save_write_buf
-        if(save_write_buf() == 0) {
-            if(!s_write_buf_state)
-                break;
-            // wait data
-            wait_data(&s_mutex_cond, &s_cond_add_end, 2000); // 2 sec
-        }
-    }
-    return NULL;
-}
-#endif //USE_WRITE_BUFFER
-
 /**
  * @brief Applies objects to database.
  * @param a_store an pointer to the objects
  * @param a_store_count a number of objectss
  * @return Returns 0, if successful.
  */
-int dap_chain_global_db_driver_appy(pdap_store_obj_t a_store_obj, size_t a_store_count)
+int dap_chain_global_db_driver_apply(pdap_store_obj_t a_store_obj, size_t a_store_count)
 {
-    //dap_store_obj_t *l_store_obj = dap_store_obj_copy(a_store_obj, a_store_count);
+int l_ret;
+dap_store_obj_t *l_store_obj_cur;
+
     if(!a_store_obj || !a_store_count)
         return -1;
-#ifdef USE_WRITE_BUFFER
-    // add all records into write buffer
-    pthread_mutex_lock(&s_mutex_add_end);
-    for(size_t i = 0; i < a_store_count; i++) {
-        dap_store_obj_t *l_store_obj_cur = dap_store_obj_copy(a_store_obj + i, 1);
-        // first record in buf
-        if(!s_list_end) {
-            s_list_end = dap_list_append(s_list_end, l_store_obj_cur);
-            pthread_mutex_lock(&s_mutex_add_start);
-            s_list_begin = s_list_end;
-            pthread_mutex_unlock(&s_mutex_add_start);
-            //log_it(L_DEBUG,"First record in list: *!!add record=0x%x / 0x%x    obj=0x%x / 0x%x\n", s_list_end, s_list_end->data, s_list_end->prev);
-        }
-        else
-            s_list_end->data = l_store_obj_cur;
-        dap_list_append(s_list_end, NULL);
-        s_list_end = dap_list_last(s_list_end);
-        //log_it(L_DEBUG, "**+add record l_cur=0x%x / 0x%x l_new=0x%x / 0x%x\n", s_list_end->prev, s_list_end->prev->data,s_list_end, s_list_end->data);
-    }
-    // buffer changed
-    pthread_mutex_lock(&s_mutex_cond);
-    pthread_cond_broadcast(&s_cond_add_end);
-    pthread_mutex_unlock(&s_mutex_cond);
-    pthread_mutex_unlock(&s_mutex_add_end);
-    return 0;
-#else
-    int l_ret = 0;
+
     // apply to database
     if(a_store_count > 1 && s_drv_callback.transaction_start)
         s_drv_callback.transaction_start();
 
+    l_store_obj_cur = a_store_obj;                  /* We have to  use a power of the address's incremental arithmetic */
+    l_ret = 0;                                      /* Preset return code to OK */
+
     if(s_drv_callback.apply_store_obj)
-        for(size_t i = 0; i < a_store_count; i++) {
-            dap_store_obj_t *l_store_obj_cur = a_store_obj + i;
-            assert(l_store_obj_cur);
-            char *l_cur_key = dap_strdup(l_store_obj_cur->key);
-            int l_ret_tmp = s_drv_callback.apply_store_obj(l_store_obj_cur);
-            if(l_ret_tmp == 1) {
-                log_it(L_INFO, "Item is missing (may be already deleted) %s/%s\n", l_store_obj_cur->group, l_cur_key);
-                l_ret = 1;
-            }
-            if(l_ret_tmp < 0) {
-                log_it(L_ERROR, "Can't write item %s/%s (code %d)\n", l_store_obj_cur->group, l_cur_key, l_ret_tmp);
-                l_ret -= 1;
-            }
-            DAP_DEL_Z(l_cur_key);
-            if (l_ret)
-                break;
+        for(int i = a_store_count; (!l_ret) && i--; l_store_obj_cur++) {
+            assert(l_store_obj_cur);                /* Sanity check */
+
+            if ( 1 == (l_ret = s_drv_callback.apply_store_obj(l_store_obj_cur)) )
+                log_it(L_INFO, "Item is missing (may be already deleted) %s/%s\n", l_store_obj_cur->group, l_store_obj_cur->key);
+            else if (l_ret < 0)
+                log_it(L_ERROR, "Can't write item %s/%s (code %d)\n", l_store_obj_cur->group, l_store_obj_cur->key, l_ret);
         }
 
     if(a_store_count > 1 && s_drv_callback.transaction_end)
         s_drv_callback.transaction_end();
-    return l_ret;
-#endif
 
+    return l_ret;
 }
 
 /**
@@ -478,9 +233,12 @@ int dap_chain_global_db_driver_appy(pdap_store_obj_t a_store_obj, size_t a_store
  */
 int dap_chain_global_db_driver_add(pdap_store_obj_t a_store_obj, size_t a_store_count)
 {
-    for(size_t i = 0; i < a_store_count; i++)
-        a_store_obj[i].type = 'a';
-    return dap_chain_global_db_driver_appy(a_store_obj, a_store_count);
+dap_store_obj_t *l_store_obj_cur = a_store_obj;
+
+    for(int i = a_store_count; i--; l_store_obj_cur++)
+        l_store_obj_cur->type = DAP_DB$K_OPTYPE_ADD;
+
+    return dap_chain_global_db_driver_apply(a_store_obj, a_store_count);
 }
 
 /**
@@ -491,9 +249,12 @@ int dap_chain_global_db_driver_add(pdap_store_obj_t a_store_obj, size_t a_store_
  */
 int dap_chain_global_db_driver_delete(pdap_store_obj_t a_store_obj, size_t a_store_count)
 {
-    for(size_t i = 0; i < a_store_count; i++)
-        a_store_obj[i].type = 'd';
-    return dap_chain_global_db_driver_appy(a_store_obj, a_store_count);
+dap_store_obj_t *l_store_obj_cur = a_store_obj;
+
+    for(int i = a_store_count; i--; l_store_obj_cur++)
+        l_store_obj_cur->type = DAP_DB$K_OPTYPE_DEL;
+
+    return dap_chain_global_db_driver_apply(a_store_obj, a_store_count);
 }
 
 /**
@@ -535,10 +296,6 @@ dap_list_t *dap_chain_global_db_driver_get_groups_by_mask(const char *a_group_ma
 dap_store_obj_t* dap_chain_global_db_driver_read_last(const char *a_group)
 {
     dap_store_obj_t *l_ret = NULL;
-#ifdef USE_WRITE_BUFFER
-    // wait apply write buffer
-    wait_write_buf();
-#endif
     // read records using the selected database engine
     if(s_drv_callback.read_last_store_obj)
         l_ret = s_drv_callback.read_last_store_obj(a_group);
@@ -556,10 +313,6 @@ dap_store_obj_t* dap_chain_global_db_driver_read_last(const char *a_group)
 dap_store_obj_t* dap_chain_global_db_driver_cond_read(const char *a_group, uint64_t id, size_t *a_count_out)
 {
     dap_store_obj_t *l_ret = NULL;
-#ifdef USE_WRITE_BUFFER
-    // wait apply write buffer
-    wait_write_buf();
-#endif
     // read records using the selected database engine
     if(s_drv_callback.read_cond_store_obj)
         l_ret = s_drv_callback.read_cond_store_obj(a_group, id, a_count_out);
@@ -578,10 +331,6 @@ dap_store_obj_t* dap_chain_global_db_driver_cond_read(const char *a_group, uint6
 dap_store_obj_t* dap_chain_global_db_driver_read(const char *a_group, const char *a_key, size_t *a_count_out)
 {
     dap_store_obj_t *l_ret = NULL;
-#ifdef USE_WRITE_BUFFER
-    // wait apply write buffer
-    wait_write_buf();
-#endif
     // read records using the selected database engine
     if(s_drv_callback.read_store_obj)
         l_ret = s_drv_callback.read_store_obj(a_group, a_key, a_count_out);
diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c
index f41b91f6b5dcb29d14186f6ce7fedecba8ffac4d..16252d46783a000909f27b4c946eeae623201f29 100644
--- a/modules/global-db/dap_chain_global_db_driver_cdb.c
+++ b/modules/global-db/dap_chain_global_db_driver_cdb.c
@@ -28,6 +28,11 @@
 #include <pthread.h>
 #include <sys/stat.h>
 #include <uthash.h>
+#include <pthread.h>
+#include <errno.h>
+#include <stdatomic.h>
+
+
 #define _GNU_SOURCE
 
 #include "dap_common.h"
@@ -62,6 +67,51 @@ static pcdb_instance s_cdb = NULL;
 static pthread_mutex_t cdb_mutex = PTHREAD_MUTEX_INITIALIZER;
 /** A read-write lock for working with a CDB instanse. */
 static pthread_rwlock_t cdb_rwlock = PTHREAD_RWLOCK_INITIALIZER;
+/** Mode of request processing */
+static bool s_db_drvmode_async = false;
+
+/* A list of the request to be executed by processor thread */
+static struct __cuttdb_req_list__ {
+    struct __cuttdb_req_list__	*next;
+
+} s_req_list = {0};
+
+atomic_int	s_req_flag;
+
+static pthread_mutex_t	s_req_list_lock = PTHREAD_MUTEX_INITIALIZER;		/* Coordinate access to the req_list */
+
+static pthread_mutex_t	s_req_list_async_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t	s_req_list_async_cond = PTHREAD_COND_INITIALIZER;
+
+static int s_req_async_proc_stop_flag = 0;
+
+
+static	void *	s_req_async_proc	(void *arg)
+{
+int	rc, flag;
+struct timespec tmo = {0};
+
+    log_it(L_NOTICE, "Run processor thread ...");
+
+    while ( !s_req_async_proc_stop_flag )
+        {
+        tmo.tv_sec = time (NULL) + 2;					/* Timeout is 2 seconds */
+
+        if ( ETIMEDOUT == (rc = pthread_mutex_timedlock (&s_req_list_async_lock, &tmo)) )
+            {
+            log_it(L_ERROR, "pthread_mutex_timedlock(req_mutex)->%d, errno=%d", rc, errno);
+            continue;
+            }
+
+        flag = atomic_load(&s_req_flag);
+
+
+        }
+
+    log_it(L_NOTICE, "Exiting processor thread");
+    pthread_exit(NULL);
+}
+
 
 /**
  * @brief Serialize key and val to a item
@@ -233,20 +283,26 @@ ERR:
  * @brief Initiates a CDB with callback fuctions.
  * @param a_cdb_path a path to CDB. Saved in s_cdb_path
  * @param a_drv_callback a struct for callback functions
+ * @param a_db_drvmode_async
  * @return 0 if success, -1 if сouldn't open db directory, -2 if dap_cdb_init_group() returns NULL.
  */
-int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_drv_callback) {
+int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_drv_callback,
+               bool a_db_drvmode_async)
+{
     s_cdb_path = dap_strdup(a_cdb_path);
     if(s_cdb_path[strlen(s_cdb_path)] == '/') {
         s_cdb_path[strlen(s_cdb_path)] = '\0';
     }
+
     dap_mkdir_with_parents(s_cdb_path);
+
     struct dirent *d;
     DIR *dir = opendir(s_cdb_path);
     if (!dir) {
         log_it(L_ERROR, "Couldn't open db directory");
         return -1;
     }
+
     for (d = readdir(dir); d; d = readdir(dir)) {
 #ifdef _DIRENT_HAVE_D_TYPE
         if (d->d_type != DT_DIR)
@@ -274,6 +330,9 @@ int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_
             return -2;
         }
     }
+
+    s_db_drvmode_async = a_db_drvmode_async;	/* DB Driver mode: Async/Sync */
+
     a_drv_callback->read_last_store_obj = dap_db_driver_cdb_read_last_store_obj;
     a_drv_callback->apply_store_obj     = dap_db_driver_cdb_apply_store_obj;
     a_drv_callback->read_store_obj      = dap_db_driver_cdb_read_store_obj;
@@ -285,6 +344,10 @@ int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_
     a_drv_callback->flush               = dap_db_driver_cdb_flush;
 
     closedir(dir);
+
+
+
+
     return CDB_SUCCESS;
 }
 
@@ -583,7 +646,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) {
     if (!l_cdb_i) {
         return -1;
     }
-    if(a_store_obj->type == 'a') {
+    if(a_store_obj->type == DAP_DB$K_OPTYPE_ADD) {
         if(!a_store_obj->key) {
             return -2;
         }
@@ -616,7 +679,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) {
         }
         DAP_DELETE(l_rec.key);
         DAP_DELETE(l_rec.val);
-    } else if(a_store_obj->type == 'd') {
+    } else if(a_store_obj->type == DAP_DB$K_OPTYPE_DEL) {
         if(a_store_obj->key) {
             if(cdb_del(l_cdb_i->cdb, a_store_obj->key, (int) strlen(a_store_obj->key)) == -3)
                 ret = 1;
diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c
index 334b0d3fd3ecbbb96f48e884a547040374b983f7..c24f5fc07267168beb10b12656cf372130517868 100644
--- a/modules/global-db/dap_chain_global_db_driver_sqlite.c
+++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c
@@ -42,8 +42,8 @@
 #define LOG_TAG "db_sqlite"
 
 struct dap_sqlite_conn_pool_item {
-	sqlite3 *conn;
-	int busy;
+    sqlite3 *conn;
+    int busy;
 };
 
 //static sqlite3 *s_db = NULL;
@@ -90,57 +90,63 @@ static sqlite3 *s_sqlite_get_connection(void)
         return s_trans;
     }
 
-	sqlite3 *l_ret = NULL;
-	for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) {
-		if (!s_conn_pool[i].busy) {
-			l_ret = s_conn_pool[i].conn;
-			s_conn_pool[i].busy = 1;
-			break;
-		}
-	}
-
-	pthread_rwlock_unlock(&s_db_rwlock);
-	return l_ret;
+    sqlite3 *l_ret = NULL;
+    for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) {
+        if (!s_conn_pool[i].busy) {
+            l_ret = s_conn_pool[i].conn;
+            s_conn_pool[i].busy = 1;
+            break;
+        }
+    }
+
+    pthread_rwlock_unlock(&s_db_rwlock);
+    return l_ret;
 }
 
 static void s_sqlite_free_connection(sqlite3 *a_conn)
 {
-	if (pthread_rwlock_wrlock(&s_db_rwlock) == EDEADLK) {
-		return;
-	}
-
-	for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) {
-		if (s_conn_pool[i].conn == a_conn) {
-			s_conn_pool[i].busy = 0;
-			break;
-		}
-	}
-
-	pthread_rwlock_unlock(&s_db_rwlock);
+    if (pthread_rwlock_wrlock(&s_db_rwlock) == EDEADLK) {
+        return;
+    }
+
+    for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) {
+        if (s_conn_pool[i].conn == a_conn) {
+            s_conn_pool[i].busy = 0;
+            break;
+        }
+    }
+
+    pthread_rwlock_unlock(&s_db_rwlock);
 }
 
 /**
  * @brief Initializes a SQLite database.
  * @note no thread safe
  * @param a_filename_db a path to the database file
- * @param a_drv_callback a pointer to a structure of callback functions 
+ * @param a_drv_callback a pointer to a structure of callback functions
  * @return If successful returns 0, else a code < 0.
  */
-int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback)
+int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback,
+                  bool db_drvmode_async)
 {
     int l_ret = -1;
+
     if(sqlite3_threadsafe() && !sqlite3_config(SQLITE_CONFIG_SERIALIZED))
         l_ret = sqlite3_initialize();
+
     if(l_ret != SQLITE_OK) {
         log_it(L_ERROR, "Can't init sqlite err=%d (%s)", l_ret, sqlite3_errstr(l_ret));
         return -2;
     }
+
     // Check paths and create them if nessesary
     char * l_filename_dir = dap_path_get_dirname(a_filename_db);
     if(!dap_dir_test(l_filename_dir)){
         log_it(L_NOTICE, "No directory %s, trying to create...",l_filename_dir);
+
         int l_mkdir_ret = dap_mkdir_with_parents(l_filename_dir);
         int l_errno = errno;
+
         if(!dap_dir_test(l_filename_dir)){
             char l_errbuf[255];
             l_errbuf[0] = '\0';
@@ -152,20 +158,21 @@ int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks
             log_it(L_NOTICE,"Directory created");
     }
     DAP_DEL_Z(l_filename_dir);
+
     // Open Sqlite file, create if nessesary
     char *l_error_message = NULL;
-	for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) {
-		s_conn_pool[i].conn = dap_db_driver_sqlite_open(a_filename_db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, &l_error_message);
-		if (!s_conn_pool[i].conn) {
-        	log_it(L_ERROR, "Can't init sqlite err: \"%s\"", l_error_message);
-        	dap_db_driver_sqlite_free(l_error_message);
-        	l_ret = -3;
-			for(int ii = i - 1; ii >= 0; ii--) {
-        		dap_db_driver_sqlite_close(s_conn_pool[ii].conn);
-			}
-			goto end;
-		}
-		sqlite3 *s_db = s_conn_pool[i].conn;
+    for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) {
+        s_conn_pool[i].conn = dap_db_driver_sqlite_open(a_filename_db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, &l_error_message);
+        if (!s_conn_pool[i].conn) {
+            log_it(L_ERROR, "Can't init sqlite err: \"%s\"", l_error_message);
+            dap_db_driver_sqlite_free(l_error_message);
+            l_ret = -3;
+            for(int ii = i - 1; ii >= 0; ii--) {
+                dap_db_driver_sqlite_close(s_conn_pool[ii].conn);
+            }
+            goto end;
+        }
+        sqlite3 *s_db = s_conn_pool[i].conn;
         if(!dap_db_driver_sqlite_set_pragma(s_db, "synchronous", "NORMAL")) // 0 | OFF | 1 | NORMAL | 2 | FULL
             printf("can't set new synchronous mode\n");
         if(!dap_db_driver_sqlite_set_pragma(s_db, "journal_mode", "OFF")) // DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
@@ -173,8 +180,8 @@ int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks
 
         if(!dap_db_driver_sqlite_set_pragma(s_db, "page_size", "1024")) // DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
             printf("can't set page_size\n");
-		s_conn_pool[i].busy = 0;
-	}
+        s_conn_pool[i].busy = 0;
+    }
 
         //      *PRAGMA page_size = bytes; // page size DB; it is reasonable to make it equal to the size of the disk cluster 4096
         //     *PRAGMA cache_size = -kibibytes; // by default it is equal to 2000 pages of database
@@ -197,18 +204,18 @@ end:
 
 /**
  * @brief Deinitializes a SQLite database.
- * 
+ *
  * @return Returns 0 if successful.
  */
 int dap_db_driver_sqlite_deinit(void)
 {
         pthread_rwlock_wrlock(&s_db_rwlock);
-		for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) {
-			if (s_conn_pool[i].conn) {
-        		dap_db_driver_sqlite_close(s_conn_pool[i].conn);
-				s_conn_pool[i].busy = 0;
-			}
-		}
+        for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) {
+            if (s_conn_pool[i].conn) {
+                dap_db_driver_sqlite_close(s_conn_pool[i].conn);
+                s_conn_pool[i].busy = 0;
+            }
+        }
         pthread_rwlock_unlock(&s_db_rwlock);
         //s_db = NULL;
         return sqlite3_shutdown();
@@ -232,7 +239,7 @@ static void byte_to_bin(sqlite3_context *l_context, int a_argc, sqlite3_value **
 
 /**
  * @brief Opens a SQLite database and adds byte_to_bin function.
- * 
+ *
  * @param a_filename_utf8 a SQLite database file name
  * @param a_flags database access flags (SQLITE_OPEN_READONLY, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE)
  * @param a_error_message[out] an error message that's received from the SQLite database
@@ -266,7 +273,7 @@ sqlite3* dap_db_driver_sqlite_open(const char *a_filename_utf8, int a_flags, cha
 
 /**
  * @brief Closes a SQLite database.
- * 
+ *
  * @param l_db a pointer to an instance of SQLite database structure
  * @return (none)
  */
@@ -278,7 +285,7 @@ void dap_db_driver_sqlite_close(sqlite3 *l_db)
 
 /**
  * @brief  Releases memory allocated by sqlite3_mprintf()
- * 
+ *
  * @param memory a pointer to a string
  * @return (none)
  */
@@ -290,7 +297,7 @@ void dap_db_driver_sqlite_free(char *memory)
 
 /**
  * @brief Executes a PRAGMA statement.
- * 
+ *
  * @param a_db a pointer to an instance of SQLite database structure
  * @param a_param a PRAGMA name
  * @param a_mode a PRAGMA value
@@ -314,13 +321,13 @@ bool dap_db_driver_sqlite_set_pragma(sqlite3 *a_db, char *a_param, char *a_mode)
 /**
  * @brief Flushes a SQLite database cahce to disk.
  * @note The function closes and opens the database
- * 
+ *
  * @return Returns 0 if successful.
  */
 int dap_db_driver_sqlite_flush()
 {
     log_it(L_DEBUG, "Start flush sqlite data base.");
-	sqlite3 *s_db = s_sqlite_get_connection();
+    sqlite3 *s_db = s_sqlite_get_connection();
     if(!s_db){
         return -666;
     }
@@ -347,7 +354,7 @@ int dap_db_driver_sqlite_flush()
 
 /**
  * @brief Executes SQL statements.
- * 
+ *
  * @param l_db a pointer to an instance of SQLite database structure
  * @param l_query the SQL statement
  * @param l_error_message[out] an error message that's received from the SQLite database
@@ -373,13 +380,13 @@ static int dap_db_driver_sqlite_exec(sqlite3 *l_db, const char *l_query, char **
 
 /**
  * @brief Creates a table and unique index in the s_db database.
- * 
+ *
  * @param a_table_name a table name string
  * @return Returns 0 if successful, otherwise -1.
  */
 static int dap_db_driver_sqlite_create_group_table(const char *a_table_name)
 {
-	sqlite3 *s_db = s_sqlite_get_connection();
+    sqlite3 *s_db = s_sqlite_get_connection();
     char *l_error_message = NULL;
     if(!s_db || !a_table_name)
         return -1;
@@ -392,7 +399,7 @@ static int dap_db_driver_sqlite_create_group_table(const char *a_table_name)
         log_it(L_ERROR, "Creatу_table : %s\n", l_error_message);
         dap_db_driver_sqlite_free(l_error_message);
         DAP_DELETE(l_query);
-		s_sqlite_free_connection(s_db);
+        s_sqlite_free_connection(s_db);
         return -1;
     }
     DAP_DELETE(l_query);
@@ -403,11 +410,11 @@ static int dap_db_driver_sqlite_create_group_table(const char *a_table_name)
         log_it(L_ERROR, "Create unique index : %s\n", l_error_message);
         dap_db_driver_sqlite_free(l_error_message);
         DAP_DELETE(l_query);
-		s_sqlite_free_connection(s_db);
+        s_sqlite_free_connection(s_db);
         return -1;
     }
     DAP_DELETE(l_query);
-	s_sqlite_free_connection(s_db);
+    s_sqlite_free_connection(s_db);
     return 0;
 }
 
@@ -417,7 +424,7 @@ static int dap_db_driver_sqlite_create_group_table(const char *a_table_name)
  * @param query the query
  * @param l_res[out] a pointer to a pointer to a structure with result
  * @param l_error_message[out] an error message that's received from the SQLite database
- * @return Returns 0 if successful, 
+ * @return Returns 0 if successful,
  */
 static int dap_db_driver_sqlite_query(sqlite3 *db, char *query, sqlite3_stmt **l_res, char **l_error_message)
 {
@@ -438,7 +445,7 @@ static int dap_db_driver_sqlite_query(sqlite3 *db, char *query, sqlite3_stmt **l
 
 /**
  * @brief Releases memory allocated for a row.
- * 
+ *
  * @param row a database row
  * @return (none)
  */
@@ -455,7 +462,7 @@ static void dap_db_driver_sqlite_row_free(SQLITE_ROW_VALUE *row)
 
 /**
  * @brief Fetches a result values from a query to l_row_out
- * 
+ *
  * @param l_res a pointer to a prepared statement structure
  * @param l_row_out a pointer to a pointer to a row structure
  * @return Returns SQLITE_ROW(100) or SQLITE_DONE(101) or SQLITE_BUSY(5)
@@ -508,7 +515,7 @@ static int dap_db_driver_sqlite_fetch_array(sqlite3_stmt *l_res, SQLITE_ROW_VALU
 
 /**
  * @brief Destroys a prepared statement structure
- * 
+ *
  * @param l_res a pointer to the statement structure
  * @return Returnes true if successful, otherwise false.
  */
@@ -524,7 +531,7 @@ static bool dap_db_driver_sqlite_query_free(sqlite3_stmt *l_res)
 
 /**
  * @brief Convers a byte array into a hexadecimal string
- * 
+ *
  * @param blob a byte array
  * @param len a length of byte array
  * @return Returns a hexadecimal string
@@ -545,7 +552,7 @@ static char* dap_db_driver_get_string_from_blob(uint8_t *blob, int len)
 
 /**
  * @brief Executes a VACUUM statement in a database.
- * 
+ *
  * @param l_db a a pointer to an instance of SQLite database structure
  * @return Returns 0 if successful.
  */
@@ -559,12 +566,12 @@ int dap_db_driver_sqlite_vacuum(sqlite3 *l_db)
 
 /**
  * @brief Starts a transaction in s_db database.
- * 
+ *
  * @return Returns 0 if successful, otherwise -1.
  */
 int dap_db_driver_sqlite_start_transaction(void)
 {
-	s_trans = s_sqlite_get_connection();
+    s_trans = s_sqlite_get_connection();
     pthread_rwlock_wrlock(&s_db_rwlock);
     if(!s_trans){
         pthread_rwlock_unlock(&s_db_rwlock);
@@ -582,7 +589,7 @@ int dap_db_driver_sqlite_start_transaction(void)
 
 /**
  * @brief Ends a transaction in s_db database.
- * 
+ *
  * @return Returns 0 if successful, otherwise -1.
  */
 int dap_db_driver_sqlite_end_transaction(void)
@@ -603,7 +610,7 @@ int dap_db_driver_sqlite_end_transaction(void)
 
 /**
  * @brief Replaces '_' char with '.' char in a_table_name.
- * 
+ *
  * @param a_table_name a table name string
  * @return Returns a group name string with the replaced character
  */
@@ -625,7 +632,7 @@ char *dap_db_driver_sqlite_make_group_name(const char *a_table_name)
 
 /**
  * @brief Replaces '.' char with '_' char in a_group_name.
- * 
+ *
  * @param a_group_name a group name string
  * @return Returns a table name string with the replaced character
  */
@@ -647,7 +654,7 @@ char *dap_db_driver_sqlite_make_table_name(const char *a_group_name)
 
 /**
  * @brief Applies an object to a database.
- * 
+ *
  * @param a_store_obj a pointer to the object structure
  * @return Returns 0 if successful.
  */
@@ -658,7 +665,7 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
     char *l_query = NULL;
     char *l_error_message = NULL;
     char *l_table_name = dap_db_driver_sqlite_make_table_name(a_store_obj->group);
-    if(a_store_obj->type == 'a') {
+    if(a_store_obj->type == DAP_DB$K_OPTYPE_ADD) {
         if(!a_store_obj->key)
             return -1;
         char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, (int)a_store_obj->value_len);
@@ -668,7 +675,7 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
                                    l_table_name, a_store_obj->key, a_store_obj->timestamp, l_blob_value);
         dap_db_driver_sqlite_free(l_blob_value);
     }
-    else if (a_store_obj->type == 'd') {
+    else if (a_store_obj->type == DAP_DB$K_OPTYPE_DEL) {
         //delete one record
         if (a_store_obj->key) {
             l_query = sqlite3_mprintf("delete from '%s' where key = '%s'",
@@ -683,7 +690,7 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
         return -1;
     }
     // execute request
-	sqlite3 *s_db = s_sqlite_get_connection();
+    sqlite3 *s_db = s_sqlite_get_connection();
     if(!s_db){
         return -666;
     }
@@ -720,7 +727,7 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
         dap_db_driver_sqlite_free(l_error_message);
         l_ret = -1;
     }
-	s_sqlite_free_connection(s_db);
+    s_sqlite_free_connection(s_db);
     if (a_store_obj->key)
         DAP_DELETE(a_store_obj->key);
     dap_db_driver_sqlite_free(l_query);
@@ -730,7 +737,7 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
 
 /**
  * @brief Fills a object from a row
- * 
+ *
  * @param a_group a group name string
  * @param a_obj a pointer to the object
  * @param a_row a ponter to the row structure
@@ -769,7 +776,7 @@ static void fill_one_item(const char *a_group, dap_store_obj_t *a_obj, SQLITE_RO
 
 /**
  * @brief Reads a last object from the s_db database.
- * 
+ *
  * @param a_group a group name string
  * @return Returns a pointer to the object.
  */
@@ -783,7 +790,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_last_store_obj(const char *a_group)
         return NULL;
     char * l_table_name = dap_db_driver_sqlite_make_table_name(a_group);
     char *l_str_query = sqlite3_mprintf("SELECT id,ts,key,value FROM '%s' ORDER BY id DESC LIMIT 1", l_table_name);
-	sqlite3 *s_db = s_sqlite_get_connection();
+    sqlite3 *s_db = s_sqlite_get_connection();
     if(!s_db){
         return NULL;
     }
@@ -794,7 +801,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_last_store_obj(const char *a_group)
     if(l_ret != SQLITE_OK) {
         //log_it(L_ERROR, "read last l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db));
         dap_db_driver_sqlite_free(l_error_message);
-		s_sqlite_free_connection(s_db);
+        s_sqlite_free_connection(s_db);
         return NULL;
     }
 
@@ -811,19 +818,19 @@ dap_store_obj_t* dap_db_driver_sqlite_read_last_store_obj(const char *a_group)
     dap_db_driver_sqlite_row_free(l_row);
     dap_db_driver_sqlite_query_free(l_res);
 
-	s_sqlite_free_connection(s_db);
+    s_sqlite_free_connection(s_db);
 
     return l_obj;
 }
 
 /**
  * @brief Reads some objects from a database by conditions
- * 
+ *
  * @param a_group a group name string
  * @param a_id id
  * @param a_count_out[in] a number of objects to be read, if equals 0 reads with no limits
- * @param a_count_out[out] a number of objects that were read 
- * @return If successful, a pointer to an objects, otherwise NULL. 
+ * @param a_count_out[out] a number of objects that were read
+ * @return If successful, a pointer to an objects, otherwise NULL.
  */
 dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, uint64_t a_id, size_t *a_count_out)
 {
@@ -846,9 +853,9 @@ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, u
         l_str_query = sqlite3_mprintf("SELECT id,ts,key,value FROM '%s' WHERE id>='%lld' ORDER BY id ASC",
                 l_table_name, a_id);
     }
-	sqlite3 *s_db = s_sqlite_get_connection();
+    sqlite3 *s_db = s_sqlite_get_connection();
     if(!s_db){
-		if (l_str_query) sqlite3_free(l_str_query);
+        if (l_str_query) sqlite3_free(l_str_query);
         return NULL;
     }
 
@@ -859,7 +866,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, u
     if(l_ret != SQLITE_OK) {
         //log_it(L_ERROR, "read l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db));
         dap_db_driver_sqlite_free(l_error_message);
-		s_sqlite_free_connection(s_db);
+        s_sqlite_free_connection(s_db);
         return NULL;
     }
 
@@ -889,7 +896,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, u
     } while(l_row);
 
     dap_db_driver_sqlite_query_free(l_res);
-	s_sqlite_free_connection(s_db);
+    s_sqlite_free_connection(s_db);
 
     if(a_count_out)
         *a_count_out = (size_t)l_count_out;
@@ -907,7 +914,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, u
  */
 dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const char *a_key, size_t *a_count_out)
 {
-	sqlite3 *s_db = s_sqlite_get_connection();
+    sqlite3 *s_db = s_sqlite_get_connection();
     if(!a_group || !s_db)
         return NULL;
     dap_store_obj_t *l_obj = NULL;
@@ -940,7 +947,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const
     DAP_DEL_Z(l_table_name);
     if(l_ret != SQLITE_OK) {
         //log_it(L_ERROR, "read l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db));
-		s_sqlite_free_connection(s_db);
+        s_sqlite_free_connection(s_db);
         return NULL;
     }
 
@@ -970,7 +977,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const
     } while(l_row);
 
     dap_db_driver_sqlite_query_free(l_res);
-	s_sqlite_free_connection(s_db);
+    s_sqlite_free_connection(s_db);
 
     if(a_count_out)
         *a_count_out = l_count_out;
@@ -979,13 +986,13 @@ dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const
 
 /**
  * @brief Gets a list of group names from a s_db database by a_group_mask.
- * 
+ *
  * @param a_group_mask a group name mask
  * @return Returns a pointer to a list of group names.
  */
 dap_list_t* dap_db_driver_sqlite_get_groups_by_mask(const char *a_group_mask)
 {
-	sqlite3 *s_db = s_sqlite_get_connection();
+    sqlite3 *s_db = s_sqlite_get_connection();
     if(!a_group_mask || !s_db)
         return NULL;
     sqlite3_stmt *l_res;
@@ -994,7 +1001,7 @@ dap_list_t* dap_db_driver_sqlite_get_groups_by_mask(const char *a_group_mask)
     int l_ret = dap_db_driver_sqlite_query(s_db, (char *)l_str_query, &l_res, NULL);
     if(l_ret != SQLITE_OK) {
         //log_it(L_ERROR, "Get tables l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db));
-		s_sqlite_free_connection(s_db);
+        s_sqlite_free_connection(s_db);
         return NULL;
     }
     char * l_mask = dap_db_driver_sqlite_make_table_name(a_group_mask);
@@ -1007,21 +1014,21 @@ dap_list_t* dap_db_driver_sqlite_get_groups_by_mask(const char *a_group_mask)
     }
     dap_db_driver_sqlite_query_free(l_res);
 
-	s_sqlite_free_connection(s_db);
+    s_sqlite_free_connection(s_db);
 
     return l_ret_list;
 }
 
 /**
  * @brief Reads a number of objects from a s_db database by a_group and a_id
- * 
+ *
  * @param a_group a group name string
  * @param a_id id starting from which the quantity is calculated
  * @return Returns a number of objects.
  */
 size_t dap_db_driver_sqlite_read_count_store(const char *a_group, uint64_t a_id)
 {
-	sqlite3 *s_db = s_sqlite_get_connection();
+    sqlite3 *s_db = s_sqlite_get_connection();
     sqlite3_stmt *l_res;
     if(!a_group || ! s_db)
         return 0;
@@ -1034,7 +1041,7 @@ size_t dap_db_driver_sqlite_read_count_store(const char *a_group, uint64_t a_id)
 
     if(l_ret != SQLITE_OK) {
         //log_it(L_ERROR, "Count l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db));
-		s_sqlite_free_connection(s_db);
+        s_sqlite_free_connection(s_db);
         return 0;
     }
     size_t l_ret_val = 0;
@@ -1045,21 +1052,21 @@ size_t dap_db_driver_sqlite_read_count_store(const char *a_group, uint64_t a_id)
     }
     dap_db_driver_sqlite_query_free(l_res);
 
-	s_sqlite_free_connection(s_db);
+    s_sqlite_free_connection(s_db);
 
     return l_ret_val;
 }
 
 /**
  * @brief Checks if an object is in a s_db database by a_group and a_key.
- * 
+ *
  * @param a_group a group name string
  * @param a_key a object key string
  * @return Returns true if it is, false it's not.
  */
 bool dap_db_driver_sqlite_is_obj(const char *a_group, const char *a_key)
 {
-	sqlite3 *s_db = s_sqlite_get_connection();
+    sqlite3 *s_db = s_sqlite_get_connection();
     sqlite3_stmt *l_res;
     if(!a_group || ! s_db)
         return false;
@@ -1072,7 +1079,7 @@ bool dap_db_driver_sqlite_is_obj(const char *a_group, const char *a_key)
 
     if(l_ret != SQLITE_OK) {
         //log_it(L_ERROR, "Exists l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db));
-		s_sqlite_free_connection(s_db);
+        s_sqlite_free_connection(s_db);
         return false;
     }
     bool l_ret_val = false;
@@ -1083,7 +1090,7 @@ bool dap_db_driver_sqlite_is_obj(const char *a_group, const char *a_key)
     }
     dap_db_driver_sqlite_query_free(l_res);
 
-	s_sqlite_free_connection(s_db);
+    s_sqlite_free_connection(s_db);
 
     return l_ret_val;
 }
diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c
index 53bec9f4efe378aa2e0f7f0d0544b9178cdcf544..e2e4729888fa2aed4f9f0c7bf574033ff0943f96 100644
--- a/modules/global-db/dap_chain_global_db_remote.c
+++ b/modules/global-db/dap_chain_global_db_remote.c
@@ -22,25 +22,25 @@
  */
 static bool dap_db_set_cur_node_addr_common(uint64_t a_address, char *a_net_name, time_t a_expire_time)
 {
+char	l_key [DAP_DB_K_MAXKEYLEN];
+bool	l_ret;
+
     if(!a_net_name)
         return false;
-    char *l_key = dap_strdup_printf("cur_node_addr_%s", a_net_name);
-    uint64_t * l_address = DAP_NEW_Z(uint64_t);
-    *l_address = a_address;
-    bool l_ret = dap_chain_global_db_gr_set(l_key, (uint8_t*) l_address, sizeof(a_address), GROUP_LOCAL_GENERAL);
-    //DAP_DELETE(l_key);
-    if(l_ret) {
-        time_t *l_cur_time = DAP_NEW_Z(time_t);
-        *l_cur_time= a_expire_time;
-        char *l_key_time = dap_strdup_printf("cur_node_addr_%s_time", a_net_name);
-        l_ret = dap_chain_global_db_gr_set(l_key_time, (uint8_t*) l_cur_time, sizeof(time_t), GROUP_LOCAL_GENERAL);
+
+    dap_snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s", a_net_name);
+
+    if ( !(l_ret = dap_chain_global_db_gr_set(l_key, &a_address, sizeof(a_address), GROUP_LOCAL_GENERAL)) ) {
+        dap_snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s_time", a_net_name);
+        l_ret = dap_chain_global_db_gr_set(l_key, &a_expire_time, sizeof(time_t), GROUP_LOCAL_GENERAL);
     }
+
     return l_ret;
 }
 
 /**
  * @brief Sets an adress of a current node and no expire time.
- * 
+ *
  * @param a_address an adress of a current node
  * @param a_net_name a net name string
  * @return Returns true if siccessful, otherwise false
@@ -52,7 +52,7 @@ bool dap_db_set_cur_node_addr(uint64_t a_address, char *a_net_name )
 
 /**
  * @brief Sets an adress of a current node and expire time.
- * 
+ *
  * @param a_address an adress of a current node
  * @param a_net_name a net name string
  * @return Returns true if siccessful, otherwise false
@@ -65,32 +65,45 @@ bool dap_db_set_cur_node_addr_exp(uint64_t a_address, char *a_net_name )
 
 /**
  * @brief Gets an adress of current node by a net name.
- * 
+ *
  * @param a_net_name a net name string
  * @return Returns an adress if successful, otherwise 0.
  */
 uint64_t dap_db_get_cur_node_addr(char *a_net_name)
 {
+char	l_key[DAP_DB_K_MAXKEYLEN], l_key_time[DAP_DB_K_MAXKEYLEN];
+uint8_t *l_node_addr_data, *l_node_time_data;
     size_t l_node_addr_len = 0, l_node_time_len = 0;
+uint64_t l_node_addr_ret = 0;
+time_t l_node_time = 0;
+
     if(!a_net_name)
         return 0;
-    char *l_key = dap_strdup_printf("cur_node_addr_%s", a_net_name);
-    char *l_key_time = dap_strdup_printf("cur_node_addr_%s_time", a_net_name);
-    uint8_t *l_node_addr_data = dap_chain_global_db_gr_get(l_key, &l_node_addr_len, GROUP_LOCAL_GENERAL);
-    uint8_t *l_node_time_data = dap_chain_global_db_gr_get(l_key_time, &l_node_time_len, GROUP_LOCAL_GENERAL);
-    uint64_t l_node_addr_ret = 0;
-    time_t l_node_time = 0;
+
+    dap_snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s", a_net_name);
+    dap_snprintf(l_key_time, sizeof(l_key_time) - 1, "cur_node_addr_%s_time", a_net_name);
+
+    l_node_addr_data = dap_chain_global_db_gr_get(l_key, &l_node_addr_len, GROUP_LOCAL_GENERAL);
+    l_node_time_data = dap_chain_global_db_gr_get(l_key_time, &l_node_time_len, GROUP_LOCAL_GENERAL);
+
     if(l_node_addr_data && l_node_addr_len == sizeof(uint64_t))
-        memcpy(&l_node_addr_ret, l_node_addr_data, l_node_addr_len);
+        l_node_addr_ret = *( (uint64_t *) l_node_addr_data );
+
     if(l_node_time_data && l_node_time_len == sizeof(time_t))
-        memcpy(&l_node_time, l_node_time_data, l_node_time_len);
+        l_node_time = *( (time_t *) l_node_time_data );
+
+    DAP_DELETE(l_node_addr_data);
+    DAP_DELETE(l_node_time_data);
+
     // time delta in seconds
     static int64_t addr_time_expired = -1;
     // read time-expired
+
     if(addr_time_expired == -1) {
         dap_string_t *l_cfg_path = dap_string_new("network/");
         dap_string_append(l_cfg_path, a_net_name);
         dap_config_t *l_cfg;
+
         if((l_cfg = dap_config_open(l_cfg_path->str)) == NULL) {
             log_it(L_ERROR, "Can't open default network config");
             addr_time_expired = 0;
@@ -101,21 +114,19 @@ uint64_t dap_db_get_cur_node_addr(char *a_net_name)
         }
         dap_string_free(l_cfg_path, true);
     }
+
     time_t l_dt = time(NULL) - l_node_time;
     //NODE_TIME_EXPIRED
     if(l_node_time && l_dt > addr_time_expired) {
         l_node_addr_ret = 0;
     }
-    DAP_DELETE(l_key);
-    DAP_DELETE(l_key_time);
-    DAP_DELETE(l_node_addr_data);
-    DAP_DELETE(l_node_time_data);
+
     return l_node_addr_ret;
 }
 
 /**
  * @brief Sets last id of a remote node.
- * 
+ *
  * @param a_node_addr a node adress
  * @param a_id id
  * @param a_group a group name string
@@ -123,18 +134,15 @@ uint64_t dap_db_get_cur_node_addr(char *a_net_name)
  */
 bool dap_db_set_last_id_remote(uint64_t a_node_addr, uint64_t a_id, char *a_group)
 {
-    //log_it( L_DEBUG, "Node 0x%016X set last synced id %"DAP_UINT64_FORMAT_U"", a_node_addr, a_id);
-    char *l_node_addr_str = dap_strdup_printf("%ju%s", a_node_addr, a_group);
-    uint64_t *l_id = DAP_NEW(uint64_t);
-    *l_id = a_id;
-    bool l_ret = dap_chain_global_db_gr_set(l_node_addr_str, l_id, sizeof(uint64_t),
-                                            GROUP_LOCAL_NODE_LAST_ID);
-    return l_ret;
+char	l_key[DAP_DB_K_MAXKEYLEN];
+
+    dap_snprintf(l_key, sizeof(l_key) - 1, "%ju%s", a_node_addr, a_group);
+    return  dap_chain_global_db_gr_set(l_key, &a_id, sizeof(uint64_t), GROUP_LOCAL_NODE_LAST_ID);
 }
 
 /**
  * @brief Gets last id of a remote node.
- * 
+ *
  * @param a_node_addr a node adress
  * @param a_group a group name string
  * @return Returns id if successful, otherwise 0.
@@ -157,22 +165,24 @@ uint64_t dap_db_get_last_id_remote(uint64_t a_node_addr, char *a_group)
 
 /**
  * @brief Sets the last hash of a remote node.
- * 
+ *
  * @param a_node_addr a node adress
  * @param a_chain a pointer to the chain stucture
- * @param a_hash a 
- * @return true 
- * @return false 
+ * @param a_hash a
+ * @return true
+ * @return false
  */
 bool dap_db_set_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_hash)
 {
-    return dap_chain_global_db_gr_set(dap_strdup_printf("%ju%s%s", a_node_addr, a_chain->net_name, a_chain->name),
-                                      DAP_DUP(a_hash), sizeof(*a_hash), GROUP_LOCAL_NODE_LAST_ID);
+char	l_key[DAP_DB_K_MAXKEYLEN];
+
+    dap_snprintf(l_key, sizeof(l_key) - 1, "%ju%s%s", a_node_addr, a_chain->net_name, a_chain->name);
+    return dap_chain_global_db_gr_set(l_key, a_hash, sizeof(dap_chain_hash_fast_t), GROUP_LOCAL_NODE_LAST_ID);
 }
 
 /**
  * @brief Gets the last hash of a remote node.
- * 
+ *
  * @param a_node_addr a node adress
  * @param a_chain a pointer to a chain structure
  * @return Returns a hash if successful.
@@ -189,7 +199,7 @@ dap_chain_hash_fast_t *dap_db_get_last_hash_remote(uint64_t a_node_addr, dap_cha
 
 /**
  * @brief Gets a size of an object.
- * 
+ *
  * @param store_obj a pointer to the object
  * @return Returns the size.
  */
@@ -204,7 +214,7 @@ static size_t dap_db_get_size_pdap_store_obj_t(pdap_store_obj_t store_obj)
 /**
  * @brief Multiples data into a_old_pkt structure from a_new_pkt structure.
  * @param a_old_pkt a pointer to the old object
- * @param a_new_pkt a pointer to the new object 
+ * @param a_new_pkt a pointer to the new object
  * @return Returns a pointer to the multiple object
  */
 dap_store_obj_pkt_t *dap_store_packet_multiple(dap_store_obj_pkt_t *a_old_pkt, dap_store_obj_pkt_t *a_new_pkt)
@@ -224,7 +234,7 @@ dap_store_obj_pkt_t *dap_store_packet_multiple(dap_store_obj_pkt_t *a_old_pkt, d
 
 /**
  * @brief Changes id in a packed structure.
- * 
+ *
  * @param a_pkt a pointer to the packed structure
  * @param a_id id
  * @return (none)
diff --git a/modules/global-db/include/dap_chain_global_db.h b/modules/global-db/include/dap_chain_global_db.h
index 98129b6a05c45f107c2bd08fdcc747527afdc470..d8f7705fd31a4c4d686dce2abbf9933ce04f91a3 100644
--- a/modules/global-db/include/dap_chain_global_db.h
+++ b/modules/global-db/include/dap_chain_global_db.h
@@ -26,6 +26,11 @@ typedef struct dap_global_db_obj {
 typedef void (*dap_global_db_obj_callback_notify_t) (void * a_arg, const char a_op_code, const char * a_group,
                                                      const char * a_key, const void * a_value, const size_t a_value_len);
 
+
+#define	DAP_DB_K_MAXKEYLEN	128			/* @RRL: A maximum key's size */
+#define	DAP_DB_K_MAXGRPLEN	128			/* @RRL: A maximum group name  */
+
+
 /**
  * Flush DB
  */
@@ -68,13 +73,13 @@ uint8_t * dap_chain_global_db_get(const char *a_key, size_t *a_data_len_out);
 /**
  * Set one entry to base
  */
-bool dap_chain_global_db_gr_set(char *a_key,  void *a_value, size_t a_value_len, const char *a_group);
+bool dap_chain_global_db_gr_set(const char *a_key,  const void *a_value, size_t a_value_len, const char *a_group);
 bool dap_chain_global_db_set( char *a_key, void *a_value, size_t a_value_len);
 
 /**
  * Delete entry from base
  */
-bool dap_chain_global_db_gr_del(char *a_key, const char *a_group);
+bool dap_chain_global_db_gr_del(const char *a_key, const char *a_group);
 bool dap_chain_global_db_del(char *a_key);
 
 /**
@@ -98,7 +103,7 @@ dap_global_db_obj_t* dap_chain_global_db_load(size_t *a_data_size_out);
  *
  * @return
  */
-bool dap_chain_global_db_obj_save(void* a_store_data, size_t a_objs_count);
+bool dap_chain_global_db_obj_save(dap_store_obj_t *a_store_data, size_t a_objs_count);
 bool dap_chain_global_db_gr_save(dap_global_db_obj_t* a_objs, size_t a_objs_count, const char *a_group);
 bool dap_chain_global_db_save(dap_global_db_obj_t* a_objs, size_t a_objs_count);
 /**
diff --git a/modules/global-db/include/dap_chain_global_db_driver.h b/modules/global-db/include/dap_chain_global_db_driver.h
index af3174367a78d9829d843eb7398a8cbff2055337..e9c6670fbf24eb05bf5fcbd301f3998028d04e99 100644
--- a/modules/global-db/include/dap_chain_global_db_driver.h
+++ b/modules/global-db/include/dap_chain_global_db_driver.h
@@ -29,10 +29,17 @@
 #include "dap_common.h"
 #include "dap_list.h"
 
+enum    {
+    DAP_DB$K_OPTYPE_ADD  = 'a',                 /* Operation Type = INSERT/ADD */
+    DAP_DB$K_OPTYPE_DEL  = 'd',                 /*  -- // -- DELETE */
+
+};
+
+
 typedef struct dap_store_obj {
-	uint64_t id;
+    uint64_t id;
     uint64_t timestamp;
-	uint8_t type;
+    uint32_t type;                               /* Operation type: ADD/DELETE, see DAP_DB$K_OPTYPE_* constants */
     char *group;
     char *key;
     const char *c_key;
@@ -44,7 +51,7 @@ typedef struct dap_store_obj_pkt {
     uint64_t timestamp;
     uint64_t data_size;
     uint32_t obj_count;
-	uint8_t data[];
+    uint8_t data[];
 }__attribute__((packed)) dap_store_obj_pkt_t;
 
 typedef int (*dap_db_driver_write_callback_t)(dap_store_obj_t*);
@@ -71,7 +78,7 @@ typedef struct dap_db_driver_callbacks {
 } dap_db_driver_callbacks_t;
 
 
-int dap_db_driver_init(const char *driver_name, const char *a_filename_db);
+int dap_db_driver_init(const char *driver_name, const char *a_filename_db, bool a_db_drvmode_async);
 void dap_db_driver_deinit(void);
 
 dap_store_obj_t* dap_store_obj_copy(dap_store_obj_t *a_store_obj, size_t a_store_count);
@@ -80,7 +87,7 @@ int dap_db_driver_flush(void);
 
 char* dap_chain_global_db_driver_hash(const uint8_t *data, size_t data_size);
 
-int dap_chain_global_db_driver_appy(pdap_store_obj_t a_store_obj, size_t a_store_count);
+int dap_chain_global_db_driver_apply(pdap_store_obj_t a_store_obj, size_t a_store_count);
 int dap_chain_global_db_driver_add(pdap_store_obj_t a_store_obj, size_t a_store_count);
 int dap_chain_global_db_driver_delete(pdap_store_obj_t a_store_obj, size_t a_store_count);
 dap_store_obj_t* dap_chain_global_db_driver_read_last(const char *a_group);
diff --git a/modules/global-db/include/dap_chain_global_db_driver_cdb.h b/modules/global-db/include/dap_chain_global_db_driver_cdb.h
index b5011f6bb97ff334629f8b6aa5115b25999d7a4c..891ebbcf0fc917b7b58c8a80ef2b08942684a36c 100644
--- a/modules/global-db/include/dap_chain_global_db_driver_cdb.h
+++ b/modules/global-db/include/dap_chain_global_db_driver_cdb.h
@@ -38,7 +38,7 @@ typedef struct _cdb_record {
     char *val;
 } cdb_record, *pcdb_record;
 
-int dap_db_driver_cdb_init(const char*, dap_db_driver_callbacks_t*);
+int dap_db_driver_cdb_init(const char *, dap_db_driver_callbacks_t *, bool);
 int dap_db_driver_cdb_deinit();
 int dap_db_driver_cdb_flush(void);
 
diff --git a/modules/global-db/include/dap_chain_global_db_driver_sqlite.h b/modules/global-db/include/dap_chain_global_db_driver_sqlite.h
index aa5e50219b6c86a427b5d4b7ab79dad95ad0ae33..bc3679adbe608e5e0f32a148fb825933c467bf96 100644
--- a/modules/global-db/include/dap_chain_global_db_driver_sqlite.h
+++ b/modules/global-db/include/dap_chain_global_db_driver_sqlite.h
@@ -29,7 +29,7 @@
 
 #define DAP_SQLITE_POOL_COUNT                   16
 
-int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback);
+int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback, bool db_drvmode_async);
 int dap_db_driver_sqlite_deinit(void);
 
 sqlite3* dap_db_driver_sqlite_open(const char *a_filename_utf8, int a_flags, char **error_message);
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index 5685e903c6bb026a3d1f3bf19b819f6faaaef9ee..e7080e4b9c1317e9655dbddbe8fcb06b3baba9f6 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -77,24 +77,26 @@ int dap_datum_mempool_init(void)
  * @param a_datum
  * @return
  */
-char *dap_chain_mempool_datum_add(dap_chain_datum_t * a_datum, dap_chain_t * a_chain )
+char *dap_chain_mempool_datum_add(const dap_chain_datum_t * a_datum, const dap_chain_t * a_chain )
 {
     if( a_datum == NULL){
         log_it(L_ERROR, "NULL datum trying to add in mempool");
         return NULL;
     }
+
     dap_chain_hash_fast_t l_key_hash;
+
     dap_hash_fast(a_datum->data , a_datum->header.data_size, &l_key_hash);
     char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
     char * l_gdb_group = dap_chain_net_get_gdb_group_mempool(a_chain);
-    if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (byte_t *) a_datum, dap_chain_datum_size(a_datum)
-            ,l_gdb_group)) {
+
+    if(dap_chain_global_db_gr_set( l_key_str, a_datum, dap_chain_datum_size(a_datum), l_gdb_group)) {
         log_it(L_NOTICE, "Datum with data's hash %s was placed in mempool", l_key_str);
     } else {
         log_it(L_WARNING, "Can't place data's hash %s was placed in mempool", l_key_str);
         DAP_DELETE(l_key_str);
-	l_key_str = NULL;
     }
+
     DAP_DELETE(l_gdb_group);
     return l_key_str;
 }
@@ -168,11 +170,13 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_
     dap_hash_fast(l_tx, l_tx_size, l_ret);
     DAP_DELETE(l_tx);
     char *l_hash_str = dap_chain_mempool_datum_add(l_datum, a_chain);
+
+    DAP_DELETE( l_datum );
+
     if (l_hash_str) {
         DAP_DELETE(l_hash_str);
         return l_ret;
     }else{
-        DAP_DELETE( l_datum );
         DAP_DELETE(l_ret);
         return NULL;
     }
@@ -452,10 +456,12 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t *
     else
         l_gdb_group = dap_chain_net_get_gdb_group_mempool_by_chain_type( a_net ,CHAIN_TYPE_TX);
 
-    if( dap_chain_global_db_gr_set( dap_strdup(l_key_str), (uint8_t *) l_datum, dap_chain_datum_size(l_datum)
-                                   , l_gdb_group ) ) {
+    if( dap_chain_global_db_gr_set( l_key_str, l_datum, dap_chain_datum_size(l_datum), l_gdb_group ) ) {
         log_it(L_NOTICE, "Transaction %s placed in mempool", l_key_str);
+
+    DAP_DELETE(l_datum);
     }
+
     DAP_DELETE(l_gdb_group);
     DAP_DELETE(l_key_str);
 
@@ -623,10 +629,11 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net,
 
     char * l_key_str = dap_chain_hash_fast_to_str_new( l_key_hash );
     char * l_gdb_group = dap_chain_net_get_gdb_group_mempool_by_chain_type( a_net ,CHAIN_TYPE_TX);
-    if( dap_chain_global_db_gr_set( dap_strdup(l_key_str), (uint8_t *) l_datum, dap_chain_datum_size(l_datum)
-                                   , l_gdb_group ) ) {
+
+    if( dap_chain_global_db_gr_set( l_key_str, l_datum, dap_chain_datum_size(l_datum), l_gdb_group ) ) {
         log_it(L_NOTICE, "Transaction %s placed in mempool", l_key_str);
     }
+
     DAP_DELETE(l_gdb_group);
     DAP_DELETE(l_key_str);
 
@@ -936,7 +943,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
                 case DAP_DATUM_MEMPOOL_ADD: // add datum in base
                     //a_value = DAP_NEW_Z_SIZE(char, request_size * 2);
                     //bin2hex((char*) a_value, (const unsigned char*) request_str, request_size);
-                    if(dap_chain_global_db_gr_set(dap_strdup(a_key), request_str,(size_t) request_size,
+                    if ( dap_chain_global_db_gr_set(a_key, request_str, request_size,
                             dap_config_get_item_str_default(g_config, "mempool", "gdb_group", "datum-pool"))) {
                         *return_code = Http_Status_OK;
                     }
@@ -955,8 +962,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
                         DAP_DEL_Z(str);
                         log_it(L_INFO, "Check hash: key=%s result: Present", a_key);
                     }
-                    else
-                    {
+                    else {
                         dg->response = strdup("0");
                         log_it(L_INFO, "Check hash: key=%s result: Absent", a_key);
                     }
@@ -967,14 +973,13 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
 
                 case DAP_DATUM_MEMPOOL_DEL: // delete datum in base
                     strcpy(cl_st->reply_mime, "text/text");
-                    if(dap_chain_global_db_gr_del( dap_strdup(a_key),
+                    if(dap_chain_global_db_gr_del( a_key,
                             dap_config_get_item_str_default(g_config, "mempool", "gdb_group", "datum-pool"))) {
                         dg->response = strdup("1");
 
                         log_it(L_INFO, "Delete hash: key=%s result: Ok", a_key);
                     }
-                    else
-                    {
+                    else {
                         dg->response = strdup("0");
                         log_it(L_INFO, "Delete hash: key=%s result: False!", a_key);
                     }
@@ -991,19 +996,16 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
                     return;
                 }
                 DAP_DEL_Z(a_key);
-            } else{
-                *return_code = Http_Status_BadRequest;
-            }
+            } else  *return_code = Http_Status_BadRequest;
 
             DAP_DELETE(request_str);
         }
-        else
-            *return_code = Http_Status_BadRequest;
+        else    *return_code = Http_Status_BadRequest;
+
         enc_http_delegate_delete(dg);
     }
-    else {
-        *return_code = Http_Status_Unauthorized;
-    }
+    else    *return_code = Http_Status_Unauthorized;
+
     if(hdr_session_close_id && hdr_session_close_id->value && !strcmp(hdr_session_close_id->value, "yes")) {
         // close session
         if(hdr_key_id && hdr_key_id->value) {
diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h
index 631459d42c9959e90e2884f7b14942945313f5be..56dc212e3eb3957c3e1065f27a5bade5cac5f6e4 100644
--- a/modules/mempool/include/dap_chain_mempool.h
+++ b/modules/mempool/include/dap_chain_mempool.h
@@ -43,7 +43,7 @@ void dap_datum_mempool_free(dap_datum_mempool_t *datum);
 
 void dap_chain_mempool_add_proc(dap_http_t * a_http_server, const char * a_url);
 
-char *dap_chain_mempool_datum_add(dap_chain_datum_t *a_datum, dap_chain_t *a_chain);
+char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, const dap_chain_t *a_chain);
 dap_hash_fast_t*  dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_from,
         const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to,
         const dap_chain_addr_t* a_addr_fee,
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index dceb80d9a3b1ba45116b8ef0c81d7620ef182637..edb8e96262f4b8573b28eb96314ef8dae0599cf0 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -316,9 +316,9 @@ int dap_chain_net_init()
 
 /**
  * @brief get certificate hash from chain config [acl_accept_ca_gdb] param
- * 
+ *
  * @param a_net dap_chain_net_t chain object
- * @return char* 
+ * @return char*
  */
 char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net)
 {
@@ -338,9 +338,9 @@ char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net)
 
 /**
  * @brief convert dap_chain_net_state_t net state object to string
- * 
+ *
  * @param l_state dap_chain_net_state_t
- * @return const char* 
+ * @return const char*
  */
 inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state)
 {
@@ -349,10 +349,10 @@ inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state)
 
 /**
  * @brief set current network state to F_DAP_CHAIN_NET_GO_SYNC
- * 
+ *
  * @param a_net dap_chain_net_t network object
  * @param a_new_state dap_chain_net_state_t new network state
- * @return int 
+ * @return int
  */
 int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state)
 {
@@ -384,7 +384,7 @@ dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net)
 
 /**
  * @brief set s_srv_callback_notify
- * 
+ *
  * @param a_callback dap_global_db_obj_callback_notify_t callback function
  */
 void dap_chain_net_add_notify_callback(dap_chain_net_t *a_net, dap_global_db_obj_callback_notify_t a_callback)
@@ -411,20 +411,20 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c
     dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg;
     if (PVT(l_net)->state == NET_STATE_ONLINE) {
         char *l_group;
-        if (a_op_code == 'd') {
+        if (a_op_code == DAP_DB$K_OPTYPE_DEL ) {
             l_group = dap_strdup_printf("%s.del", a_group);
         } else {
             l_group = (char *)a_group;
         }
         dap_store_obj_t *l_obj = (dap_store_obj_t *)dap_chain_global_db_obj_get(a_key, l_group);
-        if (a_op_code == 'd') {
+        if ( a_op_code == DAP_DB$K_OPTYPE_DEL ) {
             DAP_DELETE(l_group);
         }
         if (!l_obj) {
             log_it(L_DEBUG, "Notified GDB event does not exist");
             return;
         }
-        l_obj->type = (uint8_t)a_op_code;
+        l_obj->type = a_op_code;
         DAP_DELETE(l_obj->group);
         l_obj->group = dap_strdup(a_group);
         dap_store_obj_pkt_t *l_data_out = dap_store_packet_single(l_obj);
@@ -432,7 +432,7 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c
         dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb");
         dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t) {};
         dap_chain_cell_id_t l_cell_id = l_chain ? l_chain->cells->id : (dap_chain_cell_id_t){};
-        pthread_rwlock_rdlock(&PVT(l_net)->rwlock);   
+        pthread_rwlock_rdlock(&PVT(l_net)->rwlock);
         for (dap_list_t *l_tmp = PVT(l_net)->net_links; l_tmp; l_tmp = dap_list_next(l_tmp)) {
             dap_chain_node_client_t *l_node_client = ((struct net_link *)l_tmp->data)->link;
             if (!l_node_client)
@@ -451,7 +451,7 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c
 
 /**
  * @brief added like callback in dap_chain_global_db_add_sync_group
- * 
+ *
  * @param a_arg arguments. Can be network object (dap_chain_net_t)
  * @param a_op_code object type (f.e. l_net->type from dap_store_obj)
  * @param a_group group, for example "chain-gdb.home21-network.chain-F"
@@ -714,7 +714,7 @@ static void s_node_link_remove(dap_chain_net_pvt_t *a_net_pvt, dap_chain_node_cl
  */
 
 static void s_node_link_callback_disconnected(dap_chain_node_client_t *a_node_client, void *a_arg)
-{ 
+{
     dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg;
     dap_chain_net_pvt_t *l_net_pvt = PVT(l_net);
     pthread_rwlock_wrlock(&l_net_pvt->rwlock);
@@ -1064,7 +1064,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
                 dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t);
                 l_link_node_info->hdr.address.uint64 = l_net_pvt->gdb_sync_nodes_addrs[i].uint64;
                 l_link_node_info->hdr.ext_addr_v4.s_addr = l_net_pvt->gdb_sync_nodes_links_ips[i];
-                l_link_node_info->hdr.ext_port = l_net_pvt->gdb_sync_nodes_links_ports[i];              
+                l_link_node_info->hdr.ext_port = l_net_pvt->gdb_sync_nodes_links_ports[i];
                 struct net_link *l_new_link = DAP_NEW_Z(struct net_link);
                 l_new_link->link_info = l_link_node_info;
                 l_net_pvt->net_links = dap_list_append(l_net_pvt->net_links, l_new_link);
@@ -1076,7 +1076,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
                     dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(l_net, &l_net_pvt->node_info->links[i]);
                     if (!l_link_node_info || l_link_node_info->hdr.address.uint64 == l_own_addr) {
                         continue;   // Do not link with self
-                    }        
+                    }
                     struct net_link *l_new_link = DAP_NEW_Z(struct net_link);
                     l_new_link->link_info = l_link_node_info;
                     l_net_pvt->net_links = dap_list_append(l_net_pvt->net_links, l_new_link);
@@ -1106,7 +1106,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
                 case NODE_ROLE_FULL:
                 case NODE_ROLE_MASTER:
                 case NODE_ROLE_LIGHT:
-                default: {              
+                default: {
                     if (!l_net_pvt->seed_aliases_count && ! l_net_pvt->bootstrap_nodes_count) {
                        log_it(L_ERROR, "No root servers present in configuration file. Can't establish DNS requests");
                        if (l_net_pvt->net_links) { // We have other links
@@ -1230,7 +1230,7 @@ bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t *
     pthread_rwlock_rdlock(&l_net_pvt->rwlock);
     if (!a_client || l_net_pvt->active_link == a_client)
         l_net_pvt->active_link = NULL;
-    pthread_rwlock_unlock(&l_net_pvt->rwlock);   
+    pthread_rwlock_unlock(&l_net_pvt->rwlock);
     while (l_net_pvt->active_link == NULL && l_net_pvt->links_queue) {
         dap_events_socket_uuid_t *l_uuid = l_net_pvt->links_queue->data;
         dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid);
@@ -1289,10 +1289,10 @@ dap_chain_node_role_t dap_chain_net_get_role(dap_chain_net_t * a_net)
 /**
  * @brief set node role
  * [root_master, root, archive, cell_master, master, full, light]
- * @param a_id 
- * @param a_name 
- * @param a_node_role 
- * @return dap_chain_net_t* 
+ * @param a_id
+ * @param a_name
+ * @param a_node_role
+ * @return dap_chain_net_t*
  */
 static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name ,
                                     const char * a_node_role)
@@ -1371,7 +1371,7 @@ void dap_chain_net_delete( dap_chain_net_t * a_net )
 
 
 /**
- * @brief 
+ * @brief
  * load network config settings
  */
 void dap_chain_net_load_all()
@@ -1766,7 +1766,7 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
                     dap_chain_node_cli_set_reply_text(a_str_reply, "Database ACL group not defined for this network");
                     return -11;
                 }
-                ret = dap_chain_global_db_gr_set(dap_strdup(l_hash_hex_str), (void *)&c, 1, dap_chain_net_get_gdb_group_acl(l_net));
+                ret = dap_chain_global_db_gr_set(l_hash_hex_str, &c, 1, dap_chain_net_get_gdb_group_acl(l_net));
                 DAP_DELETE(l_gdb_group_str);
                 DAP_DELETE(l_hash_hex_str);
                 if (!ret) {
@@ -1804,7 +1804,8 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
                     dap_chain_node_cli_set_reply_text(a_str_reply, "Database ACL group not defined for this network");
                     return -11;
                 }
-                ret = dap_chain_global_db_gr_del((char *)l_hash_string, l_gdb_group_str);
+                ret = dap_chain_global_db_gr_del(l_hash_string, l_gdb_group_str);
+                DAP_DELETE(l_hash_string);
                 DAP_DELETE(l_gdb_group_str);
                 if (!ret) {
                     dap_chain_node_cli_set_reply_text(a_str_reply, "Cant't find certificate public key hash in database");
@@ -1870,10 +1871,10 @@ static int callback_compare_prioritity_list(const void * a_item1, const void * a
 
 /**
  * @brief load network config settings from cellframe-node.cfg file
- * 
+ *
  * @param a_net_name const char *: network name, for example "home21-network"
  * @param a_acl_idx currently 0
- * @return int 
+ * @return int
  */
 int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
 {
@@ -2050,7 +2051,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                     l_pub_key_data = dap_enc_key_serealize_pub_key(l_cert->enc_key, &l_pub_key_data_size);
                     // save pub key
                     if(l_pub_key_data && l_pub_key_data_size > 0)
-                        dap_chain_global_db_gr_set(dap_strdup("cur-node-addr-pkey"), DAP_DUP_SIZE(l_pub_key_data, l_pub_key_data_size), l_pub_key_data_size,
+                        dap_chain_global_db_gr_set( "cur-node-addr-pkey", l_pub_key_data, l_pub_key_data_size,
                         GROUP_LOCAL_NODE_ADDR);
                 }
             }
@@ -2131,9 +2132,9 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                     l_node_info->hdr.address.uint64 = l_seed_node_addr->uint64;
                     if ( l_node_info->hdr.ext_addr_v4.s_addr ||
                     #ifdef DAP_OS_BSD
-                	l_node_info->hdr.ext_addr_v6.__u6_addr.__u6_addr32[0]
+                    l_node_info->hdr.ext_addr_v6.__u6_addr.__u6_addr32[0]
                     #else
-                        l_node_info->hdr.ext_addr_v6.s6_addr32[0] 
+                        l_node_info->hdr.ext_addr_v6.s6_addr32[0]
                     #endif
                             ){
                         int l_ret;
@@ -2507,11 +2508,13 @@ dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const ch
 dap_chain_t * dap_chain_net_get_chain_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type)
 {
     dap_chain_t * l_chain;
+
     if(!l_net)
         return NULL;
+
     DL_FOREACH(l_net->pub.chains, l_chain)
     {
-        for(uint16_t i = 0; i < l_chain->datum_types_count; i++) {
+        for(int i = 0; i < l_chain->datum_types_count; i++) {
             if(l_chain->datum_types[i] == a_datum_type)
                 return l_chain;
         }
@@ -2531,7 +2534,7 @@ char * dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t * l_net
         return NULL;
     DL_FOREACH(l_net->pub.chains, l_chain)
     {
-        for(uint16_t i = 0; i < l_chain->datum_types_count; i++) {
+        for(int i = 0; i < l_chain->datum_types_count; i++) {
             if(l_chain->datum_types[i] == a_datum_type)
                 return dap_chain_net_get_gdb_group_mempool(l_chain);
         }
@@ -2713,7 +2716,7 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net)
                 if (l_verify_datum != 0){
                     log_it(L_WARNING, "Datum doesn't pass verifications (code %d), delete such datum from pool",
                                              l_verify_datum);
-                    dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
+                    dap_chain_global_db_gr_del( l_objs[i].key, l_gdb_group_mempool);
                     l_datums[i] = NULL;
                 }else{
                     l_datums[i] = l_datum;
@@ -2732,7 +2735,7 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net)
             // Delete processed objects
             size_t l_objs_processed_tmp = (l_objs_processed > 15) ? min(l_objs_processed, 10) : l_objs_processed;
             for(size_t i = 0; i < l_objs_processed; i++) {
-                dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
+                dap_chain_global_db_gr_del(l_objs[i].key, l_gdb_group_mempool);
                 if(i < l_objs_processed_tmp) {
                     dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n",
                             l_objs[i].key);
@@ -2880,7 +2883,7 @@ void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datu
                     if ( dap_chain_datum_token_is_old(l_token->type) )
                         dap_string_append_printf(a_str_out, "total_supply: %"DAP_UINT64_FORMAT_U"\n", l_token->header_private.total_supply );
                     else
-                        dap_string_append_printf(a_str_out, "total_supply: %s\n", 
+                        dap_string_append_printf(a_str_out, "total_supply: %s\n",
                                                 dap_chain_balance_print(l_token->header_private.total_supply_256));
                 }break;
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
@@ -3095,7 +3098,7 @@ void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datu
                                     dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str );
                                 } break;
                                 case TX_ITEM_TYPE_OUT_256: { // 256
-                                    dap_string_append_printf(a_str_out,"\tvalue: %s\n", 
+                                    dap_string_append_printf(a_str_out,"\tvalue: %s\n",
                                                 dap_chain_balance_print(((dap_chain_256_tx_out_t *)l_cur->data)->header.value)
                                             );
                                     char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_256_tx_out_t *)l_cur->data)->addr );
@@ -3251,11 +3254,11 @@ void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datu
 
 /**
  * @brief check certificate access list, written in chain config
- * 
+ *
  * @param a_net - network object
  * @param a_pkey_hash - certificate hash
- * @return true 
- * @return false 
+ * @return true
+ * @return false
  */
 static bool s_net_check_acl(dap_chain_net_t *a_net, dap_chain_hash_fast_t *a_pkey_hash)
 {
@@ -3321,7 +3324,7 @@ static bool s_net_check_acl(dap_chain_net_t *a_net, dap_chain_hash_fast_t *a_pke
  * @brief s_acl_callback function. Usually called from enc_http_proc
  * set acl (l_enc_key_ks->acl_list) from acl_accept_ca_list, acl_accept_ca_gdb chain config parameters in [auth] section
  * @param a_pkey_hash dap_chain_hash_fast_t hash object
- * @return uint8_t* 
+ * @return uint8_t*
  */
 static uint8_t *dap_chain_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash)
 {
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index f5e31813c9322d7f554410cae2c1a3bd61c197b7..4d42872cab655ccacc72f3dd0863d0295d19ef68 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -83,8 +83,7 @@ bool dap_chain_node_check_addr(dap_chain_net_t *a_net, dap_chain_node_addr_t *a_
  */
 bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr)
 {
-    return dap_chain_global_db_gr_set( dap_strdup(a_alias), DAP_DUP(a_addr),
-                                       sizeof(dap_chain_node_addr_t), a_net->pub.gdb_nodes_aliases);
+    return dap_chain_global_db_gr_set( a_alias, a_addr, sizeof(dap_chain_node_addr_t), a_net->pub.gdb_nodes_aliases);
 }
 
 /**
@@ -105,9 +104,7 @@ dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * a_net,const
  */
 bool dap_chain_node_alias_delete(dap_chain_net_t * a_net,const char *a_alias)
 {
-    char *a_key = strdup(a_alias);
-    bool res = dap_chain_global_db_gr_del(a_key, a_net->pub.gdb_nodes_aliases);
-    return res;
+    return  dap_chain_global_db_gr_del(a_alias, a_net->pub.gdb_nodes_aliases);
 }
 
 /**
@@ -139,7 +136,10 @@ int dap_chain_node_info_save(dap_chain_net_t * a_net, dap_chain_node_info_t *a_n
     }
     //char *a_value = dap_chain_node_info_serialize(node_info, NULL);
     size_t l_node_info_size = dap_chain_node_info_get_size(a_node_info);
-    bool res = dap_chain_global_db_gr_set(l_key, DAP_DUP(a_node_info), l_node_info_size, a_net->pub.gdb_nodes);
+    bool res = dap_chain_global_db_gr_set(l_key, a_node_info, l_node_info_size, a_net->pub.gdb_nodes);
+
+    DAP_DELETE(l_key);
+
     return res ? 0 : -3;
 }
 
@@ -172,11 +172,6 @@ dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_cha
         return NULL;
     }
 
-//    dap_chain_node_info_t *node_info = dap_chain_node_info_deserialize(str, (str) ? strlen(str) : 0);
-//    if(!node_info) {
-//        set_reply_text(str_reply, "node has invalid format in base");
-//    }
-//    DAP_DELETE(str);
     DAP_DELETE(l_key);
     return l_node_info;
 }
@@ -284,7 +279,7 @@ bool dap_chain_node_mempool_autoproc_init()
                         dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value;
                         if (dap_chain_node_mempool_process(l_chain, l_datum) >= 0) {
                             // Delete processed objects
-                            dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
+                            dap_chain_global_db_gr_del( l_objs[i].key, l_gdb_group_mempool);
                         }
                     }
                     dap_chain_global_db_objs_delete(l_objs, l_objs_size);
@@ -324,7 +319,7 @@ void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, c
         if (!strcmp(a_group, l_gdb_group_str)) {
             dap_chain_datum_t *l_datum = (dap_chain_datum_t *)a_value;
             if (dap_chain_node_mempool_process(l_chain, l_datum) >= 0) {
-                dap_chain_global_db_gr_del(dap_strdup(a_key), l_gdb_group_str);
+                dap_chain_global_db_gr_del( a_key, l_gdb_group_str);
             }
         }
         DAP_DELETE(l_gdb_group_str);
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 283135d76cb6be487b33d4bbd7ee657288e0c604..5b8d322be06eea040036399ff0a65ce263b4bbe1 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -186,9 +186,9 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg)
 
 /**
  * @brief s_node_client_connected_synchro_start_callback
- * 
+ *
  * @param a_worker dap_worker_t
- * @param a_arg void 
+ * @param a_arg void
  */
 static void s_node_client_connected_synchro_start_callback(dap_worker_t *a_worker, void *a_arg)
 {
@@ -557,10 +557,10 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch
 
 /**
  * @brief save_stat_to_database
- * 
- * @param a_request 
- * @param a_node_client 
- * @return int 
+ *
+ * @param a_request
+ * @param a_node_client
+ * @return int
  */
 static int save_stat_to_database(dap_stream_ch_chain_net_srv_pkt_test_t *a_request, dap_chain_node_client_t * a_node_client)
 {
@@ -597,7 +597,7 @@ static int save_stat_to_database(dap_stream_ch_chain_net_srv_pkt_test_t *a_reque
             l_key = strtoll(l_obj->key, NULL, 16);
         }
         char *l_key_str = dap_strdup_printf("%06x", ++l_key);
-        if(!dap_chain_global_db_gr_set(dap_strdup(l_key_str), dap_strdup(json_str), strlen(json_str) + 1, l_group)) {
+        if(!dap_chain_global_db_gr_set(l_key_str, json_str, strlen(json_str) + 1, l_group)) {
             l_ret = -1;
         }
         DAP_DELETE(l_key_str);
@@ -644,16 +644,16 @@ static void s_ch_chain_callback_notify_packet_R(dap_stream_ch_chain_net_srv_t* a
         break;
     default:
         break;
-    }    
+    }
 }
 
 
 /**
  * @brief dap_chain_node_client_connect_channels
  * Create connection to server
- * @param l_net 
- * @param a_node_info 
- * @param a_active_channels 
+ * @param l_net
+ * @param a_node_info
+ * @param a_active_channels
  * @return dap_chain_node_client_t* return a connection handle, or NULL, if an error
  */
 dap_chain_node_client_t* dap_chain_node_client_connect_channels(dap_chain_net_t * l_net, dap_chain_node_info_t *a_node_info, const char *a_active_channels)
@@ -715,8 +715,8 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t
  * Create new dap_client, setup it, and send it in adventure trip
  * @param a_node_client dap_chain_node_client_t
  * @param a_active_channels a_active_channels
- * @return true 
- * @return false 
+ * @return true
+ * @return false
  */
 static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_node_client, const char *a_active_channels)
 {
@@ -754,8 +754,8 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no
 /**
  * @brief dap_chain_node_client_connect
  * Create connection to server
- * @param a_net 
- * @param a_node_info 
+ * @param a_net
+ * @param a_node_info
  * @return dap_chain_node_client_t* return a connection handle, or NULL, if an error
  */
 dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_net_t * a_net,dap_chain_node_info_t *a_node_info)
@@ -766,7 +766,7 @@ dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_net_t * a_net,d
 
 /**
  * @brief dap_chain_node_client_reset
- * 
+ *
  * @param a_client dap_chain_node_client_t
  */
 void dap_chain_node_client_reset(dap_chain_node_client_t *a_client)
@@ -832,14 +832,14 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client)
 
 
 /**
- * @brief dap_chain_node_client_send_ch_pkt 
+ * @brief dap_chain_node_client_send_ch_pkt
  * Send stream request to server
- * @param a_client 
- * @param a_ch_id 
- * @param a_type 
- * @param a_pkt_data 
- * @param a_pkt_data_size 
- * @return int 
+ * @param a_client
+ * @param a_ch_id
+ * @param a_type
+ * @param a_pkt_data
+ * @param a_pkt_data_size
+ * @return int
  */
 int dap_chain_node_client_send_ch_pkt(dap_chain_node_client_t *a_client, uint8_t a_ch_id, uint8_t a_type,
         const void *a_pkt_data, size_t a_pkt_data_size)
@@ -859,9 +859,9 @@ int dap_chain_node_client_send_ch_pkt(dap_chain_node_client_t *a_client, uint8_t
  *
  * timeout_ms timeout in milliseconds
  * waited_state state which we will wait, sample NODE_CLIENT_STATE_CONNECT or NODE_CLIENT_STATE_SENDED
- * @param a_client 
- * @param a_waited_state 
- * @param a_timeout_ms 
+ * @param a_client
+ * @param a_waited_state
+ * @param a_timeout_ms
  * @return int return -2 false, -1 timeout, 0 end of connection or sending data
  */
 int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_state, int a_timeout_ms)
@@ -940,10 +940,10 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s
 
 /**
  * @brief dap_chain_node_client_set_callbacks
- * 
+ *
  * @param a_client dap_client_t
  * @param a_ch_id uint8_t
- * @return int 
+ * @return int
  */
 int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id)
 {
@@ -1008,8 +1008,8 @@ static void nodelist_response_error_callback(dap_client_t *a_client, int a_err)
 /**
  * @brief dap_chain_node_client_send_nodelist_req
  * Send nodelist request to server
- * @param a_client 
- * @return int 
+ * @param a_client
+ * @return int
  */
 int dap_chain_node_client_send_nodelist_req(dap_chain_node_client_t *a_client)
 {
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index edbfd176417eb89446f29934c22fef208cbd0570..a2416a54bdc94de1536463d9717ea4c852b45fb5 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -50,10 +50,10 @@ char *s_server_continents[]={
         "North America",
         "South America",
         "Southeast Asia",
-		"Asia",
+        "Asia",
         //"Near East",
-		"Oceania",
-		"Antarctica"
+        "Oceania",
+        "Antarctica"
  };
 
 struct dap_order_notify {
@@ -75,7 +75,7 @@ int dap_chain_net_srv_order_init(void)
     for (uint16_t i = 0; i < l_net_count; i++) {
         dap_chain_net_add_notify_callback(l_net_list[i], s_srv_order_callback_notify);
     }
-	//geoip_info_t *l_ipinfo = chain_net_geoip_get_ip_info("8.8.8.8");
+    //geoip_info_t *l_ipinfo = chain_net_geoip_get_ip_info("8.8.8.8");
     return 0;
 }
 
@@ -173,19 +173,19 @@ bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_o
  */
 const char* dap_chain_net_srv_order_get_country_code(dap_chain_net_srv_order_t *a_order)
 {
-	char *l_region = NULL;
-	if (!dap_chain_net_srv_order_get_continent_region(a_order, NULL, &l_region))
-		return NULL;
-	int l_countries = sizeof(s_server_countries)/sizeof(char*);
-	for (int i = 0; i < l_countries; i+=4) {
-		if(l_region && (!strcasecmp(l_region, s_server_countries[i+1]) || !strcasecmp(l_region, s_server_countries[i+2]))){
-			const char *l_country_code = s_server_countries[i];
-			DAP_DELETE(l_region);
-			return l_country_code;
-		}
-	}
-	DAP_DELETE(l_region);
-	return NULL;
+    char *l_region = NULL;
+    if (!dap_chain_net_srv_order_get_continent_region(a_order, NULL, &l_region))
+        return NULL;
+    int l_countries = sizeof(s_server_countries)/sizeof(char*);
+    for (int i = 0; i < l_countries; i+=4) {
+        if(l_region && (!strcasecmp(l_region, s_server_countries[i+1]) || !strcasecmp(l_region, s_server_countries[i+2]))){
+            const char *l_country_code = s_server_countries[i];
+            DAP_DELETE(l_region);
+            return l_country_code;
+        }
+    }
+    DAP_DELETE(l_region);
+    return NULL;
 }
 
 /**
@@ -337,8 +337,9 @@ char *dap_chain_net_srv_order_save(dap_chain_net_t *a_net, dap_chain_net_srv_ord
     dap_hash_fast(a_order, l_order_size, &l_order_hash);
     char *l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_order_hash);
     char *l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(a_net);
-    if (!dap_chain_global_db_gr_set(dap_strdup(l_order_hash_str), DAP_DUP_SIZE(a_order, l_order_size), l_order_size, l_gdb_group_str)) {
-        DAP_DEL_Z(l_order_hash_str);
+    if (!dap_chain_global_db_gr_set( l_order_hash_str, a_order,  l_order_size, l_gdb_group_str)) {
+        DAP_DELETE(l_gdb_group_str);
+        return NULL;
     }
     DAP_DELETE(l_gdb_group_str);
     return l_order_hash_str;
@@ -404,14 +405,14 @@ lb_order_pass:
             if (l_order_pass_first) {
                 if (l_order->version > 2 || l_order->direction > SERV_DIR_SELL ||
                         dap_chain_net_srv_order_get_size(l_order) != l_orders[i].value_len) {
-                    dap_chain_global_db_gr_del(dap_strdup(l_orders[i].key), l_gdb_group_str);
+                    dap_chain_global_db_gr_del( l_orders[i].key, l_gdb_group_str);
                     continue; // order is corrupted
                 }
                 dap_chain_hash_fast_t l_hash, l_hash_gdb;
                 dap_hash_fast(l_order, dap_chain_net_srv_order_get_size(l_order), &l_hash);
                 dap_chain_hash_fast_from_str(l_orders[i].key, &l_hash_gdb);
                 if (memcmp(&l_hash, &l_hash_gdb, sizeof(dap_chain_hash_fast_t))) {
-                    dap_chain_global_db_gr_del(dap_strdup(l_orders[i].key), l_gdb_group_str);
+                    dap_chain_global_db_gr_del( l_orders[i].key, l_gdb_group_str);
                     continue; // order is corrupted
                 }
             }
@@ -478,8 +479,8 @@ int dap_chain_net_srv_order_delete_by_hash_str(dap_chain_net_t * a_net, const ch
     int ret = -2;
     if ( a_net && a_hash_str  ){
         char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group( a_net);
-        char * l_hash_str = strdup( a_hash_str );
-        ret = dap_chain_global_db_gr_del( l_hash_str, l_gdb_group_str ) ? 0 : -1;
+
+        ret = dap_chain_global_db_gr_del( a_hash_str, l_gdb_group_str ) ? 0 : -1;
         DAP_DELETE( l_gdb_group_str );
     }
     return ret;
@@ -577,12 +578,12 @@ static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const
         if (a_value && a_op_code != 'a' && dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) {
             dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_value;
             if (l_order->version != 2) {
-                dap_chain_global_db_gr_del(dap_strdup(a_key), a_group);
+                dap_chain_global_db_gr_del( a_key, a_group);
             } else {
                 dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext_n_sign[l_order->ext_size];
                 if (!dap_sign_verify_size(l_sign, a_value_len) ||
                         dap_sign_verify(l_sign, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size) != 1) {
-                    dap_chain_global_db_gr_del(dap_strdup(a_key), a_group);
+                    dap_chain_global_db_gr_del( a_key, a_group);
                     DAP_DELETE(l_gdb_group_str);
                     return;
                 }
diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c
index 89e60990f917733932661a18b6d60e5163962e81..d51ca88b1de111ef73990cf31e7c03f2bd100530 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client.c
@@ -249,7 +249,7 @@ static dap_chain_hash_fast_t* dap_chain_net_vpn_client_tx_cond_hash(dap_chain_ne
             log_it(L_ERROR, "Can't create condition for user");
         } else {
             // save transaction for login
-            dap_chain_global_db_gr_set(dap_strdup("client_tx_cond_hash"), l_tx_cond_hash, sizeof(dap_chain_hash_fast_t),
+            dap_chain_global_db_gr_set( "client_tx_cond_hash", l_tx_cond_hash, sizeof(dap_chain_hash_fast_t),
                     l_gdb_group);
         }
         //DAP_DELETE(l_addr_from_str);
@@ -273,15 +273,13 @@ int dap_chain_net_vpn_client_update(dap_chain_net_t *a_net, const char *a_wallet
     if(!l_wallet) {
         return -1;
     }
-    size_t l_gdb_group_size = 0;
+
     char *l_gdb_group = dap_strdup_printf("local.%s", DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX);
-    if(!dap_chain_global_db_gr_set(dap_strdup("wallet_name"), (void*) a_wallet_name, dap_strlen(a_wallet_name) + 1,
-            l_gdb_group))
+    if(!dap_chain_global_db_gr_set("wallet_name", a_wallet_name, -1, l_gdb_group))
         return -2;
-    if(!dap_chain_global_db_gr_set(dap_strdup("token_name"), (void*) a_str_token, dap_strlen(a_str_token) + 1,
-            l_gdb_group))
+    if(!dap_chain_global_db_gr_set("token_name", a_str_token, -1, l_gdb_group))
         return -2;
-    if(!dap_chain_global_db_gr_set(dap_strdup("value_datoshi"), &a_value_datoshi, sizeof(a_value_datoshi), l_gdb_group))
+    if(!dap_chain_global_db_gr_set("value_datoshi", &a_value_datoshi, sizeof(a_value_datoshi), l_gdb_group))
         return -2;
     DAP_DELETE(l_gdb_group);
     dap_chain_hash_fast_t *l_hash = dap_chain_net_vpn_client_tx_cond_hash(a_net, l_wallet, a_str_token,
diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c
index 7c81dc5d1c6e61e271875b29b8b71bbb2f6b3240..989977fd74a9f7018ece25b5a2842ee843714e73 100644
--- a/modules/service/xchange/dap_chain_net_srv_xchange.c
+++ b/modules/service/xchange/dap_chain_net_srv_xchange.c
@@ -331,14 +331,19 @@ static bool s_xchange_tx_put(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_net)
     DAP_DELETE(a_tx);
     dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX);
     if (!l_chain) {
+        DAP_DELETE(l_datum);
         return false;
     }
     // Processing will be made according to autoprocess policy
-    char *l_ret = NULL;
-    if ((l_ret = dap_chain_mempool_datum_add(l_datum, l_chain)) == NULL) {
-        DAP_DELETE(l_datum);
+    char *l_ret = dap_chain_mempool_datum_add(l_datum, l_chain);
+
+    DAP_DELETE(l_datum);
+
+    if (  !l_ret )
         return false;
-    }
+
+    DAP_DELETE(l_ret);
+
     return true;
 }
 
@@ -361,7 +366,7 @@ static bool s_xchage_tx_invalidate(dap_chain_net_srv_xchange_price_t *a_price, d
     if (!l_cond_tx) {
         log_it(L_WARNING, "Requested conditional transaction not found");
         return false;
-    }   
+    }
     int l_prev_cond_idx;
     dap_chain_tx_out_cond_t *l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_cond_tx, &l_prev_cond_idx);
     if (dap_chain_ledger_tx_hash_is_used_out_item(l_ledger, &a_price->tx_hash, l_prev_cond_idx)) {
@@ -432,6 +437,8 @@ dap_chain_net_srv_xchange_price_t *s_xchange_price_from_order(dap_chain_net_t *a
 
 static bool s_xchange_db_add(dap_chain_net_srv_xchange_price_t *a_price)
 {
+    int rc;
+
     size_t l_size = sizeof(dap_chain_net_srv_xchange_db_item_t) + strlen(a_price->wallet_str) + 1;
     dap_chain_net_srv_xchange_db_item_t *l_item = DAP_NEW_Z_SIZE(dap_chain_net_srv_xchange_db_item_t, l_size);
     strcpy(l_item->token_sell, a_price->token_sell);
@@ -443,7 +450,11 @@ static bool s_xchange_db_add(dap_chain_net_srv_xchange_price_t *a_price)
     memcpy(&l_item->tx_hash, &a_price->tx_hash, sizeof(dap_chain_hash_fast_t));
     memcpy(&l_item->order_hash, &a_price->order_hash, sizeof(dap_chain_hash_fast_t));
     strcpy(l_item->wallet_str, a_price->wallet_str);
-    return dap_chain_global_db_gr_set(dap_strdup(a_price->key_ptr), (uint8_t *)l_item, l_size, GROUP_LOCAL_XCHANGE);
+
+    rc = dap_chain_global_db_gr_set(a_price->key_ptr, l_item, l_size, GROUP_LOCAL_XCHANGE);
+    DAP_DELETE(l_item);
+
+    return  rc;
 }
 
 static dap_chain_net_srv_xchange_price_t *s_xchange_db_load(char *a_key, uint8_t *a_item)
@@ -725,7 +736,7 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c
                     return -14;
                 }
                 HASH_DEL(s_srv_xchange->pricelist, l_price);
-                dap_chain_global_db_gr_del(dap_strdup(l_price->key_ptr), GROUP_LOCAL_XCHANGE);
+                dap_chain_global_db_gr_del( l_price->key_ptr, GROUP_LOCAL_XCHANGE);
                 bool l_ret = s_xchage_tx_invalidate(l_price, l_wallet); // may be changed to old price later
                 dap_chain_wallet_close(l_wallet);
                 if (!l_ret) {
diff --git a/modules/type/blocks/dap_chain_block_chunk.c b/modules/type/blocks/dap_chain_block_chunk.c
index 76a2a15f4562531ec96ff25b408ad3ba46133506..89386ed06b23d3d0f5d96c04e6a7566d2e752d40 100644
--- a/modules/type/blocks/dap_chain_block_chunk.c
+++ b/modules/type/blocks/dap_chain_block_chunk.c
@@ -88,9 +88,6 @@ void dap_chain_block_chunks_add(dap_chain_block_chunks_t * a_chunks,dap_chain_bl
         return;
     dap_chain_block_cache_hash_t  * l_chunk_cache_hash = NULL;
     // Parse block and produce cache object
-    dap_chain_block_t *l_block = a_block_cache->block;
-    size_t l_block_size = a_block_cache->block_size;
-
     // Check if already present
     HASH_FIND(hh, a_chunks->cache, &a_block_cache->block_hash, sizeof (l_chunk_cache_hash->block_hash), l_chunk_cache_hash);
     if (l_chunk_cache_hash){
@@ -99,7 +96,7 @@ void dap_chain_block_chunks_add(dap_chain_block_chunks_t * a_chunks,dap_chain_bl
         return;
     }
     // Save to GDB
-    dap_chain_global_db_gr_set(dap_strdup(a_block_cache->block_hash_str),l_block,l_block_size, a_chunks->gdb_group);
+    dap_chain_global_db_gr_set(a_block_cache->block_hash_str, a_block_cache->block, a_block_cache->block_size, a_chunks->gdb_group);
 
 
     // And here we select chunk for the new block cache
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index 1040e4970beec03fc9a9575ca4576032ffdd4c38..ebc109f0f83d70fda085079255a53d3c5642fccf 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -418,11 +418,11 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply)
             l_datums[0] = l_datum;
             if ( s_callback_add_datums(l_chain,l_datums,l_datums_count ) == l_datums_count ){
                 for ( size_t i = 0; i <l_datums_count; i++){
-                   dap_chain_hash_fast_t l_datum_hash;
-                   dap_hash_fast(l_datums[i],dap_chain_datum_size(l_datums[i]),&l_datum_hash);
-                   char * l_datums_datum_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash);
+                    dap_chain_hash_fast_t l_datum_hash;
+                    dap_hash_fast(l_datums[i],dap_chain_datum_size(l_datums[i]),&l_datum_hash);
+                    char * l_datums_datum_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash);
 
-                   if ( dap_chain_global_db_gr_del( dap_strdup(l_datums_datum_hash_str),l_gdb_group_mempool ) ){
+                    if ( dap_chain_global_db_gr_del( l_datums_datum_hash_str,l_gdb_group_mempool ) ){
                        dap_chain_node_cli_set_reply_text(a_str_reply,
                                                          "Converted datum %s from mempool to event in the new forming round ",
                                                          l_datums_datum_hash_str);
diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c
index 9abd79deb0828cd90a263366c456482e242d5635..1f07d12882dd1b97bff2c039c8eec4ebdb318462 100644
--- a/modules/type/dag/dap_chain_cs_dag_event.c
+++ b/modules/type/dag/dap_chain_cs_dag_event.c
@@ -187,7 +187,8 @@ dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event
 }
 
 bool dap_chain_cs_dag_event_gdb_set(char *a_event_hash_str, dap_chain_cs_dag_event_t * a_event, size_t a_event_size,
-                                    const char *a_group, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) {
+                                    const char *a_group, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg)
+{
     dap_chain_cs_dag_event_round_item_t * l_event_round_item = DAP_NEW_SIZE(dap_chain_cs_dag_event_round_item_t,
                                                                             sizeof(dap_chain_cs_dag_event_round_item_t)+a_event_size );
     l_event_round_item->event_size = a_event_size;
@@ -195,7 +196,7 @@ bool dap_chain_cs_dag_event_gdb_set(char *a_event_hash_str, dap_chain_cs_dag_eve
     // l_event_round_item->event = DAP_DUP_SIZE(a_event, a_event_size);
     memcpy(&l_event_round_item->cfg, a_event_round_cfg, sizeof(dap_chain_cs_dag_event_round_cfg_t));
     memcpy(l_event_round_item->event, a_event, a_event_size);
-    bool ret = dap_chain_global_db_gr_set(dap_strdup(a_event_hash_str), (uint8_t *)l_event_round_item,
+    bool ret = dap_chain_global_db_gr_set(a_event_hash_str, l_event_round_item,
             dap_chain_cs_dag_event_round_item_get_size(l_event_round_item),
             a_group);
     DAP_DELETE(l_event_round_item);
@@ -205,7 +206,7 @@ bool dap_chain_cs_dag_event_gdb_set(char *a_event_hash_str, dap_chain_cs_dag_eve
 dap_chain_cs_dag_event_t* dap_chain_cs_dag_event_gdb_get(const char *a_event_hash_str, size_t *a_event_size, const char *a_group,
                                                             dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) {
     size_t l_event_round_item_size = 0;
-    dap_chain_cs_dag_event_round_item_t* l_event_round_item = 
+    dap_chain_cs_dag_event_round_item_t* l_event_round_item =
                 (dap_chain_cs_dag_event_round_item_t*)dap_chain_global_db_gr_get(a_event_hash_str, &l_event_round_item_size, a_group );
     if ( l_event_round_item == NULL )
         return NULL;