diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4eb71372f3de98d3f9b4d738d19bfa0c5b0acd13..3783dcd82e072cc3d574dde8cd19fabe69c314c8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ project(cellframe-sdk C)
 cmake_minimum_required(VERSION 2.8)
 
 set(CMAKE_C_STANDARD 11)
-set(CELLFRAME_SDK_NATIVE_VERSION "2.1-2")
+set(CELLFRAME_SDK_NATIVE_VERSION "2.1-3")
 include(cmake/OS_Detection.cmake)
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 646f888ebce4b32d8cc91c9a8b64fc8f368a48f2..977573186fcb88d79a8dff964680433e3af75087 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -613,8 +613,10 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
      */
 
     dap_ledger_private_t *l_ledger_priv = PVT(a_ledger);
-    if(!a_tx)
+    if(!a_tx){
+        log_it(L_DEBUG, "NULL transaction, check broken");
         return -1;
+    }
 
     dap_list_t *l_list_bound_items = NULL;
 
@@ -822,6 +824,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
                     dap_list_free_full(l_list_bound_items, free);
                 if (l_list_tx_out)
                     dap_list_free(l_list_tx_out);
+                log_it(L_ERROR, "Emission for tx_token wasn't found for ticker %s and emission hash %s",l_tx_token->header.token_emission_hash );
                 return -6;
             }
         }
diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c
index d0c8a39a530444b29c0714ee2b2cc8f1c05051b9..017e3d238717688379e60c587de666f07dd14b19 100644
--- a/modules/common/dap_chain_datum_token.c
+++ b/modules/common/dap_chain_datum_token.c
@@ -64,3 +64,74 @@ dap_chain_datum_token_tsd_t * dap_chain_datum_token_tsd_create(uint16_t a_type,
     return l_tsd;
 
 }
+
+/**
+ * @brief dap_chain_datum_token_tsd_get
+ * @param a_token
+ * @param a_token_size
+ * @return
+ */
+dap_chain_datum_token_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size_t a_token_size)
+{
+    // Check if token type could have tsd section
+    size_t l_hdr_size;
+    size_t l_tsd_size;
+    switch( a_token->type){
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:
+            l_hdr_size = sizeof (a_token->header_private_decl);
+            if (l_hdr_size> a_token_size){
+                log_it(L_WARNING, "Token size smaller then header, corrupted data");
+                return NULL;
+            }
+            l_tsd_size = a_token->header_private_decl.tsd_total_size;
+        break;
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:
+            l_hdr_size = sizeof(a_token->header_private_update);
+            if (l_hdr_size> a_token_size){
+                log_it(L_WARNING, "Token size smaller then header, corrupted data");
+                return NULL;
+            }
+            l_tsd_size = a_token->header_private_update.tsd_total_size;
+        break;
+        default: return NULL;
+    }
+
+    if (l_tsd_size+l_hdr_size > a_token_size){
+        log_it(L_WARNING, "TSD size %zd overlaps with header, corrupted data");
+    }else if (l_tsd_size +l_hdr_size == a_token_size){
+        log_it(L_INFO, "No signatures at all, returning pointer to the top of data");
+        return (dap_chain_datum_token_tsd_t*) a_token->data_n_tsd;
+    }
+
+    // Pass through signatures to find top of TSD section
+    size_t l_offset = 0;
+    while( l_offset < (a_token_size - l_hdr_size-l_tsd_size) ){
+        dap_sign_t* l_sign = (dap_sign_t*) (a_token->data_n_tsd + l_offset);
+        if (l_sign->header.sign_size == 0){
+            log_it( L_WARNING, "Corrupted signature, 0 size");
+            return NULL;
+        }
+        l_offset += dap_sign_get_size( l_sign);
+    }
+    if ( l_offset + l_hdr_size +l_tsd_size <= a_token_size  )
+        return (dap_chain_datum_token_tsd_t*) (a_token->data_n_tsd+l_offset);
+    else{
+        log_it(L_WARNING, "Signatures overlaps with TSD section, corrupted data");
+        return NULL;
+    }
+}
+
+/**
+ * @brief dap_chain_datum_token_flags_dump
+ * @param a_str_out
+ * @param a_flags
+ */
+void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags)
+{
+    for ( uint16_t i = 0;  (2^i) <=DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++ ){
+        if(   a_flags & (2^i) )
+            dap_string_append_printf(a_str_out,"%s%s", c_dap_chain_datum_token_flag_str[2^i],
+                    (2^i)==DAP_CHAIN_DATUM_TOKEN_FLAG_MAX?",":"\n"  );
+    }
+}
+
diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h
index 695c7e02a6dd8ccca54a81e675c8008171bc22fc..f347de9d1a40e2a85816ca6ab105bab9fcefb570 100644
--- a/modules/common/include/dap_chain_datum_token.h
+++ b/modules/common/include/dap_chain_datum_token.h
@@ -24,8 +24,10 @@
 */
 #pragma once
 #include "dap_chain_common.h"
+#include "dap_hash.h"
 #include "dap_sign.h"
 
+#include "dap_string.h"
 #include "dap_strfuncs.h"
 
 // Token declaration
@@ -148,24 +150,27 @@ typedef struct dap_chain_datum_token_tsd{
 // Set total signs count value to set to be valid
 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID   0x0004
 
+// Remove owner signature by pkey fingerprint
+#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE  0x0005
+
 // Add owner signature's pkey fingerprint
 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_ADD     0x0006
 
-// Remove owner signature by pkey fingerprint
-#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE  0x0007
 
 
 
 /// ------- Permissions list flags, grouped by update-remove-clear operations --------
+// Blocked datum types list add, remove or clear
+#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD          0x0007
+#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE       0x0008
+#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_CLEAR        0x0009
+
+
 // Allowed datum types list add, remove or clear
 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD          0x0010
 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE       0x0011
 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_CLEAR        0x0012
 
-// Blocked datum types list add, remove or clear
-#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD          0x0013
-#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE       0x0014
-#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_CLEAR        0x0015
 
 //Allowed tx receiver addres list add, remove or clear
 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD          0x0014
@@ -230,12 +235,15 @@ extern const char *c_dap_chain_datum_token_emission_type_str[];
 ///
 
 dap_chain_datum_token_tsd_t * dap_chain_datum_token_tsd_create(uint16_t a_type, const void * a_data, size_t a_data_size);
+dap_chain_datum_token_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token,  size_t a_token_size);
+void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags);
+
 #define dap_chain_datum_token_tsd_create_scalar(type,value) dap_chain_datum_token_tsd_create (type, &value, sizeof(value) )
 #define dap_chain_datum_token_tsd_get_scalar(a,typeconv)  *((typeconv*) a->data)
 
 // NULL-terminated string
 #define dap_chain_datum_token_tsd_create_string(type,str) dap_chain_datum_token_tsd_create (type,str, dap_strlen(str))
-#define dap_chain_datum_token_tsd_get_string(a)  ((char*) a->data )
-#define dap_chain_datum_token_tsd_get_string_const(a)  ((const char*) a->data )
+#define dap_chain_datum_token_tsd_get_string(a)  ( ((char*) a->data )[a->size-1] == '\0'? (char*) a->data  : "<CORRUPTED STRING>" )
+#define dap_chain_datum_token_tsd_get_string_const(a)  ( ((const char*) a->data )[a->size-1] == '\0'? (const char*) a->data : "<CORRUPTED STRING>" )
 
 #define dap_chain_datum_token_tsd_size(a) (sizeof(*a)+a->size)
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 817a8666efa59c87a67ec6423bfa442d6b46a531..aa01b74fc8ad9911af514f7d204f33c05254b755 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -2096,3 +2096,201 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t
         default: return 0;
     }
 }
+
+/**
+ * @brief dap_chain_net_dump_datum
+ * @param a_str_out
+ * @param a_datum
+ */
+void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_datum)
+{
+    if( a_datum == NULL){
+        dap_string_append_printf(a_str_out,"==Datum is NULL\n");
+        return;
+    }
+    switch (a_datum->header.type_id){
+        case DAP_CHAIN_DATUM_TOKEN_DECL:{
+            dap_chain_datum_token_t * l_token = (dap_chain_datum_token_t*) a_datum->data;
+            size_t l_token_size = a_datum->header.data_size;
+            dap_string_append_printf(a_str_out,"==Datum Token Declaration\n");
+            dap_string_append_printf(a_str_out, "ticker: %s\n", l_token->ticker);
+            dap_string_append_printf(a_str_out, "size: %zd\n", l_token_size);
+            switch (l_token->type) {
+                case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{
+                    dap_string_append_printf(a_str_out, "type: SIMPLE\n");
+                    dap_string_append_printf(a_str_out, "sign_total: %u\n", l_token->header_private.signs_total );
+                    dap_string_append_printf(a_str_out, "sign_valid: %u\n", l_token->header_private.signs_valid );
+                    dap_string_append_printf(a_str_out, "total_supply: %u\n", l_token->header_private.total_supply );
+                }break;
+                case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{
+                    dap_string_append_printf(a_str_out,"type: PRIVATE_UPDATE\n");
+                    dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_get(l_token, l_token_size);
+                    if (l_tsd == NULL)
+                        dap_string_append_printf(a_str_out,"<CORRUPTED TSD SECTION>\n");
+                    else{
+                        size_t l_offset = 0;
+                        size_t l_offset_max = l_token->header_private_decl.tsd_total_size;
+                        while( l_offset< l_offset_max){
+                            if ( (l_tsd->size+l_offset) >l_offset_max){
+                                log_it(L_WARNING, "<CORRUPTED TSD> too big size %zd when left maximum %zd",
+                                       l_tsd->size, l_offset_max - l_offset);
+                                return;
+                            }
+                            switch( l_tsd->type){
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS:
+                                    dap_string_append_printf(a_str_out,"flags_set: ");
+                                    dap_chain_datum_token_flags_dump(a_str_out,
+                                                                     dap_chain_datum_token_tsd_get_scalar(l_tsd, uint16_t));
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_UNSET_FLAGS:
+                                    dap_string_append_printf(a_str_out,"flags_unset: ");
+                                    dap_chain_datum_token_flags_dump(a_str_out,
+                                                                     dap_chain_datum_token_tsd_get_scalar(l_tsd, uint16_t));
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY:
+                                    dap_string_append_printf(a_str_out,"total_supply: %u\n",
+                                                             dap_chain_datum_token_tsd_get_scalar(l_tsd, uint128_t) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID :
+                                    dap_string_append_printf(a_str_out,"total_signs_valid: %u\n",
+                                                             dap_chain_datum_token_tsd_get_scalar(l_tsd, uint16_t) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_ADD :
+                                    if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){
+                                        char *l_hash_str = dap_chain_hash_fast_to_str_new(
+                                                    (dap_chain_hash_fast_t*) l_tsd->data );
+                                        dap_string_append_printf(a_str_out,"total_signs_add: %s\n", l_hash_str );
+                                        DAP_DELETE( l_hash_str );
+                                    }else
+                                        dap_string_append_printf(a_str_out,"total_signs_add: <WRONG SIZE %zd>\n", l_tsd->size);
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE :
+                                    if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){
+                                        char *l_hash_str = dap_chain_hash_fast_to_str_new(
+                                                    (dap_chain_hash_fast_t*) l_tsd->data );
+                                        dap_string_append_printf(a_str_out,"total_signs_remoev: %s\n", l_hash_str );
+                                        DAP_DELETE( l_hash_str );
+                                    }else
+                                        dap_string_append_printf(a_str_out,"total_signs_add: <WRONG SIZE %zd>\n", l_tsd->size);
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD  :
+                                    dap_string_append_printf(a_str_out,"datum_type_allowed_add: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE  :
+                                    dap_string_append_printf(a_str_out,"datum_type_allowed_remove: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD  :
+                                    dap_string_append_printf(a_str_out,"datum_type_blocked_add: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE:
+                                    dap_string_append_printf(a_str_out,"datum_type_blocked_remove: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD:
+                                    dap_string_append_printf(a_str_out,"tx_sender_allowed_add: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE:
+                                    dap_string_append_printf(a_str_out,"tx_sender_allowed_remove: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD:
+                                    dap_string_append_printf(a_str_out,"tx_sender_blocked_add: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE:
+                                    dap_string_append_printf(a_str_out,"tx_sender_blocked_remove: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD:
+                                    dap_string_append_printf(a_str_out,"tx_receiver_allowed_add: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE:
+                                    dap_string_append_printf(a_str_out,"tx_receiver_allowed: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD:
+                                    dap_string_append_printf(a_str_out, "tx_receiver_blocked_add: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE:
+                                    dap_string_append_printf(a_str_out, "tx_receiver_blocked_remove: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                default: dap_string_append_printf(a_str_out, "<0x%04X>: <size %zd>\n", l_tsd->type, l_tsd->size);
+                            }
+                            l_offset += dap_chain_datum_token_tsd_size(l_tsd);
+
+                        }
+                    }
+                }break;
+                case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:{
+                    dap_string_append_printf(a_str_out,"type: PRIVATE_DECL\n");
+                    dap_string_append_printf(a_str_out,"flags: ");
+                    dap_chain_datum_token_flags_dump(a_str_out, l_token->header_private_decl.flags);
+                    dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_get(l_token, l_token_size);
+                    if (l_tsd == NULL)
+                        dap_string_append_printf(a_str_out,"<CORRUPTED TSD SECTION>\n");
+                    else{
+                        size_t l_offset = 0;
+                        size_t l_offset_max = l_token->header_private_decl.tsd_total_size;
+                        while( l_offset< l_offset_max){
+                            if ( (l_tsd->size+l_offset) >l_offset_max){
+                                log_it(L_WARNING, "<CORRUPTED TSD> too big size %zd when left maximum %zd",
+                                       l_tsd->size, l_offset_max - l_offset);
+                                return;
+                            }
+                            switch( l_tsd->type){
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY:
+                                    dap_string_append_printf(a_str_out,"total_supply: %u\n",
+                                                             dap_chain_datum_token_tsd_get_scalar(l_tsd, uint128_t) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID :
+                                    dap_string_append_printf(a_str_out,"total_signs_valid: %u\n",
+                                                             dap_chain_datum_token_tsd_get_scalar(l_tsd, uint16_t) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD  :
+                                    dap_string_append_printf(a_str_out,"datum_type_allowed: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD  :
+                                    dap_string_append_printf(a_str_out,"datum_type_blocked: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD:
+                                    dap_string_append_printf(a_str_out,"tx_sender_allowed: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD:
+                                    dap_string_append_printf(a_str_out,"tx_sender_blocked: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD:
+                                    dap_string_append_printf(a_str_out,"tx_receiver_allowed: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD:
+                                    dap_string_append_printf(a_str_out, "tx_receiver_blocked: %s\n",
+                                                             dap_chain_datum_token_tsd_get_string_const(l_tsd) );
+                                break;
+                                default: dap_string_append_printf(a_str_out, "<0x%04X>: <size %zd>\n", l_tsd->type, l_tsd->size);
+                            }
+                            l_offset += dap_chain_datum_token_tsd_size(l_tsd);
+
+                        }
+                    }
+                }break;
+                case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC:{
+                    dap_string_append_printf(a_str_out,"type: PUBLIC\n");
+                }break;
+                default:
+                    dap_string_append_printf(a_str_out,"type: UNKNOWN\n");
+            }
+
+        }break;
+    }
+}
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 14c7a183cb08342f4ea1a4d6456b065c3b351b82..2d2a9b7752b34ac494314c42eb112c2124ee3761 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -2014,13 +2014,8 @@ int com_mempool_list(int argc, char ** argv, void *arg_func, char ** a_str_reply
                 dap_string_append_printf(l_str_tmp, "%s: type_id=%s  data_size=%u ts_create=%s", // \n included in timestamp
                         l_objs[i].key, c_datum_type_str[l_datum->header.type_id],
                         l_datum->header.data_size, ctime_r(&l_ts_create, buf));
-                if ( l_datum->header.type_id == DAP_CHAIN_DATUM_TOKEN_DECL ){
-                    dap_chain_datum_token_t * l_datum_token = (dap_chain_datum_token_t *) l_datum->data;
-                    dap_string_append_printf(l_str_tmp,
-                         "\tDAP_CHAIN_DATUM_TOKEN_DECL: type=%u ticker=\"%s\" signs_total=%u signs_valid=%u\n",
-                                             l_datum_token->type, l_datum_token->ticker,
-                                             l_datum_token->header_private.signs_total, l_datum_token->header_private.signs_valid );
-                }
+
+                dap_chain_net_dump_datum(l_str_tmp, l_datum);
             }
             // Clean up
             dap_chain_global_db_objs_delete(l_objs, l_objs_size);
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index 463a6e777c4d46d4e445f648d362c6077acc9fea..1ee163f511085e3ec452a041b0bc162b152de67b 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -44,6 +44,7 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include <stdint.h>
 #include <string.h>
 #include "dap_strfuncs.h"
+#include "dap_string.h"
 #include "dap_chain_common.h"
 #include "dap_chain_node.h"
 #include "dap_chain.h"
@@ -153,3 +154,4 @@ dap_chain_net_t **dap_chain_net_list(size_t *a_size);
 dap_list_t * dap_chain_net_get_add_gdb_group(dap_chain_net_t * a_net, dap_chain_node_addr_t a_node_addr);
 
 int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t * a_datum );
+void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_datum);
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 873be6125e2d4227abed8fe5fef109549bfd8ed5..3038215e8572106c3c397dccb86de12a6db9aafb 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -391,8 +391,10 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
 
     for (size_t d = 0; d <a_datums_count ; d++){
         dap_chain_datum_t * l_datum = a_datums[d];
-        if(l_datum == NULL) // Was wrong datum thats not passed checks
+        if(l_datum == NULL){ // Was wrong datum thats not passed checks
+            log_it(L_WARNING,"Datum in mempool processing comes NULL");
             continue;
+        }
 
         // Verify for correctness
         dap_chain_net_t * l_net = dap_chain_net_by_id( a_chain->net_id);
@@ -444,12 +446,13 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
         // Now link with ext events
         dap_chain_cs_dag_event_item_t *l_event_ext_item = NULL;
         // is_single_line - only one link inside
-        if(!l_dag->is_single_line || !l_hashes_linked)
-        if( PVT(l_dag)->events_lasts_unlinked && l_hashes_linked < l_hashes_size) { // Take then the first one if any events_lasts are present
-                l_event_ext_item = PVT(l_dag)->events_lasts_unlinked;
-                memcpy(&l_hashes[l_hashes_linked], &l_event_ext_item->hash, sizeof(l_event_ext_item->hash));
-                l_hashes_linked++;
-            }
+        if(!l_dag->is_single_line || !l_hashes_linked){
+            if( PVT(l_dag)->events_lasts_unlinked && l_hashes_linked < l_hashes_size) { // Take then the first one if any events_lasts are present
+                    l_event_ext_item = PVT(l_dag)->events_lasts_unlinked;
+                    memcpy(&l_hashes[l_hashes_linked], &l_event_ext_item->hash, sizeof(l_event_ext_item->hash));
+                    l_hashes_linked++;
+                }
+        }
 
         if (l_hashes_linked || s_seed_mode ) {
             dap_chain_cs_dag_event_t * l_event = NULL;
@@ -1120,10 +1123,22 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
                                                       l_event_hash_str);
                     ret = 0;
                 }else {
-                    dap_chain_node_cli_set_reply_text(a_str_reply,
-                                                      "Can't remove event 0x%s from the new forming round ",
-                                                      l_event_hash_str);
-                    ret = -1;
+                    dap_chain_cs_dag_event_item_t * l_event_item = NULL;
+                    HASH_FIND(hh,PVT(l_dag)->events,&l_event_hash,sizeof(l_event_hash),l_event_item);
+
+                    if ( l_event_item ){
+                        HASH_DELETE(hh, PVT(l_dag)->events, l_event_item);
+                        log_it(L_WARNING,"Dropped event 0x%s from chains! Hope you know what are you doing!", l_event_hash_str );
+                        dap_chain_node_cli_set_reply_text(a_str_reply,
+                                                          "Dropped event 0x%s from chains! Hope you know what are you doing! ",
+                                                          l_event_hash_str );
+                        dap_chain_save_all(l_chain);
+                    }else {
+                        dap_chain_node_cli_set_reply_text(a_str_reply,
+                                                          "Can't remove event 0x%s ",
+                                                          l_event_hash_str);
+                        ret = -1;
+                    }
                 }
                 DAP_DELETE( l_gdb_group_events );
                 dap_chain_net_sync_gdb(l_net);
@@ -1201,7 +1216,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
 
                     // Nested datum
                     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:=%0x02X\n", l_datum->header.version_id);
+                    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);
@@ -1227,6 +1242,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
                         DAP_DELETE( l_addr_str);
                         dap_enc_key_delete(l_sign_key);
                     }
+                    dap_chain_net_dump_datum(l_str_tmp, l_datum);
 
                     dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
                     dap_string_free(l_str_tmp,false);