diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt
index ea42647f2430a7869e91f6c6785f6076d9df380e..78ae7458e46f0e6299760dea12620a7d16d03a5b 100644
--- a/modules/CMakeLists.txt
+++ b/modules/CMakeLists.txt
@@ -39,7 +39,7 @@ endif()
 
 # Consensus type dag
 if (CELLFRAME_MODULES MATCHES "cs-blocks")
-#    add_subdirectory(type/blocks)
+    add_subdirectory(type/blocks)
 endif()
 
 # No consensus
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index d75c893559f8867b509c8d727d58a7052498febe..0229999b387fef74d3121bee193121001cbfe0df 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -79,8 +79,8 @@ typedef dap_chain_atom_ptr_t * (*dap_chain_callback_atom_iter_get_atoms_t)(dap_c
 typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_next_t)(dap_chain_atom_iter_t *  ,size_t*);
 typedef void (*dap_chain_callback_atom_iter_delete_t)(dap_chain_atom_iter_t *  );
 
-typedef size_t (*dap_chain_datum_callback_datum_pool_proc_add_t)(dap_chain_t * , dap_chain_datum_t **, size_t );
-typedef size_t (*dap_chain_datum_callback_datum_pool_proc_add_with_group_t)(dap_chain_t * , dap_chain_datum_t **, size_t, const char *);
+typedef size_t (*dap_chain_callback_add_datums_t)(dap_chain_t * , dap_chain_datum_t **, size_t );
+typedef size_t (*dap_chain_callback_add_datums_with_group_t)(dap_chain_t * , dap_chain_datum_t **, size_t, const char *);
 
 typedef void (*dap_chain_callback_notify_t)(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void* a_atom, size_t a_atom_size); //change in chain happened
 
@@ -122,8 +122,8 @@ typedef struct dap_chain{
     dap_chain_callback_atom_t callback_atom_add;
     dap_chain_callback_atom_verify_t callback_atom_verify;
 
-    dap_chain_datum_callback_datum_pool_proc_add_t callback_datums_pool_proc;
-    dap_chain_datum_callback_datum_pool_proc_add_with_group_t callback_datums_pool_proc_with_group;
+    dap_chain_callback_add_datums_t callback_add_datums;
+    dap_chain_callback_add_datums_with_group_t callback_add_datums_with_group;
 
     dap_chain_callback_atom_get_hdr_size_t callback_atom_get_hdr_static_size; // Get atom header's size
 
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 320bed0abebed52e17b61c8b5dba75567be9d981..7cc13bfb3cdba6872e7943c42d5014bc7742422e 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -327,9 +327,9 @@ bool s_gdb_pkt_callback(dap_proc_thread_t *a_thread, void *a_arg)
         // apply received transaction
         dap_chain_t *l_chain = dap_chain_find_by_id(l_ch_chain->request_net_id, l_ch_chain->request_chain_id);
         if(l_chain) {
-            if(l_chain->callback_datums_pool_proc_with_group){
+            if(l_chain->callback_add_datums_with_group){
                 void * restrict l_store_obj_value = l_store_obj->value;
-                l_chain->callback_datums_pool_proc_with_group(l_chain,
+                l_chain->callback_add_datums_with_group(l_chain,
                         (dap_chain_datum_t** restrict) l_store_obj_value, 1,
                         l_store_obj[i].group);
             }
diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c
index 0819674cad21cd3e584cb335af55245f377f32cb..1e9b966aeaa474b3baba928adca1341b8f939ed1 100644
--- a/modules/consensus/none/dap_chain_cs_none.c
+++ b/modules/consensus/none/dap_chain_cs_none.c
@@ -195,8 +195,8 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     a_chain->callback_atom_iter_delete = s_chain_callback_atom_iter_delete;
 
     a_chain->callback_atom_find_by_hash = s_chain_callback_atom_iter_find_by_hash;
-    a_chain->callback_datums_pool_proc = s_chain_callback_datums_pool_proc;
-    a_chain->callback_datums_pool_proc_with_group = s_chain_callback_datums_pool_proc_with_group;
+    a_chain->callback_add_datums = s_chain_callback_datums_pool_proc;
+    a_chain->callback_add_datums_with_group = s_chain_callback_datums_pool_proc_with_group;
 
     // Linear pass through
     a_chain->callback_atom_iter_get_first = s_chain_callback_atom_iter_get_first; // Get the fisrt element from chain
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index c5150e1cfd84094cb2abaee51480592e0c446545..b74867c4a7a55d236152bd947ca05eecd3ae44a7 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -568,7 +568,7 @@ dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net,
 
     if(!l_datum)
         return NULL;
-    size_t l_datums_number = l_chain->callback_datums_pool_proc(l_chain, &l_datum, 1);
+    size_t l_datums_number = l_chain->callback_add_datums(l_chain, &l_datum, 1);
     if(!l_datums_number)
             return NULL;
 
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 4a213435a8b803ec3bcc030c07959c474f568a1c..20d0a70569adbb5f4561ec8cd1290215e6557363 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -2094,7 +2094,7 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net)
                     }
                 }
             }
-            size_t l_objs_processed = l_chain->callback_datums_pool_proc(l_chain, l_datums, l_datums_size);
+            size_t l_objs_processed = l_chain->callback_add_datums(l_chain, l_datums, l_datums_size);
             // 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++) {
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index 22484d478b6ae9870866abafc8c1b1719b48faba..a27bb9a8bde60d52cbd5d593efc48594ed1ea698 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -260,7 +260,7 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t
             }
         }
     }
-    if (a_chain->callback_datums_pool_proc(a_chain, &a_datum, 1) != 1) {
+    if (a_chain->callback_add_datums(a_chain, &a_datum, 1) != 1) {
         return false;
     }
     return true;
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 6c3f58918094a1439dc9d335ea7d3d682f56caec..c74f2a5ef470007ee523c993ba52fd39675b02f7 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -2245,8 +2245,8 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply
                                              l_verify_datum);
                     ret = -9;
                 }else{
-                    if (l_chain->callback_datums_pool_proc){
-                        if (l_chain->callback_datums_pool_proc(l_chain, &l_datum, 1) ==0 ){
+                    if (l_chain->callback_add_datums){
+                        if (l_chain->callback_add_datums(l_chain, &l_datum, 1) ==0 ){
                             dap_string_append_printf(l_str_tmp, "Error! Datum doesn't pass verifications, examine node log files");
                             ret = -6;
                         }else{
diff --git a/modules/type/blocks/dap_chain_block.c b/modules/type/blocks/dap_chain_block.c
index 1df5d188d442f12911633ce29d4a608d0f9c3fc6..11ea5fef6dd756bf44afe2187aa2058c3ea269da 100644
--- a/modules/type/blocks/dap_chain_block.c
+++ b/modules/type/blocks/dap_chain_block.c
@@ -106,5 +106,8 @@ size_t dap_chain_block_datum_add(dap_chain_block_t * a_block, size_t a_block_siz
     }
 }
 
-void dap_chain_block_datum_del_by_hash(dap_chain_block_t * a_block, size_t a_block_size, dap_chain_hash_fast_t* a_datum_hash);
+size_t dap_chain_block_datum_del_by_hash(dap_chain_block_t * a_block, size_t a_block_size, dap_chain_hash_fast_t* a_datum_hash)
+{
+
+}
 
diff --git a/modules/type/blocks/dap_chain_block_cache.c b/modules/type/blocks/dap_chain_block_cache.c
index 5227a8e79b9dfec89819f2cb5f0749af4841b07c..183d9d85148372a0758dbf7379a60610e638ce52 100644
--- a/modules/type/blocks/dap_chain_block_cache.c
+++ b/modules/type/blocks/dap_chain_block_cache.c
@@ -74,7 +74,6 @@ void dap_chain_block_cache_update(dap_chain_block_cache_t * a_block_cache)
     assert(a_block_cache);
     assert(a_block_cache->block);
     dap_hash_fast(a_block_cache->block, a_block_cache->block_size, &a_block_cache->block_hash);
-    a_block_cache->meta_size
 }
 
 /**
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index f7db8bcebe3a17a8d858ea7382e6e17000de2df4..bf0eb621834c70e539589b78eeb02b2bdf47e164 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -20,8 +20,9 @@
     You should have received a copy of the GNU General Public License
     along with any DAP SDK based project.  If not, see <http://www.gnu.org/licenses/>.
 */
-#include "dap_common.h"
 
+#include <pthread.h>
+#include "dap_common.h"
 #include "dap_enc_base58.h"
 #include "dap_chain.h"
 #include "dap_chain_net.h"
@@ -35,6 +36,7 @@
 
 typedef struct dap_chain_cs_blocks_pvt
 {
+    pthread_rwlock_t rwlock;
     dap_chain_cs_blocks_t * blocks;
 
     dap_chain_block_cache_t * block_cache_first; // Mapped area start
@@ -86,7 +88,7 @@ static dap_chain_atom_ptr_t *s_callback_atom_iter_get_lasts( dap_chain_atom_iter
 // Delete iterator
 static void s_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter );                  //    Get the fisrt block
 
-static size_t s_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_size);
+static size_t s_callback_add_datums(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_size);
 
 bool s_seed_mode=false;
 
@@ -169,12 +171,14 @@ int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config
     a_chain->callback_tx_find_by_hash = s_callback_atom_iter_find_by_tx_hash;
 
 
-    a_chain->callback_datums_pool_proc = s_callback_datums_pool_proc;
+    a_chain->callback_add_datums = s_callback_add_datums;
 
     dap_chain_cs_blocks_pvt_t *l_cs_blocks_pvt = DAP_NEW_Z(dap_chain_cs_blocks_pvt_t);
     l_cs_blocks->_pvt = l_cs_blocks_pvt;
+    a_chain->_pvt = l_cs_blocks_pvt;
+    pthread_rwlock_init(&l_cs_blocks_pvt->rwlock,NULL);
 
-    dap_chain_node_role_t l_net_role= dap_chain_net_get_role( dap_chain_net_by_id(a_chain->net_id) );
+//    dap_chain_node_role_t l_net_role= dap_chain_net_get_role( dap_chain_net_by_id(a_chain->net_id) );
 
     // Datum operations callbacks
 /*
@@ -186,6 +190,14 @@ int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config
     return 0;
 }
 
+/**
+ * @brief dap_chain_cs_blocks_delete
+ * @param a_chain
+ */
+void dap_chain_cs_blocks_delete(dap_chain_t * a_chain)
+{
+   pthread_rwlock_destroy(&PVT(a_chain)->rwlock );
+}
 
 
 /**
@@ -343,11 +355,12 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void *a_arg_func, char **a_s
                                                                                               &l_datum_size,
                                                                l_gdb_group_mempool);
             l_datums[0] = l_datum;
-            if ( s_callback_datums_pool_proc(l_chain,l_datums,l_datums_count ) == l_datums_count ){
+            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);
+
                    if ( dap_chain_global_db_gr_del( dap_strdup(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 ",
@@ -396,13 +409,10 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void *a_arg_func, char **a_s
                     dap_string_append_printf(l_str_tmp,"\t\t\tchain_id: 0x%016llX\n",l_block->hdr.chain_id.uint64);
                     dap_string_append_printf(l_str_tmp,"\t\t\tts_created: %s\n",ctime_r(&l_ts_reated, buf) );
 
-                    // Prepare to parse data section
-                    size_t l_offset = 0;
-
-                    // Parse Metadata
+                    // Dump Metadata
                     dap_string_append_printf(l_str_tmp,"\tMetadata. Count: %us\n",l_block->hdr.meta_count );
-                    for (uint16_t i=0; i < l_block->hdr.meta_count  &&  l_offset < l_block_size-sizeof (l_block->hdr); i++){
-                        dap_chain_block_meta_t * l_meta =(dap_chain_block_meta_t *) (l_block->meta_n_datum_n_sign + l_offset);
+                    for (uint32_t i=0; i < l_block_cache->meta_count; i++){
+                        dap_chain_block_meta_t * l_meta = l_block_cache->meta[i];
                         switch (l_meta->hdr.type) {
                             case DAP_CHAIN_BLOCK_META_GENESIS:{
                                 dap_string_append_printf(l_str_tmp,"\t\tGENESIS\n");
@@ -428,111 +438,66 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void *a_arg_func, char **a_s
                                 dap_string_append_printf(l_str_tmp,"\t\t\0x%0X: 0x%s\n", l_data_hex );
                             }
                         }
-                        l_offset += l_meta->hdr.size + sizeof (l_meta->hdr);
                     }
-                    for (uint16_t i=0; i < l_block->hdr.meta_count  &&  l_offset < l_block_size-sizeof (l_block->hdr); i++){
-                        dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (l_block->hashes_n_datum_n_signs + l_offset);
+                    dap_string_append_printf(l_str_tmp,"\t\tdatums:\tcount: %uz\n",l_block_cache->datum_count);
+                    for (uint32_t i=0; i < l_block_cache->datum_count ; i++){
+                        dap_chain_datum_t * l_datum = l_block_cache->datum[i];
                         size_t l_datum_size =  dap_chain_datum_size(l_datum);
+                        dap_string_append_printf(l_str_tmp,"\t\t\tdatum:\tdatum_size: %u\n",l_datum_size);
+                        if (l_datum_size < sizeof (l_datum->header) ){
+                            dap_string_append_printf(l_str_tmp,"\t\t\tERROR: datum size %zd is smaller than header size %zd \n",l_datum_size,
+                                                     sizeof (l_datum->header));
+                            break;
+                        }
                         time_t l_datum_ts_create = (time_t) l_datum->header.ts_create;
-
                         // Nested datums
-                        dap_string_append_printf(l_str_tmp,"\t\t\t\tdatum:\tdatum_size: %u\n",l_datum_size);
-                        dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tversion:=0x%02X\n", l_datum->header.version_id);
-                        dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\ttype_id:=%s\n", c_datum_type_str[l_datum->header.type_id]);
-                        dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tts_create=%s\n",ctime_r( &l_datum_ts_create,buf ));
-                        dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tdata_size=%u\n", l_datum->header.data_size);
+                        dap_string_append_printf(l_str_tmp,"\t\t\t\tversion:=0x%02X\n", l_datum->header.version_id);
+                        dap_string_append_printf(l_str_tmp,"\t\t\t\ttype_id:=%s\n", c_datum_type_str[l_datum->header.type_id]);
+                        dap_string_append_printf(l_str_tmp,"\t\t\t\tts_create=%s\n",ctime_r( &l_datum_ts_create,buf ));
+                        dap_string_append_printf(l_str_tmp,"\t\t\t\tdata_size=%u\n", l_datum->header.data_size);
+                        dap_chain_net_dump_datum(l_str_tmp, l_datum, "hex" );
                     }
                     // Signatures
-                    dap_string_append_printf(l_str_tmp,"\t\t\t\tsigns:\tcount: %us\n",l_block->hdr.sign_count);
-                    l_offset += l_datum_size;
-                    while (l_offset + sizeof (l_block->header) < l_event_size ){
-                        dap_sign_t * l_sign =(dap_sign_t *) (l_block->hashes_n_datum_n_signs +l_offset);
+                    dap_string_append_printf(l_str_tmp,"\t\tsignatures:\tcount: %u\n",l_block_cache->sign_count );
+                    for (uint32_t i=0; i < l_block_cache->sign_count ; i++){
+                        dap_sign_t * l_sign =l_block_cache->sign[i];
                         size_t l_sign_size = dap_sign_get_size(l_sign);
-                        if (l_sign_size == 0 ){
-                            dap_string_append_printf(l_str_tmp,"\t\t\t\tERROR: wrong sign size 0, stop parsing headers\n");
-                            break;
-                        }
                         dap_chain_addr_t l_addr = {0};
                         dap_chain_hash_fast_t l_pkey_hash;
                         dap_sign_get_pkey_hash(l_sign, &l_pkey_hash);
                         dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, l_net->pub.id);
-                        char * l_addr_str = dap_chain_addr_to_str(&l_addr);
-                        dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\ttype: %s\taddr: %s"
-                                                           "n", dap_sign_type_to_str( l_sign->header.type ),
-                                                 l_addr_str );
-                        l_offset += l_sign_size;
-                        DAP_DELETE( l_addr_str);
+                        char * l_pkey_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash);
+                        dap_string_append_printf(l_str_tmp,"\t\t\t: type:%s size: %zd pkey_hash: %s data_hash: "
+                                                           "n", dap_sign_type_to_str( l_sign->header.type ), l_sign_size, l_pkey_hash_str );
+                        DAP_DELETE( l_pkey_hash_str );
                     }
-                    dap_chain_net_dump_datum(l_str_tmp, l_datum, l_hash_out_type);
-
                     dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
                     dap_string_free(l_str_tmp,false);
                     ret=0;
                 }
             }else {
-                dap_chain_node_cli_set_reply_text(a_str_reply,
-                                                  "Can't find blocl 0x%s in the new forming round ",
-                                                  l_event_hash_str);
+                dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find block %s ", l_subcmd_str_arg);
                 ret=-10;
             }
         }break;
         case SUBCMD_LIST:{
-            if( (l_from_events_str == NULL) ||
-                    (strcmp(l_from_events_str,"round.new") == 0) ){
-                char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new;
-                dap_string_t * l_str_tmp = dap_string_new("");
-                if ( l_gdb_group_events ){
-                    dap_global_db_obj_t * l_objs;
-                    size_t l_objs_count = 0;
-                    l_objs = dap_chain_global_db_gr_load(l_gdb_group_events,&l_objs_count);
-                    dap_string_append_printf(l_str_tmp,"%s.%s: Found %u records :\n",l_net->pub.name,l_chain->name,l_objs_count);
-
-                    for (size_t i = 0; i< l_objs_count; i++){
-                        dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) l_objs[i].value;
-                        char buf[50];
-                        time_t l_ts_create = (time_t) l_event->header.ts_created;
-                        dap_string_append_printf(l_str_tmp,"\t%s: ts_create=%s",
-                                                 l_objs[i].key, ctime_r( &l_ts_create,buf ) );
 
-                    }
-                    // bugs-3932
-                    //DAP_DELETE( l_gdb_group_events);
-                    if (l_objs && l_objs_count )
-                        dap_chain_global_db_objs_delete(l_objs, l_objs_count);
-                    ret = 0;
-                } else {
-                    dap_string_append_printf(l_str_tmp,"%s.%s: Error! No GlobalDB group!\n",l_net->pub.name,l_chain->name);
-                    ret = -2;
-
-                }
-                dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
-                dap_string_free(l_str_tmp,false);
-            }else if (l_from_events_str && (strcmp(l_from_events_str,"events") == 0) ){
                 dap_string_t * l_str_tmp = dap_string_new(NULL);
-                size_t l_events_count = HASH_COUNT(PVT(l_dag)->events);
-                dap_string_append_printf(l_str_tmp,"%s.%s: Have %u events :\n",
-                                         l_net->pub.name,l_chain->name,l_events_count);
-                dap_chain_cs_dag_event_item_t * l_event_item = NULL,*l_event_item_tmp = NULL;
+                dap_string_append_printf(l_str_tmp,"%s.%s: Have %u blocks :\n",
+                                         l_net->pub.name,l_chain->name,PVT(l_blocks)->blocks_count);
+                dap_chain_block_cache_t * l_block_cache = NULL,*l_block_cache_tmp = NULL;
 
-                pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock);
-                HASH_ITER(hh,PVT(l_dag)->events,l_event_item, l_event_item_tmp ) {
-                    char buf[50];
-                    char * l_event_item_hash_str = dap_chain_hash_fast_to_str_new( &l_event_item->hash);
-                    time_t l_ts_create = (time_t) l_event_item->event->header.ts_created;
+                pthread_rwlock_rdlock(&PVT(l_blocks)->rwlock);
+                HASH_ITER(hh,PVT(l_blocks)->block_cache_first,l_block_cache, l_block_cache_tmp ) {
+                    char  l_buf[50];
                     dap_string_append_printf(l_str_tmp,"\t%s: ts_create=%s",
-                                             l_event_item_hash_str, ctime_r( &l_ts_create,buf ) );
-                    DAP_DELETE(l_event_item_hash_str);
+                                             l_block_cache->block_hash_str, ctime_r( &l_block_cache->ts_created,l_buf ) );
                 }
-                pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
+                pthread_rwlock_unlock(&PVT(l_blocks)->rwlock);
 
                 dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
                 dap_string_free(l_str_tmp,false);
 
-            }else {
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Undefined events source for listing ");
-                ret=-14;
-
-            }
         }break;
 
         case SUBCMD_UNDEFINED: {
@@ -715,7 +680,7 @@ static void s_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter )
  * @param a_datums_size
  * @return
  */
-static size_t s_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_size)
+static size_t s_callback_add_datums(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_size)
 {
 
 }
diff --git a/modules/type/blocks/include/dap_chain_block.h b/modules/type/blocks/include/dap_chain_block.h
index 92a944fdad653dc96629a6f5a81b0d4bb8fe64de..cad3a151794549465eacedaa0f9d8239a1efd284 100644
--- a/modules/type/blocks/include/dap_chain_block.h
+++ b/modules/type/blocks/include/dap_chain_block.h
@@ -70,12 +70,6 @@ typedef struct dap_chain_block_meta{
 #define DAP_CHAIN_BLOCK_META_NONCE2            0x21
 
 
-// Section with datum
-typedef struct  dap_chain_block_datum{
-    uint32_t size_t;
-    dap_chain_datum_t datum;
-}DAP_ALIGN_PACKED dap_chain_block_datum_t;
-
 /**
  * @struct dap_chain_block
  * @brief The dap_chain_block struct
diff --git a/modules/type/blocks/include/dap_chain_block_cache.h b/modules/type/blocks/include/dap_chain_block_cache.h
index bd7439eb7014a71d1ef9cc7ba35da7107eaf3b0b..890accd18abab1d6e1933036ef2fb8f263588d40 100644
--- a/modules/type/blocks/include/dap_chain_block_cache.h
+++ b/modules/type/blocks/include/dap_chain_block_cache.h
@@ -29,8 +29,12 @@
 typedef struct dap_chain_block_cache{
     // Block's general non-nested attributes
     dap_chain_hash_fast_t block_hash;
+    char* block_hash_str;
     size_t block_size;
 
+    // Local platform values representation
+    time_t ts_created;
+
     // Block's datums
     uint32_t datum_count;
     dap_chain_datum_t ** datum;
diff --git a/modules/type/blocks/include/dap_chain_cs_blocks.h b/modules/type/blocks/include/dap_chain_cs_blocks.h
index 59a18662e297e115db131a685910119c719c2f1b..f2be5e7fa63f0b63d87dd0a8f2e3ab24e3414ae7 100644
--- a/modules/type/blocks/include/dap_chain_cs_blocks.h
+++ b/modules/type/blocks/include/dap_chain_cs_blocks.h
@@ -58,3 +58,4 @@ int dap_chain_cs_blocks_init();
 void dap_chain_cs_blocks_deinit();
 
 int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config);
+void dap_chain_cs_blocks_delete(dap_chain_t * a_chain);
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 121cac6f470b81fe3e93f05a95ec2e5fbf7ea3f7..53de10dec0993374a7c926921abdc4e01727d69e 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -193,7 +193,7 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     a_chain->callback_tx_find_by_hash = s_chain_callback_atom_iter_find_by_tx_hash;
 
 
-    a_chain->callback_datums_pool_proc = s_chain_callback_datums_pool_proc;
+    a_chain->callback_add_datums = s_chain_callback_datums_pool_proc;
 
     // Datum operations callbacks
 /*