diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c
index 3ab76c40058daf81986d9b87d9edf2bf42dccc71..3c0710cbee62faa5dda034acfb32ace6cd49245e 100644
--- a/modules/chain/dap_chain_cell.c
+++ b/modules/chain/dap_chain_cell.c
@@ -333,6 +333,44 @@ void dap_chain_cell_delete(dap_chain_cell_t *a_cell)
     DAP_DELETE(a_cell);
 }
 
+void dap_chain_cell_delete_all_and_free_file(dap_chain_t *a_chain) {
+    if (!a_chain)
+        return;
+    pthread_rwlock_wrlock(&a_chain->cell_rwlock);
+    dap_chain_cell_t *l_cell, *l_tmp;
+    HASH_ITER(hh, a_chain->cells, l_cell, l_tmp) {
+        char *l_fsp = dap_strdup(l_cell->file_storage_path);
+        dap_chain_cell_id_t l_cell_id = l_cell->id;
+        dap_chain_cell_close(l_cell);
+
+        dap_chain_cell_t * l_cell_nh = DAP_NEW_Z(dap_chain_cell_t);
+        FILE *l_file = fopen(l_fsp, "w+b");
+        if ( !l_file ) {
+            log_it(L_ERROR, "Chain cell \"%s\" 0x%016"DAP_UINT64_FORMAT_X" cannot be opened, error %d",
+                   l_fsp, l_cell_id.uint64, errno);
+        }
+        *l_cell_nh = (dap_chain_cell_t) {
+                .id             = l_cell_id,
+                .chain          = a_chain,
+                .file_storage   = l_file
+        };
+        if ( !s_cell_file_write_header(l_cell_nh)) {
+            log_it(L_ERROR, "Can't init file storage for cell 0x%016"DAP_UINT64_FORMAT_X" \"%s\", errno %d",
+                   l_cell_id.uint64, l_fsp, errno);
+        } else {
+            log_it(L_NOTICE, "Reinitialized file storage for cell 0x%016"DAP_UINT64_FORMAT_X" \"%s\"",
+                   l_cell_id.uint64, l_fsp);
+        }
+        dap_chain_cell_close(l_cell_nh);
+
+        DAP_DELETE(l_fsp);
+        HASH_DEL(a_chain->cells, l_cell);
+        pthread_rwlock_destroy(&l_cell->storage_rwlock);
+        DAP_DELETE(l_cell);
+    }
+    pthread_rwlock_unlock(&a_chain->cell_rwlock);
+}
+
 void dap_chain_cell_delete_all(dap_chain_t *a_chain) {
     if (!a_chain)
         return;
diff --git a/modules/chain/include/dap_chain_cell.h b/modules/chain/include/dap_chain_cell.h
index d0957d3c32d7f115374bef73e03349f7628f6644..88ba245e169bb02cb4564f141a8bfa5431ff5455 100644
--- a/modules/chain/include/dap_chain_cell.h
+++ b/modules/chain/include/dap_chain_cell.h
@@ -77,6 +77,7 @@ dap_chain_cell_t *dap_chain_cell_create_fill(dap_chain_t *a_chain, dap_chain_cel
 dap_chain_cell_t *dap_chain_cell_find_by_id(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id);
 void dap_chain_cell_close(dap_chain_cell_t *a_cell);
 void dap_chain_cell_delete(dap_chain_cell_t *a_cell);
+void dap_chain_cell_delete_all_and_free_file(dap_chain_t *a_chain);
 void dap_chain_cell_delete_all(dap_chain_t *a_chain);
 int dap_chain_cell_load(dap_chain_t *a_chain, dap_chain_cell_t *a_cell);
 ssize_t dap_chain_cell_file_append(dap_chain_cell_t *a_cell,const void *a_atom, size_t a_atom_size);
diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c
index d9715cd2f053e2ccb1124d98f005efdd394393fa..fda57f4916b7972b795e7544e5b9c5fa2d650472 100644
--- a/modules/net/dap_chain_ledger.c
+++ b/modules/net/dap_chain_ledger.c
@@ -5530,7 +5530,8 @@ void dap_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db)
     char *l_gdb_group;
     HASH_ITER(hh, l_ledger_pvt->ledger_items , l_item_current, l_item_tmp) {
         HASH_DEL(l_ledger_pvt->ledger_items, l_item_current);
-        DAP_DELETE(l_item_current->tx);
+        if (!l_ledger_pvt->mapped)
+            DAP_DELETE(l_item_current->tx);
         DAP_DEL_Z(l_item_current);
     }
     if (!a_preserve_db) {
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 7010e89731dad30c71a20330d15677b2d46af080..d4d21553ed89149a7aafe38aea13f48a031589fd 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -880,18 +880,20 @@ void s_set_reply_text_node_status(void **a_str_reply, dap_chain_net_t * a_net){
  */
 void dap_chain_net_purge(dap_chain_net_t *l_net)
 {
-    dap_ledger_purge(l_net->pub.ledger, false);
     dap_chain_net_srv_stake_purge(l_net);
+    dap_chain_net_decree_deinit(l_net);
+    dap_ledger_purge(l_net->pub.ledger, false);
     dap_chain_t *l_chain = NULL;
     DL_FOREACH(l_net->pub.chains, l_chain) {
-        if (l_chain->callback_purge)
+        if (l_chain->callback_purge) {
             l_chain->callback_purge(l_chain);
-        if (!dap_strcmp(dap_chain_get_cs_type(l_chain), "esbocs"))
+        }
+        if (!dap_strcmp(dap_chain_get_cs_type(l_chain), "esbocs")) {
             dap_chain_esbocs_set_min_validators_count(l_chain, 0);
+        }
+        dap_chain_load_all(l_chain);
         l_net->pub.fee_value = uint256_0;
         l_net->pub.fee_addr = c_dap_chain_addr_blank;
-        dap_chain_net_decree_purge(l_net);
-        dap_chain_load_all(l_chain);
     }
     DL_FOREACH(l_net->pub.chains, l_chain) {
         if (l_chain->callback_atom_add_from_treshold) {
@@ -899,6 +901,7 @@ void dap_chain_net_purge(dap_chain_net_t *l_net)
                 debug_if(s_debug_more, L_DEBUG, "Added atom from treshold");
         }
     }
+    dap_chain_net_decree_init(l_net);
 }
 
 /**
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index 180971b28ba4c7c1c08d9ce55292dea8b7fd3a0a..86bf719e88b7da036ff270137406456d04a7e010 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -1352,7 +1352,8 @@ static void s_callback_cs_blocks_purge(dap_chain_t *a_chain)
     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);
-        DAP_DELETE(l_block->block);
+        if (!a_chain->is_mapped)
+            DAP_DELETE(l_block->block);
         dap_chain_block_cache_delete(l_block);
     }
     PVT(l_blocks)->blocks_count = 0;
@@ -1368,7 +1369,7 @@ static void s_callback_cs_blocks_purge(dap_chain_t *a_chain)
     pthread_rwlock_unlock(&PVT(l_blocks)->datums_rwlock);
 
     dap_chain_block_chunks_delete(PVT(l_blocks)->chunks);
-    dap_chain_cell_delete_all(a_chain);
+    dap_chain_cell_delete_all_and_free_file(a_chain);
     PVT(l_blocks)->chunks = dap_chain_block_chunks_create(l_blocks);
 }
 
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 0fb0c2803e54e80be100719c2f9bb2bbd9f523ba..e7dca3dd963e765278675e9c9c3b75c31b72fbe5 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -364,7 +364,7 @@ static void s_dap_chain_cs_dag_purge(dap_chain_t *a_chain)
         DAP_DELETE(l_event_current);
     }
     pthread_mutex_unlock(&l_dag_pvt->events_mutex);
-    dap_chain_cell_delete_all(a_chain);
+    dap_chain_cell_delete_all_and_free_file(a_chain);
 }
 
 /**
@@ -389,7 +389,11 @@ static void s_chain_cs_dag_delete(dap_chain_t * a_chain)
 static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t *a_dag, dap_chain_cs_dag_event_item_t *a_event_item)
 {
     dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event, a_event_item->event_size);
-    if(a_event_item->event_size< sizeof(l_datum->header) ){
+    if (!l_datum) {
+        log_it(L_WARNING, "Corrupted event, failed to extract datum from event.");
+        return -2;
+    }
+    if(a_event_item->event_size < sizeof(l_datum->header) ){
         log_it(L_WARNING, "Corrupted event, too small to fit datum in it");
         return -1;
     }