diff --git a/dap-sdk b/dap-sdk
index 84afcccb3f8de976ba0029801844421406ff83a7..e19cc10d05f66dff8611d11b7b9482093ccf01c1 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 84afcccb3f8de976ba0029801844421406ff83a7
+Subproject commit e19cc10d05f66dff8611d11b7b9482093ccf01c1
diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index 3b4d5491912e457cbeeddb4182d136f810cddb04..eb9355737fc50227ea4ce0022a9e85be324fbf6e 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -517,6 +517,13 @@ static bool s_load_notify_callback(dap_chain_t* a_chain) {
     return true;
 }
 
+static int s_ids_sort(const void *a_cell_id1, const void *a_cell_id2)
+{
+    uint64_t a = ((dap_chain_cell_id_t *)a_cell_id1)->uint64,
+             b = ((dap_chain_cell_id_t *)a_cell_id2)->uint64;
+    return a > b ? 1 : (a < b ? -1 : 0);
+}
+
 /**
  * @brief dap_chain_load_all
  * @param l_chain
@@ -536,36 +543,61 @@ int dap_chain_load_all(dap_chain_t *a_chain)
     DIR *l_dir = opendir(l_storage_dir);
     dap_return_val_if_fail_err(l_dir, -3, "Cannot open directory %s, error %d: \"%s\"",
                                           DAP_CHAIN_PVT(a_chain)->file_storage_dir, errno, dap_strerror(errno));
-    int l_err = -1;
-    const char l_suffix[] = ".dchaincell", *l_filename;
+    int l_err = 0, l_cell_idx = 0;
+    const char l_suffix[] = "." DAP_CHAIN_CELL_FILE_EXT, *l_filename;
     struct dirent *l_dir_entry = NULL;
-    dap_time_t l_ts_start = dap_time_now();
+    dap_chain_cell_id_t l_cell_ids[DAP_CHAIN_CELL_MAX_COUNT];
     while (( l_dir_entry = readdir(l_dir) ) ) {
         l_filename = l_dir_entry->d_name;
         size_t l_namelen = strlen(l_filename);
-        if ( l_namelen >= sizeof(l_suffix) && !strncmp(l_filename + l_namelen - (sizeof(l_suffix) - 1), l_suffix, sizeof(l_suffix) - 1) ) {
-            dap_timerfd_t* l_load_notify_timer = dap_timerfd_start(5000, (dap_timerfd_callback_t)s_load_notify_callback, a_chain);
-            l_err = dap_chain_cell_open(a_chain, l_filename, 'a');
-            dap_timerfd_delete(l_load_notify_timer->worker, l_load_notify_timer->esocket_uuid);
-            if (l_err)
+        if (l_namelen >= sizeof(l_suffix)) {
+             /* Check filename */
+            char l_fmt[32] = "", l_ext[ sizeof(DAP_CHAIN_CELL_FILE_EXT) ] = "", l_ext2 = '\0';
+            snprintf(l_fmt, sizeof(l_fmt), "%s%lu%s", "%"DAP_UINT64_FORMAT_x".%", sizeof(DAP_CHAIN_CELL_FILE_EXT) - 1, "[^.].%c");
+            switch ( sscanf(l_filename, l_fmt, &l_cell_ids[l_cell_idx].uint64, l_ext, &l_ext2) ) {
+            case 3:
+                // TODO: X.dchaincell.*, just ignore for now
                 break;
-            s_load_notify_callback(a_chain);
+            case 2:
+                if ( !dap_strncmp(l_ext, DAP_CHAIN_CELL_FILE_EXT, sizeof(l_ext)) ) {
+                    l_cell_idx++;
+                    break;
+                }
+            default:
+                log_it(L_ERROR, "Invalid cell file name \"%s\"", l_filename);
+                l_err = EINVAL;
+                break;
+            }
         }
     }
     closedir(l_dir);
-    
-    switch (l_err) {
-    case 0:
-        log_it(L_INFO, "Loaded all chain \"%s : %s\" cells in %lf s",
-                        a_chain->net_name, a_chain->name, difftime((time_t)dap_time_now(), l_ts_start));
-        break;
-    case -1:
-        if (!( l_err = dap_chain_cell_open(a_chain, "0.dchaincell", 'w') ))
+
+    if (!l_cell_idx) {
+        if (!l_err)
+            l_err = dap_chain_cell_open(a_chain, c_dap_chain_cell_id_null, 'w');
+        if (l_err)
+            log_it(L_ERROR, "Chain \"%s : %s\" was not loaded, error %d", a_chain->net_name, a_chain->name, l_err);
+        else
             log_it(L_INFO, "Initialized chain \"%s : %s\" cell 0", a_chain->net_name, a_chain->name);
-        break;
-    default:
-        log_it(L_ERROR, "Chain \"%s : %s\" cell was not loaded, error %d", a_chain->net_name, a_chain->name, l_err);
+        return l_err;
     }
+
+    qsort(l_cell_ids, l_cell_idx, sizeof(dap_chain_cell_id_t), s_ids_sort);
+
+    dap_time_t l_ts_start = dap_time_now();
+    for (int i = 0; i < l_cell_idx; i++) {
+        dap_timerfd_t* l_load_notify_timer = dap_timerfd_start(5000, (dap_timerfd_callback_t)s_load_notify_callback, a_chain);
+        l_err = dap_chain_cell_open(a_chain, l_cell_ids[i], 'a');
+        dap_timerfd_delete(l_load_notify_timer->worker, l_load_notify_timer->esocket_uuid);
+        if (l_err) {
+            log_it(L_ERROR, "Chain \"%s : %s\" cell 0x%016" DAP_UINT64_FORMAT_x " was not loaded, error %d",
+                                    a_chain->net_name, a_chain->name, (uint64_t)l_cell_idx, l_err);
+            return l_err;
+        }
+        s_load_notify_callback(a_chain);
+    }
+    log_it(L_INFO, "Loaded all chain \"%s : %s\" cells in %lf s",
+                    a_chain->net_name, a_chain->name, difftime((time_t)dap_time_now(), l_ts_start));
     return l_err;
 }
 
@@ -960,4 +992,4 @@ const char *dap_chain_type_to_str(const dap_chain_type_t a_default_chain_type)
         default:
             return "unknown";
     }
-}
\ No newline at end of file
+}
diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c
index f2b61e19c87a90aa421d540220e4f931654ed30c..18bac156b3189207edf3e1ec36f7669f6914fc31 100644
--- a/modules/chain/dap_chain_cell.c
+++ b/modules/chain/dap_chain_cell.c
@@ -43,8 +43,6 @@
 #define DAP_CHAIN_CELL_FILE_TYPE_COMPRESSED 1
 #define DAP_MAPPED_VOLUME_LIMIT ( 1 << 28 ) // 256 MB for now, may be should be configurable?
 
-#define CELL_FILE_EXT "dchaincell"
-
 /**
   * @struct dap_chain_cell_file_header
   */
@@ -451,33 +449,9 @@ DAP_STATIC_INLINE int s_cell_open(dap_chain_t *a_chain, const char *a_filepath,
 #undef m_ret_err
 }
 
-int dap_chain_cell_open(dap_chain_t *a_chain, const char *a_filename, const char a_mode) {
-    dap_chain_cell_id_t l_cell_id = { };
-    { /* Check filename */
-        char l_fmt[32] = "", l_ext[ sizeof(CELL_FILE_EXT) ] = "", l_ext2 = '\0';
-        snprintf(l_fmt, sizeof(l_fmt), "%s%lu%s", "%"DAP_UINT64_FORMAT_x".%", sizeof(CELL_FILE_EXT) - 1, "[^.].%c");
-
-        switch ( sscanf(a_filename, l_fmt, &l_cell_id.uint64, l_ext, &l_ext2) ) {
-        case 3:
-            // TODO: X.dchaincell.*
-        case 2:
-            if ( !dap_strncmp(l_ext, CELL_FILE_EXT, sizeof(l_ext)) )
-                break;
-        default:
-            return log_it(L_ERROR, "Invalid cell file name \"%s\"", a_filename), EINVAL;
-        }
-    }
-    char l_full_path[MAX_PATH];
-    snprintf(l_full_path, MAX_PATH, "%s/%s", DAP_CHAIN_PVT(a_chain)->file_storage_dir, a_filename);
-    pthread_rwlock_wrlock(&a_chain->cell_rwlock);
-    int l_ret = s_cell_open(a_chain, l_full_path, l_cell_id, a_mode);
-    pthread_rwlock_unlock(&a_chain->cell_rwlock);
-    return l_ret;
-}
-
-int dap_chain_cell_open_by_id(dap_chain_t *a_chain, const dap_chain_cell_id_t a_cell_id, const char a_mode) {
+int dap_chain_cell_open(dap_chain_t *a_chain, const dap_chain_cell_id_t a_cell_id, const char a_mode) {
     char l_full_path[MAX_PATH];
-    snprintf(l_full_path, MAX_PATH, "%s/%"DAP_UINT64_FORMAT_x"."CELL_FILE_EXT, DAP_CHAIN_PVT(a_chain)->file_storage_dir, a_cell_id.uint64);
+    snprintf(l_full_path, MAX_PATH, "%s/%"DAP_UINT64_FORMAT_x"."DAP_CHAIN_CELL_FILE_EXT, DAP_CHAIN_PVT(a_chain)->file_storage_dir, a_cell_id.uint64);
     pthread_rwlock_wrlock(&a_chain->cell_rwlock);
     int l_ret = s_cell_open(a_chain, l_full_path, a_cell_id, a_mode);
     pthread_rwlock_unlock(&a_chain->cell_rwlock);
diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c
index b4d8e0bff82d80cc473a037eccea210bb8dec6de..47fd9aec71e4b07cb53464382fb84441cd23efd1 100644
--- a/modules/chain/dap_chain_ch.c
+++ b/modules/chain/dap_chain_ch.c
@@ -345,8 +345,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
     } break;
 
     case DAP_CHAIN_CH_PKT_TYPE_CHAIN: {
-        if (!l_chain_pkt_data_size || l_chain_pkt_data_size > sizeof(dap_chain_ch_pkt_t) + DAP_CHAIN_ATOM_MAX_SIZE
-                                                                                         * 5) { // For legacy block sizes
+        if (!l_chain_pkt_data_size || l_chain_pkt_data_size > sizeof(dap_chain_ch_pkt_t) + DAP_CHAIN_ATOM_MAX_SIZE) {
             log_it(L_WARNING, "Incorrect data size %zu in packet %s", l_chain_pkt_data_size,
                                                     dap_chain_ch_pkt_type_to_str(l_ch_pkt->hdr.type));
             dap_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id,
diff --git a/modules/chain/include/dap_chain_cell.h b/modules/chain/include/dap_chain_cell.h
index 658a8b90e2ddcd1e4d755218317b5582ec153f2a..54e34fa2d8a3998c1a6708c3ec6971f74ba21320 100644
--- a/modules/chain/include/dap_chain_cell.h
+++ b/modules/chain/include/dap_chain_cell.h
@@ -29,6 +29,9 @@
 #include "dap_chain.h"
 #include "dap_chain_common.h"
 
+#define DAP_CHAIN_CELL_MAX_COUNT    32
+#define DAP_CHAIN_CELL_FILE_EXT     "dchaincell"
+
 typedef struct dap_chain_cell_mmap_data dap_chain_cell_mmap_data_t;
 
 typedef struct dap_chain_cell {
@@ -76,10 +79,9 @@ typedef struct dap_chain_cell_decl{
 
 
 int dap_chain_cell_init(void);
-int dap_chain_cell_open(dap_chain_t *a_chain, const char *a_filename, const char a_mode);
-int dap_chain_cell_open_by_id(dap_chain_t *a_chain, const dap_chain_cell_id_t a_cell_id, const char a_mode);
+int dap_chain_cell_open(dap_chain_t *a_chain, const dap_chain_cell_id_t a_cell_id, const char a_mode);
 DAP_STATIC_INLINE int dap_chain_cell_create(dap_chain_t *a_chain, const dap_chain_cell_id_t a_cell_id) {
-    return dap_chain_cell_open_by_id(a_chain, a_cell_id, 'w');
+    return dap_chain_cell_open(a_chain, a_cell_id, 'w');
 }
 
 DAP_INLINE dap_chain_cell_t *dap_chain_cell_find_by_id(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id) {
diff --git a/modules/chain/include/dap_chain_srv.h b/modules/chain/include/dap_chain_srv.h
index e20369d54858a73f045daa5c30937f615fd2ccdf..2a8b6fd293629e38e42830043ac3a000e75a3ab3 100644
--- a/modules/chain/include/dap_chain_srv.h
+++ b/modules/chain/include/dap_chain_srv.h
@@ -31,7 +31,7 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 // System services literlas
 #define DAP_CHAIN_SRV_STAKE_POS_DELEGATE_LITERAL "PoS-delegate"
 #define DAP_CHAIN_SRV_XCHANGE_LITERAL "eXchange"
-#define DAP_CHAIN_SRV_VOTING_LITERAL "voting"
+#define DAP_CHAIN_SRV_VOTING_LITERAL "poll"
 
 // Start service callback
 typedef void * (*dap_chain_srv_callback_start_t)(dap_chain_net_id_t a_net_id, dap_config_t *a_config);
diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index 0d548a8f5ed63784b4763803922eaf2011690956..9bce084c74a62ebb77d0c6dca9c2e799a8557bef 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -908,7 +908,7 @@ static dap_list_t *s_get_validators_list(dap_chain_esbocs_t *a_esbocs, dap_hash_
     dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(a_esbocs);
     dap_list_t *l_ret = NULL;
     dap_list_t *l_validators = NULL;
-    if (!l_esbocs_pvt->poa_mode) {
+    if (l_esbocs_pvt->poa_mode) { // UNDO it after debug
         if (a_excluded_list_size) {
             l_validators =  dap_chain_net_srv_stake_get_validators(a_esbocs->chain->net_id, false, NULL);
             uint16_t l_excluded_num = *a_excluded_list;
@@ -2248,7 +2248,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
     dap_chain_esbocs_message_t *l_message = (dap_chain_esbocs_message_t *)l_ch_pkt->data;
     size_t l_message_size = l_ch_pkt->hdr.data_size;
     if (l_message_size < sizeof(dap_chain_esbocs_message_t) ||
-            l_message_size > DAP_CHAIN_ATOM_MAX_SIZE + PKT_SIGN_N_HDR_OVERHEAD ||
+            l_message_size > DAP_CHAIN_CANDIDATE_MAX_SIZE + PKT_SIGN_N_HDR_OVERHEAD ||
             l_message_size != sizeof(*l_message) + l_message->hdr.sign_size + l_message->hdr.message_size) {
         log_it(L_WARNING, "Invalid message size %zu, drop this packet", l_message_size);
         return false;
diff --git a/modules/ledger/dap_chain_ledger_anchor.c b/modules/ledger/dap_chain_ledger_anchor.c
index 56e073d0b4007e8546cb3402cbe6df8bc3ab4bcb..62732c28119305c94efc7b6b3a18ad84323c4da9 100644
--- a/modules/ledger/dap_chain_ledger_anchor.c
+++ b/modules/ledger/dap_chain_ledger_anchor.c
@@ -212,6 +212,8 @@ int dap_ledger_anchor_purge(dap_ledger_t *a_ledger, dap_chain_id_t a_chain_id)
             if (l_decree) {
                 l_decree->is_applied = l_decree->wait_for_apply = false;
                 l_decree->anchor_hash = (dap_hash_fast_t) { };
+                if (l_decree->decree->header.sub_type == DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_REWARD)
+                    dap_chain_net_remove_last_reward(a_ledger->net);
             } else
                 log_it(L_ERROR, "Corrupted datum anchor, can't get decree by hash %s", dap_hash_fast_to_str_static(&l_decree_hash));
         } else
diff --git a/modules/ledger/dap_chain_ledger_tx.c b/modules/ledger/dap_chain_ledger_tx.c
index bdfbb6d2d2a9514da12c858998ac16f7f70b6bc4..7b27491501e0713be1c13d736bda1998a51dc092 100644
--- a/modules/ledger/dap_chain_ledger_tx.c
+++ b/modules/ledger/dap_chain_ledger_tx.c
@@ -266,6 +266,10 @@ static int s_tx_cache_check(dap_ledger_t *a_ledger,
             return DAP_LEDGER_TX_CHECK_FOR_REMOVING_CANT_FIND_TX;
         }
     }
+
+    if (a_ledger->is_hardfork_state)
+        return DAP_LEDGER_CHECK_OK;
+
 /*
  * Steps of checking for current transaction tx2 and every previous transaction tx1:
  * 1. valid(tx2.dap_chain_datum_tx_sig.pkey)
@@ -294,7 +298,7 @@ static int s_tx_cache_check(dap_ledger_t *a_ledger,
     int l_prev_tx_count = 0;
 
     // 1. Verify signature in current transaction
-    if (!a_from_threshold && !a_ledger->is_hardfork_state && dap_chain_datum_tx_verify_sign(a_tx, 0))
+    if (!a_from_threshold && dap_chain_datum_tx_verify_sign(a_tx, 0))
         return DAP_LEDGER_CHECK_NOT_ENOUGH_VALID_SIGNS;
 
     // ----------------------------------------------------------------
@@ -1228,6 +1232,15 @@ dap_list_t *s_trackers_aggregate(dap_ledger_t *a_ledger, dap_list_t *a_trackers,
     return a_trackers;
 }
 
+void s_trackers_clear(void *a_list_elm)
+{
+    struct tracker_mover *l_free = a_list_elm;
+    struct tracker_mover_item *it, *tmp;
+    DL_FOREACH_SAFE(l_free->items, it, tmp)
+        DAP_DELETE(it); // No need for DL_DELETE cause clear the full list
+    DAP_DELETE(a_list_elm);
+}
+
 /**
  * @brief Add new transaction to the cache list
  * @param a_ledger
@@ -1247,14 +1260,19 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha
     dap_list_t *l_list_bound_items = NULL;
     dap_list_t *l_list_tx_out = NULL;
     char l_main_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX] = { '\0' };
-
+    dap_list_t *l_trackers_mover = NULL;
     bool l_from_threshold = a_from_threshold;
     dap_hash_fast_t l_tx_hash = *a_tx_hash;
     byte_t *l_item = NULL;
     size_t l_tx_item_size = 0;
 
     if (a_ledger->is_hardfork_state) {
+        struct tracker_mover *l_hardfork_tracker = NULL;
         TX_ITEM_ITER_TX(l_item, l_tx_item_size, a_tx) {
+            if (*l_item == TX_ITEM_TYPE_OUT_EXT || *l_item == TX_ITEM_TYPE_OUT_COND) {
+                l_list_tx_out = dap_list_append(l_list_tx_out, l_item);
+                continue;
+            }
             if (*l_item != TX_ITEM_TYPE_TSD)
                 continue;
             dap_tsd_t *l_tsd = (dap_tsd_t *)((dap_chain_tx_tsd_t *)l_item)->tsd;
@@ -1273,8 +1291,40 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha
                 }
                 dap_strncpy(l_main_token_ticker, (char *)l_tsd->data, DAP_CHAIN_TICKER_SIZE_MAX);
             } break;
+            case DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_VOTING_HASH: {
+                if (l_tsd->size != sizeof(dap_hash_fast_t)) {
+                    log_it(L_WARNING, "Illegal harfork datum tx TSD VOTING_HASH size %u", l_tsd->size);
+                    break;
+                }
+                l_hardfork_tracker = DAP_NEW_Z(struct tracker_mover);
+                if (!l_hardfork_tracker) {
+                    log_it(L_CRITICAL, "%s", c_error_memory_alloc);
+                    break;
+                }
+                l_hardfork_tracker->voting_hash = *(dap_hash_fast_t *)l_tsd->data;
+                l_trackers_mover = dap_list_append(l_trackers_mover, l_hardfork_tracker);
+            } break;
+            case DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_TRACKER: {
+                if (l_tsd->size != sizeof(dap_ledger_hardfork_tracker_t)) {
+                    log_it(L_WARNING, "Illegal harfork datum tx TSD TRACKER size %u", l_tsd->size);
+                    break;
+                }
+                if (!l_hardfork_tracker) {
+                    log_it(L_WARNING, "No voting hash defined for tracking item");
+                    break;
+                }
+                dap_ledger_hardfork_tracker_t *l_tsd_item = (dap_ledger_hardfork_tracker_t *)l_tsd->data;
+                struct tracker_mover_item *l_tracker_item = DAP_NEW_Z(struct tracker_mover_item);
+                if (!l_tracker_item) {
+                    log_it(L_CRITICAL, "%s", c_error_memory_alloc);
+                    break;
+                }
+                l_tracker_item->pkey_hash = l_tsd_item->pkey_hash;
+                l_tracker_item->coloured_value = l_tsd_item->coloured_value;
+                DL_APPEND(l_hardfork_tracker->items, l_tracker_item);
+            } break;
             default:
-                log_it(L_WARNING, "Illegal harfork datum tx TSD item type %d", l_tsd->type);
+                log_it(L_WARNING, "Illegal harfork datum tx TSD item type 0x%X", l_tsd->type);
                 break;
             }
         }
@@ -1315,7 +1365,6 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha
     // Mark 'out' items in cache if they were used & delete previous transactions from cache if it need
     // find all bound pairs 'in' and 'out'
     size_t l_outs_used = dap_list_length(l_list_bound_items);
-    dap_list_t *l_trackers_mover = NULL;
     dap_store_obj_t *l_cache_used_outs = NULL;
     char *l_ledger_cache_group = NULL;
     if ( is_ledger_cached(l_ledger_pvt) ) {
@@ -1521,6 +1570,8 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha
             pthread_rwlock_unlock(&s_verificators_rwlock);
             if (l_verificator && l_verificator->callback_out_add)
                 l_verificator->callback_out_add(a_ledger, a_tx, &l_tx_hash, l_cond);
+            l_value = l_cond->header.value;
+            l_cur_token_ticker = l_main_token_ticker;
         } break;
         default:
             log_it(L_ERROR, "Unknown item type %d", l_type);
@@ -1576,10 +1627,15 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha
             bool l_vote_add = false;
             if (!l_voting_found && l_vote_tx_item && dap_hash_fast_compare(&l_mover->voting_hash, &l_vote_tx_item->voting_hash))
                 l_voting_found = l_vote_add = true;
-            if (!dap_strcmp(l_cur_token_ticker, l_mover->ticker))
-                continue;
-            dap_ledger_tokenizer_t *l_moving_sum = s_tokenizer_find(l_values_from_cur_tx, l_mover->ticker);
-            assert(l_moving_sum);
+            uint256_t l_moving_sum = {};
+            if (!a_ledger->is_hardfork_state) {
+                if (dap_strcmp(l_cur_token_ticker, l_mover->ticker))
+                    continue;
+                dap_ledger_tokenizer_t *l_moving_sum_per_token = s_tokenizer_find(l_values_from_cur_tx, l_mover->ticker);
+                assert(l_moving_sum_per_token);
+                l_moving_sum = l_moving_sum_per_token->sum;
+            } else
+                l_moving_sum = l_value;
             dap_ledger_tracker_t *l_tracker = NULL;
             struct tracker_mover_item *it;
             uint256_t l_moved_value = {};
@@ -1603,7 +1659,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha
                 DL_APPEND(l_tracker->items, l_tracker_item);
                 uint256_t l_coloured_value;
                 MULT_256_256(l_value, it->coloured_value, &l_coloured_value);
-                DIV_256(l_coloured_value, l_moving_sum->sum, &l_coloured_value);
+                DIV_256(l_coloured_value, l_moving_sum, &l_coloured_value);
                 if (compare256(it->cur_value, l_coloured_value) > 0 &&
                         !IS_ZERO_256(l_coloured_value)) {
                     SUBTRACT_256_256(it->cur_value, l_coloured_value, &it->cur_value);
@@ -1645,56 +1701,6 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha
         }
     }
 
-    if (a_ledger->is_hardfork_state) {
-        TX_ITEM_ITER_TX(l_item, l_tx_item_size, a_tx) {
-            if (*l_item != TX_ITEM_TYPE_TSD)
-                continue;
-            dap_tsd_t *l_tsd = (dap_tsd_t *)((dap_chain_tx_tsd_t *)l_item)->tsd;
-            dap_ledger_tracker_t *l_tracker_current = NULL;
-            switch (l_tsd->type) {
-            case DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_VOTING_HASH: {
-                if (l_tsd->size != sizeof(dap_hash_fast_t)) {
-                    log_it(L_WARNING, "Illegal harfork datum tx TSD VOTING_HASH size %u", l_tsd->size);
-                    break;
-                }
-                l_tracker_current = DAP_NEW_Z(dap_ledger_tracker_t);
-                if (!l_tracker_current) {
-                    log_it(L_CRITICAL, "%s", c_error_memory_alloc);
-                    break;
-                }
-                l_tracker_current->voting_hash = *(dap_hash_fast_t *)l_tsd->data;
-                l_tx_item->out_metadata[0].trackers = dap_list_append(l_tx_item->out_metadata[0].trackers, l_tracker_current);
-            } break;
-            case DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_TRACKER: {
-                if (l_tsd->size != sizeof(dap_ledger_hardfork_tracker_t)) {
-                    log_it(L_WARNING, "Illegal harfork datum tx TSD VOTING_HASH size %u", l_tsd->size);
-                    break;
-                }
-                if (!l_tracker_current) {
-                    log_it(L_WARNING, "No voting hash defined for tracking item");
-                    break;
-                }
-                dap_ledger_hardfork_tracker_t *l_tsd_item = (dap_ledger_hardfork_tracker_t *)l_tsd->data;
-                dap_ledger_tracker_item_t *l_item = DAP_NEW_Z(dap_ledger_tracker_item_t);
-                if (!l_tracker_current) {
-                    log_it(L_CRITICAL, "%s", c_error_memory_alloc);
-                    break;
-                }
-                l_item->pkey_hash = l_tsd_item->pkey_hash;
-                l_item->coloured_value = l_tsd_item->coloured_value;
-                DL_APPEND(l_tracker_current->items, l_item);
-            } break;
-            default:
-                log_it(L_WARNING, "Illegal harfork datum tx TSD item type 0x%X", l_tsd->type);
-                break;
-            }
-            if (l_tsd->size != sizeof(dap_ledger_tracker_t)) {
-                log_it(L_WARNING, "Incorrect size of TSD tracker section %u (need %zu)", l_tsd->size, sizeof(dap_ledger_tracker_t));
-                break;
-            }
-        }
-    }
-
     // add transaction to the cache list
     if (l_multichannel)
         l_tx_item->cache_data.flags |= LEDGER_PVT_TX_META_FLAG_MULTICHANNEL;
@@ -1742,7 +1748,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha
         dap_ledger_pvt_threshold_txs_proc(a_ledger);
 FIN:
     if (l_trackers_mover)
-        dap_list_free_full(l_trackers_mover, dap_ledger_colour_clear_callback);
+        dap_list_free_full(l_trackers_mover, s_trackers_clear);
     if (l_list_bound_items)
         dap_list_free_full(l_list_bound_items, NULL);
     if (l_list_tx_out)
diff --git a/modules/net-srv/dap_chain_net_srv_order.c b/modules/net-srv/dap_chain_net_srv_order.c
index bc45709734eddfd4afc072f7ffae5c00b6a07f39..108748a8722a4f06fe7049f7d0c0e4c15ef96a6f 100644
--- a/modules/net-srv/dap_chain_net_srv_order.c
+++ b/modules/net-srv/dap_chain_net_srv_order.c
@@ -83,11 +83,12 @@ void dap_chain_net_srv_order_deinit()
 
 }
 
-int dap_chain_srv_order_pin_init() {
+int dap_chain_srv_order_pin_init()
+{
     dap_list_t *l_group_list = dap_global_db_driver_get_groups_by_mask("*.service.orders");
     for (dap_list_t *l_list = l_group_list; l_list; l_list = dap_list_next(l_list)) {
         size_t l_ret_count;
-        dap_store_obj_t  * l_ret = dap_global_db_get_all_raw_sync((char*)l_list->data, &l_ret_count);
+        dap_store_obj_t *l_ret = dap_global_db_get_all_raw_sync((char*)l_list->data, &l_ret_count);
         if (!l_ret) {
             dap_store_obj_free(l_ret, l_ret_count);
             return -2;
@@ -98,6 +99,8 @@ int dap_chain_srv_order_pin_init() {
         dap_stream_node_addr_t l_addr = dap_stream_node_addr_from_cert(l_cert);
         const char * l_node_addr_str = dap_stream_node_addr_to_str_static(l_addr);
         for(size_t i = 0; i < l_ret_count; i++) {
+            if (dap_store_obj_get_type(l_ret + i) != DAP_GLOBAL_DB_OPTYPE_ADD)
+                continue;
             const dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_check(l_ret[i].key, l_ret[i].value, l_ret[i].value_len);
             if (!l_order)
                 continue;
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 421600f3189bff46e5b1027102b157063252aa4a..6bc90cd871bbb0f836097bc7f9919d12061591f9 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -2817,7 +2817,9 @@ int dap_chain_net_add_reward(dap_chain_net_t *a_net, uint256_t a_reward, uint64_
 
 void dap_chain_net_remove_last_reward(dap_chain_net_t *a_net)
 {
-    DL_DELETE(PVT(a_net)->rewards, PVT(a_net)->rewards);
+    struct block_reward *l_last_reward = PVT(a_net)->rewards;
+    DL_DELETE(PVT(a_net)->rewards, l_last_reward);
+    DAP_DELETE(l_last_reward);
 }
 
 uint256_t dap_chain_net_get_reward(dap_chain_net_t *a_net, uint64_t a_block_num)
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index e30de2009d83fc58abc93ebbf736d08f0da726b8..de5136367edb8c39e170f602c5999a8b706e59ba 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -492,7 +492,7 @@ dap_chain_datum_t **s_service_state_datums_create(dap_chain_srv_hardfork_state_t
 {
     dap_chain_datum_t **ret = NULL;
     size_t l_datums_count = 0;
-    const uint64_t l_max_step_size = DAP_CHAIN_ATOM_MAX_SIZE - sizeof(dap_chain_datum_service_state_t);
+    const uint64_t l_max_step_size = DAP_CHAIN_CANDIDATE_MAX_SIZE - sizeof(dap_chain_datum_service_state_t);
     uint64_t l_step_size = dap_min(l_max_step_size, a_state->size);
     byte_t *l_offset = a_state->data, *l_ptr = l_offset, *l_end = a_state->data + a_state->size * a_state->count;
     while (l_offset < l_end) {
@@ -551,6 +551,27 @@ int dap_chain_node_hardfork_prepare(dap_chain_t *a_chain, dap_time_t a_last_bloc
     return 0;
 }
 
+static int s_tx_trackers_add(dap_chain_datum_tx_t **a_tx, dap_list_t *a_trackers)
+{
+    for (dap_list_t *it = a_trackers; it; it = it->next) {
+        dap_ledger_tracker_t *l_tracker = it->data;
+        dap_chain_tx_tsd_t *l_tracker_hash_tsd = dap_chain_datum_tx_item_tsd_create(&l_tracker->voting_hash, DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_VOTING_HASH, sizeof(dap_hash_fast_t));
+        if (!l_tracker_hash_tsd)
+            return -1;
+        if (dap_chain_datum_tx_add_item(a_tx, l_tracker_hash_tsd) != 1)
+            return -2;
+        for (dap_ledger_tracker_item_t *l_item = l_tracker->items; l_item; l_item = l_item->next) {
+            dap_ledger_hardfork_tracker_t l_hardfork_tracker = { .pkey_hash = l_item->pkey_hash, .coloured_value = l_item->coloured_value };
+            dap_chain_tx_tsd_t *l_tracker_tsd = dap_chain_datum_tx_item_tsd_create(&l_hardfork_tracker, DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_TRACKER, sizeof(dap_ledger_hardfork_tracker_t));
+            if (!l_tracker_tsd)
+                return -3;
+            if (dap_chain_datum_tx_add_item(a_tx, l_tracker_tsd) != 1)
+                return -4;
+        }
+    }
+    return 0;
+}
+
 dap_chain_datum_t *s_datum_tx_create(dap_chain_addr_t *a_addr, const char *a_ticker, uint256_t a_value, dap_list_t *a_trackers)
 {
     dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create();
@@ -560,17 +581,9 @@ dap_chain_datum_t *s_datum_tx_create(dap_chain_addr_t *a_addr, const char *a_tic
         dap_chain_datum_tx_delete(l_tx);
         return NULL;
     }
-    for (dap_list_t *it = a_trackers; it; it = it->next) {
-        dap_ledger_tracker_t *l_tracker = it->data;
-        dap_chain_tx_tsd_t *l_tracker_tsd = dap_chain_datum_tx_item_tsd_create(l_tracker, DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_TRACKER, sizeof(dap_ledger_tracker_t));
-        if (!l_tracker_tsd) {
-            dap_chain_datum_tx_delete(l_tx);
-            return NULL;
-        }
-        if (dap_chain_datum_tx_add_item(&l_tx, l_tracker_tsd) != 1) {
-            dap_chain_datum_tx_delete(l_tx);
-            return NULL;
-        }
+    if (s_tx_trackers_add(&l_tx, a_trackers)) {
+        dap_chain_datum_tx_delete(l_tx);
+        return NULL;
     }
     dap_chain_datum_t *l_datum_tx = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, dap_chain_datum_tx_get_size(l_tx));
     dap_chain_datum_tx_delete(l_tx);
@@ -608,29 +621,9 @@ dap_chain_datum_t *s_cond_tx_create(dap_chain_tx_out_cond_t *a_cond, dap_chain_t
         dap_chain_datum_tx_delete(l_tx);
         return NULL;
     }
-    for (dap_list_t *it = a_trackers; it; it = it->next) {
-        dap_ledger_tracker_t *l_tracker = it->data;
-        dap_chain_tx_tsd_t *l_tracker_hash_tsd = dap_chain_datum_tx_item_tsd_create(&l_tracker->voting_hash, DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_VOTING_HASH, sizeof(dap_hash_fast_t));
-        if (!l_tracker_hash_tsd) {
-            dap_chain_datum_tx_delete(l_tx);
-            return NULL;
-        }
-        if (dap_chain_datum_tx_add_item(&l_tx, l_tracker_hash_tsd) != 1) {
-            dap_chain_datum_tx_delete(l_tx);
-            return NULL;
-        }
-        for (dap_ledger_tracker_item_t *l_item = l_tracker->items; l_item; l_item = l_item->next) {
-            dap_ledger_hardfork_tracker_t l_hardfork_tracker = { .pkey_hash = l_item->pkey_hash, .coloured_value = l_item->coloured_value };
-            dap_chain_tx_tsd_t *l_tracker_tsd = dap_chain_datum_tx_item_tsd_create(&l_hardfork_tracker, DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_TRACKER, sizeof(dap_ledger_hardfork_tracker_t));
-            if (!l_tracker_tsd) {
-                dap_chain_datum_tx_delete(l_tx);
-                return NULL;
-            }
-            if (dap_chain_datum_tx_add_item(&l_tx, l_tracker_tsd) != 1) {
-                dap_chain_datum_tx_delete(l_tx);
-                return NULL;
-            }
-        }
+    if (s_tx_trackers_add(&l_tx, a_trackers)) {
+        dap_chain_datum_tx_delete(l_tx);
+        return NULL;
     }
     dap_chain_datum_t *l_datum_tx = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, dap_chain_datum_tx_get_size(l_tx));
     dap_chain_datum_tx_delete(l_tx);
@@ -980,7 +973,7 @@ int s_hardfork_check(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, size_t a_
                 } break;
                 case DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_TRACKER: {
                     if (l_tsd->size != sizeof(dap_ledger_hardfork_tracker_t)) {
-                        log_it(L_WARNING, "Illegal harfork datum tx TSD VOTING_HASH size %u", l_tsd->size);
+                        log_it(L_WARNING, "Illegal harfork datum tx TSD TRACKER size %u", l_tsd->size);
                         m_ret_clear(-8);
                     }
                     if (!l_tracker_current) {
diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
index 52785a8f62a32f692b55608cfbc4eae2781fabb5..6cf41102d09b5db692e4af67c9dd4a998aa929e5 100644
--- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
+++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
@@ -787,7 +787,7 @@ static int s_pos_delegate_purge(dap_chain_net_id_t a_net_id, void *a_service_int
     dap_global_db_erase_table(l_gdb_group, NULL, NULL);
     DAP_DELETE(l_gdb_group);
     char *l_approved_group = s_get_approved_group(l_net);
-    dap_global_db_erase_table(l_approved_group, NULL, NULL);
+    dap_global_db_erase_table_sync(l_approved_group);
     DAP_DELETE(l_approved_group);
 
     struct srv_stake *l_srv_stake = (struct srv_stake *)a_service_internal;
@@ -1602,7 +1602,7 @@ void dap_chain_net_srv_stake_remove_approving_decree_info(dap_chain_net_t *a_net
 // func work
     char *l_delegated_group = s_get_approved_group(a_net); 
     const char *l_tx_hash_str = dap_chain_hash_fast_to_str_static(&l_stake->tx_hash);
-    dap_global_db_del_sync(l_delegated_group, l_tx_hash_str);
+    dap_global_db_del(l_delegated_group, l_tx_hash_str, NULL, NULL);
     DAP_DEL_Z(l_delegated_group);
 }
 
diff --git a/modules/service/voting/dap_chain_net_srv_voting.c b/modules/service/voting/dap_chain_net_srv_voting.c
index 3965207130414736b2fa26d05bf9bc74c98bd89f..0ec7680f8ac3f5776ff155a4323cdd02854b383d 100644
--- a/modules/service/voting/dap_chain_net_srv_voting.c
+++ b/modules/service/voting/dap_chain_net_srv_voting.c
@@ -84,16 +84,16 @@ int dap_chain_net_srv_voting_init()
 {
     dap_ledger_voting_verificator_add(s_voting_verificator, s_vote_verificator,
                                       s_datum_tx_voting_verification_delete_callback, dap_chain_net_srv_voting_get_expiration_time);
-    dap_cli_server_cmd_add("voting", s_cli_voting, "Voting commands.",
-                            "voting create -net <net_name> -question <\"Question_string\"> -options <\"Option0\", \"Option1\" ... \"OptionN\"> [-expire <voting_expire_time_in_RCF822>] [-max_votes_count <Votes_count>] [-delegated_key_required] [-vote_changing_allowed] -fee <value> -w <fee_wallet_name>\n"
-                            "voting vote -net <net_name> -hash <voting_hash> -option_idx <option_index> [-cert <delegate_cert_name>] -fee <value> -w <fee_wallet_name> [-token <ticker>]\n"
-                            "voting list -net <net_name>\n"
-                            "voting dump -net <net_name> -hash <voting_hash>\n"
+    dap_cli_server_cmd_add("poll", s_cli_voting, "Voting/poll commands",
+                            "poll create -net <net_name> -question <\"Question_string\"> -options <\"Option0\", \"Option1\" ... \"OptionN\"> [-expire <poll_expire_time_in_RCF822>] [-max_votes_count <votes_count>]"
+                                        " [-delegated_key_required] [-vote_changing_allowed] -fee <value> -w <fee_wallet_name> [-token <ticker>]\n"
+                            "poll vote -net <net_name> -hash <poll_hash> -option_idx <option_index> [-cert <delegate_cert_name>] -fee <value> -w <fee_wallet_name>\n"
+                            "poll list -net <net_name>\n"
+                            "poll dump -net <net_name> -hash <poll_hash>\n"
                             "Hint:\n"
                             "\texample value_coins (only natural) 1.0 123.4567\n"
                             "\texample value_datoshi (only integer) 1 20 0.4321e+4\n");
 
-    
     dap_chain_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_VOTING_ID };
     dap_chain_static_srv_callbacks_t l_srv_callbacks = { .start = s_callback_start,
                                                          .purge = s_callback_purge,
@@ -102,7 +102,7 @@ int dap_chain_net_srv_voting_init()
                                                        };
     int ret = dap_chain_srv_add(l_uid, DAP_CHAIN_SRV_VOTING_LITERAL, &l_srv_callbacks);
     if (ret) {
-        log_it(L_ERROR, "Can't register voting service");
+        log_it(L_ERROR, "Can't register poll service");
         return ret;
     }
     dap_ledger_service_add(l_uid, DAP_CHAIN_SRV_VOTING_LITERAL, s_tag_check_voting);
@@ -145,7 +145,7 @@ static inline struct voting *s_votings_ht_get(dap_chain_net_id_t a_net_id)
 {
     struct srv_voting *l_service_internal = dap_chain_srv_get_internal(a_net_id, (dap_chain_srv_uid_t) { .uint64 = DAP_CHAIN_NET_SRV_VOTING_ID });
     if (!l_service_internal) {
-        log_it(L_ERROR, "Can't find voting service for net id 0x%016" DAP_UINT64_FORMAT_x, a_net_id.uint64);
+        log_it(L_ERROR, "Can't find poll service for net id 0x%016" DAP_UINT64_FORMAT_x, a_net_id.uint64);
         return NULL;
     }
     return l_service_internal->ht;
@@ -175,13 +175,13 @@ static inline bool s_voting_delete(dap_chain_net_id_t a_net_id, dap_hash_fast_t
 {
     struct srv_voting *l_service_internal = dap_chain_srv_get_internal(a_net_id, (dap_chain_srv_uid_t) { .uint64 = DAP_CHAIN_NET_SRV_VOTING_ID });
     if (!l_service_internal) {
-        log_it(L_ERROR, "Can't find voting service for net id 0x%016" DAP_UINT64_FORMAT_x, a_net_id.uint64);
+        log_it(L_ERROR, "Can't find poll service for net id 0x%016" DAP_UINT64_FORMAT_x, a_net_id.uint64);
         return false;
     }
     struct voting *l_voting = NULL;
     HASH_FIND(hh, l_service_internal->ht, a_voting_hash, sizeof(dap_hash_fast_t), l_voting);
     if (!l_voting) {
-        log_it(L_ERROR, "Can't find voting %s", dap_hash_fast_to_str_static(a_voting_hash));
+        log_it(L_ERROR, "Can't find poll %s", dap_hash_fast_to_str_static(a_voting_hash));
         return false;
     }
     HASH_DEL(l_service_internal->ht, l_voting);
@@ -196,7 +196,7 @@ uint64_t *dap_chain_net_srv_voting_get_result(dap_ledger_t *a_ledger, dap_chain_
     dap_return_val_if_fail(a_ledger && a_voting_hash, NULL);
     struct voting *l_voting = s_voting_find(a_ledger->net->pub.id, a_voting_hash);
     if (!l_voting) {
-        log_it(L_ERROR, "Can't find voting with hash %s in net %s", dap_hash_fast_to_str_static(a_voting_hash), a_ledger->net->pub.name);
+        log_it(L_ERROR, "Can't find poll with hash %s in net %s", dap_hash_fast_to_str_static(a_voting_hash), a_ledger->net->pub.name);
         return NULL;
     }
     size_t l_options_count = dap_list_length(l_voting->params->options);
@@ -205,7 +205,7 @@ uint64_t *dap_chain_net_srv_voting_get_result(dap_ledger_t *a_ledger, dap_chain_
     for (dap_list_t *it = l_voting->votes; it; it = it->next) {
         struct vote *l_vote = it->data;
         if (l_vote->answer_idx >= l_options_count) {
-            log_it(L_ERROR, "Answers option index %" DAP_UINT64_FORMAT_U " is higher than options count %zu for voting %s",
+            log_it(L_ERROR, "Answers option index %" DAP_UINT64_FORMAT_U " is higher than options count %zu for poll %s",
                                         l_vote->answer_idx, l_options_count, dap_hash_fast_to_str_static(a_voting_hash));
             continue;
         }
@@ -219,7 +219,7 @@ dap_time_t dap_chain_net_srv_voting_get_expiration_time(dap_ledger_t *a_ledger,
     dap_return_val_if_fail(a_ledger && a_voting_hash, 0);
     struct voting *l_voting = s_voting_find(a_ledger->net->pub.id, a_voting_hash);
     if (!l_voting) {
-        log_it(L_ERROR, "Can't find voting with hash %s in net %s", dap_hash_fast_to_str_static(a_voting_hash), a_ledger->net->pub.name);
+        log_it(L_ERROR, "Can't find poll with hash %s in net %s", dap_hash_fast_to_str_static(a_voting_hash), a_ledger->net->pub.name);
         return 0;
     }
     return l_voting->params->voting_expire;
@@ -238,52 +238,52 @@ static int s_voting_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_
             dap_tsd_t *l_tsd = (dap_tsd_t *)l_tx_tsd->tsd;
             if (l_tx_tsd->header.size < sizeof(dap_tsd_t) ||
                     l_tx_tsd->header.size != dap_tsd_size(l_tsd)) {
-                log_it(L_WARNING, "Incorrect size %" DAP_UINT64_FORMAT_U " of TX_TSD item for voting %s",
+                log_it(L_WARNING, "Incorrect size %" DAP_UINT64_FORMAT_U " of TX_TSD item for poll %s",
                                                 l_tx_tsd->header.size, dap_hash_fast_to_str_static(a_tx_hash));
                 return -DAP_LEDGER_CHECK_INVALID_SIZE;
             }
             switch(l_tsd->type) {
             case VOTING_TSD_TYPE_QUESTION:
                 if (!l_tsd->size || *l_tsd->data == '\0') {
-                    log_it(L_WARNING, "Invalid content for string TSD section QUESTION of voting %s", dap_hash_fast_to_str_static(a_tx_hash));
+                    log_it(L_WARNING, "Invalid content for string TSD section QUESTION of poll %s", dap_hash_fast_to_str_static(a_tx_hash));
                     return -DAP_LEDGER_CHECK_PARSE_ERROR;
                 }
                 l_question_present = true;
                 break;
             case VOTING_TSD_TYPE_OPTION:
                 if (!l_tsd->size || *l_tsd->data == '\0') {
-                    log_it(L_WARNING, "Invalid content for string TSD section ANSWER of voting %s", dap_hash_fast_to_str_static(a_tx_hash));
+                    log_it(L_WARNING, "Invalid content for string TSD section ANSWER of poll %s", dap_hash_fast_to_str_static(a_tx_hash));
                     return -DAP_LEDGER_CHECK_PARSE_ERROR;
                 }
                 l_options_present = true;
                 break;
             case VOTING_TSD_TYPE_EXPIRE:
                 if (l_tsd->size != sizeof(dap_time_t)) {
-                    log_it(L_WARNING, "Incorrect size %u of TSD section EXPIRE of voting %s", l_tsd->size, dap_hash_fast_to_str_static(a_tx_hash));
+                    log_it(L_WARNING, "Incorrect size %u of TSD section EXPIRE of poll %s", l_tsd->size, dap_hash_fast_to_str_static(a_tx_hash));
                     return -DAP_LEDGER_CHECK_INVALID_SIZE;
                 }
                 break;
             case VOTING_TSD_TYPE_MAX_VOTES_COUNT:
                 if (l_tsd->size != sizeof(uint64_t)) {
-                    log_it(L_WARNING, "Incorrect size %u of TSD section MAX_VOTES_COUNT of voting %s", l_tsd->size, dap_hash_fast_to_str_static(a_tx_hash));
+                    log_it(L_WARNING, "Incorrect size %u of TSD section MAX_VOTES_COUNT of poll %s", l_tsd->size, dap_hash_fast_to_str_static(a_tx_hash));
                     return -DAP_LEDGER_CHECK_INVALID_SIZE;
                 }
                 break;
             case VOTING_TSD_TYPE_DELEGATED_KEY_REQUIRED:
                 if (l_tsd->size != sizeof(byte_t)) {
-                    log_it(L_WARNING, "Incorrect size %u of TSD section DELEGATED_KEY_REQUIRED of voting %s", l_tsd->size, dap_hash_fast_to_str_static(a_tx_hash));
+                    log_it(L_WARNING, "Incorrect size %u of TSD section DELEGATED_KEY_REQUIRED of poll %s", l_tsd->size, dap_hash_fast_to_str_static(a_tx_hash));
                     return -DAP_LEDGER_CHECK_INVALID_SIZE;
                 }
                 break;
             case VOTING_TSD_TYPE_VOTE_CHANGING_ALLOWED:
                 if (l_tsd->size != sizeof(byte_t)) {
-                    log_it(L_WARNING, "Incorrect size %u of TSD section VOTE_CHANGING_ALLOWED of voting %s", l_tsd->size, dap_hash_fast_to_str_static(a_tx_hash));
+                    log_it(L_WARNING, "Incorrect size %u of TSD section VOTE_CHANGING_ALLOWED of poll %s", l_tsd->size, dap_hash_fast_to_str_static(a_tx_hash));
                     return -DAP_LEDGER_CHECK_INVALID_SIZE;
                 }
                 break;
             case VOTING_TSD_TYPE_TOKEN:
                 if (!l_tsd->size || l_tsd->size >= DAP_CHAIN_TICKER_SIZE_MAX) {
-                    log_it(L_WARNING, "Incorrect size %u of TSD section TOKEN for voting %s", l_tsd->size, dap_hash_fast_to_str_static(a_tx_hash));
+                    log_it(L_WARNING, "Incorrect size %u of TSD section TOKEN for poll %s", l_tsd->size, dap_hash_fast_to_str_static(a_tx_hash));
                     return -DAP_LEDGER_CHECK_INVALID_SIZE;
                 }
             default:
@@ -292,7 +292,7 @@ static int s_voting_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_
         }
 
         if (!l_question_present || !l_options_present) {
-            log_it(L_WARNING, "Voting with hash %s contain no question or answer options", dap_hash_fast_to_str_static(a_tx_hash));
+            log_it(L_WARNING, "Poll with hash %s contain no question or answer options", dap_hash_fast_to_str_static(a_tx_hash));
             return -2;
         }
 
@@ -309,7 +309,7 @@ static int s_voting_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_
         strcpy(l_item->params->token_ticker, a_ledger->net->pub.native_ticker);
     s_voting_add(a_ledger->net->pub.id, l_item);
 
-    log_it(L_NOTICE, "Voting with hash %s succefully added to ledger", dap_hash_fast_to_str_static(a_tx_hash));
+    log_it(L_NOTICE, "Poll with hash %s succefully added to ledger", dap_hash_fast_to_str_static(a_tx_hash));
 
     return DAP_LEDGER_CHECK_OK;
 }
@@ -321,7 +321,7 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx
 
     struct voting *l_voting = s_voting_find(a_ledger->net->pub.id, &l_vote_tx_item->voting_hash);
     if (!l_voting) {
-        log_it(L_ERROR, "Can't find voting with hash %s in net %s",
+        log_it(L_ERROR, "Can't find poll with hash %s in net %s",
                dap_chain_hash_fast_to_str_static(&l_vote_tx_item->voting_hash), a_ledger->net->pub.name);
         return -5;
     }
@@ -348,17 +348,17 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx
         return -6;
     }
     if (l_voting->params->votes_max_count && dap_list_length(l_voting->votes) >= l_voting->params->votes_max_count){
-        log_it(L_WARNING, "The required number of votes has been collected for voting %s", dap_chain_hash_fast_to_str_static(&l_voting->hash));
+        log_it(L_WARNING, "The required number of votes has been collected for poll %s", dap_chain_hash_fast_to_str_static(&l_voting->hash));
         return -7;
     }
     if (l_voting->params->voting_expire && l_voting->params->voting_expire <= a_tx_in->header.ts_created) {
-        log_it(L_WARNING, "The voting %s has been expired", dap_chain_hash_fast_to_str_static(&l_voting->hash));
+        log_it(L_WARNING, "The poll %s has been expired", dap_chain_hash_fast_to_str_static(&l_voting->hash));
         return -8;
     }
 
     if (l_voting->params->delegate_key_required &&
             !dap_chain_net_srv_stake_check_pkey_hash(a_ledger->net->pub.id, &l_pkey_hash)){
-        log_it(L_WARNING, "Voting %s required a delegated key", dap_chain_hash_fast_to_str_static(&l_voting->hash));
+        log_it(L_WARNING, "Poll %s required a delegated key", dap_chain_hash_fast_to_str_static(&l_voting->hash));
         return -10;
     }
 
@@ -369,7 +369,7 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx
             if (!l_voting->params->vote_changing_allowed) {
                 char l_vote_hash_str[DAP_HASH_FAST_STR_SIZE];
                 dap_hash_fast_to_str(l_vote_hash, l_vote_hash_str, DAP_HASH_FAST_STR_SIZE);
-                log_it(L_WARNING, "The voting %s don't allow change your vote %s",
+                log_it(L_WARNING, "The poll %s don't allow change your vote %s",
                        dap_hash_fast_to_str_static(&l_voting->hash), l_vote_hash_str);
                 return -11;
             }
@@ -413,7 +413,7 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx
         uint256_t l_uncoloured_value = dap_ledger_coin_get_uncoloured_value(a_ledger, &l_vote_tx_item->voting_hash, &l_tx_hash, l_out_idx,
                                                                             l_vote_overwrited ? &l_pkey_hash : NULL);
         if (IS_ZERO_256(l_uncoloured_value)) {
-            log_it(L_ERROR, "Coin with OUT number %d of tx %s is voted before in voting %s", l_out_idx, dap_chain_hash_fast_to_str_static(&l_tx_hash),
+            log_it(L_ERROR, "Coin with OUT number %d of tx %s is voted before in poll %s", l_out_idx, dap_chain_hash_fast_to_str_static(&l_tx_hash),
                                                                             dap_chain_hash_fast_to_str_static(&l_vote_tx_item->voting_hash));
             return -13;
         }
@@ -424,7 +424,7 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx
     }
 
     if (IS_ZERO_256(l_weight) && !l_vote_overwrited) {
-        log_it(L_ERROR, "No uncoloured inputs in vote %s of voting %s", dap_chain_hash_fast_to_str_static(a_tx_hash),
+        log_it(L_ERROR, "No uncoloured inputs in vote %s of poll %s", dap_chain_hash_fast_to_str_static(a_tx_hash),
                                                                         dap_chain_hash_fast_to_str_static(&l_vote_tx_item->voting_hash));
         return -14;
     }
@@ -441,10 +441,10 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx
             const char *l_vote_hash_str = dap_hash_fast_to_str_static(&((struct vote *)l_vote_overwrited->data)->vote_hash);
             DAP_DELETE(l_vote_overwrited->data);
             l_voting->votes = dap_list_delete_link(l_voting->votes, l_vote_overwrited);
-            log_it(L_NOTICE, "Vote %s of voting %s has been changed", l_vote_hash_str, dap_hash_fast_to_str_static(&l_voting->hash));
+            log_it(L_NOTICE, "Vote %s of poll %s has been changed", l_vote_hash_str, dap_hash_fast_to_str_static(&l_voting->hash));
         } else {
             const char *l_vote_hash_str = dap_hash_fast_to_str_static(a_tx_hash);
-            log_it(L_NOTICE, "Vote %s of voting %s has been accepted", l_vote_hash_str, dap_hash_fast_to_str_static(&l_voting->hash));
+            log_it(L_NOTICE, "Vote %s of poll %s has been accepted", l_vote_hash_str, dap_hash_fast_to_str_static(&l_voting->hash));
         }
 
         l_voting->votes = dap_list_append(l_voting->votes, l_vote_item);
@@ -461,7 +461,7 @@ static inline bool s_vote_delete(dap_chain_net_id_t a_net_id, dap_chain_datum_tx
     assert(l_vote_tx_item);
     struct voting * l_voting = s_voting_find(a_net_id, &l_vote_tx_item->voting_hash);
     if (!l_voting) {
-        log_it(L_ERROR, "Can't find voting with hash %s in net id 0x%016" DAP_UINT64_FORMAT_x,
+        log_it(L_ERROR, "Can't find poll with hash %s in net id 0x%016" DAP_UINT64_FORMAT_x,
                                 dap_chain_hash_fast_to_str_static(a_vote_tx_hash), a_net_id.uint64);
         return false;
     }
@@ -484,7 +484,7 @@ static bool s_datum_tx_voting_verification_delete_callback(dap_ledger_t *a_ledge
     if (a_type == TX_ITEM_TYPE_VOTE)
         return s_vote_delete(a_ledger->net->pub.id, a_tx_in, a_tx_hash);
 
-    log_it(L_ERROR, "Unknown voting type %d fot tx_hash %s", a_type, dap_chain_hash_fast_to_str_static(a_tx_hash));
+    log_it(L_ERROR, "Unknown poll type %d fot tx_hash %s", a_type, dap_chain_hash_fast_to_str_static(a_tx_hash));
     return false;
 }
 
@@ -580,45 +580,28 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply)
 
         dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-question", &l_question_str);
         if (!l_question_str){
-            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_QUESTION_PARAM_MISSING, "Voting requires a question parameter to be valid.");
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_QUESTION_PARAM_MISSING, "Poll requires a question parameter to be valid.");
             return -DAP_CHAIN_NET_VOTE_CREATE_QUESTION_PARAM_MISSING;
         }
-
-        if (strlen(l_question_str) > DAP_CHAIN_DATUM_TX_VOTING_QUESTION_MAX_LENGTH){
-            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_QUESTION_CONTAIN_MAX_CHARACTERS, 
-            "The question must contain no more than %d characters", DAP_CHAIN_DATUM_TX_VOTING_QUESTION_MAX_LENGTH);
-            return -DAP_CHAIN_NET_VOTE_CREATE_QUESTION_CONTAIN_MAX_CHARACTERS;
-        }
-
         dap_list_t *l_options_list = NULL;
         dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-options", &l_options_list_str);
         if (!l_options_list_str){
-            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_OPTION_PARAM_MISSING, "Voting requires a question parameter to be valid.");
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_OPTION_PARAM_MISSING, "Poll requires a question parameter to be valid.");
             return -DAP_CHAIN_NET_VOTE_CREATE_OPTION_PARAM_MISSING;
         }
         // Parse options list
         l_options_list = s_get_options_list_from_str(l_options_list_str);
-        if(!l_options_list || dap_list_length(l_options_list) < 2){
-            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_NUMBER_OPTIONS_ERROR, "Number of options must be 2 or greater.");
-            return -DAP_CHAIN_NET_VOTE_CREATE_NUMBER_OPTIONS_ERROR;
-        }
-
-        if(dap_list_length(l_options_list)>DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT){
-            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CONTAIN_MAX_OPTIONS, 
-            "The voting can contain no more than %d options", DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT);            
-            return -DAP_CHAIN_NET_VOTE_CREATE_CONTAIN_MAX_OPTIONS;
-        }
 
         dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-fee", &l_fee_str);
         if (!l_fee_str){
-            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_FEE_PARAM_NOT_VALID, "Voting requires paramete -fee to be valid.");
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_FEE_PARAM_NOT_VALID, "Poll requires parameter -fee to be valid.");
             return -DAP_CHAIN_NET_VOTE_CREATE_FEE_PARAM_NOT_VALID;
         }
         uint256_t l_value_fee = dap_chain_balance_scan(l_fee_str);
 
         dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-w", &l_wallet_str);
         if (!l_wallet_str){
-            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_WALLET_PARAM_NOT_VALID, "Voting requires parameter -w to be valid.");
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_WALLET_PARAM_NOT_VALID, "Poll requires parameter -w to be valid.");
             return -DAP_CHAIN_NET_VOTE_CREATE_WALLET_PARAM_NOT_VALID;
         }
 
@@ -663,76 +646,64 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply)
         dap_chain_wallet_close(l_wallet_fee);
 
         switch (res) {
-            case DAP_CHAIN_NET_VOTE_CREATE_OK: {
-                json_object* json_obj_inf = json_object_new_object();
-                json_object_object_add(json_obj_inf, "datum_add_successfully", json_object_new_string(l_hash_ret));
-                json_object_array_add(*json_arr_reply, json_obj_inf);
-                DAP_DELETE(l_hash_ret);
-                return DAP_CHAIN_NET_VOTE_CREATE_OK;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_LENGTH_QUESTION_OVERSIZE_MAX: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_LENGTH_QUESTION_OVERSIZE_MAX, "The question must contain no more than %d characters",
-                                                  DAP_CHAIN_DATUM_TX_VOTING_QUESTION_MAX_LENGTH);
-                return DAP_CHAIN_NET_VOTE_CREATE_LENGTH_QUESTION_OVERSIZE_MAX;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX, "The voting can contain no more than %d options",
-                                                  DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT);
-                return DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_FEE_IS_ZERO: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_FEE_IS_ZERO, "The commission amount must be greater than zero");
-                return DAP_CHAIN_NET_VOTE_CREATE_FEE_IS_ZERO;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_SOURCE_ADDRESS_IS_INVALID: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_SOURCE_ADDRESS_IS_INVALID, "source address is invalid");
-                return DAP_CHAIN_NET_VOTE_CREATE_SOURCE_ADDRESS_IS_INVALID;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_NOT_ENOUGH_FUNDS_TO_TRANSFER: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_NOT_ENOUGH_FUNDS_TO_TRANSFER, "Not enough funds to transfer");
-                return DAP_CHAIN_NET_VOTE_CREATE_NOT_ENOUGH_FUNDS_TO_TRANSFER;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_MAX_COUNT_OPTION_EXCEEDED: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_MAX_COUNT_OPTION_EXCEEDED, "The option must contain no more than %d characters",
-                                                  DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_LENGTH);
-                return DAP_CHAIN_NET_VOTE_CREATE_MAX_COUNT_OPTION_EXCEEDED;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_OPTION_TSD_ITEM: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_OPTION_TSD_ITEM, "Can't create voting with expired time");
-                return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_OPTION_TSD_ITEM;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_INPUT_TIME_MORE_CURRENT_TIME: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_INPUT_TIME_MORE_CURRENT_TIME, "Can't create voting with expired time");
-                return DAP_CHAIN_NET_VOTE_CREATE_INPUT_TIME_MORE_CURRENT_TIME;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_EXPIRE_TIME: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_EXPIRE_TIME, "Can't create expired tsd item.");
-                return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_EXPIRE_TIME;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_DELEGATE_KEY: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_DELEGATE_KEY, "Can't create delegated key req tsd item.");
-                return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_DELEGATE_KEY;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_NET_FEE_OUT: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_NET_FEE_OUT, "Can't add net fee out.");
-                return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_NET_FEE_OUT;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_OUT_WITH_VALUE_BACK: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_OUT_WITH_VALUE_BACK, "Can't add out with value back");
-                return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_OUT_WITH_VALUE_BACK;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_SIGNED_TX: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_SIGNED_TX, "Can not sign transaction");
-                return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_SIGNED_TX;
-            } break;
-            case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_POOL_DATUM_IN_MEMPOOL: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_POOL_DATUM_IN_MEMPOOL, "Can not pool transaction in mempool");
-                return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_POOL_DATUM_IN_MEMPOOL;
-            } break;
-            default: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_SRV_VOTING_UNKNOWN_ERR, "Unknown error. Code: %d", res);
-                return -DAP_CHAIN_NET_SRV_VOTING_UNKNOWN_ERR;
-            }
+        case DAP_CHAIN_NET_VOTE_CREATE_OK: {
+            json_object* json_obj_inf = json_object_new_object();
+            json_object_object_add(json_obj_inf, "datum_add_successfully", json_object_new_string(l_hash_ret));
+            json_object_array_add(*json_arr_reply, json_obj_inf);
+            DAP_DELETE(l_hash_ret);
+            return DAP_CHAIN_NET_VOTE_CREATE_OK;
+        }
+        case DAP_CHAIN_NET_VOTE_CREATE_LENGTH_QUESTION_OVERSIZE_MAX:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_LENGTH_QUESTION_OVERSIZE_MAX, "The question must contain no more than %d characters",
+                                              DAP_CHAIN_DATUM_TX_VOTING_QUESTION_MAX_LENGTH);
+            return DAP_CHAIN_NET_VOTE_CREATE_LENGTH_QUESTION_OVERSIZE_MAX;
+        case DAP_CHAIN_NET_VOTE_CREATE_NUMBER_OPTIONS_ERROR:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_NUMBER_OPTIONS_ERROR, "Number of options must be 2 or greater.");
+            return DAP_CHAIN_NET_VOTE_CREATE_NUMBER_OPTIONS_ERROR;
+        case DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX, "The poll can contain no more than %d options",
+                                              DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT);
+            return DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX;
+        case DAP_CHAIN_NET_VOTE_CREATE_FEE_IS_ZERO:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_FEE_IS_ZERO, "The commission amount must be greater than zero");
+            return DAP_CHAIN_NET_VOTE_CREATE_FEE_IS_ZERO;
+        case DAP_CHAIN_NET_VOTE_CREATE_SOURCE_ADDRESS_IS_INVALID:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_SOURCE_ADDRESS_IS_INVALID, "source address is invalid");
+            return DAP_CHAIN_NET_VOTE_CREATE_SOURCE_ADDRESS_IS_INVALID;
+        case DAP_CHAIN_NET_VOTE_CREATE_NOT_ENOUGH_FUNDS_TO_TRANSFER:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_NOT_ENOUGH_FUNDS_TO_TRANSFER, "Not enough funds to transfer");
+            return DAP_CHAIN_NET_VOTE_CREATE_NOT_ENOUGH_FUNDS_TO_TRANSFER;
+        case DAP_CHAIN_NET_VOTE_CREATE_MAX_COUNT_OPTION_EXCEEDED:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_MAX_COUNT_OPTION_EXCEEDED, "The option must contain no more than %d characters",
+                                              DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_LENGTH);
+            return DAP_CHAIN_NET_VOTE_CREATE_MAX_COUNT_OPTION_EXCEEDED;
+        case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_OPTION_TSD_ITEM:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_OPTION_TSD_ITEM, "Can't create poll with expired time");
+            return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_OPTION_TSD_ITEM;
+        case DAP_CHAIN_NET_VOTE_CREATE_INPUT_TIME_MORE_CURRENT_TIME:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_INPUT_TIME_MORE_CURRENT_TIME, "Can't create poll with expired time");
+            return DAP_CHAIN_NET_VOTE_CREATE_INPUT_TIME_MORE_CURRENT_TIME;
+        case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_EXPIRE_TIME:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_EXPIRE_TIME, "Can't create expired tsd item.");
+            return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_EXPIRE_TIME;
+        case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_DELEGATE_KEY:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_DELEGATE_KEY, "Can't create delegated key req tsd item.");
+            return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_CREATE_TSD_DELEGATE_KEY;
+        case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_NET_FEE_OUT:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_NET_FEE_OUT, "Can't add net fee out.");
+            return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_NET_FEE_OUT;
+        case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_OUT_WITH_VALUE_BACK:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_OUT_WITH_VALUE_BACK, "Can't add out with value back");
+            return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_ADD_OUT_WITH_VALUE_BACK;
+        case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_SIGNED_TX:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_SIGNED_TX, "Can not sign transaction");
+            return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_SIGNED_TX;
+        case DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_POOL_DATUM_IN_MEMPOOL:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_POOL_DATUM_IN_MEMPOOL, "Can not pool transaction in mempool");
+            return DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_POOL_DATUM_IN_MEMPOOL;
+        default:
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_SRV_VOTING_UNKNOWN_ERR, "Unknown error. Code: %d", res);
+            return -DAP_CHAIN_NET_SRV_VOTING_UNKNOWN_ERR;
         }
     }break;
     case CMD_VOTE:{
@@ -811,18 +782,18 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply)
                 return DAP_CHAIN_NET_VOTE_CREATE_OK;
             } break;
             case DAP_CHAIN_NET_VOTE_VOTING_CAN_NOT_FIND_VOTE: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_CAN_NOT_FIND_VOTE, "Can't find voting with hash %s", l_hash_str);
+                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_CAN_NOT_FIND_VOTE, "Can't find poll with hash %s", l_hash_str);
             } break;
             case DAP_CHAIN_NET_VOTE_VOTING_THIS_VOTING_HAVE_MAX_VALUE_VOTES: {
                 dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_THIS_VOTING_HAVE_MAX_VALUE_VOTES, 
-                                                  "This voting already received the required number of votes.");
+                                                  "This poll already received the required number of votes.");
             } break;
             case DAP_CHAIN_NET_VOTE_VOTING_ALREADY_EXPIRED: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_ALREADY_EXPIRED, "This voting already expired.");
+                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_ALREADY_EXPIRED, "This poll is already expired.");
             } break;
              case DAP_CHAIN_NET_VOTE_VOTING_CERT_REQUIRED: {
                 dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_CERT_REQUIRED, 
-                                                    "This voting required a delegated key. Parameter -cert must contain a valid certificate name");
+                                                    "This poll required a delegated key. Parameter -cert must contain a valid certificate name");
             } break;
             case DAP_CHAIN_NET_VOTE_VOTING_NO_KEY_FOUND_IN_CERT: {
                 dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_NO_KEY_FOUND_IN_CERT,
@@ -833,7 +804,7 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply)
                 dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_KEY_IS_NOT_DELEGATED, "Your key is not delegated.");
             } break;
             case DAP_CHAIN_NET_VOTE_VOTING_DOES_NOT_ALLOW_CHANGE_YOUR_VOTE: {
-                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_DOES_NOT_ALLOW_CHANGE_YOUR_VOTE, "The voting doesn't allow change your vote.");
+                dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_DOES_NOT_ALLOW_CHANGE_YOUR_VOTE, "The poll doesn't allow change your vote.");
             } break;
             case DAP_CHAIN_NET_VOTE_VOTING_SOURCE_ADDRESS_INVALID: {
                 dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_SOURCE_ADDRESS_INVALID, "source address is invalid");
@@ -878,12 +849,12 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply)
 
     case CMD_LIST: {
         json_object* json_vote_out = json_object_new_object();
-        json_object_object_add(json_vote_out, "list_of_votings", json_object_new_string(l_net->pub.name));
+        json_object_object_add(json_vote_out, "list_of_polls", json_object_new_string(l_net->pub.name));
         json_object* json_arr_voting_out = json_object_new_array();
         struct voting *votings_ht = s_votings_ht_get(l_net->pub.id);
         for (struct voting *it = votings_ht; it; it = it->hh.next) {
             json_object* json_obj_vote = json_object_new_object();
-            json_object_object_add( json_obj_vote, "voting_tx", 
+            json_object_object_add( json_obj_vote, "poll_tx",
                                     json_object_new_string_len(dap_chain_hash_fast_to_str_static(&it->hash), sizeof(dap_hash_str_t)) );            
             json_object_object_add( json_obj_vote, "question", 
                                     json_object_new_string(it->params->question) );
@@ -909,7 +880,7 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply)
         }
         struct voting *l_voting = s_voting_find(l_net->pub.id, &l_voting_hash);
         if(!l_voting){
-            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_DUMP_CAN_NOT_FIND_VOTE, "Can't find voting with hash %s", l_hash_str);
+            dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_DUMP_CAN_NOT_FIND_VOTE, "Can't find poll with hash %s", l_hash_str);
             return -DAP_CHAIN_NET_VOTE_DUMP_CAN_NOT_FIND_VOTE;
         }
 
@@ -935,7 +906,7 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply)
         }
 
         json_object* json_vote_out = json_object_new_object();
-        json_object_object_add(json_vote_out, "voting_tx", json_object_new_string_len(l_hash_str, sizeof(dap_hash_str_t)));
+        json_object_object_add(json_vote_out, "poll_tx", json_object_new_string_len(l_hash_str, sizeof(dap_hash_str_t)));
         json_object_object_add(json_vote_out, "question", json_object_new_string(l_voting->params->question));
         json_object_object_add(json_vote_out, "token", json_object_new_string(l_voting->params->token_ticker));
         if (l_voting->params->voting_expire) {
@@ -962,19 +933,19 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply)
         for (dap_list_t *l_option = l_voting->params->options; l_option; l_option = l_option->next, ++i) {
             json_object* json_vote_obj = json_object_new_object();
             json_object_object_add(json_vote_obj, "option_id", json_object_new_int(i));
-            json_object_object_add( json_vote_obj, "vote_tx", json_object_new_string(l_option->data) );
-            json_object_object_add(json_vote_obj, "voting_power", json_object_new_uint64( l_results[i].num_of_votes) );     
-            int l_percentage = l_votes_count ? (int)((float)l_results[i].num_of_votes/l_votes_count * 100 + 0.5) : 0;
-            json_object_object_add(json_vote_obj, "vote_share", json_object_new_int(l_percentage) );
+            json_object_object_add( json_vote_obj, "option_text", json_object_new_string(l_option->data) );
+            json_object_object_add(json_vote_obj, "votes_count", json_object_new_uint64( l_results[i].num_of_votes) );
+            int l_percentage = l_votes_count ? ((double)(l_results[i].num_of_votes * 100))/l_votes_count + 0.5 : 0;
+            json_object_object_add(json_vote_obj, "votes_percent", json_object_new_int(l_percentage) );
             uint256_t l_weight_percentage = { };
 
             DIV_256_COIN(l_results[i].weights, l_total_weight, &l_weight_percentage);
             MULT_256_COIN(l_weight_percentage, dap_chain_balance_coins_scan("100.0"), &l_weight_percentage);
             const char *l_weight_percentage_str = dap_uint256_decimal_to_round_char(l_weight_percentage, 2, true),
                        *l_w_coins, *l_w_datoshi = dap_uint256_to_char(l_results[i].weights, &l_w_coins);
-            json_object_object_add(json_vote_obj, "vote_sum", json_object_new_string(l_w_coins));
-            json_object_object_add(json_vote_obj, "vote_sum_datoshi", json_object_new_string(l_w_datoshi));
-            json_object_object_add(json_vote_obj, "vote_sum_weight", json_object_new_string(l_weight_percentage_str));
+            json_object_object_add(json_vote_obj, "votes_sum", json_object_new_string(l_w_coins));
+            json_object_object_add(json_vote_obj, "votes_sum_datoshi", json_object_new_string(l_w_datoshi));
+            json_object_object_add(json_vote_obj, "votes_sum_weight", json_object_new_string(l_weight_percentage_str));
             json_object_array_add(json_arr_vote_out, json_vote_obj);
         }
         json_object_object_add(json_vote_out, "results", json_arr_vote_out);
@@ -1001,6 +972,9 @@ int dap_chain_net_srv_voting_create(const char *a_question, dap_list_t *a_option
         return DAP_CHAIN_NET_VOTE_CREATE_LENGTH_QUESTION_OVERSIZE_MAX;
 
     // Parse options list
+    if (!a_options || dap_list_length(a_options) < 2)
+        return -DAP_CHAIN_NET_VOTE_CREATE_NUMBER_OPTIONS_ERROR;
+
     if (dap_list_length(a_options) > DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT)
         return DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX;
 
diff --git a/modules/service/voting/include/dap_chain_net_srv_voting.h b/modules/service/voting/include/dap_chain_net_srv_voting.h
index 1fc6505066be9f82874f33500c10271ea4320178..8bc6f6ef3d00711b12995e16f7900af5b9c785b2 100644
--- a/modules/service/voting/include/dap_chain_net_srv_voting.h
+++ b/modules/service/voting/include/dap_chain_net_srv_voting.h
@@ -75,10 +75,8 @@ enum DAP_CHAIN_NET_SRV_VOTING_CLI_ERRORS {
     DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_SIGNED_TX,
     DAP_CHAIN_NET_VOTE_CREATE_CAN_NOT_POOL_DATUM_IN_MEMPOOL,
     DAP_CHAIN_NET_VOTE_CREATE_QUESTION_PARAM_MISSING,
-    DAP_CHAIN_NET_VOTE_CREATE_QUESTION_CONTAIN_MAX_CHARACTERS,
     DAP_CHAIN_NET_VOTE_CREATE_OPTION_PARAM_MISSING,
     DAP_CHAIN_NET_VOTE_CREATE_NUMBER_OPTIONS_ERROR,
-    DAP_CHAIN_NET_VOTE_CREATE_CONTAIN_MAX_OPTIONS,
     DAP_CHAIN_NET_VOTE_CREATE_FEE_PARAM_NOT_VALID,
     DAP_CHAIN_NET_VOTE_CREATE_WALLET_PARAM_NOT_VALID,
     DAP_CHAIN_NET_VOTE_CREATE_WALLET_DOES_NOT_EXIST,
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index d7fdc8b8a8b06597ce8a4b083bafcdcb3a58c96b..156d5c81b70d522d061ff57f1b17af92c86e84d1 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -392,7 +392,8 @@ static int s_chain_cs_blocks_new(dap_chain_t *a_chain, dap_config_t *a_chain_con
 dap_chain_block_cache_t * dap_chain_block_cache_get_by_hash(dap_chain_cs_blocks_t * a_blocks,  dap_chain_hash_fast_t *a_block_hash)
 {
     dap_chain_block_cache_t * l_ret = NULL;
-    pthread_rwlock_rdlock(& PVT(a_blocks)->rwlock);
+    int err = pthread_rwlock_rdlock(& PVT(a_blocks)->rwlock);
+    assert(!err);
     HASH_FIND(hh, PVT(a_blocks)->blocks,a_block_hash, sizeof (*a_block_hash), l_ret );
     pthread_rwlock_unlock(& PVT(a_blocks)->rwlock);
     return l_ret;
@@ -407,7 +408,8 @@ dap_chain_block_cache_t * dap_chain_block_cache_get_by_hash(dap_chain_cs_blocks_
 dap_chain_block_cache_t * dap_chain_block_cache_get_by_number(dap_chain_cs_blocks_t * a_blocks,  uint64_t a_block_number)
 {
     dap_chain_block_cache_t * l_ret = NULL;
-    pthread_rwlock_rdlock(& PVT(a_blocks)->rwlock);
+    int err = pthread_rwlock_rdlock(& PVT(a_blocks)->rwlock);
+    assert(!err);
     HASH_FIND_BYHASHVALUE(hh2, PVT(a_blocks)->blocks_num, &a_block_number, sizeof (a_block_number), a_block_number, l_ret);
     pthread_rwlock_unlock(& PVT(a_blocks)->rwlock);
     return l_ret;
@@ -1528,8 +1530,9 @@ static int s_callback_delete(dap_chain_t * a_chain)
 {
     s_callback_cs_blocks_purge(a_chain);
     dap_chain_cs_blocks_t * l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain);
-    pthread_rwlock_wrlock(&PVT(l_blocks)->rwlock);
-    if(l_blocks->callback_delete )
+    int err = pthread_rwlock_wrlock(&PVT(l_blocks)->rwlock);
+    assert(!err);
+    if (l_blocks->callback_delete)
         l_blocks->callback_delete(l_blocks);
     pthread_rwlock_unlock(&PVT(l_blocks)->rwlock);
     pthread_rwlock_destroy(&PVT(l_blocks)->rwlock);
@@ -1557,7 +1560,8 @@ static int s_callback_cs_blocks_purge(dap_chain_t *a_chain)
     DAP_DEL_Z(PVT(l_blocks)->forked_branches);
     pthread_rwlock_unlock(&PVT(l_blocks)->forked_branches_rwlock);
 
-    pthread_rwlock_wrlock(&PVT(l_blocks)->rwlock);
+    int err = pthread_rwlock_wrlock(&PVT(l_blocks)->rwlock);
+    assert(!err);
     dap_chain_block_cache_t *l_block = NULL, *l_block_tmp = NULL;
     HASH_ITER(hh, PVT(l_blocks)->blocks, l_block, l_block_tmp) {
         HASH_DEL(PVT(l_blocks)->blocks, l_block);
@@ -1806,7 +1810,8 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da
         }
         debug_if(s_debug_more, L_DEBUG, "... new block %s", l_block_cache->block_hash_str);
 
-        pthread_rwlock_wrlock(& PVT(l_blocks)->rwlock);
+        int err = pthread_rwlock_wrlock(&PVT(l_blocks)->rwlock);
+        assert(!err);
         if (!l_block_cache->is_genesis) {
             dap_chain_block_cache_t *l_last_block = HASH_LAST(PVT(l_blocks)->blocks);
             if (l_last_block && dap_hash_fast_compare(&l_last_block->block_hash, &l_block_prev_hash)){
@@ -1887,6 +1892,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da
             uint8_t *l_generation_meta = dap_chain_block_meta_get(l_block, a_atom_size, DAP_CHAIN_BLOCK_META_GENERATION);
             uint16_t l_generation = l_generation_meta ? *(uint16_t *)l_generation_meta : 0;
             if (l_generation && a_chain->generation < l_generation) {
+                pthread_rwlock_unlock(&PVT(l_blocks)->rwlock);
                 dap_hash_fast_t *l_hardfork_decree_hash = (dap_hash_fast_t *)dap_chain_block_meta_get(l_block, a_atom_size, DAP_CHAIN_BLOCK_META_LINK);
                 if (!l_hardfork_decree_hash) {
                     log_it(L_ERROR, "Can't find hardfork decree hash in candidate block meta");
@@ -1902,6 +1908,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da
                     log_it(L_ERROR, "Can't accept hardfork genesis block %s: error in hardfork data restoring", dap_hash_fast_to_str_static(a_atom_hash));
                     return ATOM_REJECT;
                 }
+                pthread_rwlock_wrlock(&PVT(l_blocks)->rwlock);
             }
             HASH_ADD(hh, PVT(l_blocks)->blocks, block_hash, sizeof(l_block_cache->block_hash), l_block_cache);
             HASH_ADD_BYHASHVALUE(hh2, PVT(l_blocks)->blocks_num, block_number, sizeof(l_block_cache->block_number), l_block_cache->block_number, l_block_cache);
@@ -1945,7 +1952,9 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da
         }
         debug_if(s_debug_more, L_DEBUG, "... new block %s", l_block_cache->block_hash_str);
         dap_chain_block_cache_t *l_prev_bcache = NULL, *l_tmp = NULL;
-        pthread_rwlock_wrlock(& PVT(l_blocks)->rwlock);        log_it(L_INFO, "New fork. Previous block hash %s, current block hash %s", dap_chain_hash_fast_to_str_static(&l_block_prev_hash), 
+        int err = pthread_rwlock_wrlock(&PVT(l_blocks)->rwlock);
+        assert(!err);
+        log_it(L_INFO, "New fork. Previous block hash %s, current block hash %s", dap_chain_hash_fast_to_str_static(&l_block_prev_hash),
                                                                                     l_block_cache->block_hash_str);
         HASH_FIND(hh, PVT(l_blocks)->blocks, &l_block_prev_hash, sizeof(dap_hash_fast_t), l_prev_bcache);
         if (l_prev_bcache){
@@ -2103,8 +2112,9 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t *a_chain,
         if (l_bcache_last && dap_hash_fast_compare(&l_bcache_last->block_hash, &l_block_prev_hash))
             ret = ATOM_ACCEPT;
         else { // search block and previous block in forked branch
-            pthread_rwlock_rdlock(& PVT(l_blocks)->rwlock);
-            for (size_t i = 0; i < PVT(l_blocks)->forked_br_cnt; i++){
+            int err = pthread_rwlock_rdlock(&PVT(l_blocks)->rwlock);
+            assert(!err);
+            for (size_t i = 0; i < PVT(l_blocks)->forked_br_cnt; i++) {
                 dap_chain_block_forked_branch_t *l_cur_branch = PVT(l_blocks)->forked_branches[i];
                 dap_chain_block_forked_branch_atoms_table_t *l_item = NULL;
                 // Check block already present in forked branch
@@ -2219,7 +2229,8 @@ static dap_chain_atom_ptr_t s_callback_atom_iter_get_by_num(dap_chain_atom_iter_
     assert(a_atom_iter);
     dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_atom_iter->chain);
     dap_chain_block_cache_t *l_block_cache = NULL;
-    pthread_rwlock_rdlock(&PVT(l_blocks)->rwlock);
+    int err = pthread_rwlock_rdlock(&PVT(l_blocks)->rwlock);
+    assert(!err);
     for (l_block_cache = PVT(l_blocks)->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next)
         if (l_block_cache->block_number == a_atom_num)
             break;
@@ -2426,7 +2437,8 @@ static dap_chain_atom_ptr_t s_callback_atom_iter_get(dap_chain_atom_iter_t *a_at
         log_it(L_ERROR, "l_blocks_pvt is NULL");
         return NULL;
     }
-    pthread_rwlock_rdlock(&l_blocks_pvt->rwlock);
+    int err = pthread_rwlock_rdlock(&l_blocks_pvt->rwlock);
+    assert(!err);
     switch (a_operation) {
     case DAP_CHAIN_ITER_OP_FIRST:
         a_atom_iter->cur_item = l_blocks_pvt->blocks;
@@ -2598,7 +2610,8 @@ static dap_chain_block_t *s_new_block_move(dap_chain_cs_blocks_t *a_blocks, size
     size_t l_ret_size = 0;
     dap_chain_block_t *l_ret = NULL;
     dap_chain_cs_blocks_pvt_t *l_blocks_pvt = PVT(a_blocks);
-    pthread_rwlock_wrlock(&l_blocks_pvt->rwlock);
+    int err = pthread_rwlock_wrlock(&l_blocks_pvt->rwlock);
+    assert(!err);
     if ( a_blocks->block_new ) {
         l_ret = a_blocks->block_new;
         l_ret_size = a_blocks->block_new_size;
@@ -2625,7 +2638,8 @@ static size_t s_callback_add_datums(dap_chain_t *a_chain, dap_chain_datum_t **a_
     // dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id);
 
     size_t l_datum_processed = 0;
-    pthread_rwlock_wrlock(&l_blocks_pvt->rwlock);
+    int err = pthread_rwlock_wrlock(&l_blocks_pvt->rwlock);
+    assert(!err);
 #ifdef DAP_TPS_TEST
     log_it(L_TPS, "Start tps %zu datums add", a_datums_count);
 #endif
@@ -2636,8 +2650,8 @@ static size_t s_callback_add_datums(dap_chain_t *a_chain, dap_chain_datum_t **a_
             log_it(L_WARNING, "Empty datum"); /* How might it be? */
             continue;
         }
-        if (l_blocks->block_new_size + l_datum_size > DAP_CHAIN_ATOM_MAX_SIZE) {
-            log_it(L_DEBUG, "Maximum size exeeded, %zu > %d", l_blocks->block_new_size + l_datum_size, DAP_CHAIN_ATOM_MAX_SIZE);
+        if (l_blocks->block_new_size + l_datum_size > DAP_CHAIN_CANDIDATE_MAX_SIZE) {
+            log_it(L_DEBUG, "Maximum size exeeded, %zu > %d", l_blocks->block_new_size + l_datum_size, DAP_CHAIN_CANDIDATE_MAX_SIZE);
             break;
         }
         if (!l_blocks->block_new) {
@@ -2684,7 +2698,8 @@ static dap_list_t *s_callback_get_atoms(dap_chain_t *a_chain, size_t a_count, si
 {
     dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain);
     dap_chain_cs_blocks_pvt_t *l_blocks_pvt = PVT(l_blocks);
-    pthread_rwlock_rdlock(&PVT(l_blocks)->rwlock);
+    int err = pthread_rwlock_rdlock(&PVT(l_blocks)->rwlock);
+    assert(!err);
     if (!l_blocks_pvt->blocks) {
         pthread_rwlock_unlock(&PVT(l_blocks)->rwlock);
         return NULL;
diff --git a/modules/type/blocks/include/dap_chain_block.h b/modules/type/blocks/include/dap_chain_block.h
index c21e531057a10b39334f2337f4cd5476d05d3fdb..755a6aaf4cdb5ef89830b216de492bb031462dce 100644
--- a/modules/type/blocks/include/dap_chain_block.h
+++ b/modules/type/blocks/include/dap_chain_block.h
@@ -24,12 +24,18 @@
 #include "dap_common.h"
 #include "dap_time.h"
 #include "dap_hash.h"
+#include "dap_chain.h"
 #include "dap_chain_common.h"
 #include "dap_chain_datum.h"
 
 #define DAP_CHAIN_BLOCK_SIGNATURE 0xDA05BF8E
 #define DAP_CHAIN_BLOCK_ID_SIZE 4
 
+#define DAP_CHAIN_CANDIDATE_SIGNS_MAX_SIZE  (256 * 1024)
+#if (DAP_CHAIN_CANDIDATE_SIGNS_MAX_SIZE >= DAP_CHAIN_ATOM_MAX_SIZE)
+#error DAP_CHAIN_ATOM_MAX_SIZE should be greater than DAP_CHAIN_CANDIDATE_SIGNS_MAX_SIZE
+#endif
+#define DAP_CHAIN_CANDIDATE_MAX_SIZE (DAP_CHAIN_ATOM_MAX_SIZE - DAP_CHAIN_CANDIDATE_SIGNS_MAX_SIZE)
 
 typedef union dap_chain_block_typeid{
     uint8_t data[DAP_CHAIN_BLOCK_ID_SIZE];