diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 567eaaf33f10e8331311834946a58f0d6f0ed47d..b0c7805546ba1dc3fbef4224fa9fa0656db21be1 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -912,12 +912,13 @@ struct sync_request *dap_stream_ch_chain_create_sync_request(dap_stream_ch_chain
 {
     dap_stream_ch_chain_t * l_ch_chain = DAP_STREAM_CH_CHAIN(a_ch);
     struct sync_request *l_sync_request = DAP_NEW_Z(struct sync_request);
-    l_sync_request->ch_uuid = a_ch->uuid;
-    l_sync_request->worker = a_ch->stream_worker->worker;
-    l_sync_request->remote_gdbs = l_ch_chain->remote_gdbs;
-    l_sync_request->remote_atoms = l_ch_chain->remote_atoms;
-    l_sync_request->request_hdr = l_ch_chain->request_hdr = a_chain_pkt->hdr;
-    l_sync_request->request = l_ch_chain->request;
+    *l_sync_request = (struct sync_request) {
+            .worker         = a_ch->stream_worker->worker,
+            .ch_uuid        = a_ch->uuid,
+            .request        = l_ch_chain->request,
+            .request_hdr    = a_chain_pkt->hdr,
+            .remote_atoms   = l_ch_chain->remote_atoms,
+            .remote_gdbs    = l_ch_chain->remote_gdbs };
     return l_sync_request;
 }
 
@@ -1074,6 +1075,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 l_ch_chain->request.id_start = 1;   // incremental sync by default
             struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch);
             l_ch_chain->stats_request_gdb_processed = 0;
+            l_ch_chain->request_hdr = l_chain_pkt->hdr;
             dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_update_gdb_proc_callback, l_sync_request);
         } break;
 
@@ -1409,6 +1411,7 @@ 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);
                 l_ch_chain->stats_request_atoms_processed = 0;
+                l_ch_chain->request_hdr = l_chain_pkt->hdr;
                 if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS) {
                     char l_hash_from_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }, l_hash_to_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' };
                     dap_chain_hash_fast_t l_hash_from = l_ch_chain->request.hash_from,
@@ -1449,6 +1452,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
             if(l_chain_pkt_data_size) {
                 dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
                 if(l_chain) {
+                    l_ch_chain->request_hdr = l_chain_pkt->hdr;
                     // Expect atom element in
                     if(l_chain_pkt_data_size > 0) {
                         struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch);
diff --git a/modules/channel/chain/dap_stream_ch_chain_pkt.c b/modules/channel/chain/dap_stream_ch_chain_pkt.c
index ad3e01b90e3b0ca28d61d8a71467e0684d36911c..f939d3231f53a5c482a0475ae155a2f61ee6d4b6 100644
--- a/modules/channel/chain/dap_stream_ch_chain_pkt.c
+++ b/modules/channel/chain/dap_stream_ch_chain_pkt.c
@@ -54,7 +54,7 @@ size_t dap_stream_ch_chain_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_typ
                                             const void * a_data, size_t a_data_size)
 {
     size_t l_chain_pkt_size = sizeof(dap_stream_ch_chain_pkt_hdr_t) + a_data_size;
-    dap_stream_ch_chain_pkt_t *l_chain_pkt = DAP_NEW_STACK_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size);
+    dap_stream_ch_chain_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size);
     *l_chain_pkt = (dap_stream_ch_chain_pkt_t){
             .hdr = { .version = 1, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id }
     };
@@ -62,7 +62,9 @@ size_t dap_stream_ch_chain_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_typ
     if (a_data_size && a_data)
         memcpy(l_chain_pkt->data, a_data, a_data_size);
 
-    return dap_stream_ch_pkt_write_unsafe(a_ch, a_type , l_chain_pkt, l_chain_pkt_size);
+    size_t l_ret = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_chain_pkt, l_chain_pkt_size);
+    DAP_DELETE(l_chain_pkt);
+    return l_ret;
 }
 
 
@@ -82,18 +84,16 @@ size_t dap_stream_ch_chain_pkt_write_mt(dap_stream_worker_t *a_worker, dap_strea
                                         uint64_t a_chain_id, uint64_t a_cell_id,
                                         const void * a_data, size_t a_data_size)
 {
-    dap_stream_ch_chain_pkt_t * l_chain_pkt;
-    size_t l_chain_pkt_size = sizeof (l_chain_pkt->hdr) + a_data_size;
-    l_chain_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size );
-    l_chain_pkt->hdr.version = 1;
-    l_chain_pkt->hdr.net_id.uint64 = a_net_id;
-    l_chain_pkt->hdr.cell_id.uint64 = a_cell_id;
-    l_chain_pkt->hdr.chain_id.uint64 = a_chain_id;
+    size_t l_chain_pkt_size = sizeof(dap_stream_ch_chain_pkt_hdr_t) + a_data_size;
+    dap_stream_ch_chain_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size );
+    *l_chain_pkt = (dap_stream_ch_chain_pkt_t){
+            .hdr = { .version = 1, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id }
+    };
 
     if (a_data_size && a_data)
-        memcpy( l_chain_pkt->data, a_data, a_data_size);
+        memcpy(l_chain_pkt->data, a_data, a_data_size);
 
-    size_t l_ret  = dap_stream_ch_pkt_write_mt(a_worker, a_ch_uuid, a_type , l_chain_pkt, l_chain_pkt_size);
+    size_t l_ret = dap_stream_ch_pkt_write_mt(a_worker, a_ch_uuid, a_type, l_chain_pkt, l_chain_pkt_size);
     DAP_DELETE(l_chain_pkt);
     return l_ret;
 }
@@ -116,18 +116,16 @@ size_t dap_stream_ch_chain_pkt_write_inter(dap_events_socket_t * a_es_input, dap
                                         uint64_t a_chain_id, uint64_t a_cell_id,
                                         const void * a_data, size_t a_data_size)
 {
-    dap_stream_ch_chain_pkt_t * l_chain_pkt;
-    size_t l_chain_pkt_size = sizeof (l_chain_pkt->hdr) + a_data_size;
-    l_chain_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size );
-    l_chain_pkt->hdr.version = 1;
-    l_chain_pkt->hdr.net_id.uint64 = a_net_id;
-    l_chain_pkt->hdr.cell_id.uint64 = a_cell_id;
-    l_chain_pkt->hdr.chain_id.uint64 = a_chain_id;
+    size_t l_chain_pkt_size = sizeof(dap_stream_ch_chain_pkt_hdr_t) + a_data_size;
+    dap_stream_ch_chain_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size );
+    *l_chain_pkt = (dap_stream_ch_chain_pkt_t){
+            .hdr = { .version = 1, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id }
+    };
 
     if (a_data_size && a_data)
-        memcpy( l_chain_pkt->data, a_data, a_data_size);
+        memcpy(l_chain_pkt->data, a_data, a_data_size);
 
-    size_t l_ret  = dap_stream_ch_pkt_write_inter(a_es_input, a_ch_uuid, a_type , l_chain_pkt, l_chain_pkt_size);
+    size_t l_ret = dap_stream_ch_pkt_write_inter(a_es_input, a_ch_uuid, a_type, l_chain_pkt, l_chain_pkt_size);
     DAP_DELETE(l_chain_pkt);
     return l_ret;
 }
diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c
index f9f9ec7ec6cd07eedf38763019929e55623d8c87..d986a74718851a66d0833e3955a63ea719afa321 100644
--- a/modules/common/dap_chain_datum_token.c
+++ b/modules/common/dap_chain_datum_token.c
@@ -402,6 +402,11 @@ byte_t *dap_chain_emission_get_tsd(dap_chain_datum_token_emission_t *a_emission,
         return NULL;
     dap_tsd_t *l_tsd = (dap_tsd_t *)a_emission->tsd_n_signs;
     do {
+        if (a_emission->data.type_auth.tsd_total_size < l_tsd->size) {
+            log_it(L_ERROR, "Corrupt data in emission: invalid TSD size %lu < %u",
+                   a_emission->data.type_auth.tsd_total_size, l_tsd->size);
+            return NULL;
+        }
         if (l_tsd->type == a_type) {
             if (a_size)
                 *a_size = l_tsd->size;