diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
index 6ed2566fe569a1f40d80a6afeabb1ceea50c78ed..b82359d4da3e4d1ef756b44780ecc0fd4dfbfd30 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -432,11 +432,18 @@ static void s_poa_round_check_callback_round_clean(dap_global_db_context_t *a_gl
             uint64_t l_time_diff = dap_nanotime_now() - l_event_round_item->round_info.ts_update;
             uint64_t l_timeuot = dap_nanotime_from_sec(l_poa_pvt->confirmations_timeout + l_poa_pvt->wait_sync_before_complete + 10);
             uint64_t l_round_id = ((dap_chain_cs_dag_event_t *)l_event_round_item->event_n_signs)->header.round_id;
-            if (((int64_t)l_time_diff > 0 && l_time_diff > l_timeuot) ||
-                    l_round_id <= l_dag->round_completed) {
+            if (((int64_t)l_time_diff > 0 && l_time_diff > l_timeuot) || l_round_id <= l_dag->round_completed) {
+                pthread_rwlock_rdlock(&l_poa_pvt->rounds_rwlock);
+                struct round_timer_arg *l_arg = NULL;
+                HASH_FIND(hh, l_poa_pvt->active_rounds, &l_round_id, sizeof(uint64_t), l_arg);
+                pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
+                if (l_arg) {
+                    log_it(L_INFO, "Event %s is from currently active round [id %llu]", a_values[i].key, l_round_id);
+                    continue;
+                }
                 dap_global_db_del_unsafe(a_global_db_context, a_group, a_values[i].key);
                 log_it(L_DEBUG, "DAG-PoA: Remove event %s from round %"DAP_UINT64_FORMAT_U" %s.",
-                                a_values[i].key, l_round_id, l_time_diff > l_timeuot ? "by timer" : "owing to round completion");
+                       a_values[i].key, l_round_id, l_time_diff > l_timeuot ? "by timer" : "owing to round completion");
             }
         }
     }
@@ -500,11 +507,12 @@ static dap_chain_cs_dag_event_round_item_t *s_round_event_choose_dup(dap_list_t
         return NULL;
     dap_list_t *l_dups = dap_list_copy(a_dups);
     uint64_t l_min_ts_update = (uint64_t)-1;
-    byte_t l_event_mem_region[DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE],
-           l_winner_mem_region[DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE] = {};
+    byte_t l_event_mem_region[DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE] = { },
+           l_winner_mem_region[DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE] = { };
     enum dap_chain_poa_round_filter_stage l_stage = DAP_CHAIN_POA_ROUND_FILTER_STAGE_START;
     while (l_stage++ < DAP_CHAIN_POA_ROUND_FILTER_STAGE_MAX) {
-        for (dap_list_t *it = l_dups; it; it = it->next) {
+        dap_list_t *it, *tmp;
+        for (it = l_dups, tmp = l_dups ? l_dups->next : NULL; it; it = tmp, tmp = tmp ? tmp->next : NULL) {
             l_round_item = (dap_chain_cs_dag_event_round_item_t *)it->data;
             l_event = (dap_chain_cs_dag_event_t *)l_round_item->event_n_signs;
             switch (l_stage) {
@@ -519,13 +527,13 @@ static dap_chain_cs_dag_event_round_item_t *s_round_event_choose_dup(dap_list_t
                     l_dups = dap_list_remove_link(l_dups, it);
                 else {
                     s_event_get_unique_mem_region(l_round_item, l_event_mem_region);
-                    if (memcmp(&l_winner_mem_region, &l_event_mem_region, DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE) > 0)
+                    if (memcmp(l_winner_mem_region, l_event_mem_region, DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE))
                         memcpy(l_winner_mem_region, l_event_mem_region, DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE);
                 }
                 break;
             case DAP_CHAIN_POA_ROUND_FILTER_STAGE_MEM:
                 s_event_get_unique_mem_region(l_round_item, l_event_mem_region);
-                if (memcmp(&l_winner_mem_region, &l_event_mem_region, DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE))
+                if (memcmp(l_winner_mem_region, l_event_mem_region, DAP_CHAIN_POA_ROUND_FILTER_MEM_SIZE))
                     l_dups = dap_list_remove_link(l_dups, it);
             default: break;
             }
@@ -566,7 +574,12 @@ static void s_callback_round_event_to_chain_callback_get_round_item(dap_global_d
         return;
     struct round_timer_arg *l_arg = (struct round_timer_arg *)a_arg;
     dap_chain_cs_dag_t *l_dag = l_arg->dag;
+    uint64_t l_round_id = l_arg->round_id;
     dap_chain_cs_dag_poa_pvt_t *l_poa_pvt = PVT(DAP_CHAIN_CS_DAG_POA(l_dag));
+    pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock);
+    HASH_DEL(l_poa_pvt->active_rounds, l_arg);
+    pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
+    DAP_DELETE(a_arg);
     size_t l_events_round_size = a_values_count;
     dap_store_obj_t *l_events_round = a_values;
     uint16_t l_max_signs_count = 0;
@@ -574,7 +587,7 @@ static void s_callback_round_event_to_chain_callback_get_round_item(dap_global_d
     for (size_t l_index = 0; l_index < l_events_round_size; l_index++) {
         dap_chain_cs_dag_event_round_item_t *l_round_item = (dap_chain_cs_dag_event_round_item_t *)l_events_round[l_index].value;
         dap_chain_cs_dag_event_t *l_event = (dap_chain_cs_dag_event_t *)l_round_item->event_n_signs;
-        if (l_event->header.round_id == l_arg->round_id &&
+        if (l_event->header.round_id == l_round_id &&
                 l_round_item->round_info.reject_count < l_poa_pvt->auth_certs_count_verify) {
             l_dups_list = dap_list_append(l_dups_list, l_round_item);
             if (l_event->header.signs_count > l_max_signs_count)
@@ -588,33 +601,30 @@ static void s_callback_round_event_to_chain_callback_get_round_item(dap_global_d
         char *l_event_hash_hex_str;
         dap_get_data_hash_str_static(l_new_atom, l_event_size, l_event_hash_hex_str);
         dap_chain_datum_t *l_datum = dap_chain_cs_dag_event_get_datum(l_new_atom, l_event_size);
+        l_dag->round_completed = l_new_atom->header.round_id ? l_new_atom->header.round_id : l_dag->round_completed + 1;
         int l_verify_datum = dap_chain_net_verify_datum_for_add(l_dag->chain, l_datum, &l_chosen_item->round_info.datum_hash);
         if (!l_verify_datum) {
             dap_chain_atom_verify_res_t l_res = l_dag->chain->callback_atom_add(l_dag->chain, l_new_atom, l_event_size);
             if (l_res == ATOM_ACCEPT) {
                 dap_chain_atom_save(l_dag->chain, (dap_chain_atom_ptr_t)l_new_atom, l_event_size, l_dag->chain->cells->id);
-                pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock);
-                HASH_DEL(l_poa_pvt->active_rounds, l_arg);
-                pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
                 s_poa_round_clean(l_dag->chain);
             } else if (l_res != ATOM_MOVE_TO_THRESHOLD)
                 DAP_DELETE(l_new_atom);
-            if (!l_new_atom->header.round_id)
-                l_dag->round_completed++;
             log_it(L_INFO, "Event %s from round %"DAP_UINT64_FORMAT_U" %s",
-                   l_event_hash_hex_str, l_arg->round_id, dap_chain_atom_verify_res_str[l_res]);
+                   l_event_hash_hex_str, l_round_id, dap_chain_atom_verify_res_str[l_res]);
         } else {
             DAP_DELETE(l_new_atom);
             char l_datum_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE];
             dap_chain_hash_fast_to_str(&l_chosen_item->round_info.datum_hash, l_datum_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
             log_it(L_INFO, "Event %s from round %"DAP_UINT64_FORMAT_U" not added into chain, because the inner datum %s doesn't pass verification (%s)",
-                   l_event_hash_hex_str, l_arg->round_id, l_datum_hash_str, dap_chain_net_verify_datum_err_code_to_str(l_datum, l_verify_datum));
+                   l_event_hash_hex_str, l_round_id, l_datum_hash_str, dap_chain_net_verify_datum_err_code_to_str(l_datum, l_verify_datum));
         }
     } else { /* !l_chosen_item */
-        log_it(L_WARNING, "No candidates for round id %"DAP_UINT64_FORMAT_U, l_arg->round_id);
+        l_dag->round_completed++;
+        log_it(L_WARNING, "No candidates for round id %"DAP_UINT64_FORMAT_U, l_round_id);
+
     }
     dap_list_free(l_dups_list);
-    DAP_DELETE(a_arg);
 }
 
 /**
@@ -634,32 +644,32 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, uint64_t a_round_i
 {
     dap_chain_cs_dag_poa_t *l_poa = DAP_CHAIN_CS_DAG_POA(a_dag);
     dap_chain_cs_dag_poa_pvt_t *l_poa_pvt = PVT(l_poa);
-    struct round_timer_arg *l_callback_arg;
-    pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock);
+    struct round_timer_arg *l_callback_arg = NULL;
+    pthread_rwlock_rdlock(&l_poa_pvt->rounds_rwlock);
     HASH_FIND(hh, l_poa_pvt->active_rounds, &a_round_id, sizeof(uint64_t), l_callback_arg);
-    if (l_callback_arg) {
-        pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
-        return;
-    }
-    l_callback_arg = DAP_NEW_Z(struct round_timer_arg);
+    pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
     if (!l_callback_arg) {
-        log_it(L_ERROR, "Memory allocation error in s_round_event_cs_done");
-        pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
-        return;
-    }
-    l_callback_arg->dag = a_dag;
-    l_callback_arg->round_id = a_round_id;
-    // placement in chain by timer
-    if (dap_timerfd_start(PVT(l_poa)->confirmations_timeout * 1000,
-                          (dap_timerfd_callback_t)s_callback_round_event_to_chain,
-                          l_callback_arg) == NULL) {
-        log_it(L_ERROR,"Can't run timer for round ID %"DAP_UINT64_FORMAT_U, a_round_id);
+        l_callback_arg = DAP_NEW_Z(struct round_timer_arg);
+        if (!l_callback_arg) {
+            log_it(L_ERROR, "Memory allocation error in s_round_event_cs_done");
+            return;
+        }
+        l_callback_arg->dag = a_dag;
+        l_callback_arg->round_id = a_round_id;
+        // placement in chain by timer
+        pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock);
+        HASH_ADD(hh, l_poa_pvt->active_rounds, round_id, sizeof(uint64_t), l_callback_arg);
         pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
-        return;
+        if (!dap_timerfd_start(PVT(l_poa)->confirmations_timeout * 1000, (dap_timerfd_callback_t)s_callback_round_event_to_chain, l_callback_arg)) {
+            pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock);
+            HASH_DEL(l_poa_pvt->active_rounds, l_callback_arg);
+            pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
+            DAP_DELETE(l_callback_arg);
+            log_it(L_ERROR,"Can't run timer for round ID %"DAP_UINT64_FORMAT_U, a_round_id);
+            return;
+        }
+        log_it(L_NOTICE,"Run timer for %d sec for round ID %"DAP_UINT64_FORMAT_U, PVT(l_poa)->confirmations_timeout, a_round_id);
     }
-    log_it(L_NOTICE,"Run timer for %d sec for round ID %"DAP_UINT64_FORMAT_U, PVT(l_poa)->confirmations_timeout, a_round_id);
-    HASH_ADD(hh, l_poa_pvt->active_rounds, round_id, sizeof(uint64_t), l_callback_arg);
-    pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
 }
 
 /**
@@ -686,10 +696,10 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c
     dap_chain_node_role_t l_role = dap_chain_net_get_role(l_cur_net);
     if (l_role.enums == NODE_ROLE_ROOT_MASTER || l_role.enums == NODE_ROLE_ROOT) {
         l_dag->callback_cs_event_round_sync = s_callback_event_round_sync;
-        if (l_dag->round_completed >= l_dag->round_current) {
+        log_it(L_MSG, "Round complete ID %llu, current ID %llu", l_dag->round_completed, l_dag->round_current);
+        if (l_dag->round_completed > l_dag->round_current) {
             l_dag->round_completed = l_dag->round_current;
-            if (l_dag->round_completed)
-                l_dag->round_completed--;
+            l_dag->round_current = l_dag->round_completed + 1;
         }
     }
     return 0;
@@ -792,7 +802,8 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_
         HASH_FIND(hh, l_poa_pvt->active_rounds, &l_round_id, sizeof(uint64_t), l_round_active);
         pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
         if (!l_round_active) {
-            log_it(L_DEBUG, "DAG event came from too old round so won't be processed");
+            log_it(L_DEBUG, "DAG event came from too old round [last complete id %llu > %llu], skip it",
+                   a_dag->round_completed, l_event->header.round_id);
             DAP_DELETE(l_event);
             return -2;
         }
diff --git a/modules/type/blocks/dap_chain_block_cache.c b/modules/type/blocks/dap_chain_block_cache.c
index 1182d280d8ede50973d10f586062b3db49255736..9f3bb5fd1db6132ff7a3056a76240d13957baf9c 100644
--- a/modules/type/blocks/dap_chain_block_cache.c
+++ b/modules/type/blocks/dap_chain_block_cache.c
@@ -86,13 +86,12 @@ dap_chain_block_cache_t *dap_chain_block_cache_new(dap_chain_cs_blocks_t *a_bloc
  */
 dap_chain_block_cache_t * dap_chain_block_cache_dup(dap_chain_block_cache_t * a_block)
 {
-    dap_chain_block_cache_t * l_ret = DAP_NEW_Z(dap_chain_block_cache_t);
+    dap_chain_block_cache_t *l_ret = DAP_DUP(a_block);
     if (!l_ret) {
         log_it(L_ERROR, "Memory allocation error in dap_chain_block_cache_dup");
         return NULL;
     }
-    memcpy(l_ret,a_block, sizeof (*a_block));
-    memset(&l_ret->hh,0, sizeof (l_ret->hh)); // Drop hash handle to prevent its usage
+    l_ret->hh = (UT_hash_handle){ }; // Drop hash handle to prevent its usage
     return l_ret;
 }
 
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index f113ca6fa37658a60fa9ce8103bfb915bf2bf374..f064e072848396ea006ca67501b062fbc15b9995 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -87,7 +87,6 @@ typedef struct dap_chain_cs_dag_pvt {
 } dap_chain_cs_dag_pvt_t;
 
 #define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt )
-#define DAG_ROUND_CURRENT_KEY "round_current"
 
 static void s_dap_chain_cs_dag_purge(dap_chain_t *a_chain);
 static void s_dap_chain_cs_dag_threshold_free(dap_chain_cs_dag_t *a_dag);
@@ -329,6 +328,7 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     byte_t *l_current_round = dap_global_db_get_sync(l_dag->gdb_group_events_round_new, DAG_ROUND_CURRENT_KEY, NULL, NULL, NULL);
     l_dag->round_current = l_current_round ? *(uint64_t*)l_current_round : 0;
     DAP_DELETE(l_current_round);
+    debug_if(s_debug_more, L_INFO, "Current round id %llu", l_dag->round_current);
     dap_global_db_get_all_raw(l_dag->gdb_group_events_round_new, 0, 0, s_dag_rounds_events_iter, l_dag);
     PVT(l_dag)->mempool_timer = dap_interval_timer_create(15000, s_timer_process_callback, a_chain);
     PVT(l_dag)->events_treshold = NULL;
@@ -543,9 +543,6 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
         break;
     }
 
-    if (l_event->header.round_id && l_event->header.round_id < UINT_MAX)
-        l_dag->round_completed = l_event->header.round_id;
-
     switch (ret) {
     case ATOM_MOVE_TO_THRESHOLD:
         pthread_mutex_lock(l_events_mutex);
@@ -709,9 +706,9 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_da
      * No additional conditions required.
     */
     byte_t *l_current_round = dap_global_db_get_sync(DAG_ROUND_CURRENT_KEY, l_dag->gdb_group_events_round_new, NULL, NULL, NULL);
-    uint64_t l_round_current = MAX(l_current_round ? *(uint64_t*)l_current_round : 0, l_dag->round_completed);
+    uint64_t l_round_current = MAX(l_current_round ? *(uint64_t*)l_current_round : 0, l_dag->round_completed) + 1;
     DAP_DELETE(l_current_round);
-    l_dag->round_current = ++l_round_current; /* it's an atomic_store */
+    l_dag->round_current = l_round_current; /* it's an atomic_store */
     uint64_t l_event_size = 0;
     dap_chain_cs_dag_event_t * l_event = l_dag->callback_cs_event_create
             ? l_dag->callback_cs_event_create(l_dag, a_datum, l_hashes, l_hashes_linked, &l_event_size)
@@ -739,9 +736,9 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_da
     dap_get_data_hash_str_static(l_event, l_event_size, l_event_hash_str);
     bool l_res = dap_chain_cs_dag_event_gdb_set(l_dag, l_event_hash_str, l_event, l_event_size, &l_round_item);
     log_it(l_res ? L_INFO : L_ERROR,
-           l_res ? "Event %s placed in the new forming round"
-                 : "Can't add new event [%s] to the new events round",
-           l_event_hash_str);
+           l_res ? "Event %s placed in the new forming round [id %llu]"
+                 : "Can't add new event [%s] to the new events round [id %llu]",
+           l_event_hash_str, l_round_current);
     return l_res;
 }