From 049d439e56cf20caf53e3cb7c58da591e9288fc6 Mon Sep 17 00:00:00 2001
From: Roman Khlopkov <roman.khlopkov@demlabs.net>
Date: Sat, 21 Oct 2023 20:08:15 +0000
Subject: [PATCH] feature-6374

---
 3rdparty/crc32c_adler/CMakeLists.txt          |  16 -
 3rdparty/crc32c_adler/README                  |  14 -
 3rdparty/crc32c_adler/crc32c_adler.c          | 504 -----------
 3rdparty/crc32c_adler/crc32c_adler.h          |  70 --
 3rdparty/crc32c_adler/example-dht.c           | 163 ----
 3rdparty/crc32c_adler/example-stdin.c         |  46 -
 CMakeLists.txt                                |   6 +-
 dap-sdk                                       |   2 +-
 modules/CMakeLists.txt                        |  10 +-
 modules/chain/dap_chain.c                     |  31 +-
 modules/chain/dap_chain_cell.c                |   1 -
 modules/chain/dap_chain_cs.c                  |  21 +-
 modules/chain/dap_chain_ledger.c              |  26 +-
 modules/chain/dap_chain_pvt.c                 |  79 --
 modules/chain/include/dap_chain.h             |  20 +
 modules/chain/include/dap_chain_cs.h          |   2 +-
 modules/chain/include/dap_chain_pvt.h         |  62 --
 .../dap_stream_ch_chain_net_srv.c             |   2 +-
 .../chain-net/dap_stream_ch_chain_net.c       | 340 ++------
 .../include/dap_stream_ch_chain_net_pkt.h     |  10 +-
 .../chain-voting/dap_stream_ch_chain_voting.c |   9 +-
 .../include/dap_stream_ch_chain_voting.h      |   2 -
 modules/channel/chain/dap_stream_ch_chain.c   | 203 +----
 .../chain/include/dap_stream_ch_chain.h       |   4 +-
 modules/common/dap_chain_datum.c              |  12 +-
 modules/common/include/dap_chain_common.h     |  60 +-
 modules/common/include/dap_chain_datum.h      |   2 +-
 .../block-poa/dap_chain_cs_block_poa.c        |   4 +-
 .../block-pos/dap_chain_cs_block_pos.c        |   2 +-
 .../consensus/dag-poa/dap_chain_cs_dag_poa.c  |  16 +-
 .../consensus/dag-pos/dap_chain_cs_dag_pos.c  |   4 +-
 .../consensus/esbocs/dap_chain_cs_esbocs.c    | 221 ++---
 .../esbocs/include/dap_chain_cs_esbocs.h      |  34 +-
 modules/mempool/dap_chain_mempool.c           |   5 +-
 modules/net/dap_chain_net.c                   | 792 ++++--------------
 modules/net/dap_chain_net_balancer.c          |   6 +-
 modules/net/dap_chain_net_node_list.c         |  11 +-
 modules/net/dap_chain_node.c                  | 165 +---
 modules/net/dap_chain_node_cli_cmd.c          | 136 +--
 modules/net/dap_chain_node_client.c           |  33 +-
 modules/net/dap_chain_node_dns_client.c       |  11 +-
 modules/net/dap_chain_node_dns_server.c       |   3 +-
 modules/net/include/dap_chain_net.h           |  25 +-
 modules/net/include/dap_chain_node.h          |  70 +-
 modules/net/include/dap_chain_node_cli_cmd.h  |   8 -
 modules/net/srv/dap_chain_net_srv.c           |  54 +-
 modules/net/srv/dap_chain_net_srv_order.c     |  15 +-
 .../service/datum/dap_chain_net_srv_datum.c   |  12 +-
 .../dap_chain_net_srv_stake_pos_delegate.c    |  15 +-
 .../dap_chain_net_srv_stake_pos_delegate.h    |   2 +-
 modules/service/vpn/dap_chain_net_srv_vpn.c   |  43 +-
 .../vpn/dap_chain_net_vpn_client_tun.c        |   4 +-
 .../xchange/dap_chain_net_srv_xchange.c       |   3 +-
 modules/type/blocks/dap_chain_cs_blocks.c     |  15 +-
 .../type/blocks/include/dap_chain_cs_blocks.h |   3 -
 modules/type/dag/dap_chain_cs_dag.c           |  39 +-
 modules/type/dag/dap_chain_cs_dag_event.c     |  38 -
 modules/type/dag/include/dap_chain_cs_dag.h   |   3 -
 .../type/dag/include/dap_chain_cs_dag_event.h |  68 +-
 .../{consensus => type}/none/CMakeLists.txt   |   0
 .../none/dap_chain_cs_none.c                  | 309 +++----
 .../none/include/dap_chain_cs_none.h          |  13 +-
 modules/wallet/CMakeLists.txt                 |   6 +-
 modules/wallet/dap_chain_wallet.c             |   2 -
 64 files changed, 852 insertions(+), 3055 deletions(-)
 delete mode 100755 3rdparty/crc32c_adler/CMakeLists.txt
 delete mode 100755 3rdparty/crc32c_adler/README
 delete mode 100755 3rdparty/crc32c_adler/crc32c_adler.c
 delete mode 100755 3rdparty/crc32c_adler/crc32c_adler.h
 delete mode 100755 3rdparty/crc32c_adler/example-dht.c
 delete mode 100755 3rdparty/crc32c_adler/example-stdin.c
 delete mode 100644 modules/chain/dap_chain_pvt.c
 delete mode 100644 modules/chain/include/dap_chain_pvt.h
 rename modules/{consensus => type}/none/CMakeLists.txt (100%)
 rename modules/{consensus => type}/none/dap_chain_cs_none.c (54%)
 rename modules/{consensus => type}/none/include/dap_chain_cs_none.h (76%)

diff --git a/3rdparty/crc32c_adler/CMakeLists.txt b/3rdparty/crc32c_adler/CMakeLists.txt
deleted file mode 100755
index b660945e80..0000000000
--- a/3rdparty/crc32c_adler/CMakeLists.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-#  DESCRIPTION: A miminal cmake script to be used to produce CRC32 Addler static library
-#
-#  AUTHOR: Ruslan R. Laishev
-#
-#  CREATION DATE: 14-NOV-2022
-#
-#  MODIFICATION HISTORY:
-#
-cmake_minimum_required(VERSION 3.10)
-project(crc32c_adler)
-
-set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" )
-set( SRCS crc32c_adler.c  crc32c_adler.h)
-add_library(crc32c_adler  STATIC ${SRCS})
-target_link_libraries(crc32c_adler pthread)
diff --git a/3rdparty/crc32c_adler/README b/3rdparty/crc32c_adler/README
deleted file mode 100755
index 23b609d0e8..0000000000
--- a/3rdparty/crc32c_adler/README
+++ /dev/null
@@ -1,14 +0,0 @@
-
-Extended version of CRC32C implementation by Mark Adler, providing both hardware (SSE 4.2) and software algorithms with auto-detection.
-
-Source:
-https://stackoverflow.com/a/17646775
-
-According to Ferry Toth, Adler's implementation is 'highly optimized':
-https://stackoverflow.com/a/39862799
-https://github.com/htot/crc32c
-
-Revised software algorithm by Robert Važan:
-https://stackoverflow.com/a/21915223
-https://crc32c.machinezoo.com/
-https://bitbucket.org/robertvazan/crc32c-hw/src
diff --git a/3rdparty/crc32c_adler/crc32c_adler.c b/3rdparty/crc32c_adler/crc32c_adler.c
deleted file mode 100755
index 68e90941aa..0000000000
--- a/3rdparty/crc32c_adler/crc32c_adler.c
+++ /dev/null
@@ -1,504 +0,0 @@
-/*
-  CRC32C_ADLER -- Computes CRC32C Checksums
-  Version 1.2, Date 05/21/18
-  Copyright (C) 2013 Mark Adler <madler@alumni.caltech.edu>
-  Copyright (C) 2018 Fonic <https://github.com/fonic>
-
-  Provides both a hardware-accelerated algorithm (*) and a software algorithm.
-  Note that this computes CRC32C checksums, not CRC32 (without 'C') checksums
-  used by Ethernet, gzip, etc.
-
-  (*) CRC instruction on Intel SSE 4.2 processors.  SSE 4.2 was first supported
-      by Nehalem processors introduced in November, 2008.
-
-  Version history:
-  1.0  10 Feb 2013  First version
-  1.1   1 Aug 2013  Correct comments on why three crc instructions in parallel
-  1.2  21 May 2018  Add header file, revise hardware support check, eliminate
-                    pthreads, restructure code, revise comments and description
-
-  Version 1.1 by Mark Adler was originally published here:
-  https://stackoverflow.com/a/17646775
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the author be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software.  If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "crc32c_adler.h"
-
-/* CRC32C (iSCSI) polynomial in reversed bit order. */
-#define POLY 0x82f63b78
-
-
-/******************************************************************************
- *                                                                            *
- *  Software Algorithm (1) - Table-driven, 8 Bytes / Iteration                *
- *                                                                            *
- ******************************************************************************/
-
-/* Table for software algorithm. */
-static uint32_t crc32c_table[8][256];
-
-/* Flag to indicate if crc32c_init_sw() has been called. */
-static int crc32c_sw_initialized = 0;
-
-/* Initialize table for software algorithm. */
-static void crc32c_init_sw(void)
-{
-    uint32_t n, crc, k;
-
-    for (n = 0; n < 256; n++) {
-        crc = n;
-        crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
-        crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
-        crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
-        crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
-        crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
-        crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
-        crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
-        crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
-        crc32c_table[0][n] = crc;
-    }
-    for (n = 0; n < 256; n++) {
-        crc = crc32c_table[0][n];
-        for (k = 1; k < 8; k++) {
-            crc = crc32c_table[0][crc & 0xff] ^ (crc >> 8);
-            crc32c_table[k][n] = crc;
-        }
-    }
-    crc32c_sw_initialized = 1;
-}
-
-/* Compute CRC32C checksum. */
-uint32_t crc32c_sw(uint32_t crci, const void *buf, size_t len)
-{
-    const unsigned char *next = buf;
-    uint64_t crc;
-
-    if (!crc32c_sw_initialized)
-        crc32c_init_sw();
-
-    crc = crci ^ 0xffffffff;
-    while (len && ((uintptr_t)next & 7) != 0) {
-        crc = crc32c_table[0][(crc ^ *next++) & 0xff] ^ (crc >> 8);
-        len--;
-    }
-    while (len >= 8) {
-        crc ^= *(uint64_t *)next;
-        crc = crc32c_table[7][crc & 0xff] ^
-              crc32c_table[6][(crc >> 8) & 0xff] ^
-              crc32c_table[5][(crc >> 16) & 0xff] ^
-              crc32c_table[4][(crc >> 24) & 0xff] ^
-              crc32c_table[3][(crc >> 32) & 0xff] ^
-              crc32c_table[2][(crc >> 40) & 0xff] ^
-              crc32c_table[1][(crc >> 48) & 0xff] ^
-              crc32c_table[0][crc >> 56];
-        next += 8;
-        len -= 8;
-    }
-    while (len) {
-        crc = crc32c_table[0][(crc ^ *next++) & 0xff] ^ (crc >> 8);
-        len--;
-    }
-    return (uint32_t)crc ^ 0xffffffff;
-}
-
-
-/******************************************************************************
- *                                                                            *
- *  Software Algorithm (2) - Table-driven, 16 Bytes / Iteration               *
- *                                                                            *
- ******************************************************************************/
-
-/* Table for software algorithm. */
-static uint32_t crc32c_table2[16][256];
-
-/* Flag to indicate if crc32c_init_sw2() has been called. */
-static int crc32c_table2_initialized = 0;
-
-/* Initialize table for software algorithm. */
-static void crc32c_init_sw2(void)
-{
-    for(int i = 0; i < 256; i++)
-    {
-        uint32_t res = (uint32_t)i;
-        for(int t = 0; t < 16; t++) {
-            for (int k = 0; k < 8; k++) res = (res & 1) == 1 ? POLY ^ (res >> 1) : (res >> 1);
-            crc32c_table2[t][i] = res;
-        }
-    }
-    crc32c_table2_initialized = 1;
-}
-
-/* Compute CRC32C checksum. */
-uint32_t crc32c_sw2(uint32_t crci, const void *buf, size_t len)
-{
-    const unsigned char *next = buf;
-#ifdef __x86_64__
-    uint64_t crc;
-#else
-    uint32_t crc;
-#endif
-
-    if(!crc32c_table2_initialized)
-        crc32c_init_sw2();
-
-    crc = crci ^ 0xffffffff;
-#ifdef __x86_64__
-    while (len && ((uintptr_t)next & 7) != 0)
-    {
-        crc = crc32c_table2[0][(crc ^ *next++) & 0xff] ^ (crc >> 8);
-        --len;
-    }
-    while (len >= 16)
-    {
-        crc ^= *(uint64_t *)next;
-        uint64_t high = *(uint64_t *)(next + 8);
-        crc = crc32c_table2[15][crc & 0xff]
-            ^ crc32c_table2[14][(crc >> 8) & 0xff]
-            ^ crc32c_table2[13][(crc >> 16) & 0xff]
-            ^ crc32c_table2[12][(crc >> 24) & 0xff]
-            ^ crc32c_table2[11][(crc >> 32) & 0xff]
-            ^ crc32c_table2[10][(crc >> 40) & 0xff]
-            ^ crc32c_table2[9][(crc >> 48) & 0xff]
-            ^ crc32c_table2[8][crc >> 56]
-            ^ crc32c_table2[7][high & 0xff]
-            ^ crc32c_table2[6][(high >> 8) & 0xff]
-            ^ crc32c_table2[5][(high >> 16) & 0xff]
-            ^ crc32c_table2[4][(high >> 24) & 0xff]
-            ^ crc32c_table2[3][(high >> 32) & 0xff]
-            ^ crc32c_table2[2][(high >> 40) & 0xff]
-            ^ crc32c_table2[1][(high >> 48) & 0xff]
-            ^ crc32c_table2[0][high >> 56];
-        next += 16;
-        len -= 16;
-    }
-#else
-    while (len && ((uintptr_t)next & 3) != 0)
-    {
-        crc = crc32c_table2[0][(crc ^ *next++) & 0xff] ^ (crc >> 8);
-        --len;
-    }
-    while (len >= 12)
-    {
-        crc ^= *(uint32_t *)next;
-        uint32_t high = *(uint32_t *)(next + 4);
-        uint32_t high2 = *(uint32_t *)(next + 8);
-        crc = crc32c_table2[11][crc & 0xff]
-            ^ crc32c_table2[10][(crc >> 8) & 0xff]
-            ^ crc32c_table2[9][(crc >> 16) & 0xff]
-            ^ crc32c_table2[8][crc >> 24]
-            ^ crc32c_table2[7][high & 0xff]
-            ^ crc32c_table2[6][(high >> 8) & 0xff]
-            ^ crc32c_table2[5][(high >> 16) & 0xff]
-            ^ crc32c_table2[4][high >> 24]
-            ^ crc32c_table2[3][high2 & 0xff]
-            ^ crc32c_table2[2][(high2 >> 8) & 0xff]
-            ^ crc32c_table2[1][(high2 >> 16) & 0xff]
-            ^ crc32c_table2[0][high2 >> 24];
-        next += 12;
-        len -= 12;
-    }
-#endif
-    while (len)
-    {
-        crc = crc32c_table2[0][(crc ^ *next++) & 0xff] ^ (crc >> 8);
-        --len;
-    }
-    return (uint32_t)crc ^ 0xffffffff;
-}
-
-
-/******************************************************************************
- *                                                                            *
- *  Hardware Algorithm - SSE 4.2                                              *
- *                                                                            *
- ******************************************************************************/
-
-/* Multiply a matrix times a vector over the Galois field of two elements,
-   GF(2).  Each element is a bit in an unsigned integer.  mat must have at
-   least as many entries as the power of two for most significant one bit in
-   vec. */
-static inline uint32_t gf2_matrix_times(uint32_t *mat, uint32_t vec)
-{
-    uint32_t sum;
-
-    sum = 0;
-    while (vec) {
-        if (vec & 1)
-            sum ^= *mat;
-        vec >>= 1;
-        mat++;
-    }
-    return sum;
-}
-
-/* Multiply a matrix by itself over GF(2).  Both mat and square must have 32
-   rows. */
-static inline void gf2_matrix_square(uint32_t *square, uint32_t *mat)
-{
-    int n;
-
-    for (n = 0; n < 32; n++)
-        square[n] = gf2_matrix_times(mat, mat[n]);
-}
-
-/* Construct an operator to apply len zeros to a crc.  len must be a power of
-   two.  If len is not a power of two, then the result is the same as for the
-   largest power of two less than len.  The result for len == 0 is the same as
-   for len == 1.  A variant of this routine could be easily written for any
-   len, but that is not needed for this application. */
-static void crc32c_zeros_op(uint32_t *even, size_t len)
-{
-    int n;
-    uint32_t row;
-    uint32_t odd[32];           /* odd-power-of-two zeros operator */
-
-    /* Put operator for one zero bit in odd. */
-    odd[0] = POLY;              /* CRC32C polynomial */
-    row = 1;
-    for (n = 1; n < 32; n++) {
-        odd[n] = row;
-        row <<= 1;
-    }
-
-    /* Put operator for two zero bits in even. */
-    gf2_matrix_square(even, odd);
-
-    /* Put operator for four zero bits in odd. */
-    gf2_matrix_square(odd, even);
-
-    /* First square will put the operator for one zero byte (eight zero bits),
-       in even -- next square puts operator for two zero bytes in odd, and so
-       on, until len has been rotated down to zero. */
-    do {
-        gf2_matrix_square(even, odd);
-        len >>= 1;
-        if (len == 0)
-            return;
-        gf2_matrix_square(odd, even);
-        len >>= 1;
-    } while (len);
-
-    /* Answer ended up in odd -- copy to even. */
-    for (n = 0; n < 32; n++)
-        even[n] = odd[n];
-}
-
-/* Take a length and build four lookup tables for applying the zeros operator
-   for that length, byte-by-byte on the operand. */
-static void crc32c_zeros(uint32_t zeros[][256], size_t len)
-{
-    uint32_t n;
-    uint32_t op[32];
-
-    crc32c_zeros_op(op, len);
-    for (n = 0; n < 256; n++) {
-        zeros[0][n] = gf2_matrix_times(op, n);
-        zeros[1][n] = gf2_matrix_times(op, n << 8);
-        zeros[2][n] = gf2_matrix_times(op, n << 16);
-        zeros[3][n] = gf2_matrix_times(op, n << 24);
-    }
-}
-
-/* Apply the zeros operator table to crc. */
-static inline uint32_t crc32c_shift(uint32_t zeros[][256], uint32_t crc)
-{
-    return zeros[0][crc & 0xff] ^ zeros[1][(crc >> 8) & 0xff] ^
-           zeros[2][(crc >> 16) & 0xff] ^ zeros[3][crc >> 24];
-}
-
-/* Block sizes for three-way parallel crc computation.  LONG and SHORT must
-   both be powers of two.  The associated string constants must be set
-   accordingly, for use in constructing the assembler instructions. */
-#define LONG 8192
-#define LONGx1 "8192"
-#define LONGx2 "16384"
-#define SHORT 256
-#define SHORTx1 "256"
-#define SHORTx2 "512"
-
-/* Tables for hardware algorithm that shift a crc by LONG and SHORT zeros. */
-static uint32_t crc32c_long[4][256];
-static uint32_t crc32c_short[4][256];
-
-/* Flag to indicate if crc32c_init_hw() has been called. */
-static int crc32c_hw_initialized = 0;
-
-
-
-
-#if defined(__x86_64__)                 /* @RRL: to compile for ARM */
-
-
-
-static void crc32c_init_hw(void)
-{
-    crc32c_zeros(crc32c_long, LONG);
-    crc32c_zeros(crc32c_short, SHORT);
-    crc32c_hw_initialized = 1;
-}
-
-/* Compute CRC32C checksum. */
-uint32_t crc32c_hw(uint32_t crc, const void *buf, size_t len)
-{
-    const unsigned char *next = buf;
-    const unsigned char *end;
-    uint64_t crc0, crc1, crc2;      /* need to be 64 bits for crc32q */
-
-    /* Populate shift tables the first time through. */
-    if (!crc32c_hw_initialized)
-        crc32c_init_hw();
-
-    /* Pre-process the crc. */
-    crc0 = crc ^ 0xffffffff;
-
-    /* Compute the crc for up to seven leading bytes to bring the data pointer
-       to an eight-byte boundary. */
-    while (len && ((uintptr_t)next & 7) != 0) {
-        __asm__("crc32b\t" "(%1), %0"
-                : "=r"(crc0)
-                : "r"(next), "0"(crc0));
-        next++;
-        len--;
-    }
-
-    /* Compute the crc on sets of LONG*3 bytes, executing three independent crc
-       instructions, each on LONG bytes -- this is optimized for the Nehalem,
-       Westmere, Sandy Bridge, and Ivy Bridge architectures, which have a
-       throughput of one crc per cycle, but a latency of three cycles. */
-    while (len >= LONG*3) {
-        crc1 = 0;
-        crc2 = 0;
-        end = next + LONG;
-        do {
-            __asm__("crc32q\t" "(%3), %0\n\t"
-                    "crc32q\t" LONGx1 "(%3), %1\n\t"
-                    "crc32q\t" LONGx2 "(%3), %2"
-                    : "=r"(crc0), "=r"(crc1), "=r"(crc2)
-                    : "r"(next), "0"(crc0), "1"(crc1), "2"(crc2));
-            next += 8;
-        } while (next < end);
-        crc0 = crc32c_shift(crc32c_long, crc0) ^ crc1;
-        crc0 = crc32c_shift(crc32c_long, crc0) ^ crc2;
-        next += LONG*2;
-        len -= LONG*3;
-    }
-
-    /* Do the same thing, but now on SHORT*3 blocks for the remaining data less
-       than a LONG*3 block. */
-    while (len >= SHORT*3) {
-        crc1 = 0;
-        crc2 = 0;
-        end = next + SHORT;
-        do {
-            __asm__("crc32q\t" "(%3), %0\n\t"
-                    "crc32q\t" SHORTx1 "(%3), %1\n\t"
-                    "crc32q\t" SHORTx2 "(%3), %2"
-                    : "=r"(crc0), "=r"(crc1), "=r"(crc2)
-                    : "r"(next), "0"(crc0), "1"(crc1), "2"(crc2));
-            next += 8;
-        } while (next < end);
-        crc0 = crc32c_shift(crc32c_short, crc0) ^ crc1;
-        crc0 = crc32c_shift(crc32c_short, crc0) ^ crc2;
-        next += SHORT*2;
-        len -= SHORT*3;
-    }
-
-    /* Compute the crc on the remaining eight-byte units less than a SHORT*3
-       block. */
-    end = next + (len - (len & 7));
-    while (next < end) {
-        __asm__("crc32q\t" "(%1), %0"
-                : "=r"(crc0)
-                : "r"(next), "0"(crc0));
-        next += 8;
-    }
-    len &= 7;
-
-    /* Compute the crc for up to seven trailing bytes. */
-    while (len) {
-        __asm__("crc32b\t" "(%1), %0"
-                : "=r"(crc0)
-                : "r"(next), "0"(crc0));
-        next++;
-        len--;
-    }
-
-    /* Return a post-processed crc. */
-    return (uint32_t)crc0 ^ 0xffffffff;
-}
-
-
-
-#endif /* @RRL: to compile for ARM */
-
-/******************************************************************************
- *                                                                            *
- *  Other Functions                                                           *
- *                                                                            *
- ******************************************************************************/
-
-/* Variables to store information on hardware support. */
-static int crc32c_hardware_support = 0;
-static int crc32c_hardware_checked = 0;
-
-/* Check for hardware support (SSE 4.2).  Note that this does not check for
-   the existence of the cpuid instruction itself, which was introduced on the
-   486SL in 1992, so this will fail on earlier x86 processors.  cpuid works
-   on all Pentium and later processors. */
-int crc32c_hw_support()
-{
-#if defined(__x86_64__)                 /* @RRL: to compile for ARM */
-    if (!crc32c_hardware_checked) {
-        do {
-            uint32_t eax, ecx;
-            eax = 1;
-            __asm__("cpuid"
-                    : "=c"(ecx)
-                    : "a"(eax)
-                    : "%ebx", "%edx");
-            (crc32c_hardware_support) = (ecx >> 20) & 1;
-        } while (0);
-        crc32c_hardware_checked = 1;
-    }
-    return crc32c_hardware_support;
-#else
-    return  0;
-#endif
-
-}
-
-/* Disable hardware algorithm even if supported by hardware. */
-void crc32c_hw_disable()
-{
-    crc32c_hardware_support = 0;
-    crc32c_hardware_checked = 1;
-}
-
-/* Compute CRC32C checksum. Use hardware algorithm if supported,
-   fall back on software algorithm otherwise. */
-uint32_t crc32c(uint32_t crc, const void *buf, size_t len)
-{
-#if defined(__x86_64__)                 /* @RRL: to compile for ARM */
-    return crc32c_hw_support() ? crc32c_hw(crc, buf, len) : crc32c_sw(crc, buf, len);
-#else
-    return crc32c_sw(crc, buf, len);
-#endif
-}
diff --git a/3rdparty/crc32c_adler/crc32c_adler.h b/3rdparty/crc32c_adler/crc32c_adler.h
deleted file mode 100755
index a983ecfbe1..0000000000
--- a/3rdparty/crc32c_adler/crc32c_adler.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
-  CRC32C_ADLER -- Computes CRC32C Checksums
-  Version 1.2, Date 05/21/18
-  Copyright (C) 2013 Mark Adler <madler@alumni.caltech.edu>
-  Copyright (C) 2018 Fonic <https://github.com/fonic>
-
-  Provides both a hardware-accelerated algorithm (*) and a software algorithm.
-  Note that this computes CRC32C checksums, not CRC32 (without 'C') checksums
-  used by Ethernet, gzip, etc.
-
-  (*) CRC instruction on Intel SSE 4.2 processors.  SSE 4.2 was first supported
-      by Nehalem processors introduced in November, 2008.
-
-  Version history:
-  1.0  10 Feb 2013  First version
-  1.1   1 Aug 2013  Correct comments on why three crc instructions in parallel
-  1.2  21 May 2018  Add header file, revise hardware support check, eliminate
-                    pthreads, restructure code, revise comments and description
-
-  Version 1.1 by Mark Adler was originally published here:
-  https://stackoverflow.com/a/17646775
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the author be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software.  If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-*/
-#ifndef CRC32C_ADLER_H
-#define CRC32C_ADLER_H
-
-#include <stdint.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* Compute CRC32C checksum using software algorithm (1). */
-uint32_t crc32c_sw(uint32_t crci, const void *buf, size_t len);
-
-/* Compute CRC32C checksum using software algorithm (2). */
-uint32_t crc32c_sw2(uint32_t crci, const void *buf, size_t len);
-
-/* Compute CRC32C checksum using hardware algorithm. */
-uint32_t crc32c_hw(uint32_t crc, const void *buf, size_t len);
-
-/* Check if hardware-support (i.e. SSE 4.2) is available. */
-int crc32c_hw_support();
-
-/* Disable hardware algorithm even if supported by hardware. */
-void crc32c_hw_disable();
-
-/* Compute CRC32C checksum. Use hardware algorithm if supported,
-   fall back on software algorithm otherwise. */
-uint32_t crc32c(uint32_t crc, const void *buf, size_t len);
-
-#if defined(__cplusplus)
-}
-#endif
-#endif // CRC32C_ADLER_H
diff --git a/3rdparty/crc32c_adler/example-dht.c b/3rdparty/crc32c_adler/example-dht.c
deleted file mode 100755
index 5bd05b1e6b..0000000000
--- a/3rdparty/crc32c_adler/example-dht.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
-  TODO describe example
-*/
-#define _GNU_SOURCE     /* random, srandom*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <fcntl.h>      /* open, close etc. */
-#include <string.h>     /* memcpy */
-#include <netinet/in.h> /* AF_INET, INET_ADDRSTRLEN etc. */
-#include <arpa/inet.h>  /* inet_ntop */
-
-#include "crc32c_adler.h"
-
-/* Convert id to hex string of formate used in BEP 42. */
-char id_hex_str[20*2+2+1]; /* 20 bytes x 2 characters + 2 x ' ' + '\0' */
-const char*
-id_to_hex(const unsigned char *id)
-{
-    //const char* hex_chr = "0123456789ABCDEF";
-    const char* hex_chr = "0123456789abcdef";
-    for(int i=0,j=0; i < 20 && j < sizeof(id_hex_str)-2; i++) {
-        id_hex_str[j++] = hex_chr[ (id[i]>>4) & 0x0F ];
-        id_hex_str[j++] = hex_chr[  id[i]     & 0x0F ];
-        if (i == 2 || i == 18) {
-            id_hex_str[j++] = ' ';
-        }
-    }
-    id_hex_str[sizeof(id_hex_str)-1] = '\0';
-    return id_hex_str;
-}
-
-/* Generate node ID from IP address + predefined rand using example algorithm
-   provided in BEP 42.
-
-   Parameters:
-   ip       IPv4 or IPv6 address (network byte order)
-   iplen    number of octets to consider in ip (4 or 8)
-   id       resulting node ID
-   rand     predefined random value */
-void crc32c_id(const uint8_t* ip, int iplen, uint8_t id[20], uint32_t rand)
-{
-    uint8_t v4_mask[] = { 0x03, 0x0f, 0x3f, 0xff };
-    uint8_t v6_mask[] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
-    uint8_t* mask = iplen == 4 ? v4_mask : v6_mask;
-
-    uint8_t ip_copy[8];
-    memcpy(ip_copy, ip, iplen);
-
-    for (int i = 0; i < iplen; ++i)
-            ip_copy[i] &= mask[i];
-
-    //uint32_t rand = random() & 0xff;
-    uint8_t r = rand & 0x7;
-    ip_copy[0] |= r << 5;
-
-    uint32_t crc = 0;
-    crc = crc32c(crc, ip_copy, iplen);
-
-    /* only take the top 21 bits from crc */
-    id[0] = (crc >> 24) & 0xff;
-    id[1] = (crc >> 16) & 0xff;
-    id[2] = ((crc >> 8) & 0xf8) | (random() & 0x7);
-    for (int i = 3; i < 19; ++i) id[i] = random();
-    id[19] = rand;
-}
-
-/* Find how many bits two ids have in common. */
-int common_bits(const unsigned char *id1, const unsigned char *id2)
-{
-    int i, j;
-    unsigned char xor;
-    for(i = 0; i < 20; i++) {
-        if(id1[i] != id2[i])
-            break;
-    }
-
-    if(i == 20)
-        return 160;
-
-    xor = id1[i] ^ id2[i];
-
-    j = 0;
-    while((xor & 0x80) == 0) {
-        xor <<= 1;
-        j++;
-    }
-
-    return 8 * i + j;
-}
-
-/* Check if a node ID is correct in the sense of BEP 42. */
-int check_id(const uint8_t id1[20], const uint8_t* ip, int iplen, uint32_t rand)
-{
-    /* Generate ID from IP + rand -> id2. */
-    uint8_t id2[20];
-    crc32c_id(ip, iplen, id2, rand);
-
-    /* Compare id1 with id2:
-       - the first 21 bits must match
-       - the last byte must match rand */
-    int cbits = common_bits(id1, id2);
-    if (cbits < 21) {
-        printf("Only the first %i bits match (expected: 21)\n", cbits);
-        return 0;
-    }
-    if (id1[19] != id2[19]) {
-        printf("Last byte does not match (expected: %u, got: %u)\n", id2[19], id1[19]);
-        return 0;
-    }
-    return 1;
-}
-
-/* Main. */
-int main(int argc, char **argv)
-{
-    (void)argc;
-    (void)argv;
-
-    /* Print which CRC32C algorithm is used. */
-    printf("\nUsing %s algorithm.\n\n", crc32c_hw_support() ? "hardware-accelerated (SSE 4.2)" : "software");
-
-    /* Seed random. */
-    int fd = open("/dev/urandom", O_RDONLY);
-    if(fd < 0) {
-        perror("open(random)");
-        exit(1);
-    }
-    unsigned seed;
-    read(fd, &seed, sizeof(seed));
-    srandom(seed);
-    close(fd);
-
-    /* Example IP/rand combinations as used in BEP 42. */
-    uint8_t ip[5][4] = {
-        { 124, 31, 75, 21 },
-        { 21, 75, 31, 124 },
-        { 65, 23, 51, 170 },
-        { 84, 124, 73, 14 },
-        { 43, 213, 53, 83 }
-    };
-    uint32_t rand[] = {
-        1,
-        86,
-        22,
-        65,
-        90
-    };
-    int iplen = 4;
-    uint8_t id[20];
-
-    printf("IP              rand  Node ID                                    Ok?\n");
-    printf("=============== ===== ========================================== ====\n");
-    for (int i = 0; i < 5; ++i) {
-        crc32c_id(ip[i], iplen, id, rand[i]);
-        char ipstr[INET_ADDRSTRLEN];
-        inet_ntop(AF_INET, ip[i], ipstr, sizeof(ipstr));
-        printf("%-15s  %2u   %s %s\n", ipstr, rand[i], id_to_hex(id), (check_id(id, ip[i], 4, rand[i]) ? "yes" : "no"));
-    }
-
-    return 0;
-}
diff --git a/3rdparty/crc32c_adler/example-stdin.c b/3rdparty/crc32c_adler/example-stdin.c
deleted file mode 100755
index d64fdb6a8a..0000000000
--- a/3rdparty/crc32c_adler/example-stdin.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-  TODO describe example
-*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <unistd.h>
-
-#include "crc32c_adler.h"
-
-#define SIZE (262144*3)
-#define CHUNK SIZE
-
-int main(int argc, char **argv)
-{
-    char *buf;
-    ssize_t got;
-    size_t off, n;
-    uint32_t crc;
-
-    (void)argv;
-    crc = 0;
-    buf = malloc(SIZE);
-    if (buf == NULL) {
-        fputs("out of memory", stderr);
-        return 1;
-    }
-    while ((got = read(0, buf, SIZE)) > 0) {
-        off = 0;
-        do {
-            n = (size_t)got - off;
-            if (n > CHUNK)
-                n = CHUNK;
-            crc = argc > 1 ? crc32c_sw(crc, buf + off, n) :
-                             crc32c(crc, buf + off, n);
-            off += n;
-        } while (off < (size_t)got);
-    }
-    free(buf);
-    if (got == -1) {
-        fputs("read error\n", stderr);
-        return 1;
-    }
-    printf("%08x\n", crc);
-    return 0;
-}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7839fd7e97..9f7200e25d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,6 +19,7 @@ if(NOT DEFINED CELLFRAME_MODULES)
 
     add_subdirectory(dap-sdk)
 
+    set(CELLFRAME_SDK_STANDALONE_BUILD ON)
 endif()
 
 message("Cellframe modules: ${CELLFRAME_MODULES}")
@@ -81,11 +82,6 @@ if (CELLFRAME_MODULES MATCHES "test-framework")
     set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_test)
 endif()
 
-add_subdirectory(3rdparty/crc32c_adler)             # https://github.com/fonic/crc32c_adler
-include_directories(3rdparty/crc32c_adler)
-set(CELLFRAME_LIBS ${CELLFRAME_LIBS} crc32c_adler)
-
-
 if (BUILD_WITH_ZIP)
     add_subdirectory(3rdparty/libzip)
     include_directories(3rdparty/libzip/lib)
diff --git a/dap-sdk b/dap-sdk
index 169b47e624..02a8df370b 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 169b47e624b08e3a5907c06d673ae41bb2338803
+Subproject commit 02a8df370be77507ea281fc19d8fcc49114e31f3
diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt
index 353f1a9b41..f5d8b8fd44 100644
--- a/modules/CMakeLists.txt
+++ b/modules/CMakeLists.txt
@@ -36,6 +36,11 @@ if (CELLFRAME_MODULES MATCHES "srv")
     add_subdirectory(channel/chain-net-srv)
 endif()
 
+# No consensus
+if (CELLFRAME_MODULES MATCHES "cs-none")
+    add_subdirectory(type/none)
+endif()
+
 # Consensus type dag
 if (CELLFRAME_MODULES MATCHES "cs-dag-")
     add_subdirectory(type/dag)
@@ -76,11 +81,6 @@ if (CELLFRAME_MODULES MATCHES "cs-block-pow")
     add_subdirectory(consensus/block-pow)
 endif()
 
-# No consensus
-if (CELLFRAME_MODULES MATCHES "cs-none")
-    add_subdirectory(consensus/none)
-endif()
-
 # Service App
 if (CELLFRAME_MODULES MATCHES "srv-app")
     add_subdirectory(service/app)
diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index f13ddb8e6c..31b5d86b14 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -30,7 +30,6 @@
 #include "dap_chain_common.h"
 #include "dap_chain_datum.h"
 #include "dap_chain_datum_decree.h"
-#include "dap_chain_pvt.h"
 #include "dap_common.h"
 #include "dap_strfuncs.h"
 #include "dap_file_utils.h"
@@ -38,7 +37,7 @@
 #include "dap_chain.h"
 #include "dap_chain_ledger.h"
 #include "dap_cert.h"
-#include "dap_chain_ledger.h"
+#include "dap_chain_cell.h"
 #include "dap_chain_cs.h"
 #include "dap_cert_file.h"
 #include <uthash.h>
@@ -117,12 +116,20 @@ dap_chain_t *dap_chain_create(const char *a_chain_net_name, const char *a_chain_
             .cell_rwlock    = PTHREAD_RWLOCK_INITIALIZER,
             .atom_notifiers = NULL
     };
-    DAP_CHAIN_PVT_LOCAL_NEW(l_ret);
-
+    dap_chain_pvt_t *l_chain_pvt = DAP_NEW_Z(dap_chain_pvt_t);
+    if (!l_chain_pvt) {
+        DAP_DEL_Z(l_ret->name);
+        DAP_DEL_Z(l_ret->net_name);
+        DAP_DELETE(l_ret);
+        log_it(L_CRITICAL, "Memory allocation error");
+        return NULL;
+    }
+    l_ret->_pvt = l_chain_pvt;
     dap_chain_item_t *l_ret_item = DAP_NEW_Z(dap_chain_item_t);
     if (!l_ret_item) {
-        DAP_DELETE(l_ret->name);
-        DAP_DELETE(l_ret->net_name);
+        DAP_DEL_Z(l_ret->name);
+        DAP_DEL_Z(l_ret->net_name);
+        DAP_DELETE(l_ret->_pvt);
         DAP_DELETE(l_ret);
         log_it(L_CRITICAL, "Memory allocation error");
         return NULL;
@@ -779,3 +786,15 @@ int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name)
 const char* dap_chain_get_path(dap_chain_t *a_chain){
     return DAP_CHAIN_PVT(a_chain)->file_storage_dir;
 }
+
+void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg)
+{
+    dap_chain_gdb_notifier_t *l_notifier = DAP_NEW(dap_chain_gdb_notifier_t);
+    if (!l_notifier) {
+        log_it(L_CRITICAL, "Memory allocation error");
+        return;
+    }
+    l_notifier->callback = a_callback;
+    l_notifier->cb_arg = a_cb_arg;
+    DAP_CHAIN_PVT(a_chain)->mempool_notifires = dap_list_append(DAP_CHAIN_PVT(a_chain)->mempool_notifires, l_notifier);
+}
diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c
index 290f4d9a0e..22b9da7680 100644
--- a/modules/chain/dap_chain_cell.c
+++ b/modules/chain/dap_chain_cell.c
@@ -26,7 +26,6 @@
 #include "dap_chain.h"
 #include "dap_chain_cell.h"
 #include "dap_chain_cs.h"
-#include "dap_chain_pvt.h"
 #include "dap_common.h"
 #include "dap_config.h"
 #include "dap_strfuncs.h"
diff --git a/modules/chain/dap_chain_cs.c b/modules/chain/dap_chain_cs.c
index c3c4c9bd11..4780e60b82 100644
--- a/modules/chain/dap_chain_cs.c
+++ b/modules/chain/dap_chain_cs.c
@@ -26,7 +26,6 @@
 #include "uthash.h"
 #include "utlist.h"
 #include "dap_chain_cs.h"
-#include "dap_chain_pvt.h"
 
 #define LOG_TAG "dap_chain_cs"
 
@@ -81,18 +80,13 @@ void dap_chain_cs_type_add (const char * a_cs_str,  dap_chain_callback_new_cfg_t
  * @param a_chain_cfg
  * @return
  */
-int dap_chain_cs_type_create(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
+int dap_chain_cs_type_create(const char *a_type, dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 {
     dap_chain_callback_new_cfg_item_t *l_item = NULL;
-
-    HASH_FIND_STR(s_class_callbacks,dap_config_get_item_str( a_chain_cfg, "chain", "consensus"), l_item );
-    if ( l_item ) {
-        l_item->callback_init( a_chain, a_chain_cfg);
-        // TODO
-        return 0;
-    } else {
-        return -1;
-    }
+    HASH_FIND_STR(s_class_callbacks, a_type, l_item);
+    if (l_item && l_item->callback_init)
+        return l_item->callback_init(a_chain, a_chain_cfg);
+    return -1;
 }
 
 
@@ -130,9 +124,10 @@ int dap_chain_cs_create(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     const char *l_consensus = dap_config_get_item_str( a_chain_cfg, "chain", "consensus");
     if(l_consensus)
         HASH_FIND_STR(s_cs_callbacks, l_consensus, l_item );
-    if ( l_item ) {
+    if (l_item) {
         log_it(L_NOTICE,"Consensus \"%s\" found, prepare to parse config file",l_item->name );
-        l_item->callback_init( a_chain, a_chain_cfg);
+        if (l_item->callback_init)
+            l_item->callback_init(a_chain, a_chain_cfg);
         DAP_CHAIN_PVT(a_chain)->cs_name = l_item->name;
         return 0;
     } else {
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index b4d014e3f6..5f8a2aa8a8 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -38,6 +38,7 @@
 #include "utlist.h"
 
 #include "dap_chain_common.h"
+#include "dap_chain_datum.h"
 #include "dap_events.h"
 #include "dap_math_ops.h"
 #include "dap_list.h"
@@ -52,7 +53,6 @@
 #include "dap_chain_datum_token.h"
 #include "dap_global_db.h"
 #include "dap_chain_ledger.h"
-#include "dap_chain_pvt.h"
 #include "json.h"
 #include "json_object.h"
 #include "dap_notify_srv.h"
@@ -2055,7 +2055,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger)
                 ||	(l_token_item->type != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC)) {
             char *l_balance_cur = dap_chain_balance_print(l_token_item->current_supply);
             char *l_balance_total = dap_chain_balance_print(l_token_item->total_supply);
-            s_datum_token_dump_tsd(l_str_tmp, l_token_item->datum_token, l_token_item->datum_token_size, "hex");
+            dap_chain_datum_token_dump_tsd(l_str_tmp, l_token_item->datum_token, l_token_item->datum_token_size, "hex");
             size_t l_certs_field_size = l_token_item->datum_token_size - sizeof(*l_token_item->datum_token) - l_token_item->datum_token->header_native_decl.tsd_total_size;
             dap_chain_datum_token_certs_dump(l_str_tmp, l_token_item->datum_token->data_n_tsd + l_token_item->datum_token->header_native_decl.tsd_total_size,
                                          l_certs_field_size, "hex");
@@ -2232,7 +2232,7 @@ static void s_threshold_emission_free(dap_ledger_t *a_ledger){
  * @param a_values
  * @param a_arg
  */
-static bool s_load_cache_gdb_loaded_balances_callback(dap_global_db_context_t *a_global_db_context,
+static bool s_load_cache_gdb_loaded_balances_callback(dap_global_db_instance_t *a_dbi,
                                                       int a_rc, const char *a_group,
                                                       const size_t a_values_total, const size_t a_values_count,
                                                       dap_global_db_obj_t *a_values, void *a_arg)
@@ -2283,7 +2283,7 @@ static bool s_load_cache_gdb_loaded_balances_callback(dap_global_db_context_t *a
  * @param a_values
  * @param a_arg
  */
-static bool s_load_cache_gdb_loaded_spent_txs_callback(dap_global_db_context_t *a_global_db_context,
+static bool s_load_cache_gdb_loaded_spent_txs_callback(dap_global_db_instance_t *a_dbi,
                                                        int a_rc, const char *a_group,
                                                        const size_t a_values_total, const size_t a_values_count,
                                                        dap_global_db_obj_t *a_values, void *a_arg)
@@ -2320,7 +2320,7 @@ static bool s_load_cache_gdb_loaded_spent_txs_callback(dap_global_db_context_t *
  * @param a_values
  * @param a_arg
  */
-static bool s_load_cache_gdb_loaded_txs_callback(dap_global_db_context_t *a_global_db_context,
+static bool s_load_cache_gdb_loaded_txs_callback(dap_global_db_instance_t *a_dbi,
                                                  int a_rc, const char *a_group,
                                                  const size_t a_values_total, const size_t a_values_count,
                                                  dap_global_db_obj_t *a_values, void *a_arg)
@@ -2352,7 +2352,7 @@ static bool s_load_cache_gdb_loaded_txs_callback(dap_global_db_context_t *a_glob
     return true;
 }
 
-static bool s_load_cache_gdb_loaded_stake_lock_callback(dap_global_db_context_t *a_global_db_context,
+static bool s_load_cache_gdb_loaded_stake_lock_callback(dap_global_db_instance_t *a_dbi,
                                                         int a_rc, const char *a_group,
                                                         const size_t a_values_total, const size_t a_values_count,
                                                         dap_global_db_obj_t *a_values, void *a_arg)
@@ -2393,7 +2393,7 @@ static bool s_load_cache_gdb_loaded_stake_lock_callback(dap_global_db_context_t
  * @param a_arg
  * @return Always true thats means to clear up a_values
  */
-static bool s_load_cache_gdb_loaded_emissions_callback(dap_global_db_context_t *a_global_db_context,
+static bool s_load_cache_gdb_loaded_emissions_callback(dap_global_db_instance_t *a_dbi,
                                                        int a_rc, const char *a_group,
                                                        const size_t a_values_total, const size_t a_values_count,
                                                        dap_global_db_obj_t *a_values, void *a_arg)
@@ -2445,7 +2445,7 @@ static bool s_load_cache_gdb_loaded_emissions_callback(dap_global_db_context_t *
  * @param a_values
  * @param a_arg
  */
-static bool s_load_cache_gdb_loaded_tokens_callback(dap_global_db_context_t *a_global_db_context,
+static bool s_load_cache_gdb_loaded_tokens_callback(dap_global_db_instance_t *a_dbi,
                                                     int a_rc, const char *a_group,
                                                     const size_t a_values_total, const size_t a_values_count,
                                                     dap_global_db_obj_t *a_values, void *a_arg)
@@ -3505,10 +3505,10 @@ bool s_tx_match_sign(dap_chain_datum_token_emission_t *a_datum_emission, dap_cha
     return false;
 }
 
-static int s_callback_sign_compare(const void *a_list_elem, const void *a_sign_elem)
+static int s_callback_sign_compare(dap_list_t *a_list_elem, dap_list_t *a_sign_elem)
 {
-    dap_pkey_t* l_key = (dap_pkey_t*)((dap_list_t*)a_list_elem)->data;
-    dap_sign_t* l_sign = (dap_sign_t*)((dap_list_t*)a_sign_elem)->data;
+    dap_pkey_t *l_key = (dap_pkey_t *)a_list_elem->data;
+    dap_sign_t *l_sign = (dap_sign_t *)a_sign_elem->data;
     if (!l_key || !l_sign) {
         log_it(L_CRITICAL, "Invalid argument");
         return -1;
@@ -4610,7 +4610,7 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d
                     .value      = l_tx_cache,
                     .value_len  = l_tx_cache_sz,
                     .group      = l_ledger_cache_group,
-                    .type       = DAP_DB$K_OPTYPE_ADD
+                    .type       = DAP_GLOBAL_DB_OPTYPE_ADD
             };
             l_cache_used_outs[i].timestamp = dap_nanotime_now();
         }
@@ -4789,7 +4789,7 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d
                 .value      = l_tx_cache,
                 .value_len  = l_tx_cache_sz,
                 .group      = l_ledger_cache_group,
-                .type       = DAP_DB$K_OPTYPE_ADD
+                .type       = DAP_GLOBAL_DB_OPTYPE_ADD
         };
         l_cache_used_outs[0].timestamp = dap_nanotime_now();
         // Apply it with single DB transaction
diff --git a/modules/chain/dap_chain_pvt.c b/modules/chain/dap_chain_pvt.c
deleted file mode 100644
index 0eb4618032..0000000000
--- a/modules/chain/dap_chain_pvt.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Authors:
- * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
- * DeM Labs Inc.   https://demlabs.net    https:/gitlab.com/demlabs
- * Kelvin Project https://github.com/kelvinblockchain
- * Copyright  (c) 2017-2018
- * All rights reserved.
-
- This file is part of DAP (Deus Applications Prototypes) the open source project
-
-    DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    DAP is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
-*/
-#include <stdio.h>
-#include <sys/types.h>
-#include <dirent.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "dap_chain_pvt.h"
-
-
-#define LOG_TAG "dap_chain_pvt"
-
-
-void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg)
-{
-    dap_chain_gdb_notifier_t *l_notifier = DAP_NEW(dap_chain_gdb_notifier_t);
-    if (!l_notifier) {
-        log_it(L_CRITICAL, "Memory allocation error");
-        return;
-    }
-    l_notifier->callback = a_callback;
-    l_notifier->cb_arg = a_cb_arg;
-    DAP_CHAIN_PVT(a_chain)->mempool_notifires = dap_list_append(DAP_CHAIN_PVT(a_chain)->mempool_notifires, l_notifier);
-}
-
-/**
- * @brief Sets the last hash of a remote node.
- *
- * @param a_node_addr a node adress
- * @param a_chain a pointer to the chain stucture
- * @param a_hash a
- * @return true
- * @return false
- */
-bool dap_chain_db_set_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_hash)
-{
-    char l_key[DAP_GLOBAL_DB_KEY_MAX];
-
-    snprintf(l_key, sizeof(l_key) - 1, "%"DAP_UINT64_FORMAT_U"%s%s", a_node_addr, a_chain->net_name, a_chain->name);
-    return dap_global_db_set(GROUP_LOCAL_NODE_LAST_ID, l_key, a_hash, sizeof(dap_chain_hash_fast_t), false, NULL, NULL ) == 0;
-}
-
-/**
- * @brief Gets the last hash of a remote node.
- *
- * @param a_node_addr a node adress
- * @param a_chain a pointer to a chain structure
- * @return Returns a hash if successful.
- */
-dap_chain_hash_fast_t *dap_chain_db_get_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain)
-{
-    char l_key[DAP_GLOBAL_DB_KEY_MAX];
-
-    snprintf(l_key, sizeof(l_key) - 1, "%"DAP_UINT64_FORMAT_U"%s%s", a_node_addr, a_chain->net_name, a_chain->name);
-    return (dap_chain_hash_fast_t *)dap_global_db_get_sync(GROUP_LOCAL_NODE_LAST_ID, l_key, NULL, NULL, NULL);
-}
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index 490c9fb689..faaae495e2 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -31,6 +31,7 @@
 #include "dap_chain_datum.h"
 #include "dap_chain_datum_tx.h"
 #include "dap_cert.h"
+#include "dap_global_db_cluster.h"
 
 typedef struct dap_chain dap_chain_t;
 
@@ -220,6 +221,24 @@ typedef struct dap_chain_atom_notifier {
     void *arg;
 } dap_chain_atom_notifier_t;
 
+typedef struct dap_chain_gdb_notifier {
+    dap_store_obj_callback_notify_t callback;
+    void *cb_arg;
+} dap_chain_gdb_notifier_t;
+
+typedef struct dap_chain_pvt
+{
+    dap_chain_t * chain;
+    char * file_storage_dir;
+    char * cs_name;
+    bool cs_started;
+    int celled;
+    dap_list_t *mempool_notifires;
+    bool need_reorder;
+} dap_chain_pvt_t;
+
+#define DAP_CHAIN_PVT(a) ((dap_chain_pvt_t *)a->_pvt)
+
 #define DAP_CHAIN(a) ( (dap_chain_t *) (a)->_inheritor)
 
 DAP_STATIC_INLINE int dap_chain_id_parse(const char *a_id_str, dap_chain_id_t *a_id)
@@ -253,3 +272,4 @@ bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_
 ssize_t dap_chain_atom_save(dap_chain_t *a_chain, const uint8_t *a_atom, size_t a_atom_size, dap_chain_cell_id_t a_cell_id);
 int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name);
 const char* dap_chain_get_path(dap_chain_t *a_chain);
+void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg);
diff --git a/modules/chain/include/dap_chain_cs.h b/modules/chain/include/dap_chain_cs.h
index f76d443f57..e29a870cc3 100644
--- a/modules/chain/include/dap_chain_cs.h
+++ b/modules/chain/include/dap_chain_cs.h
@@ -40,4 +40,4 @@ void dap_chain_cs_add (const char * a_cs_str,  dap_chain_callback_new_cfg_t a_ca
 int dap_chain_cs_create(dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
 
 void dap_chain_cs_type_add (const char * a_cs_str,  dap_chain_callback_new_cfg_t a_callback_init);
-int dap_chain_cs_type_create(dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
+int dap_chain_cs_type_create(const char *a_type, dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
diff --git a/modules/chain/include/dap_chain_pvt.h b/modules/chain/include/dap_chain_pvt.h
deleted file mode 100644
index 2bc3430154..0000000000
--- a/modules/chain/include/dap_chain_pvt.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Authors:
- * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
- * DeM Labs Inc.   https://demlabs.net    https:/gitlab.com/demlabs
- * Kelvin Project https://github.com/kelvinblockchain
- * Copyright  (c) 2017-2018
- * All rights reserved.
-
- This file is part of DAP (Deus Applications Prototypes) the open source project
-
-    DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    DAP is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
-*/
-#pragma once
-#include <stdio.h>
-#include <stdint.h>
-#include "dap_chain.h"
-#include "dap_chain_cs.h"
-#include "dap_chain_cell.h"
-#include "dap_common.h"
-#include "dap_global_db_remote.h"
-
-/**
-  * @struct dap_chain_pvt
-  * @brief Internal blochain data, mostly aggregated
-  *
-  */
-typedef struct dap_chain_pvt
-{
-    dap_chain_t * chain;
-    char * file_storage_dir;
-    char * cs_name;
-    bool cs_started;
-    int celled;
-    dap_list_t *mempool_notifires;
-    bool need_reorder;
-} dap_chain_pvt_t;
-
-typedef struct dap_chain_gdb_notifier {
-    dap_store_obj_callback_notify_t callback;
-    void *cb_arg;
-} dap_chain_gdb_notifier_t;
-
-void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg);
-bool dap_chain_db_set_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_hash);
-dap_chain_hash_fast_t *dap_chain_db_get_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain);
-
-#define DAP_CHAIN_PVT(a) ((dap_chain_pvt_t *) a->_pvt  )
-
-#define DAP_CHAIN_PVT_LOCAL(a) dap_chain_pvt_t * l_chain_pvt = DAP_CHAIN_PVT(a)
-
-#define DAP_CHAIN_PVT_LOCAL_NEW(a) dap_chain_pvt_t * l_chain_pvt = DAP_NEW_Z(dap_chain_pvt_t); a->_pvt = l_chain_pvt
diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
index 4f5c08e3b4..fc4c89d08e 100644
--- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
+++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
@@ -1039,7 +1039,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
         }
         l_request->err_code = 0;
 
-        strncpy(l_request->ip_send, a_ch->stream->esocket->hostaddr, INET_ADDRSTRLEN - 1);
+        strncpy(l_request->ip_send, a_ch->stream->esocket->remote_addr_str, INET_ADDRSTRLEN - 1);
         l_request->ip_send[INET_ADDRSTRLEN - 1] = '\0'; // Compiler warning escape
         l_request->recv_time2 = dap_nanotime_now();
 
diff --git a/modules/channel/chain-net/dap_stream_ch_chain_net.c b/modules/channel/chain-net/dap_stream_ch_chain_net.c
index 4c48527ab9..852e1daa3d 100644
--- a/modules/channel/chain-net/dap_stream_ch_chain_net.c
+++ b/modules/channel/chain-net/dap_stream_ch_chain_net.c
@@ -47,7 +47,6 @@
 #include "uthash.h"
 #include "dap_http_client.h"
 #include "dap_global_db.h"
-#include "dap_global_db_remote.h"
 #include "dap_stream.h"
 #include "dap_stream_ch_pkt.h"
 #include "dap_stream_ch_proc.h"
@@ -63,68 +62,6 @@ static void s_stream_ch_delete(dap_stream_ch_t* ch, void* arg);
 static void s_stream_ch_packet_in(dap_stream_ch_t* ch, void* arg);
 static void s_stream_ch_packet_out(dap_stream_ch_t* ch, void* arg);
 
-typedef struct dap_chain_net_session_data {
-    uint32_t session_id;
-    dap_chain_node_addr_t addr_remote;
-    UT_hash_handle hh;
-} dap_chain_net_session_data_t;
-
-// list of active sessions
-static dap_chain_net_session_data_t *s_chain_net_data = NULL;
-// for separate access to session_data_t
-static pthread_mutex_t s_hash_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-
-static dap_chain_net_session_data_t* session_data_find(uint32_t a_id)
-{
-    dap_chain_net_session_data_t *l_sdata;
-    pthread_mutex_lock(&s_hash_mutex);
-    HASH_FIND(hh, s_chain_net_data, &a_id, sizeof(uint32_t), l_sdata);
-    pthread_mutex_unlock(&s_hash_mutex);
-    return l_sdata;
-}
-
-static void session_data_del(uint32_t a_id)
-{
-    dap_chain_net_session_data_t *l_sdata;
-    pthread_mutex_lock(&s_hash_mutex);
-    HASH_FIND(hh, s_chain_net_data, &a_id, sizeof(uint32_t), l_sdata);
-    if(l_sdata) {
-        // Clang bug at this, l_sdata should change at every loop cycle
-        HASH_DEL(s_chain_net_data, l_sdata);
-        DAP_DELETE(l_sdata);
-    }
-    pthread_mutex_unlock(&s_hash_mutex);
-}
-
-static void session_data_del_all()
-{
-    dap_chain_net_session_data_t *l_sdata, *l_sdata_tmp;
-    pthread_mutex_lock(&s_hash_mutex);
-    HASH_ITER(hh, s_chain_net_data , l_sdata, l_sdata_tmp)
-    {
-        HASH_DEL(s_chain_net_data, l_sdata);
-        DAP_DELETE(l_sdata);
-    }
-    //HASH_CLEAR(hh,s_chain_net_data);
-    pthread_mutex_unlock(&s_hash_mutex);
-}
-
-
-
-dap_chain_node_addr_t dap_stream_ch_chain_net_from_session_data_extract_node_addr(uint32_t a_session_id) {
-    dap_chain_node_addr_t l_addr= {0};
-    dap_chain_net_session_data_t *l_sdata, *l_sdata_tmp;
-    pthread_mutex_lock(&s_hash_mutex);
-    HASH_ITER(hh, s_chain_net_data , l_sdata, l_sdata_tmp) {
-        if (l_sdata->session_id == a_session_id) {
-            l_addr = l_sdata->addr_remote;
-        }
-    }
-    pthread_mutex_unlock(&s_hash_mutex);
-    return l_addr;
-}
-
 /**
  * @brief dap_stream_ch_chain_net_init
  * @return always 0
@@ -143,8 +80,6 @@ int dap_stream_ch_chain_net_init()
  */
 void dap_stream_ch_chain_net_deinit()
 {
-    //printf("* del all sessions\n");
-    session_data_del_all();
 }
 
 /**
@@ -159,22 +94,6 @@ void s_stream_ch_new(dap_stream_ch_t* a_ch, void* a_arg)
     dap_stream_ch_chain_net_t * l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(a_ch);
     l_ch_chain_net->ch = a_ch;
     pthread_mutex_init(&l_ch_chain_net->mutex, NULL);
-
-    // Create chain net session ever it created
-    dap_chain_net_session_data_t *l_sdata;
-    pthread_mutex_lock(&s_hash_mutex);
-    HASH_FIND(hh, s_chain_net_data, &a_ch->stream->session->id, sizeof(uint32_t), l_sdata);
-    if(l_sdata == NULL) {
-        l_sdata = DAP_NEW_Z(dap_chain_net_session_data_t);
-        if (!l_sdata) {
-            log_it(L_CRITICAL, "Memory allocation error");
-            pthread_mutex_unlock(&s_hash_mutex);
-            return;
-        }
-        l_sdata->session_id = a_ch->stream->session->id;
-        HASH_ADD(hh, s_chain_net_data, session_id, sizeof(uint32_t), l_sdata);
-    }
-    pthread_mutex_unlock(&s_hash_mutex);
 }
 
 /**
@@ -185,12 +104,6 @@ void s_stream_ch_new(dap_stream_ch_t* a_ch, void* a_arg)
 void s_stream_ch_delete(dap_stream_ch_t* a_ch, void* a_arg)
 {
     (void) a_arg;
-    dap_stream_ch_chain_net_t * l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(a_ch);
-    if(l_ch_chain_net) {
-        pthread_mutex_lock(&l_ch_chain_net->mutex);
-        session_data_del(a_ch->stream->session->id);
-        pthread_mutex_unlock(&l_ch_chain_net->mutex);
-    }
     DAP_DEL_Z(a_ch->internal);
 }
 
@@ -202,13 +115,6 @@ void s_stream_ch_delete(dap_stream_ch_t* a_ch, void* a_arg)
 void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
 {
     dap_stream_ch_chain_net_t * l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(a_ch);
-    dap_chain_net_session_data_t *l_session_data = session_data_find(a_ch->stream->session->id);
-    if (l_session_data == NULL) {
-        log_it(L_ERROR, "Can't find chain net session for stream session %d", a_ch->stream->session->id);
-        dap_stream_ch_set_ready_to_write_unsafe(a_ch, false);
-        return;
-    }
-
     if(l_ch_chain_net) {
         pthread_mutex_lock(&l_ch_chain_net->mutex);
         dap_stream_ch_pkt_t *l_ch_pkt = (dap_stream_ch_pkt_t *)a_arg;
@@ -246,169 +152,109 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         if (!l_error && l_ch_chain_net_pkt) {
             size_t l_ch_chain_net_pkt_data_size = l_ch_pkt->hdr.data_size - sizeof(dap_stream_ch_chain_net_pkt_hdr_t);
             switch (l_ch_pkt->hdr.type) {
-                    // received ping request - > send pong request
-                case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING: {
-                    //log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_PING");
-                    dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG,
-                                                      l_ch_chain_net_pkt->hdr.net_id,NULL, 0);
-                    dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
-                }
-                    break;
-                    // receive pong request -> send nothing
-                case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG: {
-                    //log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_PONG");
-                    dap_stream_ch_set_ready_to_write_unsafe(a_ch, false);
-                }
+            case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE:
+                assert(dap_stream_node_addr_not_null(&a_ch->stream->node));
+                dap_chain_net_add_cluster_link(l_net, &a_ch->stream->node);
+                break;
+                // received ping request - > send pong request
+            case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING:
+                //log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_PING");
+                dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG,
+                                                  l_ch_chain_net_pkt->hdr.net_id,NULL, 0);
+                dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
+                break;
+                // receive pong request -> send nothing
+            case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG:
+                //log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_PONG");
+                dap_stream_ch_set_ready_to_write_unsafe(a_ch, false);
                 break;
-                case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR: {
-                    log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_ADDR");
-                    if ( l_ch_chain_net_pkt_data_size == sizeof (dap_chain_node_addr_t) ) {
-                        dap_chain_node_addr_t * l_addr = (dap_chain_node_addr_t *) l_ch_chain_net_pkt->data;
-                        if(l_session_data)
-                            memcpy( &l_session_data->addr_remote,l_addr,sizeof (*l_addr) );
-                        log_it(L_NOTICE,"Accepted remote node addr 0x%016"DAP_UINT64_FORMAT_X, l_addr->uint64);
-                    }else {
-                        log_it(L_WARNING,"Wrong data secion size %zu",l_ch_chain_net_pkt_data_size);
-                    }
-                    dap_stream_ch_set_ready_to_write_unsafe(a_ch, false);
-                }break;
-                case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE: {
-                    log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE");
-                    if ( l_ch_chain_net_pkt_data_size == sizeof (dap_chain_node_addr_t) ) {
-                        dap_chain_node_addr_t * l_addr = (dap_chain_node_addr_t *) l_ch_chain_net_pkt->data;
-                        log_it(L_NOTICE,"Leased new node addr 0x%016"DAP_UINT64_FORMAT_X,l_addr->uint64);
-                        dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id );
-                        if ( l_net == NULL){
-                            char l_err_str[]="ERROR_NET_INVALID_ID";
-                            dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR ,
-                                                              l_ch_chain_net_pkt->hdr.net_id, l_err_str,sizeof (l_err_str));
-                            dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
-                            log_it(L_ERROR, "Invalid net id in packet");
-                        } else {
-                            if (dap_db_set_cur_node_addr_exp( l_addr->uint64, l_net->pub.name ))
-                                log_it(L_NOTICE,"Set up cur node address 0x%016"DAP_UINT64_FORMAT_X,l_addr->uint64);
-                            else
-                                log_it(L_ERROR,"Can't set up cur node address 0x%016"DAP_UINT64_FORMAT_X,l_addr->uint64);
-                        }
-                        if(l_session_data)
-                            memcpy( &l_session_data->addr_remote,l_addr,sizeof (*l_addr) );
-                    }else {
-                        log_it(L_WARNING,"Wrong data secion size %zu",l_ch_chain_net_pkt_data_size);
-                    }
-                    dap_stream_ch_set_ready_to_write_unsafe(a_ch, false);
-                }break;
-                // get current node address
-                case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST: {
-                    log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST");
-                    // get cur node addr
-                    dap_chain_net_t *l_net = dap_chain_net_by_id(l_ch_chain_net_pkt->hdr.net_id);
-                    uint64_t l_addr = l_net ? dap_chain_net_get_cur_node_addr_gdb_sync(l_net->pub.name) : 0;
-                    size_t l_send_data_len = sizeof(uint64_t);
-                    // send cur node addr
-                    dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR,
-                                                      l_ch_chain_net_pkt->hdr.net_id, &l_addr, l_send_data_len);
-                    dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
-                } break;
-                case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST: {
-                    log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST");
-                    // gen node addr
-                    dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id );
-                    if ( l_net == NULL){
-                        char l_err_str[]="ERROR_NET_INVALID_ID";
-                        dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR , l_ch_chain_net_pkt->hdr.net_id,
-                                                          l_err_str,sizeof (l_err_str));
-                        dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
-                    } else {
-                        dap_chain_node_addr_t *l_addr_new = dap_chain_node_gen_addr(l_net->pub.id);
-                        dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE ,
-                                                         l_ch_chain_net_pkt->hdr.net_id, l_addr_new, sizeof (*l_addr_new));
-                        dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
-                        if(l_session_data)
-                            memcpy( &l_session_data->addr_remote,l_addr_new,sizeof (*l_addr_new) );
-                        DAP_DELETE(l_addr_new);
-                    }
-                } break;
-                case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST:{
-                    log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST");
-                    dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id );
-                    if ( l_net == NULL){
-                        char l_err_str[]="ERROR_NET_INVALID_ID";
-                        dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR ,
-                                                          l_ch_chain_net_pkt->hdr.net_id, l_err_str,sizeof (l_err_str));
-                        dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
-                        log_it(L_ERROR, "Invalid net id in packet");
-                    } else {
-                        dap_chain_net_srv_order_t * l_orders = NULL;
-                        dap_enc_key_t * enc_key_pvt = NULL;
-                        dap_chain_t *l_chain = NULL;
-                        DL_FOREACH(l_net->pub.chains, l_chain)
-                            if(l_chain->callback_get_signing_certificate != NULL){
-                                enc_key_pvt = l_chain->callback_get_signing_certificate(l_chain);
-                                if(enc_key_pvt)
-                                    break;
-                            }
-                        dap_sign_t *l_sign = NULL;
-                        size_t sign_s = 0;
-                        size_t l_orders_num = 0;
-                        dap_stream_ch_chain_validator_test_t *send = NULL;
-                        dap_chain_net_srv_price_unit_uid_t l_price_unit = { { 0 } };
-                        dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID };
-                        uint256_t l_price_min = {};
-                        uint256_t l_price_max = {};
-                        uint8_t flags = 0;
 
-                        if(enc_key_pvt)
+            case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST:{
+                log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST");
+                dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id );
+                if ( l_net == NULL){
+                    char l_err_str[]="ERROR_NET_INVALID_ID";
+                    dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR ,
+                                                      l_ch_chain_net_pkt->hdr.net_id, l_err_str,sizeof (l_err_str));
+                    dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
+                    log_it(L_ERROR, "Invalid net id in packet");
+                } else {
+                    dap_chain_net_srv_order_t * l_orders = NULL;
+                    dap_enc_key_t * enc_key_pvt = NULL;
+                    dap_chain_t *l_chain = NULL;
+                    DL_FOREACH(l_net->pub.chains, l_chain)
+                        if(l_chain->callback_get_signing_certificate != NULL){
+                            enc_key_pvt = l_chain->callback_get_signing_certificate(l_chain);
+                            if(enc_key_pvt)
+                                break;
+                        }
+                    dap_sign_t *l_sign = NULL;
+                    size_t sign_s = 0;
+                    size_t l_orders_num = 0;
+                    dap_stream_ch_chain_validator_test_t *send = NULL;
+                    dap_chain_net_srv_price_unit_uid_t l_price_unit = { { 0 } };
+                    dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID };
+                    uint256_t l_price_min = {};
+                    uint256_t l_price_max = {};
+                    uint8_t flags = 0;
+
+                    if(enc_key_pvt)
+                    {
+                        flags = flags | F_CERT;//faund sert
+                        l_sign = dap_sign_create(enc_key_pvt, (uint8_t*)l_ch_chain_net_pkt->data,
+                                               l_ch_chain_net_pkt_data_size, 0);
+                        if(l_sign)
                         {
-                            flags = flags | F_CERT;//faund sert
-                            l_sign = dap_sign_create(enc_key_pvt, (uint8_t*)l_ch_chain_net_pkt->data,
-                                                   l_ch_chain_net_pkt_data_size, 0);
-                            if(l_sign)
-                            {
-                                sign_s = dap_sign_get_size(l_sign);
-                                flags = flags | D_SIGN;//data signed
-                            }
-                            else
-                                flags = flags & ~D_SIGN;//data doesn't sign
+                            sign_s = dap_sign_get_size(l_sign);
+                            flags = flags | D_SIGN;//data signed
                         }
                         else
-                            flags = flags & ~F_CERT;//Specified certificate not found
+                            flags = flags & ~D_SIGN;//data doesn't sign
+                    }
+                    else
+                        flags = flags & ~F_CERT;//Specified certificate not found
 
-                        send = DAP_NEW_Z_SIZE(dap_stream_ch_chain_validator_test_t, sizeof(dap_stream_ch_chain_validator_test_t) + sign_s);
+                    send = DAP_NEW_Z_SIZE(dap_stream_ch_chain_validator_test_t, sizeof(dap_stream_ch_chain_validator_test_t) + sign_s);
 #ifdef DAP_VERSION
-                        strncpy((char *)send->header.version, (char *)DAP_VERSION, sizeof(send->header.version));
+                    strncpy((char *)send->header.version, (char *)DAP_VERSION, sizeof(send->header.version));
 #endif
-                        send->header.sign_size = sign_s;
-                        //strncpy(send->header.data,(uint8_t*)l_ch_chain_net_pkt->data,10);
-                        flags = (l_net->pub.mempool_autoproc) ? flags | A_PROC : flags & ~A_PROC;
+                    send->header.sign_size = sign_s;
+                    //strncpy(send->header.data,(uint8_t*)l_ch_chain_net_pkt->data,10);
+                    flags = (l_net->pub.mempool_autoproc) ? flags | A_PROC : flags & ~A_PROC;
+
+                    dap_chain_net_srv_order_find_all_by(l_net,SERV_DIR_UNDEFINED,l_uid,
+                                                       l_price_unit,NULL,l_price_min,l_price_max,&l_orders,&l_orders_num);
+                    flags = l_orders_num ? flags | F_ORDR : flags & ~F_ORDR;
+                    bool auto_online = dap_config_get_item_bool_default( g_config, "general", "auto_online", false );
+                    bool auto_update = false;
+                    if((system("systemctl status cellframe-updater.service") == 768) && (system("systemctl status cellframe-updater.timer") == 0))
+                        auto_update = true;
+                    else
+                        auto_update = false;
+                    flags = auto_online ? flags | A_ONLN : flags & ~A_ONLN;
+                    flags = auto_update ? flags | A_UPDT : flags & ~A_UPDT;
+                    send->header.flags = flags;
+                    //add sign
+                    if(sign_s)
+                        memcpy(send->sign,l_sign,sign_s);
+                    dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY ,
+                                                     l_ch_chain_net_pkt->hdr.net_id, send, sizeof(dap_stream_ch_chain_validator_test_t) + sign_s);
+                    dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
+                    if(l_sign)
+                        DAP_DELETE(l_sign);
+                    DAP_DELETE(send);
+                }
+            } break;
 
-                        dap_chain_net_srv_order_find_all_by(l_net,SERV_DIR_UNDEFINED,l_uid,
-                                                           l_price_unit,NULL,l_price_min,l_price_max,&l_orders,&l_orders_num);
-                        flags = l_orders_num ? flags | F_ORDR : flags & ~F_ORDR;
-                        bool auto_online = dap_config_get_item_bool_default( g_config, "general", "auto_online", false );
-                        bool auto_update = false;
-                        if((system("systemctl status cellframe-updater.service") == 768) && (system("systemctl status cellframe-updater.timer") == 0))
-                            auto_update = true;
-                        else
-                            auto_update = false;
-                        flags = auto_online ? flags | A_ONLN : flags & ~A_ONLN;
-                        flags = auto_update ? flags | A_UPDT : flags & ~A_UPDT;
-                        send->header.flags = flags;
-                        //add sign
-                        if(sign_s)
-                            memcpy(send->sign,l_sign,sign_s);
-                        dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY ,
-                                                         l_ch_chain_net_pkt->hdr.net_id, send, sizeof(dap_stream_ch_chain_validator_test_t) + sign_s);
-                        dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
-                        if(l_sign)
-                            DAP_DELETE(l_sign);
-                        DAP_DELETE(send);
-                    }
-                }break;
-                case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY:{
-                    log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY");
+            case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY:{
+                log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY");
+
+                dap_stream_ch_set_ready_to_write_unsafe(a_ch, false);
+            } break;
 
-                    dap_stream_ch_set_ready_to_write_unsafe(a_ch, false);
-                }break;
+            default:
+                log_it(L_ERROR, "Unknown paket type %hhu", l_ch_pkt->hdr.type);
+                break;
             }
             if(l_ch_chain_net->notify_callback)
                 l_ch_chain_net->notify_callback(l_ch_chain_net,l_ch_pkt->hdr.type, l_ch_chain_net_pkt,
diff --git a/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h b/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h
index 69c7f76238..11dcfcbb32 100644
--- a/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h
+++ b/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h
@@ -30,19 +30,15 @@
 #include "dap_chain_node.h"
 #include "dap_stream_ch.h"
 
-#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_REQUEST                       0x01
+#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_TEST                          0x01
+
 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING                          0x02
 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG                          0x03
-#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST             0x14
-#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR                     0x11
-
-#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST       0x17
-#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE               0x18
 
 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST  0x30
 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY          0x31
 
-#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_TEST                          0x99
+#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE                      0x44
 
 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR                         0xff
 
diff --git a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
index 8fb6644105..114aba6dd3 100644
--- a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
+++ b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
@@ -8,7 +8,6 @@
 #include "dap_stream_ch_chain_voting.h"
 #include "dap_chain_net.h"
 #include "dap_client_pvt.h"
-#include "dap_proc_queue.h"
 #include "dap_chain_node_cli.h"
 #include "dap_chain_cs_blocks.h"
 
@@ -58,7 +57,7 @@ void dap_stream_ch_chain_voting_in_callback_add(void* a_arg, dap_chain_voting_ch
     s_pkt_in_callback_count++;
 }
 
-static bool s_callback_pkt_in_call_all(UNUSED_ARG dap_proc_thread_t *a_thread, void *a_arg)
+static bool s_callback_pkt_in_call_all(dap_proc_thread_t UNUSED_ARG *a_thread, void *a_arg)
 {
     dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = a_arg;
     for (size_t i = 0; i < s_pkt_in_callback_count; i++) {
@@ -68,7 +67,7 @@ static bool s_callback_pkt_in_call_all(UNUSED_ARG dap_proc_thread_t *a_thread, v
                                            &l_voting_pkt->hdr.data_hash, l_voting_pkt->data, l_voting_pkt->hdr.data_size);
         }
     }
-    return true;
+    return false;
 }
 
 void dap_stream_ch_voting_queue_clear()
@@ -122,7 +121,7 @@ void dap_stream_ch_chain_voting_message_write(dap_chain_net_t *a_net, dap_chain_
                                        DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_DATA, a_voting_pkt,
                                        l_voting_pkt_size);
     } else
-        dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_callback_pkt_in_call_all,
+        dap_proc_thread_callback_add(NULL, s_callback_pkt_in_call_all,
                                     DAP_DUP_SIZE(a_voting_pkt, l_voting_pkt_size));
 }
 
@@ -164,7 +163,7 @@ static void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
     }
 
     dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = (dap_stream_ch_chain_voting_pkt_t *)l_ch_pkt->data;
-    dap_proc_queue_add_callback(a_ch->stream_worker->worker, s_callback_pkt_in_call_all,
+    dap_proc_thread_callback_add(dap_proc_thread_get(a_ch->stream_worker->worker->id), s_callback_pkt_in_call_all,
                                 DAP_DUP_SIZE(l_voting_pkt, l_voting_pkt_size));
     dap_stream_ch_chain_voting_t *l_ch_chain_voting = DAP_STREAM_CH_CHAIN_VOTING(a_ch);
     if (l_ch_chain_voting->callback_notify)
diff --git a/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h b/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h
index a65b633ff6..bc8c16913a 100644
--- a/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h
+++ b/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h
@@ -4,10 +4,8 @@
 
 #include "dap_chain_common.h"
 #include "dap_chain.h"
-#include "dap_global_db_remote.h"
 #include "dap_chain_node_client.h"
 #include "dap_list.h"
-// #include "dap_stream_ch_chain_pkt.h"
 #include "uthash.h"
 
 #define DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_DATA        0x01
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index f41d4818e4..dba7f2ab16 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -57,7 +57,6 @@
 #include "dap_chain_cell.h"
 
 #include "dap_global_db.h"
-#include "dap_global_db_remote.h"
 
 #include "dap_stream.h"
 #include "dap_stream_pkt.h"
@@ -86,7 +85,7 @@ struct sync_request
     int last_err;
     union{
         struct{
-            dap_db_log_list_t *db_log; //  db log
+            //dap_db_log_list_t *db_log; //  db log
             dap_list_t *db_iter;
             char *sync_group;
         } gdb;
@@ -115,7 +114,7 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar
 static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg);
 
 static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg);
-static bool s_gdb_in_pkt_proc_set_raw_callback(dap_global_db_context_t *a_global_db_context,
+static bool s_gdb_in_pkt_proc_set_raw_callback(dap_global_db_instance_t *a_dbi,
                                                int a_rc, const char *a_group,
                                                const size_t a_values_total, const size_t a_values_count,
                                                dap_store_obj_t *a_values, void *a_arg);
@@ -325,7 +324,6 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a
 
     dap_chain_t * l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id);
     assert(l_chain);
-    //pthread_rwlock_rdlock(&l_chain->atoms_rwlock);
     l_sync_request->chain.request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_sync_request->request_hdr.cell_id, 1);
     size_t l_first_size = 0;
     dap_chain_atom_ptr_t l_atom = l_chain->callback_atom_iter_get_first(l_sync_request->chain.request_atom_iter, &l_first_size);
@@ -336,13 +334,11 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a
             (void ) l_chain->callback_atom_find_by_hash(l_sync_request->chain.request_atom_iter,
                                                           &l_hash_from, &l_first_size);
         }
-        //pthread_rwlock_unlock(&l_chain->atoms_rwlock);
-        dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id, s_sync_out_chains_first_worker_callback, l_sync_request );
+         dap_worker_exec_callback_on(dap_events_worker_get(l_sync_request->worker->id), s_sync_out_chains_first_worker_callback, l_sync_request );
     } else {
-        //pthread_rwlock_unlock(&l_chain->atoms_rwlock);
-        dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id,s_sync_out_chains_last_worker_callback, l_sync_request );
+         dap_worker_exec_callback_on(dap_events_worker_get(l_sync_request->worker->id),s_sync_out_chains_last_worker_callback, l_sync_request );
     }
-    return true;
+    return false;
 }
 
 
@@ -426,6 +422,7 @@ static void s_sync_out_gdb_last_worker_callback(dap_worker_t *a_worker, void *a_
  */
 static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
 {
+    /*
     struct sync_request *l_sync_request = (struct sync_request *)a_arg;
     dap_chain_net_t *l_net = dap_chain_net_by_id(l_sync_request->request_hdr.net_id);
     dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(DAP_STREAM_WORKER(l_sync_request->worker), l_sync_request->ch_uuid);
@@ -450,10 +447,10 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar
             log_it(L_DEBUG, "Sync out gdb proc, requested %"DAP_UINT64_FORMAT_U" records from address "NODE_ADDR_FP_STR,
                              l_ch_chain->request_db_log->items_number, NODE_ADDR_FP_ARGS_S(l_sync_request->request.node_addr));
         l_sync_request->gdb.db_log = l_ch_chain->request_db_log;
-        dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id, s_sync_out_gdb_first_worker_callback, l_sync_request );
+         dap_worker_exec_callback_on(dap_events_worker_get(l_sync_request->worker->id), s_sync_out_gdb_first_worker_callback, l_sync_request );
     } else {
-        dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id, s_sync_out_gdb_last_worker_callback, l_sync_request );
-    }
+         dap_worker_exec_callback_on(dap_events_worker_get(l_sync_request->worker->id), s_sync_out_gdb_last_worker_callback, l_sync_request );
+    } */
     return true;
 }
 
@@ -479,6 +476,7 @@ static void s_sync_update_gdb_start_worker_callback(dap_worker_t *a_worker, void
 
 static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
 {
+    /*
     struct sync_request *l_sync_request = (struct sync_request *)a_arg;
     log_it(L_DEBUG, "Prepare request to gdb sync from %s", l_sync_request->request.id_start ? "last sync" : "zero");
     dap_chain_net_t *l_net = dap_chain_net_by_id(l_sync_request->request_hdr.net_id);
@@ -493,12 +491,6 @@ static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a
         DAP_DELETE(l_sync_request);
         return true;
     }
-    dap_chain_net_add_downlink(l_net, l_ch->stream_worker, l_ch->uuid, l_ch->stream->esocket_uuid,
-                               l_ch->stream->esocket->hostaddr[0]
-            ? l_ch->stream->esocket->hostaddr : l_ch->stream->esocket->remote_addr_str,
-            l_ch->stream->esocket->service[0]
-            ? strtoll(l_ch->stream->esocket->service, NULL, 10)
-            : l_ch->stream->esocket->remote_addr.sin_port);
 
     dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
     int l_flags = 0;
@@ -512,7 +504,8 @@ static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a
     l_ch_chain->state = CHAIN_STATE_UPDATE_GLOBAL_DB;
     l_sync_request->gdb.db_log = l_ch_chain->request_db_log;
     l_sync_request->request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
-    dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id, s_sync_update_gdb_start_worker_callback, l_sync_request);
+     dap_worker_exec_callback_on(dap_events_worker_get(l_sync_request->worker->id), s_sync_update_gdb_start_worker_callback, l_sync_request);
+     */
     return true;
 }
 
@@ -528,7 +521,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
     struct sync_request *l_sync_request = (struct sync_request *) a_arg;
     if (!l_sync_request) {
         log_it(L_CRITICAL, "Proc thread received corrupted chain packet!");
-        return true;
+        return false;
     }
     dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt;
     dap_chain_hash_fast_t l_atom_hash = {};
@@ -536,7 +529,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
         log_it(L_CRITICAL, "In proc thread got CHAINS stream ch packet with zero data");
         DAP_DEL_Z(l_pkt_item->pkt_data);
         DAP_DELETE(l_sync_request);
-        return true;
+        return false;
     }
     dap_chain_t *l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id);
     if (!l_chain) {
@@ -544,7 +537,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
             log_it(L_WARNING, "No chain found for DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN");
         DAP_DEL_Z(l_pkt_item->pkt_data);
         DAP_DELETE(l_sync_request);
-        return true;
+        return false;
     }
     dap_chain_atom_ptr_t l_atom_copy = (dap_chain_atom_ptr_t)l_pkt_item->pkt_data;
     uint64_t l_atom_copy_size = l_pkt_item->pkt_data_size;
@@ -557,14 +550,14 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
         if (s_debug_more){
             log_it(L_WARNING, "Atom with hash %s for %s:%s not accepted (code ATOM_PASS, already present)",  l_atom_hash_str, l_chain->net_name, l_chain->name);
         }
-        dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash);
+        //dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash);
         DAP_DELETE(l_atom_copy);
         break;
     case ATOM_MOVE_TO_THRESHOLD:
         if (s_debug_more) {
             log_it(L_INFO, "Thresholded atom with hash %s for %s:%s", l_atom_hash_str, l_chain->net_name, l_chain->name);
         }
-        dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash);
+        //dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash);
         break;
     case ATOM_ACCEPT:
         if (s_debug_more) {
@@ -574,7 +567,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
         if(l_res < 0) {
             log_it(L_ERROR, "Can't save atom %s to the file", l_atom_hash_str);
         } else {
-            dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash);
+            //dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash);
         }
         break;
     case ATOM_REJECT: {
@@ -592,7 +585,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
         break;
     }
     DAP_DEL_Z(l_sync_request);
-    return true;
+    return false;
 }
 
 /**
@@ -673,98 +666,6 @@ static void s_gdb_sync_tsd_worker_callback(dap_worker_t *a_worker, void *a_arg)
  */
 static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
 {
-    struct sync_request *l_sync_request = (struct sync_request *) a_arg;
-    dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt;
-
-    if(l_pkt_item->pkt_data_size >= sizeof(dap_global_db_pkt_t)) {
-
-        // Validate size of received packet
-        dap_global_db_pkt_t *l_obj_pkt = (dap_global_db_pkt_t*)l_pkt_item->pkt_data;
-        size_t l_obj_pkt_size = l_obj_pkt ? l_obj_pkt->data_size + sizeof(dap_global_db_pkt_t) : 0;
-        if(l_pkt_item->pkt_data_size != l_obj_pkt_size) {
-            log_it(L_WARNING, "In: s_gdb_in_pkt_proc_callback: received size=%zu is not equal to obj_pkt_size=%zu",
-                    l_pkt_item->pkt_data_size, l_obj_pkt_size);
-            DAP_DEL_Z(l_pkt_item->pkt_data);
-            DAP_DELETE(l_sync_request);
-            return true;
-        }
-
-        size_t l_data_obj_count = 0;
-        // deserialize data & Parse data from dap_db_log_pack()
-        dap_store_obj_t *l_store_obj = dap_global_db_pkt_deserialize(l_obj_pkt, &l_data_obj_count);
-        if (!l_store_obj) {
-            debug_if(s_debug_more, L_ERROR, "Invalid synchronization packet format");
-            DAP_DEL_Z(l_pkt_item->pkt_data);
-            DAP_DELETE(l_sync_request);
-            return true;
-        }
-        if (s_debug_more){
-            if (l_data_obj_count)
-                log_it(L_INFO, "In: GLOBAL_DB parse: pkt_data_size=%"DAP_UINT64_FORMAT_U", l_data_obj_count = %zu",l_pkt_item->pkt_data_size, l_data_obj_count );
-            else if (l_pkt_item->pkt_data){
-                log_it(L_WARNING, "In: GLOBAL_DB parse: pkt_data_size=%"DAP_UINT64_FORMAT_U", error=\"No data objs after unpack\"", l_pkt_item->pkt_data_size);
-            }else
-                 log_it(L_WARNING, "In: GLOBAL_DB parse: packet in list with NULL data(pkt_data_size:%"DAP_UINT64_FORMAT_U")", l_pkt_item->pkt_data_size);
-        }
-        /*uint64_t l_last_id = l_store_obj->id;
-        const char *l_last_group = l_store_obj->group;
-        uint32_t l_last_type = l_store_obj->type;
-        bool l_group_changed = false;*/
-        uint32_t l_time_store_lim_hours = dap_config_get_item_uint32_default(g_config, "global_db", "time_store_limit", 72);
-        dap_nanotime_t l_time_now = dap_nanotime_now();
-        dap_nanotime_t l_time_alowed = l_time_now + dap_nanotime_from_sec(3600 * 24); // to be sure the timestamp is invalid
-        for (size_t i = 0; i < l_data_obj_count; i++) {
-            // obj to add
-            dap_store_obj_t *l_obj = l_store_obj + i;
-            if (l_obj->timestamp >> 32 == 0 ||
-                    l_obj->timestamp > l_time_alowed ||
-                    l_obj->group == NULL)
-                continue;       // the object is broken
-            if (s_list_white_groups) {
-                int l_ret = -1;
-                for (int i = 0; i < s_size_white_groups; i++) {
-                    if (!dap_fnmatch(s_list_white_groups[i], l_obj->group, FNM_NOESCAPE)) {
-                        l_ret = 0;
-                        break;
-                    }
-                }
-                if (l_ret == -1) continue;
-            } else if (s_list_ban_groups) {
-                int l_ret = 0;
-                for (int i = 0; i < s_size_ban_groups; i++) {
-                    if (!dap_fnmatch(s_list_ban_groups[i], l_obj->group, FNM_NOESCAPE)) {
-                        l_ret = -1;
-                        break;
-                    }
-                }
-                if (l_ret == -1) continue;
-            }
-            /*l_group_changed = strcmp(l_last_group, l_obj->group) || l_last_type != l_obj->type;
-            // Send remote side notification about received obj
-            if (l_sync_request->request.node_addr.uint64 &&
-                    (l_group_changed || i == l_data_obj_count - 1)) {
-                struct sync_request *l_sync_req_tsd = DAP_DUP(l_sync_request);
-                l_sync_req_tsd->request.id_end = l_last_id;
-                l_sync_req_tsd->gdb.sync_group = l_obj->type == DAP_DB$K_OPTYPE_ADD ? dap_strdup(l_last_group) :
-                                                                      dap_strdup_printf("%s.del", l_last_group);
-                dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id,
-                                                     s_gdb_sync_tsd_worker_callback, l_sync_req_tsd);
-            }
-            l_last_id = l_obj->id;
-            l_last_group = l_obj->group;
-            l_last_type = l_obj->type;
-            */
-            dap_global_db_remote_apply_obj(l_obj, s_gdb_in_pkt_proc_set_raw_callback, DAP_DUP(l_sync_request));
-        }
-        if (l_store_obj)
-            dap_store_obj_free(l_store_obj, l_data_obj_count);
-    } else {
-        log_it(L_WARNING, "In proc thread got GDB stream ch packet with zero data");
-    }
-    if (l_pkt_item->pkt_data) {
-        DAP_DELETE(l_pkt_item->pkt_data);
-    }
-    DAP_DELETE(l_sync_request);
     return true;
 }
 
@@ -780,21 +681,11 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
  * @param a_values
  * @param a_arg
  */
-static bool s_gdb_in_pkt_proc_set_raw_callback(dap_global_db_context_t *a_global_db_context,
+static bool s_gdb_in_pkt_proc_set_raw_callback(dap_global_db_instance_t *a_dbi,
                                                int a_rc, const char *a_group,
                                                const size_t a_values_total, const size_t a_values_count,
                                                dap_store_obj_t *a_values, void *a_arg)
 {
-    struct sync_request *l_sync_req = (struct sync_request*) a_arg;
-    if(a_rc){
-        debug_if(s_debug_more, L_ERROR, "Can't save GlobalDB request, code %d", a_rc);
-        l_sync_req->last_err = a_rc;
-        dap_worker_exec_callback_inter(a_global_db_context->queue_worker_callback_input[l_sync_req->worker->id],
-                                    s_gdb_in_pkt_error_worker_callback, l_sync_req);
-    } else {
-        debug_if(s_debug_more, L_DEBUG, "Added new GLOBAL_DB synchronization record");
-        DAP_DELETE(l_sync_req);
-    }
     return true;
 }
 
@@ -834,7 +725,6 @@ static bool s_chain_timer_callback(void *a_arg)
     dap_worker_t *l_worker = dap_worker_get_current();
     dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(DAP_STREAM_WORKER(l_worker), *(dap_stream_ch_uuid_t*)a_arg);
     if (!l_ch) {
-        dap_chain_net_del_downlink((dap_stream_ch_uuid_t*)a_arg);
         DAP_DELETE(a_arg);
         return false;
     }
@@ -864,16 +754,6 @@ static bool s_chain_timer_callback(void *a_arg)
         l_ch_chain->sent_breaks = 0;
         l_ch_chain->timer_shots = 0;
     }
-    if (l_ch_chain->state == CHAIN_STATE_SYNC_GLOBAL_DB && l_ch_chain->sent_breaks >= 3 * DAP_SYNC_TICKS_PER_SECOND) {
-        debug_if(s_debug_more, L_INFO, "Send one global_db TSD packet (rest=%zu/%zu items)",
-                            l_ch_chain->request_db_log->items_rest,
-                            l_ch_chain->request_db_log->items_number);
-        dap_stream_ch_chain_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_TSD,
-                                             l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64,
-                                             l_ch_chain->request_hdr.cell_id.uint64, NULL, 0);
-        l_ch_chain->sent_breaks = 0;
-        l_ch_chain->timer_shots = 0;
-    }
     return true;
 }
 
@@ -932,7 +812,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         } else {
             log_it(L_ERROR, "Invalid request from %s with ext_id %016"DAP_UINT64_FORMAT_x" net id 0x%016"DAP_UINT64_FORMAT_x
                             " chain id 0x%016"DAP_UINT64_FORMAT_x" cell_id 0x%016"DAP_UINT64_FORMAT_x" in packet",
-                            a_ch->stream->esocket->hostaddr, l_chain_pkt->hdr.ext_id,
+                            a_ch->stream->esocket->remote_addr_str, l_chain_pkt->hdr.ext_id,
                             l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64,
                             l_chain_pkt->hdr.cell_id.uint64);
             s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
@@ -954,7 +834,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
     uint8_t l_acl = a_ch->stream->session->acl ? a_ch->stream->session->acl[l_acl_idx] : 1;
     if (!l_acl) {
         log_it(L_WARNING, "Unauthorized request attempt from %s to network %s",
-               a_ch->stream->esocket->hostaddr,
+               a_ch->stream->esocket->remote_addr_str,
                dap_chain_net_by_id(l_chain_pkt->hdr.net_id)->pub.name);
         s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
                                             l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
@@ -985,7 +865,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
             struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch);
             l_ch_chain->stats_request_gdb_processed = 0;
             l_ch_chain->request_hdr = l_chain_pkt->hdr;
-            dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_update_gdb_proc_callback, l_sync_request);
+            dap_proc_thread_callback_add(a_ch->stream_worker->worker->proc_queue_input, s_sync_update_gdb_proc_callback, l_sync_request);
         } break;
 
         // Response with metadata organized in TSD
@@ -1002,7 +882,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 uint64_t l_last_id = *(uint64_t *)l_data_ptr;
                 l_data_ptr += sizeof(uint64_t);
                 char *l_group = (char *)l_data_ptr;
-                dap_db_set_last_id_remote(l_node_addr, l_last_id, l_group);
+                //dap_db_set_last_id_remote(l_node_addr, l_last_id, l_group);
                 if (s_debug_more) {
                     dap_chain_node_addr_t l_addr;
                     l_addr.uint64 = l_node_addr;
@@ -1097,7 +977,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 if (l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t))
                     l_ch_chain->request = *(dap_stream_ch_chain_sync_request_t*)l_chain_pkt->data;
                 struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch);
-                dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_out_gdb_proc_callback, l_sync_request);
+                dap_proc_thread_callback_add(a_ch->stream_worker->worker->proc_queue_input, s_sync_out_gdb_proc_callback, l_sync_request);
             }else{
                 log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request));
                 s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
@@ -1130,7 +1010,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt;
                 l_pkt_item->pkt_data = DAP_DUP_SIZE(l_chain_pkt->data, l_chain_pkt_data_size);
                 l_pkt_item->pkt_data_size = l_chain_pkt_data_size;
-                dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_gdb_in_pkt_proc_callback, l_sync_request);
+                dap_proc_thread_callback_add(a_ch->stream_worker->worker->proc_queue_input, s_gdb_in_pkt_proc_callback, l_sync_request);
             } else {
                 log_it(L_WARNING, "Packet with GLOBAL_DB atom has zero body size");
                 s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
@@ -1220,7 +1100,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
             if (!l_chain) {
                 log_it(L_ERROR, "Invalid UPDATE_CHAINS_START request from %s with ext_id %016"DAP_UINT64_FORMAT_x" net id 0x%016"DAP_UINT64_FORMAT_x
                                 " chain id 0x%016"DAP_UINT64_FORMAT_x" cell_id 0x%016"DAP_UINT64_FORMAT_x" in packet",
-                                a_ch->stream->esocket->hostaddr, l_chain_pkt->hdr.ext_id,
+                                a_ch->stream->esocket->remote_addr_str, l_chain_pkt->hdr.ext_id,
                                 l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64,
                                 l_chain_pkt->hdr.cell_id.uint64);
                 s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64,
@@ -1339,7 +1219,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                                    " between %s and %s", l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64,
                                     l_hash_from_str[0] ? l_hash_from_str : "(null)", l_hash_to_str[0] ? l_hash_to_str : "(null)");
                 }
-                dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_out_chains_proc_callback, l_sync_request);
+                dap_proc_thread_callback_add(a_ch->stream_worker->worker->proc_queue_input, s_sync_out_chains_proc_callback, l_sync_request);
             } else {
                 log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS: Wrong chain packet size %zd when expected %zd",
                        l_chain_pkt_data_size, sizeof(l_ch_chain->request));
@@ -1387,7 +1267,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                             dap_chain_hash_fast_to_str(&l_atom_hash, l_atom_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
                             log_it(L_INFO, "In: CHAIN pkt: atom hash %s (size %zd)", l_atom_hash_str, l_chain_pkt_data_size);
                         }
-                        if (dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_in_chains_callback, l_sync_request))
+                        if (dap_proc_thread_callback_add(a_ch->stream_worker->worker->proc_queue_input, s_sync_in_chains_callback, l_sync_request))
                             log_it(L_ERROR, "System queue overflow with atom trying atom add. All following atoms will be rejected!");
                     } else {
                         log_it(L_WARNING, "Empty chain packet");
@@ -1469,7 +1349,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 l_error_str[l_chain_pkt_data_size-1]='\0'; // To be sure that nobody sends us garbage
                                                            // without trailing zero
             log_it(L_WARNING,"In from remote addr %s chain id 0x%016"DAP_UINT64_FORMAT_x" got error on his side: '%s'",
-                   DAP_STREAM_CH(l_ch_chain)->stream->esocket->hostaddr,
+                   DAP_STREAM_CH(l_ch_chain)->stream->esocket->remote_addr_str,
                    l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt_data_size ? l_error_str : "<empty>");
         } break;
 
@@ -1497,22 +1377,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
  */
 static void s_free_log_list_gdb ( dap_stream_ch_chain_t * a_ch_chain)
 {
-    if (a_ch_chain->request_db_log) {
-        // free log list
-        debug_if(s_debug_more, L_INFO, "[stm_ch_chain:%p] a_ch_chain->request_db_log:%p --- cleanuping ...", a_ch_chain, a_ch_chain->request_db_log);
-        dap_db_log_list_delete(a_ch_chain->request_db_log);
-        a_ch_chain->request_db_log = NULL;
-    }
 
-    if (a_ch_chain->remote_gdbs) {
-        dap_stream_ch_chain_hash_item_t *l_hash_item = NULL, *l_tmp = NULL;
-        HASH_ITER(hh, a_ch_chain->remote_gdbs, l_hash_item, l_tmp) {
-            // Clang bug at this, l_hash_item should change at every loop cycle
-            HASH_DEL(a_ch_chain->remote_gdbs, l_hash_item);
-            DAP_DELETE(l_hash_item);
-        }
-        a_ch_chain->remote_gdbs = NULL;
-    }
 }
 
 /**
@@ -1633,11 +1498,12 @@ void s_stream_ch_packet_out(dap_stream_ch_t *a_ch, void *a_arg)
     switch (l_ch_chain->state) {
         // Update list of global DB records to remote
     case CHAIN_STATE_UPDATE_GLOBAL_DB: {
+#if 0
         size_t i, q =
                 // s_update_pack_size;
                 0;
-        dap_db_log_list_obj_t **l_objs = dap_db_log_list_get_multiple(l_ch_chain->request_db_log, /*DAP_STREAM_PKT_SIZE_MAX*/ 0, &q);
-        dap_stream_ch_chain_update_element_t *l_data = DAP_NEW_Z_COUNT(dap_stream_ch_chain_update_element_t, q);
+        //dap_db_log_list_obj_t **l_objs = dap_db_log_list_get_multiple(l_ch_chain->request_db_log, DAP_STREAM_PKT_SIZE_MAX, &q);
+        dap_stream_ch_chain_update_element_t *l_data = DAP_NEW_Z_SIZE(dap_stream_ch_chain_update_element_t, q * sizeof(dap_stream_ch_chain_update_element_t));
         for (i = 0; i < q; ++i) {
             l_data[i].hash = l_objs[i]->hash;
             l_data[i].size = l_objs[i]->pkt->data_size;
@@ -1666,7 +1532,6 @@ void s_stream_ch_packet_out(dap_stream_ch_t *a_ch, void *a_arg)
             debug_if(s_debug_more, L_INFO, "Out: DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_END");
             l_go_idle = true;
         }
-#if 0
             dap_stream_ch_chain_update_element_t l_data[s_update_pack_size];
             uint_fast16_t i;
             dap_db_log_list_obj_t *l_obj = NULL;
@@ -1706,6 +1571,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t *a_ch, void *a_arg)
 
         // Synchronize GDB
     case CHAIN_STATE_SYNC_GLOBAL_DB: {
+#if 0
         dap_global_db_pkt_t *l_pkt = NULL;
         size_t l_pkt_size = 0, i, q = 0;
         dap_db_log_list_obj_t **l_objs = dap_db_log_list_get_multiple(l_ch_chain->request_db_log, DAP_STREAM_PKT_SIZE_MAX, &q);
@@ -1756,7 +1622,6 @@ void s_stream_ch_packet_out(dap_stream_ch_t *a_ch, void *a_arg)
             log_it(L_INFO,"Syncronized database: items syncronyzed %"DAP_UINT64_FORMAT_U" of %zu",
                     l_ch_chain->stats_request_gdb_processed, l_ch_chain->request_db_log->items_number);
         }
-#if 0
             // Get global DB record
             dap_global_db_pkt_t *l_pkt = NULL;
             dap_db_log_list_obj_t *l_obj = NULL;
diff --git a/modules/channel/chain/include/dap_stream_ch_chain.h b/modules/channel/chain/include/dap_stream_ch_chain.h
index 6a3d9fa188..830725239d 100644
--- a/modules/channel/chain/include/dap_stream_ch_chain.h
+++ b/modules/channel/chain/include/dap_stream_ch_chain.h
@@ -32,7 +32,7 @@
 #include "dap_list.h"
 #include "dap_stream_ch_chain_pkt.h"
 #include "uthash.h"
-#include "dap_global_db_remote.h"
+#include "dap_global_db_cluster.h"
 
 #define DAP_CHAIN_NODE_SYNC_TIMEOUT 60  // sec
 #define DAP_SYNC_TICKS_PER_SECOND   10
@@ -72,7 +72,7 @@ typedef struct dap_stream_ch_chain {
 
     // request section
     dap_chain_atom_iter_t *request_atom_iter;
-    dap_db_log_list_t *request_db_log; // list of global db records
+    //dap_db_log_list_t *request_db_log; // list of global db records
     dap_stream_ch_chain_sync_request_t request;
     dap_stream_ch_chain_pkt_hdr_t request_hdr;
     dap_list_t *request_db_iter;
diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c
index 48fa8d157b..6681b046e0 100644
--- a/modules/common/dap_chain_datum.c
+++ b/modules/common/dap_chain_datum.c
@@ -58,7 +58,7 @@ dap_chain_datum_t *dap_chain_datum_create(uint16_t a_type_id, const void *a_data
    return  l_datum;
 }
 
-void s_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_token, size_t a_token_size, const char *a_hash_out_type)
+void dap_chain_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_token, size_t a_token_size, const char *a_hash_out_type)
 {
     dap_tsd_t *l_tsd = dap_chain_datum_token_tsd_get(a_token, a_token_size);
     if (l_tsd == NULL) {
@@ -90,7 +90,7 @@ void s_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_
         l_tsd = (dap_tsd_t *) (((byte_t*)l_tsd) + l_tsd_size);
         l_tsd_size = l_tsd ? dap_tsd_size(l_tsd) : 0;
         if (l_tsd_size == 0) {
-            log_it(L_ERROR,"Wrong zero TSD size, exiting s_datum_token_dump_tsd()");
+            log_it(L_ERROR,"Wrong zero TSD size, exiting dap_chain_datum_token_dump_tsd()");
             return;
         } else if (l_tsd_size+l_offset > l_tsd_total_size) {
             log_it(L_WARNING, "<CORRUPTED TSD> too big size %u when left maximum %zu",
@@ -599,7 +599,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c
                             dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str);
                             dap_string_append(a_str_out,"flags: ");
                             dap_chain_datum_token_flags_dump(a_str_out, l_token->header_private_update.flags);
-                            s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
+                            dap_chain_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
                             size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_update.tsd_total_size;
                             dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd + l_token->header_private_update.tsd_total_size,
                                                              l_certs_field_size, a_hash_out_type);
@@ -613,7 +613,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c
                             dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str);
                             dap_string_append(a_str_out, "flags: ");
                             dap_chain_datum_token_flags_dump(a_str_out, l_token->header_native_decl.flags);
-                            s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
+                            dap_chain_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
                             size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_native_decl.tsd_total_size;
                             dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd + l_token->header_native_decl.tsd_total_size,
                                                              l_certs_field_size, a_hash_out_type);
@@ -644,7 +644,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c
                             dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str);
                             dap_string_append(a_str_out,"flags: ");
                             dap_chain_datum_token_flags_dump(a_str_out, l_token->header_private_update.flags);
-                            s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
+                            dap_chain_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
                             size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_update.tsd_total_size;
                             dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd + l_token->header_private_update.tsd_total_size,
                                                              l_certs_field_size, a_hash_out_type);
@@ -658,7 +658,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c
                             dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str);
                             dap_string_append(a_str_out, "flags: ");
                             dap_chain_datum_token_flags_dump(a_str_out, l_token->header_native_update.flags);
-                            s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
+                            dap_chain_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
                             size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_native_update.tsd_total_size;
                             dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd + l_token->header_native_update.tsd_total_size,
                                                              l_certs_field_size, a_hash_out_type);
diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h
index 1745b44a58..cd775e3d20 100644
--- a/modules/common/include/dap_chain_common.h
+++ b/modules/common/include/dap_chain_common.h
@@ -64,62 +64,6 @@ typedef union dap_chain_cell_id {
 
 int dap_id_uint64_parse(const char *a_id_str, uint64_t *a_id);
 
-/**
-  * @struct Node address
-  *
-  */
-typedef union dap_chain_node_addr {
-    uint64_t uint64;
-    uint16_t words[sizeof(uint64_t)/2];
-    uint8_t raw[sizeof(uint64_t)];  // Access to selected octects
-} DAP_ALIGN_PACKED dap_chain_node_addr_t;
-
-#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-#define NODE_ADDR_FP_STR      "%04hX::%04hX::%04hX::%04hX"
-#define NODE_ADDR_FP_ARGS(a)  a->words[2],a->words[3],a->words[0],a->words[1]
-#define NODE_ADDR_FPS_ARGS(a)  &a->words[2],&a->words[3],&a->words[0],&a->words[1]
-#define NODE_ADDR_FP_ARGS_S(a)  a.words[2],a.words[3],a.words[0],a.words[1]
-#define NODE_ADDR_FPS_ARGS_S(a)  &a.words[2],&a.words[3],&a.words[0],&a.words[1]
-#else
-#define NODE_ADDR_FP_STR      "%04hX::%04hX::%04hX::%04hX"
-#define NODE_ADDR_FP_ARGS(a)  a->words[3],a->words[2],a->words[1],a->words[0]
-#define NODE_ADDR_FPS_ARGS(a)  &a->words[3],&a->words[2],&a->words[1],&a->words[0]
-#define NODE_ADDR_FP_ARGS_S(a)  a.words[3],a.words[2],a.words[1],a.words[0]
-#define NODE_ADDR_FPS_ARGS_S(a)  &a.words[3],&a.words[2],&a.words[1],&a.words[0]
-#endif
-
-DAP_STATIC_INLINE bool dap_chain_node_addr_str_check(const char *a_addr_str) {
-    size_t l_str_len = dap_strlen(a_addr_str);
-    if (l_str_len == 22) {
-        for (int n =0; n < 22; n+= 6) {
-            if (!dap_is_xdigit(a_addr_str[n]) || !dap_is_xdigit(a_addr_str[n + 1]) ||
-                !dap_is_xdigit(a_addr_str[n + 2]) || !dap_is_xdigit(a_addr_str[n + 3])) {
-                return false;
-            }
-        }
-        for (int n = 4; n < 18; n += 6) {
-            if (a_addr_str[n] != ':' || a_addr_str[n + 1] != ':')
-                return false;
-        }
-        return true;
-    }
-    return false;
-}
-
-DAP_STATIC_INLINE int dap_chain_node_addr_from_str(dap_chain_node_addr_t *a_addr, const char *a_addr_str)
-{
-    if (!a_addr || !a_addr_str){
-        return -1;
-    }
-    if (sscanf(a_addr_str, NODE_ADDR_FP_STR, NODE_ADDR_FPS_ARGS(a_addr)) == 4)
-        return 0;
-    if (sscanf(a_addr_str, "0x%016" DAP_UINT64_FORMAT_x, &a_addr->uint64) == 1)
-        return 0;
-    return -1;
-}
-
-DAP_STATIC_INLINE bool dap_chain_node_addr_not_null(dap_chain_node_addr_t * a_addr) { return a_addr->uint64 != 0; }
-
 enum {
     NODE_ROLE_ROOT_MASTER=0x00,
     NODE_ROLE_ROOT=0x01,
@@ -134,6 +78,10 @@ typedef union dap_chain_node_role{
     uint8_t raw[DAP_CHAIN_NODE_ROLE_SIZE];
 } DAP_ALIGN_PACKED dap_chain_node_role_t;
 
+typedef dap_stream_node_addr_t dap_chain_node_addr_t;
+#define dap_chain_node_addr_str_check dap_stream_node_addr_str_check
+#define dap_chain_node_addr_from_str dap_stream_node_addr_from_str
+#define dap_chain_node_addr_not_null dap_stream_node_addr_not_null
 
 typedef union dap_chain_net_id{
     uint64_t uint64;
diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h
index 922688f6d1..bb532c3068 100644
--- a/modules/common/include/dap_chain_datum.h
+++ b/modules/common/include/dap_chain_datum.h
@@ -153,7 +153,7 @@ DAP_STATIC_INLINE const char *dap_chain_datum_type_id_to_str(uint16_t a_type_id)
     return l_ret;
 }
 
-void s_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_token, size_t a_token_size, const char *a_hash_out_type);
+void dap_chain_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_token, size_t a_token_size, const char *a_hash_out_type);
 void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type, dap_chain_net_id_t a_net_id);
 bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum,
                              const char *a_ticker,
diff --git a/modules/consensus/block-poa/dap_chain_cs_block_poa.c b/modules/consensus/block-poa/dap_chain_cs_block_poa.c
index f423dcb840..5c8bde7f51 100644
--- a/modules/consensus/block-poa/dap_chain_cs_block_poa.c
+++ b/modules/consensus/block-poa/dap_chain_cs_block_poa.c
@@ -28,7 +28,6 @@
 #include "dap_enc_base58.h"
 #include "dap_cert.h"
 #include "dap_chain.h"
-#include "dap_chain_pvt.h"
 #include "dap_chain_block.h"
 #include "dap_chain_block_cache.h"
 #include "dap_chain_cs_blocks.h"
@@ -41,7 +40,6 @@
 
 #define LOG_TAG "dap_chain_cs_block_poa"
 
-
 typedef struct dap_chain_cs_dag_poa_pvt {
     dap_enc_key_t *sign_key;
     dap_cert_t ** auth_certs;
@@ -182,7 +180,7 @@ static int s_cli_block_poa(int argc, char ** argv, char **a_str_reply)
  */
 static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 {
-    dap_chain_cs_blocks_new(a_chain, a_chain_cfg);
+    dap_chain_cs_type_create("blocks", a_chain, a_chain_cfg);
     dap_chain_cs_blocks_t * l_blocks = DAP_CHAIN_CS_BLOCKS( a_chain );
     dap_chain_cs_block_poa_t * l_poa = DAP_NEW_Z ( dap_chain_cs_block_poa_t);
     if (!l_poa) {
diff --git a/modules/consensus/block-pos/dap_chain_cs_block_pos.c b/modules/consensus/block-pos/dap_chain_cs_block_pos.c
index 094c579620..dc2e90d76b 100644
--- a/modules/consensus/block-pos/dap_chain_cs_block_pos.c
+++ b/modules/consensus/block-pos/dap_chain_cs_block_pos.c
@@ -79,7 +79,7 @@ void dap_chain_cs_block_pos_deinit(void)
  */
 static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg)
 {
-    dap_chain_cs_blocks_new(a_chain, a_chain_cfg);
+    dap_chain_cs_type_create("blocks", a_chain, a_chain_cfg);
     char ** l_tokens_hold = NULL;
     char ** l_tokens_hold_value_str = NULL;
     uint16_t l_tokens_hold_size = 0;
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 c2fcd8abb9..cf0749d941 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -37,7 +37,6 @@
 #include "dap_timerfd.h"
 #include "dap_strfuncs.h"
 #include "dap_enc_base58.h"
-#include "dap_chain_pvt.h"
 #include "dap_chain_net.h"
 #include "dap_chain_node_cli.h"
 #include "dap_chain_node_cli_cmd.h"
@@ -47,7 +46,6 @@
 #include "dap_chain_cs_dag.h"
 #include "dap_chain_cs_dag_event.h"
 #include "dap_chain_cs_dag_poa.h"
-//#include "dap_chain_net_srv_stake.h"
 #include "dap_chain_cell.h"
 #include "dap_global_db.h"
 #include "dap_cert.h"
@@ -111,7 +109,7 @@ static dap_interval_timer_t s_poa_round_timer = NULL;
 int dap_chain_cs_dag_poa_init()
 {
     // Add consensus constructor
-    dap_chain_cs_add ("dag_poa", s_callback_new );
+    dap_chain_cs_add("dag_poa", s_callback_new);
     s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false);
     dap_cli_server_cmd_add ("dag_poa", s_cli_dag_poa, "DAG PoA commands",
         "dag_poa event sign -net <net_name> -chain <chain_name> -event <event_hash> [-H {hex | base58(default)}]\n"
@@ -341,7 +339,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply)
  */
 static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 {
-    if (dap_chain_cs_dag_new(a_chain,a_chain_cfg)) {
+    if (dap_chain_cs_type_create("dag", a_chain, a_chain_cfg)) {
         log_it(L_ERROR, "Couldn't init DAG");
         return -1;
     }
@@ -422,7 +420,7 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
  * @param a_values
  * @param a_arg
  */
-static bool s_poa_round_check_callback_round_clean(dap_global_db_context_t *a_global_db_context,
+static bool s_poa_round_check_callback_round_clean(dap_global_db_instance_t *a_dbi,
                                                    int a_rc, const char *a_group,
                                                    const size_t a_values_total, const size_t a_values_count,
                                                    dap_global_db_obj_t *a_values, void *a_arg)
@@ -437,7 +435,7 @@ static bool s_poa_round_check_callback_round_clean(dap_global_db_context_t *a_gl
                 continue;
             if (a_values[i].value_len <= sizeof(dap_chain_cs_dag_event_round_item_t) + sizeof(dap_chain_cs_dag_event_t)) {
                 log_it(L_WARNING, "Too small round item in DAG PoA rounds GDB group");
-                dap_global_db_del_unsafe(a_global_db_context, a_group, a_values[i].key);
+                dap_global_db_del_sync(a_group, a_values[i].key);
                 continue;
             }
             dap_chain_cs_dag_event_round_item_t *l_event_round_item = (dap_chain_cs_dag_event_round_item_t *)a_values[i].value;
@@ -453,7 +451,7 @@ static bool s_poa_round_check_callback_round_clean(dap_global_db_context_t *a_gl
                     log_it(L_INFO, "Event %s is from currently active round [id %"DAP_UINT64_FORMAT_U"]", a_values[i].key, l_round_id);
                     continue;
                 }
-                dap_global_db_del_unsafe(a_global_db_context, a_group, a_values[i].key);
+                dap_global_db_del_sync(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");
             }
@@ -582,7 +580,7 @@ static dap_chain_cs_dag_event_round_item_t *s_round_event_choose_dup(dap_list_t
  * @param a_is_pinned
  * @param a_arg
  */
-static bool s_callback_round_event_to_chain_callback_get_round_item(dap_global_db_context_t *a_global_db_context,
+static bool s_callback_round_event_to_chain_callback_get_round_item(dap_global_db_instance_t *a_dbi,
                                                                     int a_rc, const char *a_group,
                                                                     const size_t a_values_total, const size_t a_values_count,
                                                                     dap_store_obj_t *a_values, void *a_arg)
@@ -791,7 +789,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
 static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group,
                                         const char *a_key, const void *a_value, const size_t a_value_size)
 {
-    if (a_op_code != DAP_DB$K_OPTYPE_ADD || !a_key || !a_value || !a_value_size)
+    if (a_op_code != DAP_GLOBAL_DB_OPTYPE_ADD || !a_key || !a_value || !a_value_size)
         return 0;
 
     dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA(a_dag);
diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
index 42032fa4d9..440b2fa978 100644
--- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
+++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
@@ -79,8 +79,8 @@ void dap_chain_cs_dag_pos_deinit(void)
  */
 static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 {
-    dap_chain_cs_dag_new(a_chain,a_chain_cfg);
-    dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG ( a_chain );
+    dap_chain_cs_type_create("dag", a_chain, a_chain_cfg);
+    dap_chain_cs_dag_t *l_dag = DAP_CHAIN_CS_DAG ( a_chain );
     dap_chain_cs_dag_pos_t *l_pos = DAP_NEW_Z( dap_chain_cs_dag_pos_t);
     if (!l_pos) {
         log_it(L_CRITICAL, "Memory allocation error");
diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index 1b827a2956..ec1fb8d891 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -1,3 +1,26 @@
+/*
+* Authors:
+* Roman Khlopkov <roman.khlopkov@demlabs.net>
+* Cellframe       https://cellframe.net
+* DeM Labs Inc.   https://demlabs.net
+* Copyright  (c) 2017-2023
+* All rights reserved.
+
+This file is part of CellFrame SDK the open source project
+
+CellFrame SDK is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+CellFrame SDK is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/licenses/>.
+*/
 #include "dap_common.h"
 #include "utlist.h"
 #include "dap_timerfd.h"
@@ -61,7 +84,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl
 static uint256_t s_callback_get_minimum_fee(dap_chain_t *a_chain);
 static dap_enc_key_t *s_callback_get_sign_key(dap_chain_t *a_chain);
 static void s_callback_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_new_value);
-static void s_db_change_notifier(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void * a_arg);
+static void s_db_change_notifier(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void * a_arg);
 
 static int s_cli_esbocs(int argc, char ** argv, char **str_reply);
 
@@ -77,7 +100,6 @@ DAP_STATIC_INLINE const char *s_voting_msg_type_to_str(uint8_t a_type)
     case DAP_CHAIN_ESBOCS_MSG_TYPE_DIRECTIVE: return "DIRECTIVE";
     case DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_FOR: return "VOTE_FOR";
     case DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_AGAINST: return "VOTE_AGAINST";
-    case DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB: return "SEND_DB";
     default: return "UNKNOWN";
     }
 }
@@ -136,7 +158,7 @@ typedef struct dap_chain_esbocs_pvt {
 
 struct sync_params {
     uint64_t attempt;
-    dap_hash_fast_t db_hash;
+    dap_global_db_driver_hash_t db_hash;
 } DAP_ALIGN_PACKED;
 
 DAP_STATIC_INLINE uint16_t s_get_round_skip_timeout(dap_chain_esbocs_session_t *a_session)
@@ -161,7 +183,7 @@ void dap_chain_cs_esbocs_deinit(void)
 
 static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg)
 {
-    dap_chain_cs_blocks_new(a_chain, a_chain_cfg);
+    dap_chain_cs_type_create("blocks", a_chain, a_chain_cfg);
 
     dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain);
     int l_ret = 0;
@@ -281,104 +303,6 @@ static void s_new_atom_notifier(void *a_arg, UNUSED_ARG dap_chain_t *a_chain, UN
     pthread_mutex_unlock(&l_session->mutex);
 }
 
-/* *** Temporary added section for over-consensus sync. Remove this after global DB sync refactoring *** */
-
-static bool s_change_db_broadcast(UNUSED_ARG dap_proc_thread_t *a_thread, void *a_arg)
-{
-    dap_chain_esbocs_session_t *l_session = a_arg;
-    pthread_mutex_lock(&l_session->mutex);
-    if (!dap_hash_fast_is_blank(&l_session->db_hash) && l_session->db_serial && l_session->cur_round.all_validators)
-        s_message_send(l_session, DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB, &l_session->db_hash, l_session->db_serial,
-                   sizeof(*l_session->db_serial) + l_session->db_serial->data_size, l_session->cur_round.all_validators);
-    pthread_mutex_unlock(&l_session->mutex);
-    return true;
-}
-
-static void s_session_db_serialize(dap_global_db_context_t *a_context, void *a_arg)
-{
-    dap_chain_esbocs_session_t *l_session = a_arg;
-    char *l_sync_group = s_get_penalty_group(l_session->chain->net_id);
-    uint32_t l_time_store_lim_hours;
-    dap_global_db_notify_item_t *l_notify_item = dap_global_db_get_notify_group(a_context->instance, l_sync_group);
-    if (l_notify_item && l_notify_item->ttl)
-        l_time_store_lim_hours = l_notify_item->ttl;
-    else
-        l_time_store_lim_hours = a_context->instance->store_time_limit;
-    uint64_t l_limit_time = l_time_store_lim_hours ? dap_nanotime_now() - dap_nanotime_from_sec(l_time_store_lim_hours * 3600) : 0;
-    size_t l_objs_count = 0;
-    dap_global_db_pkt_t *l_pkt = 0;
-    dap_store_obj_t *l_objs = dap_global_db_get_all_raw_unsafe(a_context, l_sync_group, &l_objs_count);
-    for (size_t i = 0; i < l_objs_count; i++) {
-        dap_store_obj_t *it = l_objs + i;
-        if (l_notify_item->ttl && it->timestamp < l_limit_time) {
-            dap_chain_addr_t *l_signing_addr = dap_chain_addr_from_str(it->key);
-            dap_chain_net_srv_stake_mark_validator_active(l_signing_addr, true);
-            DAP_DEL_Z(l_signing_addr);
-            dap_global_db_driver_delete(it, 1);
-            continue;
-        }
-        it->type = DAP_DB$K_OPTYPE_ADD;
-        dap_global_db_pkt_t *l_pkt_single = dap_global_db_pkt_serialize(it);
-        dap_global_db_pkt_change_id(l_pkt_single, 0);
-        l_pkt = dap_global_db_pkt_pack(l_pkt, l_pkt_single);
-        DAP_DELETE(l_pkt_single);
-    }
-    dap_store_obj_free(l_objs, l_objs_count);
-
-    if (l_pkt)
-        dap_hash_fast(l_pkt->data, l_pkt->data_size, &l_session->db_hash);
-    else
-        l_session->db_hash = (dap_hash_fast_t){};
-    if (PVT(l_session->esbocs)->debug) {
-        char l_sync_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE];
-        dap_chain_hash_fast_to_str(&l_session->db_hash, l_sync_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
-        log_it(L_MSG, "DB changes applied, new DB resync hash is %s", l_sync_hash_str);
-    }
-
-    char *l_del_sync_group = dap_strdup_printf("%s.del", l_sync_group);
-    l_objs_count = 0;
-    l_objs = dap_global_db_get_all_raw_unsafe(a_context, l_sync_group, &l_objs_count);
-    
-    DAP_DELETE(l_del_sync_group);
-    for (size_t i = 0; i < l_objs_count; i++) {
-        dap_store_obj_t *it = l_objs + i;
-        if (l_limit_time && it->timestamp < l_limit_time) {
-            dap_global_db_driver_delete(it, 1);
-            continue;
-        }
-        it->type = DAP_DB$K_OPTYPE_DEL;
-        DAP_DEL_Z(it->group);
-        it->group = dap_strdup(l_sync_group);
-        dap_global_db_pkt_t *l_pkt_single = dap_global_db_pkt_serialize(it);
-        dap_global_db_pkt_change_id(l_pkt_single, 0);
-        l_pkt = dap_global_db_pkt_pack(l_pkt, l_pkt_single);
-        DAP_DELETE(l_pkt_single);
-    }
-    dap_store_obj_free(l_objs, l_objs_count);
-    DAP_DELETE(l_sync_group);
-    DAP_DEL_Z(l_session->db_serial);
-    l_session->db_serial = l_pkt;
-
-    dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_change_db_broadcast, l_session);
-}
-
-static void s_session_db_clear(UNUSED_ARG dap_global_db_context_t *a_context, void *a_arg)
-{
-    dap_chain_esbocs_session_t *l_session = a_arg;
-    char *l_sync_group = s_get_penalty_group(l_session->chain->net_id);
-    dap_store_obj_t l_obj = {
-        .group = l_sync_group
-    };
-    dap_global_db_driver_delete(&l_obj, 1);
-    char *l_del_sync_group = dap_strdup_printf("%s.del", l_sync_group);
-    DAP_DELETE(l_sync_group);
-    l_obj.group = l_del_sync_group;
-    dap_global_db_driver_delete(&l_obj, 1);
-    DAP_DELETE(l_del_sync_group);
-}
-
-/* *** End of the temporary added section for over-consensus sync. *** */
-
 static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cfg)
 {
     dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain);
@@ -470,10 +394,20 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf
     l_esbocs->session = l_session;
     l_session->my_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
     l_session->my_signing_addr = l_my_signing_addr;
-    dap_global_db_context_exec(s_session_db_clear, l_session);
-    dap_global_db_add_notify_group_mask(dap_global_db_context_get_default()->instance,
-                                        DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX ".*",
-                                        s_db_change_notifier, l_session, 72);
+    char *l_sync_group = s_get_penalty_group(l_net->pub.id);
+    l_session->db_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(),
+                                                      l_sync_group, l_sync_group,
+                                                      72 * 3600, true,
+                                                      s_db_change_notifier, l_session,
+                                                      DAP_GDB_MEMBER_ROLE_NOBODY, DAP_CLUSTER_ROLE_AUTONOMIC);
+    DAP_DELETE(l_sync_group);
+
+    dap_list_t *l_validators = dap_chain_net_srv_stake_get_validators(a_chain->net_id, false);
+    for (dap_list_t *it = l_validators; it; it = it->next) {
+        dap_stream_node_addr_t *l_addr = &((dap_chain_net_srv_stake_item_t *)it->data)->node_addr;
+        dap_global_db_cluster_member_add(l_session->db_cluster, l_addr, DAP_GDB_MEMBER_ROLE_ROOT);
+        dap_chain_net_add_validator_to_clusters(l_net, l_addr);
+    }
     pthread_mutexattr_t l_mutex_attr;
     pthread_mutexattr_init(&l_mutex_attr);
     pthread_mutexattr_settype(&l_mutex_attr, PTHREAD_MUTEX_RECURSIVE);
@@ -667,10 +601,10 @@ static void s_get_last_block_hash(dap_chain_t *a_chain, dap_chain_hash_fast_t *a
     a_chain->callback_atom_iter_delete(l_iter);
 }
 
-static int s_callback_addr_compare(const void *a_list_elem, const void *a_addr_elem)
+static int s_callback_addr_compare(dap_list_t *a_list_elem, dap_list_t *a_addr_elem)
 {
-    dap_chain_esbocs_validator_t *l_validator = (dap_chain_esbocs_validator_t*)((dap_list_t*)a_list_elem)->data;
-    dap_chain_addr_t *l_addr = (dap_chain_addr_t*)((dap_list_t*)a_addr_elem)->data;
+    dap_chain_esbocs_validator_t *l_validator = a_list_elem->data;
+    dap_chain_addr_t *l_addr = a_addr_elem->data;
     if (!l_validator || !l_addr) {
         log_it(L_CRITICAL, "Invalid argument");
         return -1;
@@ -683,10 +617,10 @@ static dap_list_t *s_validator_check(dap_chain_addr_t *a_addr, dap_list_t *a_val
     return dap_list_find(a_validators, a_addr, s_callback_addr_compare);
 }
 
-static int s_callback_addr_compare_synced(const void *a_list_elem, const void *a_addr_elem)
+static int s_callback_addr_compare_synced(dap_list_t *a_list_elem, dap_list_t *a_addr_elem)
 {
-    dap_chain_esbocs_validator_t *l_validator = (dap_chain_esbocs_validator_t*)((dap_list_t*)a_list_elem)->data;
-    dap_chain_addr_t *l_addr = (dap_chain_addr_t*)((dap_list_t*)a_addr_elem)->data;
+    dap_chain_esbocs_validator_t *l_validator = a_list_elem->data;
+    dap_chain_addr_t *l_addr = a_addr_elem->data;
     if (!l_validator || !l_addr) {
         log_it(L_CRITICAL, "Invalid argument");
         return -1;
@@ -715,7 +649,7 @@ static void s_session_send_startsync(dap_chain_esbocs_session_t *a_session)
             dap_string_append_printf(l_addr_list, NODE_ADDR_FP_STR"; ",
                                      NODE_ADDR_FP_ARGS_S(((dap_chain_esbocs_validator_t *)it->data)->node_addr));
         }
-        char *l_sync_hash = dap_chain_hash_fast_to_str_new(&a_session->db_hash);
+        char *l_sync_hash = dap_global_db_driver_hash_print(a_session->db_hash);
         log_it(L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U"."
                        " Sent START_SYNC pkt, sync attempt %"DAP_UINT64_FORMAT_U" current validators list: %s DB sync hash %s",
                             a_session->chain->net_name, a_session->chain->name, a_session->cur_round.id,
@@ -832,8 +766,7 @@ static void s_session_round_new(dap_chain_esbocs_session_t *a_session)
             return;
         }
     }
-    dap_list_t *l_validators = dap_chain_net_srv_stake_get_validators(a_session->chain->net_id, true);
-    l_validators = dap_list_concat(l_validators, dap_chain_net_srv_stake_get_validators(a_session->chain->net_id, false));
+    dap_list_t *l_validators = dap_chain_net_srv_stake_get_validators(a_session->chain->net_id, false);
     a_session->cur_round.all_validators = dap_list_copy_deep(l_validators, s_callback_list_form, NULL);
     dap_list_free_full(l_validators, NULL);
     bool l_round_already_started = a_session->round_fast_forward;
@@ -961,15 +894,14 @@ static uint64_t s_session_calc_current_round_id(dap_chain_esbocs_session_t *a_se
     return l_ret ? l_ret : a_session->cur_round.id;
 }
 
-static int s_signs_sort_callback(const void *a_sign1, const void *a_sign2)
+static int s_signs_sort_callback(dap_list_t *a_sign1, dap_list_t *a_sign2)
 {
-    dap_sign_t  *l_sign1 = (dap_sign_t*)((dap_list_t*)a_sign1)->data,
-                *l_sign2 = (dap_sign_t*)((dap_list_t*)a_sign2)->data;
+    dap_sign_t  *l_sign1 = a_sign1->data,
+                *l_sign2 = a_sign2->data;
     if (!l_sign1 || !l_sign2) {
         log_it(L_CRITICAL, "Invalid element");
         return 0;
     }
-
     size_t  l_size1 = dap_sign_get_size(l_sign1),
             l_size2 = dap_sign_get_size(l_sign2),
             l_size_min = MIN(l_size1, l_size2);
@@ -1499,7 +1431,7 @@ typedef struct fee_serv_param
     dap_chain_t * chain;
 }fee_serv_param_t;
 
-static bool s_check_db_callback_fee_collect (UNUSED_ARG dap_global_db_context_t *a_global_db_context,
+static bool s_check_db_callback_fee_collect (UNUSED_ARG dap_global_db_instance_t *a_dbi,
                                              UNUSED_ARG int a_rc, UNUSED_ARG const char *a_group,
                                              UNUSED_ARG const size_t a_values_total, const size_t a_values_count,
                                              dap_global_db_obj_t *a_values, void *a_arg)
@@ -1822,7 +1754,7 @@ 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_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg)
+static void s_db_change_notifier(dap_global_db_instance_t *a_dbi, 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);
@@ -1830,9 +1762,9 @@ static void s_db_change_notifier(dap_global_db_context_t *a_context, dap_store_o
         log_it(L_WARNING, "Unreadable address in esbocs global DB group");
         dap_global_db_driver_delete(a_obj, 1);
     }
-    if (dap_chain_net_srv_stake_mark_validator_active(l_validator_addr, a_obj->type != DAP_DB$K_OPTYPE_ADD))
+    if (dap_chain_net_srv_stake_mark_validator_active(l_validator_addr, a_obj->type != DAP_GLOBAL_DB_OPTYPE_ADD))
         dap_global_db_driver_delete(a_obj, 1);
-    s_session_db_serialize(a_context, l_session);
+    l_session->db_hash = dap_global_db_driver_hash_get(a_obj);
 }
 
 static int s_session_directive_apply(dap_chain_esbocs_directive_t *a_directive, dap_hash_fast_t *a_directive_hash)
@@ -1975,15 +1907,6 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
                 s_session_sync_queue_add(l_session, l_message, a_data_size);
                 goto session_unlock;
             }
-        } else if (l_message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB) {
-            if (dap_hash_fast_compare(&l_message->hdr.candidate_hash, &l_session->db_hash) &&
-                    !dap_hash_fast_is_blank(&l_session->db_hash)) {
-                debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U"."
-                                            " Send DB message with same DB hash is ignored",
-                                                l_session->chain->net_name, l_session->chain->name,
-                                                    l_session->cur_round.id);
-                goto session_unlock;
-            }
         } else if (l_message->hdr.round_id != l_session->cur_round.id) {
             // round check
             debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu."
@@ -2041,7 +1964,6 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
     bool l_not_in_list = false;
     switch (l_message->hdr.type) {
     case DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC:
-    case DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB:
         // Add local sync messages, cause a round clear
         if (!a_sender_node_addr)
             s_message_chain_add(l_session, l_message, a_data_size, a_data_hash, &l_signing_addr);
@@ -2081,24 +2003,11 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
                                         l_session->chain->net_name, l_session->chain->name, l_message->hdr.round_id,
                                             l_validator_addr_str, l_sync_attempt);
         if (!PVT(l_session->esbocs)->emergency_mode &&
-                !dap_hash_fast_compare(&((struct sync_params *)l_message_data)->db_hash, &l_session->db_hash)) {
+                !dap_global_db_driver_hash_compare(((struct sync_params *)l_message_data)->db_hash, l_session->db_hash)) {
             debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", sync_attempt %"DAP_UINT64_FORMAT_U
                                         " SYNC message is rejected cause DB hash mismatch",
                                            l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id,
                                                l_session->cur_round.sync_attempt);
-            if (l_session->db_serial) {
-                dap_chain_esbocs_validator_t *l_validator = DAP_NEW_Z(dap_chain_esbocs_validator_t);
-                if (!l_validator) {
-                    log_it(L_CRITICAL, "Memory allocation error");
-                    goto session_unlock;
-                }
-                l_validator->node_addr = *dap_chain_net_srv_stake_key_get_node_addr(&l_signing_addr);
-                l_validator->signing_addr = l_signing_addr;
-                dap_list_t *l_validator_list = dap_list_append(NULL, l_validator);
-                s_message_send(l_session, DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB, &l_session->db_hash, l_session->db_serial,
-                               sizeof(*l_session->db_serial) + l_session->db_serial->data_size, l_validator_list);
-                dap_list_free_full(l_validator_list, NULL);
-            }
             break;
         }
         if (l_sync_attempt != l_session->cur_round.sync_attempt) {
@@ -2153,21 +2062,6 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
         }
     } break;
 
-    case DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB: {
-        dap_global_db_pkt_t *l_db_pkt = l_message_data;
-        if (l_db_pkt->data_size + sizeof(*l_db_pkt) != l_message_data_size) {
-            log_it(L_WARNING, "Wrong send_db message size, have %zu bytes, must be %zu bytes",
-                                  l_message_data_size, l_db_pkt->data_size + sizeof(*l_db_pkt));
-            break;
-        }
-        size_t l_data_objs_count = 0;
-        dap_store_obj_t *l_store_objs = dap_global_db_pkt_deserialize(l_db_pkt, &l_data_objs_count);
-        for (size_t i = 0; i < l_data_objs_count; i++)
-            dap_global_db_remote_apply_obj(l_store_objs + i, NULL, NULL);
-        if (l_store_objs)
-            dap_store_obj_free(l_store_objs, l_data_objs_count);
-    } break;
-
     case DAP_CHAIN_ESBOCS_MSG_TYPE_SUBMIT: {
         uint8_t *l_candidate = l_message_data;
         size_t l_candidate_size = l_message_data_size;
@@ -2470,8 +2364,7 @@ static void s_message_send(dap_chain_esbocs_session_t *a_session, uint8_t a_mess
     for (dap_list_t *it = a_validators; it; it = it->next) {
         dap_chain_esbocs_validator_t *l_validator = it->data;
         if (l_validator->is_synced ||
-                a_message_type == DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC ||
-                a_message_type == DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB) {
+                a_message_type == DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC) {
             debug_if(PVT(a_session->esbocs)->debug, L_MSG, "Send pkt type 0x%x to "NODE_ADDR_FP_STR,
                                                             a_message_type, NODE_ADDR_FP_ARGS_S(l_validator->node_addr));
             l_voting_pkt->hdr.receiver_node_addr = l_validator->node_addr;
diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h
index 7a95d9dbf4..f680c1b695 100644
--- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h
+++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h
@@ -1,3 +1,26 @@
+/*
+* Authors:
+* Roman Khlopkov <roman.khlopkov@demlabs.net>
+* Cellframe       https://cellframe.net
+* DeM Labs Inc.   https://demlabs.net
+* Copyright  (c) 2017-2023
+* All rights reserved.
+
+This file is part of CellFrame SDK the open source project
+
+CellFrame SDK is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+CellFrame SDK is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/licenses/>.
+*/
 #pragma once
 
 #include "dap_timerfd.h"
@@ -5,7 +28,7 @@
 #include "dap_chain_block.h"
 #include "dap_chain_cs_blocks.h"
 #include "dap_cert.h"
-#include "dap_global_db_remote.h"
+#include "dap_global_db_driver.h"
 
 #define DAP_CHAIN_ESBOCS_PROTOCOL_VERSION           8
 #define DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX          "esbocs"
@@ -19,7 +42,6 @@
 #define DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_FOR          0x22
 #define DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_AGAINST      0x24
 #define DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC        0x32
-#define DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB           0x36
 
 #define DAP_CHAIN_BLOCKS_SESSION_ROUND_ID_SIZE		8
 #define DAP_CHAIN_BLOCKS_SESSION_MESSAGE_ID_SIZE	8
@@ -176,12 +198,10 @@ typedef struct dap_chain_esbocs_session {
     dap_chain_addr_t my_signing_addr;
 
     dap_chain_esbocs_penalty_item_t *penalty;
-    // Temporary sync-over-consensus params
-    dap_global_db_pkt_t *db_serial;
-    dap_hash_fast_t db_hash;
+    dap_global_db_cluster_t *db_cluster;
+    dap_global_db_driver_hash_t db_hash;
 
-    struct dap_chain_esbocs_session *next;
-    struct dap_chain_esbocs_session *prev;
+    struct dap_chain_esbocs_session *prev, *next;
 } dap_chain_esbocs_session_t;
 
 #define DAP_CHAIN_ESBOCS(a) ((dap_chain_esbocs_t *)(a)->_inheritor)
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index 5e21ae4e98..a7b58980f1 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -70,7 +70,7 @@
 
 #define LOG_TAG "dap_chain_mempool"
 
-static bool s_tx_create_massive_gdb_save_callback(dap_global_db_context_t *a_global_db_context,
+static bool s_tx_create_massive_gdb_save_callback(dap_global_db_instance_t *a_dbi,
                                                   int a_rc, const char *a_group,
                                                   const size_t a_values_total, const size_t a_values_count,
                                                   dap_global_db_obj_t *a_values, void *a_arg);
@@ -596,11 +596,12 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
  * @param a_values
  * @param a_arg
  */
-static bool s_tx_create_massive_gdb_save_callback(dap_global_db_context_t *a_global_db_context,
+static bool s_tx_create_massive_gdb_save_callback(dap_global_db_instance_t *a_dbi,
                                                   int a_rc, const char *a_group,
                                                   const size_t a_values_total, const size_t a_values_count,
                                                   dap_global_db_obj_t *a_values, void *a_arg)
 {
+    DAP_DELETE(a_values);
     if(!a_rc) {
         log_it(L_NOTICE, "%zu transaction are placed in mempool", a_values_total);
         return true;
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 6b0f8ff84f..5a281953a5 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -81,10 +81,10 @@
 #include "dap_timerfd.h"
 #include "dap_stream_worker.h"
 #include "dap_worker.h"
-#include "dap_proc_queue.h"
 #include "dap_proc_thread.h"
 #include "dap_enc_http.h"
 #include "dap_chain_common.h"
+#include "dap_chain_cell.h"
 #include "dap_chain_datum_decree.h"
 #include "dap_chain_datum_anchor.h"
 #include "dap_chain_tx.h"
@@ -95,7 +95,6 @@
 #include "dap_chain_net_decree.h"
 #include "dap_chain_net_srv.h"
 #include "dap_chain_net_balancer.h"
-#include "dap_chain_pvt.h"
 #include "dap_chain_node_client.h"
 #include "dap_chain_node_cli.h"
 #include "dap_chain_node_cli_cmd.h"
@@ -104,8 +103,6 @@
 #include "dap_chain_cs_none.h"
 #include "dap_client_http.h"
 #include "dap_global_db.h"
-#include "dap_global_db_remote.h"
-
 #include "dap_stream_ch_chain_net_pkt.h"
 #include "dap_stream_ch_chain_net.h"
 #include "dap_stream_ch_chain.h"
@@ -148,16 +145,6 @@ struct net_link {
     UT_hash_handle hh;
 };
 
-struct downlink {
-    dap_chain_net_t *net;
-    dap_stream_worker_t *worker;
-    dap_stream_ch_uuid_t ch_uuid;
-    dap_events_socket_uuid_t esocket_uuid;
-    char addr[INET_ADDRSTRLEN];
-    int port;
-    UT_hash_handle hh;
-};
-
 /**
   * @struct dap_chain_net_pvt
   * @details Private part of chain_net dap object
@@ -168,8 +155,7 @@ typedef struct dap_chain_net_pvt{
     uint32_t  flags;
     time_t    last_sync;
 
-    dap_chain_node_addr_t * node_addr;
-    dap_chain_node_info_t * node_info;  // Current node's info
+    dap_chain_node_info_t *node_info;  // Current node's info
 
     atomic_uint balancer_link_requests;
     bool balancer_http;
@@ -181,9 +167,7 @@ typedef struct dap_chain_net_pvt{
     bool only_static_links;
     uint16_t required_links_count;
     uint16_t max_links_count;
-    uint16_t reconnect_delay;         // sec
-
-    struct downlink *downlinks;         // HT of links who sent SYNC REQ, it used for sync broadcasting
+    uint16_t reconnect_delay;           // sec
 
     bool load_mode;
     char ** seed_aliases;
@@ -208,15 +192,17 @@ typedef struct dap_chain_net_pvt{
     _Atomic(dap_chain_net_state_t) state, state_target;
     uint16_t acl_idx;
 
-
     // Main loop timer
     dap_interval_timer_t main_timer;
-    pthread_mutex_t uplinks_mutex, downlinks_mutex;
-    pthread_rwlock_t states_lock;
+    pthread_mutex_t uplinks_mutex;
 
     dap_list_t *gdb_notifiers;
 
-    dap_interval_timer_t update_links_timer;
+    //Global DB clusters for different access groups.
+    dap_global_db_cluster_t *zerochain_cluster;
+    dap_global_db_cluster_t *mempool_cluster;
+    dap_global_db_cluster_t *orders_cluster;
+    dap_global_db_cluster_t *nodes_cluster;
 } dap_chain_net_pvt_t;
 
 typedef struct dap_chain_net_item{
@@ -273,38 +259,30 @@ static int s_net_init(const char * a_net_name, uint16_t a_acl_idx);
 
 static int s_net_load(dap_chain_net_t *a_net);
 
-static int s_net_init_node_addr_cert();
-
-// Notify callback for GlobalDB changes
-static void s_gbd_history_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg);
-static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void *a_atom, size_t a_atom_size);
 static int s_cli_net(int argc, char ** argv, char **str_reply);
 static uint8_t *s_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash);
 static void s_prepare_links_from_balancer(dap_chain_net_t *a_net);
 static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_replace_tries);
 
-//Timer update links
-
-static void s_update_links_timer_callback(void *a_arg){
+static void s_update_my_link_info_timer_callback(void *a_arg)
+{
     dap_chain_net_t *l_net = (dap_chain_net_t*)a_arg;
-    //Updated links
-    size_t l_count_downlinks = 0,l_blocks_events = 0;
-    dap_chain_node_addr_t *l_current_addr = dap_chain_net_get_cur_addr(l_net);
-    dap_chain_node_info_t *l_node_info = dap_chain_node_info_read(l_net, l_current_addr);
+    size_t l_blocks_events = 0;
+    dap_chain_node_info_t *l_node_info = dap_chain_node_info_read(l_net, &g_node_addr);
     if (!l_node_info)
         return;
-    l_node_info->hdr.links_number = l_count_downlinks;
     dap_chain_t *l_chain;
     DL_FOREACH(l_net->pub.chains, l_chain) {
         if(l_chain->callback_count_atom)
             l_blocks_events += l_chain->callback_count_atom(l_chain);
     }
     l_node_info->hdr.blocks_events = l_blocks_events;
-    char *l_key = dap_chain_node_addr_to_hash_str(l_current_addr);
+    char *l_key = dap_chain_node_addr_to_hash_str(&g_node_addr);
     //dap_global_db_set_sync(l_net->pub.gdb_nodes, l_key, l_node_info, dap_chain_node_info_get_size(l_node_info), false);
     DAP_DELETE(l_node_info);
 }
 
+
 /**
  * @brief
  * init network settings from cellrame-node.cfg file
@@ -344,10 +322,6 @@ int dap_chain_net_init()
             "\tPrint list of PoA cerificates for this network\n");
 
     s_debug_more = dap_config_get_item_bool_default(g_config,"chain_net","debug_more",false);
-    if(s_net_init_node_addr_cert()) {
-        log_it(L_ERROR,"Error init node-addr cert");
-        return -1;
-    }
 
     char * l_net_dir_str = dap_strdup_printf("%s/network", dap_config_path());
     DIR * l_net_dir = opendir( l_net_dir_str);
@@ -435,7 +409,7 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n
     //PVT(a_net)->flags |= F_DAP_CHAIN_NET_SYNC_FROM_ZERO;  // TODO set this flag according to -mode argument from command line
     if (a_new_state == NET_STATE_OFFLINE)
         return 0;
-    return dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_net_states_proc, a_net);
+    return dap_proc_thread_callback_add(NULL, s_net_states_proc, a_net);
 }
 
 dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net)
@@ -461,189 +435,7 @@ void dap_chain_net_add_gdb_notify_callback(dap_chain_net_t *a_net, dap_store_obj
     PVT(a_net)->gdb_notifiers = dap_list_append(PVT(a_net)->gdb_notifiers, l_notifier);
 }
 
-void dap_chain_net_add_downlink_cb(UNUSED_ARG dap_worker_t *a_worker, void *a_arg) {
-    struct downlink *l_downlink = (struct downlink*)a_arg;
-    if (!l_downlink->net) {
-        DAP_DELETE(l_downlink);
-        return;
-    }
-    dap_chain_net_pvt_t *l_net_pvt = PVT(l_downlink->net);
-    unsigned a_hash_value;
-    HASH_VALUE(&l_downlink->ch_uuid, sizeof(l_downlink->ch_uuid), a_hash_value);
-    struct downlink *l_sought_downlink = NULL;
-    pthread_mutex_lock(&l_net_pvt->downlinks_mutex);
-    HASH_FIND_BYHASHVALUE(hh, l_net_pvt->downlinks, &l_downlink->ch_uuid, sizeof(l_downlink->ch_uuid), a_hash_value, l_sought_downlink);
-    if (l_sought_downlink) {
-        pthread_mutex_unlock(&l_net_pvt->downlinks_mutex);
-        DAP_DELETE(l_downlink);
-        return;
-    }
-    HASH_ADD_BYHASHVALUE(hh, l_net_pvt->downlinks, ch_uuid, sizeof(l_downlink->ch_uuid), a_hash_value, l_downlink);
-    pthread_mutex_unlock(&l_net_pvt->downlinks_mutex);
-}
-
-void dap_chain_net_add_downlink(dap_chain_net_t *a_net, dap_stream_worker_t *a_worker,
-                               dap_stream_ch_uuid_t a_ch_uuid, dap_events_socket_uuid_t a_esocket_uuid,
-                               char *a_addr, int a_port)
-{
-    struct downlink *l_downlink = DAP_NEW_Z(struct downlink);
-    if (!l_downlink) {
-        log_it(L_CRITICAL, "Memory allocation error");
-        return;
-    }
-    *l_downlink = (struct downlink) {
-            .net            = a_net,
-            .worker         = a_worker,
-            .ch_uuid        = a_ch_uuid,
-            .esocket_uuid   = a_esocket_uuid,
-            .port           = a_port
-    };
-    strncpy(l_downlink->addr, a_addr, INET_ADDRSTRLEN - 1);
-    dap_worker_exec_callback_on(a_worker->worker, dap_chain_net_add_downlink_cb, l_downlink);
-}
-
-void dap_chain_net_del_downlink(dap_stream_ch_uuid_t *a_ch_uuid) {
-    unsigned l_hash_value;
-    HASH_VALUE(a_ch_uuid, sizeof(*a_ch_uuid), l_hash_value);
-    struct downlink *l_downlink = NULL;
-    for (dap_chain_net_item_t *l_net_item = s_net_items; l_net_item && !l_downlink; l_net_item = l_net_item->hh.next) {
-        dap_chain_net_pvt_t *l_net_pvt = PVT(l_net_item->chain_net);
-        pthread_mutex_lock(&l_net_pvt->downlinks_mutex);
-        HASH_FIND_BYHASHVALUE(hh, l_net_pvt->downlinks, a_ch_uuid, sizeof(*a_ch_uuid), l_hash_value, l_downlink);
-        if (l_downlink) {
-            HASH_DEL(l_net_pvt->downlinks, l_downlink);
-            log_it(L_MSG, "Remove downlink %s : %d from net ht", l_downlink->addr, l_downlink->port);
-            DAP_DELETE(l_downlink);
-        }
-        pthread_mutex_unlock(&l_net_pvt->downlinks_mutex);
-    }
-}
-
-/**
- * @brief executes, when you add data to gdb and sends it to current network connected nodes
- * @param a_arg arguments. Can be network object (dap_chain_net_t)
- * @param a_op_code object type (f.e. l_net->type from dap_store_obj)
- * @param a_group group, for example "chain-gdb.home21-network.chain-F"
- * @param a_key key hex value, f.e. 0x12EFA084271BAA5EEE93B988E73444B76B4DF5F63DADA4B300B051E29C2F93
- * @param a_value buffer with data
- * @param a_value_size buffer size
- */
-void dap_chain_net_sync_gdb_broadcast(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg)
-{
-    if (!a_arg || !a_obj || !a_obj->group || !a_obj->key)
-        return;
-    // Check object lifetime for broadcasting decision
-    dap_time_t l_time_diff = dap_nanotime_to_sec(dap_nanotime_now() - a_obj->timestamp);
-    if (l_time_diff > DAP_BROADCAST_LIFETIME * 60)
-        return;
-
-    dap_chain_net_t *l_net = (dap_chain_net_t*)a_arg;
-    dap_global_db_pkt_t *l_data_out = dap_global_db_pkt_serialize(a_obj);
-    struct downlink *l_link, *l_tmp;
-    dap_stream_ch_cachet_t *l_active_downs = NULL;
-    pthread_mutex_lock(&PVT(l_net)->downlinks_mutex);
-    size_t l_new_count = 0, l_count = HASH_COUNT(PVT(l_net)->downlinks);
-    l_active_downs = DAP_NEW_Z_COUNT(dap_stream_ch_cachet_t, l_count);
-    HASH_ITER(hh, PVT(l_net)->downlinks, l_link, l_tmp) {
-        if (dap_stream_ch_check_uuid_mt(l_link->worker, l_link->ch_uuid)) {
-            l_active_downs[l_new_count++] = (dap_stream_ch_cachet_t){ .stream_worker = l_link->worker, .uuid = l_link->ch_uuid };
-        }
-    }
-    pthread_mutex_unlock(&PVT(l_net)->downlinks_mutex);
-    if (l_new_count < l_count) {
-        l_active_downs = DAP_REALLOC_COUNT(l_active_downs, l_new_count);
-    }
-    if (!dap_stream_ch_chain_pkt_write_multi_mt(l_active_downs, //_inter(a_context->queue_worker_ch_io_input[l_link->worker->worker->id],
-                                         l_new_count,
-                                         DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id.uint64,
-                                         0, 0, l_data_out,
-                                         sizeof(dap_global_db_pkt_t) + l_data_out->data_size))
-        debug_if(g_debug_reactor, L_ERROR, "Can't broadcast pkt");
-
-    DAP_DELETE(l_active_downs);
-    DAP_DELETE(l_data_out);
-}
-
-struct net_broadcast_atoms_args {
-    dap_chain_atom_ptr_t atom;
-    size_t atom_size;
-    dap_chain_net_t *net;
-    uint64_t chain_id;
-    uint64_t cell_id;
-};
-
-static bool s_net_send_atoms(dap_proc_thread_t *a_thread, void *a_arg)
-{
-    UNUSED(a_thread);
-
-    struct net_broadcast_atoms_args *l_args = a_arg;
-    dap_chain_net_t *l_net = l_args->net;
-    struct downlink *l_link, *l_tmp;
-    dap_stream_ch_cachet_t *l_active_downs = NULL;
-    pthread_mutex_lock(&PVT(l_net)->downlinks_mutex);
-    size_t l_new_count = 0, l_count = HASH_COUNT(PVT(l_net)->downlinks);
-    l_active_downs = DAP_NEW_Z_COUNT(dap_stream_ch_cachet_t, l_count);
-    HASH_ITER(hh, PVT(l_net)->downlinks, l_link, l_tmp) {
-        if (dap_stream_ch_check_uuid_mt(l_link->worker, l_link->ch_uuid)) {
-            l_active_downs[l_new_count++] = (dap_stream_ch_cachet_t){ .stream_worker = l_link->worker, .uuid = l_link->ch_uuid };
-        }
-    }
-    pthread_mutex_unlock(&PVT(l_net)->downlinks_mutex);
-    if (l_new_count < l_count) {
-        l_active_downs = DAP_REALLOC_COUNT(l_active_downs, l_new_count);
-    }
-    if(!dap_stream_ch_chain_pkt_write_multi_mt(l_active_downs, l_new_count, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN,
-                                     l_net->pub.id.uint64, l_args->chain_id, l_args->cell_id,
-                                     l_args->atom, l_args->atom_size))
-        debug_if(g_debug_reactor, L_ERROR, "Can't broadcast atom");
-    DAP_DELETE(l_active_downs);
-    DAP_DELETE(l_args->atom);
-    DAP_DELETE(l_args);
-    return true;
-}
-
-/**
- * @brief s_chain_callback_notify
- * @param a_arg
- * @param a_chain
- * @param a_id
- */
-static void s_chain_callback_notify(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void* a_atom, size_t a_atom_size)
-{
-    if (!a_arg || !a_chain || !a_atom) {
-        log_it(L_ERROR, "Argument is NULL for s_chain_callback_notify");
-        return;
-    }
-    dap_chain_net_t *l_net = (dap_chain_net_t*)a_arg;
-    // Check object lifetime for broadcasting decision
-    dap_time_t l_time_diff = dap_time_now() - a_chain->callback_atom_get_timestamp(a_atom);
-    if (l_time_diff > DAP_BROADCAST_LIFETIME * 60)
-        return;
-
-    struct net_broadcast_atoms_args *l_args = DAP_NEW(struct net_broadcast_atoms_args);
-    if (!l_args) {
-        log_it(L_CRITICAL, "Memory allocation error");
-        return;
-    }
-    l_args->net = l_net;
-    l_args->atom = DAP_DUP_SIZE(a_atom, a_atom_size);
-    l_args->atom_size = a_atom_size;
-    l_args->chain_id = a_chain->id.uint64;
-    l_args->cell_id = a_id.uint64;
-    dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_net_send_atoms, l_args);
-}
-
-/**
- * @brief added like callback in dap_global_db_add_sync_group
- *
- * @param a_arg arguments. Can be network object (dap_chain_net_t)
- * @param a_op_code object type (f.e. l_net->type from dap_store_obj)
- * @param a_group group, for example "chain-gdb.home21-network.chain-F"
- * @param a_key key hex value, f.e. 0x12EFA084271BAA5EEE93B988E73444B76B4DF5F63DADA4B300B051E29C2F93
- * @param a_value buffer with data
- * @param a_value_len buffer size
- */
-static void s_gbd_history_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg)
+static void s_network_change_notify(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg)
 {
     if (!a_obj || !a_arg)
         return;
@@ -653,7 +445,7 @@ static void s_gbd_history_callback_notify(dap_global_db_context_t *a_context, da
         if (!el)
             continue;
         if (el->callback)
-            el->callback(a_context, a_obj, el->cb_arg);
+            el->callback(a_dbi, a_obj, el->cb_arg);
     }
     dap_chain_t *l_chain;
     DL_FOREACH(l_net->pub.chains, l_chain) {
@@ -667,11 +459,12 @@ static void s_gbd_history_callback_notify(dap_global_db_context_t *a_context, da
                 if (!el)
                     continue;
                 if (el->callback)
-                    el->callback(a_context, a_obj, el->cb_arg);
+                    el->callback(a_dbi, a_obj, el->cb_arg);
             }
         }
         DAP_DELETE(l_gdb_group_str);
     }
+
 }
 
 dap_chain_node_info_t *dap_get_balancer_link_from_cfg(dap_chain_net_t *a_net)
@@ -684,26 +477,17 @@ dap_chain_node_info_t *dap_get_balancer_link_from_cfg(dap_chain_net_t *a_net)
     if (l_net_pvt->seed_aliases_count) {
         do {
             i = dap_random_uint16() % l_net_pvt->seed_aliases_count;
-        } while (l_net_pvt->seed_nodes_addrs[i] == l_net_pvt->node_addr->uint64);
-
-        /*dap_chain_node_addr_t *l_remote_addr = dap_chain_node_alias_find(a_net, l_net_pvt->seed_aliases[i]);
-        if (l_remote_addr){
-            */
-            dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t);
-            if(l_link_node_info){
-                l_link_node_info->hdr.address.uint64 = l_net_pvt->seed_nodes_addrs[i];
-                l_link_node_info->hdr.ext_addr_v4.s_addr = l_net_pvt->seed_nodes_addrs_v4[i].s_addr;
-                l_link_node_info->hdr.ext_port = l_net_pvt->seed_nodes_ports[i];
-                return l_link_node_info;
-            }else{
-                log_it(L_WARNING,"Can't allocate memory");
-                return NULL;
-            }
-        /*}
-        else{
-            log_it(L_WARNING,"Can't find alias info for seed alias %s",l_net_pvt->seed_aliases[i]);
+        } while (l_net_pvt->seed_nodes_addrs[i] == g_node_addr.uint64);
+        dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t);
+        if(l_link_node_info){
+            l_link_node_info->hdr.address.uint64 = l_net_pvt->seed_nodes_addrs[i];
+            l_link_node_info->hdr.ext_addr_v4.s_addr = l_net_pvt->seed_nodes_addrs_v4[i].s_addr;
+            l_link_node_info->hdr.ext_port = l_net_pvt->seed_nodes_ports[i];
+            return l_link_node_info;
+        }else{
+            log_it(L_WARNING,"Can't allocate memory");
             return NULL;
-        }*/
+        }
     } else if (l_net_pvt->bootstrap_nodes_count) {
         i = dap_random_uint16() % l_net_pvt->bootstrap_nodes_count;
         l_node_adrr = 0;
@@ -721,6 +505,16 @@ dap_chain_node_info_t *dap_get_balancer_link_from_cfg(dap_chain_net_t *a_net)
     return l_link_node_info;
 }
 
+void dap_chain_net_add_cluster_link(dap_chain_net_t *a_net, dap_stream_node_addr_t *a_node_addr)
+{
+    dap_return_if_fail(a_net && a_node_addr);
+    dap_cluster_t *l_links_cluster = dap_cluster_by_mnemonim(a_net->pub.gdb_groups_prefix);
+    if (l_links_cluster)
+        dap_cluster_member_add(l_links_cluster, a_node_addr, 0, NULL);
+    else
+        log_it(L_ERROR, "Not found links cluster for net %s", a_net->pub.name);
+}
+
 /**
  * @brief Check if the current link is already present or not
  *
@@ -899,8 +693,10 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie
     if ( s_debug_more )
     log_it(L_NOTICE, "Established connection with %s."NODE_ADDR_FP_STR,l_net->pub.name,
            NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr));
-    pthread_rwlock_wrlock(&l_net_pvt->states_lock);
     a_node_client->is_connected = true;
+    dap_stream_t *l_stream = dap_client_get_stream(a_node_client->client);
+    assert(l_stream);
+    dap_chain_net_add_cluster_link(l_net, &l_stream->node);
     struct json_object *l_json = s_net_states_json_collect(l_net);
     char l_err_str[128] = { };
     snprintf(l_err_str, sizeof(l_err_str)
@@ -911,9 +707,8 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie
     json_object_put(l_json);
     if(l_net_pvt->state == NET_STATE_LINKS_CONNECTING ){
         l_net_pvt->state = NET_STATE_LINKS_ESTABLISHED;
-        dap_proc_queue_add_callback_inter(a_node_client->stream_worker->worker->proc_queue_input,s_net_states_proc,l_net );
+        dap_proc_thread_callback_add(a_node_client->stream_worker->worker->proc_queue_input,s_net_states_proc,l_net );
     }
-    pthread_rwlock_unlock(&l_net_pvt->states_lock);
 }
 
 /**
@@ -1051,7 +846,7 @@ static void s_net_links_complete_and_start(dap_chain_net_t *a_net, dap_worker_t
         if (l_net_pvt->state_target != NET_STATE_OFFLINE){
             l_net_pvt->state = NET_STATE_LINKS_CONNECTING;
         }
-        dap_proc_queue_add_callback_inter(a_worker->proc_queue_input, s_net_states_proc, a_net);
+        dap_proc_thread_callback_add(a_worker->proc_queue_input, s_net_states_proc, a_net);
     }
 }
 
@@ -1338,9 +1133,7 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net)
     json_object_object_add(l_json, "linksCount"       , json_object_new_int(PVT(a_net)->net_links ? HASH_COUNT(PVT(a_net)->net_links) : 0));
     json_object_object_add(l_json, "activeLinksCount" , json_object_new_int(s_net_get_active_links_count(a_net)));
     char l_node_addr_str[24] = {'\0'};
-    int l_tmp = PVT(a_net)->node_addr
-            ? snprintf(l_node_addr_str, sizeof(l_node_addr_str), NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS(PVT(a_net)->node_addr))
-            : 0;
+    int l_tmp = snprintf(l_node_addr_str, sizeof(l_node_addr_str), NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(g_node_addr));
     json_object_object_add(l_json, "nodeAddress"     , json_object_new_string(l_tmp ? l_node_addr_str : "0000::0000::0000::0000"));
     return l_json;
 }
@@ -1394,13 +1187,6 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
                 DAP_DELETE(l_link);
             }
             pthread_mutex_unlock(&l_net_pvt->uplinks_mutex);
-            pthread_mutex_lock(&l_net_pvt->downlinks_mutex);
-            HASH_ITER(hh, l_net_pvt->downlinks, l_downlink, l_dltmp) {
-                HASH_DEL(l_net_pvt->downlinks, l_downlink);
-                dap_events_socket_delete_mt(l_downlink->worker->worker, l_downlink->esocket_uuid);
-                DAP_DELETE(l_downlink);
-            }
-            pthread_mutex_unlock(&l_net_pvt->downlinks_mutex);
             l_net_pvt->balancer_link_requests = 0;
             l_net_pvt->active_link = NULL;
             dap_list_free(l_net_pvt->links_queue);
@@ -1495,7 +1281,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
         default: log_it (L_DEBUG, "Unprocessed state");
     }
     s_net_states_notify(l_net);
-    return !l_repeat_after_exit;
+    return l_repeat_after_exit;
 }
 
 bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client)
@@ -1586,9 +1372,7 @@ static dap_chain_net_t *s_net_new(const char *a_id, const char *a_name,
     pthread_mutexattr_settype(&l_mutex_attr, PTHREAD_MUTEX_RECURSIVE);
     pthread_mutex_init(&PVT(l_ret)->uplinks_mutex, &l_mutex_attr);
     pthread_mutex_init(&l_ret->pub.balancer_mutex, &l_mutex_attr);
-    pthread_mutex_init(&PVT(l_ret)->downlinks_mutex, &l_mutex_attr);
     pthread_mutexattr_destroy(&l_mutex_attr);
-    pthread_rwlock_init(&PVT(l_ret)->states_lock, NULL);
     if (dap_chain_net_id_parse(a_id, &l_ret->pub.id) != 0) {
         DAP_DELETE(l_ret);
         return NULL;
@@ -1621,12 +1405,10 @@ static dap_chain_net_t *s_net_new(const char *a_id, const char *a_name,
  * free dap_chain_net_t * a_net object
  * @param a_net
  */
-void dap_chain_net_delete( dap_chain_net_t * a_net )
+void dap_chain_net_delete(dap_chain_net_t *a_net)
 {
     pthread_mutex_destroy(&PVT(a_net)->uplinks_mutex);
-    pthread_mutex_destroy(&PVT(a_net)->downlinks_mutex);
     pthread_mutex_destroy(&a_net->pub.balancer_mutex);
-    pthread_rwlock_destroy(&PVT(a_net)->states_lock);
     if(PVT(a_net)->seed_aliases) {
         DAP_DELETE(PVT(a_net)->seed_aliases);
         PVT(a_net)->seed_aliases = NULL;
@@ -2247,21 +2029,13 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
             if (l_return_state)
                 dap_chain_net_start(l_net);
         } else if (l_list_str && !strcmp(l_list_str, "list")) {
-            dap_list_t *l_net_keys = NULL;
-            for (dap_chain_t *l_chain = l_net->pub.chains; l_chain; l_chain = l_chain->next) {
-                if (!l_chain->callback_get_poa_certs)
-                    continue;
-                l_net_keys = l_chain->callback_get_poa_certs(l_chain, NULL, NULL);
-                if (l_net_keys)
-                    break;
-            }
-            if (!l_net_keys) {
+            if (!l_net->pub.keys) {
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "No PoA certs found for this network");
                 return -11;
             }
             dap_string_t *l_str_out = dap_string_new("List of network PoA certificates:\n");
             int i = 0;
-            for (dap_list_t *it = l_net_keys; it; it = it->next) {
+            for (dap_list_t *it = l_net->pub.keys; it; it = it->next) {
                 dap_hash_fast_t l_pkey_hash;
                 char l_pkey_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE];
                 dap_pkey_get_hash(it->data, &l_pkey_hash);
@@ -2314,10 +2088,10 @@ typedef struct list_priority_{
     char * chains_path;
 } list_priority;
 
-static int callback_compare_prioritity_list(const void *a_item1, const void *a_item2)
+static int callback_compare_prioritity_list(dap_list_t *a_item1, dap_list_t *a_item2)
 {
-    list_priority   *l_item1 = (list_priority*)((dap_list_t*)a_item1)->data,
-                    *l_item2 = (list_priority*)((dap_list_t*)a_item2)->data;
+    list_priority   *l_item1 = a_item1->data,
+                    *l_item2 = a_item2->data;
     if (!l_item1 || !l_item2) {
         log_it(L_CRITICAL, "Invalid arg");
         return 0;
@@ -2381,17 +2155,9 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
             return -1;
         }
     }
-    dap_chain_net_pvt_t * l_net_pvt = PVT(l_net);
+    dap_chain_net_pvt_t *l_net_pvt = PVT(l_net);
     l_net_pvt->load_mode = true;
     l_net_pvt->acl_idx = a_acl_idx;
-    l_net->pub.gdb_groups_prefix = dap_strdup (
-                dap_config_get_item_str_default(l_cfg , "general" , "gdb_groups_prefix",
-                                                dap_config_get_item_str(l_cfg , "general" , "name" ) ) );
-    dap_global_db_add_sync_group(l_net->pub.name, "global", s_gbd_history_callback_notify, l_net);
-    dap_global_db_add_sync_group(l_net->pub.name, l_net->pub.gdb_groups_prefix, s_gbd_history_callback_notify, l_net);
-
-    l_net->pub.gdb_nodes = dap_strdup_printf("%s.nodes",l_net->pub.gdb_groups_prefix);
-    l_net->pub.gdb_nodes_aliases = dap_strdup_printf("%s.nodes.aliases",l_net->pub.gdb_groups_prefix);
 
     // Bridged netwoks allowed to send transactions to
     uint16_t l_net_ids_count = 0;
@@ -2403,69 +2169,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
         l_net->pub.bridged_networks = dap_list_append(l_net->pub.bridged_networks, DAP_DUP(&l_id));
     }
 
-    // nodes for special sync
-    char **l_gdb_sync_nodes_addrs = dap_config_get_array_str(l_cfg, "general", "gdb_sync_nodes_addrs",
-            &l_net_pvt->gdb_sync_nodes_addrs_count);
-    if(l_gdb_sync_nodes_addrs && l_net_pvt->gdb_sync_nodes_addrs_count > 0) {
-        l_net_pvt->gdb_sync_nodes_addrs = DAP_NEW_Z_SIZE(dap_chain_node_addr_t,
-                sizeof(dap_chain_node_addr_t)*l_net_pvt->gdb_sync_nodes_addrs_count);
-        if (!l_net_pvt->gdb_sync_nodes_addrs) {
-            log_it(L_CRITICAL, "Memory allocation error");
-            dap_config_close(l_cfg);
-            return -1;
-        }
-        for(uint16_t i = 0; i < l_net_pvt->gdb_sync_nodes_addrs_count; i++) {
-            dap_chain_node_addr_from_str(l_net_pvt->gdb_sync_nodes_addrs + i, l_gdb_sync_nodes_addrs[i]);
-        }
-    }
-    // links for special sync
-    uint16_t l_gdb_links_count = 0;
-    PVT(l_net)->gdb_sync_nodes_links_count = 0;
-    char **l_gdb_sync_nodes_links = dap_config_get_array_str(l_cfg, "general", "gdb_sync_nodes_links", &l_gdb_links_count);
-    if (l_gdb_sync_nodes_links && l_gdb_links_count > 0) {
-        l_net_pvt->gdb_sync_nodes_links_ips = DAP_NEW_Z_SIZE(uint32_t, l_gdb_links_count * sizeof(uint32_t));
-        if (!l_net_pvt->gdb_sync_nodes_links_ips) {
-            log_it(L_CRITICAL, "Memory allocation error");
-            dap_config_close(l_cfg);
-            return -1;
-        }
-        l_net_pvt->gdb_sync_nodes_links_ports = DAP_NEW_SIZE(uint16_t, l_gdb_links_count * sizeof(uint16_t));
-        if (!l_net_pvt->gdb_sync_nodes_links_ports) {
-            log_it(L_CRITICAL, "Memory allocation error");
-            DAP_DEL_Z(l_net_pvt->gdb_sync_nodes_links_ips);
-            dap_config_close(l_cfg);
-            return -1;
-        }
-        for(uint16_t i = 0; i < l_gdb_links_count; i++) {
-            char *l_gdb_link_port_str = strchr(l_gdb_sync_nodes_links[i], ':');
-            if (!l_gdb_link_port_str) {
-                continue;
-            }
-            uint16_t l_gdb_link_port = atoi(l_gdb_link_port_str + 1);
-            if (!l_gdb_link_port)
-                continue;
-            int l_gdb_link_len = l_gdb_link_port_str - l_gdb_sync_nodes_links[i];
-            char l_gdb_link_ip_str[l_gdb_link_len + 1];
-            memcpy(l_gdb_link_ip_str, l_gdb_sync_nodes_links[i], l_gdb_link_len);
-            l_gdb_link_ip_str[l_gdb_link_len] = '\0';
-            struct in_addr l_in_addr;
-            if (inet_pton(AF_INET, (const char *)l_gdb_link_ip_str, &l_in_addr) > 0) {
-                PVT(l_net)->gdb_sync_nodes_links_ips[PVT(l_net)->gdb_sync_nodes_links_count] = l_in_addr.s_addr;
-                PVT(l_net)->gdb_sync_nodes_links_ports[PVT(l_net)->gdb_sync_nodes_links_count] = l_gdb_link_port;
-                PVT(l_net)->gdb_sync_nodes_links_count++;
-            }
-        }
-    }
-    // groups for special sync
-    uint16_t l_gdb_sync_groups_count;
-    char **l_gdb_sync_groups = dap_config_get_array_str(l_cfg, "general", "gdb_sync_groups", &l_gdb_sync_groups_count);
-    if (l_gdb_sync_groups && l_gdb_sync_groups_count > 0) {
-        for(uint16_t i = 0; i < l_gdb_sync_groups_count; i++) {
-            // add group to special sync
-            dap_global_db_add_sync_extra_group(l_net->pub.name, l_gdb_sync_groups[i], s_gbd_history_callback_notify, l_net);
-        }
-    }
-
     // Add network to the list
     dap_chain_net_item_t * l_net_item = DAP_NEW_Z( dap_chain_net_item_t);
     if (!l_net_item) {
@@ -2524,44 +2227,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
     // wait time before reconnect attempt with same link
     l_net_pvt->reconnect_delay = dap_config_get_item_int16_default(l_cfg, "general", "reconnect_delay", 10);
 
-    const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general" ,"node_addr_type","auto");
-
-    const char * l_node_addr_str = NULL;
-    const char * l_node_alias_str = NULL;
-
-    // use unique addr from pub key
-    if(!dap_strcmp(l_node_addr_type, "auto")) {
-        size_t l_pub_key_data_size = 0;
-        uint8_t *l_pub_key_data = NULL;
-
-        // read pub key
-        char *l_addr_key = dap_strdup_printf("node-addr");
-        l_pub_key_data = dap_global_db_get_sync(GROUP_LOCAL_NODE_ADDR, l_addr_key, &l_pub_key_data_size, NULL, NULL);
-        // generate a new pub key if it doesn't exist
-        if(!l_pub_key_data || !l_pub_key_data_size){
-            log_it(L_CRITICAL, "Memory allocation error");
-            dap_config_close(l_cfg);
-            return -1;
-        }
-        // generate addr from pub_key
-        dap_chain_hash_fast_t l_hash;
-        if(l_pub_key_data_size > 0 && dap_hash_fast(l_pub_key_data, l_pub_key_data_size, &l_hash) == 1) {
-            l_node_addr_str = dap_strdup_printf("%04X::%04X::%04X::%04X",
-                    (uint16_t) *(uint16_t*) (l_hash.raw),
-                    (uint16_t) *(uint16_t*) (l_hash.raw + 2),
-                    (uint16_t) *(uint16_t*) (l_hash.raw + DAP_CHAIN_HASH_FAST_SIZE - 4),
-                    (uint16_t) *(uint16_t*) (l_hash.raw + DAP_CHAIN_HASH_FAST_SIZE - 2));
-        }
-        DAP_DELETE(l_addr_key);
-        DAP_DELETE(l_pub_key_data);
-    }
-    // use static addr from setting
-    else if(!dap_strcmp(l_node_addr_type, "static")) {
-        //const char * l_node_ipv4_str = dap_config_get_item_str(l_cfg , "general" ,"node-ipv4");
-        l_node_addr_str = dap_strdup(dap_config_get_item_str(l_cfg, "general", "node-addr"));
-        l_node_alias_str = dap_config_get_item_str(l_cfg, "general", "node-alias");
-    }
-
     log_it (L_DEBUG, "Read %u aliases, %u address and %u ipv4 addresses, check them",
             l_net_pvt->seed_aliases_count,l_seed_nodes_addrs_len, l_seed_nodes_ipv4_len );
     PVT(l_net)->seed_nodes_addrs_v4 = DAP_NEW_SIZE(struct in_addr, l_net_pvt->seed_aliases_count * sizeof(struct in_addr));
@@ -2575,8 +2240,8 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
                             ( l_seed_nodes_ipv6_len  && i < l_seed_nodes_ipv6_len  ) ||
                             ( l_seed_nodes_hostnames_len  && i < l_seed_nodes_hostnames_len  )
                         ); i++) {
-        dap_chain_node_addr_t l_seed_node_addr  = { 0 }, *l_seed_node_addr_gdb  = NULL;
-        dap_chain_node_info_t l_node_info       = { 0 }, *l_node_info_gdb       = NULL;
+        dap_chain_node_addr_t l_seed_node_addr  = { 0 };
+        dap_chain_node_info_t l_node_info       = { 0 };
 
         log_it(L_NOTICE, "Check alias %s in db", l_net_pvt->seed_aliases[i]);
         snprintf(l_node_info.hdr.alias,sizeof (l_node_info.hdr.alias),"%s", PVT(l_net)->seed_aliases[i]);
@@ -2606,38 +2271,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
                 log_it(L_ERROR, "%s", gai_strerror(l_ret_code));
             }
         }
-/*
-        l_seed_node_addr_gdb    = dap_chain_node_alias_find(l_net, l_net_pvt->seed_aliases[i]);
-        l_node_info_gdb         = l_seed_node_addr_gdb ? dap_chain_node_info_read(l_net, l_seed_node_addr_gdb) : NULL;
-
-        l_node_info.hdr.address = l_seed_node_addr;
-        if (l_node_info.hdr.ext_addr_v4.s_addr ||
-#ifdef DAP_OS_BSD
-            l_node_info.hdr.ext_addr_v6.__u6_addr.__u6_addr32[0]
-#else
-            l_node_info.hdr.ext_addr_v6.s6_addr32[0]
-#endif
-        ) {
-             //Let's check if config was altered
-            int l_ret = l_node_info_gdb ? memcmp(&l_node_info, l_node_info_gdb, sizeof(dap_chain_node_info_t)) : 1;
-            if (!l_ret) {
-                log_it(L_NOTICE,"Seed node "NODE_ADDR_FP_STR" already in list", NODE_ADDR_FP_ARGS_S(l_seed_node_addr));
-            } else {
-                // Either not yet added or must be altered
-                l_ret = dap_chain_node_info_save(l_net, &l_node_info);
-                if (!l_ret) {
-                    if (dap_chain_node_alias_register(l_net,l_net_pvt->seed_aliases[i], &l_seed_node_addr))
-                        log_it(L_NOTICE,"Seed node "NODE_ADDR_FP_STR" added to the curent list", NODE_ADDR_FP_ARGS_S(l_seed_node_addr));
-                    else
-                        log_it(L_WARNING,"Cant register alias %s for address "NODE_ADDR_FP_STR, l_net_pvt->seed_aliases[i], NODE_ADDR_FP_ARGS_S(l_seed_node_addr));
-                } else {
-                    log_it(L_WARNING,"Cant save node info for address "NODE_ADDR_FP_STR" return code %d", NODE_ADDR_FP_ARGS_S(l_seed_node_addr), l_ret);
-                }
-            }
-        } else
-            log_it(L_WARNING,"No address for seed node, can't populate global_db with it");
-        DAP_DEL_Z(l_seed_node_addr_gdb);
-        DAP_DEL_Z(l_node_info_gdb);*/
     }
 
     dap_chain_net_node_list_init();
@@ -2665,67 +2298,49 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
         }
         DAP_DELETE(l_bootstrap_name);
     }
-    if ( l_node_addr_str || l_node_alias_str ){
-        dap_chain_node_addr_t * l_node_addr;
-        if ( l_node_addr_str == NULL)
-            l_node_addr = dap_chain_node_alias_find(l_net, l_node_alias_str);
-        else {
-            l_node_addr = DAP_NEW_Z(dap_chain_node_addr_t);
-            if (!l_node_addr) {
-                log_it(L_CRITICAL, "Memory allocation error");
-                dap_config_close(l_cfg);
-                return -1;
-            }
-            if (dap_chain_node_addr_from_str(l_node_addr, l_node_addr_str) == 0)
-                log_it(L_NOTICE, "Parse node addr "NODE_ADDR_FP_STR" successfully", NODE_ADDR_FP_ARGS(l_node_addr));
-            else
-                DAP_DEL_Z(l_node_addr);
-            l_net_pvt->node_addr = l_node_addr;
-        }
-        if ( l_node_addr ) {
-            char *l_addr_hash_str = dap_chain_node_addr_to_hash_str(l_node_addr);
-            // save current node address
-            dap_db_set_cur_node_addr(l_node_addr->uint64, l_net->pub.name);
-            if(!l_addr_hash_str){
-                log_it(L_ERROR,"Can't get hash string for node address!");
-            } else {
-                l_net_pvt->node_info = dap_chain_node_info_read (l_net, l_node_addr);
-                if ( !l_net_pvt->node_info ) { // If not present - create it
-                    l_net_pvt->node_info = DAP_NEW_Z(dap_chain_node_info_t);
-                    if (!l_net_pvt->node_info) {
-                        log_it(L_CRITICAL, "Memory allocation error");
-                        DAP_DEL_Z(l_node_addr);
-                        dap_config_close(l_cfg);
-                        return -1;
-                    }
-                    l_net_pvt->node_info->hdr.address = *l_node_addr;
-                    if (dap_config_get_item_bool_default(g_config,"server","enabled",false) ){
-                        const char * l_ext_addr_v4 = dap_config_get_item_str_default(g_config,"server","ext_address",NULL);
-                        const char * l_ext_addr_v6 = dap_config_get_item_str_default(g_config,"server","ext_address6",NULL);
-                        uint16_t l_ext_port = dap_config_get_item_uint16_default(g_config,"server","ext_port_tcp", 8079);
-                        uint16_t l_node_info_port = l_ext_port ? l_ext_port :
-                                                dap_config_get_item_uint16_default(g_config,"server","listen_port_tcp",8079);
-                        if (l_ext_addr_v4)
-                            inet_pton(AF_INET,l_ext_addr_v4,&l_net_pvt->node_info->hdr.ext_addr_v4 );
-                        if (l_ext_addr_v6)
-                            inet_pton(AF_INET6,l_ext_addr_v6,&l_net_pvt->node_info->hdr.ext_addr_v6 );
-                        l_net_pvt->node_info->hdr.ext_port =l_node_info_port;
-                    } else
-                        log_it(L_INFO,"Server is disabled, add only node address in nodelist");
-                }
-                log_it(L_NOTICE,"GDB Info: node_addr: " NODE_ADDR_FP_STR"  links: %u cell_id: 0x%016"DAP_UINT64_FORMAT_X,
-                       NODE_ADDR_FP_ARGS(l_node_addr),
-                       l_net_pvt->node_info->hdr.links_number,
-                       l_net_pvt->node_info->hdr.cell_id.uint64);
-            }
-            DAP_DELETE(l_addr_hash_str);
-        }
-        else{
-            log_it(L_WARNING, "Not present our own address %s in database", (l_node_alias_str) ? l_node_alias_str: "");
+
+    const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general", "node_addr_type", "auto");
+    if (!dap_strcmp(l_node_addr_type, "static")) {
+        const char *l_node_alias_str = dap_config_get_item_str_default(l_cfg, "general", "node-addr",
+                                                                       dap_config_get_item_str(l_cfg, "general", "node-alias"));
+        if (l_node_alias_str) {
+            dap_stream_node_addr_t *l_alias_addr = dap_chain_node_alias_find(l_net, l_node_alias_str);
+            if (!l_alias_addr)
+                dap_chain_node_alias_register(l_net, l_node_alias_str, &g_node_addr);
+        } else
+            log_it(L_ERROR, "Can't read alias for node address from config");
+
+    } else if (dap_strcmp(l_node_addr_type, "auto"))
+        log_it(L_WARNING, "Unknown node address type will be defalted to 'auto'");
+
+    l_net_pvt->node_info = dap_chain_node_info_read(l_net, &g_node_addr);
+    if ( !l_net_pvt->node_info ) { // If not present - create it
+        l_net_pvt->node_info = DAP_NEW_Z(dap_chain_node_info_t);
+        if (!l_net_pvt->node_info) {
+            log_it(L_CRITICAL, "Memory allocation error");
+            dap_config_close(l_cfg);
+            return -1;
         }
+        l_net_pvt->node_info->hdr.address = g_node_addr;
+        if (dap_config_get_item_bool_default(g_config, "server", "enabled", false)) {
+            const char * l_ext_addr_v4 = dap_config_get_item_str_default(g_config, "server", "ext_address", NULL);
+            const char * l_ext_addr_v6 = dap_config_get_item_str_default(g_config, "server", "ext_address6", NULL);
+            uint16_t l_node_info_port = dap_config_get_item_uint16_default(g_config, "server", "ext_port_tcp",
+                                        dap_config_get_item_uint16_default(g_config, "server", "listen_port_tcp", 8079));
+            if (l_ext_addr_v4)
+                inet_pton(AF_INET, l_ext_addr_v4, &l_net_pvt->node_info->hdr.ext_addr_v4);
+            if (l_ext_addr_v6)
+                inet_pton(AF_INET6, l_ext_addr_v6, &l_net_pvt->node_info->hdr.ext_addr_v6);
+            l_net_pvt->node_info->hdr.ext_port = l_node_info_port;
+        } else
+            log_it(L_INFO, "Server is disabled, add only node address in nodelist");
     }
+    log_it(L_NOTICE, "Net load information: node_addr " NODE_ADDR_FP_STR ", balancers links %u, cell_id 0x%016"DAP_UINT64_FORMAT_X,
+           NODE_ADDR_FP_ARGS_S(g_node_addr),
+           l_net_pvt->seed_aliases_count,
+           l_net_pvt->node_info->hdr.cell_id.uint64);
 
-    /* *** Chaiins init by configs *** */
+    /* *** Chains init by configs *** */
     char * l_chains_path = dap_strdup_printf("%s/network/%s", dap_config_path(), l_net->pub.name);
     DIR * l_chains_dir = opendir(l_chains_path);
     DAP_DEL_Z(l_chains_path);
@@ -2829,20 +2444,18 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
     default:
         l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_CELLS_DS | DAP_CHAIN_LEDGER_CHECK_TOKEN_EMISSION;
     }
-    dap_list_t *l_net_keys = NULL;
     for (dap_chain_t *l_chain = l_net->pub.chains; l_chain; l_chain = l_chain->next) {
         if (!l_chain->callback_get_poa_certs)
             continue;
-        l_net_keys = l_chain->callback_get_poa_certs(l_chain, NULL, NULL);
-        if (l_net_keys)
+        l_net->pub.keys = l_chain->callback_get_poa_certs(l_chain, NULL, NULL);
+        if (l_net->pub.keys)
             break;
     }
-    if (!l_net_keys)
-        log_it(L_WARNING,"PoA certificates for net %s not found.", l_net->pub.name);
+    if (!l_net->pub.keys)
+        log_it(L_WARNING, "PoA certificates for net %s not found", l_net->pub.name);
     // init LEDGER model
-    l_net->pub.ledger = dap_chain_ledger_create(l_ledger_flags, l_net->pub.id, l_net->pub.name, l_net->pub.native_ticker, l_net_keys);
+    l_net->pub.ledger = dap_chain_ledger_create(l_ledger_flags, l_net->pub.id, l_net->pub.name, l_net->pub.native_ticker, l_net->pub.keys);
 
-    DAP_DELETE(l_node_addr_str);
     dap_config_close(l_cfg);
     return 0;
 }
@@ -2978,15 +2591,72 @@ int s_net_load(dap_chain_net_t *a_net)
 
     l_net_pvt->balancer_http = !dap_config_get_item_bool_default(l_cfg, "general", "use_dns_links", false);
 
-    dap_chain_net_add_gdb_notify_callback(l_net, dap_chain_net_sync_gdb_broadcast, l_net);
-    DL_FOREACH(l_net->pub.chains, l_chain)
-        // add a callback to monitor changes in the chain
-        dap_chain_add_callback_notify(l_chain, s_chain_callback_notify, l_net);
+    // Init GlobalDB clusters for mempool, service and nodes (with aliases)
+    l_net->pub.gdb_groups_prefix = dap_strdup(
+                dap_config_get_item_str_default(l_cfg, "general", "gdb_groups_prefix",
+                                                dap_config_get_item_str(l_cfg, "general", "name")));
+    // Zerochain mempool cluster
+    char *l_gdb_mempool_mask = dap_strdup_printf("%s.chain-%s.mempool", l_net->pub.gdb_groups_prefix, l_net->pub.chains->name);
+    l_net_pvt->zerochain_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(),
+                                                             l_net->pub.name, l_gdb_mempool_mask,
+                                                             DAP_CHAIN_NET_MEMPOOL_TTL, true,
+                                                             s_network_change_notify, l_net,
+                                                             DAP_GDB_MEMBER_ROLE_USER,
+                                                             DAP_CLUSTER_ROLE_EMBEDDED);
+    if (!l_net_pvt->zerochain_cluster) {
+        log_it(L_ERROR, "Can't initialize zerochain cluster for network %s", l_net->pub.name);
+        return -1;
+    }
+    dap_chain_net_add_poa_certs_to_cluster(l_net, l_net_pvt->zerochain_cluster);
+    DAP_DELETE(l_gdb_mempool_mask);
+    // Other chains mempool cluster
+    l_gdb_mempool_mask = dap_strdup_printf("%s.*.mempool", l_net->pub.gdb_groups_prefix);
+    l_net_pvt->mempool_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(),
+                                                           l_net->pub.name, l_gdb_mempool_mask,
+                                                           DAP_CHAIN_NET_MEMPOOL_TTL, true,
+                                                           s_network_change_notify, l_net,
+                                                           DAP_GDB_MEMBER_ROLE_USER,
+                                                           DAP_CLUSTER_ROLE_EMBEDDED);
+    if (!l_net_pvt->mempool_cluster) {
+        log_it(L_ERROR, "Can't initialize mempool cluster for network %s", l_net->pub.name);
+        return -1;
+    }
+    dap_chain_net_add_poa_certs_to_cluster(l_net, l_net_pvt->mempool_cluster);
+    DAP_DELETE(l_gdb_mempool_mask);
+    // Service orders cluster
+    l_gdb_mempool_mask = dap_strdup_printf("%s.service.orders", l_net->pub.gdb_groups_prefix);
+    l_net_pvt->orders_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(),
+                                                          l_net->pub.name, l_gdb_mempool_mask,
+                                                          0, true,
+                                                          s_network_change_notify, l_net,
+                                                          DAP_GDB_MEMBER_ROLE_GUEST,
+                                                          DAP_CLUSTER_ROLE_EMBEDDED);
+    if (!l_net_pvt->orders_cluster) {
+        log_it(L_ERROR, "Can't initialize orders cluster for network %s", l_net->pub.name);
+        return -1;
+    }
+    dap_chain_net_add_poa_certs_to_cluster(l_net, l_net_pvt->orders_cluster);
+    DAP_DELETE(l_gdb_mempool_mask);
+    // Nodes and its aliases cluster
+    l_net->pub.gdb_nodes = dap_strdup_printf("%s.nodes",l_net->pub.gdb_groups_prefix);
+    l_net->pub.gdb_nodes_aliases = dap_strdup_printf("%s.nodes.aliases",l_net->pub.gdb_groups_prefix);
+    l_gdb_mempool_mask = dap_strdup_printf("%s.nodes*", l_net->pub.gdb_groups_prefix);
+    l_net_pvt->nodes_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(),
+                                                         l_net->pub.name, l_gdb_mempool_mask,
+                                                         0, true,
+                                                         s_network_change_notify, l_net,
+                                                         DAP_GDB_MEMBER_ROLE_GUEST,
+                                                         DAP_CLUSTER_ROLE_EMBEDDED);
+    if (!l_net_pvt->nodes_cluster) {
+        log_it(L_ERROR, "Can't initialize nodes cluster for network %s", l_net->pub.name);
+        return -1;
+    }
+    dap_chain_net_add_poa_certs_to_cluster(l_net, l_net_pvt->nodes_cluster);
+    DAP_DELETE(l_gdb_mempool_mask);
 
     uint32_t l_timeout = dap_config_get_item_uint32_default(g_config, "node_client", "timer_update_states", 600);
     PVT(l_net)->main_timer = dap_interval_timer_create(l_timeout * 1000, s_main_timer_callback, l_net);
     log_it(L_INFO, "Chain network \"%s\" initialized",l_net->pub.name);
-    PVT(l_net)->update_links_timer = dap_interval_timer_create(600 * 1000, s_update_links_timer_callback, l_net);
 
     dap_config_close(l_cfg);
 
@@ -2996,6 +2666,23 @@ int s_net_load(dap_chain_net_t *a_net)
     return 0;
 }
 
+int dap_chain_net_add_poa_certs_to_cluster(dap_chain_net_t *a_net, dap_global_db_cluster_t *a_cluster)
+{
+    dap_return_val_if_fail(a_net && a_cluster, -1);
+    for (dap_list_t *it = a_net->pub.keys; it; it = it->next) {
+        dap_pkey_t *l_pkey = it->data;
+        dap_stream_node_addr_t l_poa_addr = dap_stream_node_addr_from_pkey(l_pkey);
+        dap_global_db_cluster_member_add(a_cluster, &l_poa_addr, DAP_GDB_MEMBER_ROLE_ROOT);
+    }
+    return 0;
+}
+
+bool dap_chain_net_add_validator_to_clusters(dap_chain_net_t *a_net, dap_stream_node_addr_t *a_addr)
+{
+    bool l_ret = dap_global_db_cluster_member_add(PVT(a_net)->mempool_cluster, a_addr, DAP_GDB_MEMBER_ROLE_ROOT);
+    return !l_ret ? false : dap_global_db_cluster_member_add(PVT(a_net)->orders_cluster, a_addr, DAP_GDB_MEMBER_ROLE_USER);
+}
+
 /**
  * @brief dap_chain_net_deinit
  */
@@ -3221,34 +2908,7 @@ void dap_chain_net_set_state(dap_chain_net_t *l_net, dap_chain_net_state_t a_sta
         return;
     }
     PVT(l_net)->state = a_state;
-    dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_net_states_proc,l_net);
-}
-
-
-/**
- * @brief dap_chain_net_get_cur_addr
- * @param l_net
- * @return
- */
-dap_chain_node_addr_t *dap_chain_net_get_cur_addr( dap_chain_net_t *a_net)
-{
-    return a_net ? (PVT(a_net)->node_info ? &PVT(a_net)->node_info->hdr.address : PVT(a_net)->node_addr) : NULL;
-}
-
-uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t *a_net)
-{
-    if (!a_net)
-        return 0;
-    uint64_t l_ret = 0;
-    if (PVT(a_net)->node_addr == NULL) { // Cache address if not present
-        l_ret = dap_chain_net_get_cur_node_addr_gdb_sync(a_net->pub.name);
-        if (l_ret) {
-            PVT(a_net)->node_addr = DAP_NEW_Z(dap_chain_node_addr_t);
-            PVT(a_net)->node_addr->uint64 = l_ret;
-        }
-    } else
-        l_ret = PVT(a_net)->node_addr->uint64;
-    return l_ret;
+    dap_proc_thread_callback_add(NULL, s_net_states_proc, l_net);
 }
 
 dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net)
@@ -3690,95 +3350,7 @@ void dap_chain_net_announce_addrs() {
             char l_node_addr_str[INET_ADDRSTRLEN] = { '\0' };
             inet_ntop(AF_INET, &l_net_pvt->node_info->hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN);
             log_it(L_MSG, "Announce our node address "NODE_ADDR_FP_STR" < %s:%u > in net %s",
-                   NODE_ADDR_FP_ARGS(l_net_pvt->node_addr), l_node_addr_str, l_net_pvt->node_info->hdr.ext_port, l_net_item->name);
+                   NODE_ADDR_FP_ARGS_S(g_node_addr), l_node_addr_str, l_net_pvt->node_info->hdr.ext_port, l_net_item->name);
         }
     }
 }
-
-char *dap_chain_net_links_dump(dap_chain_net_t *a_net) {
-    dap_chain_net_pvt_t *l_net_pvt = PVT(a_net);
-    pthread_mutex_lock(&l_net_pvt->uplinks_mutex);
-    dap_string_t *l_str_uplinks = dap_string_new("---------------------------\n"
-                                         "| ↑\\↓ |\t#\t|\t\tIP\t\t|\tPort\t|\n");
-    struct net_link *l_link, *l_link_tmp = NULL;
-    size_t l_up_count = 0;
-    HASH_ITER(hh, l_net_pvt->net_links, l_link, l_link_tmp) {
-        dap_string_append_printf(l_str_uplinks, "|  ↑  |\t%zu\t|\t%s\t\t|\t%u\t|\n",
-                                 ++l_up_count,
-                                 inet_ntoa(l_link->link_info->hdr.ext_addr_v4),
-                                 l_link->link_info->hdr.ext_port);
-    }
-
-    size_t l_down_count = 0;
-    dap_string_t *l_str_downlinks = dap_string_new("---------------------------\n"
-                                                 "| ↑\\↓ |\t#\t|\t\tIP\t\t|\tPort\t|\n");
-    pthread_mutex_unlock(&l_net_pvt->uplinks_mutex);
-    pthread_mutex_lock(&l_net_pvt->downlinks_mutex);
-    struct downlink *l_downlink = NULL, *l_downtmp = NULL;
-    HASH_ITER(hh, l_net_pvt->downlinks, l_downlink, l_downtmp) {
-        dap_string_append_printf(l_str_downlinks, "|  ↓  |\t%zu\t|\t%s\t\t|\t%u\t|\n",
-                                     ++l_down_count,
-                                     l_downlink->addr, l_downlink->port);
-    }
-    pthread_mutex_unlock(&l_net_pvt->downlinks_mutex);
-    char *l_res_str = dap_strdup_printf("Count links: %zu\n\nUplinks: %zu\n%s\n\nDownlinks: %zu\n%s\n",
-                                        l_up_count + l_down_count, l_up_count, l_str_uplinks->str,
-                                        l_down_count, l_str_downlinks->str);
-    dap_string_free(l_str_uplinks, true);
-    dap_string_free(l_str_downlinks, true);
-    return l_res_str;
-}
-
-/**
- * @brief init node addr and set in gdb
- * @param -
- * @return 0 if no errors
- */
-int s_net_init_node_addr_cert()
-{
-    dap_config_t *l_cfg = NULL;
-    dap_string_t *l_cfg_path = dap_string_new("cellframe-node");
-
-    if( !(l_cfg = dap_config_open(l_cfg_path->str)) ) {
-        log_it(L_ERROR,"Can't open default node config");
-        dap_string_free(l_cfg_path,true);
-        return -1;
-    }
-    dap_string_free(l_cfg_path,true);
-
-    const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general" ,"node_addr_type","auto");
-    // use unique addr from pub key
-    size_t l_pub_key_data_size = 0;
-    uint8_t *l_pub_key_data = NULL;
-
-    // read pub key
-    char *l_addr_key = dap_strdup_printf("node-addr");
-    l_pub_key_data = dap_global_db_get_sync(GROUP_LOCAL_NODE_ADDR, l_addr_key, &l_pub_key_data_size, NULL, NULL);
-    // generate a new pub key if it doesn't exist
-    if(!l_pub_key_data || !l_pub_key_data_size) {
-        const char *l_certs_name_str = l_addr_key;
-        dap_cert_t **l_certs = NULL;
-        size_t l_certs_size = 0;
-        dap_cert_t *l_cert = NULL;
-        // Load certs or create if not found
-        if(!dap_cert_parse_str_list(l_certs_name_str, &l_certs, &l_certs_size)) { // Load certs
-            const char *l_cert_folder = dap_cert_get_folder(0);
-            // create new cert
-            if(l_cert_folder) {
-                char *l_cert_path = dap_strdup_printf("%s/%s.dcert", l_cert_folder, l_certs_name_str);
-                l_cert = dap_cert_generate(l_certs_name_str, l_cert_path, DAP_ENC_KEY_TYPE_SIG_DILITHIUM);
-                DAP_DELETE(l_cert_path);
-            }
-        }
-        if(l_certs_size > 0)
-            l_cert = l_certs[0];
-        if(l_cert) {
-            l_pub_key_data = dap_enc_key_serialize_pub_key(l_cert->enc_key, &l_pub_key_data_size);
-            // save pub key
-            if(l_pub_key_data && l_pub_key_data_size > 0)
-                dap_global_db_set(GROUP_LOCAL_NODE_ADDR, l_addr_key, l_pub_key_data, l_pub_key_data_size, false,
-                                    NULL, NULL);
-        }
-    }
-    return 0;
-}
diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index 619defb2d4..0dd8131330 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -176,10 +176,10 @@ void dap_chain_net_balancer_prepare_list_links(const char *a_net_name,bool hands
     dap_list_free(l_node_addr_list);
 }
 
-static int callback_compare_node_list(const void *a_item1, const void *a_item2)
+static int callback_compare_node_list(dap_list_t *a_item1, dap_list_t *a_item2)
 {
-    dap_chain_node_info_t   *l_item1 = (dap_chain_node_info_t*)((dap_list_t*)a_item1)->data,
-                            *l_item2 = (dap_chain_node_info_t*)((dap_list_t*)a_item2)->data;
+    dap_chain_node_info_t   *l_item1 = a_item1->data,
+                            *l_item2 = a_item2->data;
     if (!l_item1 || !l_item2) {
         log_it(L_CRITICAL, "Invalid element");
         return 0;
diff --git a/modules/net/dap_chain_net_node_list.c b/modules/net/dap_chain_net_node_list.c
index 2043d5b3f2..025f7256a5 100644
--- a/modules/net/dap_chain_net_node_list.c
+++ b/modules/net/dap_chain_net_node_list.c
@@ -208,7 +208,7 @@ static int dap_chain_net_node_list_wait(struct node_link_request *a_node_list_re
     return ret;
 }
 
-int dap_chain_net_node_list_request (dap_chain_net_t *a_net, dap_chain_node_info_t *a_link_node_request, bool a_sync)
+int dap_chain_net_node_list_request(dap_chain_net_t *a_net, dap_chain_node_info_t *a_link_node_request, bool a_sync)
 {
     dap_chain_node_info_t *l_link_node_info = dap_get_balancer_link_from_cfg(a_net);
     if (!l_link_node_info)
@@ -256,7 +256,7 @@ int dap_chain_net_node_list_request (dap_chain_net_t *a_net, dap_chain_node_info
     s_node_list_request_deinit(l_node_list_request);
     return ret;
 }
-static void s_node_list_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg)
+static void s_node_list_callback_notify(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg)
 {
     if (!a_arg || !a_obj || !a_obj->key)
         return;
@@ -265,7 +265,7 @@ static void s_node_list_callback_notify(dap_global_db_context_t *a_context, dap_
     size_t l_size_obj_need = (sizeof(dap_chain_node_info_t));
 
     if (!dap_strcmp(a_obj->group, l_net->pub.gdb_nodes)) {
-        if (a_obj->value && a_obj->type == DAP_DB$K_OPTYPE_ADD) {
+        if (a_obj->value && a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD) {
             dap_chain_node_info_t *l_node_info = (dap_chain_node_info_t *)a_obj->value;
 
             size_t l_size_obj = (a_obj->value_len - (l_node_info->hdr.links_number * sizeof(dap_chain_node_addr_t)));
@@ -273,7 +273,7 @@ static void s_node_list_callback_notify(dap_global_db_context_t *a_context, dap_
             {
                 if(l_node_info->hdr.owner_address.uint64 == 0){
                     log_it(L_NOTICE, "Node %s removed, there is not pinners", a_obj->key);
-                    dap_global_db_del_unsafe(a_context, a_obj->group, a_obj->key);
+                    dap_global_db_del_sync(a_obj->group, a_obj->key);
                 } else {
                     char l_node_ipv4_str[INET_ADDRSTRLEN]={ '\0' }, l_node_ipv6_str[INET6_ADDRSTRLEN]={ '\0' };
                     inet_ntop(AF_INET, &l_node_info->hdr.ext_addr_v4, l_node_ipv4_str, INET_ADDRSTRLEN);
@@ -290,13 +290,12 @@ static void s_node_list_callback_notify(dap_global_db_context_t *a_context, dap_
             }
             else
             {
-                dap_global_db_del_unsafe(a_context, a_obj->group, a_obj->key);
+                dap_global_db_del_sync(a_obj->group, a_obj->key);
                 log_it(L_NOTICE, "Wrong size! data size %lu need - (%lu) %s removed ",l_size_obj,
                        l_size_obj_need, a_obj->key);
             }
         }
     }
-
 }
 
 int dap_chain_net_node_list_init()
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index a7c387ba5e..ed40377c87 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -49,40 +49,6 @@
 
 #define LOG_TAG "chain_node"
 
-/**
- * Generate node address
- */
-dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_id_t a_net_id)
-{
-    dap_chain_node_addr_t *l_addr = DAP_NEW_Z(dap_chain_node_addr_t);
-    if (!l_addr) {
-        log_it(L_CRITICAL, "Memory allocation error");
-        return NULL;
-    }
-    dap_chain_hash_fast_t l_hash;
-    dap_hash_fast(&a_net_id, sizeof(dap_chain_net_id_t), &l_hash);
-    // first 4 bytes is last 4 bytes of shard id hash
-    memcpy(l_addr->raw, l_hash.raw + sizeof(l_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2);
-    // last 4 bytes is random
-    randombytes(l_addr->raw + sizeof(uint64_t) / 2, sizeof(uint64_t) / 2);
-    // for LITTLE_ENDIAN (Intel), do nothing, otherwise swap bytes
-    l_addr->uint64 = le64toh(l_addr->uint64); // l_addr->raw the same l_addr->uint64
-    return l_addr;
-}
-
-/**
- * Check the validity of the node address by cell id
- */
-bool dap_chain_node_check_addr(dap_chain_net_t *a_net, dap_chain_node_addr_t *a_addr)
-{
-    if (!a_addr || !a_net)
-        return false;
-    dap_chain_hash_fast_t l_hash;
-    dap_hash_fast(&a_net->pub.id, sizeof(dap_chain_net_id_t), &l_hash);
-    // first 4 bytes is last 4 bytes of shard id hash
-    return !memcmp(a_addr->raw, l_hash.raw + sizeof(l_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2);
-}
-
 /**
  * Register alias in base
  */
@@ -96,11 +62,18 @@ bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias,
  * @param alias
  * @return
  */
-dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * a_net,const char *a_alias)
+dap_chain_node_addr_t *dap_chain_node_alias_find(dap_chain_net_t *a_net, const char *a_alias)
 {
+    dap_return_val_if_fail(a_alias && a_net, NULL);
     size_t l_addr_size =0;
-    return (dap_chain_node_addr_t*)dap_global_db_get_sync(a_net->pub.gdb_nodes_aliases,
-                                                          a_alias, &l_addr_size, NULL, NULL);
+    dap_chain_node_addr_t *l_addr = (dap_chain_node_addr_t *)dap_global_db_get_sync(a_net->pub.gdb_nodes_aliases,
+                                                                                    a_alias, &l_addr_size, NULL, NULL);
+    if (l_addr_size != sizeof(dap_chain_node_addr_t)) {
+        log_it(L_WARNING, "Address in database is corrupted for alias %s", a_alias);
+        DAP_DELETE(l_addr);
+        return NULL;
+    }
+    return l_addr;
 }
 
 /**
@@ -328,121 +301,3 @@ bool dap_chain_node_mempool_autoproc_init()
     return true;
 }
 
-/**
- * @brief dap_chain_node_mempool_deinit
- */
-void dap_chain_node_mempool_autoproc_deinit()
-{
-}
-
-
-/**
- * @brief Sets a current node adress.
- * @param a_address a current node adress
- * @param a_net_name a net name string
- * @return True if success, otherwise false
- */
-static bool dap_db_set_cur_node_addr_common(uint64_t a_address, char *a_net_name, time_t a_expire_time)
-{
-char	l_key [DAP_GLOBAL_DB_KEY_MAX];
-bool	l_ret;
-
-    if(!a_net_name)
-        return false;
-
-    snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s", a_net_name);
-
-    if ( (l_ret = dap_global_db_set(DAP_GLOBAL_DB_LOCAL_GENERAL, l_key, &a_address, sizeof(a_address),
-                                    true, NULL, NULL)) == 0 ) {
-        snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s_time", a_net_name);
-        l_ret = dap_global_db_set(DAP_GLOBAL_DB_LOCAL_GENERAL, l_key, &a_expire_time, sizeof(time_t),
-                                   true, NULL, NULL) == DAP_GLOBAL_DB_RC_SUCCESS;
-    }
-
-    return l_ret;
-}
-
-/**
- * @brief Sets an adress of a current node and no expire time.
- *
- * @param a_address an adress of a current node
- * @param a_net_name a net name string
- * @return Returns true if siccessful, otherwise false
- */
-bool dap_db_set_cur_node_addr(uint64_t a_address, char *a_net_name )
-{
-    return dap_db_set_cur_node_addr_common(a_address,a_net_name,0);
-}
-
-/**
- * @brief Sets an address of a current node and expire time.
- *
- * @param a_address an address of a current node
- * @param a_net_name a net name string
- * @return Returns true if successful, otherwise false
- */
-bool dap_db_set_cur_node_addr_exp(uint64_t a_address, char *a_net_name )
-{
-    return dap_db_set_cur_node_addr_common(a_address,a_net_name, time(NULL));
-}
-
-/**
- * @brief Gets an adress of current node by a net name.
- *
- * @param a_net_name a net name string
- * @return Returns an adress if successful, otherwise 0.
- */
-uint64_t dap_chain_net_get_cur_node_addr_gdb_sync(char *a_net_name)
-{
-char	l_key[DAP_GLOBAL_DB_KEY_MAX], l_key_time[DAP_GLOBAL_DB_KEY_MAX];
-uint8_t *l_node_addr_data, *l_node_time_data;
-size_t l_node_addr_len = 0, l_node_time_len = 0;
-uint64_t l_node_addr_ret = 0;
-time_t l_node_time = 0;
-
-    if(!a_net_name)
-        return 0;
-
-    snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s", a_net_name);
-    snprintf(l_key_time, sizeof(l_key_time) - 1, "cur_node_addr_%s_time", a_net_name);
-
-    l_node_addr_data = dap_global_db_get_sync(DAP_GLOBAL_DB_LOCAL_GENERAL, l_key, &l_node_addr_len, NULL, NULL);
-    l_node_time_data = dap_global_db_get_sync(DAP_GLOBAL_DB_LOCAL_GENERAL, l_key_time, &l_node_time_len, NULL, NULL);
-
-    if(l_node_addr_data && (l_node_addr_len == sizeof(uint64_t)) )
-        l_node_addr_ret = *( (uint64_t *) l_node_addr_data );
-
-    if(l_node_time_data && (l_node_time_len == sizeof(time_t)) )
-        l_node_time = *( (time_t *) l_node_time_data );
-
-    DAP_DELETE(l_node_addr_data);
-    DAP_DELETE(l_node_time_data);
-
-    // time delta in seconds
-    static int64_t addr_time_expired = -1;
-    // read time-expired
-
-    if(addr_time_expired == -1) {
-        dap_string_t *l_cfg_path = dap_string_new("network/");
-        dap_string_append(l_cfg_path, a_net_name);
-        dap_config_t *l_cfg;
-
-        if((l_cfg = dap_config_open(l_cfg_path->str)) == NULL) {
-            log_it(L_ERROR, "Can't open default network config");
-            addr_time_expired = 0;
-        } else {
-            addr_time_expired = 3600 *
-                    dap_config_get_item_int64_default(l_cfg, "general", "node-addr-expired",
-                    NODE_TIME_EXPIRED_DEFAULT);
-        }
-        dap_string_free(l_cfg_path, true);
-    }
-
-    time_t l_dt = time(NULL) - l_node_time;
-    //NODE_TIME_EXPIRED
-    if(l_node_time && l_dt > addr_time_expired) {
-        l_node_addr_ret = 0;
-    }
-
-    return l_node_addr_ret;
-}
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 28018cd932..7584b9baa8 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -99,7 +99,7 @@
 #include "dap_chain_ledger.h"
 #include "dap_chain_mempool.h"
 #include "dap_global_db.h"
-#include "dap_global_db_remote.h"
+#include "dap_global_db_cluster.h"
 
 #include "dap_stream_ch_chain_net.h"
 #include "dap_stream_ch_chain.h"
@@ -114,31 +114,6 @@
 
 static void s_dap_chain_net_purge(dap_chain_net_t *a_net);
 
-/**
- * @brief dap_chain_node_addr_t* dap_chain_node_addr_get_by_alias
- * Find in base addr by alias
- *
- * return addr, NULL if not found
- * @param a_net
- * @param a_alias
- * @return dap_chain_node_addr_t*
- */
-dap_chain_node_addr_t* dap_chain_node_addr_get_by_alias(dap_chain_net_t * a_net, const char *a_alias)
-{
-    dap_chain_node_addr_t *l_addr = NULL;
-    if(!a_alias)
-        return NULL;
-    const char *a_key = a_alias;
-    size_t l_addr_size = 0;
-    l_addr = (dap_chain_node_addr_t*) (void*) dap_global_db_get_sync(a_net->pub.gdb_nodes_aliases,a_key, &l_addr_size,NULL, NULL);
-    if(l_addr_size != sizeof(dap_chain_node_addr_t)) {
-        DAP_DELETE(l_addr);
-        l_addr = NULL;
-    }
-    return l_addr;
-}
-
-
 /**
  * @brief dap_list_t* get_aliases_by_name Get the aliases by name object
  * Find in base alias by addr
@@ -184,7 +159,7 @@ static dap_list_t* get_aliases_by_name(dap_chain_net_t * l_net, dap_chain_node_a
 static dap_chain_node_addr_t* s_node_info_get_addr(dap_chain_net_t * a_net, dap_chain_node_addr_t *a_addr, const char *a_alias_str)
 {
     dap_chain_node_addr_t *l_address = a_alias_str
-            ? dap_chain_node_addr_get_by_alias(a_net, a_alias_str)
+            ? dap_chain_node_alias_find(a_net, a_alias_str)
             : a_addr && a_addr->uint64 ? DAP_DUP(a_addr) : NULL;
     if (!l_address)
         log_it(L_ERROR, "Node address with specified params not found");
@@ -348,13 +323,6 @@ static int node_info_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_info
         dap_cli_server_cmd_set_reply_text(a_str_reply, "addr not found");
         return -1;
     }
-    // check, current node have this addr or no
-    uint64_t l_cur_addr = dap_chain_net_get_cur_node_addr_gdb_sync(a_net->pub.name);
-    if(l_cur_addr && l_cur_addr == a_node_info->hdr.address.uint64) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "current node cannot be deleted");
-        return -1;
-    }
-
     // find addr by alias or addr_str
     dap_chain_node_addr_t *address = s_node_info_get_addr(a_net, &a_node_info->hdr.address, alias_str);
     if(!address) {
@@ -1384,7 +1352,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
     case CMD_CONNECT: {
         // get address from alias if addr not defined
         if(alias_str && !l_node_addr.uint64) {
-            dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(l_net, alias_str);
+            dap_chain_node_addr_t *address_tmp = dap_chain_node_alias_find(l_net, alias_str);
             if(address_tmp) {
                 l_node_addr = *address_tmp;
                 DAP_DELETE(address_tmp);
@@ -1488,68 +1456,17 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             //DAP_DELETE(l_remote_node_info);
             return -1;
         }
-
         log_it(L_NOTICE, "Stream connection established");
-        dap_stream_ch_chain_sync_request_t l_sync_request = {};
-         dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, DAP_STREAM_CH_ID);
-         // fill begin id
-         l_sync_request.id_start = 1;
-         // fill current node address
-         l_sync_request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
-
-        // if need to get current node address (feature-2630)
-        if(!l_sync_request.node_addr.uint64 )
-        {
-            log_it(L_NOTICE, "Now get node addr");
-            uint8_t l_ch_id = DAP_STREAM_CH_ID_NET;
-            dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, l_ch_id);
-
-            size_t res = dap_stream_ch_chain_net_pkt_write(l_ch_chain,
-            DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST,
-            //DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST,
-            l_net->pub.id,
-            NULL, 0);
-            if(res == 0) {
-                log_it(L_WARNING, "Can't send DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST packet");
-                dap_chain_node_client_close_mt(l_node_client);
-                DAP_DELETE(l_remote_node_info);
-                return -1;
-            }
-            int timeout_ms = 15000; // 15 sec = 15 000 ms
-            int l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_NODE_ADDR_LEASED, timeout_ms);
-            switch (l_res) {
-            case 0:
-                if(l_node_client->cur_node_addr.uint64 != 0) {
-                    log_it(L_INFO, "Node address leased");
-                    l_sync_request.node_addr.uint64 = l_node_client->cur_node_addr.uint64;
-                    
-                    // save cur address
-                    // already saved
-                    // dap_db_set_cur_node_addr_exp(l_sync_request.node_addr.uint64, l_net->pub.name);
-                }
-                else
-                    log_it(L_WARNING, "Node address leased wrong!");
-                break;
-            case -1:
-                log_it(L_WARNING, "Timeout with addr leasing");
-            default:
-                if(l_res != -1)
-                    log_it(L_WARNING, "Node address request error %d", l_res);
-                /*dap_chain_node_client_close(l_node_client);
-                DAP_DELETE(l_remote_node_info);
-                return -1;*/
-            }
-        }
-        log_it(L_NOTICE, "Now lets sync all");
-
-        log_it(L_INFO, "Requested GLOBAL_DB syncronizatoin, %"DAP_UINT64_FORMAT_U":%"DAP_UINT64_FORMAT_U" period", l_sync_request.id_start,
-                l_sync_request.id_end);
-        // copy l_sync_request to current
-        //dap_stream_ch_chain_t * l_s_ch_chain = DAP_STREAM_CH_CHAIN(l_ch_chain);
-        //l_s_ch_chain->request_net_id.uint64 = l_net->pub.id.uint64;
-        //l_s_ch_chain->request_cell_id.uint64 = l_chain_cell_id_null.uint64;
-        //memcpy(&l_s_ch_chain->request, &l_sync_request, sizeof(l_sync_request));
 
+        dap_stream_ch_chain_sync_request_t l_sync_request = {};
+        dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, DAP_STREAM_CH_ID);
+        // fill begin id
+        l_sync_request.id_start = 1;
+        // fill current node address
+        l_sync_request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
+
+        log_it(L_INFO, "Requested GLOBAL_DB syncronizatoin, %"DAP_UINT64_FORMAT_U":%"DAP_UINT64_FORMAT_U" period",
+                                                        l_sync_request.id_start, l_sync_request.id_end);
         if(0 == dap_stream_ch_chain_pkt_write_unsafe(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB,
                 l_net->pub.id.uint64, 0, 0, &l_sync_request,
                 sizeof(l_sync_request))) {
@@ -1585,11 +1502,6 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             dap_chain_node_client_reset(l_node_client);
             // send request
             dap_stream_ch_chain_sync_request_t l_sync_request = {};
-            dap_chain_hash_fast_t *l_hash = dap_chain_db_get_last_hash_remote(l_node_client->remote_node_addr.uint64, l_chain);
-            if (l_hash) {
-                l_sync_request.hash_from = *l_hash;
-                DAP_DELETE(l_hash);
-            }
             if(0 == dap_stream_ch_chain_pkt_write_unsafe(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS,
                     l_net->pub.id.uint64, l_chain->id.uint64, l_remote_node_info->hdr.cell_id.uint64, &l_sync_request,
                     sizeof(l_sync_request))) {
@@ -1624,7 +1536,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
     case CMD_HANDSHAKE: {
         // get address from alias if addr not defined
         if(alias_str && !l_node_addr.uint64) {
-            dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(l_net, alias_str);
+            dap_chain_node_addr_t *address_tmp = dap_chain_node_alias_find(l_net, alias_str);
             if(address_tmp) {
                 l_node_addr = *address_tmp;
                 DAP_DELETE(address_tmp);
@@ -1662,11 +1574,16 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         DAP_DELETE(node_info);
         dap_cli_server_cmd_set_reply_text(a_str_reply, "Connection established");
     } break;
+
     case CMD_CONNECTIONS: {
-        char *l_reply = dap_chain_net_links_dump(l_net);
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_reply);
-        DAP_DELETE(l_reply);
+        dap_cluster_t *l_links_cluster = dap_cluster_by_mnemonim(l_net->pub.name);
+        if (!l_links_cluster) {
+             dap_cli_server_cmd_set_reply_text(a_str_reply, "Not found links cluster for net %s", l_net->pub.name);
+             break;
+        }
+        *a_str_reply = dap_cluster_get_links_info(l_links_cluster);
     } break;
+
     case  CMD_BAN: {
         dap_chain_net_t *l_netl = NULL;
         dap_chain_t *l_chain = NULL;
@@ -6408,7 +6325,8 @@ int cmd_gdb_export(int a_argc, char **a_argv, char **a_str_reply)
             }
             dap_enc_base64_encode(l_store_obj[i].value, l_store_obj[i].value_len, l_value_enc_str, DAP_ENC_DATA_TYPE_B64);
             struct json_object *jobj = json_object_new_object();
-            json_object_object_add(jobj, "id",      json_object_new_int64((int64_t)l_store_obj[i].id));
+            // TODO export sign and CRC and flags
+            //json_object_object_add(jobj, "id",      json_object_new_int64((int64_t)l_store_obj[i].id));
             json_object_object_add(jobj, "key",     json_object_new_string(l_store_obj[i].key));
             json_object_object_add(jobj, "value",   json_object_new_string(l_value_enc_str));
             json_object_object_add(jobj, "value_len", json_object_new_int64((int64_t)l_store_obj[i].value_len));
@@ -6491,15 +6409,15 @@ int cmd_gdb_import(int a_argc, char **a_argv, char ** a_str_reply)
             return -1;
         }
         for (size_t j = 0; j < l_records_count; ++j) {
-            struct json_object *l_record, *l_id, *l_key, *l_value, *l_value_len, *l_ts;
+            struct json_object *l_record, *l_key, *l_value, *l_value_len, *l_ts;
             l_record = json_object_array_get_idx(l_json_records, j);
-            l_id        = json_object_object_get(l_record, "id");
+            //l_id        = json_object_object_get(l_record, "id");
             l_key       = json_object_object_get(l_record, "key");
             l_value     = json_object_object_get(l_record, "value");
             l_value_len = json_object_object_get(l_record, "value_len");
             l_ts        = json_object_object_get(l_record, "timestamp");
-            //
-            l_group_store[j].id     = (uint64_t)json_object_get_int64(l_id);
+            // TODO import sign and CRC and flags
+            // l_group_store[j].id     = (uint64_t)json_object_get_int64(l_id);
             l_group_store[j].key    = dap_strdup(json_object_get_string(l_key));
             l_group_store[j].group  = dap_strdup(l_group_name);
             dap_nanotime_t l_temp = json_object_get_int64(l_ts);
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index b2dc753e96..955dfa0b03 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -56,7 +56,6 @@
 #include "dap_uuid.h"
 #include "dap_client.h"
 #include "dap_client_pvt.h"
-#include "dap_global_db_remote.h"
 #include "dap_chain.h"
 #include "dap_chain_cell.h"
 #include "dap_chain_net_srv.h"
@@ -281,7 +280,7 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg)
             if (l_node_client->keep_connection) {
                 if(l_node_client->stream_worker){
                     s_timer_update_states_callback(l_node_client);
-                    l_node_client->sync_timer = dap_timerfd_start_on_worker(l_stream->esocket->context->worker,
+                    l_node_client->sync_timer = dap_timerfd_start_on_worker(l_stream->esocket->worker,
                                                                             s_timer_update_states * 1000,
                                                                             s_timer_update_states_callback,
                                                                             l_node_client);
@@ -306,29 +305,6 @@ static void s_ch_chain_callback_notify_packet_in2(dap_stream_ch_chain_net_t* a_c
 {
     dap_chain_node_client_t * l_node_client = (dap_chain_node_client_t *) a_arg;
     switch (a_pkt_type) {
-    // get new generated current node address
-    case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE: {
-        if(a_pkt_net_data_size == sizeof(dap_chain_node_addr_t)) {
-            l_node_client->cur_node_addr = *(dap_chain_node_addr_t*)a_pkt_net->data;
-        }
-        pthread_mutex_lock(&l_node_client->wait_mutex);
-        l_node_client->state = NODE_CLIENT_STATE_NODE_ADDR_LEASED;
-        dap_cond_signal(l_node_client->wait_cond);
-        pthread_mutex_unlock(&l_node_client->wait_mutex);
-        break;
-    }
-    // get remote node address
-    case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR: {
-
-        if(a_pkt_net_data_size == sizeof(dap_chain_node_addr_t)) {
-            l_node_client->remote_node_addr = *(dap_chain_node_addr_t*)a_pkt_net->data;
-        }
-        pthread_mutex_lock(&l_node_client->wait_mutex);
-        l_node_client->state = NODE_CLIENT_STATE_GET_NODE_ADDR;
-        dap_cond_signal(l_node_client->wait_cond);
-        pthread_mutex_unlock(&l_node_client->wait_mutex);
-        break;
-    }
     case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY: {
         if(a_pkt_net_data_size == sizeof(dap_chain_node_addr_t)) {
             l_node_client->remote_node_addr = *(dap_chain_node_addr_t*)a_pkt_net->data;
@@ -507,8 +483,7 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_DELETE: {
             dap_chain_net_t *l_net = l_node_client->net;
             assert(l_net);
-            dap_chain_node_addr_t *l_node_addr = dap_chain_net_get_cur_addr(l_net);
-            log_it(L_DEBUG, "In: State node %s."NODE_ADDR_FP_STR" %s", l_net->pub.name, NODE_ADDR_FP_ARGS(l_node_addr),
+            log_it(L_DEBUG, "In: State node %s."NODE_ADDR_FP_STR" %s", l_net->pub.name, NODE_ADDR_FP_ARGS_S(g_node_addr),
                             a_pkt_type == DAP_STREAM_CH_CHAIN_PKT_TYPE_TIMEOUT ? "is timeout for sync" : "stream closed");
             l_node_client->state = NODE_CLIENT_STATE_ERROR;
             if (l_node_client->sync_timer)
@@ -537,7 +512,7 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch
  * @param a_is_pinned
  * @param a_arg
  */
-static void s_save_stat_to_database_callback_set_stat (dap_global_db_context_t * a_global_db_context,int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_len, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg)
+static void s_save_stat_to_database_callback_set_stat(dap_global_db_instance_t *a_dbi, int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_len, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg)
 {
     if( a_rc != DAP_GLOBAL_DB_RC_SUCCESS)
         log_it(L_ERROR,"Can't save stats to GlobalDB, code %d", a_rc);
@@ -557,7 +532,7 @@ static void s_save_stat_to_database_callback_set_stat (dap_global_db_context_t *
  * @param a_is_pinned
  * @param a_arg
  */
-static void s_save_stat_to_database_callback_get_last_stat (dap_global_db_context_t * a_global_db_context,int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_len, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg)
+static void s_save_stat_to_database_callback_get_last_stat(dap_global_db_instance_t *a_dbi, int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_len, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg)
 {
     char * l_json_str = (char *) a_arg;
     uint64_t l_key = 0;
diff --git a/modules/net/dap_chain_node_dns_client.c b/modules/net/dap_chain_node_dns_client.c
index 04898ac3b8..ec584ca0dd 100644
--- a/modules/net/dap_chain_node_dns_client.c
+++ b/modules/net/dap_chain_node_dns_client.c
@@ -25,6 +25,7 @@
 
 #include "dap_net.h"
 #include "dap_events.h"
+#include "dap_context.h"
 #include "dap_timerfd.h"
 #include "dap_chain_node_dns_server.h"
 #include "dap_chain_node_dns_client.h"
@@ -77,7 +78,7 @@ static void s_dns_client_esocket_read_callback(dap_events_socket_t * a_esocket,
     int l_answers_count = ntohs(*(uint16_t *)l_cur);
     if (l_answers_count != 1) {
         log_it(L_WARNING, "Incorrect DNS answer format");
-        l_dns_client->callback_error(a_esocket->context->worker, l_dns_client->callbacks_arg, EINVAL);
+        l_dns_client->callback_error(a_esocket->worker, l_dns_client->callbacks_arg, EINVAL);
         l_dns_client->is_callbacks_called = true;
         a_esocket->flags |= DAP_SOCK_SIGNAL_CLOSE;
         a_esocket->buf_in_size = a_esocket->buf_out_size = 0;
@@ -100,7 +101,7 @@ static void s_dns_client_esocket_read_callback(dap_events_socket_t * a_esocket,
     *(dap_chain_node_info_t*)l_link_full_node_list->nodes_info = l_result;
     l_link_full_node_list->count_node = 1;
 
-    l_dns_client->callback_success(a_esocket->context->worker, l_link_full_node_list, l_dns_client->callbacks_arg);
+    l_dns_client->callback_success(a_esocket->worker, l_link_full_node_list, l_dns_client->callbacks_arg);
     l_dns_client->is_callbacks_called = true;
     a_esocket->flags |= DAP_SOCK_SIGNAL_CLOSE;
     a_esocket->buf_in_size = a_esocket->buf_out_size = 0;
@@ -116,7 +117,7 @@ static void s_dns_client_esocket_error_callback(dap_events_socket_t * a_esocket,
 {
     struct dns_client * l_dns_client = (struct dns_client*) a_esocket->_inheritor;
     log_it(L_ERROR,"DNS client esocket error %d", a_error);
-    l_dns_client->callback_error(a_esocket->context->worker, l_dns_client->callbacks_arg, a_error);
+    l_dns_client->callback_error(a_esocket->worker, l_dns_client->callbacks_arg, a_error);
     l_dns_client->is_callbacks_called = true;
 }
 
@@ -141,7 +142,7 @@ static bool s_dns_client_esocket_timeout_callback(void * a_arg)
         struct dns_client * l_dns_client = (struct dns_client*) l_es->_inheritor;
         log_it(L_WARNING,"DNS request timeout, bad network?");
         if(! l_dns_client->is_callbacks_called ){
-            l_dns_client->callback_error(l_es->context->worker, l_dns_client->callbacks_arg, ETIMEDOUT);
+            l_dns_client->callback_error(l_es->worker, l_dns_client->callbacks_arg, ETIMEDOUT);
             l_dns_client->is_callbacks_called = true;
         }
         dap_events_socket_remove_and_delete_unsafe( l_es, false);
@@ -160,7 +161,7 @@ static void s_dns_client_esocket_delete_callback(dap_events_socket_t * a_esocket
     (void) a_arg;
     struct dns_client * l_dns_client = (struct dns_client*) a_esocket->_inheritor;
     if(! l_dns_client->is_callbacks_called )
-        l_dns_client->callback_error(a_esocket->context->worker, l_dns_client->callbacks_arg, EBUSY);
+        l_dns_client->callback_error(a_esocket->worker, l_dns_client->callbacks_arg, EBUSY);
     if(l_dns_client->name)
         DAP_DELETE(l_dns_client->name);
 }
diff --git a/modules/net/dap_chain_node_dns_server.c b/modules/net/dap_chain_node_dns_server.c
index bf9a95796f..11ff056fb6 100644
--- a/modules/net/dap_chain_node_dns_server.c
+++ b/modules/net/dap_chain_node_dns_server.c
@@ -32,7 +32,6 @@
 #include "dap_chain_node.h"
 #include "dap_string.h"
 #include "dap_global_db.h"
-#include "dap_global_db_remote.h"
 #include "dap_chain_net_balancer.h"
 
 #define LOG_TAG "dap_chain_node_dns_server"
@@ -289,7 +288,7 @@ void dap_dns_server_start( uint16_t a_port)
     }
     dap_events_socket_callbacks_t l_cb = {};
     l_cb.read_callback = dap_dns_client_read;
-    s_dns_server->instance = dap_server_new( NULL, a_port, SERVER_UDP, &l_cb);
+    s_dns_server->instance = dap_server_new(NULL, a_port, DAP_SERVER_UDP, &l_cb);
     if (!s_dns_server->instance) {
         log_it(L_ERROR, "Can't start DNS server");
         return;
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index ff92297f3d..48dce658f9 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -36,7 +36,6 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "dap_list.h"
 #include "dap_chain_common.h"
 #include "dap_chain.h"
-#include "dap_chain_pvt.h"
 #include "dap_chain_node.h"
 #include "dap_chain_ledger.h"
 #include "dap_chain_net_decree.h"
@@ -46,7 +45,7 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "uthash.h"
 
 #define DAP_CHAIN_NET_NAME_MAX 32
-#define DAP_BROADCAST_LIFETIME 15   // minutes
+#define DAP_CHAIN_NET_MEMPOOL_TTL 48 // Hours
 
 struct dap_chain_node_info;
 typedef struct dap_chain_node_client dap_chain_node_client_t;
@@ -70,6 +69,8 @@ typedef struct dap_chain_net{
         char * gdb_nodes_aliases;
         char * gdb_nodes;
 
+        dap_list_t *keys;               // List of PoA certs for net
+
         bool mempool_autoproc;
 
         dap_chain_t * chains; // double-linked list of chains
@@ -79,7 +80,7 @@ typedef struct dap_chain_net{
 
         pthread_mutex_t balancer_mutex;
         dap_list_t *link_list;
-        dap_list_t *bridged_networks;   // List of bridged network ID's allowed to cross-network TXs
+        dap_list_t *bridged_networks;   // List of bridged network ID's allowed to cross-network TX
     } pub;
     uint8_t pvt[];
 } dap_chain_net_t;
@@ -98,6 +99,8 @@ typedef bool (dap_chain_datum_filter_func_t)(dap_chain_datum_t *a_datum, dap_cha
 int dap_chain_net_init(void);
 void dap_chain_net_deinit(void);
 
+DAP_STATIC_INLINE uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t *a_net) { return g_node_addr.uint64; }
+
 void dap_chain_net_load_all();
 
 int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state);
@@ -129,6 +132,7 @@ bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net);
 bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client);
 bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client);
 
+void dap_chain_net_add_cluster_link(dap_chain_net_t *a_net, dap_stream_node_addr_t *a_node_addr);
 dap_chain_net_t * dap_chain_net_by_name( const char * a_name);
 dap_chain_net_t * dap_chain_net_by_id( dap_chain_net_id_t a_id);
 uint16_t dap_chain_net_get_acl_idx(dap_chain_net_t *a_net);
@@ -139,7 +143,6 @@ dap_string_t* dap_cli_list_net();
 dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const char * a_name);
 dap_chain_t *dap_chain_net_get_chain_by_id(dap_chain_net_t *l_net, dap_chain_id_t a_chain_id);
 
-dap_chain_node_addr_t * dap_chain_net_get_cur_addr( dap_chain_net_t * l_net);
 uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t * l_net);
 dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net);
 const char* dap_chain_net_get_type(dap_chain_t *l_chain);
@@ -149,8 +152,8 @@ dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * a_net);
 dap_list_t* dap_chain_net_get_node_list_cfg(dap_chain_net_t * a_net);
 dap_chain_node_role_t dap_chain_net_get_role(dap_chain_net_t * a_net);
 dap_chain_node_info_t *dap_get_balancer_link_from_cfg(dap_chain_net_t *a_net);
-
-
+int dap_chain_net_add_poa_certs_to_cluster(dap_chain_net_t *a_net, dap_global_db_cluster_t *a_cluster);
+bool dap_chain_net_add_validator_to_clusters(dap_chain_net_t *a_net, dap_stream_node_addr_t *a_addr);
 
 /**
  * @brief dap_chain_net_get_gdb_group_mempool
@@ -161,15 +164,15 @@ DAP_STATIC_INLINE char *dap_chain_net_get_gdb_group_mempool_new(dap_chain_t *a_c
 {
     dap_chain_net_t *l_net = a_chain ? dap_chain_net_by_id(a_chain->net_id) : NULL;
     return l_net
-            ? dap_strdup_printf("%s.chain-%s.mempool", l_net->pub.gdb_groups_prefix,a_chain->name)
+            ? dap_strdup_printf("%s.chain-%s.mempool", l_net->pub.gdb_groups_prefix, a_chain->name)
             : NULL;
 }
 
-DAP_STATIC_INLINE char *dap_chain_net_get_gdb_group_from_chain_new(dap_chain_t *a_chain)
+DAP_STATIC_INLINE char *dap_chain_net_get_gdb_group_nochain_new(dap_chain_t *a_chain)
 {
     dap_chain_net_t *l_net = a_chain ? dap_chain_net_by_id(a_chain->net_id) : NULL;
     return l_net
-            ? dap_strdup_printf("chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X, l_net->pub.name, a_chain->id.uint64)
+            ? dap_strdup_printf("%s.chain-%s.data", l_net->pub.name, a_chain->name)
             : NULL;
 }
 
@@ -177,14 +180,10 @@ dap_chain_t *dap_chain_net_get_chain_by_chain_type(dap_chain_net_t *a_net, dap_c
 dap_chain_t *dap_chain_net_get_default_chain_by_chain_type(dap_chain_net_t *a_net, dap_chain_type_t a_datum_type);
 char *dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t *a_net, dap_chain_type_t a_datum_type);
 dap_chain_net_t **dap_chain_net_list(uint16_t *a_size);
-bool dap_chain_net_get_extra_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr_t a_node_addr);
 
 int dap_chain_net_verify_datum_for_add(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, dap_hash_fast_t *a_datum_hash);
 char *dap_chain_net_verify_datum_err_code_to_str(dap_chain_datum_t *a_datum, int a_code);
-void dap_chain_net_add_downlink(dap_chain_net_t *a_net, dap_stream_worker_t *a_worker, dap_stream_ch_uuid_t a_ch_uuid, dap_events_socket_uuid_t a_esocket_uuid, char *a_addr, int a_port);
-void dap_chain_net_del_downlink(dap_stream_ch_uuid_t *a_ch_uuid);
 void dap_chain_net_add_gdb_notify_callback(dap_chain_net_t *a_net, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg);
-void dap_chain_net_sync_gdb_broadcast(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg);
 
 /**
  * @brief dap_chain_datum_list
diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h
index b5f8155889..e11cb0e92c 100644
--- a/modules/net/include/dap_chain_node.h
+++ b/modules/net/include/dap_chain_node.h
@@ -25,47 +25,12 @@
 #include "dap_list.h"
 #include "dap_worker.h"
 #include "dap_events_socket.h"
-
+#include "dap_stream.h"
 #include "dap_chain_common.h"
 #include "dap_global_db.h"
 #include "dap_chain.h"
 
-// Default time of a node address expired in hours
-#define NODE_TIME_EXPIRED_DEFAULT 720
-
 typedef struct dap_chain_net dap_chain_net_t;
-/**
-  *  Node Declaration request
-  *
-  */
-
-#define DAP_CHAIN_NODE_DECL_REQ_INFO_SIZE 32
-typedef struct dap_chain_node_delc_req{
-    dap_chain_node_addr_t node_address;
-    uint64_t create_ts;
-    union{
-        uint8_t raw[DAP_CHAIN_NODE_DECL_REQ_INFO_SIZE];
-        char str[DAP_CHAIN_NODE_DECL_REQ_INFO_SIZE];
-    } info;
-} DAP_ALIGN_PACKED dap_chain_decl_req_t;
-
-/**
-  * @struct dap_chain_node decl
-  * @details New node declaration
-  *
-  */
-#define DAP_CHAIN_NODE_DECL_ACCEPT_INFO_SIZE 32
-typedef struct dap_chain_node_decl{
-    dap_chain_decl_req_t request;
-    uint64_t accept_ts;
-    struct in_addr accept_addr_v4;
-    struct in6_addr accept_addr_v6;
-    union{
-        uint8_t raw[DAP_CHAIN_NODE_DECL_ACCEPT_INFO_SIZE];
-        char str[DAP_CHAIN_NODE_DECL_ACCEPT_INFO_SIZE];
-    } accept_info;
-} DAP_ALIGN_PACKED dap_chain_node_decl_t;
-
 typedef struct dap_chain_node_info {
     struct {
         dap_chain_node_addr_t address;        
@@ -81,17 +46,16 @@ typedef struct dap_chain_node_info {
     dap_chain_node_addr_t links[]; // dap_chain_addr_t
 } DAP_ALIGN_PACKED dap_chain_node_info_t;
 
-typedef struct dap_chain_node_publ{
-    dap_chain_hash_fast_t decl_hash;
-    dap_chain_node_info_t node_info;
-} DAP_ALIGN_PACKED dap_chain_node_publ_t;
+typedef dap_stream_node_addr_t dap_chain_node_addr_t;
+#define dap_chain_node_addr_str_check dap_stream_node_addr_str_check
+#define dap_chain_node_addr_from_str dap_stream_node_addr_from_str
+#define dap_chain_node_addr_not_null dap_stream_node_addr_not_null
 
 /**
  * Calculate size of struct dap_chain_node_info_t
  */
 size_t dap_chain_node_info_get_size(dap_chain_node_info_t *node_info);
 
-
 /**
  * Compare addresses of two dap_chain_node_info_t structures
  *
@@ -111,23 +75,6 @@ bool dap_chain_node_info_match(dap_chain_node_info_t *node_info1, dap_chain_node
  */
 //uint8_t* dap_chain_node_info_serialize(dap_chain_node_info_t *node_info, size_t *size);
 
-/**
- * Deserialize dap_chain_node_info_t
- * size[in] - length of input string
- * return data or NULL if error
- */
-//dap_chain_node_info_t* dap_chain_node_info_deserialize(uint8_t *node_info_str, size_t size);
-
-/**
- * Generate node addr by shard id
- */
-dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_id_t a_net_id);
-
-/**
- * Check the validity of the node address by shard id
- */
-bool dap_chain_node_check_addr(dap_chain_net_t * l_net,dap_chain_node_addr_t *addr);
-
 dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * l_net,const char *alias);
 bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr);
 bool dap_chain_node_alias_delete(dap_chain_net_t * l_net,const char *alias);
@@ -144,9 +91,4 @@ bool dap_chain_node_mempool_need_process(dap_chain_t *a_chain, dap_chain_datum_t
 bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, const char *a_datum_hash_str);
 void dap_chain_node_mempool_process_all(dap_chain_t *a_chain, bool a_force);
 bool dap_chain_node_mempool_autoproc_init();
-void dap_chain_node_mempool_autoproc_deinit();
-
-// Set addr for current node
-bool dap_db_set_cur_node_addr(uint64_t a_address, char *a_net_name);
-bool dap_db_set_cur_node_addr_exp(uint64_t a_address, char *a_net_name );
-uint64_t dap_chain_net_get_cur_node_addr_gdb_sync(char *a_net_name);
+inline static void dap_chain_node_mempool_autoproc_deinit() {}
diff --git a/modules/net/include/dap_chain_node_cli_cmd.h b/modules/net/include/dap_chain_node_cli_cmd.h
index 48eb99f2d0..5888451143 100644
--- a/modules/net/include/dap_chain_node_cli_cmd.h
+++ b/modules/net/include/dap_chain_node_cli_cmd.h
@@ -30,14 +30,6 @@
 #include "dap_chain_node.h"
 #include "dap_chain_node_cli.h"
 
-/**
- * Find in base addr by alias
- *
- * return addr, NULL if not found
- */
-dap_chain_node_addr_t* dap_chain_node_addr_get_by_alias(dap_chain_net_t * a_net, const char *alias);
-
-
 int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int a_argc, char **a_argv, char ** a_str_reply,
                              dap_chain_t ** a_chain, dap_chain_net_t ** a_net);
 
diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c
index fd3d1fcb24..31b85360a2 100644
--- a/modules/net/srv/dap_chain_net_srv.c
+++ b/modules/net/srv/dap_chain_net_srv.c
@@ -49,6 +49,7 @@
 #include "dap_chain.h"
 #include "dap_chain_common.h"
 #include "dap_chain_net_srv.h"
+#include "dap_chain_net_tx.h"
 #include "dap_chain_net_srv_order.h"
 #include "dap_chain_net_srv_stream_session.h"
 #include "dap_stream_ch_chain_net_srv.h"
@@ -793,23 +794,42 @@ static bool s_pay_verificator_callback(dap_ledger_t * a_ledger, dap_chain_tx_out
         return false;
     }
 
-    // Check out value is equal to value in receipt
-    dap_list_t *l_items_list = dap_chain_datum_tx_items_get(a_tx_in, TX_ITEM_TYPE_OUT, NULL), *l_item;
-    dap_chain_addr_t l_provider_addr = { };
-    dap_chain_addr_fill(&l_provider_addr, l_provider_sign_type, &l_provider_pkey_hash, dap_chain_net_id_by_name(a_ledger->net_name));
-    int l_ret = -1;
-    DL_FOREACH(l_items_list, l_item) {
-        if (dap_chain_addr_compare(&l_provider_addr, &((dap_chain_tx_out_t*)l_item->data)->addr)) {
-            l_ret = !compare256(((dap_chain_tx_out_t*)l_item->data)->header.value, l_receipt->receipt_info.value_datoshi) ? 0 : 1;
-            if (l_ret) {
-                log_it(L_ERROR, "Value in tx out is not equal to value in receipt"); // TODO: print the balances!
+    // check remainder on srv pay cond out is valid
+    // find 'out' items
+    dap_list_t *l_list_out = dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx_in, TX_ITEM_TYPE_OUT_ALL, NULL);
+    uint256_t l_value = l_receipt->receipt_info.value_datoshi;
+    uint256_t l_cond_out_value = {};
+    dap_chain_addr_t l_network_fee_addr = {};
+    dap_chain_net_tx_get_fee(a_ledger->net_id, NULL, &l_network_fee_addr);
+    int l_item_idx = 0;
+    for (dap_list_t * l_list_tmp = l_list_out; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_item_idx++) {
+        dap_chain_tx_item_type_t l_type = *(uint8_t *)l_list_tmp->data;
+        switch (l_type) {
+        case TX_ITEM_TYPE_OUT: { // 256
+            dap_chain_tx_out_t *l_tx_out = (dap_chain_tx_out_t *)l_list_tmp->data;
+            if (dap_chain_addr_compare(&l_tx_out->addr, &l_network_fee_addr)){
+                SUM_256_256(l_value, l_tx_out->header.value, &l_value);
             }
-            break;
+        } break;
+        case TX_ITEM_TYPE_OUT_COND: {
+            dap_chain_tx_out_cond_t *l_tx_out = (dap_chain_tx_out_cond_t *)l_list_tmp->data;
+            if (l_tx_out->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE){
+                SUM_256_256(l_value, l_cond_out_value = l_tx_out->header.value, &l_value);
+            } else if (l_tx_out->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY){
+                l_cond_out_value = l_tx_out->header.value;
+            }
+        } break;
+        default: {}
         }
     }
-    dap_list_free(l_items_list);
-    debug_if(l_ret == -1, L_ERROR, "Not found out in tx matching provider addr");
-    return !l_ret;
+
+    if (!compare256(l_value, l_cond_out_value)){
+        log_it(L_ERROR, "Value in tx out is invalid!");
+        dap_list_free(l_list_out);
+        return false;
+    }
+    dap_list_free(l_list_out);
+    return true;
 }
 
 int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, const char *a_config_section){
@@ -833,10 +853,6 @@ int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, cons
     a_srv->grace_period = dap_config_get_item_uint32_default(g_config, a_config_section, "grace_period", 60);
     a_srv->allow_free_srv = dap_config_get_item_bool_default(g_config, a_config_section, "allow_free_srv", false);
     int l_err_code = 0;
-    dap_chain_node_addr_t *l_node_addr = NULL;
-    l_node_addr = dap_chain_net_get_cur_addr(l_net);
-    if (!l_node_addr)
-        return -1;
     size_t l_orders_count = 0;
     uint64_t l_max_price_cfg = dap_config_get_item_uint64_default(g_config, a_config_section, "max_price", 0xFFFFFFFFFFFFFFF);
     char *l_gdb_order_group = dap_chain_net_srv_order_get_gdb_group(l_net);
@@ -844,7 +860,7 @@ int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, cons
     for (size_t i=0; i < l_orders_count; i++){
         l_err_code = -4;
         dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_read(l_orders[i].value, l_orders[i].value_len);
-        if (l_order->node_addr.uint64 == l_node_addr->uint64 &&
+        if (l_order->node_addr.uint64 == g_node_addr.uint64 &&
             l_order->srv_uid.uint64 == a_srv->uid.uint64) {
             l_err_code = 0;
             dap_chain_net_srv_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_price_t);
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index 7ffd009ea5..a36bf37f8e 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -64,7 +64,7 @@ struct dap_order_notify {
 };
 
 static dap_list_t *s_order_notify_callbacks = NULL;
-static void s_srv_order_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg);
+static void s_srv_order_callback_notify(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg);
 
 static dap_timerfd_t *s_timer_order_check_decree_sign = NULL;
 static void s_srv_order_check_decree_sign_timer() {
@@ -656,15 +656,12 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d
     }
 }
 
-static void s_srv_order_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg)
+static void s_srv_order_callback_notify(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg)
 {
     if (!a_arg || !a_obj || !a_obj->key)
         return;
     dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg;
-    dap_global_db_context_t * l_gdb_context = dap_global_db_context_current();
     assert(l_net);
-    assert(l_gdb_context);
-
     char *l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(l_net);
 
     if (!dap_strcmp(a_obj->group, l_gdb_group_str)) {
@@ -672,15 +669,15 @@ static void s_srv_order_callback_notify(dap_global_db_context_t *a_context, dap_
             struct dap_order_notify *l_notifier = (struct dap_order_notify *)it->data;
             if ((l_notifier->net == NULL || l_notifier->net == l_net) &&
                         l_notifier->callback) {
-                l_notifier->callback(a_context, a_obj, l_notifier->cb_arg);
+                l_notifier->callback(a_dbi, a_obj, l_notifier->cb_arg);
             }
         }
         bool l_allow_unsigned_orders = dap_config_get_item_bool_default(g_config, "srv", "allow_unsigned_orders", false);
-        if (a_obj->value && a_obj->type == DAP_DB$K_OPTYPE_ADD) {
+        if (a_obj->value && a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD) {
             dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_obj->value;
             if (l_order->version != 3) {
                 log_it(L_NOTICE, "Order %s removed version != 3.", a_obj->key);
-                dap_global_db_del_unsafe(l_gdb_context, a_obj->group, a_obj->key);
+                dap_global_db_del_sync(a_obj->group, a_obj->key);
             } else {
                 if (l_allow_unsigned_orders) {
                     log_it(L_DEBUG, "The mode that disables verification of the order signature is enabled.");
@@ -691,7 +688,7 @@ static void s_srv_order_callback_notify(dap_global_db_context_t *a_context, dap_
                                                        sizeof(dap_chain_net_srv_order_t) + l_order->ext_size);
                     if (l_verify) {
                         log_it(L_ERROR, "Order unverified, err %d", l_verify);
-                        dap_global_db_del_unsafe(l_gdb_context, a_obj->group, a_obj->key);
+                        dap_global_db_del_sync(a_obj->group, a_obj->key);
                     }
                 }
             }
diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c
index 9d95c9c882..3c18fe87ad 100644
--- a/modules/service/datum/dap_chain_net_srv_datum.c
+++ b/modules/service/datum/dap_chain_net_srv_datum.c
@@ -36,7 +36,7 @@
 static dap_chain_net_srv_t *s_srv_datum = NULL;
 static int s_srv_datum_cli(int argc, char ** argv, char **a_str_reply);
 
-void s_order_notficator(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg);
+void s_order_notficator(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg);
 
 int dap_chain_net_srv_datum_init()
 {
@@ -195,20 +195,16 @@ static int s_srv_datum_cli(int argc, char ** argv, char **a_str_reply) {
  * @param a_value
  * @param a_value_len
  */
-void s_order_notficator(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg)
+void s_order_notficator(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg)
 {
-    if (a_obj->type == DAP_DB$K_OPTYPE_DEL)
+    if (a_obj->type == DAP_GLOBAL_DB_OPTYPE_DEL)
         return;
     dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg;
     dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_read((byte_t *)a_obj->value, a_obj->value_len);    // Old format comliance
-    dap_global_db_context_t * l_gdb_context = dap_global_db_context_current();
-    assert(l_gdb_context);
     if (!l_order && a_obj->key) {
         log_it(L_NOTICE, "Order %s is corrupted", a_obj->key);
-        if(dap_global_db_del_unsafe(l_gdb_context, a_obj->group, a_obj->key) != 0 ){
+        if (dap_global_db_driver_delete(a_obj, 1) != 0)
             log_it(L_ERROR,"Can't delete order %s", a_obj->key);
-        }
-
         return; // order is corrupted
     }
 
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 ed6a402b2c..19b8d96dca 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
@@ -265,14 +265,14 @@ int dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_signing_addr)
     return 0;
 }
 
-dap_list_t *dap_chain_net_srv_stake_get_validators(dap_chain_net_id_t a_net_id, bool a_is_active)
+dap_list_t *dap_chain_net_srv_stake_get_validators(dap_chain_net_id_t a_net_id, bool a_only_active)
 {
     dap_list_t *l_ret = NULL;
     if (!s_srv_stake || !s_srv_stake->itemlist)
         return l_ret;
     for (dap_chain_net_srv_stake_item_t *l_stake = s_srv_stake->itemlist; l_stake; l_stake = l_stake->hh.next)
         if (a_net_id.uint64 == l_stake->signing_addr.net_id.uint64 &&
-                l_stake->is_active == a_is_active)
+                a_only_active ? l_stake->is_active : true)
             l_ret = dap_list_append(l_ret, DAP_DUP(l_stake));
     return l_ret;
 }
@@ -971,10 +971,9 @@ char *s_stake_order_create(dap_chain_net_t *a_net, uint256_t *a_fee, dap_enc_key
     dap_chain_hash_fast_t l_tx_hash = {};
     dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_SELL;
     const char *l_native_ticker = a_net->pub.native_ticker;
-    dap_chain_node_addr_t *l_node_addr = dap_chain_net_get_cur_addr(a_net);
     dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 =  SERV_UNIT_PCS};
     dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID };
-    char *l_order_hash_str = dap_chain_net_srv_order_create(a_net, l_dir, l_uid, *l_node_addr,
+    char *l_order_hash_str = dap_chain_net_srv_order_create(a_net, l_dir, l_uid, g_node_addr,
                                                             l_tx_hash, a_fee, l_unit, l_native_ticker, 0,
                                                             NULL, 0, 1, NULL, 0, a_key);
     return l_order_hash_str;
@@ -1313,10 +1312,10 @@ static void s_get_tx_filter_callback(dap_chain_net_t* a_net, dap_chain_datum_tx_
     return;
 }
 
-static int callback_compare_tx_list(const void *a_datum1, const void *a_datum2)
+static int s_callback_compare_tx_list(dap_list_t *a_datum1, dap_list_t *a_datum2)
 {
-    dap_chain_datum_tx_t    *l_datum1 = (dap_chain_datum_tx_t*)((dap_list_t*)a_datum1)->data,
-                            *l_datum2 = (dap_chain_datum_tx_t*)((dap_list_t*)a_datum2)->data;
+    dap_chain_datum_tx_t    *l_datum1 = a_datum1->data,
+                            *l_datum2 = a_datum2->data;
     if (!l_datum1 || !l_datum2) {
         log_it(L_CRITICAL, "Invalid element");
         return 0;
@@ -1831,7 +1830,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply)
                 char *l_coins = NULL;
                 char* l_node_address_text_block = NULL;
                 dap_chain_net_get_tx_all(l_net,TX_SEARCH_TYPE_NET,s_get_tx_filter_callback, l_args);
-                l_args->ret = dap_list_sort(l_args->ret, callback_compare_tx_list);
+                l_args->ret = dap_list_sort(l_args->ret, s_callback_compare_tx_list);
                 for(dap_list_t *tx = l_args->ret; tx; tx = tx->next)
                 {
                     l_datum_tx = (dap_chain_datum_tx_t*)tx->data;
diff --git a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h
index ca59e92cd6..d008914557 100644
--- a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h
+++ b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h
@@ -72,7 +72,7 @@ uint256_t dap_chain_net_srv_stake_get_allowed_min_value();
 
 int dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_addr);
 int dap_chain_net_srv_stake_verify_key_and_node(dap_chain_addr_t* a_signing_addr, dap_chain_node_addr_t* a_node_addr);
-dap_list_t *dap_chain_net_srv_stake_get_validators(dap_chain_net_id_t a_net_id, bool a_is_active);
+dap_list_t *dap_chain_net_srv_stake_get_validators(dap_chain_net_id_t a_net_id, bool a_only_active);
 dap_chain_node_addr_t *dap_chain_net_srv_stake_key_get_node_addr(dap_chain_addr_t *a_signing_addr);
 
 bool dap_chain_net_srv_stake_get_fee_validators(dap_chain_net_t *a_net,
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index 06d6415d9a..ad2d44767b 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -82,6 +82,7 @@ typedef struct iphdr dap_os_iphdr_t;
 #include "dap_strfuncs.h"
 #include "dap_config.h"
 
+#include "dap_context.h"
 #include "dap_events_socket.h"
 #include "dap_http_client.h"
 
@@ -312,10 +313,6 @@ static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * l_ch_vpn_in
             DAP_DEL_Z(l_pkt_out);
             return false;
         }
-       /*
-        dap_stream_worker_t *l_stream_worker = (dap_stream_worker_t *)dap_worker_get_current()->_inheritor;
-        s_tun_client_send_data_inter(l_stream_worker->queue_ch_io_input[l_ch_vpn_info->worker->id], l_ch_vpn_info->ch_vpn, l_pkt_out);
-        */
         if(s_debug_more){
 #ifdef DAP_OS_LINUX
             struct in_addr l_in_daddr = { .s_addr = ((dap_os_iphdr_t*)l_pkt_out->data)->daddr };
@@ -376,7 +373,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
     switch (l_msg->type) {
         case TUN_SOCKET_MSG_ESOCKET_REASSIGNED: {
             assert(l_msg->esocket_reassigment.worker_id < s_tun_sockets_count);
-            dap_chain_net_srv_vpn_tun_socket_t* l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id];
+            dap_chain_net_srv_vpn_tun_socket_t* l_tun_sock = s_tun_sockets[a_esocket_queue->worker->id];
             assert(l_tun_sock);
             dap_chain_net_srv_ch_vpn_info_t* l_info = NULL;
             HASH_FIND(hh, l_tun_sock->clients, &l_msg->esocket_reassigment.addr, sizeof(l_msg->esocket_reassigment.addr), l_info);
@@ -384,11 +381,11 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
                 l_info->worker = dap_events_worker_get(l_msg->esocket_reassigment.worker_id);
                 l_info->queue_msg = s_tun_sockets_queue_msg[l_msg->esocket_reassigment.worker_id];
                 l_info->is_reassigned_once = true;
-                l_info->is_on_this_worker = (a_esocket_queue->context->worker->id == l_msg->esocket_reassigment.worker_id);
+                l_info->is_on_this_worker = (a_esocket_queue->worker->id == l_msg->esocket_reassigment.worker_id);
                 if (s_debug_more) {
                     char l_addrbuf[INET_ADDRSTRLEN];
                     inet_ntop(AF_INET, &l_msg->esocket_reassigment.addr, l_addrbuf, sizeof(l_addrbuf));
-                    log_it(L_INFO, "Tun:%u message: addr %s reassign on worker #%u", a_esocket_queue->context->worker->id,
+                    log_it(L_INFO, "Tun:%u message: addr %s reassign on worker #%u", a_esocket_queue->worker->id,
                         l_addrbuf, l_msg->esocket_reassigment.worker_id);
                 }
             }
@@ -396,13 +393,13 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
                 char l_addrbuf[INET_ADDRSTRLEN];
                 inet_ntop(AF_INET, &l_msg->esocket_reassigment.addr, l_addrbuf, sizeof(l_addrbuf));
                 log_it(L_INFO, "Reassigment message for address %s on worker %u comes but no such address was found on tun socket %u",
-                    l_addrbuf, l_msg->esocket_reassigment.worker_id, a_esocket_queue->context->worker->id);
+                    l_addrbuf, l_msg->esocket_reassigment.worker_id, a_esocket_queue->worker->id);
             }
         } break; /* l_msg->type == TUN_SOCKET_MSG_ESOCKET_REASSIGNED */
 
         case TUN_SOCKET_MSG_IP_ASSIGNED:{
             assert(l_msg->ip_assigment.worker_id < s_tun_sockets_count);
-            dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id];
+            dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->worker->id];
             assert(l_tun_sock);
 
             dap_chain_net_srv_ch_vpn_info_t * l_new_info = NULL;
@@ -423,7 +420,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
                 l_new_info->queue_msg           = s_tun_sockets_queue_msg[l_msg->ip_assigment.worker_id];
                 l_new_info->usage_id            = l_msg->ip_assigment.usage_id;
                 l_new_info->is_reassigned_once  = l_msg->is_reassigned_once;
-                l_new_info->is_on_this_worker   = (l_msg->ip_assigment.worker_id == a_esocket_queue->context->worker->id);
+                l_new_info->is_on_this_worker   = (l_msg->ip_assigment.worker_id == a_esocket_queue->worker->id);
                 l_new_info->esocket             = l_msg->esocket;
                 l_new_info->esocket_uuid        = l_msg->esocket_uuid;
                 l_new_info->worker              = dap_events_worker_get(l_msg->ip_assigment.worker_id);
@@ -431,7 +428,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
                 if (dap_log_level_get() <= L_INFO) {
                     char l_addrbuf[INET_ADDRSTRLEN];
                     inet_ntop(AF_INET, &l_msg->ip_assigment.addr, l_addrbuf, sizeof(l_addrbuf));
-                    log_it(L_DEBUG, "Tun:%u message: addr %s assigned for worker #%u on tun #u", a_esocket_queue->context->worker->id,
+                    log_it(L_DEBUG, "Tun:%u message: addr %s assigned for worker #%u on tun #u", a_esocket_queue->worker->id,
                         l_addrbuf, l_msg->ip_assigment.worker_id);
                 }
             }
@@ -439,7 +436,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
 
         case TUN_SOCKET_MSG_IP_UNASSIGNED:{
             assert(l_msg->ip_unassigment.worker_id < s_tun_sockets_count);
-            dap_chain_net_srv_vpn_tun_socket_t *l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id];
+            dap_chain_net_srv_vpn_tun_socket_t *l_tun_sock = s_tun_sockets[a_esocket_queue->worker->id];
             assert(l_tun_sock);
 
             dap_chain_net_srv_ch_vpn_info_t *l_new_info = NULL;
@@ -460,18 +457,18 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
         }break; /* l_msg->type == TUN_SOCKET_MSG_IP_UNASSIGNED */
 
         case TUN_SOCKET_MSG_CH_VPN_SEND: {
-            if (dap_context_find(a_esocket_queue->context->worker->context, l_msg->esocket_uuid) == l_msg->esocket) {
+            if (dap_context_find(a_esocket_queue->worker->context, l_msg->esocket_uuid) == l_msg->esocket) {
                 s_tun_client_send_data_unsafe(l_msg->ch_vpn, l_msg->ch_vpn_send.pkt);
                 if (s_debug_more) {
                     char l_addrbuf[INET_ADDRSTRLEN];
                     inet_ntop(AF_INET, &l_msg->ip_assigment.addr, l_addrbuf, sizeof(l_addrbuf));
                     log_it(L_DEBUG, "Tun:%u message: send %u bytes for ch vpn protocol",
-                        a_esocket_queue->context->worker->id, l_msg->ch_vpn_send.pkt->header.op_data.data_size);
+                        a_esocket_queue->worker->id, l_msg->ch_vpn_send.pkt->header.op_data.data_size);
                 }
             }
             else {
                 log_it(L_ERROR, "MSG: No esocket %p on worker #%u, lost %d data",
-                    l_msg->esocket, a_esocket_queue->context->worker->id, l_msg->ch_vpn_send.pkt->header.op_data.data_size);
+                    l_msg->esocket, a_esocket_queue->worker->id, l_msg->ch_vpn_send.pkt->header.op_data.data_size);
             }
             DAP_DELETE(l_msg->ch_vpn_send.pkt);
         } break; /* l_msg->type == TUN_SOCKET_MSG_CH_VPN_SEND */
@@ -1198,7 +1195,7 @@ static void s_ch_vpn_esocket_unassigned(dap_events_socket_t* a_es, dap_worker_t
    //dap_chain_net_srv_ch_vpn_info_t * l_info = NULL;
    // HASH_FIND(hh,l_tun_sock->clients,&l_ch_vpn->addr_ipv4 , sizeof (l_ch_vpn->addr_ipv4), l_info);
 
-    s_tun_send_msg_esocket_reassigned_all_inter(a_es->context->worker->id, l_ch_vpn, l_ch_vpn->ch->stream->esocket,
+    s_tun_send_msg_esocket_reassigned_all_inter(a_es->worker->id, l_ch_vpn, l_ch_vpn->ch->stream->esocket,
                                                l_ch_vpn->ch->stream->esocket_uuid, l_ch_vpn->addr_ipv4);
 }
 
@@ -1846,9 +1843,9 @@ static void s_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
 static void s_es_tun_delete(dap_events_socket_t * a_es, void * arg)
 {
     (void) arg;
-    if (a_es->context->worker) {
-        s_tun_sockets[a_es->context->worker->id] = NULL;
-        dap_events_socket_remove_and_delete_unsafe(s_tun_sockets_queue_msg[a_es->context->worker->id],false);
+    if (a_es->worker) {
+        s_tun_sockets[a_es->worker->id] = NULL;
+        dap_events_socket_remove_and_delete_unsafe(s_tun_sockets_queue_msg[a_es->worker->id],false);
         log_it(L_NOTICE,"Destroyed TUN event socket");
     }
 }
@@ -1968,11 +1965,11 @@ static void s_es_tun_read(dap_events_socket_t * a_es, void * arg)
         }
         if (l_vpn_info) {
             if ( !l_vpn_info->is_on_this_worker && !l_vpn_info->is_reassigned_once && s_raw_server->auto_cpu_reassignment) {
-                log_it(L_NOTICE, "Reassigning from worker %u to %u", l_vpn_info->worker->id, a_es->context->worker->id);
+                log_it(L_NOTICE, "Reassigning from worker %u to %u", l_vpn_info->worker->id, a_es->worker->id);
                 l_vpn_info->is_reassigned_once = true;
-                s_tun_send_msg_esocket_reassigned_all_inter(a_es->context->worker->id, l_vpn_info->ch_vpn, l_vpn_info->esocket, l_vpn_info->esocket_uuid,
+                s_tun_send_msg_esocket_reassigned_all_inter(a_es->worker->id, l_vpn_info->ch_vpn, l_vpn_info->esocket, l_vpn_info->esocket_uuid,
                     l_vpn_info->addr_ipv4);
-                dap_events_socket_reassign_between_workers_mt(l_vpn_info->worker, l_vpn_info->esocket, a_es->context->worker);
+                dap_events_socket_reassign_between_workers_mt(l_vpn_info->worker, l_vpn_info->esocket, a_es->worker);
             }
             s_tun_client_send_data(l_vpn_info, a_es->buf_in, l_buf_in_size);
         } else if(s_debug_more) {
@@ -2006,7 +2003,7 @@ static void s_es_tun_new(dap_events_socket_t * a_es, void * arg)
     (void) arg;
     dap_chain_net_srv_vpn_tun_socket_t * l_tun_socket = DAP_NEW_Z(dap_chain_net_srv_vpn_tun_socket_t);
     if ( l_tun_socket ){
-        dap_worker_t * l_worker = l_tun_socket->worker = a_es->context->worker;
+        dap_worker_t * l_worker = l_tun_socket->worker = a_es->worker;
         uint32_t l_worker_id = l_tun_socket->worker_id = l_worker->id;
         l_tun_socket->es = a_es;
 
diff --git a/modules/service/vpn/dap_chain_net_vpn_client_tun.c b/modules/service/vpn/dap_chain_net_vpn_client_tun.c
index 29e3e883b8..9b7b416466 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c
@@ -351,7 +351,7 @@ void m_client_tun_new(dap_events_socket_t * a_es, void * arg)
     (void) arg;
     dap_chain_net_srv_vpn_tun_socket_t * l_tun_socket = DAP_NEW_Z(dap_chain_net_srv_vpn_tun_socket_t);
     if ( l_tun_socket ){
-        l_tun_socket->worker = a_es->context->worker;
+        l_tun_socket->worker = a_es->worker;
         l_tun_socket->worker_id = l_tun_socket->worker->id;
         l_tun_socket->es = a_es;
         //s_tun_sockets_queue_msg[a_es->worker->id] = dap_events_socket_create_type_queue_ptr_unsafe(a_es->worker, s_tun_recv_msg_callback );
@@ -551,7 +551,7 @@ int dap_chain_net_vpn_client_tun_delete(void)
 {
     if(s_tun_events_socket) {
         pthread_mutex_lock(&s_clients_mutex);
-        dap_events_socket_remove_and_delete_mt(s_tun_events_socket->context->worker, s_tun_events_socket->uuid);
+        dap_events_socket_remove_and_delete_mt(s_tun_events_socket->worker, s_tun_events_socket->uuid);
         s_tun_events_socket = NULL;
         pthread_mutex_unlock(&s_clients_mutex);
     }
diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c
index c1252c5029..5ac17d71d0 100644
--- a/modules/service/xchange/dap_chain_net_srv_xchange.c
+++ b/modules/service/xchange/dap_chain_net_srv_xchange.c
@@ -894,7 +894,6 @@ char *s_xchange_order_create(dap_chain_net_srv_xchange_price_t *a_price, dap_cha
     dap_chain_hash_fast_t l_tx_hash = {};
     dap_hash_fast(a_tx, dap_chain_datum_tx_get_size(a_tx), &l_tx_hash);
     a_price->tx_hash = l_tx_hash;
-    dap_chain_node_addr_t *l_node_addr = dap_chain_net_get_cur_addr(a_price->net);
     dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 =  SERV_UNIT_UNDEFINED};
     dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_XCHANGE_ID };
     uint256_t l_datoshi_buy = uint256_0;
@@ -903,7 +902,7 @@ char *s_xchange_order_create(dap_chain_net_srv_xchange_price_t *a_price, dap_cha
     l_ext.datoshi_buy = l_datoshi_buy;
     strncpy(l_ext.token_buy, a_price->token_buy, DAP_CHAIN_TICKER_SIZE_MAX);
     uint32_t l_ext_size = sizeof(dap_srv_xchange_order_ext_t);
-    char *l_order_hash_str = dap_chain_net_srv_order_create(a_price->net, SERV_DIR_SELL, l_uid, *l_node_addr,
+    char *l_order_hash_str = dap_chain_net_srv_order_create(a_price->net, SERV_DIR_SELL, l_uid, g_node_addr,
                                                             l_tx_hash, &a_price->datoshi_sell, l_unit, a_price->token_sell, 0,
                                                             (uint8_t *)&l_ext, l_ext_size, 0, NULL, 0, a_price->wallet_key);
     return l_order_hash_str;
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index 8f13d23ab3..e023afc930 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -139,6 +139,8 @@ static dap_chain_block_t *s_new_block_move(dap_chain_cs_blocks_t *a_blocks, size
 static size_t s_callback_count_atom(dap_chain_t *a_chain);
 static dap_list_t *s_callback_get_atoms(dap_chain_t *a_chain, size_t a_count, size_t a_page, bool a_reverse);
 
+static int s_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config);
+
 static bool s_seed_mode = false;
 static bool s_debug_more = false;
 
@@ -149,7 +151,7 @@ static bool s_debug_more = false;
  */
 int dap_chain_cs_blocks_init()
 {
-    dap_chain_cs_type_add("blocks", dap_chain_cs_blocks_new );
+    dap_chain_cs_type_add("blocks", s_chain_cs_blocks_new);
     s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false);
     s_debug_more = dap_config_get_item_bool_default(g_config, "blocks", "debug_more", false);
     dap_cli_server_cmd_add ("block", s_cli_blocks, "Create and explore blockchains",
@@ -198,7 +200,7 @@ void dap_chain_cs_blocks_deinit()
     dap_chain_block_cache_deinit();
 }
 
-int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config)
+static int s_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config)
 {
     dap_chain_cs_blocks_t * l_cs_blocks = DAP_NEW_Z(dap_chain_cs_blocks_t);
     if (!l_cs_blocks) {
@@ -293,15 +295,6 @@ int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config
     return 0;
 }
 
-/**
- * @brief dap_chain_cs_blocks_delete
- * @param a_chain
- */
-void dap_chain_cs_blocks_delete(dap_chain_t * a_chain)
-{
-    s_callback_delete(a_chain);
-}
-
 /**
  * @brief dap_chain_block_cs_cache_get_by_hash
  * @param a_blocks
diff --git a/modules/type/blocks/include/dap_chain_cs_blocks.h b/modules/type/blocks/include/dap_chain_cs_blocks.h
index 4e1cf5494e..708dd05bba 100644
--- a/modules/type/blocks/include/dap_chain_cs_blocks.h
+++ b/modules/type/blocks/include/dap_chain_cs_blocks.h
@@ -66,7 +66,4 @@ typedef int (*dap_chain_blocks_block_callback_ptr_t)(dap_chain_cs_blocks_t *, da
 
 int dap_chain_cs_blocks_init();
 void dap_chain_cs_blocks_deinit();
-
-int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config);
-void dap_chain_cs_blocks_delete(dap_chain_t * a_chain);
 dap_chain_block_cache_t * dap_chain_block_cs_cache_get_by_hash(dap_chain_cs_blocks_t * a_blocks,  dap_chain_hash_fast_t *a_block_hash);
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 74c84fba9a..003da1bff4 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -88,6 +88,8 @@ typedef struct dap_chain_cs_dag_pvt {
 
 #define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt )
 
+static int s_chain_cs_dag_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg);
+static void s_chain_cs_dag_delete(dap_chain_t *a_chain);
 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);
 static dap_chain_cs_dag_event_item_t *s_dag_proc_treshold(dap_chain_cs_dag_t *a_dag);
@@ -147,7 +149,7 @@ static bool s_seed_mode = false, s_debug_more = false, s_threshold_enabled = fal
 int dap_chain_cs_dag_init()
 {
     srand((unsigned int) time(NULL));
-    dap_chain_cs_type_add( "dag", dap_chain_cs_dag_new );
+    dap_chain_cs_type_add( "dag", s_chain_cs_dag_new );
     s_seed_mode         = dap_config_get_item_bool_default(g_config, "general", "seed_mode",        false);
     s_debug_more        = dap_config_get_item_bool_default(g_config, "dag",     "debug_more",       false);
     s_threshold_enabled = dap_config_get_item_bool_default(g_config, "dag",     "threshold_enabled",false);
@@ -181,25 +183,22 @@ void dap_chain_cs_dag_deinit(void)
 
 }
 
-static void s_history_callback_round_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg)
+static void s_round_changes_notify(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg)
 {
     dap_chain_cs_dag_t *l_dag = (dap_chain_cs_dag_t *)a_arg;
     assert(l_dag);
     dap_chain_net_t *l_net = dap_chain_net_by_id(l_dag->chain->net_id);
     debug_if(s_debug_more, L_DEBUG, "%s.%s: op_code='%c' group=\"%s\" key=\"%s\" value_size=%zu",
         l_net->pub.name, l_dag->chain->name, a_obj->type, a_obj->group, a_obj->key, a_obj->value_len);
-    if (a_obj->type == DAP_DB$K_OPTYPE_ADD && l_dag->callback_cs_event_round_sync) {
-        if (!l_dag->broadcast_disable)
-            dap_chain_cs_dag_event_broadcast(l_dag, a_obj, a_context);
-        if (dap_strcmp(a_obj->key, DAG_ROUND_CURRENT_KEY)) {  // check key for round increment, if no than process event
+    if (a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD && l_dag->callback_cs_event_round_sync) {
+        if (dap_strcmp(a_obj->key, DAG_ROUND_CURRENT_KEY))  // check key for round increment, if no than process event
             l_dag->callback_cs_event_round_sync(l_dag, a_obj->type, a_obj->group, a_obj->key, a_obj->value, a_obj->value_len);
-        } else {
+        else
             log_it(L_INFO, "Global round ID: %lu", *(uint64_t*)a_obj->value);
-        }
     }
 }
 
-static bool s_dag_rounds_events_iter(dap_global_db_context_t *a_context,
+static bool s_dag_rounds_events_iter(dap_global_db_instance_t *a_dbi,
                                      int a_rc, const char *a_group,
                                      const size_t a_values_current, const size_t a_values_count,
                                      dap_store_obj_t *a_values, void *a_arg)
@@ -210,8 +209,8 @@ static bool s_dag_rounds_events_iter(dap_global_db_context_t *a_context,
 
     for (size_t i = 0; i < a_values_count; i++) {
         dap_store_obj_t *l_obj_cur = a_values + i;
-        l_obj_cur->type = DAP_DB$K_OPTYPE_ADD;
-        s_history_callback_round_notify(a_context, a_values + i, a_arg);
+        l_obj_cur->type = DAP_GLOBAL_DB_OPTYPE_ADD;
+        s_round_changes_notify(a_dbi, a_values + i, a_arg);
     }
     return true;
 }
@@ -222,11 +221,11 @@ static void s_timer_process_callback(void *a_arg)
 }
 
 /**
- * @brief dap_chain_cs_dag_new
+ * @brief s_chain_cs_dag_new
  * @param a_chain
  * @param a_chain_cfg
  */
-int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
+static int s_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 {
     dap_chain_cs_dag_t * l_dag = DAP_NEW_Z(dap_chain_cs_dag_t);
     if (!l_dag){
@@ -247,7 +246,7 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     pthread_mutex_init(&PVT(l_dag)->events_mutex, &l_mutex_attr);
     pthread_mutexattr_destroy(&l_mutex_attr);
 
-    a_chain->callback_delete = dap_chain_cs_dag_delete;
+    a_chain->callback_delete = s_chain_cs_dag_delete;
     a_chain->callback_purge = s_dap_chain_cs_dag_purge;
 
     // Atom element callbacks
@@ -323,7 +322,11 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id);
     l_dag->gdb_group_events_round_new = dap_strdup_printf(l_dag->is_celled ? "dag-%s-%s-%016llx-round.new" : "dag-%s-%s-round.new",
                                           l_net->pub.gdb_groups_prefix, a_chain->name, 0LLU);
-    dap_global_db_add_sync_extra_group(l_net->pub.name, l_dag->gdb_group_events_round_new, s_history_callback_round_notify, l_dag);
+    dap_global_db_cluster_t *l_dag_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(),
+                                                                       l_dag->gdb_group_events_round_new, l_dag->gdb_group_events_round_new,
+                                                                       900, true, s_round_changes_notify, l_dag,
+                                                                       DAP_GDB_MEMBER_ROLE_NOBODY, DAP_CLUSTER_ROLE_AUTONOMIC);
+    dap_chain_net_add_poa_certs_to_cluster(l_net, l_dag_cluster);
     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);
@@ -410,11 +413,11 @@ static void s_dap_chain_cs_dag_purge(dap_chain_t *a_chain)
 }
 
 /**
- * @brief dap_chain_cs_dag_delete
+ * @brief s_chain_cs_dag_delete
  * @param a_dag
  * @return
  */
-void dap_chain_cs_dag_delete(dap_chain_t * a_chain)
+static void s_chain_cs_dag_delete(dap_chain_t * a_chain)
 {
     s_dap_chain_cs_dag_purge(a_chain);
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG ( a_chain );
@@ -1532,7 +1535,7 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply)
                             dap_string_append_printf(l_str_ret_tmp, "Event %s not added in chain\n", l_objs[i].key);
                         } else {
                             // add event to delete
-                            l_list_to_del = dap_list_prepend(l_list_to_del, l_objs[i].key);
+                            l_list_to_del = dap_list_prepend(l_list_to_del, (void *)l_objs[i].key);
                             dap_string_append_printf(l_str_ret_tmp, "Event %s added in chain successfully\n",
                                     l_objs[i].key);
                         }
diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c
index c4c171d6fa..2150c23428 100644
--- a/modules/type/dag/dap_chain_cs_dag_event.c
+++ b/modules/type/dag/dap_chain_cs_dag_event.c
@@ -208,44 +208,6 @@ size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t
     return a_round_item_size+l_sign_size;
 }
 
-static void s_event_broadcast_from_context(dap_global_db_context_t *a_context, void *a_arg)
-{
-    dap_chain_cs_dag_event_round_broadcast_t *l_arg = a_arg;
-    dap_chain_net_t *l_net = dap_chain_net_by_id(l_arg->dag->chain->net_id);
-    dap_chain_net_sync_gdb_broadcast(a_context, l_arg->obj, l_net);
-    dap_store_obj_free_one(l_arg->obj);
-    DAP_DELETE(a_arg);
-}
-
-static bool s_event_broadcast_send(dap_chain_cs_dag_event_round_broadcast_t *a_arg)
-{
-    dap_chain_net_t *l_net = dap_chain_net_by_id(a_arg->dag->chain->net_id);
-    if (dap_chain_net_get_state(l_net) != NET_STATE_SYNC_GDB)
-        dap_global_db_context_exec(s_event_broadcast_from_context, a_arg);
-    else if (a_arg->attempts++ < 10)
-        return true;
-    return false;
-}
-
-void dap_chain_cs_dag_event_broadcast(dap_chain_cs_dag_t *a_dag, dap_store_obj_t *a_obj, dap_global_db_context_t *a_context)
-{
-    dap_chain_cs_dag_event_round_broadcast_t *l_arg = DAP_NEW(dap_chain_cs_dag_event_round_broadcast_t);
-    if (!l_arg) {
-        log_it(L_CRITICAL, "Memory allocation error");
-        return;
-    }
-    l_arg->dag = a_dag;
-    l_arg->obj = dap_store_obj_copy(a_obj, 1);
-    l_arg->context = a_context;
-    l_arg->attempts = 0;
-    if (!s_event_broadcast_send(l_arg))
-        return;
-    if (dap_timerfd_start(3 * 1000,
-                        (dap_timerfd_callback_t)s_event_broadcast_send,
-                        l_arg) == NULL)
-        log_it(L_ERROR, "Can't run timer for broadcast Event %s", a_obj->key);
-}
-
 /**
  * @brief dap_chain_cs_dag_event_gdb_set
  * @param a_dag
diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h
index 34f407772d..8e07f06824 100644
--- a/modules/type/dag/include/dap_chain_cs_dag.h
+++ b/modules/type/dag/include/dap_chain_cs_dag.h
@@ -61,7 +61,6 @@ typedef struct dap_chain_cs_dag
     dap_chain_cs_dag_hal_item_t *hal;
 
     atomic_uint_fast64_t round_current, round_completed;
-    bool broadcast_disable;
 
     uint16_t datum_add_hashes_count;
     char * gdb_group_events_round_new;
@@ -80,7 +79,5 @@ typedef struct dap_chain_cs_dag
 int dap_chain_cs_dag_init();
 void dap_chain_cs_dag_deinit(void);
 
-int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
-void dap_chain_cs_dag_delete(dap_chain_t * a_chain);
 void dap_chain_cs_dag_proc_event_round_new(dap_chain_cs_dag_t *a_dag);
 dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t * a_dag, dap_chain_hash_fast_t * a_hash);
diff --git a/modules/type/dag/include/dap_chain_cs_dag_event.h b/modules/type/dag/include/dap_chain_cs_dag_event.h
index 388508dccb..68c7f42988 100644
--- a/modules/type/dag/include/dap_chain_cs_dag_event.h
+++ b/modules/type/dag/include/dap_chain_cs_dag_event.h
@@ -60,13 +60,6 @@ typedef struct dap_chain_cs_dag_event_round_item {
     uint8_t event_n_signs[]; // event // dap_chain_cs_dag_event_t
 } DAP_ALIGN_PACKED dap_chain_cs_dag_event_round_item_t;
 
-typedef struct dap_chain_cs_dag_event_round_broadcast {
-    dap_chain_cs_dag_t *dag;
-    dap_store_obj_t *obj;
-    dap_global_db_context_t *context;
-    int attempts;
-} dap_chain_cs_dag_event_round_broadcast_t;
-
 dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, uint64_t a_round_id,
                                                      dap_chain_datum_t *a_datum, dap_enc_key_t *a_key,
                                                      dap_chain_hash_fast_t *a_hashes, size_t a_hashes_count, size_t *a_event_size);
@@ -90,10 +83,7 @@ static inline size_t dap_chain_cs_dag_event_get_datum_size_maximum(dap_chain_cs_
                 : 0;
 }
 
-// dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_sign_add( dap_chain_cs_dag_event_t * a_event, size_t a_event_size,
-//                                                 size_t * a_event_size_new,
-//                                                 dap_chain_net_t * a_net, dap_enc_key_t * a_key);
-size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, size_t a_event_size, dap_enc_key_t * a_key);
+size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, size_t a_event_size, dap_enc_key_t *a_key);
 size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t **a_round_item_ptr, size_t a_round_item_size,
                                              dap_enc_key_t *a_key);
 bool dap_chain_cs_dag_event_sign_exists(dap_chain_cs_dag_event_t *a_event, size_t a_event_size, dap_enc_key_t * a_key);
@@ -101,47 +91,45 @@ bool dap_chain_cs_dag_event_round_sign_exists(dap_chain_cs_dag_event_round_item_
 dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, uint16_t a_sign_number);
 
 /**
- * @brief dap_chain_cs_dag_event_calc_size
+ * @brief dap_chain_cs_dag_event_calc_size_excl_signs
  * @param a_event
  * @return
  */
-/**
-static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t * a_event)
+static inline size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t *a_event, size_t a_event_size)
 {
-    if(!a_event)
+    if (a_event_size < sizeof(a_event->header))
         return 0;
     size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t);
-    dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size);
-
-    size_t l_datum_size = dap_chain_datum_size(l_datum);
-    uint8_t * l_signs = a_event->hashes_n_datum_n_signs
-            +l_hashes_size+l_datum_size;
-    uint16_t l_signs_offset = 0;
-    uint16_t l_signs_passed;
-    for ( l_signs_passed=0;  l_signs_passed < a_event->header.signs_count; l_signs_passed++){
-        dap_sign_t * l_sign = (dap_sign_t *) l_signs+l_signs_offset;
-        l_signs_offset+=l_sign->header.sign_pkey_size+l_sign->header.sign_size+sizeof(l_sign->header);
-    }
-
-    return sizeof( a_event->header ) + l_hashes_size +l_signs_offset +l_datum_size;
+    if (a_event_size < l_hashes_size + sizeof(a_event->header))
+        return 0;
+    dap_chain_datum_t *l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size);
+    size_t l_ret = dap_chain_datum_size(l_datum) + l_hashes_size + sizeof(a_event->header);
+    if (a_event_size < l_ret)
+        return 0;
+    return l_ret;
 }
-**/
 
 /**
- * @brief dap_chain_cs_dag_event_calc_size_excl_signs
+ * @brief dap_chain_cs_dag_event_calc_size
  * @param a_event
  * @return
  */
-static inline ssize_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t * a_event,size_t a_event_size)
+static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t *a_event, size_t a_limit_size)
 {
-    if (a_event_size < sizeof(a_event->header))
-        return -1;
-    size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t);
-    if (l_hashes_size > a_event_size)
-        return -1;
-    dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size);
-    size_t l_datum_size = dap_chain_datum_size(l_datum);
-    return l_hashes_size + sizeof (a_event->header) + l_datum_size;
+    if (!a_event || !a_limit_size)
+        return 0;
+    size_t l_signs_offset = dap_chain_cs_dag_event_calc_size_excl_signs(a_event, a_limit_size);
+    if (!l_signs_offset)
+        return 0;
+    byte_t *l_signs = (byte_t *)a_event + l_signs_offset;
+    size_t l_signs_size = 0;
+    for (uint16_t l_signs_passed = 0; l_signs_passed < a_event->header.signs_count; l_signs_passed++) {
+        dap_sign_t *l_sign = (dap_sign_t *)(l_signs + l_signs_size);
+        l_signs_size += dap_sign_get_size(l_sign);
+        if (a_limit_size < l_signs_offset + l_signs_size)
+            return 0;
+    }
+    return l_signs_offset + l_signs_size;
 }
 
 /**
@@ -159,7 +147,7 @@ static inline size_t dap_chain_cs_dag_event_round_item_get_size(dap_chain_cs_dag
     return sizeof(dap_chain_cs_dag_event_round_item_t)+a_event_round_item->data_size;
 }
 
-void dap_chain_cs_dag_event_broadcast(dap_chain_cs_dag_t *a_dag, dap_store_obj_t *a_obj, dap_global_db_context_t *a_context);
+void dap_chain_cs_dag_event_broadcast(dap_chain_cs_dag_t *a_dag, dap_store_obj_t *a_obj, dap_global_db_instance_t *a_dbi);
 
 bool dap_chain_cs_dag_event_gdb_set(dap_chain_cs_dag_t *a_dag, char *a_event_hash_str, dap_chain_cs_dag_event_t *a_event,
                                     size_t a_event_size, dap_chain_cs_dag_event_round_item_t *a_round_item);
diff --git a/modules/consensus/none/CMakeLists.txt b/modules/type/none/CMakeLists.txt
similarity index 100%
rename from modules/consensus/none/CMakeLists.txt
rename to modules/type/none/CMakeLists.txt
diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/type/none/dap_chain_cs_none.c
similarity index 54%
rename from modules/consensus/none/dap_chain_cs_none.c
rename to modules/type/none/dap_chain_cs_none.c
index 6a8f04291b..f06e892f69 100644
--- a/modules/consensus/none/dap_chain_cs_none.c
+++ b/modules/type/none/dap_chain_cs_none.c
@@ -44,123 +44,92 @@
 
 #define CONSENSUS_NAME "none"
 
-typedef struct dap_chain_gdb_datum_hash_item{
+typedef struct dap_nonconsensus_datum_hash_item {
     char key[DAP_CHAIN_HASH_FAST_STR_SIZE];
     dap_chain_hash_fast_t datum_data_hash;
-    uint8_t padding[2];
-    struct dap_chain_gdb_datum_hash_item *prev, *next;
-} dap_chain_gdb_datum_hash_item_t;
+    struct dap_nonconsensus_datum_hash_item *prev, *next;
+} dap_nonconsensus_datum_hash_item_t;
 
-typedef struct dap_chain_gdb_private
-{
-    bool celled;
+typedef struct dap_nonconsensus_private {
     bool is_load_mode; // If load mode - not save when new atom adds
-    uint8_t padding[7];
     char *group_datums;
-
     dap_chain_t *chain;
-
     pthread_cond_t load_cond;
     pthread_mutex_t load_mutex;
-    dap_chain_gdb_datum_hash_item_t * hash_items;
-} dap_chain_gdb_private_t;
+    dap_nonconsensus_datum_hash_item_t * hash_items;
+} dap_nonconsensus_private_t;
 
-#define PVT(a) ( (a) ? (dap_chain_gdb_private_t* ) (a)->_internal : NULL)
+#define PVT(a) ((a) ? (dap_nonconsensus_private_t *)(a)->_internal : NULL)
 
 // Atomic element organization callbacks
-static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); //    Accept new event in gdb
-static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); //    Verify new event in gdb
-static size_t s_chain_callback_atom_get_static_hdr_size(void); //    Get gdb event header size
+static dap_chain_atom_verify_res_t s_nonconsensus_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); //    Accept new event in gdb
+static dap_chain_atom_verify_res_t s_nonconsensus_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); //    Verify new event in gdb
+static size_t s_nonconsensus_callback_atom_get_static_hdr_size(void); //    Get gdb event header size
 
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold);
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain,
+static dap_chain_atom_iter_t* s_nonconsensus_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold);
+static dap_chain_atom_iter_t* s_nonconsensus_callback_atom_iter_create_from(dap_chain_t * a_chain,
         dap_chain_atom_ptr_t a, size_t a_atom_size);
 
 // Delete iterator
-static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter); //    Get the fisrt event from gdb
+static void s_nonconsensus_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter); //    Get the fisrt event from gdb
 
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter,
+static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter,
         dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size);
 
 // Get event(s) from gdb
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); //    Get the fisrt event from gdb
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); //    Get the next event from gdb
-static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter,
+static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); //    Get the fisrt event from gdb
+static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); //    Get the next event from gdb
+static dap_chain_atom_ptr_t *s_nonconsensus_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter,
         size_t * a_links_size_ptr, size_t ** a_lasts_sizes_ptr); //    Get list of linked events
-static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter,
+static dap_chain_atom_ptr_t *s_nonconsensus_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter,
         size_t * a_lasts_size_ptr, size_t ** a_lasts_sizes_ptr); //    Get list of linked events
-static dap_chain_datum_t **s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count);
-static dap_time_t s_chain_callback_atom_get_timestamp(dap_chain_atom_ptr_t a_atom) { return ((dap_chain_datum_t *)a_atom)->header.ts_create; }
-static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums,
+static dap_chain_datum_t **s_nonconsensus_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count);
+static dap_time_t s_nonconsensus_callback_atom_get_timestamp(dap_chain_atom_ptr_t a_atom) { return ((dap_chain_datum_t *)a_atom)->header.ts_create; }
+static size_t s_nonconsensus_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums,
         size_t a_datums_size);
-static void s_chain_gdb_ledger_load(dap_chain_t *a_chain);
-
-/**
- * @brief stub for consensus
- *
- * @param a_chain chain object
- * @param a_chain_cfg chain config object
- * @return int
- */
-static int s_cs_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
-{
-    return dap_chain_gdb_new(a_chain, a_chain_cfg);
-}
+static void s_nonconsensus_ledger_load(dap_chain_t *a_chain);
 
+static int s_cs_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
+static void s_nonconsensus_delete(dap_chain_t *a_chain);
 
 /**
  * @brief dap_chain_cs_gdb_init
  * Initialize GDB chain items organization class
  * @return
  */
-int dap_chain_gdb_init(void)
+int dap_nonconsensus_init(void)
 {
-    dap_chain_cs_add(CONSENSUS_NAME, s_cs_callback_new);
-    dap_chain_cs_type_add(CONSENSUS_NAME, dap_chain_gdb_new);
-
+    dap_chain_cs_add(CONSENSUS_NAME, s_cs_callback_new); // It's a type and CS itself
     log_it(L_NOTICE, "Initialized GDB chain items organization class");
     return 0;
 }
 
 /**
- * @brief if current network in ONLINE state send to all connected node
- * executes, when you add data to gdb chain (class=gdb in chain config)
- * @param a_arg arguments. Can be network object (dap_chain_net_t)
- * @param a_op_code object type (f.e. l_net->type from dap_store_obj)
- * @param a_group group, for example "chain-gdb.home21-network.chain-F"
- * @param a_key key hex value, f.e. 0x12EFA084271BAA5EEE93B988E73444B76B4DF5F63DADA4B300B051E29C2F93
- * @param a_value buffer with data
- * @param a_value_len buffer size
- */
-static void s_history_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg)
-{
-    if (a_arg){
-        dap_chain_gdb_t * l_gdb = (dap_chain_gdb_t *) a_arg;
-        dap_chain_net_t *l_net = dap_chain_net_by_id( l_gdb->chain->net_id);
-        log_it(L_DEBUG,"%s.%s: op_code='%c' group=\"%s\" key=\"%s\" value_size=%zu",l_net->pub.name,
-               l_gdb->chain->name, a_obj->type, a_obj->group, a_obj->key, a_obj->value_len);
-        s_chain_callback_atom_add(l_gdb->chain, a_obj->value, a_obj->value_len);
-        dap_chain_net_sync_gdb_broadcast(a_context, a_obj, l_net);
-    }
-}
-
-/**
- * @brief set PVT(DAP_CHAIN_GDB(a_chain))->is_load_mode = true
+ * @brief set PVT(DAP_NONCONSENSUS(a_chain))->is_load_mode = true
  *
  * @param a_chain dap_chain_t object
  */
-static void s_dap_chain_gdb_callback_purge(dap_chain_t *a_chain)
+static void s_nonconsensus_callback_purge(dap_chain_t *a_chain)
 {
-    PVT(DAP_CHAIN_GDB(a_chain))->is_load_mode = true;
+    PVT(DAP_NONCONSENSUS(a_chain))->is_load_mode = true;
 }
 
 
-static void s_callback_memepool_notify(dap_global_db_context_t *a_context UNUSED_ARG, dap_store_obj_t *a_obj, void *a_arg)
+static void s_nonconsensus_callback_mempool_notify(dap_global_db_instance_t UNUSED_ARG *a_dbi, dap_store_obj_t *a_obj, void *a_arg)
 {
-    if (a_obj->type == DAP_DB$K_OPTYPE_ADD)
+    if (a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD)
         dap_chain_node_mempool_process_all(a_arg, false);
 }
 
+static void s_changes_callback_notify(dap_global_db_instance_t UNUSED_ARG *a_dbi, dap_store_obj_t *a_obj, void *a_arg)
+{
+    dap_return_if_fail(a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD && a_obj->value_len && a_obj->value);
+    dap_chain_t *l_chain = a_arg;
+    if (a_obj->type == DAP_GLOBAL_DB_OPTYPE_DEL)
+        return;
+    s_nonconsensus_callback_atom_add(l_chain, (dap_chain_datum_t *)a_obj->value, a_obj->value_len);
+}
+
 /**
  * @brief configure chain gdb
  * Set atom element callbacks
@@ -168,87 +137,83 @@ static void s_callback_memepool_notify(dap_global_db_context_t *a_context UNUSED
  * @param a_chain_cfg dap_config_t config object
  * @return int
  */
-int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
+static int s_cs_callback_new(dap_chain_t *a_chain, dap_config_t UNUSED_ARG *a_chain_cfg)
 {
-    dap_chain_gdb_t *l_gdb = DAP_NEW_Z(dap_chain_gdb_t);
-    if (!l_gdb) {
+    dap_nonconsensus_t *l_nochain = DAP_NEW_Z(dap_nonconsensus_t);
+    if (!l_nochain) {
         log_it(L_CRITICAL, "Memory allocation error");
         return -1;
     }
-    dap_chain_gdb_private_t *l_gdb_priv = DAP_NEW_Z(dap_chain_gdb_private_t);
-    if (!l_gdb_priv) {
+    dap_nonconsensus_private_t *l_nochain_priv = DAP_NEW_Z(dap_nonconsensus_private_t);
+    if (!l_nochain_priv) {
         log_it(L_CRITICAL, "Memory allocation error");
-        DAP_DELETE(l_gdb);
-        return -1;
+        DAP_DELETE(l_nochain);
+        return -2;
     }
-    l_gdb->chain = a_chain;
-    l_gdb->_internal = (void*) l_gdb_priv;
-    a_chain->_inheritor = l_gdb;
-
-    l_gdb_priv->celled = dap_config_get_item_bool_default(a_chain_cfg, CONSENSUS_NAME, "celled",false);
+    l_nochain->chain = a_chain;
+    l_nochain->_internal = (void*) l_nochain_priv;
+    a_chain->_inheritor = l_nochain;
 
     dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id);
-    l_gdb_priv->chain = a_chain;
-
-    if(!l_gdb_priv->celled){
-        l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X,l_net->pub.name,
-                                                  a_chain->id.uint64);
-    }else {
-        // here is not work because dap_chain_net_load() not yet fully performed
-        l_gdb_priv->group_datums = dap_strdup_printf("chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X".cell-%016"DAP_UINT64_FORMAT_X,
-                                                      l_net->pub.name, a_chain->id.uint64, a_chain->cells->id.uint64);
-    }
+    l_nochain_priv->chain = a_chain;
 
+    l_nochain_priv->group_datums = dap_chain_net_get_gdb_group_nochain_new(a_chain);
     // Add group prefix that will be tracking all changes
-    dap_global_db_add_sync_group(l_net->pub.name, "chain-gdb", s_history_callback_notify, l_gdb);
+    if (dap_global_db_cluster_add(dap_global_db_instance_get_default(), l_net->pub.name,
+                                  l_nochain_priv->group_datums, 0, true,
+                                  s_changes_callback_notify, a_chain,
+                                  DAP_GDB_MEMBER_ROLE_USER, DAP_CLUSTER_ROLE_EMBEDDED)) {
+        log_it(L_ERROR, "Can't create global DB cluster for synchronization");
+        return -3;
+    }
 
-    dap_chain_add_mempool_notify_callback(a_chain, s_callback_memepool_notify, a_chain);
+    dap_chain_add_mempool_notify_callback(a_chain, s_nonconsensus_callback_mempool_notify, a_chain);
 
-    pthread_cond_init(&l_gdb_priv->load_cond, NULL);
-    pthread_mutex_init(&l_gdb_priv->load_mutex, NULL);
+    pthread_cond_init(&l_nochain_priv->load_cond, NULL);
+    pthread_mutex_init(&l_nochain_priv->load_mutex, NULL);
 
-    a_chain->callback_delete = dap_chain_gdb_delete;
-    a_chain->callback_purge = s_dap_chain_gdb_callback_purge;
+    a_chain->callback_delete = s_nonconsensus_delete;
+    a_chain->callback_purge = s_nonconsensus_callback_purge;
 
     // Atom element callbacks
-    a_chain->callback_atom_add = s_chain_callback_atom_add; // Accept new element in chain
-    a_chain->callback_atom_verify = s_chain_callback_atom_verify; // Verify new element in chain
-    a_chain->callback_atom_get_hdr_static_size = s_chain_callback_atom_get_static_hdr_size; // Get dag event hdr size
+    a_chain->callback_atom_add = s_nonconsensus_callback_atom_add; // Accept new element in chain
+    a_chain->callback_atom_verify = s_nonconsensus_callback_atom_verify; // Verify new element in chain
+    a_chain->callback_atom_get_hdr_static_size = s_nonconsensus_callback_atom_get_static_hdr_size; // Get dag event hdr size
 
-    a_chain->callback_atom_iter_create = s_chain_callback_atom_iter_create;
-    a_chain->callback_atom_iter_create_from = s_chain_callback_atom_iter_create_from;
-    a_chain->callback_atom_iter_delete = s_chain_callback_atom_iter_delete;
+    a_chain->callback_atom_iter_create = s_nonconsensus_callback_atom_iter_create;
+    a_chain->callback_atom_iter_create_from = s_nonconsensus_callback_atom_iter_create_from;
+    a_chain->callback_atom_iter_delete = s_nonconsensus_callback_atom_iter_delete;
 
-    a_chain->callback_atom_find_by_hash = s_chain_callback_atom_iter_find_by_hash;
-    a_chain->callback_add_datums = s_chain_callback_datums_pool_proc;
+    a_chain->callback_atom_find_by_hash = s_nonconsensus_callback_atom_iter_find_by_hash;
+    a_chain->callback_add_datums = s_nonconsensus_callback_datums_pool_proc;
 
     // Linear pass through
-    a_chain->callback_atom_iter_get_first = s_chain_callback_atom_iter_get_first; // Get the fisrt element from chain
-    a_chain->callback_atom_iter_get_next = s_chain_callback_atom_iter_get_next; // Get the next element from chain from the current one
+    a_chain->callback_atom_iter_get_first = s_nonconsensus_callback_atom_iter_get_first; // Get the fisrt element from chain
+    a_chain->callback_atom_iter_get_next = s_nonconsensus_callback_atom_iter_get_next; // Get the next element from chain from the current one
 
-    a_chain->callback_atom_iter_get_links = s_chain_callback_atom_iter_get_links; // Get the next element from chain from the current one
-    a_chain->callback_atom_iter_get_lasts = s_chain_callback_atom_iter_get_lasts;
-    a_chain->callback_atom_get_datums = s_chain_callback_atom_get_datum;
-    a_chain->callback_atom_get_timestamp = s_chain_callback_atom_get_timestamp;
+    a_chain->callback_atom_iter_get_links = s_nonconsensus_callback_atom_iter_get_links; // Get the next element from chain from the current one
+    a_chain->callback_atom_iter_get_lasts = s_nonconsensus_callback_atom_iter_get_lasts;
+    a_chain->callback_atom_get_datums = s_nonconsensus_callback_atom_get_datum;
+    a_chain->callback_atom_get_timestamp = s_nonconsensus_callback_atom_get_timestamp;
 
-    a_chain->callback_load_from_gdb = s_chain_gdb_ledger_load;
+    a_chain->callback_load_from_gdb = s_nonconsensus_ledger_load;
 
     return 0;
 }
 
 /**
- * @brief clear dap_chain_gdb_t object
+ * @brief clear dap_nonconsensus_t object
  *
  * @param a_chain dap_chain_t chain object
  */
-void dap_chain_gdb_delete(dap_chain_t * a_chain)
+static void s_nonconsensus_delete(dap_chain_t *a_chain)
 {
-    dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain);
-    dap_chain_gdb_private_t *l_gdb_priv = PVT(l_gdb);
+    dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(a_chain);
+    dap_nonconsensus_private_t *l_nochain_priv = PVT(l_nochain);
 
-    DAP_DELETE(l_gdb_priv->group_datums);
+    DAP_DELETE(l_nochain_priv->group_datums);
 
-    DAP_DELETE(l_gdb);
+    DAP_DELETE(l_nochain);
     if (a_chain)
         a_chain->_inheritor = NULL;
 }
@@ -259,13 +224,13 @@ void dap_chain_gdb_delete(dap_chain_t * a_chain)
  * @param a_chain dap_chain_t * chain object
  * @return const char*
  */
-const char* dap_chain_gdb_get_group(dap_chain_t * a_chain)
+const char* dap_nonconsensus_get_group(dap_chain_t * a_chain)
 {
     if(!a_chain)
         return NULL;
-    dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain);
-    dap_chain_gdb_private_t *l_gdb_priv = PVT(l_gdb);
-    return l_gdb_priv->group_datums;
+    dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(a_chain);
+    dap_nonconsensus_private_t *l_nochain_priv = PVT(l_nochain);
+    return l_nochain_priv->group_datums;
 }
 
 
@@ -299,7 +264,7 @@ const char* dap_chain_gdb_get_group(dap_chain_t * a_chain)
  * @param a_values
  * @param a_arg
  */
-static bool s_ledger_load_callback(UNUSED_ARG dap_global_db_context_t *a_global_db_context,
+static bool s_ledger_load_callback(UNUSED_ARG dap_global_db_instance_t *a_dbi,
                                    UNUSED_ARG int a_rc, UNUSED_ARG const char *a_group,
                                    UNUSED_ARG const size_t a_values_total, const size_t a_values_count,
                                    dap_global_db_obj_t *a_values, void *a_arg)
@@ -307,21 +272,21 @@ static bool s_ledger_load_callback(UNUSED_ARG dap_global_db_context_t *a_global_
     assert(a_arg);
     dap_chain_t * l_chain = (dap_chain_t *) a_arg;
     assert(l_chain);
-    dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(l_chain);
-    assert(l_gdb);
-    dap_chain_gdb_private_t * l_gdb_pvt = PVT(l_gdb);
-    assert(l_gdb_pvt);
+    dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(l_chain);
+    assert(l_nochain);
+    dap_nonconsensus_private_t * l_nochain_pvt = PVT(l_nochain);
+    assert(l_nochain_pvt);
     // make list of datums
     for(size_t i = 0; i < a_values_count; i++) {
         dap_global_db_obj_t *it = a_values + i;
-        s_chain_callback_atom_add(l_chain, it->value, it->value_len);
-        log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", it->key, l_gdb_pvt->group_datums);
+        s_nonconsensus_callback_atom_add(l_chain, it->value, it->value_len);
+        log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", it->key, l_nochain_pvt->group_datums);
     }
 
-    pthread_mutex_lock(&l_gdb_pvt->load_mutex);
-    l_gdb_pvt->is_load_mode = false;
-    pthread_cond_broadcast(&l_gdb_pvt->load_cond);
-    pthread_mutex_unlock(&l_gdb_pvt->load_mutex);
+    pthread_mutex_lock(&l_nochain_pvt->load_mutex);
+    l_nochain_pvt->is_load_mode = false;
+    pthread_cond_broadcast(&l_nochain_pvt->load_cond);
+    pthread_mutex_unlock(&l_nochain_pvt->load_mutex);
     return true;
 }
 
@@ -332,29 +297,29 @@ static bool s_ledger_load_callback(UNUSED_ARG dap_global_db_context_t *a_global_
  * @param a_chain chain dap_chain_t object
  * @return int return 0 if OK otherwise  negative error code
  */
-static void s_chain_gdb_ledger_load(dap_chain_t *a_chain)
+static void s_nonconsensus_ledger_load(dap_chain_t *a_chain)
 {
-    dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain);
-    dap_chain_gdb_private_t * l_gdb_pvt = PVT(l_gdb);
+    dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(a_chain);
+    dap_nonconsensus_private_t * l_nochain_pvt = PVT(l_nochain);
     // load ledger
-    l_gdb_pvt->is_load_mode = true;
+    l_nochain_pvt->is_load_mode = true;
     //  Read the entire database into an array of size bytes
-    pthread_mutex_lock(&l_gdb_pvt->load_mutex);
-    dap_global_db_get_all(l_gdb_pvt->group_datums, 0, s_ledger_load_callback, a_chain);
-    while (l_gdb_pvt->is_load_mode)
-        pthread_cond_wait(&l_gdb_pvt->load_cond, &l_gdb_pvt->load_mutex);
-    pthread_mutex_unlock(&l_gdb_pvt->load_mutex);
+    pthread_mutex_lock(&l_nochain_pvt->load_mutex);
+    dap_global_db_get_all(l_nochain_pvt->group_datums, 0, s_ledger_load_callback, a_chain);
+    while (l_nochain_pvt->is_load_mode)
+        pthread_cond_wait(&l_nochain_pvt->load_cond, &l_nochain_pvt->load_mutex);
+    pthread_mutex_unlock(&l_nochain_pvt->load_mutex);
 }
 
 /**
- * @brief call s_chain_callback_atom_add for every dap_chain_datum_t objects in a_datums array
+ * @brief call s_nonconsensus_callback_atom_add for every dap_chain_datum_t objects in a_datums array
  *
  * @param a_chain dap_chain_t chain object (f.e. plasma)
  * @param a_datums dap_chain_datum array with dap_chain_datum objects
  * @param a_datums_count object counts in datums array
  * @return size_t
  */
-static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_count)
+static size_t s_nonconsensus_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_count)
 {
     for(size_t i = 0; i < a_datums_count; i++) {
         dap_chain_datum_t *l_datum = a_datums[i];
@@ -367,7 +332,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
             log_it(L_ERROR, "Verified datum %s not passed the check, code %d", l_db_key, l_rc);
             return i;
         }
-        dap_global_db_set(PVT(DAP_CHAIN_GDB(a_chain))->group_datums, l_db_key, l_datum,
+        dap_global_db_set(PVT(DAP_NONCONSENSUS(a_chain))->group_datums, l_db_key, l_datum,
                           dap_chain_datum_size(l_datum), false, NULL, NULL);
     }
     return a_datums_count;
@@ -381,21 +346,21 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
  * @param a_atom_size atom size
  * @return dap_chain_atom_verify_res_t
  */
-static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
+static dap_chain_atom_verify_res_t s_nonconsensus_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
 {
     if (NULL == a_chain) {
-        log_it(L_WARNING, "Arguments is NULL for s_chain_callback_atom_add");
+        log_it(L_WARNING, "Arguments is NULL for s_nonconsensus_callback_atom_add");
         return ATOM_REJECT;
     }
-    dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain);
-    dap_chain_gdb_private_t *l_gdb_priv = PVT(l_gdb);
+    dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(a_chain);
+    dap_nonconsensus_private_t *l_nochain_priv = PVT(l_nochain);
     dap_chain_datum_t *l_datum = (dap_chain_datum_t*) a_atom;
     dap_hash_fast_t l_datum_hash;
     dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_datum_hash);
     if(dap_chain_datum_add(a_chain, l_datum, a_atom_size, &l_datum_hash))
         return ATOM_REJECT;
 
-    dap_chain_gdb_datum_hash_item_t * l_hash_item = DAP_NEW_Z(dap_chain_gdb_datum_hash_item_t);
+    dap_nonconsensus_datum_hash_item_t * l_hash_item = DAP_NEW_Z(dap_nonconsensus_datum_hash_item_t);
     if (!l_hash_item) {
         log_it(L_CRITICAL, "Memory allocation error");
         return ATOM_REJECT;
@@ -403,8 +368,8 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
     size_t l_datum_size = dap_chain_datum_size(l_datum);
     dap_hash_fast(l_datum->data,l_datum->header.data_size,&l_hash_item->datum_data_hash );
     dap_chain_hash_fast_to_str(&l_hash_item->datum_data_hash, l_hash_item->key, sizeof(l_hash_item->key));
-    DL_APPEND(l_gdb_priv->hash_items, l_hash_item);
-    if (!l_gdb_priv->is_load_mode && a_chain->atom_notifiers) {
+    DL_APPEND(l_nochain_priv->hash_items, l_hash_item);
+    if (!l_nochain_priv->is_load_mode && a_chain->atom_notifiers) {
         dap_list_t *l_iter;
         DL_FOREACH(a_chain->atom_notifiers, l_iter) {
             dap_chain_atom_notifier_t *l_notifier = (dap_chain_atom_notifier_t*)l_iter->data;
@@ -423,7 +388,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
  * @param a_atom_size size of atom
  * @return dap_chain_atom_verify_res_t
  */
-static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
+static dap_chain_atom_verify_res_t s_nonconsensus_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
 {
     (void) a_chain;
     (void) a_atom;
@@ -437,7 +402,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_
  *
  * @return size_t
  */
-static size_t s_chain_callback_atom_get_static_hdr_size()
+static size_t s_nonconsensus_callback_atom_get_static_hdr_size()
 {
     static dap_chain_datum_t *l_datum_null=NULL;
     return sizeof(l_datum_null->header);
@@ -450,7 +415,7 @@ static size_t s_chain_callback_atom_get_static_hdr_size()
  * @param a_chain dap_chain_t a_chain
  * @return dap_chain_atom_iter_t*
  */
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold)
+static dap_chain_atom_iter_t* s_nonconsensus_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold)
 {
     dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t);
     if (!l_iter) {
@@ -471,7 +436,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_
  * @param a_atom_size size of atom
  * @return dap_chain_atom_iter_t*
  */
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain,
+static dap_chain_atom_iter_t* s_nonconsensus_callback_atom_iter_create_from(dap_chain_t * a_chain,
         dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
 {
     dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t);
@@ -492,7 +457,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t
  * execute DAP_DELETE(a_atom_iter)
  * @param a_atom_iter dap_chain_atom_iter_t object
  */
-static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter)
+static void s_nonconsensus_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter)
 {
     DAP_DEL_Z(a_atom_iter->cur_item);
     DAP_DEL_Z(a_atom_iter->cur_hash);
@@ -508,16 +473,16 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite
  * @param a_atom_size size of atom object
  * @return dap_chain_atom_ptr_t
  */
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter,
+static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter,
         dap_chain_hash_fast_t * a_atom_hash, size_t *a_atom_size)
 {
     char l_key[DAP_CHAIN_HASH_FAST_STR_SIZE];
     dap_chain_hash_fast_to_str(a_atom_hash, l_key, sizeof(l_key));
     size_t l_ret_size;
     dap_chain_atom_ptr_t l_ret = NULL;
-    dap_chain_gdb_t *l_gdb = DAP_CHAIN_GDB(a_atom_iter->chain);
-    if (l_gdb) {
-        l_ret = dap_global_db_get_sync(PVT(l_gdb)->group_datums, l_key, &l_ret_size, NULL, NULL);
+    dap_nonconsensus_t *l_nochain = DAP_NONCONSENSUS(a_atom_iter->chain);
+    if (l_nochain) {
+        l_ret = dap_global_db_get_sync(PVT(l_nochain)->group_datums, l_key, &l_ret_size, NULL, NULL);
         *a_atom_size = l_ret_size;
     }
     return l_ret;
@@ -530,7 +495,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at
  * @param a_atom_size a_atom_size atom size
  * @return dap_chain_atom_ptr_t
  */
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t *a_atom_size)
+static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t *a_atom_size)
 {
     if (!a_atom_iter)
         return NULL;
@@ -539,11 +504,11 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
         DAP_DEL_Z(a_atom_iter->cur_hash);
     }
     dap_chain_datum_t * l_datum = NULL;
-    dap_chain_gdb_datum_hash_item_t *l_item = PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->hash_items;
+    dap_nonconsensus_datum_hash_item_t *l_item = PVT(DAP_NONCONSENSUS(a_atom_iter->chain))->hash_items;
     a_atom_iter->cur_item = l_item;
     if (a_atom_iter->cur_item) {
         size_t l_datum_size = 0;
-        l_datum = (dap_chain_datum_t*)dap_global_db_get_sync(PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums,
+        l_datum = (dap_chain_datum_t*)dap_global_db_get_sync(PVT(DAP_NONCONSENSUS(a_atom_iter->chain))->group_datums,
                                                              l_item->key, &l_datum_size, NULL, NULL);
         DAP_DEL_Z(a_atom_iter->cur);
         a_atom_iter->cur = l_datum;
@@ -568,16 +533,16 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
  * @param a_atom_size size_t a_atom_size
  * @return dap_chain_atom_ptr_t
  */
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t *a_atom_iter, size_t *a_atom_size)
+static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_get_next(dap_chain_atom_iter_t *a_atom_iter, size_t *a_atom_size)
 {
     dap_chain_datum_t * l_datum = NULL;
-    dap_chain_gdb_datum_hash_item_t *l_item = (dap_chain_gdb_datum_hash_item_t*)a_atom_iter->cur_item;
+    dap_nonconsensus_datum_hash_item_t *l_item = (dap_nonconsensus_datum_hash_item_t*)a_atom_iter->cur_item;
     if (l_item)
         l_item = l_item->next;
     a_atom_iter->cur_item = l_item;
     if (a_atom_iter->cur_item ){
         size_t l_datum_size =0;
-        l_datum = (dap_chain_datum_t *)dap_global_db_get_sync(PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums, l_item->key, &l_datum_size, NULL, NULL);
+        l_datum = (dap_chain_datum_t *)dap_global_db_get_sync(PVT(DAP_NONCONSENSUS(a_atom_iter->chain))->group_datums, l_item->key, &l_datum_size, NULL, NULL);
         if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it
             DAP_DELETE(a_atom_iter->cur);
         a_atom_iter->cur = l_datum;
@@ -603,7 +568,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_i
  * @param a_links_sizes_ptr
  * @return dap_chain_atom_ptr_t*
  */
-static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter,
+static dap_chain_atom_ptr_t* s_nonconsensus_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter,
         size_t * a_links_size_ptr, size_t **a_links_sizes_ptr)
 {
     (void) a_atom_iter;
@@ -620,7 +585,7 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom
  * @param a_links_sizes_ptr
  * @return dap_chain_atom_ptr_t*
  */
-static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter,
+static dap_chain_atom_ptr_t* s_nonconsensus_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter,
         size_t * a_lasts_size_ptr,  size_t **a_links_sizes_ptr)
 {
     (void) a_atom_iter;
@@ -637,7 +602,7 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts(dap_chain_atom
  * @param a_datums_count count of datums
  * @return dap_chain_datum_t**
  */
-static dap_chain_datum_t **s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count)
+static dap_chain_datum_t **s_nonconsensus_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count)
 {
     UNUSED(a_atom_size);
     if (a_atom){
diff --git a/modules/consensus/none/include/dap_chain_cs_none.h b/modules/type/none/include/dap_chain_cs_none.h
similarity index 76%
rename from modules/consensus/none/include/dap_chain_cs_none.h
rename to modules/type/none/include/dap_chain_cs_none.h
index a74d629674..885509be82 100644
--- a/modules/consensus/none/include/dap_chain_cs_none.h
+++ b/modules/type/none/include/dap_chain_cs_none.h
@@ -26,16 +26,13 @@
 
 #include "dap_chain.h"
 
-typedef struct dap_chain_gdb {
-
+typedef struct dap_nonconsensus {
     dap_chain_t *chain;
     void * _internal; // private data
     void * _inheritor; // inheritor object
+} dap_nonconsensus_t;
 
-} dap_chain_gdb_t;
-#define DAP_CHAIN_GDB(a) ( (a) ? (dap_chain_gdb_t *) (a)->_inheritor : NULL)
+#define DAP_NONCONSENSUS(a) ((a) ? (dap_nonconsensus_t *)(a)->_inheritor : NULL)
 
-int dap_chain_gdb_init(void);
-int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
-void dap_chain_gdb_delete(dap_chain_t * a_chain);
-const char* dap_chain_gdb_get_group(dap_chain_t * a_chain);
+int dap_nonconsensus_init(void);
+const char* dap_nonconsensus_get_group(dap_chain_t * a_chain);
diff --git a/modules/wallet/CMakeLists.txt b/modules/wallet/CMakeLists.txt
index b6219a6e24..4bcf36d090 100644
--- a/modules/wallet/CMakeLists.txt
+++ b/modules/wallet/CMakeLists.txt
@@ -7,6 +7,10 @@ file(GLOB DAP_CHAIN_WALLET_HEADERS include/*.h)
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_WALLET_SRCS} ${DAP_CHAIN_WALLET_HEADERS})
 
 target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_net crc32c_adler)
-
+if (CELLFRAME_SDK_STANDALONE_BUILD)
+    target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../dap-sdk/3rdparty/crc32c_adler)
+else()
+    target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../dap-sdk/3rdparty/crc32c_adler)
+endif()
 target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c
index 2d0b3a7cc3..9681248852 100644
--- a/modules/wallet/dap_chain_wallet.c
+++ b/modules/wallet/dap_chain_wallet.c
@@ -69,8 +69,6 @@ static char s_wallet_ext [] = ".dwallet";
 static  pthread_rwlock_t s_wallet_n_pass_lock = PTHREAD_RWLOCK_INITIALIZER; /* Coordinate access to the hash-table */
 static  dap_chain_wallet_n_pass_t   *s_wallet_n_pass;                       /* A hash table to keep passwords for wallets */
 
-#define     CRC32C_INIT    0xEDB88320
-
 /*
  *  DESCRIPTION: Add/update a record for wallet into the internaly used table of name/password pair.
  *      Thhose records are supposed to be used for operations with the password-protected wallets.
-- 
GitLab