diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h
index 1b8b665af8f52b5959292e0816ecae2c994f5f01..b09f0098434434c62194f3ae3b758d09fde7d003 100755
--- a/dap-sdk/core/include/dap_common.h
+++ b/dap-sdk/core/include/dap_common.h
@@ -123,6 +123,7 @@ typedef uint8_t byte_t;
   #define DAP_REALLOC(a, b)     rprealloc(a,b)
   #define DAP_DELETE(a)         rpfree(a)
   #define DAP_DUP(a)            memcpy(rpmalloc(sizeof(*a)), a, sizeof(*a))
+  #define DAP_DUP_SIZE(a, s)    memcpy(rpmalloc(s), a, s)
 #else
   #define DAP_MALLOC(a)         malloc(a)
   #define DAP_FREE(a)           free(a)
@@ -139,6 +140,7 @@ typedef uint8_t byte_t;
   #define DAP_REALLOC(a, b)     realloc(a,b)
   #define DAP_DELETE(a)         free(a)
   #define DAP_DUP(a)            memcpy(malloc(sizeof(*a)), a, sizeof(*a))
+  #define DAP_DUP_SIZE(a, s)    memcpy(malloc(s), a, s)
 #endif
 
 #define DAP_DEL_Z(a)          if(a) { DAP_DELETE(a); a=NULL;}
diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c
index d3c11a8f20604c1bc3c2f1123777e6c227f81fee..0f669463b7dd1d43f2f6036f34b0e53b3392b6ea 100644
--- a/dap-sdk/net/core/dap_events_socket.c
+++ b/dap-sdk/net/core/dap_events_socket.c
@@ -2107,10 +2107,18 @@ size_t dap_events_socket_write_f_mt(dap_worker_t * a_w,dap_events_socket_uuid_t
  */
 size_t dap_events_socket_write_unsafe(dap_events_socket_t *a_es, const void * a_data, size_t a_data_size)
 {
-    if(a_es->buf_out_size > a_es->buf_out_size_max){
-        log_it(L_DEBUG,"write buffer already overflow size=%u/max=%u", a_es->buf_out_size, a_es->buf_out_size_max);
-        return 0;
-    }
+    if (a_es->buf_out_size + a_data_size > a_es->buf_out_size_max) {
+        if (a_es->buf_out_size_max + a_data_size > DAP_EVENTS_SOCKET_BUF_LIMIT) {
+            log_it(L_ERROR, "Write esocket buffer overflow size=%u/max=%u", a_es->buf_out_size_max, DAP_EVENTS_SOCKET_BUF_LIMIT);
+            return 0;
+        } else {
+            size_t l_new_size = a_es->buf_out_size_max * 2;
+            if (l_new_size > DAP_EVENTS_SOCKET_BUF_LIMIT)
+                l_new_size = DAP_EVENTS_SOCKET_BUF_LIMIT;
+            a_es->buf_out = DAP_REALLOC(a_es->buf_out, l_new_size);
+            a_es->buf_out_size_max = l_new_size;
+        }
+     }
      a_data_size = (a_es->buf_out_size + a_data_size < a_es->buf_out_size_max) ? a_data_size : (a_es->buf_out_size_max - a_es->buf_out_size);
      memcpy(a_es->buf_out + a_es->buf_out_size, a_data, a_data_size);
      a_es->buf_out_size += a_data_size;
diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c
index a5e90d5a9268b4b354a09cf5e9fe7ed3b7ef26d7..9d706da25f9151b2e1d2a34499a12043e4d96133 100644
--- a/dap-sdk/net/core/dap_worker.c
+++ b/dap-sdk/net/core/dap_worker.c
@@ -1079,9 +1079,8 @@ static void s_queue_es_io_callback( dap_events_socket_t * a_es, void * a_arg)
         dap_events_socket_set_writable_unsafe(l_msg_es, true);
     if (l_msg->flags_unset & DAP_SOCK_READY_TO_WRITE)
         dap_events_socket_set_writable_unsafe(l_msg_es, false);
-    if (l_msg->data_size && l_msg->data)
+    if (l_msg->data_size && l_msg->data) {
         dap_events_socket_write_unsafe(l_msg_es, l_msg->data,l_msg->data_size);
-    if (l_msg->data) {
         DAP_DELETE(l_msg->data);
     }
     DAP_DELETE(l_msg);
diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h
index e7463c46cb389a2b737f296e40ce60c5030180b3..b1b641a0c2b4ecc221392b3678df00968c22fdd9 100644
--- a/dap-sdk/net/core/include/dap_events_socket.h
+++ b/dap-sdk/net/core/include/dap_events_socket.h
@@ -142,8 +142,9 @@ typedef struct dap_events_socket_callbacks {
 
 } dap_events_socket_callbacks_t;
 
-#define DAP_EVENTS_SOCKET_BUF 100000
-#define DAP_QUEUE_MAX_MSGS 8
+#define DAP_EVENTS_SOCKET_BUF       100000
+#define DAP_EVENTS_SOCKET_BUF_LIMIT 500000
+#define DAP_QUEUE_MAX_MSGS          8
 
 typedef enum {
     DESCRIPTOR_TYPE_SOCKET_CLIENT = 0,
diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c
index c5d030a77e882e205025a9ed5c44f6688f14d157..21ec647c43d65401b09ccbb72798e9023827071a 100644
--- a/dap-sdk/net/stream/stream/dap_stream.c
+++ b/dap-sdk/net/stream/stream/dap_stream.c
@@ -757,11 +757,17 @@ static void s_stream_proc_pkt_in(dap_stream_t * a_stream)
     case STREAM_PKT_TYPE_DATA_PACKET: {
         dap_stream_ch_pkt_t * l_ch_pkt = (dap_stream_ch_pkt_t *) a_stream->pkt_cache;
 
-        if(dap_stream_pkt_read_unsafe(a_stream,l_pkt, l_ch_pkt, sizeof(a_stream->pkt_cache))==0){
+        size_t l_dec_pkt_size = dap_stream_pkt_read_unsafe(a_stream, l_pkt, l_ch_pkt, sizeof(a_stream->pkt_cache));
+        if (l_dec_pkt_size == 0) {
             log_it(L_WARNING, "Input: can't decode packet size=%d",l_pkt_size);
             DAP_DELETE(l_pkt);
             return;
         }
+        if (l_dec_pkt_size != l_ch_pkt->hdr.size + sizeof(l_ch_pkt->hdr)) {
+            log_it(L_WARNING, "Input: decoded packet has bad size = %d, decoded size = %d", l_ch_pkt->hdr.size, l_dec_pkt_size);
+            DAP_DELETE(l_pkt);
+            return;
+        }
 
         s_detect_loose_packet(a_stream);
 
diff --git a/dap-sdk/net/stream/stream/dap_stream_worker.c b/dap-sdk/net/stream/stream/dap_stream_worker.c
index ae002f36e3b92199788ee659fb0c99f92b06903c..45ab6fc06562ab209da29c3e69abc0d31ba0a486 100644
--- a/dap-sdk/net/stream/stream/dap_stream_worker.c
+++ b/dap-sdk/net/stream/stream/dap_stream_worker.c
@@ -119,8 +119,10 @@ static void s_ch_io_callback(dap_events_socket_t * a_es, void * a_msg)
         dap_stream_ch_set_ready_to_write_unsafe(l_msg_ch, true);
     if (l_msg->flags_unset & DAP_SOCK_READY_TO_WRITE)
         dap_stream_ch_set_ready_to_write_unsafe(l_msg_ch, false);
-    if (l_msg->data_size && l_msg->data)
+    if (l_msg->data_size && l_msg->data) {
         dap_stream_ch_pkt_write_unsafe(l_msg_ch, l_msg->ch_pkt_type, l_msg->data,l_msg->data_size);
+        DAP_DELETE(l_msg->data);
+    }
     DAP_DELETE(l_msg);
 }
 
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 702a5a9744ede55801fcb39832131e2efc3ec7b3..4bea5bc0e3bae612363c5f92a2a9288e3a387f8e 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -950,6 +950,8 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
     l_objs_count = 0;
     l_objs = dap_chain_global_db_gr_load(l_gdb_group, &l_objs_count);
     for (size_t i = 0; i < l_objs_count; i++) {
+        if (!l_objs[i].value_len)
+            continue;
         dap_chain_ledger_token_emission_item_t *l_emission_item = DAP_NEW_Z(dap_chain_ledger_token_emission_item_t);
         dap_chain_hash_fast_from_str(l_objs[i].key, &l_emission_item->datum_token_emission_hash);
         l_emission_item->datum_token_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_objs[i].value_len);
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 0b003381dd0161a9ed212c34df67352fec1a7d94..51d4da3c79997b7a9ba0c9256f2dee97dcfeef4e 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
@@ -283,6 +283,7 @@ static bool s_grace_period_control(dap_chain_net_srv_grace_t *a_grace)
             // TODO extend callback to pass ext and ext size from service callbacks
             l_receipt = dap_chain_net_srv_issue_receipt( l_usage->service, l_usage, l_usage->price,NULL,0 );
             dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST, l_receipt, l_receipt->size);
+            DAP_DELETE(l_receipt);
         }else{
             l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_PRICE_NOT_FOUND ;
             goto free_exit;
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index a7eb706602d71274638808b76e3acd832dc4175f..749d9e796981a180edaae6d8ddea9a78bf2634e0 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -471,8 +471,8 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
     if (!l_chain) {
         if (s_debug_more)
             log_it(L_WARNING, "No chain found for DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN");
-        DAP_DELETE(l_sync_request);
         DAP_DEL_Z(l_pkt_item->pkt_data);
+        DAP_DELETE(l_sync_request);
         return true;
     }
     dap_chain_atom_ptr_t l_atom_copy = (dap_chain_atom_ptr_t)l_pkt_item->pkt_data;
@@ -498,6 +498,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
             dap_chain_hash_fast_to_str(&l_atom_hash,l_atom_hash_str,sizeof (l_atom_hash_str)-1 );
             log_it(L_WARNING,"Atom with hash %s for %s:%s not accepted (code ATOM_PASS, already present)",  l_atom_hash_str, l_chain->net_name, l_chain->name);
         }
+        dap_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash);
         DAP_DELETE(l_atom_copy);
         break;
     case ATOM_MOVE_TO_THRESHOLD:
@@ -538,6 +539,8 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
                     if(l_res < 0) {
                         log_it(L_ERROR, "Can't save event 0x%x from treshold to file '%s'",
                                 l_atom_treshold, l_cell ? l_cell->file_storage_path : "[null]");
+                    } else {
+                        dap_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash);
                     }
                 }
             } while(l_atom_treshold);
@@ -699,7 +702,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
                 }
             }
             // save data to global_db
-            if(!dap_chain_global_db_obj_save(l_obj, 1)) {
+            if(!dap_chain_global_db_obj_save(dap_store_obj_copy(l_obj, 1), 1)) {
                 struct sync_request *l_sync_req_err = DAP_DUP(l_sync_request);
                 dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id,
                                                   s_gdb_in_pkt_error_worker_callback, l_sync_req_err);
@@ -808,7 +811,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ:{
             if(l_ch_chain->state != CHAIN_STATE_IDLE){
                 log_it(L_WARNING, "Can't process UPDATE_GLOBAL_DB_REQ request because its already busy with syncronization");
-                s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
+                dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
                         l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
                         "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS");
                 break;
@@ -859,7 +862,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                        l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64);
             if (l_ch_chain->state != CHAIN_STATE_IDLE){
                 log_it(L_WARNING, "Can't process UPDATE_GLOBAL_DB_START request because its already busy with syncronization");
-                s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
+                dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
                         l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
                         "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS");
                 break;
@@ -907,7 +910,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
             if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) {
                 if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB && l_ch_chain->state != CHAIN_STATE_IDLE) {
                     log_it(L_WARNING, "Can't process SYNC_GLOBAL_DB request because not in idle state");
-                    s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
+                    dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
                             l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
                             "ERROR_STATE_NOT_IN_IDLE");
                     break;
@@ -1014,7 +1017,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_REQ:{
             if (l_ch_chain->state != CHAIN_STATE_IDLE) {
                 log_it(L_WARNING, "Can't process UPDATE_CHAINS_REQ request because its already busy with syncronization");
-                s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
+                dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
                         l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
                         "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS");
                 break;
@@ -1046,7 +1049,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START:{
             if (l_ch_chain->state != CHAIN_STATE_IDLE) {
                 log_it(L_WARNING, "Can't process UPDATE_CHAINS_START request because its already busy with syncronization");
-                s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
+                dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
                         l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
                         "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS");
                 break;
@@ -1154,6 +1157,14 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                     else
                         log_it(L_INFO, "In: SYNC_CHAINS pkt");
                 }
+                if ((l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_END) &&
+                        HASH_COUNT(l_ch_chain->remote_atoms) > 5000) {
+                    // TODO remove this after chains will come in order
+                    s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
+                                                        l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
+                                                        "ERROR_SYNC_REQUEST_IS_TOO_LARGE");
+                    break;
+                }
                 struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch);
                 l_ch_chain->stats_request_atoms_processed = 0;
                 if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS) {
@@ -1200,6 +1211,10 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                         struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch);
                         dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt;
                         l_pkt_item->pkt_data = DAP_NEW_SIZE(byte_t, l_chain_pkt_data_size);
+                        if (!l_pkt_item->pkt_data) {
+                            log_it(L_ERROR, "Not enough memory!");
+                            break;
+                        }
                         memcpy(l_pkt_item->pkt_data, l_chain_pkt->data, l_chain_pkt_data_size);
                         l_pkt_item->pkt_data_size = l_chain_pkt_data_size;
                         if (s_debug_more){
diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
index fc2be92cdd3b535d1d68fd2438eb2ccc71759a6f..4e66d0704e0f4bcdd4e9000ad2e7c10a0545eb39 100644
--- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
+++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
@@ -37,7 +37,7 @@
 
 typedef struct dap_chain_cs_dag_pos_pvt
 {
-    dap_cert_t * events_sign_wallet;
+    dap_enc_key_t *events_sign_key;
     char ** tokens_hold;
     uint64_t * tokens_hold_value;
     size_t tokens_hold_size;
@@ -149,11 +149,15 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c
     const char * l_events_sign_wallet = NULL;
     if ( ( l_events_sign_wallet = dap_config_get_item_str(a_chain_net_cfg,"dag-pos","events-sign-wallet") ) != NULL ) {
 
-        if ( ( PVT(l_pos)->events_sign_wallet = dap_cert_find_by_name(l_events_sign_wallet)) == NULL ){
-            log_it(L_ERROR,"Can't load events sign certificate, name \"%s\" is wrong",l_events_sign_wallet);
-        }else
-            log_it(L_NOTICE,"Loaded \"%s\" certificate to sign pos event", l_events_sign_wallet);
-
+        dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_events_sign_wallet, dap_chain_wallet_get_path(g_config));
+        if (!l_wallet) {
+            log_it(L_ERROR,"Can't load events sign wallet, name \"%s\" is wrong", l_events_sign_wallet);
+        } else {
+            PVT(l_pos)->events_sign_key = dap_chain_wallet_get_key(l_wallet, 0);
+            log_it(L_NOTICE,"Loaded \"%s\" wallet to sign pos event", l_events_sign_wallet);
+        }
+    } else {
+        log_it(L_WARNING, "Events sign wallet is empty for %s chain, can't sing any events for it", a_chain->name);
     }
     return 0;
 }
@@ -193,13 +197,13 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
     dap_chain_net_t * l_net = dap_chain_net_by_name( a_dag->chain->net_name );
     dap_chain_cs_dag_pos_t * l_pos = DAP_CHAIN_CS_DAG_POS(a_dag);
 
-    if( PVT(l_pos)->events_sign_wallet == NULL) {
+    if( PVT(l_pos)->events_sign_key == NULL) {
         log_it(L_ERROR, "Can't sign event with events-sign-wallet in [dag-pos] section");
         return NULL;
     }
     if(a_datum || (a_hashes && a_hashes_count)) {
         dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, l_net->pub.cell_id, a_datum,
-        PVT(l_pos)->events_sign_wallet->enc_key, a_hashes, a_hashes_count, a_dag_event_size);
+        PVT(l_pos)->events_sign_key, a_hashes, a_hashes_count, a_dag_event_size);
         return l_event;
     } else
         return NULL;
diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c
index b3bae67c29784c400075212ca7816f8bb8fcb6a5..ca353157593f075738de245322c60429763c1172 100644
--- a/modules/consensus/none/dap_chain_cs_none.c
+++ b/modules/consensus/none/dap_chain_cs_none.c
@@ -342,10 +342,11 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
     size_t l_datum_size = dap_chain_datum_size(l_datum);
     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(l_hash_item->key, l_datum, l_datum_size, l_gdb_priv->group_datums);
-    }else
-        log_it(L_DEBUG,"Load mode, doesnt save item %s:%s", l_hash_item->key, l_gdb_priv->group_datums);
+    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);
+    } else
+        log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", l_hash_item->key, l_gdb_priv->group_datums);
 
     DL_APPEND(l_gdb_priv->hash_items, l_hash_item);
     return ATOM_ACCEPT;
diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c
index 520886ed774931ff3236fcb5d717f31f3e972aff..ae0b6c77d3b003f19ca1b724cacb1aa5bd0c0d1a 100644
--- a/modules/global-db/dap_chain_global_db.c
+++ b/modules/global-db/dap_chain_global_db.c
@@ -524,7 +524,7 @@ 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(store_data.key, store_data.group);
+        global_db_gr_del_del(dap_strdup(store_data.key), store_data.group);
         dap_global_db_obj_track_history(&store_data);
     } else {
         log_it(L_ERROR, "Save error: %d", l_res);
@@ -554,7 +554,7 @@ bool dap_chain_global_db_gr_del(char *a_key,const char *a_group)
     unlock();
     if(l_res >= 0) {
         // add to Del group
-        global_db_gr_del_add(store_data.key, store_data.group, store_data.timestamp);
+        global_db_gr_del_add(dap_strdup(store_data.key), store_data.group, store_data.timestamp);
     }
     // do not add to history if l_res=1 (already deleted)
     if (!l_res) {
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 1aeba149aaf31a97e43ef8511a2c7ccf1a0c0b20..daa16fef21e67113a78094968fdf49dff23ffb35 100644
--- a/modules/global-db/dap_chain_global_db_driver_cdb.c
+++ b/modules/global-db/dap_chain_global_db_driver_cdb.c
@@ -143,7 +143,7 @@ pcdb_instance dap_cdb_init_group(char *a_group, int a_flags) {
     pthread_mutex_lock(&cdb_mutex);
     char l_cdb_path[strlen(s_cdb_path) + strlen(a_group) + 2];
     HASH_FIND_STR(s_cdb, a_group, l_cdb_i);
-    if (l_cdb_i && !(a_flags & (1 << 1))) {
+    if (l_cdb_i && !(a_flags & CDB_TRUNC)) {
         goto FIN;
     }
     l_cdb_i = DAP_NEW(cdb_instance);
@@ -160,10 +160,10 @@ pcdb_instance dap_cdb_init_group(char *a_group, int a_flags) {
         log_it(L_ERROR, "An error occured while opening CDB: \"%s\"", cdb_errmsg(cdb_errno(l_cdb_i->cdb)));
         goto ERR;
     }
-    if (!(a_flags & (1 << 1))) {
+    if (!(a_flags & CDB_TRUNC)) {
         CDBSTAT l_cdb_stat;
         cdb_stat(l_cdb_i->cdb, &l_cdb_stat);
-        if (l_cdb_stat.rnum > 0) {
+        if (l_cdb_stat.rnum > 0 || !(a_flags & CDB_CREAT)) {
             void *l_iter = cdb_iterate_new(l_cdb_i->cdb, 0);
             obj_arg l_arg;
             l_arg.o = DAP_NEW_Z(dap_store_obj_t);
@@ -230,7 +230,7 @@ int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_
         if (!dap_strcmp(d->d_name, ".") || !dap_strcmp(d->d_name, "..")) {
             continue;
         }
-        pcdb_instance l_cdb_i = dap_cdb_init_group(d->d_name, CDB_CREAT | CDB_PAGEWARMUP);
+        pcdb_instance l_cdb_i = dap_cdb_init_group(d->d_name, CDB_PAGEWARMUP);
         if (!l_cdb_i) {
             dap_db_driver_cdb_deinit();
             closedir(dir);
@@ -490,11 +490,11 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) {
         return -1;
     }
     if(a_store_obj->type == 'a') {
-        if(!a_store_obj->key) {// || !a_store_obj->value || !a_store_obj->value_len){
+        if(!a_store_obj->key) {
             return -2;
         }
         cdb_record l_rec;
-        l_rec.key = dap_strdup(a_store_obj->key);
+        l_rec.key = a_store_obj->key; //dap_strdup(a_store_obj->key);
         int offset = 0;
         char *l_val = DAP_NEW_Z_SIZE(char, sizeof(uint64_t) + sizeof(unsigned long) + a_store_obj->value_len + sizeof(time_t));
         dap_uint_to_hex(l_val, ++l_cdb_i->id, sizeof(uint64_t));
@@ -503,6 +503,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) {
         offset += sizeof(unsigned long);
         if(a_store_obj->value && a_store_obj->value_len){
             memcpy(l_val + offset, a_store_obj->value, a_store_obj->value_len);
+            DAP_DELETE(a_store_obj->value);
         }
         offset += a_store_obj->value_len;
         unsigned long l_time = (unsigned long)a_store_obj->timestamp;
@@ -525,6 +526,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) {
                 ret = -1;
             }
         }
+        DAP_DELETE(a_store_obj->key);
     }
     return ret;
 }
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 07b4488dabf2ce836c0fa9b66b47ab56c3d121f1..ad09e19b12b94f01b66c2a07678d62dfd2abfae3 100644
--- a/modules/global-db/dap_chain_global_db_driver_sqlite.c
+++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c
@@ -566,26 +566,27 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
     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->key || !a_store_obj->value || !a_store_obj->value_len)
+        if(!a_store_obj->key)
             return -1;
         //dap_chain_hash_fast_t l_hash;
         //dap_hash_fast(a_store_obj->value, a_store_obj->value_len, &l_hash);
 
         char *l_blob_hash = "";//dap_db_driver_get_string_from_blob((uint8_t*) &l_hash, sizeof(dap_chain_hash_fast_t));
         char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, (int)a_store_obj->value_len);
+        DAP_DEL_Z(a_store_obj->value);
         //add one record
         l_query = sqlite3_mprintf("insert into '%s' values(NULL, '%s', x'%s', '%lld', x'%s')",
                                    l_table_name, a_store_obj->key, l_blob_hash, a_store_obj->timestamp, l_blob_value);
         //dap_db_driver_sqlite_free(l_blob_hash);
         dap_db_driver_sqlite_free(l_blob_value);
     }
-    else if(a_store_obj->type == 'd') {
+    else if (a_store_obj->type == 'd') {
         //delete one record
-        if(a_store_obj->key)
+        if (a_store_obj->key) {
             l_query = sqlite3_mprintf("delete from '%s' where key = '%s'",
                                       l_table_name, a_store_obj->key);
-        // remove all group
-        else {
+        } else {
+            // remove all group
             l_query = sqlite3_mprintf("drop table if exists '%s'", l_table_name);
         }
     }
@@ -633,6 +634,8 @@ 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;
     }
+    if (a_store_obj->key)
+        DAP_DELETE(a_store_obj->key);
     dap_db_driver_sqlite_free(l_query);
     DAP_DELETE(l_table_name);
     return l_ret;
diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c
index 8954518599b1ecd341d8a9f1822c254f3db3e887..6dab70cdf0d4ab2ea8264ac2402ab917a5cadfeb 100644
--- a/modules/global-db/dap_chain_global_db_remote.c
+++ b/modules/global-db/dap_chain_global_db_remote.c
@@ -27,8 +27,7 @@ static bool dap_db_set_cur_node_addr_common(uint64_t a_address, char *a_net_name
         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( dap_strdup(l_key_time), (uint8_t*) l_cur_time, sizeof(time_t), GROUP_LOCAL_GENERAL);
-        DAP_DELETE(l_key_time);
+        l_ret = dap_chain_global_db_gr_set(l_key_time, (uint8_t*) l_cur_time, sizeof(time_t), GROUP_LOCAL_GENERAL);
     }
     return l_ret;
 }
@@ -106,9 +105,10 @@ bool dap_db_set_last_id_remote(uint64_t a_node_addr, uint64_t a_id, char *a_grou
 {
     //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);
-    bool l_ret = dap_chain_global_db_gr_set(l_node_addr_str, &a_id, sizeof(uint64_t),
+    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);
-    DAP_DELETE(l_node_addr_str);
     return l_ret;
 }
 
@@ -136,9 +136,8 @@ uint64_t dap_db_get_last_id_remote(uint64_t a_node_addr, char *a_group)
  */
 bool dap_db_set_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_hash)
 {
-    //log_it( L_DEBUG, "Node 0x%016X set last synced timestamp %"DAP_UINT64_FORMAT_U"", a_id);
     return dap_chain_global_db_gr_set(dap_strdup_printf("%ju%s%s", a_node_addr, a_chain->net_name, a_chain->name),
-                                      a_hash, sizeof(*a_hash), GROUP_LOCAL_NODE_LAST_ID);
+                                      DAP_DUP(a_hash), sizeof(*a_hash), GROUP_LOCAL_NODE_LAST_ID);
 }
 
 /**
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index b5de41884c3a194821341e796eed6cc59fce0855..493be4d7d1518c8b309ddf9c8bebe56e852ec2f9 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -1717,7 +1717,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"), (uint8_t*) l_pub_key_data, l_pub_key_data_size,
+                        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,
                         GROUP_LOCAL_NODE_ADDR);
                 }
             }
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index 817455ff9e922ce73b65281a17ff5d93668e425a..e06be2f21235b58170e722e6f8b928d5b7bf11c0 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -82,20 +82,10 @@ bool dap_chain_node_check_addr(dap_chain_net_t * a_net,dap_chain_node_addr_t *ad
 /**
  * Register alias in base
  */
-bool dap_chain_node_alias_register(dap_chain_net_t * a_net,const char *alias, dap_chain_node_addr_t *addr)
+bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr)
 {
-    char *a_key = strdup(alias);
-    dap_chain_node_addr_t *l_addr = DAP_NEW_Z(dap_chain_node_addr_t);
-    memcpy(l_addr,addr,sizeof (*l_addr));
-//    char a_value[2 * sizeof(dap_chain_node_addr_t) + 1];
-//    if(bin2hex(a_value, (const unsigned char *) addr, sizeof(dap_chain_node_addr_t)) == -1)
-//        return false;
-//    a_value[2 * sizeof(dap_chain_node_addr_t)] = '\0';
-    bool res = dap_chain_global_db_gr_set( dap_strdup(a_key),  l_addr, sizeof(dap_chain_node_addr_t)
-                                          , a_net->pub.gdb_nodes_aliases);
-    DAP_DELETE(l_addr);
-    DAP_DELETE(a_key);
-    return res;
+    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);
 }
 
 /**
@@ -150,12 +140,8 @@ 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);
-    dap_chain_node_info_t *l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size);
-    memcpy(l_node_info, a_node_info, sizeof (*a_node_info) );
-    bool res = dap_chain_global_db_gr_set( dap_strdup(l_key), l_node_info, l_node_info_size, a_net->pub.gdb_nodes);
-    DAP_DELETE(l_key);
-    //DAP_DELETE(a_value);
-    return res?0:-3;
+    bool res = dap_chain_global_db_gr_set(l_key, DAP_DUP(a_node_info), l_node_info_size, a_net->pub.gdb_nodes);
+    return res ? 0 : -3;
 }
 
 /**
@@ -299,11 +285,12 @@ bool dap_chain_node_mempool_autoproc_init()
                 dap_global_db_obj_t *l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size);
                 if (l_objs_size) {
                     for (size_t i = 0; i < l_objs_size; i++) {
+                        // Delete processed objects
+                        dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
+                        if (!l_objs[i].value_len)
+                            continue;
                         dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value;
-                        if (dap_chain_node_mempool_process(l_chain, l_role, l_datum)) {
-                            // Delete processed objects
-                            dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
-                        }
+                        dap_chain_node_mempool_process(l_chain, l_role, l_datum);
                     }
                     dap_chain_global_db_objs_delete(l_objs, l_objs_size);
                 }
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index dbc1b41cd2c707f38f42eb9e86dfca977eb2bcba..a4f785885554560c445b54e09dc44b4c49935daf 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -3050,29 +3050,19 @@ int com_token_decl(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r
         l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN);
 
     }
-
+    int l_ret = 0;
     if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
         if(!dap_strcmp(l_hash_out_type,"hex"))
             dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str, l_ticker);
         else
             dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str_base58, l_ticker);
-        DAP_DELETE(l_datum);
-        DAP_DELETE(l_datum_token);
-        DAP_DELETE(l_gdb_group_mempool);
-        DAP_DELETE(l_key_str);
-        DAP_DELETE(l_key_str_base58);
-        return 0;
     }
     else {
         dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s is not placed in datum pool ", l_key_str_base58);
         DAP_DELETE(l_datum);
-        DAP_DELETE(l_datum_token);
-        DAP_DELETE(l_gdb_group_mempool);
-        DAP_DELETE(l_key_str);
-        DAP_DELETE(l_key_str_base58);
-        return -2;
+        l_ret = -2;
     }
-    return 0;
+    return l_ret;
 }
 
 /**
@@ -3379,7 +3369,6 @@ int com_token_emit(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r
         return -2;
     }
     DAP_DELETE(str_reply_tmp);
-    DAP_DELETE(l_datum_tx);
     DAP_DELETE(l_addr);
     return 0;
 }
diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h
index 9d84beabcc2a289a3024f185ffea98de15c43d8a..216d6a4261c130a77397d44fc5eecd8cc75856af 100644
--- a/modules/net/include/dap_chain_node.h
+++ b/modules/net/include/dap_chain_node.h
@@ -132,7 +132,7 @@ dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_t * l_net,dap_chain
 bool dap_chain_node_check_addr(dap_chain_net_t * l_net,dap_chain_node_addr_t *addr, dap_chain_cell_id_t *a_cell_id);
 
 dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * l_net,const char *alias);
-bool dap_chain_node_alias_register(dap_chain_net_t * l_net,const char *alias, dap_chain_node_addr_t *addr);
+bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr);
 bool dap_chain_node_alias_delete(dap_chain_net_t * l_net,const char *alias);
 
 int dap_chain_node_info_save(dap_chain_net_t * l_net,dap_chain_node_info_t *node_info);
diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c
index d7f3a180174e12eff5fda443ca7cb7cc338624c8..6488d2aaebaee9733f07717f67b10f30c1a3dd6e 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client.c
@@ -248,13 +248,12 @@ 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("client_tx_cond_hash", l_tx_cond_hash, sizeof(dap_chain_hash_fast_t),
+            dap_chain_global_db_gr_set(dap_strdup("client_tx_cond_hash"), l_tx_cond_hash, sizeof(dap_chain_hash_fast_t),
                     l_gdb_group);
         }
         //DAP_DELETE(l_addr_from_str);
         DAP_DELETE(l_pub_key_data);
     }
-    DAP_DELETE(l_tx_cond_hash);
     dap_enc_key_delete(l_enc_key);
     DAP_DELETE(l_gdb_group);
     return l_tx_cond_hash;