diff --git a/dap-sdk b/dap-sdk
index a0124f4519ba7b9bf80c1506ac337fbddffe400c..6c41c1c308b8247f172b77dc4656d0f3eecf38e0 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit a0124f4519ba7b9bf80c1506ac337fbddffe400c
+Subproject commit 6c41c1c308b8247f172b77dc4656d0f3eecf38e0
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index d6a4bc90f10f19ac6562f80c1e524993ff826df3..de71478d2d94a92dc45d6e8c6de7cff24b763367 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -24,7 +24,7 @@
  */
 
 #include "dap_common.h"
-
+#include <dirent.h>
 #ifdef _WIN32
 #include <winsock2.h>
 #include <windows.h>
@@ -57,6 +57,7 @@
 #include "json_object.h"
 #include "dap_notify_srv.h"
 
+
 #define LOG_TAG "dap_chain_ledger"
 
 typedef struct dap_chain_ledger_verificator {
@@ -323,6 +324,12 @@ typedef struct dap_ledger_private {
 } dap_ledger_private_t;
 #define PVT(a) ( (dap_ledger_private_t* ) a->_internal )
 
+typedef struct dap_ledger_hal_item {
+    dap_chain_hash_fast_t hash;
+    UT_hash_handle hh;
+} dap_ledger_hal_item_t;
+
+static dap_ledger_hal_item_t *s_hal_items = NULL;
 
 static  dap_chain_ledger_tx_item_t* tx_item_find_by_addr(dap_ledger_t *a_ledger,
         const dap_chain_addr_t *a_addr, const char * a_token, dap_chain_hash_fast_t *a_tx_first_hash);
@@ -2479,6 +2486,36 @@ dap_ledger_t *dap_chain_ledger_create(uint16_t a_flags, char *a_net_name, const
     pthread_cond_init(&l_ledger_pvt->load_cond, NULL);
     pthread_mutex_init(&l_ledger_pvt->load_mutex, NULL);
 
+    char * l_chains_path = dap_strdup_printf("%s/network/%s", dap_config_path(), a_net_name);
+    DIR * l_chains_dir = opendir(l_chains_path);
+    DAP_DEL_Z(l_chains_path);
+
+    struct dirent * l_dir_entry;
+    uint8_t i = 0;
+    while ( (l_dir_entry = readdir(l_chains_dir) )!= NULL ){
+        if (l_dir_entry->d_name[0] == '\0')
+            continue;
+        char * l_entry_name = dap_strdup(l_dir_entry->d_name);
+        if (strlen(l_entry_name) > 4) {
+            if ( strncmp (l_entry_name + strlen(l_entry_name)-4,".cfg",4) == 0 ) { // its .cfg file
+                l_entry_name [strlen(l_entry_name)-4] = 0;
+                log_it(L_DEBUG,"Open chain config \"%s\"...",l_entry_name);
+                l_chains_path = dap_strdup_printf("network/%s/%s", a_net_name, l_entry_name);
+                dap_config_t * l_cfg = dap_config_open(l_chains_path);
+                uint16_t l_whitelist_size;
+                char **l_whitelist = dap_config_get_array_str(l_cfg, "ledger", "hard_accept_list", &l_whitelist_size);
+                for (uint16_t i = 0; i < l_whitelist_size; ++i) {
+                    dap_ledger_hal_item_t *l_hal_item = DAP_NEW_Z(dap_ledger_hal_item_t);
+                    dap_chain_hash_fast_from_str(l_whitelist[i], &l_hal_item->hash);
+                    HASH_ADD(hh, s_hal_items, hash, sizeof(l_hal_item->hash), l_hal_item);
+                }
+                dap_config_close(l_cfg);
+                log_it(L_DEBUG, "HAL items count for chain %s : %d", l_entry_name, l_whitelist_size);
+            }
+        }
+        DAP_DELETE (l_entry_name);
+    }
+    closedir(l_chains_dir);
 
     log_it(L_DEBUG,"Created ledger \"%s\"",a_net_name);
     l_ledger_pvt->load_mode = true;
@@ -2550,6 +2587,18 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_
     }
     if (l_ret || !PVT(a_ledger)->check_token_emission)
         return l_ret;
+
+    if (s_hal_items) {
+        dap_ledger_hal_item_t *l_hash_found = NULL;
+        HASH_FIND(hh, s_hal_items, a_emission_hash, sizeof(*a_emission_hash), l_hash_found);
+        if (l_hash_found) {
+            char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' };
+            dap_chain_hash_fast_to_str(a_emission_hash, l_hash_str, sizeof(l_hash_str));
+            debug_if(s_debug_more, L_MSG, "Event %s is whitelisted", l_hash_str);
+            return l_ret;
+        }
+    }
+
     // Check emission correctness
     size_t l_emission_size = a_token_emission_size;
     dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_token_emission, &l_emission_size);
@@ -2634,6 +2683,9 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_
                         DAP_DELETE(l_balance);
                     }
                     l_ret = DAP_CHAIN_LEDGER_EMISSION_ADD_CHECK_NOT_ENOUGH_VALID_SIGNS;
+                    char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' };
+                    dap_chain_hash_fast_to_str(a_emission_hash, l_hash_str, sizeof(l_hash_str));
+                    log_it(L_MSG, "!!! Datum hash for HAL: %s", l_hash_str);
                 }
             }else{
                 if(s_debug_more)
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 1e566122d1cc0980150664a0c2c5c28d7168d200..28876785406260cf4600542ae481ce8a54e05315 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -884,11 +884,16 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_
         }
         a_event->header.signs_count = l_event_signs_count;
         DAP_DELETE(l_signs);
-        if ( l_ret != 0 ) {
-            return l_ret;
+        if (l_signs_verified_count < l_certs_count_verify) {
+            dap_hash_fast_t l_event_hash;
+            dap_hash_fast(a_event, a_event_size, &l_event_hash);
+            char l_event_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE];
+            dap_hash_fast_to_str(&l_event_hash, l_event_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
+            log_it(L_ERROR, "Corrupted event %s, not enough signs %hu from %hu",
+                            l_event_hash_str, l_signs_verified_count, l_certs_count_verify);
+            return l_ret ? l_ret : -4;
         }
-        return l_signs_verified_count >= l_certs_count_verify ? 0 : -1;
-
+        return 0;
     }
     else if (a_event->header.hash_count == 0){
         dap_chain_hash_fast_t l_event_hash;
diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index 0aed4c3421cbc984f255a34159ef2533bb57a7c3..83e52504dece8861cc54e57557788ff89de2e3a1 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -2433,7 +2433,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl
     /*if (a_block->hdr.meta_n_datum_n_signs_size != a_block_size - sizeof(a_block->hdr)) {
         log_it(L_WARNING, "Incorrect size with block %p on chain %s", a_block, a_blocks->chain->name);
         return -8;
-    }*/
+    }*/ // TODO Retunn it after hard-fork with correct block sizes
 
     if (l_esbocs->session && l_esbocs->session->processing_candidate == a_block)
         // It's a block candidate, don't check signs
@@ -2460,6 +2460,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl
     uint16_t l_signs_verified_count = 0;
     size_t l_block_excl_sign_size = dap_chain_block_get_sign_offset(a_block, a_block_size) + sizeof(a_block->hdr);
     // Get the header on signing operation time
+    size_t l_block_original = a_block->hdr.meta_n_datum_n_signs_size;
     a_block->hdr.meta_n_datum_n_signs_size = l_block_excl_sign_size - sizeof(a_block->hdr);
     for (size_t i=0; i< l_signs_count; i++) {
         dap_sign_t *l_sign = (dap_sign_t *)l_signs[i];
@@ -2493,7 +2494,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl
     }
     DAP_DELETE(l_signs);
     // Restore the original header
-    a_block->hdr.meta_n_datum_n_signs_size = a_block_size - sizeof(a_block->hdr);
+    a_block->hdr.meta_n_datum_n_signs_size = l_block_original;
 
     if (l_signs_verified_count < l_esbocs_pvt->min_validators_count) {
         dap_hash_fast_t l_block_hash;
@@ -2502,7 +2503,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl
         dap_hash_fast_to_str(&l_block_hash, l_block_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
         log_it(L_ERROR, "Corrupted block %s: not enough authorized signs: %u of %u",
                     l_block_hash_str, l_signs_verified_count, l_esbocs_pvt->min_validators_count);
-        return 0; //l_ret
+        return l_ret ? l_ret : -4;
     }
     return 0;
 }
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index 7e69c6ecd1e5be79a30b5c18e229033af6087785..36a723f9e35034c6f741b7e2624591f95c417e80 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -47,6 +47,11 @@ typedef struct dap_chain_block_datum_index {
     UT_hash_handle hh;
 } dap_chain_block_datum_index_t;
 
+struct cs_blocks_hal_item {
+    dap_chain_hash_fast_t hash;
+    UT_hash_handle hh;
+};
+
 typedef struct dap_chain_cs_blocks_pvt
 {
     pthread_rwlock_t rwlock;
@@ -78,6 +83,7 @@ typedef struct dap_chain_cs_blocks_pvt
     pthread_rwlock_t datums_lock;
     uint64_t fill_timeout;
 
+    struct cs_blocks_hal_item *hal;
 } dap_chain_cs_blocks_pvt_t;
 
 #define PVT(a) ((dap_chain_cs_blocks_pvt_t *)(a)->_pvt )
@@ -276,6 +282,21 @@ int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config
     l_cs_blocks_pvt->fill_timeout = dap_config_get_item_uint64_default(a_chain_config, "blocks", "fill_timeout", 60) * 1000; // 1 min
     l_cs_blocks_pvt->blocks_count = 0;
 
+    uint16_t l_list_len = 0;
+    char **l_hard_accept_list = dap_config_get_array_str(a_chain_config, "blocks", "hard_accept_list", &l_list_len);
+    log_it(L_MSG, "HAL for blocks contains %d whitelisted events", l_list_len);
+    for (uint16_t i = 0; i < l_list_len; i++) {
+        struct cs_blocks_hal_item *l_hal_item = DAP_NEW_Z(struct cs_blocks_hal_item);
+        if (!l_hal_item){
+            log_it(L_ERROR, "Memory allocation error in dap_chain_cs_dag_new");
+            DAP_DEL_Z(l_cs_blocks_pvt);
+            DAP_DELETE(l_cs_blocks);
+            return -10;
+        }
+        dap_chain_hash_fast_from_str(l_hard_accept_list[i], &l_hal_item->hash);
+        HASH_ADD(hh, l_cs_blocks_pvt->hal, hash, sizeof(l_hal_item->hash), l_hal_item);
+    }
+
     return 0;
 }
 
@@ -1101,11 +1122,23 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t * a_chain,
     dap_chain_cs_blocks_pvt_t * l_blocks_pvt = PVT(l_blocks);
     assert(l_blocks_pvt);
     dap_chain_block_t * l_block = (dap_chain_block_t *) a_atom;
+    dap_chain_hash_fast_t l_block_hash;
 
     if(sizeof (l_block->hdr) >= a_atom_size){
         log_it(L_WARNING,"Size of block is %zd that is equal or less then block's header size %zd",a_atom_size,sizeof (l_block->hdr));
         return  ATOM_REJECT;
     }
+
+    // Hard accept list
+    if (l_blocks_pvt->hal) {
+        dap_hash_fast(l_block, a_atom_size, &l_block_hash);
+        struct cs_blocks_hal_item *l_hash_found = NULL;
+        HASH_FIND(hh, l_blocks_pvt->hal, &l_block_hash, sizeof(l_block_hash), l_hash_found);
+        if (l_hash_found) {
+            return ATOM_ACCEPT;
+        }
+    }
+
     size_t l_meta_count = 0;
     dap_chain_block_meta_t ** l_meta=  dap_chain_block_get_meta(l_block, a_atom_size, & l_meta_count);
     // Parse metadata
@@ -1114,7 +1147,6 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t * a_chain,
     dap_chain_hash_fast_t l_block_anchor_hash = {0};
     uint64_t l_nonce = 0;
     uint64_t l_nonce2 = 0;
-    dap_chain_hash_fast_t l_block_hash;
 
     dap_chain_block_meta_extract(l_meta, l_meta_count,
                                         &l_block_prev_hash,
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 1a47abbba49c81ac7cd9d61e73ad489f8ab4c7e2..2b400d43161b2b86a64078647f4f04a61f274503 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -297,7 +297,8 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
         }
     }
     uint16_t l_list_len = 0;
-    char **l_hard_accept_list = dap_config_get_array_str(a_chain_cfg, "dag", "hard_accept_list", &l_list_len);
+    char **l_hard_accept_list = dap_config_get_array_str(a_chain_cfg, "dag-poa", "hard_accept_list", &l_list_len);
+    log_it(L_MSG, "HAL contains %d whitelisted events", l_list_len);
     for (uint16_t i = 0; i < l_list_len; i++) {
         dap_chain_cs_dag_hal_item_t *l_hal_item = DAP_NEW_Z(dap_chain_cs_dag_hal_item_t);
         if (!l_hal_item){