diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4a87c39556879cbc2a0ad93dcf5f56c339dbf684..c81ec7e9c6b39bb2309e9fbb5d728d755c77c096 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -82,3 +82,11 @@ build:macos:
     script:
       - mkdir build
       - cd build && $(${OSXCROSS_ROOT}/bin/osxcross-conf) && export OSXCROSS_NO_INCLUDE_PATH_WARNINGS=1 && export OSXCROSS_HOST=x86_64-apple-darwin20.4 && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=${OSXCROSS_ROOT}/toolchain.cmake -DBoost_INCLUDE_DIR=$BOOST_INCLUDE_DIR .. && make -j$(nproc)
+
+
+build:android:
+    extends: .tests
+    image: demlabs/android/any:qt5
+    before_script: /opt/buildtools/prepare_environment.sh amd64-windows
+    script:
+      - ./prod_build/build.sh --target android
diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index 2a38ee0ae83bad2d9ddcaef624dd2966641ac832..63cc46f6ed242f9840e724eda723d8e6443f01a7 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -339,7 +339,12 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d
     dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(a_group, &l_objs_count);
     if (l_objs_count >= 10) {
         for (size_t i = 0; i < l_objs_count; i++) {
-            SUM_256_256(l_value_total, *(uint256_t*)l_objs[i].value, &l_value_total);
+            if (l_objs[i].value_len != sizeof(uint256_t)) {
+                log_it(L_ERROR, "Autocollect record %s is corrupt, len %zu clear it", l_objs[i].key, l_objs[i].value_len);
+                dap_global_db_del_sync(a_group, l_objs[i].key);
+                continue;
+            }
+            SUM_256_256(l_value_total, *(uint256_t *)l_objs[i].value, &l_value_total);
             if (compare256(l_value_total, l_block_collect_params->collecting_level) >= 0) {
                 l_level_reached = true;
                 break;
@@ -536,7 +541,6 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf
                                                       dap_guuid_compose(l_net->pub.id.uint64, DAP_CHAIN_CLUSTER_ID_ESBOCS),
                                                       l_sync_group, 72 * 3600, true,
                                                       DAP_GDB_MEMBER_ROLE_NOBODY, DAP_CLUSTER_TYPE_AUTONOMIC);
-    dap_global_db_cluster_add_notify_callback(l_session->db_cluster, s_db_change_notifier, l_session);
     dap_link_manager_add_net_associate(l_net->pub.id.uint64, l_session->db_cluster->links_cluster);
     dap_global_db_del_sync(l_sync_group, NULL);     // Drop table on stratup
     DAP_DELETE(l_sync_group);
@@ -944,6 +948,37 @@ static dap_list_t *s_validator_check_synced(dap_chain_addr_t *a_addr, dap_list_t
     return dap_list_find(a_validators, a_addr, s_callback_addr_compare_synced);
 }
 
+static void s_db_calc_sync_hash(dap_chain_esbocs_session_t *a_session)
+{
+    char *l_penalty_group = s_get_penalty_group(a_session->chain->net_id);
+    size_t l_penalties_count = 0;
+    dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_penalty_group, &l_penalties_count);
+    for (size_t i = 0; i < l_penalties_count; i++) {
+        dap_chain_addr_t *l_validator_addr = dap_chain_addr_from_str(l_objs[i].key);
+        if (!l_validator_addr) {
+            log_it(L_WARNING, "Unreadable address in esbocs global DB group");
+            continue;
+        }
+        if (l_validator_addr->net_id.uint64 != a_session->chain->net_id.uint64) {
+            log_it(L_ERROR, "Wrong destination net ID %" DAP_UINT64_FORMAT_x "session net ID %" DAP_UINT64_FORMAT_x,
+                                                        l_validator_addr->net_id.uint64, a_session->chain->net_id.uint64);
+            continue;
+        }
+        if (dap_chain_net_srv_stake_mark_validator_active(l_validator_addr, false)) {
+            log_it(L_ERROR, "Validator with signing address %s not found in network %s",
+                                                        l_objs[i].key, a_session->chain->net_name);
+            continue;
+        }
+    }
+    dap_global_db_objs_delete(l_objs, l_penalties_count);
+    dap_store_obj_t *l_last_raw = dap_global_db_driver_read_last(l_penalty_group, false);
+    if (l_last_raw) {
+        a_session->db_hash = dap_global_db_driver_hash_get(l_last_raw);
+        dap_store_obj_free_one(l_last_raw);
+    }
+    DAP_DELETE(l_penalty_group);
+    a_session->is_actual_hash = true;
+}
 
 static void s_session_send_startsync(dap_chain_esbocs_session_t *a_session)
 {
@@ -954,6 +989,8 @@ static void s_session_send_startsync(dap_chain_esbocs_session_t *a_session)
     a_session->ts_round_sync_start = dap_time_now();
     if (!dap_hash_fast_compare(&l_last_block_hash, &a_session->cur_round.last_block_hash))
         return;     // My last block hash has changed, skip sync message
+    if (!a_session->is_actual_hash)
+        s_db_calc_sync_hash(a_session);
     if (PVT(a_session->esbocs)->debug) {
         dap_string_t *l_addr_list = dap_string_new("");
         for (dap_list_t *it = a_session->cur_round.validators_list; it; it = it->next) {
@@ -1033,6 +1070,8 @@ static void s_session_round_clear(dap_chain_esbocs_session_t *a_session)
             .last_block_hash = a_session->cur_round.last_block_hash,
             .sync_attempt = a_session->cur_round.sync_attempt
     };
+    a_session->db_hash = c_dap_global_db_driver_hash_blank;
+    a_session->is_actual_hash = false;
 }
 
 static bool s_session_round_new(void *a_arg)
@@ -1949,46 +1988,6 @@ static void s_session_directive_process(dap_chain_esbocs_session_t *a_session, d
     s_message_send(a_session, l_type, a_directive_hash, NULL, 0, a_session->cur_round.all_validators);
 }
 
-static void s_db_change_notifier(dap_store_obj_t *a_obj, void *a_arg)
-{
-    dap_chain_esbocs_session_t *l_session = a_arg;
-    dap_chain_addr_t *l_validator_addr = dap_chain_addr_from_str(a_obj->key);
-    if (!l_validator_addr) {
-        log_it(L_WARNING, "Unreadable address in esbocs global DB group");
-        return;
-    }
-    if (l_validator_addr->net_id.uint64 != l_session->chain->net_id.uint64) {
-        log_it(L_ERROR, "Wrong destination net ID %" DAP_UINT64_FORMAT_x "session net ID %" DAP_UINT64_FORMAT_x,
-                                                    l_validator_addr->net_id.uint64, l_session->chain->net_id.uint64);
-        return;
-    }
-    if (dap_chain_net_srv_stake_mark_validator_active(l_validator_addr,
-                                                      dap_store_obj_get_type(a_obj) != DAP_GLOBAL_DB_OPTYPE_ADD)) {
-        log_it(L_ERROR, "Validator with signing address %s not found in network %s",
-                                                    a_obj->key, l_session->chain->net_name);
-        return;
-    }
-    log_it(L_DEBUG, "Got new penalty item for group %s with key %s", a_obj->group, a_obj->key);
-    if (dap_store_obj_get_type(a_obj) == DAP_GLOBAL_DB_OPTYPE_ADD)
-        l_session->db_hash = dap_global_db_driver_hash_get(a_obj);
-    else {
-        char *l_last_key = NULL;
-        byte_t *l_value = dap_global_db_get_last_sync(a_obj->group, &l_last_key, NULL, NULL, NULL);
-        if (l_last_key) {
-            dap_store_obj_t *l_last_raw = dap_global_db_get_raw_sync(a_obj->group, l_last_key);
-            assert(l_last_raw);
-            if (l_last_raw) {
-                l_session->db_hash = dap_global_db_driver_hash_get(l_last_raw);
-                dap_store_obj_free_one(l_last_raw);
-            } else
-                log_it(L_ERROR, "Last key in %s is %s, but no raw object with this key", a_obj->group, l_last_key);
-            DAP_DELETE(l_last_key);
-        } else
-            l_session->db_hash = c_dap_global_db_driver_hash_blank;
-        DAP_DEL_Z(l_value);
-    }
-}
-
 static int s_session_directive_apply(dap_chain_esbocs_directive_t *a_directive, dap_hash_fast_t *a_directive_hash)
 {
     if (!a_directive) {
@@ -2325,6 +2324,8 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain
                                     " Receive START_SYNC: from validator:%s, sync attempt %"DAP_UINT64_FORMAT_U,
                                         l_session->chain->net_name, l_session->chain->name, l_message->hdr.round_id,
                                             l_validator_addr_str, l_sync_attempt);
+        if (!l_session->is_actual_hash)
+            s_db_calc_sync_hash(l_session);
         dap_global_db_driver_hash_t l_msg_hash = ((struct sync_params *)l_message_data)->db_hash, l_session_hash = l_session->db_hash;
         if (!PVT(l_session->esbocs)->emergency_mode &&
                 dap_global_db_driver_hash_compare(&l_msg_hash, &l_session_hash)) {
diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h
index 93c9109637c97c8c791862de9b5662dc08ad94c0..bd009e34b125c2eac26c81315a10a16800def6d7 100644
--- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h
+++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h
@@ -207,6 +207,7 @@ typedef struct dap_chain_esbocs_session {
     dap_chain_esbocs_penalty_item_t *penalty;
     dap_global_db_cluster_t *db_cluster;
     dap_global_db_driver_hash_t db_hash;
+    bool is_actual_hash;
 
     struct dap_chain_esbocs_session *prev, *next;
 } dap_chain_esbocs_session_t;
diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c
index ab3ce0ed37f86a583ae6a9c8105268111b7e64a0..4ea8aeca84dc0f5bc32271e58c0a44ab635f7139 100644
--- a/modules/net/dap_chain_ledger.c
+++ b/modules/net/dap_chain_ledger.c
@@ -4591,7 +4591,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha
     l_tx_item->cache_data.multichannel = l_multichannel;
     l_tx_item->ts_added = dap_nanotime_now();
     pthread_rwlock_wrlock(&l_ledger_pvt->ledger_rwlock);
-    if (dap_chain_net_get_load_mode(a_ledger->net))
+    if (dap_chain_net_get_load_mode(a_ledger->net) || dap_chain_net_get_state(a_ledger->net) == NET_STATE_SYNC_CHAINS)
         HASH_ADD(hh, l_ledger_pvt->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_item);
     else
         HASH_ADD_INORDER(hh, l_ledger_pvt->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t),
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 909692910a3e6492361c5a6db9db0c8d1d197723..4ba06647b8635c3beddbc5125ae6ab692884ab2c 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -677,6 +677,8 @@ static bool s_net_states_proc(void *a_arg)
     dap_chain_net_pvt_t *l_net_pvt = PVT(l_net);
     assert(l_net_pvt);
     if (l_net_pvt->state_target == NET_STATE_OFFLINE) {
+        if(l_net_pvt->state == NET_STATE_SYNC_CHAINS)
+            dap_leger_load_end(l_net->pub.ledger);
         l_net_pvt->state = NET_STATE_OFFLINE;
     }
 
@@ -686,8 +688,11 @@ static bool s_net_states_proc(void *a_arg)
             log_it(L_NOTICE,"%s.state: NET_STATE_OFFLINE", l_net->pub.name);
             // delete all links
             if ( l_net_pvt->state_target != NET_STATE_OFFLINE ){
+                dap_chain_net_state_t l_prev_state = l_net_pvt->state;
                 l_net_pvt->state = NET_STATE_LINKS_PREPARE;
                 l_repeat_after_exit = true;
+                if(l_prev_state == NET_STATE_SYNC_CHAINS)
+                    dap_leger_load_end(l_net->pub.ledger);
             }
             l_net_pvt->last_sync = 0;
         } break;
@@ -2588,10 +2593,13 @@ static void s_sync_timer_callback(void *a_arg)
             l_net_pvt->sync_context.cur_chain = l_net_pvt->sync_context.cur_chain->next;
             log_it(L_DEBUG, "[%s:%d] Go to next chain %p", __FUNCTION__, __LINE__, l_net_pvt->sync_context.cur_chain);
             if (!l_net_pvt->sync_context.cur_chain) {
+                dap_chain_net_state_t l_prev_state = l_net_pvt->state;
                 if (l_net_pvt->sync_context.last_state == SYNC_STATE_SYNCED) {
                     l_net_pvt->state = NET_STATE_ONLINE;
                     l_net_pvt->sync_context.state = l_net_pvt->sync_context.last_state = SYNC_STATE_IDLE;
                     s_net_states_proc(l_net);
+                    if(l_prev_state == NET_STATE_SYNC_CHAINS)
+                        dap_leger_load_end(l_net->pub.ledger);
                 } else
                     l_net_pvt->sync_context.state = l_net_pvt->sync_context.last_state = SYNC_STATE_WAITING;
                 return;
@@ -2968,6 +2976,8 @@ void dap_chain_net_set_state(dap_chain_net_t *l_net, dap_chain_net_state_t a_sta
     if(a_state == PVT(l_net)->state){
         return;
     }
+    if(PVT(l_net)->state == NET_STATE_SYNC_CHAINS)
+        dap_leger_load_end(l_net->pub.ledger);
     PVT(l_net)->state = a_state;
     dap_proc_thread_callback_add(NULL, s_net_states_proc, l_net);
 }
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index 70a5e4fc3d5709d2f6c11798c008bc5e60db365e..b8477039d0a3fbce0c1d92296481d42b7e1da193 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -1242,17 +1242,14 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply)
                         .block_sign_pkey = l_pub_key,
                         .collecting_addr = l_addr
                 };
-                //Cleare gdb
-                size_t l_objs_fee_count = 0;
-                size_t l_objs_rew_count = 0;
+                //Clear gdb
                 char *l_group_fee = dap_chain_cs_blocks_get_fee_group(l_net->pub.name);
-                char *l_group_rew = dap_chain_cs_blocks_get_reward_group(l_net->pub.name);
-                dap_global_db_obj_t *l_objs_fee = dap_global_db_get_all_sync(l_group_fee, &l_objs_fee_count);
-                dap_global_db_obj_t *l_objs_rew = dap_global_db_get_all_sync(l_group_rew, &l_objs_rew_count);
-                if(l_objs_fee_count)dap_global_db_objs_delete(l_objs_fee,l_objs_fee_count);
-                if(l_objs_rew_count)dap_global_db_objs_delete(l_objs_rew,l_objs_rew_count);
+                dap_global_db_del_sync(l_group_fee, NULL);
                 DAP_DELETE(l_group_fee);
-                DAP_DELETE(l_group_rew);
+                char *l_group_reward = dap_chain_cs_blocks_get_reward_group(l_net->pub.name);
+                dap_global_db_del_sync(l_group_reward, NULL);
+                DAP_DELETE(l_group_reward);
+
                 json_object* json_arr_bl_out = json_object_new_array();
 
                 for (dap_chain_block_cache_t *l_block_cache = PVT(l_blocks)->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) {
diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c
index 6e9a439f4f927842f43b7a495ab52c7c65eebf84..38986922299ee3aa5c5bd9cd36dcbe8da9f6e7f3 100644
--- a/modules/wallet/dap_chain_wallet.c
+++ b/modules/wallet/dap_chain_wallet.c
@@ -63,7 +63,7 @@
 
 //#define __USE_GNU
 
-#if defined(__USE_BSD) || defined(__USE_GNU)
+#if defined(__USE_BSD) || defined(__USE_GNU) || defined(DAP_OS_ANDROID)
 #define S_IREAD S_IRUSR
 #define S_IWRITE S_IWUSR
 #define S_IEXEC S_IXUSR