diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000000000000000000000000000000000..222a8235d19134c1075d8499b214c9c45d841122
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,69 @@
+[submodule "libdap-chain-net"]
+	path = libdap-chain-net
+	url = https://gitlab.demlabs.net/cellframe/libdap-chain-net.git
+[submodule "libdap"]
+	path = libdap
+	url = https://gitlab.demlabs.net/cellframe/libdap.git
+[submodule "libdap-crypto"]
+	path = libdap-crypto
+	url = https://gitlab.demlabs.net/cellframe/libdap-crypto.git
+[submodule "libdap-client"]
+	path = libdap-client
+	url = https://gitlab.demlabs.net/cellframe/libdap-client.git
+[submodule "libdap-stream-ch-chain"]
+	path = libdap-stream-ch-chain
+	url = https://gitlab.demlabs.net/cellframe/libdap-stream-ch-chain.git
+[submodule "libdap-chain-gdb"]
+	path = libdap-chain-gdb
+	url = https://gitlab.demlabs.net/cellframe/libdap-chain-gdb.git
+[submodule "libdap-stream-ch-chain-net"]
+	path = libdap-stream-ch-chain-net
+	url = https://gitlab.demlabs.net/cellframe/libdap-stream-ch-chain-net.git
+[submodule "libdap-chain"]
+	path = libdap-chain
+	url = https://gitlab.demlabs.net/cellframe/libdap-chain.git
+[submodule "libdap-chain-crypto"]
+	path = libdap-chain-crypto
+	url = https://gitlab.demlabs.net/cellframe/libdap-chain-crypto.git
+[submodule "libdap-chain-wallet"]
+	path = libdap-chain-wallet
+	url = https://gitlab.demlabs.net/cellframe/libdap-chain-wallet.git
+[submodule "libdap-chain-net-srv"]
+	path = libdap-chain-net-srv
+	url = https://gitlab.demlabs.net/cellframe/libdap-chain-net-srv.git
+[submodule "libdap-chain-net-srv-vpn"]
+	path = libdap-chain-net-srv-vpn
+	url = https://gitlab.demlabs.net/cellframe/libdap-chain-net-srv-vpn.git
+[submodule "libdap-chain-mempool"]
+	path = libdap-chain-mempool
+	url = https://gitlab.demlabs.net/cellframe/libdap-chain-mempool.git
+[submodule "libdap-chain-global-db"]
+	path = libdap-chain-global-db
+	url = https://gitlab.demlabs.net/cellframe/libdap-chain-global-db.git
+[submodule "libdap-server"]
+	path = libdap-server
+	url = https://gitlab.demlabs.net/cellframe/libdap-server.git
+[submodule "libdap-server-core"]
+	path = libdap-server-core
+	url = https://gitlab.demlabs.net/cellframe/libdap-server-core.git
+[submodule "libdap-stream"]
+	path = libdap-stream
+	url = https://gitlab.demlabs.net/cellframe/libdap-stream.git
+[submodule "libdap-stream-ch"]
+	path = libdap-stream-ch
+	url = https://gitlab.demlabs.net/cellframe/libdap-stream-ch.git
+[submodule "libdap-server-udp"]
+	path = libdap-server-udp
+	url = https://gitlab.demlabs.net/cellframe/libdap-server-udp.git
+[submodule "libdap-chain-python"]
+	path = libdap-chain-python
+	url = https://gitlab.demlabs.net/cellframe/libdap-chain-python.git
+[submodule "libdap-crypto-python"]
+	path = libdap-crypto-python
+	url = https://gitlab.demlabs.net/cellframe/libdap-crypto-python.git
+[submodule "libdap-python"]
+	path = libdap-python
+	url = https://gitlab.demlabs.net/cellframe/libdap-python.git
+[submodule "libdap-client-python"]
+	path = libdap-client-python
+	url = https://gitlab.demlabs.net/cellframe/libdap-client-python.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..346efd1f086f6b9ff6c454e6af1af5a8b105b9d7
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,224 @@
+project(dap_chain_net_python_module C)
+cmake_minimum_required(VERSION 2.8)
+
+set(CMAKE_VERBOSE_MAKEFILE ON)
+set(CMAKE_COLOR_MAKEFILE   ON)
+set(CMAKE_C_STANDARD 11)
+add_definitions("-fpic")
+add_definitions ("-DNODE_NETNAME=\"cellframe\"")
+
+if(UNIX)
+    add_definitions("-DDAP_OS_UNIX")
+endif()
+
+if(NOT (${SUBMODULES_NO_BUILD} MATCHES ON))
+    set (SUBMODULES_NO_BUILD ON)
+    if (NOT (TARGET dap_core))
+        add_subdirectory(libdap)
+        target_compile_options(
+            dap_core PRIVATE
+            "-fpic"
+        )
+    endif()
+    if (NOT (TARGET dap_crypto))
+        add_subdirectory(libdap-crypto)
+        target_compile_options(
+            dap_crypto PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_chain))
+       add_subdirectory(libdap-chain)
+       target_compile_options(
+            dap_chain PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_chain_crypto))
+       add_subdirectory(libdap-chain-crypto)
+       target_compile_options(
+            dap_chain_crypto PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_chain_mempool))
+       add_subdirectory(libdap-chain-mempool)
+       target_compile_options(
+            dap_chain_mempool PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_chain_net))
+       add_subdirectory(libdap-chain-net)
+       target_compile_options(
+            dap_chain_net PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_server_core))
+       add_subdirectory(libdap-server-core)
+       target_compile_options(
+            dap_server_core PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_chain_global_db))
+       add_subdirectory(libdap-chain-global-db)
+       target_compile_options(
+            dap_chain_global_db PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_client))
+       add_subdirectory(libdap-client)
+       target_compile_options(
+            dap_client PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET libdap-server))
+       add_subdirectory(libdap-server)
+#       target_compile_options(
+#            libdap-server PRIVATE
+#            "-fpic"
+#       )
+   endif()
+   if (NOT (TARGET dap_stream))
+       add_subdirectory(libdap-stream)
+       target_compile_options(
+            dap_stream PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_stream_ch))
+       add_subdirectory(libdap-stream-ch)
+       target_compile_options(
+            dap_stream_ch PRIVATE
+             "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_stream_ch_chain))
+       add_subdirectory(libdap-stream-ch-chain)
+       target_compile_options(
+            dap_stream_ch_chain PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_stream_ch_chain_net))
+       add_subdirectory(libdap-stream-ch-chain-net)
+       target_compile_options(
+            dap_stream_ch_chain_net PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_udp_server))
+       add_subdirectory(libdap-server-udp)
+       target_compile_options(
+            dap_udp_server PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_chain_net_srv))
+       add_subdirectory(libdap-chain-net-srv)
+       target_compile_options(
+            dap_chain_net_srv PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_chain_wallet))
+       add_subdirectory(libdap-chain-wallet)
+       target_compile_options(
+            dap_chain_wallet PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_chain_gdb))
+       add_subdirectory(libdap-chain-gdb)
+       target_compile_options(
+            dap_chain_gdb PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_python_module))
+       add_subdirectory(libdap-python)
+       target_compile_options(
+            dap_python_module PRIVATE
+            "-fpic"
+       )
+   endif()
+   if (NOT (TARGET dap_crypto_python_module))
+       add_subdirectory(libdap-crypto-python)
+       target_compile_options(
+            dap_crypto_python_module PRIVATE
+            "-fpic"
+       )
+   endif()
+    if (NOT (TARGET dap_chain_net_srv_vpn))
+        add_subdirectory(libdap-chain-net-srv-vpn)
+        target_compile_options(
+             dap_chain_net_srv_vpn PRIVATE
+             "-fpic"
+        )
+    endif()
+    if (NOT (TARGET dap_chain_python_module))
+        add_subdirectory(libdap-chain-python)
+        target_compile_options(
+            dap_chain_python_module PRIVATE
+            "-fpic"
+        )
+    endif()
+    if (NOT (TARGET dap_client_python_module))
+        add_subdirectory(libdap-client-python)
+        target_compile_options(
+            dap_client_python_module PRIVATE
+            "-fpic"
+            )
+    endif()
+endif()
+#add_definitions("-DDAP_APP_NAME=\"TestPRJ\" -DSYSTEM_CONFIGS_DIR=\"${CMAKE_CURRENT_BINARY_DIR}\"")
+
+file(GLOB CHAIN_NET_PYTHON_SRCS src/*.c)
+file(GLOB CHAIN_NET_PYTHON_HEADERS include/*.h)
+
+set(Python_ADDITIONAL_VERSIONS 3.7)
+find_package (PythonLibs REQUIRED)
+include_directories(${PYTHON_INCLUDE_DIR} include/)
+
+add_library(${PROJECT_NAME} STATIC ${CHAIN_NET_PYTHON_SRCS} ${CHAIN_NET_PYTHON_HEADERS})
+
+target_link_libraries(${PROJECT_NAME})
+
+#target_compile_options(
+#    dap_core PRIVATE 
+#    "-fpic"
+#)
+#target_compile_options(
+#    dap_crypto PRIVATE 
+#    "-fpic"
+#)
+
+
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_crypto dap_server_core dap_chain_net dap_chain_python_module dap_client_python_module)
+#target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_global_db dap_chain_crypto dap_chain_mempool
+#                         
+#                     ) #dap_chain_crypto dap_chain_mempool dap_chain_global_db )
+#target_link_libraries(${PROJECT_NAME} dap_core dap_crypto)
+
+target_include_directories(${PROJECT_NAME} PUBLIC include/ )
+
+#if(BUILD_DAP_CRYPTO_PYTHON_TESTS)
+#    add_subdirectory(test)
+#    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test/test_b58.py 
+#                    DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/test/)
+#    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test/test_b64.py
+#                    DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/test/)
+#    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test/test_iaes256_cbc.py
+#                    DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/test/)
+#    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test/test_iaes256_cbc.py
+#                    DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/test/)
+#    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test/test_oaes.py
+#                    DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/test/)
+
+
+#endif()
+
diff --git a/include/libdap_chain_net_python.h b/include/libdap_chain_net_python.h
new file mode 100644
index 0000000000000000000000000000000000000000..d74e8eb65bb78535b4463f74b00a4acf978137b9
--- /dev/null
+++ b/include/libdap_chain_net_python.h
@@ -0,0 +1,123 @@
+#ifndef _WRAPPING_DAP_NET_PYTHON_
+#define _WRAPPING_DAP_NET_PYTHON_
+
+#define PY_SSIZE_T_CLEAN
+#include "Python.h"
+#include "dap_chain_net.h"
+#include "wrapping_dap_chain_net_state.h"
+//#include "wrapping_dap_chain_net_state.h"
+#include "wrapping_dap_chain_common_objects.h"
+#include "wrapping_dap_chain_ledger.h"
+#include "libdap-chain-python.h"
+#include "libdap_chain_type_python.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct PyDapChainNet{
+    PyObject_HEAD
+    dap_chain_net_t *chain_net;
+}PyDapChainNetObject;
+
+int dap_chain_net_init_py(void);
+void dap_chain_net_deinit_py(void);
+
+PyObject *dap_chain_net_load_all_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_state_go_to_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_start_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_stop_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_links_establish_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_sync_chains_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_sync_gdb_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_sync_all_py(PyObject *self, PyObject *args);
+
+PyObject *dap_chain_net_proc_datapool_py(PyObject *self, PyObject *args);
+
+PyObject *dap_chain_net_by_name_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_by_id_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_id_by_name_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_ledger_by_net_name_py(PyObject *self, PyObject *args);
+
+PyObject *dap_chain_net_get_chain_by_name_py(PyObject *self, PyObject *args);
+
+PyObject *dap_chain_net_get_cur_addr_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_get_cur_cell_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_get_cur_addr_int_py(PyObject *self, PyObject *args);
+
+PyObject *dap_chain_net_get_gdb_group_mempool_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_get_gdb_group_mempool_by_chain_type_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_links_connect_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_net_get_chain_by_chain_type_py(PyObject *self, PyObject *args);
+
+static PyMethodDef DapChainNetMethods[] = {
+    {"loadAll", dap_chain_net_load_all_py, METH_NOARGS | METH_STATIC, ""},
+    {"stateGoTo", dap_chain_net_state_go_to_py, METH_VARARGS, ""},
+    {"start", dap_chain_net_start_py, METH_VARARGS, ""},
+    {"stop", dap_chain_net_stop_py, METH_VARARGS, ""},
+    {"linksEstablish", dap_chain_net_links_establish_py, METH_VARARGS, ""},
+    {"syncChains", dap_chain_net_sync_all_py, METH_VARARGS, ""},
+    {"syncGdb", dap_chain_net_sync_gdb_py, METH_VARARGS, ""},
+    {"syncAll", dap_chain_net_sync_all_py, METH_VARARGS, ""},
+    {"procDatapool", dap_chain_net_proc_datapool_py, METH_VARARGS, ""},
+    {"byName", dap_chain_net_by_name_py, METH_VARARGS | METH_STATIC, ""},
+    {"byId", dap_chain_net_by_id_py, METH_VARARGS | METH_STATIC, ""},
+    {"idByName", dap_chain_net_id_by_name_py, METH_VARARGS | METH_STATIC, ""},
+    {"ledgerByNetName", dap_chain_ledger_by_net_name_py, METH_VARARGS | METH_STATIC, ""},
+    {"getChainByName", dap_chain_net_get_chain_by_name_py, METH_VARARGS, ""},
+    {"getCurAddr", dap_chain_net_get_cur_addr_py, METH_VARARGS, ""},
+    {"getCurCell", dap_chain_net_get_cur_cell_py, METH_VARARGS, ""},
+    {"getGdbGroupMempool", dap_chain_net_get_gdb_group_mempool_py, METH_VARARGS | METH_STATIC, ""},
+    {"getGdbGroupMempoolByChainType", dap_chain_net_get_gdb_group_mempool_by_chain_type_py, METH_VARARGS, ""},
+    {"linksConnect", dap_chain_net_links_connect_py, METH_VARARGS, ""},
+    {"getChainByChainType", dap_chain_net_get_chain_by_chain_type_py, METH_VARARGS, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainNetObject_DapChainNetObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.ChainNet",            /* tp_name */
+    sizeof(PyDapChainNetObject),     /* tp_basicsize */
+    0,                               /* tp_itemsize */
+    0,                               /* tp_dealloc */
+    0,                               /* tp_print */
+    0,                               /* tp_getattr */
+    0,                               /* tp_setattr */
+    0,                               /* tp_reserved */
+    0,                               /* tp_repr */
+    0,                               /* tp_as_number */
+    0,                               /* tp_as_sequence */
+    0,                               /* tp_as_mapping */
+    0,                               /* tp_hash  */
+    0,                               /* tp_call */
+    0,                               /* tp_str */
+    0,                               /* tp_getattro */
+    0,                               /* tp_setattro */
+    0,                               /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,         /* tp_flags */
+    "Chain net object",              /* tp_doc */
+    0,		                         /* tp_traverse */
+    0,		                         /* tp_clear */
+    0,		                         /* tp_richcompare */
+    0,                               /* tp_weaklistoffset */
+    0,		                         /* tp_iter */
+    0,		                         /* tp_iternext */
+    DapChainNetMethods,              /* tp_methods */
+    0,                               /* tp_members */
+    0,                               /* tp_getset */
+    0,                               /* tp_base */
+    0,                               /* tp_dict */
+    0,                               /* tp_descr_get */
+    0,                               /* tp_descr_set */
+    0,                               /* tp_dictoffset */
+    0,                               /* tp_init */
+    0,                               /* tp_alloc */
+    PyType_GenericNew,               /* tp_new */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //_WRAPPING_DAP_NET_PYTHON_
diff --git a/include/wrapping_dap_chain_net_node.h b/include/wrapping_dap_chain_net_node.h
new file mode 100644
index 0000000000000000000000000000000000000000..1aefe1d44aef648505cff0acc081d6dd028aa476
--- /dev/null
+++ b/include/wrapping_dap_chain_net_node.h
@@ -0,0 +1,70 @@
+#ifndef _WRAPPING_DAP_CHAIN_NET_NODE_
+#define _WRAPPING_DAP_CHAIN_NET_NODE_
+
+#include <Python.h>
+#include "dap_chain_node.h"
+#include "wrapping_dap_chain_common_objects.h"
+#include "libdap_chain_net_python.h"
+
+typedef struct PyDapChainNode{
+    PyObject_HEAD
+}PyDapChainNodeObject;
+
+PyObject *dap_chain_node_gen_addr_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_check_addr_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_alias_find_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_alias_register_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_alias_delete_py(PyObject *self, PyObject *args);
+
+static PyMethodDef DapChainNetNodeMethods[] = {
+    {"genAddr", dap_chain_node_gen_addr_py, METH_VARARGS | METH_STATIC, ""},
+    {"checkAddr", dap_chain_node_check_addr_py, METH_VARARGS | METH_STATIC, ""},
+    {"aliasFind", dap_chain_node_alias_find_py, METH_VARARGS | METH_STATIC, ""},
+    {"aliasRegister", dap_chain_node_alias_register_py, METH_VARARGS | METH_STATIC, ""},
+    {"aliasDelete", dap_chain_node_alias_delete_py, METH_VARARGS | METH_STATIC, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainNodeInfoObject_DapChainNodeInfoObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.Chain.Node",            /* tp_name */
+    sizeof(PyDapChainNodeObject),     /* tp_basicsize */
+    0,                               /* tp_itemsize */
+    0,                               /* tp_dealloc */
+    0,                               /* tp_print */
+    0,                               /* tp_getattr */
+    0,                               /* tp_setattr */
+    0,                               /* tp_reserved */
+    0,                               /* tp_repr */
+    0,                               /* tp_as_number */
+    0,                               /* tp_as_sequence */
+    0,                               /* tp_as_mapping */
+    0,                               /* tp_hash  */
+    0,                               /* tp_call */
+    0,                               /* tp_str */
+    0,                               /* tp_getattro */
+    0,                               /* tp_setattro */
+    0,                               /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,         /* tp_flags */
+    "Chain net node object",              /* tp_doc */
+    0,		                         /* tp_traverse */
+    0,		                         /* tp_clear */
+    0,		                         /* tp_richcompare */
+    0,                               /* tp_weaklistoffset */
+    0,		                         /* tp_iter */
+    0,		                         /* tp_iternext */
+    DapChainNetNodeMethods,              /* tp_methods */
+    0,                               /* tp_members */
+    0,                               /* tp_getset */
+    0,                               /* tp_base */
+    0,                               /* tp_dict */
+    0,                               /* tp_descr_get */
+    0,                               /* tp_descr_set */
+    0,                               /* tp_dictoffset */
+    0,                               /* tp_init */
+    0,                               /* tp_alloc */
+    PyType_GenericNew,               /* tp_new */
+};
+
+#endif //_WRAPPING_DAP_CHAIN_NET_NODE_
diff --git a/include/wrapping_dap_chain_net_node_cli.h b/include/wrapping_dap_chain_net_node_cli.h
new file mode 100644
index 0000000000000000000000000000000000000000..8d027837fee7dd2f761ae180c70b6db1dc743d36
--- /dev/null
+++ b/include/wrapping_dap_chain_net_node_cli.h
@@ -0,0 +1,87 @@
+#ifndef _WRAPPING_DAP_CHAIN_NET_NODE_CLI_
+#define _WRAPPING_DAP_CHAIN_NET_NODE_CLI_
+
+#include <Python.h>
+#include "dap_config.h"
+#include "dap_chain_node_cli.h"
+#include "dap_chain_node_cli_cmd.h"
+#include "wrapping_dap_chain_common_objects.h"
+#include "wrapping_dap_chain_net_node.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct PyDapChainNodeCli{
+    PyObject_HEAD
+    cmdfunc_t *func;
+}PyDapChainNodeCliObject;
+static PyObject *binded_object_cmdfunc = NULL;
+
+int dap_chain_node_cli_init_py(dap_config_t *g_config);
+void dap_chain_node_cli_delete_py(void);
+
+PyObject *DapChainNodeCliObject_new(PyTypeObject *type_object, PyObject *args, PyObject *kwds);
+
+PyObject *dap_chain_node_cli_cmd_item_create_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_cli_set_reply_text_py(PyObject *self, PyObject *args);
+
+PyObject *dap_chain_node_addr_get_by_alias_py(PyObject *self, PyObject *args);
+
+static PyMethodDef DapChainNodeCliMethods[] = {
+    {"cmdItemCreate", dap_chain_node_cli_cmd_item_create_py, METH_VARARGS, ""},
+    {"setReplyText", dap_chain_node_cli_set_reply_text_py, METH_VARARGS, ""},
+    {"getByAlias", dap_chain_node_addr_get_by_alias_py, METH_VARARGS | METH_STATIC, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainNodeCliObject_DapChainNodeCliObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.Chain.Node.cli",            /* tp_name */
+    sizeof(PyDapChainNodeCliObject),     /* tp_basicsize */
+    0,                               /* tp_itemsize */
+    0,                               /* tp_dealloc */
+    0,                               /* tp_print */
+    0,                               /* tp_getattr */
+    0,                               /* tp_setattr */
+    0,                               /* tp_reserved */
+    0,                               /* tp_repr */
+    0,                               /* tp_as_number */
+    0,                               /* tp_as_sequence */
+    0,                               /* tp_as_mapping */
+    0,                               /* tp_hash  */
+    0,                               /* tp_call */
+    0,                               /* tp_str */
+    0,                               /* tp_getattro */
+    0,                               /* tp_setattro */
+    0,                               /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,         /* tp_flags */
+    "Chain net node cli object",              /* tp_doc */
+    0,		                         /* tp_traverse */
+    0,		                         /* tp_clear */
+    0,		                         /* tp_richcompare */
+    0,                               /* tp_weaklistoffset */
+    0,		                         /* tp_iter */
+    0,		                         /* tp_iternext */
+    DapChainNodeCliMethods,              /* tp_methods */
+    0,                               /* tp_members */
+    0,                               /* tp_getset */
+    0,                               /* tp_base */
+    0,                               /* tp_dict */
+    0,                               /* tp_descr_get */
+    0,                               /* tp_descr_set */
+    0,                               /* tp_dictoffset */
+    0,                               /* tp_init */
+    0,                               /* tp_alloc */
+    DapChainNodeCliObject_new,       /* tp_new */
+};
+
+char **PyListToString(PyObject *list);
+PyObject *stringToPyList(char **list);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //_WRAPPING_DAP_CHAIN_NET_NODE_CLI_
diff --git a/include/wrapping_dap_chain_net_node_client.h b/include/wrapping_dap_chain_net_node_client.h
new file mode 100644
index 0000000000000000000000000000000000000000..c940a7a4a9083d0814b5a80225642775a0d78efa
--- /dev/null
+++ b/include/wrapping_dap_chain_net_node_client.h
@@ -0,0 +1,85 @@
+#ifndef _WRAPPING_DAP_CHAIN_NODE_CLIENT_
+#define _WRAPPING_DAP_CHAIN_NODE_CLIENT_
+
+#include <Python.h>
+#include "dap_chain_node_client.h"
+#include "wrapping_dap_chain_net_node_info.h"
+#include "libdap_client_python.h"
+#include "wrapping_dap_client_stage.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct PyDapChainNodeClient{
+    PyObject_HEAD
+    dap_chain_node_client_t *node_client;
+}PyDapChainNodeClientObject;
+
+int dap_chain_node_client_init_py(void);
+void dap_chain_node_client_deinit_py(void);
+
+PyObject *dap_chain_client_connect_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_client_connect_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_client_close_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_client_send_ch_pkt_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_client_wait_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_client_set_callbacks_py(PyObject *self, PyObject *args);
+
+static PyMethodDef DapChainNodeClientMethods[] = {
+    {"clientConnect", dap_chain_client_connect_py, METH_VARARGS | METH_STATIC, ""},
+    {"nodeClientConnect", (PyCFunction)dap_chain_node_client_connect_py, METH_VARARGS | METH_STATIC, ""},
+    {"close", (PyCFunction)dap_chain_node_client_close_py, METH_VARARGS, ""},
+    {"sendChPkt", (PyCFunction)dap_chain_node_client_send_ch_pkt_py, METH_VARARGS, ""},
+    {"wait", (PyCFunction)dap_chain_node_client_wait_py, METH_VARARGS, ""},
+    {"setCallbacks", (PyCFunction)dap_chain_node_client_set_callbacks_py, METH_VARARGS | METH_STATIC, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainNodeClientObject_DapChainNodeClientObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.Chain.Node.Client",            /* tp_name */
+    sizeof(PyDapChainNodeClientObject),     /* tp_basicsize */
+    0,                               /* tp_itemsize */
+    0,                               /* tp_dealloc */
+    0,                               /* tp_print */
+    0,                               /* tp_getattr */
+    0,                               /* tp_setattr */
+    0,                               /* tp_reserved */
+    0,                               /* tp_repr */
+    0,                               /* tp_as_number */
+    0,                               /* tp_as_sequence */
+    0,                               /* tp_as_mapping */
+    0,                               /* tp_hash  */
+    0,                               /* tp_call */
+    0,                               /* tp_str */
+    0,                               /* tp_getattro */
+    0,                               /* tp_setattro */
+    0,                               /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,         /* tp_flags */
+    "Chain net node client object",              /* tp_doc */
+    0,		                         /* tp_traverse */
+    0,		                         /* tp_clear */
+    0,		                         /* tp_richcompare */
+    0,                               /* tp_weaklistoffset */
+    0,		                         /* tp_iter */
+    0,		                         /* tp_iternext */
+    DapChainNodeClientMethods,              /* tp_methods */
+    0,                               /* tp_members */
+    0,                               /* tp_getset */
+    0,                               /* tp_base */
+    0,                               /* tp_dict */
+    0,                               /* tp_descr_get */
+    0,                               /* tp_descr_set */
+    0,                               /* tp_dictoffset */
+    0,                               /* tp_init */
+    0,                               /* tp_alloc */
+    PyType_GenericNew,       /* tp_new */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //_WRAPPING_DAP_CHAIN_NODE_CLIENT_
diff --git a/include/wrapping_dap_chain_net_node_info.h b/include/wrapping_dap_chain_net_node_info.h
new file mode 100644
index 0000000000000000000000000000000000000000..4caec25f837f3ab0f1f4fd61c4e3a4731e9f775f
--- /dev/null
+++ b/include/wrapping_dap_chain_net_node_info.h
@@ -0,0 +1,72 @@
+#ifndef _WRAPPING_DAP_CHAIN_NODE_INFO
+#define _WRAPPING_DAP_CHAIN_NODE_INFO
+#include <Python.h>
+#include "dap_chain_node.h"
+#include "libdap_chain_net_python.h"
+#include "wrapping_dap_chain_common_objects.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct PyDapChainNodeInfo{
+    PyObject_HEAD
+    dap_chain_node_info_t *node_info;
+}PyDapChainNodeInfoObject;
+
+PyObject *dap_chain_node_info_save_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_node_info_read_py(PyObject *self, PyObject *args);
+
+static PyMethodDef DapChainNetNodeInfoMethods[] = {
+    {"save", dap_chain_node_info_save_py, METH_VARARGS, ""},
+    {"read", dap_chain_node_info_read_py, METH_VARARGS | METH_STATIC, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainNodeInfoObject_DapChainNodeInfoObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.Chain.Node.Info",            /* tp_name */
+    sizeof(PyDapChainNodeInfoObject),     /* tp_basicsize */
+    0,                               /* tp_itemsize */
+    0,                               /* tp_dealloc */
+    0,                               /* tp_print */
+    0,                               /* tp_getattr */
+    0,                               /* tp_setattr */
+    0,                               /* tp_reserved */
+    0,                               /* tp_repr */
+    0,                               /* tp_as_number */
+    0,                               /* tp_as_sequence */
+    0,                               /* tp_as_mapping */
+    0,                               /* tp_hash  */
+    0,                               /* tp_call */
+    0,                               /* tp_str */
+    0,                               /* tp_getattro */
+    0,                               /* tp_setattro */
+    0,                               /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,         /* tp_flags */
+    "Chain net node info object",              /* tp_doc */
+    0,		                         /* tp_traverse */
+    0,		                         /* tp_clear */
+    0,		                         /* tp_richcompare */
+    0,                               /* tp_weaklistoffset */
+    0,		                         /* tp_iter */
+    0,		                         /* tp_iternext */
+    DapChainNetNodeInfoMethods,              /* tp_methods */
+    0,                               /* tp_members */
+    0,                               /* tp_getset */
+    0,                               /* tp_base */
+    0,                               /* tp_dict */
+    0,                               /* tp_descr_get */
+    0,                               /* tp_descr_set */
+    0,                               /* tp_dictoffset */
+    0,                               /* tp_init */
+    0,                               /* tp_alloc */
+    PyType_GenericNew,               /* tp_new */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //_WRAPPING_DAP_CHAIN_NODE_INFO
diff --git a/include/wrapping_dap_chain_net_state.h b/include/wrapping_dap_chain_net_state.h
new file mode 100644
index 0000000000000000000000000000000000000000..880a4f51640720bc6159560183740ad046955323
--- /dev/null
+++ b/include/wrapping_dap_chain_net_state.h
@@ -0,0 +1,85 @@
+#ifndef _WRAPPING_DAP_CHAIN_NET_STATE_
+#define _WRAPPING_DAP_CHAIN_NET_STATE_
+#include <Python.h>
+#include "dap_chain_net.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct PyDapChainNetState{
+    PyObject_HEAD
+    dap_chain_net_state_t state;
+}PyDapChainNetStateObject;
+
+PyObject *NET_STATE_OFFLINE_PY(void);
+PyObject *NET_STATE_LINKS_PREPARE_PY(void);
+PyObject *NET_STATE_LINKS_CONNECTING_PY(void);
+PyObject *NET_STATE_LINKS_ESTABLISHED_PY(void);
+PyObject *NET_STATE_ADDR_REQUEST_PY(void); // Waiting for address assign
+PyObject *NET_STATE_ONLINE_PY(void);
+PyObject *NET_STATE_SYNC_GDB_PY(void);
+PyObject *NET_STATE_SYNC_CHAINS_PY(void);
+
+static PyMethodDef PyDapChainNetStateMethods[] = {
+    {"NET_STATE_OFFLINE", (PyCFunction)NET_STATE_OFFLINE_PY, METH_NOARGS | METH_STATIC, ""},
+    {"NET_STATE_LINKS_PREPARE", (PyCFunction)NET_STATE_LINKS_PREPARE_PY, METH_NOARGS | METH_STATIC, ""},
+    {"NET_STATE_LINKS_CONNECTING", (PyCFunction)NET_STATE_LINKS_CONNECTING_PY, METH_NOARGS | METH_STATIC, ""},
+    {"NET_STATE_LINKS_ESTABLISHED", (PyCFunction)NET_STATE_LINKS_ESTABLISHED_PY, METH_NOARGS | METH_STATIC, ""},
+    {"NET_STATE_ADDR_REQUEST", (PyCFunction)NET_STATE_ADDR_REQUEST_PY, METH_NOARGS | METH_STATIC, ""},
+    {"NET_STATE_SYNC_GDB", (PyCFunction)NET_STATE_SYNC_GDB_PY, METH_NOARGS | METH_STATIC, ""},
+    {"NET_STATE_SYNC_CHAINS", (PyCFunction)NET_STATE_SYNC_CHAINS_PY, METH_NOARGS | METH_STATIC, ""},
+    /*{"csAdd", (PyCFunction)dap_chain_cs_add_py, METH_VARARGS, ""},
+    {"csCreate", (PyCFunction)dap_chain_cs_create_py, METH_VARARGS, ""},
+    {"classAdd", (PyCFunction)dap_chain_class_add_py, METH_VARARGS, ""},
+    {"classCreate", (PyCFunction)dap_chain_class_create_py, METH_VARARGS, ""},*/
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainNetStateObject_DapChainNetStateObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.ChainNetState",        /* tp_name */
+    sizeof(PyDapChainNetStateObject), /* tp_basicsize */
+    0,                                /* tp_itemsize */
+    0,                                /* tp_dealloc */
+    0,                                /* tp_print */
+    0,                                /* tp_getattr */
+    0,                                /* tp_setattr */
+    0,                                /* tp_reserved */
+    0,                                /* tp_repr */
+    0,                                /* tp_as_number */
+    0,                                /* tp_as_sequence */
+    0,                                /* tp_as_mapping */
+    0,                                /* tp_hash  */
+    0,                                /* tp_call */
+    0,                                /* tp_str */
+    0,                                /* tp_getattro */
+    0,                                /* tp_setattro */
+    0,                                /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,          /* tp_flags */
+    "Chain net staties object",               /* tp_doc */
+    0,		                          /* tp_traverse */
+    0,		                          /* tp_clear */
+    0,		                          /* tp_richcompare */
+    0,                                /* tp_weaklistoffset */
+    0,		                          /* tp_iter */
+    0,		                          /* tp_iternext */
+    PyDapChainNetStateMethods,        /* tp_methods */
+    0,                                /* tp_members */
+    0,                                /* tp_getset */
+    0,                                /* tp_base */
+    0,                                /* tp_dict */
+    0,                                /* tp_descr_get */
+    0,                                /* tp_descr_set */
+    0,                                /* tp_dictoffset */
+    0,                                /* tp_init */
+    0,                                /* tp_alloc */
+    PyType_GenericNew,                /* tp_new */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _WRAPPING_DAP_CHAIN_NET_STATE_
diff --git a/libdap b/libdap
new file mode 160000
index 0000000000000000000000000000000000000000..ba3e1eed7b6e76393c035986fe27c8e49cafc2d9
--- /dev/null
+++ b/libdap
@@ -0,0 +1 @@
+Subproject commit ba3e1eed7b6e76393c035986fe27c8e49cafc2d9
diff --git a/libdap-chain b/libdap-chain
new file mode 160000
index 0000000000000000000000000000000000000000..008b7a65045c6b20b7daf743b112ba16aa0172a9
--- /dev/null
+++ b/libdap-chain
@@ -0,0 +1 @@
+Subproject commit 008b7a65045c6b20b7daf743b112ba16aa0172a9
diff --git a/libdap-chain-crypto b/libdap-chain-crypto
new file mode 160000
index 0000000000000000000000000000000000000000..1a7f57339041f51675a766fb7848d16c6010ff11
--- /dev/null
+++ b/libdap-chain-crypto
@@ -0,0 +1 @@
+Subproject commit 1a7f57339041f51675a766fb7848d16c6010ff11
diff --git a/libdap-chain-gdb b/libdap-chain-gdb
new file mode 160000
index 0000000000000000000000000000000000000000..eb4cec1af570b411ba19dc5b03589dd02be9db09
--- /dev/null
+++ b/libdap-chain-gdb
@@ -0,0 +1 @@
+Subproject commit eb4cec1af570b411ba19dc5b03589dd02be9db09
diff --git a/libdap-chain-global-db b/libdap-chain-global-db
new file mode 160000
index 0000000000000000000000000000000000000000..1419a98d73dcc1927f59645e97b23adb813b47aa
--- /dev/null
+++ b/libdap-chain-global-db
@@ -0,0 +1 @@
+Subproject commit 1419a98d73dcc1927f59645e97b23adb813b47aa
diff --git a/libdap-chain-mempool b/libdap-chain-mempool
new file mode 160000
index 0000000000000000000000000000000000000000..6a91d6b8a821b5e3ad470bf75452cfaeab1899a0
--- /dev/null
+++ b/libdap-chain-mempool
@@ -0,0 +1 @@
+Subproject commit 6a91d6b8a821b5e3ad470bf75452cfaeab1899a0
diff --git a/libdap-chain-net b/libdap-chain-net
new file mode 160000
index 0000000000000000000000000000000000000000..37eb1ddca764eb558224371801967b4d96b93965
--- /dev/null
+++ b/libdap-chain-net
@@ -0,0 +1 @@
+Subproject commit 37eb1ddca764eb558224371801967b4d96b93965
diff --git a/libdap-chain-net-srv b/libdap-chain-net-srv
new file mode 160000
index 0000000000000000000000000000000000000000..f15809e9abf5d54642cc84dae4fe73666eda5a38
--- /dev/null
+++ b/libdap-chain-net-srv
@@ -0,0 +1 @@
+Subproject commit f15809e9abf5d54642cc84dae4fe73666eda5a38
diff --git a/libdap-chain-net-srv-vpn b/libdap-chain-net-srv-vpn
new file mode 160000
index 0000000000000000000000000000000000000000..01afd8dc04708458fb742c36a0a5b49e01dd6716
--- /dev/null
+++ b/libdap-chain-net-srv-vpn
@@ -0,0 +1 @@
+Subproject commit 01afd8dc04708458fb742c36a0a5b49e01dd6716
diff --git a/libdap-chain-python b/libdap-chain-python
new file mode 160000
index 0000000000000000000000000000000000000000..4bbc01ce9a5878c155a67e7cd36535419e360a54
--- /dev/null
+++ b/libdap-chain-python
@@ -0,0 +1 @@
+Subproject commit 4bbc01ce9a5878c155a67e7cd36535419e360a54
diff --git a/libdap-chain-wallet b/libdap-chain-wallet
new file mode 160000
index 0000000000000000000000000000000000000000..93c2043d3c74fc6dceba75d2d9862317d9ba6990
--- /dev/null
+++ b/libdap-chain-wallet
@@ -0,0 +1 @@
+Subproject commit 93c2043d3c74fc6dceba75d2d9862317d9ba6990
diff --git a/libdap-client b/libdap-client
new file mode 160000
index 0000000000000000000000000000000000000000..ca5ac6ff584ba8220aba04ffa8be1fc6bc0a5d57
--- /dev/null
+++ b/libdap-client
@@ -0,0 +1 @@
+Subproject commit ca5ac6ff584ba8220aba04ffa8be1fc6bc0a5d57
diff --git a/libdap-client-python b/libdap-client-python
new file mode 160000
index 0000000000000000000000000000000000000000..b1918f7c8378d1e03e2915565c3764c4a803b2b6
--- /dev/null
+++ b/libdap-client-python
@@ -0,0 +1 @@
+Subproject commit b1918f7c8378d1e03e2915565c3764c4a803b2b6
diff --git a/libdap-crypto b/libdap-crypto
new file mode 160000
index 0000000000000000000000000000000000000000..17f8218833f473d2c954113617ae63cb5dc9400f
--- /dev/null
+++ b/libdap-crypto
@@ -0,0 +1 @@
+Subproject commit 17f8218833f473d2c954113617ae63cb5dc9400f
diff --git a/libdap-crypto-python b/libdap-crypto-python
new file mode 160000
index 0000000000000000000000000000000000000000..e0fef50bbe630c2835020fbebf3bcdfe064255a8
--- /dev/null
+++ b/libdap-crypto-python
@@ -0,0 +1 @@
+Subproject commit e0fef50bbe630c2835020fbebf3bcdfe064255a8
diff --git a/libdap-python b/libdap-python
new file mode 160000
index 0000000000000000000000000000000000000000..4a15aca686aa56313f8ef8157c7d0aba7c9d7154
--- /dev/null
+++ b/libdap-python
@@ -0,0 +1 @@
+Subproject commit 4a15aca686aa56313f8ef8157c7d0aba7c9d7154
diff --git a/libdap-server b/libdap-server
new file mode 160000
index 0000000000000000000000000000000000000000..4a84966dbafc3ae0d207c21ced4c5a41e25872dd
--- /dev/null
+++ b/libdap-server
@@ -0,0 +1 @@
+Subproject commit 4a84966dbafc3ae0d207c21ced4c5a41e25872dd
diff --git a/libdap-server-core b/libdap-server-core
new file mode 160000
index 0000000000000000000000000000000000000000..1d74e9451906fbaa752c04242d266fdd84f944d3
--- /dev/null
+++ b/libdap-server-core
@@ -0,0 +1 @@
+Subproject commit 1d74e9451906fbaa752c04242d266fdd84f944d3
diff --git a/libdap-server-udp b/libdap-server-udp
new file mode 160000
index 0000000000000000000000000000000000000000..2aaaad5981206379c1a7e7c8af3dc3d6aa26e2e7
--- /dev/null
+++ b/libdap-server-udp
@@ -0,0 +1 @@
+Subproject commit 2aaaad5981206379c1a7e7c8af3dc3d6aa26e2e7
diff --git a/libdap-stream b/libdap-stream
new file mode 160000
index 0000000000000000000000000000000000000000..a7ee4c8a206e6e5bb1290ba83b00abe0052f2183
--- /dev/null
+++ b/libdap-stream
@@ -0,0 +1 @@
+Subproject commit a7ee4c8a206e6e5bb1290ba83b00abe0052f2183
diff --git a/libdap-stream-ch b/libdap-stream-ch
new file mode 160000
index 0000000000000000000000000000000000000000..c07c5e4a379f8d66052306c8d40db334d0ff6500
--- /dev/null
+++ b/libdap-stream-ch
@@ -0,0 +1 @@
+Subproject commit c07c5e4a379f8d66052306c8d40db334d0ff6500
diff --git a/libdap-stream-ch-chain b/libdap-stream-ch-chain
new file mode 160000
index 0000000000000000000000000000000000000000..2beb1453e0ad96e8e62357867076a316b5af9895
--- /dev/null
+++ b/libdap-stream-ch-chain
@@ -0,0 +1 @@
+Subproject commit 2beb1453e0ad96e8e62357867076a316b5af9895
diff --git a/libdap-stream-ch-chain-net b/libdap-stream-ch-chain-net
new file mode 160000
index 0000000000000000000000000000000000000000..71ae6ccd1c2ec6d12916835c10b74df0e6ad9dd5
--- /dev/null
+++ b/libdap-stream-ch-chain-net
@@ -0,0 +1 @@
+Subproject commit 71ae6ccd1c2ec6d12916835c10b74df0e6ad9dd5
diff --git a/src/libdap_chain_net_python.c b/src/libdap_chain_net_python.c
new file mode 100644
index 0000000000000000000000000000000000000000..60235584b81d1d42de412598697eeacc147e96bc
--- /dev/null
+++ b/src/libdap_chain_net_python.c
@@ -0,0 +1,138 @@
+#include "libdap_chain_net_python.h"
+
+int dap_chain_net_init_py(void){
+    int res = dap_chain_net_init();
+    return res;
+}
+void dap_chain_net_deinit_py(void){
+    dap_chain_net_deinit();
+}
+
+PyObject *dap_chain_net_load_all_py(PyObject *self, PyObject *args){
+    dap_chain_net_load_all();
+    return PyLong_FromLong(0);
+}
+PyObject *dap_chain_net_state_go_to_py(PyObject *self, PyObject *args){
+    PyObject *obj_net_state;
+    if (!PyArg_ParseTuple(args, "O", &obj_net_state))
+        return NULL;
+    int res = dap_chain_net_state_go_to(((PyDapChainNetObject*)self)->chain_net, ((PyDapChainNetStateObject*)obj_net_state)->state);
+    return PyLong_FromLong(res);
+}
+PyObject *dap_chain_net_start_py(PyObject *self, PyObject *args){
+    int res = dap_chain_net_start(((PyDapChainNetObject*)self)->chain_net);
+    return PyLong_FromLong(res);
+}
+PyObject *dap_chain_net_stop_py(PyObject *self, PyObject *args){
+    int res = dap_chain_net_stop(((PyDapChainNetObject*)self)->chain_net);
+    return PyLong_FromLong(res);
+}
+PyObject *dap_chain_net_links_establish_py(PyObject *self, PyObject *args){
+    int res = dap_chain_net_links_establish(((PyDapChainNetObject*)self)->chain_net);
+    return PyLong_FromLong(res);
+}
+PyObject *dap_chain_net_sync_chains_py(PyObject *self, PyObject *args){
+    int res = dap_chain_net_sync_chains(((PyDapChainNetObject*)self)->chain_net);
+    return PyLong_FromLong(res);
+}
+PyObject *dap_chain_net_sync_gdb_py(PyObject *self, PyObject *args){
+    int res = dap_chain_net_sync_gdb(((PyDapChainNetObject*)self)->chain_net);
+    return PyLong_FromLong(res);
+}
+PyObject *dap_chain_net_sync_all_py(PyObject *self, PyObject *args){
+    int res = dap_chain_net_sync_all(((PyDapChainNetObject*)self)->chain_net);
+    return PyLong_FromLong(res);
+}
+
+PyObject *dap_chain_net_proc_datapool_py(PyObject *self, PyObject *args){
+    dap_chain_net_proc_datapool(((PyDapChainNetObject*)self)->chain_net);
+    return PyLong_FromLong(0);
+}
+
+PyObject *dap_chain_net_by_name_py(PyObject *self, PyObject *args){
+    const char *a_name;
+    if (!PyArg_ParseTuple(args, "s", &a_name))
+        return NULL;
+    PyObject *obj_chain_net = _PyObject_New(&DapChainNetObject_DapChainNetObjectType);
+    ((PyDapChainNetObject*)obj_chain_net)->chain_net = dap_chain_net_by_name(a_name);
+    return Py_BuildValue("O", obj_chain_net);
+}
+PyObject *dap_chain_net_by_id_py(PyObject *self, PyObject *args){
+    PyObject *obj_net_id;
+    if (!PyArg_ParseTuple(args, "O", &obj_net_id))
+        return NULL;
+    PyObject *obj_net = _PyObject_New(&DapChainNetObject_DapChainNetObjectType);
+    ((PyDapChainNetObject*)obj_net)->chain_net = dap_chain_net_by_id(((PyDapChainNetIdObject*)obj_net_id)->net_id);
+    return Py_BuildValue("O", obj_net);
+}
+PyObject *dap_chain_net_id_by_name_py(PyObject *self, PyObject *args){
+    const char *name;
+    if (!PyArg_ParseTuple(args, "s", &name))
+        return NULL;
+    PyObject *obj_net_id = _PyObject_New(&DapChainNetIdObject_DapChainNetIdObjectType);
+    ((PyDapChainNetIdObject*)obj_net_id)->net_id = dap_chain_net_id_by_name(name);
+    return Py_BuildValue("O", obj_net_id);
+}
+PyObject *dap_chain_ledger_by_net_name_py(PyObject *self, PyObject *args){
+    const char *net_name;
+    if (!PyArg_ParseTuple(args, "s", &net_name))
+        return NULL;
+    PyObject *obj_ledger = _PyObject_New(&DapChainLedger_DapChainLedgerType);
+    ((PyDapChainLedgerObject*)obj_ledger)->ledger = dap_chain_ledger_by_net_name(net_name);
+    return Py_BuildValue("O", obj_ledger);
+}
+
+PyObject *dap_chain_net_get_chain_by_name_py(PyObject *self, PyObject *args){
+    const char* chain_name;
+    if (!PyArg_ParseTuple(args, "s", &chain_name))
+        return NULL;
+      PyObject *obj_chain = _PyObject_New(&dapChainObject_dapChainType);
+      ((PyDapChainObject*)obj_chain)->chain_t = dap_chain_net_get_chain_by_name(((PyDapChainNetObject*)self)->chain_net, chain_name);
+      return Py_BuildValue("O", obj_chain);
+}
+
+PyObject *dap_chain_net_get_cur_addr_py(PyObject *self, PyObject *args){
+    PyObject *obj_node_addr = _PyObject_New(&DapChainNodeAddrObject_DapChainNodeAddrObjectType);
+    ((PyDapChainNodeAddrObject*)obj_node_addr)->node_addr = dap_chain_net_get_cur_addr(((PyDapChainNetObject*)self)->chain_net);
+    return Py_BuildValue("O", obj_node_addr);
+}
+PyObject *dap_chain_net_get_cur_cell_py(PyObject *self, PyObject *args){
+    PyObject *obj_cell_id = _PyObject_New(&DapChainNodeAddrObject_DapChainNodeAddrObjectType);
+    ((PyDapChainCellIdObject*)obj_cell_id)->id = *(dap_chain_net_get_cur_cell(((PyDapChainNetObject*)self)->chain_net));
+    return Py_BuildValue("O", obj_cell_id);
+}
+PyObject *dap_chain_net_get_cur_addr_int_py(PyObject *self, PyObject *args){
+    uint64_t res = dap_chain_net_get_cur_addr_int(((PyDapChainNetObject*)self)->chain_net);
+    return PyLong_FromUnsignedLongLong(res);
+}
+
+PyObject *dap_chain_net_get_gdb_group_mempool_py(PyObject *self, PyObject *args){
+    PyObject *obj_chain;
+    if (!PyArg_ParseTuple(args, "O", &obj_chain))
+        return NULL;
+    char *res = dap_chain_net_get_gdb_group_mempool(((PyDapChainObject*)obj_chain)->chain_t);
+    return Py_BuildValue("s", res);
+}
+PyObject *dap_chain_net_get_gdb_group_mempool_by_chain_type_py(PyObject *self, PyObject *args){
+    PyObject *obj_chain_type;
+    if (!PyArg_ParseTuple(args, "O", &obj_chain_type))
+        return NULL;
+    char *res = dap_chain_net_get_gdb_group_mempool_by_chain_type(((PyDapChainNetObject*)self)->chain_net,
+                                                                  ((PyChainTypeObject*)obj_chain_type)->chain_type);
+    return Py_BuildValue("s", res);
+
+}
+PyObject *dap_chain_net_links_connect_py(PyObject *self, PyObject *args){
+    dap_chain_net_links_connect(((PyDapChainNetObject*)self)->chain_net);
+    PyLong_FromLong(0);
+}
+PyObject *dap_chain_net_get_chain_by_chain_type_py(PyObject *self, PyObject *args){
+    PyObject *obj_chain_type;
+    if(!PyArg_ParseTuple(args, "O", &obj_chain_type))
+        return NULL;
+    PyObject *obj_chain = _PyObject_New(&dapChainObject_dapChainType);
+    ((PyDapChainObject*)obj_chain)->chain_t = dap_chain_net_get_chain_by_chain_type(
+                ((PyDapChainNetObject*)self)->chain_net,
+                ((PyChainTypeObject*)obj_chain_type)->chain_type);
+    return Py_BuildValue("O", obj_chain);
+}
diff --git a/src/wrapping_dap_chain_net_node.c b/src/wrapping_dap_chain_net_node.c
new file mode 100644
index 0000000000000000000000000000000000000000..8f7eeaa083e2da6c3025af87cc181a01172edc45
--- /dev/null
+++ b/src/wrapping_dap_chain_net_node.c
@@ -0,0 +1,55 @@
+#include "wrapping_dap_chain_net_node.h"
+
+PyObject *dap_chain_node_gen_addr_py(PyObject *self, PyObject *args){
+    PyObject *obj_net;
+    PyObject *obj_cell_id;
+    if (!PyArg_ParseTuple(args, "O|O", &obj_net, &obj_cell_id))
+        return NULL;
+    PyObject *obj_node_addr = _PyObject_New(&DapChainNodeAddrObject_DapChainNodeAddrObjectType);
+    ((PyDapChainNodeAddrObject*)obj_node_addr)->node_addr = dap_chain_node_gen_addr(((PyDapChainNetObject*)obj_net)->chain_net, &(((PyDapChainCellIdObject*)obj_cell_id)->id));
+    return Py_BuildValue("O", obj_node_addr);
+}
+PyObject *dap_chain_node_check_addr_py(PyObject *self, PyObject *args){
+    PyObject *obj_chain_net;
+    PyObject *obj_node_addr;
+    PyObject *obj_cell_id;
+    if (!PyArg_ParseTuple(args, "O|O|O", &obj_chain_net, &obj_node_addr, &obj_cell_id))
+        return NULL;
+    bool ret = dap_chain_node_check_addr(((PyDapChainNetObject*)obj_chain_net)->chain_net, ((PyDapChainNodeAddrObject*)obj_node_addr)->node_addr, &(((PyDapChainCellIdObject*)obj_cell_id)->id));
+    if (ret)
+        return Py_BuildValue("O", Py_True);
+    else
+        return Py_BuildValue("O", Py_False);
+}
+PyObject *dap_chain_node_alias_find_py(PyObject *self, PyObject *args){
+    PyObject *obj_chain_net;
+    const char *alias;
+    if (!PyArg_ParseTuple(args, "O|s", &obj_chain_net, &alias))
+        return NULL;
+    PyObject *obj_node_addr = _PyObject_New(&DapChainNodeAddrObject_DapChainNodeAddrObjectType);
+    ((PyDapChainNodeAddrObject*)obj_node_addr)->node_addr = dap_chain_node_alias_find(((PyDapChainNetObject*)obj_node_addr)->chain_net, alias);
+    return Py_BuildValue("O", &obj_node_addr);
+}
+PyObject *dap_chain_node_alias_register_py(PyObject *self, PyObject *args){
+    PyObject *obj_chain_net;
+    const char *alias;
+    PyObject *obj_node_addr;
+    if (!PyArg_ParseTuple(args, "O|s|O", &obj_chain_net, &alias, &obj_node_addr))
+        return NULL;
+    bool ret = dap_chain_node_alias_register(((PyDapChainNetObject*)obj_chain_net)->chain_net, alias, ((PyDapChainNodeAddrObject*)obj_node_addr)->node_addr);
+    if (ret)
+        return Py_BuildValue("O", Py_True);
+    else
+        return Py_BuildValue("O", Py_False);
+}
+PyObject *dap_chain_node_alias_delete_py(PyObject *self, PyObject *args){
+    PyObject *obj_chain_net;
+    const char *alias;
+    if (!PyArg_ParseTuple(args, "O|s", &obj_chain_net, &alias))
+        return NULL;
+    bool ret = dap_chain_node_alias_delete(((PyDapChainNetObject*)obj_chain_net)->chain_net, alias);
+    if (ret)
+        return Py_BuildValue("O", Py_True);
+    else
+        return Py_BuildValue("O", Py_False);
+}
diff --git a/src/wrapping_dap_chain_net_node_cli.c b/src/wrapping_dap_chain_net_node_cli.c
new file mode 100644
index 0000000000000000000000000000000000000000..ab3d31f502c5c24819fd8d9b678c6292027ed2c1
--- /dev/null
+++ b/src/wrapping_dap_chain_net_node_cli.c
@@ -0,0 +1,89 @@
+#include "wrapping_dap_chain_net_node_cli.h"
+
+int dap_chain_node_cli_init_py(dap_config_t *g_config){
+    dap_chain_node_cli_init(g_config);
+}
+void dap_chain_node_cli_delete_py(void){
+    dap_chain_node_cli_delete();
+}
+
+static int wrapping_cmdfunc(int argc, char **argv, char **str_reply){
+    PyObject *arglist;
+    PyObject *result;
+    PyObject *obj_argv = stringToPyList(argv);
+    PyObject *obj_str_reply = stringToPyList(str_reply);
+    arglist = Py_BuildValue("i|O|O", argc, obj_argv, obj_str_reply);
+    result = PyObject_CallObject(binded_object_cmdfunc, arglist);
+    Py_DECREF(arglist);
+    Py_DECREF(obj_argv);
+    Py_DECREF(obj_str_reply);
+    int r = -1;
+    if (PyLong_Check(result)){
+        r = (int)PyLong_AsLong(result);
+    }
+    Py_DECREF(result);
+    return r;
+}
+
+PyObject *DapChainNodeCliObject_new(PyTypeObject *type_object, PyObject *args, PyObject *kwds){
+    PyDapChainNodeCliObject *obj = (PyDapChainNodeCliObject*)PyType_GenericNew(type_object, args, kwds);
+    obj->func = wrapping_cmdfunc;
+    return (PyObject *)obj;
+}
+
+PyObject *dap_chain_node_cli_cmd_item_create_py(PyObject *self, PyObject *args){
+    const char *name, *doc, *doc_ex;
+    PyObject *obj_cmdfunc;
+    if (!PyArg_ParseTuple(args, "s|O:set_callback|s|s", &name, &obj_cmdfunc, &doc, &doc_ex)){
+        return NULL;
+    } else {
+        if (!PyCallable_Check(obj_cmdfunc)){
+            PyErr_SetString(PyExc_TypeError, "parameter must be callable");
+            return NULL;
+        }
+    }
+    Py_XINCREF(obj_cmdfunc);
+    Py_XDECREF(binded_object_cmdfunc);
+    binded_object_cmdfunc = obj_cmdfunc;
+    dap_chain_node_cli_cmd_item_create(name, ((PyDapChainNodeCliObject*)obj_cmdfunc)->func, doc, doc_ex);
+    return PyLong_FromLong(0);
+}
+
+PyObject *dap_chain_node_cli_set_reply_text_py(PyObject *self, PyObject *args){
+    PyObject *obj_str_reply_list;
+    const char *str_list;
+    if (!PyArg_ParseTuple(args, "O|O", &obj_str_reply_list))
+        return NULL;
+    char **str_reply_list = PyListToString(obj_str_reply_list);
+    dap_chain_node_cli_set_reply_text(str_reply_list, str_list);
+    return PyLong_FromLong(0);
+}
+
+PyObject *dap_chain_node_addr_get_by_alias_py(PyObject *self, PyObject *args){
+    PyObject *chain_net;
+    const char *alias;
+    if (!PyArg_ParseTuple(args, "O|s", &chain_net, &alias))
+        return NULL;
+    PyObject *obj_node_addr = _PyObject_New(&DapChainNodeAddrObject_DapChainNodeAddrObjectType);
+    ((PyDapChainNodeAddrObject*)obj_node_addr)->node_addr = dap_chain_node_addr_get_by_alias(((PyDapChainNetObject*)chain_net)->chain_net, alias);
+    return Py_BuildValue("O", obj_node_addr);
+}
+
+char **PyListToString(PyObject *list){
+    Py_ssize_t size = PyList_Size(list);
+    char **res = calloc(sizeof(char**), (size_t)size);
+    for (Py_ssize_t i=0; i < size;i++ ){
+        char *data = PyBytes_AsString(PyList_GetItem(list, i));
+        res[(size_t)i] = data;
+    }
+    return res;
+}
+PyObject *stringToPyList(char **list){
+    size_t size = sizeof(list) / sizeof(list[0]);
+    PyObject *obj = PyList_New((Py_ssize_t)size);
+    for (size_t i=0; i < size; i++){
+        PyObject *data = PyBytes_FromString(list[i]);
+        PyList_Append(obj, data);
+    }
+    return obj;
+}
diff --git a/src/wrapping_dap_chain_net_node_client.c b/src/wrapping_dap_chain_net_node_client.c
new file mode 100644
index 0000000000000000000000000000000000000000..4a2e5b08ed538a426b61e6362aee6f5f15971b17
--- /dev/null
+++ b/src/wrapping_dap_chain_net_node_client.c
@@ -0,0 +1,66 @@
+#include "wrapping_dap_chain_net_node_client.h"
+
+int dap_chain_node_client_init_py(void){
+    return dap_chain_node_client_init();
+}
+void dap_chain_node_client_deinit_py(void){
+    dap_chain_node_client_deinit();
+}
+
+PyObject *dap_chain_client_connect_py(PyObject *self, PyObject *args){
+    PyObject *obj_node_info;
+    PyObject *obj_client_stage;
+    const char *active_channels;
+    if (!PyArg_ParseTuple(args, "O|O|s", &obj_node_info, &obj_client_stage, &active_channels))
+        return NULL;
+    PyObject *obj_node_client = _PyObject_New(&DapChainNodeClientObject_DapChainNodeClientObjectType);
+    ((PyDapChainNodeClientObject*)obj_node_client)->node_client =dap_chain_client_connect(
+                ((PyDapChainNodeInfoObject*)obj_node_info)->node_info,
+                ((PyDapClientStageObject*)obj_client_stage)->stage, active_channels);
+    return Py_BuildValue("O", obj_node_client);
+}
+PyObject *dap_chain_node_client_connect_py(PyObject *self, PyObject *args){
+    if (self != NULL){
+        PyErr_SetString(PyExc_SyntaxWarning, "This is method called statically");
+        return NULL;
+    }
+    PyObject *obj_node_info;
+    if (!PyArg_ParseTuple(args, "O", &obj_node_info))
+        return NULL;
+    PyObject *obj_node_client = _PyObject_New(&DapChainNodeClientObject_DapChainNodeClientObjectType);
+    ((PyDapChainNodeClientObject*)obj_node_client)->node_client = dap_chain_node_client_connect(((PyDapChainNodeInfoObject*)obj_node_info)->node_info);
+    return Py_BuildValue("O", obj_node_client);
+}
+PyObject *dap_chain_node_client_close_py(PyObject *self, PyObject *args){
+    dap_chain_node_client_close(((PyDapChainNodeClientObject*)self)->node_client);
+    return PyLong_FromLong(0);
+}
+PyObject *dap_chain_node_client_send_ch_pkt_py(PyObject *self, PyObject *args){
+    uint8_t ch_id;
+    uint8_t type;
+    PyObject *obj_buf;
+    void *buf;
+    size_t buf_size;
+    if (!PyArg_ParseTuple(args, "b|b|O", &ch_id, &type, &obj_buf))
+        return NULL;
+    buf = PyBytes_AsString(obj_buf);
+    buf_size = (size_t)PyBytes_Size(buf);
+    int res = dap_chain_node_client_send_ch_pkt(((PyDapChainNodeClientObject*)self)->node_client, ch_id, type, buf, buf_size);
+    return PyLong_FromLong(res);
+}
+PyObject *dap_chain_node_client_wait_py(PyObject *self, PyObject *args){
+    int waited_state;
+    int timeout_ms;
+    if (!PyArg_ParseTuple(args, "i|i", &waited_state, &timeout_ms))
+        return NULL;
+    int res = dap_chain_node_client_wait(((PyDapChainNodeClientObject*)self)->node_client, waited_state, timeout_ms);
+    return PyLong_FromLong(res);
+}
+PyObject *dap_chain_node_client_set_callbacks_py(PyObject *self, PyObject *args){
+    PyObject *obj_dap_client;
+    uint8_t ch_id;
+    if (!PyArg_ParseTuple(args, "O|b", &obj_dap_client, &ch_id))
+        return NULL;
+    int res = dap_chain_node_client_set_callbacks(((PyDapClientObject*)obj_dap_client)->client, ch_id);
+    return PyLong_FromLong(res);
+}
diff --git a/src/wrapping_dap_chain_net_node_info.c b/src/wrapping_dap_chain_net_node_info.c
new file mode 100644
index 0000000000000000000000000000000000000000..36e1915a3f1ca5d2178d0efe0ee7a45f5b521203
--- /dev/null
+++ b/src/wrapping_dap_chain_net_node_info.c
@@ -0,0 +1,19 @@
+#include "wrapping_dap_chain_net_node_info.h"
+
+PyObject *dap_chain_node_info_save_py(PyObject *self, PyObject *args){
+   PyObject *obj_net;
+   if (!PyArg_ParseTuple(args, "O", &obj_net))
+       return NULL;
+   int res = dap_chain_node_info_save(((PyDapChainNetObject*)obj_net)->chain_net, ((PyDapChainNodeInfoObject*)self)->node_info);
+   return PyLong_FromLong(res);
+}
+
+PyObject *dap_chain_node_info_read_py(PyObject *self, PyObject *args){
+    PyObject *obj_net;
+    PyObject *obj_node_addr;
+    if (!PyArg_ParseTuple(args, "O|O", &obj_net, &obj_node_addr))
+        return  NULL;
+    PyObject *obj_node_info = _PyObject_New(&DapChainNodeInfoObject_DapChainNodeInfoObjectType);
+    ((PyDapChainNodeInfoObject*)obj_node_info)->node_info = dap_chain_node_info_read(((PyDapChainNetObject*)obj_net)->chain_net, ((PyDapChainNodeAddrObject*)obj_node_addr)->node_addr);
+    return Py_BuildValue("O", &obj_node_info);
+}
diff --git a/src/wrapping_dap_chain_net_state.c b/src/wrapping_dap_chain_net_state.c
new file mode 100644
index 0000000000000000000000000000000000000000..1042393fe4411d0da97437332de294f709eb26b4
--- /dev/null
+++ b/src/wrapping_dap_chain_net_state.c
@@ -0,0 +1,42 @@
+#include "wrapping_dap_chain_net_state.h"
+
+PyObject *NET_STATE_OFFLINE_PY(void){
+    PyObject *obj = _PyObject_New(&DapChainNetStateObject_DapChainNetStateObjectType);
+    ((PyDapChainNetStateObject*)obj)->state = NET_STATE_OFFLINE;
+    return Py_BuildValue("O", obj);
+}
+PyObject *NET_STATE_LINKS_PREPARE_PY(void){
+    PyObject *obj = _PyObject_New(&DapChainNetStateObject_DapChainNetStateObjectType);
+    ((PyDapChainNetStateObject*)obj)->state = NET_STATE_LINKS_PREPARE;
+    return Py_BuildValue("O", obj);
+}
+PyObject *NET_STATE_LINKS_CONNECTING_PY(void){
+    PyObject *obj = _PyObject_New(&DapChainNetStateObject_DapChainNetStateObjectType);
+    ((PyDapChainNetStateObject*)obj)->state = NET_STATE_LINKS_CONNECTING;
+    return Py_BuildValue("O", obj);
+}
+PyObject *NET_STATE_LINKS_ESTABLISHED_PY(void){
+    PyObject *obj = _PyObject_New(&DapChainNetStateObject_DapChainNetStateObjectType);
+    ((PyDapChainNetStateObject*)obj)->state = NET_STATE_LINKS_ESTABLISHED;
+    return Py_BuildValue("O", obj);
+}
+PyObject *NET_STATE_ADDR_REQUEST_PY(void){ // Waiting for address assign
+    PyObject *obj = _PyObject_New(&DapChainNetStateObject_DapChainNetStateObjectType);
+    ((PyDapChainNetStateObject*)obj)->state = NET_STATE_ADDR_REQUEST;
+    return Py_BuildValue("O", obj);
+}
+PyObject *NET_STATE_ONLINE_PY(void){
+    PyObject *obj = _PyObject_New(&DapChainNetStateObject_DapChainNetStateObjectType);
+    ((PyDapChainNetStateObject*)obj)->state = NET_STATE_ONLINE;
+    return Py_BuildValue("O", obj);
+}
+PyObject *NET_STATE_SYNC_GDB_PY(void){
+    PyObject *obj = _PyObject_New(&DapChainNetStateObject_DapChainNetStateObjectType);
+    ((PyDapChainNetStateObject*)obj)->state = NET_STATE_SYNC_GDB;
+    return Py_BuildValue("O", obj);
+}
+PyObject *NET_STATE_SYNC_CHAINS_PY(void){
+    PyObject *obj = _PyObject_New(&DapChainNetStateObject_DapChainNetStateObjectType);
+    ((PyDapChainNetStateObject*)obj)->state = NET_STATE_SYNC_CHAINS;
+    return Py_BuildValue("O", obj);
+}