diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 5ab97105f5aef75bc8bbe5ba41ad5717d8d553dc..a020a853cbae3a48ec93b8413399c1d0c6e81c0f 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -198,6 +198,30 @@ static int compare_datum_items(const void * l_a, const void * l_b)
     return 1;
 }
 
+
+/**
+ * @brief dap_chain_ledger_token_check
+ * @param a_ledger
+ * @param a_token
+ * @return
+ */
+int dap_chain_ledger_token_check(dap_ledger_t * a_ledger,  dap_chain_datum_token_t *a_token)
+{
+    if ( !a_ledger){
+        log_it(L_ERROR, "NULL ledger, can't add datum with token declaration!");
+        return  -1;
+    }
+
+    dap_chain_ledger_token_item_t * l_token_item;
+    HASH_FIND_STR(PVT(a_ledger)->tokens,a_token->ticker,l_token_item);
+    if ( l_token_item != NULL ){
+        log_it(L_WARNING,"Duplicate token declaration for ticker '%s' ", a_token->ticker);
+        return -3;
+    }
+    // Checks passed
+    return 0;
+}
+
 /**
  * @brief dap_chain_ledger_token_add
  * @param a_token
@@ -226,13 +250,13 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,  dap_chain_datum_token_t
 
         HASH_ADD_STR(PVT(a_ledger)->tokens, ticker, l_token_item) ;
         switch(a_token->type){
-            case DAP_CHAIN_DATUM_TOKEN_PRIVATE:
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:
                 l_token_item->total_supply = a_token->header_private.total_supply;
                 log_it( L_NOTICE, "Private token %s added (total_supply = %.1llf signs_valid=%hu signs_total=%hu type=DAP_CHAIN_DATUM_TOKEN_PRIVATE )",
                         a_token->ticker, dap_chain_balance_to_coins(a_token->header_private.total_supply),
                         a_token->header_private.signs_valid, a_token->header_private.signs_total);
             break;
-            case DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL:
+            case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:
                 log_it( L_NOTICE, "Private token %s type=DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL )", a_token->ticker);
             break;
             default:
@@ -283,6 +307,48 @@ dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags)
     return l_ledger; //dap_chain_ledger_load(l_ledger, "kelvin-testnet", "plasma");
 }
 
+int dap_chain_ledger_token_emission_check(dap_ledger_t *a_ledger, const dap_chain_datum_token_emission_t *a_token_emission
+                                        , size_t a_token_emission_size)
+{
+    int ret = 0;
+    dap_ledger_private_t *l_ledger_priv = PVT(a_ledger);
+
+    const char * c_token_ticker = a_token_emission->hdr.ticker;
+    dap_chain_ledger_token_item_t * l_token_item = NULL;
+    pthread_rwlock_rdlock(&l_ledger_priv->tokens_rwlock);
+    HASH_FIND_STR(l_ledger_priv->tokens, c_token_ticker, l_token_item);
+    pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock);
+
+    dap_chain_ledger_token_emission_item_t * l_token_emission_item = NULL;
+
+    // check if such emission is already present in table
+    dap_chain_hash_fast_t l_token_emission_hash={0};
+    //dap_chain_hash_fast_t * l_token_emission_hash_ptr = &l_token_emission_hash;
+    dap_hash_fast(a_token_emission, a_token_emission_size, &l_token_emission_hash);
+    char * l_hash_str = dap_chain_hash_fast_to_str_new(&l_token_emission_hash);
+    pthread_rwlock_rdlock( l_token_item ?
+                               &l_token_item->token_emissions_rwlock :
+                               &l_ledger_priv->treshold_emissions_rwlock
+                               );
+    HASH_FIND(hh,l_token_item ? l_token_item->token_emissions : l_ledger_priv->treshold_emissions,
+              &l_token_emission_hash, sizeof(l_token_emission_hash), l_token_emission_item);
+    if(l_token_emission_item ) {
+        log_it(L_ERROR, "Can't add token emission datum of %llu %s ( 0x%s ): already present in cache",
+                a_token_emission->hdr.value, c_token_ticker, l_hash_str);
+        ret = -1;
+    }else if ( l_token_item || HASH_COUNT( l_ledger_priv->treshold_emissions) < s_treshold_emissions_max  ) {
+        log_it(L_WARNING,"Treshold for emissions is overfulled (%lu max)",
+               s_treshold_emissions_max);
+        ret = -2;
+    }
+    pthread_rwlock_unlock(l_token_item ?
+                              &l_token_item->token_emissions_rwlock :
+                              &l_ledger_priv->treshold_emissions_rwlock);
+    DAP_DELETE(l_hash_str);
+
+    return ret;
+}
+
 /**
  * @brief dap_chain_ledger_token_emission_add
  * @param a_token_emission
@@ -781,6 +847,32 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
     return 0;
 }
 
+/**
+ * @brief dap_chain_ledger_tx_check
+ * @param a_ledger
+ * @param a_tx
+ * @return
+ */
+int dap_chain_ledger_tx_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx)
+{
+    if(!a_tx)
+        return -2;
+    dap_list_t *l_list_bound_items = NULL;
+    dap_list_t *l_list_tx_out = NULL;
+
+    int l_ret_check;
+    if( (l_ret_check = dap_chain_ledger_tx_cache_check(
+             a_ledger, a_tx, &l_list_bound_items, &l_list_tx_out)) < 0){
+        log_it (L_WARNING, "dap_chain_ledger_tx_add() tx not passed the check: code %d ",l_ret_check);
+        return -1;
+    }
+    dap_chain_hash_fast_t *l_tx_hash = dap_chain_node_datum_tx_calc_hash(a_tx);
+    char l_tx_hash_str[70];
+    dap_chain_hash_fast_to_str(l_tx_hash,l_tx_hash_str,sizeof(l_tx_hash_str));
+    //log_it ( L_INFO, "dap_chain_ledger_tx_add() check passed for tx %s",l_tx_hash_str);
+    return 0;
+}
+
 /**
  * Add new transaction to the cache list
  *
diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h
index 4949d81bacb612336e86e9c1f8a887fd77d3600f..58281f90737350e76fdea96ef85a56fceed8909c 100644
--- a/modules/chain/include/dap_chain_ledger.h
+++ b/modules/chain/include/dap_chain_ledger.h
@@ -79,12 +79,16 @@ static inline dap_chain_hash_fast_t* dap_chain_node_datum_tx_calc_hash(dap_chain
  */
 int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx);
 
+
+int dap_chain_ledger_tx_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx);
+
 /**
  * Add new token datum
  *
  */
 
 int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token, size_t a_token_size);
+int dap_chain_ledger_token_check(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token);
 
 /**
  * Add token emission datum
@@ -92,6 +96,10 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,dap_chain_datum_token_t *
 int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger,
         const dap_chain_datum_token_emission_t *a_token_emission, size_t a_token_emission_size);
 
+// Check if it addable
+int dap_chain_ledger_token_emission_check(dap_ledger_t *a_ledger,
+        const dap_chain_datum_token_emission_t *a_token_emission, size_t a_token_emission_size);
+
 dap_chain_datum_token_emission_t * dap_chain_ledger_token_emission_find(dap_ledger_t *a_ledger,
         const char *a_token_ticker, const dap_chain_hash_fast_t *a_token_emission_hash);
 
diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c
index 2ed6852bed2a226b0d4e606de01d6a68c40c0303..d8515e87228b90c82e41026dae4efc0968cc664b 100644
--- a/modules/common/dap_chain_datum.c
+++ b/modules/common/dap_chain_datum.c
@@ -61,4 +61,3 @@ dap_chain_datum_t * dap_chain_datum_create(uint16_t a_type_id, const void * a_da
    l_datum->header.ts_create =(uint64_t) time(NULL);
    return  l_datum;
 }
-
diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h
index 78078d5d292677247b64df0a558655fa6451655f..695c7e02a6dd8ccca54a81e675c8008171bc22fc 100644
--- a/modules/common/include/dap_chain_datum_token.h
+++ b/modules/common/include/dap_chain_datum_token.h
@@ -62,13 +62,13 @@ typedef struct dap_chain_datum_token{
 
 // Token declaration type
 // Simple private token decl
-#define DAP_CHAIN_DATUM_TOKEN_PRIVATE        0x0001
+#define DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE        0x0001
 // Extended declaration of privatetoken with in-time control
-#define DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL   0x0002
+#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL   0x0002
 // Token update
-#define DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE 0x0003
+#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE 0x0003
 // Open token with now ownership
-#define DAP_CHAIN_DATUM_TOKEN_PUBLIC          0x0004
+#define DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC          0x0004
 
 
 // Macros for token flags
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 357f3e6baaab4cac3402e0b1a3b21ae39d9bb7b9..e94553fddaa95e30bd36e6ed24c9e91666e51956 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -1960,13 +1960,21 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net)
             size_t l_objs_size_tmp = (l_objs_size > 15) ? min(l_objs_size, 10) : l_objs_size;
             for(size_t i = 0; i < l_objs_size; i++) {
                 dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i].value;
-                l_datums[i] = l_datum;
-                if(i < l_objs_size_tmp) {
-                    char buf[50];
-                    time_t l_ts_create = (time_t) l_datum->header.ts_create;
-                    log_it(L_INFO, "\t\t0x%s: type_id=%s ts_create=%s data_size=%u",
-                            l_objs[i].key, c_datum_type_str[l_datum->header.type_id],
-                            ctime_r(&l_ts_create, buf), l_datum->header.data_size);
+                int l_verify_datum= dap_chain_net_verify_datum( a_net, l_datum) ;
+                if (l_verify_datum != 0){
+                    log_it(L_WARNING, "Datum doesn't pass verifications (code %d), delete such datum from pool",
+                                             l_verify_datum);
+                    dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
+                    l_datums[i] = NULL;
+                }else{
+                    l_datums[i] = l_datum;
+                    if(i < l_objs_size_tmp) {
+                        char buf[50];
+                        time_t l_ts_create = (time_t) l_datum->header.ts_create;
+                        log_it(L_INFO, "\t\t0x%s: type_id=%s ts_create=%s data_size=%u",
+                                l_objs[i].key, c_datum_type_str[l_datum->header.type_id],
+                                ctime_r(&l_ts_create, buf), l_datum->header.data_size);
+                    }
                 }
             }
             size_t l_objs_processed = l_chain->callback_datums_pool_proc(l_chain, l_datums, l_datums_size);
@@ -1983,6 +1991,15 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net)
                 log_it(L_WARNING, "%s.%s: %d records not processed", a_net->pub.name, l_chain->name,
                         l_datums_size - l_objs_processed);
             dap_chain_global_db_objs_delete(l_objs, l_objs_size);
+
+            // Cleanup datums array
+            if(l_datums){
+                for(size_t i = 0; i < l_objs_size; i++) {
+                    if (l_datums[i])
+                        DAP_DELETE(l_datums[i]);
+                }
+                DAP_DEL_Z(l_datums);
+            }
         }
         else {
             log_it(L_INFO, "%s.%s: No records in mempool", a_net->pub.name, l_chain ? l_chain->name : "[no chain]");
@@ -2049,3 +2066,8 @@ dap_list_t * dap_chain_net_get_add_gdb_group(dap_chain_net_t * a_net, dap_chain_
     }
     return l_list_groups;
 }
+
+int dap_chain_net_verify_datum(dap_chain_net_t *a_net, dap_chain_datum_t * a_datum )
+{
+
+}
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index e8f3bbcea090ab0d45724d8fa37bcbedc6e8da4b..52d7365202a72de98c5f476966ade6686b5f5008 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -86,7 +86,6 @@
 #include "dap_chain_mempool.h"
 #include "dap_chain_global_db.h"
 #include "dap_chain_global_db_remote.h"
-//#include "dap_chain_gdb.h"
 
 #include "dap_stream_ch_chain_net.h"
 #include "dap_stream_ch_chain.h"
@@ -2116,76 +2115,63 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply
         l_gdb_group_mempool_tmp = l_gdb_group_mempool;
     }
 
-    dap_string_t * l_str_tmp = dap_string_new(NULL);
-    DL_FOREACH(l_net->pub.chains, l_chain) {
-        if(!l_gdb_group_mempool) {
-            l_gdb_group_mempool_tmp = dap_chain_net_get_gdb_group_mempool(l_chain);
-        }
-        size_t l_objs_size = 0;
-        dap_global_db_obj_t * l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool_tmp, &l_objs_size);
-        if(l_objs_size) {
-            dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records :\n", l_net->pub.name, l_chain->name,
-                    l_objs_size);
-            size_t l_datums_size = l_objs_size;
-            dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*,
-                    sizeof(dap_chain_datum_t*) * l_datums_size);
-            size_t l_objs_size_tmp = (l_objs_size > 15) ? min(l_objs_size, 10) : l_objs_size;
-            for(size_t i = 0; i < l_objs_size; i++) {
-                dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i].value;
-                l_datums[i] = l_datum;
-                if(i < l_objs_size_tmp) {
-                    char buf[50];
-                    time_t l_ts_create = (time_t) l_datum->header.ts_create;
-                    dap_string_append_printf(l_str_tmp, "0x%s: type_id=%s ts_create=%s data_size=%u\n",
-                            l_objs[i].key, c_datum_type_str[l_datum->header.type_id],
-                            ctime_r(&l_ts_create, buf), l_datum->header.data_size);
-                }
-            }
-            if(l_objs_size > 15) {
-                dap_string_append_printf(l_str_tmp, "...\n");
-            }
-
-            size_t l_objs_processed = 0;
-            int * l_procecced = DAP_NEW_Z_SIZE(int,l_objs_size);
-            for(size_t i = 0; i < l_objs_size; i++) {
-                int l_is_processed = l_chain->callback_datums_pool_proc(l_chain, l_datums + i, 1); //l_datums_size
-                l_objs_processed += l_is_processed;
-                l_procecced[i] = l_is_processed;
-            }
-            DAP_DELETE(l_datums);
-            // Delete processed objects
-            size_t l_objs_processed_tmp = (l_objs_processed > 15) ? min(l_objs_processed, 10) : l_objs_processed;
-            size_t l_objs_processed_cur = 0;
-            for(size_t i = 0; i < l_datums_size; i++) {
-                if(l_procecced[i]!=1)
-                    continue;
-                dap_chain_global_db_gr_del( dap_strdup(l_objs[i].key), l_gdb_group_mempool_tmp);
-                l_objs_processed_cur++;
-                if(l_objs_processed_cur < l_objs_processed_tmp) {
-                    dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n",
-                            l_objs[i].key);
+    const char * l_datum_hash_str = NULL;
+    int ret = 0;
+    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str);
+    if(l_datum_hash_str) {
+        char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
+        dap_string_t * l_str_tmp = dap_string_new(NULL);
+        size_t l_datum_size=0;
+        dap_chain_datum_t * l_datum = (dap_chain_datum_t*) dap_chain_global_db_gr_get(l_datum_hash_str,
+                                                                                       &l_datum_size, l_gdb_group_mempool);
+        size_t l_datum_size2= dap_chain_datum_size( l_datum);
+        if (l_datum_size != l_datum_size2 ){
+            ret = -8;
+            dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Corrupted datum %s, size by datum headers is %zd when in mempool is only %zd bytes",
+                                              l_datum_size2, l_datum_size);
+        }else{
+            if(l_datum) {
+                char buf[50];
+                time_t l_ts_create = (time_t) l_datum->header.ts_create;
+                dap_string_append_printf(l_str_tmp, "0x%s: type_id=%s ts_create=%s data_size=%u\n",
+                        l_datum_hash_str, c_datum_type_str[l_datum->header.type_id],
+                        ctime_r(&l_ts_create, buf), l_datum->header.data_size);
+                int l_verify_datum= dap_chain_net_verify_datum( l_net, l_datum) ;
+                if (l_verify_datum != 0){
+                    dap_string_append_printf(l_str_tmp, "Error! Datum doesn't pass verifications (code %d) examine node log files",
+                                             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 ){
+                            dap_string_append_printf(l_str_tmp, "Error! Datum doesn't pass verifications, examine node log files");
+                            ret = -6;
+                        }else{
+                            dap_string_append_printf(l_str_tmp, "Datum processed well.");
+                            if (dap_chain_global_db_gr_del( dap_strdup(l_datum_hash_str), l_gdb_group_mempool)){
+                                dap_string_append_printf(l_str_tmp, "Warning! Can't delete datum from mempool!");
+                            }else
+                                dap_string_append_printf(l_str_tmp, "Removed datum from mempool");
+                        }
+                    }else{
+                        dap_string_append_printf(l_str_tmp, "Error! Can't move to no-concensus chains from mempool");
+                        ret = -1;
+                    }
                 }
+                dap_string_append_printf(l_str_tmp, "\n");
+                dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
+                dap_string_free(l_str_tmp, true);
+            } else {
+                dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s", l_datum_hash_str);
+                ret = -4;
             }
-            if(l_objs_processed > 15) {
-                dap_string_append_printf(l_str_tmp, "...\n");
-            }
-            if(l_objs_processed < l_datums_size)
-                dap_string_append_printf(l_str_tmp, "%s.%s: %d records not processed\n", l_net->pub.name, l_chain->name,
-                        l_datums_size - l_objs_processed);
-            dap_chain_global_db_objs_delete(l_objs, l_objs_size);
-            DAP_DELETE( l_procecced);
-        }
-        else {
-            dap_string_append_printf(l_str_tmp, "%s.%s: No records in mempool\n", l_net->pub.name, l_chain ? l_chain->name : "[no chain]");
         }
         DAP_DELETE(l_gdb_group_mempool);
-        // only one time if group defined
-        if(l_gdb_group_mempool)
-            break;
+    } else {
+        dap_chain_node_cli_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option", argv[0]);
+        ret = -5;
     }
-    dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
-    dap_string_free(l_str_tmp, true);
-    return 0;
+    return  ret;
 }
 
 
@@ -2242,7 +2228,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply
     int l_arg_index = 1;
 
     const char * l_type_str = NULL;
-    uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_PRIVATE;
+    uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE;
 
     const char * l_ticker = NULL;
 
@@ -2284,7 +2270,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply
     l_arg_index=dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-type", &l_type_str);
 
     if (strcmp( l_type_str, "private") == 0){
-        l_type = DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE;
+        l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE;
     }else{
         dap_chain_node_cli_set_reply_text(a_str_reply, "token_update can't accept type \"%s\"", l_type_str);
         return -22;
@@ -2294,7 +2280,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply
     size_t l_datum_data_offset = 0;
 
     switch(l_type){
-        case DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE:{
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{
             dap_list_t *l_tsd_list = dap_list_alloc();
             size_t l_tsd_total_size = 0;
             l_arg_index++;
@@ -2431,7 +2417,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply
 
             // Create new datum token
             l_datum_token_update = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)+l_tsd_total_size ) ;
-            l_datum_token_update->type = DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE;
+            l_datum_token_update->type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE;
             dap_snprintf(l_datum_token_update->ticker, sizeof(l_datum_token_update->ticker), "%s", l_ticker);
             l_datum_token_update->header_private_update.tsd_total_size = l_tsd_total_size;
 
@@ -2466,7 +2452,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply
             return -8;
     }
 
-    dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE, l_datum_token_update,
+    dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE, l_datum_token_update,
             sizeof(l_datum_token_update->header_private) + l_datum_data_offset);
     size_t l_datum_size = dap_chain_datum_size(l_datum);
 
@@ -2551,7 +2537,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply)
     int l_arg_index = 1;
 
     const char * l_type_str = NULL;
-    uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_PRIVATE;
+    uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE;
 
     const char * l_ticker = NULL;
 
@@ -2593,18 +2579,18 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply)
     l_arg_index=dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-type", &l_type_str);
 
     if (strcmp( l_type_str, "private") == 0){
-        l_type = DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL;
+        l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL;
     }else if (strcmp( l_type_str, "private_simple") == 0){
-        l_type = DAP_CHAIN_DATUM_TOKEN_PRIVATE;
+        l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE;
     }else if (strcmp( l_type_str, "public_simple") == 0){
-        l_type = DAP_CHAIN_DATUM_TOKEN_PUBLIC;
+        l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC;
     }
 
     dap_chain_datum_token_t * l_datum_token = NULL;
     size_t l_datum_data_offset = 0;
 
     switch(l_type){
-        case DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL:{
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:{
             dap_list_t *l_tsd_list = dap_list_alloc();
             size_t l_tsd_total_size = 0;
             uint16_t l_flags = 0;
@@ -2687,7 +2673,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply)
             log_it(L_DEBUG,"Prepeared TSD sections on %zd total size", l_tsd_total_size);
             // Create new datum token
             l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)+l_tsd_total_size ) ;
-            l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL;
+            l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL;
             dap_snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker);
             l_datum_token->header_private_decl.flags = l_flags;
             log_it(L_DEBUG,"Token declaration '%s' initialized", l_datum_token->ticker);
@@ -2748,7 +2734,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply)
 
 
         }break;
-        case DAP_CHAIN_DATUM_TOKEN_PRIVATE:{
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{
             // Total supply value
             dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-total_supply", &l_total_supply_str);
 
@@ -2823,7 +2809,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply)
 
             // Create new datum token
             l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t));
-            l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_PRIVATE;
+            l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE;
             dap_snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker);
             l_datum_token->header_private.total_supply = l_total_supply;
             l_datum_token->header_private.signs_total = l_signs_total;
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index 8b76bfcf1b80bab2dd9ba984004fa09228b40d0b..9e42ea0ae42655dc672ac87c899f2efa5a383d62 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -151,3 +151,4 @@ char * dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t * l_net
 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(dap_chain_net_t *a_net, 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 29a3887054113c5211d3fdec933c433ab9f705e0..8a4290424d9b0698bc1b9db7d74277388ec1ba52 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -390,7 +390,19 @@ 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
+            continue;
+
+        // Verify for correctness
+        dap_chain_net_t * l_net = dap_chain_net_by_id( a_chain->net_id);
+        int l_verify_datum= dap_chain_net_verify_datum( l_net, l_datum) ;
+        if (l_verify_datum != 0){
+            log_it(L_WARNING, "Datum doesn't pass verifications (code %d)",
+                                     l_verify_datum);
+            continue;
+        }
 
+        // Prepare round
         if ( l_hashes_int_size && l_events_round_new_size){
             // Linking randomly with current new round set
             size_t l_rnd_steps;