diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2e4c57375cd92d2df401df5eb521412b5f6bc3e4..78194004f5e31009da94205f9c409c8e6dda86a1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ project(cellframe-sdk C)
 cmake_minimum_required(VERSION 2.8)
 
 set(CMAKE_C_STANDARD 11)
-set(CELLFRAME_SDK_NATIVE_VERSION "2.6-29")
+set(CELLFRAME_SDK_NATIVE_VERSION "2.6-33")
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 
 set(DAPSDK_MODULES "")
diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h
index 430c7af50758794b0b12d60d3264dfebd2301d71..5ed8b225adb934e433294c0f5159be5f65777aed 100755
--- a/dap-sdk/core/include/dap_common.h
+++ b/dap-sdk/core/include/dap_common.h
@@ -33,6 +33,10 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <time.h>
+#ifdef DAP_OS_WINDOWS
+#include <fcntl.h>
+#define pipe(pfds) _pipe(pfds, 4096, _O_BINARY)
+#endif
 #ifdef __MACH__
 #include <dispatch/dispatch.h>
 #endif
diff --git a/dap-sdk/core/src/dap_common.c b/dap-sdk/core/src/dap_common.c
index f5565971c805da8c02ad1956bee975ad40bdced5..1be7ab9cf73fdb860ddac198b68d03a3f91ed4ab 100755
--- a/dap-sdk/core/src/dap_common.c
+++ b/dap-sdk/core/src/dap_common.c
@@ -55,8 +55,6 @@
 
   #define popen _popen
   #define pclose _pclose
-  #define pipe(pfds) _pipe(pfds, 4096, 0x8000)
-
 #endif
 
 #include "dap_common.h"
diff --git a/dap-sdk/crypto/include/dap_sign.h b/dap-sdk/crypto/include/dap_sign.h
index 9aa808415455bd2a4dc257fffcaff2e8f9e3b4fa..9182a7e10ba067e1c8e91394c99d601df78f3823 100755
--- a/dap-sdk/crypto/include/dap_sign.h
+++ b/dap-sdk/crypto/include/dap_sign.h
@@ -43,13 +43,13 @@ typedef enum {
 } dap_sign_type_enum_t;
 
 typedef union dap_sign_type {
-    dap_sign_type_enum_t type: 16;
-    uint16_t raw;
-} dap_sign_type_t;
+    dap_sign_type_enum_t type: 32;
+    uint32_t raw;
+} DAP_ALIGN_PACKED dap_sign_type_t;
 
 typedef struct dap_sign_hdr {
         dap_sign_type_t type; /// Signature type
-        uint8_t padding[2]; /// Padding for better aligmnent
+        uint16_t padding;
         uint32_t sign_size; /// Signature size
         uint32_t sign_pkey_size; /// Signature serialized public key size
 } DAP_ALIGN_PACKED dap_sign_hdr_t;
diff --git a/dap-sdk/crypto/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h b/dap-sdk/crypto/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h
index 1713a46e7197e5b2094b9ca735758217105a312d..d1b7ef3920d1a0ce87b5efd9bcedeb417dfffa11 100644
--- a/dap-sdk/crypto/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h
+++ b/dap-sdk/crypto/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h
@@ -84,4 +84,4 @@ int SHA3_512(unsigned char *output, const unsigned char *input, size_t inputByte
 }
 #endif
 
-#endif
+#endif
\ No newline at end of file
diff --git a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-SnP.h b/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-SnP.h
deleted file mode 100755
index 1ad16097cd9109e9df6802558c0496f559e4d989..0000000000000000000000000000000000000000
--- a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-SnP.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-Implementation by Ronny Van Keer, hereby denoted as "the implementer".
-
-For more information, feedback or questions, please refer to our website:
-https://keccak.team/
-
-To the extent possible under law, the implementer has waived all copyright
-and related or neighboring rights to the source code in this file.
-http://creativecommons.org/publicdomain/zero/1.0/
-
----
-
-Please refer to SnP-documentation.h for more details.
-*/
-
-#ifndef _KeccakP_200_SnP_h_
-#define _KeccakP_200_SnP_h_
-
-#define KeccakP200_implementation      "8-bit compact implementation"
-#define KeccakP200_stateSizeInBytes    25
-#define KeccakP200_stateAlignment      1
-
-#define KeccakP200_StaticInitialize()
-void KeccakP200_Initialize(void *state);
-void KeccakP200_AddByte(void *state, unsigned char data, unsigned int offset);
-void KeccakP200_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length);
-void KeccakP200_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length);
-void KeccakP200_OverwriteWithZeroes(void *state, unsigned int byteCount);
-void KeccakP200_Permute_Nrounds(void *state, unsigned int nrounds);
-void KeccakP200_Permute_18rounds(void *state);
-void KeccakP200_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length);
-void KeccakP200_ExtractAndAddBytes(const void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length);
-
-#endif
diff --git a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-compact.c b/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-compact.c
deleted file mode 100755
index ea47b55257fe5fb28aa5c07a86b68804e57aa169..0000000000000000000000000000000000000000
--- a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-compact.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
-Implementation by Ronny Van Keer, hereby denoted as "the implementer".
-
-For more information, feedback or questions, please refer to our website:
-https://keccak.team/
-
-To the extent possible under law, the implementer has waived all copyright
-and related or neighboring rights to the source code in this file.
-http://creativecommons.org/publicdomain/zero/1.0/
-
----
-
-This file implements Keccak-p[200] in a SnP-compatible way.
-Please refer to SnP-documentation.h for more details.
-
-This implementation comes with KeccakP-200-SnP.h in the same folder.
-Please refer to LowLevel.build for the exact list of other files it must be combined with.
-*/
-
-#include <string.h>
-#include <stdlib.h>
-#include "KeccakP-200-SnP.h"
-
-/* #define DIVISION_INSTRUCTION    /* comment if no division instruction or more compact when not using division */
-#define UNROLL_CHILOOP        /* comment if more compact using for loop */
-
-typedef unsigned char UINT8;
-typedef unsigned int tSmallUInt; /*INFO It could be more optimized to use "unsigned char" on an 8-bit CPU    */
-typedef UINT8 tKeccakLane;
-
-#define ROL8(a, offset) (UINT8)((((UINT8)a) << (offset&7)) ^ (((UINT8)a) >> (8-(offset&7))))
-
-const UINT8 KeccakP200_RotationConstants[25] =
-{
-     1,  3,  6, 10, 15, 21, 28, 36, 45, 55,  2, 14, 27, 41, 56,  8, 25, 43, 62, 18, 39, 61, 20, 44
-};
-
-const UINT8 KeccakP200_PiLane[25] =
-{
-    10,  7, 11, 17, 18,  3,  5, 16,  8, 21, 24,  4, 15, 23, 19, 13, 12,  2, 20, 14, 22,  9,  6,  1
-};
-
-#if    defined(DIVISION_INSTRUCTION)
-#define MOD5(argValue)    ((argValue) % 5)
-#else
-const UINT8 KeccakP200_Mod5[10] =
-{
-    0, 1, 2, 3, 4, 0, 1, 2, 3, 4
-};
-#define MOD5(argValue)    KeccakP200_Mod5[argValue]
-#endif
-
-const UINT8 KeccakF200_RoundConstants[] =
-{
-    0x01, 0x82, 0x8a, 0x00, 0x8b, 0x01, 0x81, 0x09, 0x8a, 0x88, 0x09, 0x0a, 0x8b, 0x8b, 0x89, 0x03, 0x02, 0x80
-};
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP200_Initialize(void *argState)
-{
-    memset( argState, 0, 25 * sizeof(tKeccakLane) );
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP200_AddByte(void *argState, unsigned char byte, unsigned int offset)
-{
-    ((tKeccakLane*)argState)[offset] ^= byte;
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP200_AddBytes(void *argState, const unsigned char *data, unsigned int offset, unsigned int length)
-{
-    tSmallUInt i;
-    tKeccakLane * state = (tKeccakLane*)argState + offset;
-    for(i=0; i<length; i++)
-        state[i] ^= data[i];
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP200_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
-{
-    memcpy((unsigned char*)state+offset, data, length);
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP200_OverwriteWithZeroes(void *state, unsigned int byteCount)
-{
-    memset(state, 0, byteCount);
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP200_Permute_Nrounds(void *argState, unsigned int nr)
-{
-    tSmallUInt x, y;
-    tKeccakLane temp;
-    tKeccakLane BC[5];
-    tKeccakLane *state;
-    const tKeccakLane *rc;
-
-    state = (tKeccakLane*)argState;
-    rc = KeccakF200_RoundConstants + 18 - nr;
-    do
-    {
-        /* Theta */
-        for ( x = 0; x < 5; ++x )
-        {
-            BC[x] = state[x] ^ state[5 + x] ^ state[10 + x] ^ state[15 + x] ^ state[20 + x];
-        }
-        for ( x = 0; x < 5; ++x )
-        {
-            temp = BC[MOD5(x+4)] ^ ROL8(BC[MOD5(x+1)], 1);
-            for ( y = 0; y < 25; y += 5 )
-            {
-                state[y + x] ^= temp;
-            }
-        }
-
-        /* Rho Pi */
-        temp = state[1];
-        for ( x = 0; x < 24; ++x )
-        {
-            BC[0] = state[KeccakP200_PiLane[x]];
-            state[KeccakP200_PiLane[x]] = ROL8( temp, KeccakP200_RotationConstants[x] );
-            temp = BC[0];
-        }
-
-        /*    Chi */
-        for ( y = 0; y < 25; y += 5 )
-        {
-#if defined(UNROLL_CHILOOP)
-            BC[0] = state[y + 0];
-            BC[1] = state[y + 1];
-            BC[2] = state[y + 2];
-            BC[3] = state[y + 3];
-            BC[4] = state[y + 4];
-#else
-            for ( x = 0; x < 5; ++x )
-            {
-                BC[x] = state[y + x];
-            }
-#endif
-            for ( x = 0; x < 5; ++x )
-            {
-                state[y + x] = BC[x] ^((~BC[MOD5(x+1)]) & BC[MOD5(x+2)]);
-            }
-        }
-
-        /*    Iota */
-        temp = *(rc++);
-        state[0] ^= temp;
-    }
-    while( temp != 0x80 );
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP200_Permute_18rounds(void *argState)
-{
-    KeccakP200_Permute_Nrounds(argState, 18);
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP200_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length)
-{
-    memcpy(data, (UINT8*)state+offset, length);
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP200_ExtractAndAddBytes(const void *argState, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
-{
-    unsigned int i;
-    tKeccakLane * state = (tKeccakLane*)argState + offset;
-    for(i=0; i<length; i++)
-        output[i] = input[i] ^ state[i];
-}
-
-/* ---------------------------------------------------------------- */
diff --git a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-SnP.h b/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-SnP.h
deleted file mode 100755
index 599a8b94caa5ee6d80d671e40b4112cb539cc529..0000000000000000000000000000000000000000
--- a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-SnP.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-Implementation by Ronny Van Keer, hereby denoted as "the implementer".
-
-For more information, feedback or questions, please refer to our website:
-https://keccak.team/
-
-To the extent possible under law, the implementer has waived all copyright
-and related or neighboring rights to the source code in this file.
-http://creativecommons.org/publicdomain/zero/1.0/
-
----
-
-Please refer to SnP-documentation.h for more details.
-*/
-
-#ifndef _KeccakP_800_SnP_h_
-#define _KeccakP_800_SnP_h_
-
-#define KeccakP800_implementation      "32-bit compact implementation"
-#define KeccakP800_stateSizeInBytes    100
-#define KeccakP800_stateAlignment      4
-
-#define KeccakP800_StaticInitialize()
-void KeccakP800_Initialize(void *state);
-void KeccakP800_AddByte(void *state, unsigned char data, unsigned int offset);
-void KeccakP800_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length);
-void KeccakP800_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length);
-void KeccakP800_OverwriteWithZeroes(void *state, unsigned int byteCount);
-void KeccakP800_Permute_Nrounds(void *state, unsigned int nrounds);
-void KeccakP800_Permute_12rounds(void *state);
-void KeccakP800_Permute_22rounds(void *state);
-void KeccakP800_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length);
-void KeccakP800_ExtractAndAddBytes(const void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length);
-
-#endif
diff --git a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-compact.c b/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-compact.c
deleted file mode 100755
index 0d9bfa3aac73f828337fe58b019340754fd1ef60..0000000000000000000000000000000000000000
--- a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-compact.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
-Implementation by Ronny Van Keer, hereby denoted as "the implementer".
-
-For more information, feedback or questions, please refer to our website:
-https://keccak.team/
-
-To the extent possible under law, the implementer has waived all copyright
-and related or neighboring rights to the source code in this file.
-http://creativecommons.org/publicdomain/zero/1.0/
-
----
-
-This file implements Keccak-p[800] in a SnP-compatible way.
-Please refer to SnP-documentation.h for more details.
-
-This implementation comes with KeccakP-800-SnP.h in the same folder.
-Please refer to LowLevel.build for the exact list of other files it must be combined with.
-*/
-
-#include <stdint.h>
-#include <string.h>
-#include <stdlib.h>
-#include "brg_endian.h"
-#include "KeccakP-800-SnP.h"
-
-#if (PLATFORM_BYTE_ORDER != IS_LITTLE_ENDIAN)
-#error Not yet implemented
-#endif
-
-#define USE_MEMSET
-/* #define DIVISION_INSTRUCTION    /* comment if no division instruction or more compact when not using division */
-#define UNROLL_CHILOOP        /* comment more compact using for loop */
-
-typedef unsigned char UINT8;
-typedef uint32_t UINT32;
-typedef unsigned int tSmallUInt; /*INFO It could be more optimized to use "unsigned char" on an 8-bit CPU    */
-typedef UINT32 tKeccakLane;
-
-#if defined (__arm__) && !defined(__GNUC__)
-#define ROL32(a, offset) __ror(a, 32-(offset))
-#elif defined(_MSC_VER)
-#define ROL32(a, offset) _rotl(a, offset)
-#else
-#define ROL32(a, offset) ((((UINT32)a) << offset) ^ (((UINT32)a) >> (32-offset)))
-#endif
-
-#define    cKeccakNumberOfRounds    22
-
-const UINT8 KeccakP800_RotationConstants[25] =
-{
-     1,  3,  6, 10, 15, 21, 28, 4, 13, 23,  2, 14, 27, 9, 24,  8, 25, 11, 30, 18, 7, 29, 20, 12
-};
-
-const UINT8 KeccakP800_PiLane[25] =
-{
-    10,  7, 11, 17, 18,  3,  5, 16,  8, 21, 24,  4, 15, 23, 19, 13, 12,  2, 20, 14, 22,  9,  6,  1
-};
-
-#if    defined(DIVISION_INSTRUCTION)
-#define MOD5(argValue)    ((argValue) % 5)
-#else
-const UINT8 KeccakP800_Mod5[10] =
-{
-    0, 1, 2, 3, 4, 0, 1, 2, 3, 4
-};
-#define MOD5(argValue)    KeccakP800_Mod5[argValue]
-#endif
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP800_Initialize(void *argState)
-{
-    #if defined(USE_MEMSET)
-    memset( argState, 0, 25 * sizeof(tKeccakLane) );
-    #else
-    tSmallUInt i;
-    tKeccakLane *state;
-
-    state = (tKeccakLane*)argState;
-    i = 25;
-    do
-    {
-        *(state++) = 0;
-    }
-    while ( --i != 0 );
-    #endif
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP800_AddByte(void *state, unsigned char data, unsigned int offset)
-{
-    ((unsigned char *)state)[offset] ^= data;
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP800_AddBytes(void *argState, const unsigned char *data, unsigned int offset, unsigned int length)
-{
-    tSmallUInt i;
-    unsigned char * state = (unsigned char*)argState + offset;
-
-    for(i=0; i<length; i++)
-        ((unsigned char *)state)[i] ^= data[i];
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP800_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
-{
-    memcpy((unsigned char*)state+offset, data, length);
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP800_OverwriteWithZeroes(void *state, unsigned int byteCount)
-{
-    memset(state, 0, byteCount);
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP800_Permute_Nrounds(void *argState, unsigned int nr)
-{
-    tSmallUInt x, y;
-    tKeccakLane temp;
-    tKeccakLane BC[5];
-    tKeccakLane *state;
-    UINT8       LFSRstate;
-
-    state = (tKeccakLane*)argState;
-    LFSRstate = 0x01;
-    for ( y = (tSmallUInt)(cKeccakNumberOfRounds - nr); y != 0; --y )
-    {
-        for( x = 1; x < 128; x <<= 1 )
-        {
-            if ((LFSRstate & 0x80) != 0)
-                /* Primitive polynomial over GF(2): x^8+x^6+x^5+x^4+1 */
-                LFSRstate = (LFSRstate << 1) ^ 0x71;
-            else
-                LFSRstate <<= 1;
-        }
-    }
-
-    do
-    {
-        /* Theta */
-        for ( x = 0; x < 5; ++x )
-        {
-            BC[x] = state[x] ^ state[5 + x] ^ state[10 + x] ^ state[15 + x] ^ state[20 + x];
-        }
-        for ( x = 0; x < 5; ++x )
-        {
-            temp = BC[MOD5(x+4)] ^ ROL32(BC[MOD5(x+1)], 1);
-            for ( y = 0; y < 25; y += 5 )
-            {
-                state[y + x] ^= temp;
-            }
-        }
-
-        /* Rho Pi */
-        temp = state[1];
-        for ( x = 0; x < 24; ++x )
-        {
-            BC[0] = state[KeccakP800_PiLane[x]];
-            state[KeccakP800_PiLane[x]] = ROL32( temp, KeccakP800_RotationConstants[x] );
-            temp = BC[0];
-        }
-
-        /*    Chi */
-        for ( y = 0; y < 25; y += 5 )
-        {
-#if defined(UNROLL_CHILOOP)
-            BC[0] = state[y + 0];
-            BC[1] = state[y + 1];
-            BC[2] = state[y + 2];
-            BC[3] = state[y + 3];
-            BC[4] = state[y + 4];
-#else
-            for ( x = 0; x < 5; ++x )
-            {
-                BC[x] = state[y + x];
-            }
-#endif
-            for ( x = 0; x < 5; ++x )
-            {
-                state[y + x] = BC[x] ^((~BC[MOD5(x+1)]) & BC[MOD5(x+2)]);
-            }
-        }
-
-        /*    Iota */
-        temp = 0;
-        for( x = 1; x < 128; x <<= 1 )
-        {
-            if ( x <= (sizeof(tKeccakLane)*8) )
-                temp ^= (tKeccakLane)(LFSRstate & 1) << (x - 1);
-
-            if ((LFSRstate & 0x80) != 0)
-                /* Primitive polynomial over GF(2): x^8+x^6+x^5+x^4+1 */
-                LFSRstate = (LFSRstate << 1) ^ 0x71;
-            else
-                LFSRstate <<= 1;
-        }
-        state[0] ^= temp;
-    }
-    while( --nr != 0 );
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP800_Permute_12rounds(void *argState)
-{
-    KeccakP800_Permute_Nrounds(argState, 12);
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP800_Permute_22rounds(void *argState)
-{
-    KeccakP800_Permute_Nrounds(argState, 22);
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP800_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length)
-{
-    memcpy(data, (const UINT8*)state+offset, length);
-}
-
-/* ---------------------------------------------------------------- */
-
-void KeccakP800_ExtractAndAddBytes(const void *argState, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
-{
-    tSmallUInt i;
-    const unsigned char * state = (const unsigned char*)argState + offset;
-
-    for(i=0; i<length; i++)
-        output[i] = input[i] ^ state[i];
-}
-
-/* ---------------------------------------------------------------- */
diff --git a/dap-sdk/crypto/src/dap_cert.c b/dap-sdk/crypto/src/dap_cert.c
index b9bc42688635fe060bd631c36eb9c7d60f9a03d0..67ce81d47a19efc6ed47e5c1095cef4cf064c09d 100755
--- a/dap-sdk/crypto/src/dap_cert.c
+++ b/dap-sdk/crypto/src/dap_cert.c
@@ -169,8 +169,8 @@ size_t dap_cert_sign_output_size(dap_cert_t * a_cert, size_t a_size_wished)
 dap_sign_t * dap_cert_sign(dap_cert_t * a_cert, const void * a_data
                                        , size_t a_data_size, size_t a_output_size_wished )
 {
-    dap_enc_key_t * l_key = a_cert->enc_key;
-    dap_sign_t *l_ret = dap_sign_create(l_key, a_data, a_data_size, a_output_size_wished);
+    dap_sign_t *l_ret = dap_sign_create(a_cert->enc_key, a_data, a_data_size, a_output_size_wished);
+    log_it(L_INFO, "Sign sizes: %d %d", l_ret->header.sign_size, l_ret->header.sign_pkey_size);
     return l_ret;
 }
 
diff --git a/dap-sdk/crypto/src/dap_enc_key.c b/dap-sdk/crypto/src/dap_enc_key.c
index d105cb5c14ecb487c84e2b4753fb3352a5bf0b3c..4c82fd3a69b8859e84ef66efc27a3e37b3f5778e 100755
--- a/dap-sdk/crypto/src/dap_enc_key.c
+++ b/dap-sdk/crypto/src/dap_enc_key.c
@@ -643,7 +643,7 @@ dap_enc_key_t* dap_enc_key_dup(dap_enc_key_t * a_key)
         return NULL;
     }
     dap_enc_key_t *l_ret = dap_enc_key_new(a_key->type);
-    if (l_ret->priv_key_data_size) {
+    if (a_key->priv_key_data_size) {
         l_ret->priv_key_data = DAP_NEW_Z_SIZE(byte_t, a_key->priv_key_data_size);
         l_ret->priv_key_data_size = a_key->priv_key_data_size;
         memcpy(l_ret->priv_key_data, a_key->priv_key_data, a_key->priv_key_data_size);
diff --git a/dap-sdk/net/client/dap_client_http.c b/dap-sdk/net/client/dap_client_http.c
index 444a10b456624425c99f71d564aaf166c131ece8..413631f29d634a0f92562f5ab6991e0827acadaf 100644
--- a/dap-sdk/net/client/dap_client_http.c
+++ b/dap-sdk/net/client/dap_client_http.c
@@ -418,9 +418,10 @@ static void s_http_connected(dap_events_socket_t * a_esocket)
             "\r\n",
             l_http_pvt->method, l_http_pvt->path, l_get_str ? l_get_str : "", l_http_pvt->uplink_addr, l_request_headers->str);
     // send data for POST request
-    if(!l_get_str)
+    if(l_get_str)
+        DAP_DELETE(l_get_str);
+    else if ( l_http_pvt->request_size)
         dap_events_socket_write_unsafe( a_esocket, l_http_pvt->request, l_http_pvt->request_size);
-    DAP_DELETE(l_get_str);
     dap_string_free(l_request_headers, true);
 
 }
diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c
index 1985ba99853ce53bf115bf284421beb8971baac2..1d0e361b64abb67a664f4ae66683e33bcb9af99f 100644
--- a/dap-sdk/net/core/dap_events_socket.c
+++ b/dap-sdk/net/core/dap_events_socket.c
@@ -32,7 +32,6 @@
 #include <sys/epoll.h>
 #include <sys/select.h>
 #include <unistd.h>
-#include <fcntl.h>
 #else
 #include <winsock2.h>
 #include <windows.h>
@@ -41,6 +40,7 @@
 #include <io.h>
 #include "wepoll.h"
 #endif
+#include <fcntl.h>
 #include <pthread.h>
 
 #include "dap_common.h"
@@ -184,16 +184,23 @@ dap_events_socket_t * s_create_type_pipe(dap_worker_t * a_w, dap_events_socket_c
     l_errbuf[0]=0;
     if( pipe(l_pipe) < 0 ){
         l_errno = errno;
+#if defined DAP_OS_UNIX
         strerror_r(l_errno, l_errbuf, sizeof (l_errbuf));
         log_it( L_ERROR, "Error detected, can't create pipe(): '%s' (%d)", l_errbuf, l_errno);
+#elif defined DAP_OS_WINDOWS
+        log_it( L_ERROR, "Can't create pipe, errno: %d", l_errno);
+#endif
         DAP_DELETE(l_es);
         return NULL;
     }//else
      //   log_it(L_DEBUG, "Created one-way unnamed bytestream pipe %d->%d", l_pipe[0], l_pipe[1]);
     l_es->fd = l_pipe[0];
     l_es->fd2 = l_pipe[1];
+#if defined DAP_OS_UNIX
     fcntl( l_pipe[0], F_SETFL, O_NONBLOCK);
     fcntl( l_pipe[1], F_SETFL, O_NONBLOCK);
+    // this sort of fd doesn't suit ioctlsocket()...
+#endif
 
 #else
 #error "No defined s_create_type_pipe() for your platform"
@@ -425,8 +432,20 @@ dap_events_socket_t * s_create_type_event(dap_worker_t * a_w, dap_events_socket_
         }
         DAP_DELETE(l_es);
         return NULL;
-    }else
+    }else {
+        l_es->fd2 = l_es->fd;
         log_it(L_DEBUG, "Created eventfd descriptor %d", l_es->fd );
+    }
+#elif defined DAP_OS_WINDOWS
+    int l_pipe[2];
+    if (pipe(l_pipe) < 0) {
+        log_it(L_ERROR, "Can't create pipe for event type, error: %d", errno);
+        DAP_DELETE(l_es);
+        return NULL;
+    }
+    l_es->fd2   = l_pipe[0];
+    l_es->fd    = l_pipe[1];
+    log_it(L_DEBUG, "Created pipe for event type, %d -> %d", l_es->fd2, l_es->fd);
 #endif
     return l_es;
 }
@@ -480,11 +499,24 @@ void dap_events_socket_event_proc_input_unsafe(dap_events_socket_t *a_esocket)
             log_it(L_WARNING, "Can't read packet from event fd: \"%s\"(%d)", l_errbuf, l_errno);
         }else
             return; // do nothing
+#elif defined DAP_OS_WINDOWS
+        uint64_t l_value;
+        int l_ret;
+        switch (l_ret = read(a_esocket->fd, &l_value, 8)) {
+        case -1:
+            log_it(L_CRITICAL, "Can't read from event socket pipe, error: %d", errno);
+            break;
+        case 0:
+            return;
+        default:
+            a_esocket->callbacks.event_callback(a_esocket, l_value);
+            break;
+        }
 #else
 #error "No Queue fetch mechanism implemented on your platform"
 #endif
     }else
-        log_it(L_ERROR, "Queue socket %d accepted data but callback is NULL ", a_esocket->socket);
+        log_it(L_ERROR, "Event socket %d accepted data but callback is NULL ", a_esocket->socket);
 }
 
 
@@ -627,6 +659,13 @@ int dap_events_socket_event_signal( dap_events_socket_t * a_es, uint64_t a_value
         return l_errno;
     else
         return 1;
+#elif defined DAP_OS_WINDOWS
+    byte_t l_bytes[sizeof(void*)] = { 0 };
+    if(write(a_es->fd2, l_bytes, sizeof(l_bytes)) == -1) {
+        return errno;
+    } else {
+        return 0;
+    }
 #else
 #error "Not implemented dap_events_socket_event_signal() for this platform"
 #endif
diff --git a/dap-sdk/net/core/dap_proc_thread.c b/dap-sdk/net/core/dap_proc_thread.c
index 86afea3b6d3b8f3b5b0bfbc43f5f4b9f6f60e933..1cd2757ba4c14fec8367ef177599e1e838e0a394 100644
--- a/dap-sdk/net/core/dap_proc_thread.c
+++ b/dap-sdk/net/core/dap_proc_thread.c
@@ -215,7 +215,7 @@ static void * s_proc_thread_function(void * a_arg)
 #ifdef DAP_EVENTS_CAPS_EPOLL
         //log_it(L_DEBUG, "Epoll_wait call");
         int l_selected_sockets = epoll_wait(l_thread->epoll_ctl, l_epoll_events, DAP_EVENTS_SOCKET_MAX, -1);
-        size_t l_sockets_max = l_selected_sockets;
+        size_t l_sockets_max = (size_t)l_selected_sockets;
 #elif defined (DAP_EVENTS_CAPS_POLL)
         int l_selected_sockets = poll(l_poll,l_poll_count,-1);
         size_t l_sockets_max = l_poll_count;
@@ -226,10 +226,14 @@ static void * s_proc_thread_function(void * a_arg)
         if(l_selected_sockets == -1) {
             if( errno == EINTR)
                 continue;
+#if defined DAP_OS_UNIX
             int l_errno = errno;
             char l_errbuf[128];
             strerror_r(l_errno, l_errbuf, sizeof (l_errbuf));
             log_it(L_ERROR, "Proc thread #%d got errno:\"%s\" (%d)", l_thread->cpu_id , l_errbuf, l_errno);
+#elif DAP_OS_WINDOWS
+            log_it(L_ERROR, "Error occured on thread #%d, errno: %d", l_thread->cpu_id , errno);
+#endif
             break;
         }
         for(size_t n = 0; n < l_sockets_max; n++) {
@@ -268,23 +272,29 @@ static void * s_proc_thread_function(void * a_arg)
             time_t l_cur_time = time( NULL);
             l_cur->last_time_active = l_cur_time;
             if (l_flag_error){
+#if defined DAP_OS_UNIX
                 int l_errno = errno;
                 char l_errbuf[128];
                 strerror_r(l_errno, l_errbuf,sizeof (l_errbuf));
                 log_it(L_ERROR,"Some error on proc thread #%u with %d socket: %s(%d)",l_thread->cpu_id, l_cur->socket, l_errbuf, l_errno);
+#elif defined DAP_OS_WINDOWS
+                log_it(L_ERROR,"Some error occured on thread #%u with socket %d, errno: %d",l_thread->cpu_id, l_cur->socket, errno);
+#endif
                 if(l_cur->callbacks.error_callback)
-                    l_cur->callbacks.error_callback(l_cur,errno);
+                    l_cur->callbacks.error_callback(l_cur, errno);
             }
             if (l_flag_read ){
                 switch (l_cur->type) {
                     case DESCRIPTOR_TYPE_QUEUE:
-                            dap_events_socket_queue_proc_input_unsafe(l_cur);
-                    break;
+                        dap_events_socket_queue_proc_input_unsafe(l_cur);
+                        break;
                     case DESCRIPTOR_TYPE_EVENT:
-                            dap_events_socket_event_proc_input_unsafe (l_cur);
-                    break;
+                        dap_events_socket_event_proc_input_unsafe (l_cur);
+                        break;
 
-                    default:{ log_it(L_ERROR, "Unprocessed descriptor type accepted in proc thread loop"); }
+                    default:
+                        log_it(L_ERROR, "Unprocessed descriptor type accepted in proc thread loop");
+                        break;
                 }
             }
             if(l_cur->flags & DAP_SOCK_SIGNAL_CLOSE){
diff --git a/dap-sdk/net/core/dap_timerfd.c b/dap-sdk/net/core/dap_timerfd.c
index d688bb43366c1985d67edd7124868f071634c6b2..00f9ed6c37c6145118d6a73ddfc5b89e79713a80 100644
--- a/dap-sdk/net/core/dap_timerfd.c
+++ b/dap-sdk/net/core/dap_timerfd.c
@@ -20,17 +20,19 @@
     You should have received a copy of the GNU General Public License
     along with any DAP SDK based project.  If not, see <http://www.gnu.org/licenses/>.
 */
-#ifdef DAP_OS_UNIX
+
 #include <stdint.h>
 #include <stdbool.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
-#include <sys/time.h>
-#include <sys/timerfd.h>
 #include <inttypes.h>
 
+#ifdef DAP_OS_WINDOWS
+#include <winsock2.h>
+#endif
+
 #include "dap_common.h"
 #include "dap_events.h"
 #include "dap_worker.h"
@@ -62,6 +64,18 @@ dap_timerfd_t* dap_timerfd_start(uint64_t a_timeout_ms, dap_timerfd_callback_t a
      return dap_timerfd_start_on_worker(dap_events_worker_get_auto(), a_timeout_ms, a_callback, a_callback_arg);
 }
 
+#ifdef DAP_OS_WINDOWS
+void __stdcall TimerAPCb(void* arg, DWORD low, DWORD high) {  // Timer high value.
+    UNREFERENCED_PARAMETER(low)
+    UNREFERENCED_PARAMETER(high)
+    dap_timerfd_t *l_timerfd = (dap_timerfd_t *)arg;
+    byte_t l_bytes[sizeof(void*)] = { 0 };
+    if (write(l_timerfd->pipe_in, l_bytes, sizeof(l_bytes)) == -1) {
+        log_it(L_CRITICAL, "Error occured on writing into pipe from APC, errno: %d", errno);
+    }
+}
+#endif
+
 /**
  * @brief dap_timerfd_start_on_worker
  * @param a_worker
@@ -73,10 +87,13 @@ dap_timerfd_t* dap_timerfd_start(uint64_t a_timeout_ms, dap_timerfd_callback_t a
 dap_timerfd_t* dap_timerfd_start_on_worker(dap_worker_t * a_worker, uint64_t a_timeout_ms, dap_timerfd_callback_t a_callback, void *a_callback_arg)
 
 {
+    dap_timerfd_t *l_timerfd = DAP_NEW(dap_timerfd_t);
+#if defined DAP_OS_UNIX
     struct itimerspec l_ts;
     int l_tfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
     if(l_tfd == -1) {
         log_it(L_WARNING, "dap_timerfd_start() failed: timerfd_create() errno=%d\n", errno);
+        DAP_DELETE(l_timerfd);
         return NULL;
     }
     // repeat never
@@ -88,11 +105,33 @@ dap_timerfd_t* dap_timerfd_start_on_worker(dap_worker_t * a_worker, uint64_t a_t
     if(timerfd_settime(l_tfd, 0, &l_ts, NULL) < 0) {
         log_it(L_WARNING, "dap_timerfd_start() failed: timerfd_settime() errno=%d\n", errno);
         close(l_tfd);
+        DAP_DELETE(l_timerfd);
         return NULL;
     }
-
-    // create dap_timerfd_t structure
-    dap_timerfd_t *l_timerfd = DAP_NEW(dap_timerfd_t);
+#elif defined DAP_OS_WINDOWS
+    HANDLE l_th = CreateWaitableTimer(NULL, true, NULL);
+    if (!l_th) {
+        log_it(L_CRITICAL, "Waitable timer not created, error %d", GetLastError());
+        DAP_DELETE(l_timerfd);
+        return NULL;
+    }
+    int l_pipe[2];
+    if (pipe(l_pipe) < 0) {
+        log_it(L_ERROR, "Can't create pipe, error: %d", errno);
+        DAP_DELETE(l_timerfd);
+        return NULL;
+    }
+    unsigned long l_mode = 0;
+    int l_tfd = l_pipe[0];
+    LARGE_INTEGER l_due_time;
+    l_due_time.QuadPart = (long long)a_timeout_ms * _MSEC;
+    if (!SetWaitableTimer(l_th, &l_due_time, 0, TimerAPCb, l_timerfd, false)) {
+        log_it(L_CRITICAL, "Waitable timer not set, error %d", GetLastError());
+        CloseHandle(l_th);
+        DAP_DELETE(l_timerfd);
+        return NULL;
+    }
+#endif
 
     // create events_socket for timer file descriptor
     dap_events_socket_callbacks_t l_s_callbacks;
@@ -105,13 +144,18 @@ dap_timerfd_t* dap_timerfd_start_on_worker(dap_worker_t * a_worker, uint64_t a_t
     l_events_socket->_inheritor = l_timerfd;
 
     // fill out dap_timerfd_t structure
-    l_timerfd->timeout_ms = a_timeout_ms;
     l_timerfd->tfd = l_tfd;
     l_timerfd->events_socket = l_events_socket;
     l_timerfd->callback = a_callback;
     l_timerfd->callback_arg = a_callback_arg;
+#ifdef DAP_OS_WINDOWS
+    l_timerfd->th               = l_th;
+    l_timerfd->pipe_in          = l_pipe[1];
+    /*ioctlsocket(l_pipe[0], FIONBIO, &l_mode);
+    l_mode = 0;
+    ioctlsocket(l_pipe[1], FIONBIO, &l_mode);*/
+#endif
     dap_worker_add_events_socket(l_events_socket, a_worker);
-
     return l_timerfd;
 }
 
@@ -125,6 +169,7 @@ static void s_es_callback_timer(struct dap_events_socket *a_event_sock)
     // run user's callback
     if(l_timerfd->callback && l_timerfd->callback(l_timerfd->callback_arg)) {
         //printf("\nread() returned %d, %d\n", l_ptiu64, l_read_ret);
+#if defined DAP_OS_UNIX
         struct itimerspec l_ts;
         // repeat never
         l_ts.it_interval.tv_sec = 0;
@@ -135,9 +180,20 @@ static void s_es_callback_timer(struct dap_events_socket *a_event_sock)
         if(timerfd_settime(l_timerfd->tfd, 0, &l_ts, NULL) < 0) {
             log_it(L_WARNING, "callback_timerfd_read() failed: timerfd_settime() errno=%d\n", errno);
         }
+#elif defined DAP_OS_WINDOWS
+        LARGE_INTEGER l_due_time;
+        l_due_time.QuadPart = (long long)l_timerfd->timeout_ms * _MSEC;
+        if (!SetWaitableTimer(l_timerfd->th, &l_due_time, 0, TimerAPCb, l_timerfd, false)) {
+            log_it(L_CRITICAL, "Waitable timer not reset, error %d", GetLastError());
+            CloseHandle(l_timerfd->th);
+        }
+#endif
         dap_events_socket_set_readable_unsafe(a_event_sock, true);
     } else {
         close(l_timerfd->tfd);
+#if defined DAP_OS_WINDOWS
+        CloseHandle(l_timerfd->th);
+#endif
         dap_events_socket_remove_and_delete_unsafe(l_timerfd->events_socket, false);
     }
 }
@@ -151,6 +207,3 @@ void dap_timerfd_delete(dap_timerfd_t *l_timerfd)
 {
     dap_events_socket_remove_and_delete_mt(l_timerfd->events_socket->worker, l_timerfd->events_socket);
 }
-#else
-#error "No dap_timerfd realization for your platform"
-#endif
diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c
index 0635cde1889d917ea2f079788b1593a5453b8650..dc5d93d69c237a47ccdcc0e5a64f1aeab129e112 100644
--- a/dap-sdk/net/core/dap_worker.c
+++ b/dap-sdk/net/core/dap_worker.c
@@ -521,7 +521,7 @@ static void s_queue_add_es_callback( dap_events_socket_t * a_es, void * a_arg)
             l_es_new->me = l_es_new;
             HASH_ADD(hh_worker, w->esockets, me, sizeof(void *), l_es_new );
             w->event_sockets_count++;
-            log_it(L_DEBUG, "Added socket %d on worker %u", l_es_new->socket, w->id);
+            //log_it(L_DEBUG, "Added socket %d on worker %u", l_es_new->socket, w->id);
             if (l_es_new->callbacks.worker_assign_callback)
                 l_es_new->callbacks.worker_assign_callback(l_es_new, w);
 
diff --git a/dap-sdk/net/core/include/dap_timerfd.h b/dap-sdk/net/core/include/dap_timerfd.h
index 40f29e636afee56e78fb89666bea38ae57a07da8..b578d02ccf884e6bdb5abf27fc4888bd2a53522e 100644
--- a/dap-sdk/net/core/include/dap_timerfd.h
+++ b/dap-sdk/net/core/include/dap_timerfd.h
@@ -27,14 +27,18 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#if defined DAP_OS_UNIX
 #include <sys/time.h>
 #include <sys/timerfd.h>
+#elif defined DAP_OS_WINDOWS
+#define _MSEC -10000
+#endif
 #include <inttypes.h>
 
 #include "dap_common.h"
 #include "dap_events_socket.h"
 
-typedef bool (*dap_timerfd_callback_t)(void* ); // Callback for timer
+typedef bool (*dap_timerfd_callback_t)(void* ); // Callback for timer. If return true, it will be called after next timeout
 
 typedef struct dap_timerfd {
     uint64_t timeout_ms;
@@ -42,6 +46,10 @@ typedef struct dap_timerfd {
     dap_events_socket_t *events_socket;
     dap_timerfd_callback_t callback;
     void *callback_arg;
+#ifdef DAP_OS_WINDOWS
+    HANDLE th;
+    int pipe_in;
+#endif
 } dap_timerfd_t;
 
 int dap_timerfd_init();
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index c98f27266557d891af8b3a52caa0ae767d45e8fb..075ad8a8a11266981663eaa48849eb87f8ec6dc8 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -490,8 +490,7 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
                 dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect(l_link_info);
                 if (l_node_client) {
                     // wait connected
-                    int timeout_ms = 5000; //5 sec = 5000 ms
-                    int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
+                    int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, 10000 );
                     if (res == 0 ) {
                         log_it(L_DEBUG, "Established connection with "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_link_info->hdr.address));
                         l_pvt_net->links = dap_list_append(l_pvt_net->links, l_node_client);
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index c8578df1f5d8694343d9ab957faec065f27d3075..ce3d32441e7f634dfe907cb72578f79e7076e4c2 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -1488,6 +1488,10 @@ int com_version(int argc, char ** argv, void *arg_func, char **str_reply)
     (void) argc;
     (void) argv;
     (void) arg_func;
+#ifndef DAP_VERSION
+#pragma message "[!WRN!] DAP_VERSION IS NOT DEFINED. Manual override engaged."
+#define DAP_VERSION 0.9-15
+#endif
     dap_chain_node_cli_set_reply_text(str_reply,
             "%s version %s\n", dap_get_appname(), DAP_VERSION );
     return 0;
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index e0e99708f4028712c9019782e31fe862d4b576c3..497f9280ea22913d3b7aef858253029afa64789b 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -551,9 +551,8 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s
 #ifndef _WIN32
     // prepare for signal waiting
     struct timespec l_cond_timeout;
-    uint32_t l_timeout_s = dap_config_get_item_uint32_default(g_config,"chain_net","status_wait_timeout",10);
     clock_gettime( CLOCK_MONOTONIC, &l_cond_timeout);
-    l_cond_timeout.tv_sec += l_timeout_s;
+    l_cond_timeout.tv_sec += a_timeout_ms/1000;
 #else
     pthread_mutex_unlock( &a_client->wait_mutex );
 #endif
diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c
index 9c6ca9d747a78730ade949bf700a503b5d9f14ff..3291d75684d76f28804feb03ee2e3415365f78bd 100644
--- a/modules/net/srv/dap_chain_net_srv.c
+++ b/modules/net/srv/dap_chain_net_srv.c
@@ -37,6 +37,12 @@
 #include <io.h>
 #endif
 
+#ifdef DAP_OS_LINUX
+#include <dlfcn.h>
+#endif
+#include <json-c/json.h>
+#include <json-c/json_object.h>
+
 #include <pthread.h>
 #include <dirent.h>
 
@@ -101,7 +107,13 @@ int dap_chain_net_srv_init(dap_config_t * a_cfg)
         "        -price_unit <Price Unit> -price_token <Token ticker> [-node_addr <Node Address>] [-tx_cond <TX Cond Hash>] \\\n"
         "        [-expires <Unix time when expires>] [-ext <Extension with params>]\\\n"
         "        [-cert <cert name to sign order>]\\\n"
-        "\tOrder create\n" );
+        "\tOrder create\n"
+            "net_srv -net <chain net name> order static [save | delete]\\\n"
+            "\tStatic nodelist create/delete\n"
+            "net_srv -net <chain net name> order recheck\\\n"
+            "\tCheck the availability of orders\n"
+
+        );
 
     s_load_all();
     return 0;
@@ -167,6 +179,28 @@ void dap_chain_net_srv_deinit(void)
 }
 
 
+static void* get_cdb_func(const char *func_name)
+{
+    void *l_ref_func = NULL;
+    //  find func from dynamic library
+#if defined (DAP_OS_LINUX) && !defined (__ANDROID__)
+    const char * s_default_path_modules = "var/modules";
+    const char * l_cdb_so_name = "libcellframe-node-cdb.so";
+    char *l_lib_path = dap_strdup_printf("%s/%s/%s", g_sys_dir_path, s_default_path_modules, l_cdb_so_name);
+    void* l_cdb_handle = NULL;
+    l_cdb_handle = dlopen(l_lib_path, RTLD_NOW);
+    DAP_DELETE(l_lib_path);
+    if(!l_cdb_handle) {
+        log_it(L_ERROR, "Can't load %s module: %s", l_cdb_so_name, dlerror());
+    }
+    else {
+        l_ref_func = dlsym(l_cdb_handle, func_name);
+        dlclose(l_cdb_handle);
+    }
+#endif
+    return l_ref_func;
+}
+
 /**
  * @brief s_cli_net_srv
  * @param argc
@@ -195,7 +229,7 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re
 
         dap_string_t *l_string_ret = dap_string_new("");
         const char *l_order_str = NULL;
-        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "order", &l_order_str);
+        int l_order_arg_pos = dap_chain_node_cli_find_option_val(argv, arg_index, argc, "order", &l_order_str);
 
         // Order direction
         const char *l_direction_str = NULL;
@@ -518,9 +552,59 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re
                 dap_string_append_printf( l_string_ret, "Missed some required params\n");
                 ret=-5;
             }
+        }else if( dap_strcmp( l_order_str, "recheck" ) == 0 ){
+            //int dap_chain_net_srv_vpn_cdb_server_list_check_orders(dap_chain_net_t *a_net);
+            int (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(dap_chain_net_t *a_net) = NULL;
+            *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_check_orders) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_check_orders");
+            int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders ? (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(l_net) : -5;
+            //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders(l_net);
+            ret = -10;
+
+        }else if( dap_strcmp( l_order_str, "static" ) == 0 ){
+            // find the subcommand directly after the 'order' command
+            int l_subcmd_save = dap_chain_node_cli_find_option_val(argv, l_order_arg_pos + 1, l_order_arg_pos + 2, "save", NULL);
+            int l_subcmd_del = dap_chain_node_cli_find_option_val(argv, l_order_arg_pos + 1, l_order_arg_pos + 2, "delete", NULL) |
+                               dap_chain_node_cli_find_option_val(argv, l_order_arg_pos + 1, l_order_arg_pos + 2, "del", NULL);
+
+            int (*dap_chain_net_srv_vpn_cdb_server_list_static_create)(dap_chain_net_t *a_net) = NULL;
+            int (*dap_chain_net_srv_vpn_cdb_server_list_static_delete)(dap_chain_net_t *a_net) = NULL;
+            //  find func from dinamic library
+            if(l_subcmd_save || l_subcmd_del) {
+                *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_static_create) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_create");
+                *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_static_delete) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_delete");
+            }
+            if(l_subcmd_save) {
+                int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_create ? (*dap_chain_net_srv_vpn_cdb_server_list_static_create)(l_net) : -5;
+                //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_create(l_net);
+                if(l_init_res >= 0){
+                    dap_string_append_printf(l_string_ret, "Static node list saved, %d orders in list\n", l_init_res);
+                    ret = 0;
+                }
+                else{
+                    dap_string_append_printf(l_string_ret, "Static node list not saved, error code %d\n", l_init_res);
+                    ret = -11;
+                }
+
+            } else if(l_subcmd_del) {
+                int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_delete ? (*dap_chain_net_srv_vpn_cdb_server_list_static_delete)(l_net) : -5;
+                //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_delete(l_net);
+                if(!l_init_res){
+                    dap_string_append_printf(l_string_ret, "Static node list deleted\n");
+                    ret = 0;
+                }
+                else if(l_init_res > 0){
+                    dap_string_append_printf(l_string_ret, "Static node list already deleted\n");
+                    ret = -12;
+                }
+                else
+                    dap_string_append_printf(l_string_ret, "Static node list not deleted, error code %d\n", l_init_res);
+            } else {
+                dap_string_append(l_string_ret, "not found subcommand 'save' or 'delete'\n");
+                ret = -13;
+            }
         } else {
-            dap_string_append_printf( l_string_ret, "Unknown subcommand \n");
-            ret=-3;
+            dap_string_append_printf(l_string_ret, "Unknown subcommand '%s'\n", l_order_str);
+            ret = -3;
         }
         dap_chain_node_cli_set_reply_text(a_str_reply, l_string_ret->str);
         dap_string_free(l_string_ret, true);
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index 869461dc4f5340562c2a40ee97251d6fa451f224..60be621e94b8cc5d0937a6d05bc9882044300f84 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -134,21 +134,21 @@ bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_
  * @param a_continent_num [out]
  * @param a_region [out]
  */
-bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order, uint8_t *a_continent_num, char **a_region)
+bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order_static, uint8_t *a_continent_num, char **a_region)
 {
-    if(!a_order || !a_order->ext_size || a_order->ext[0]!=0x52)
+    if(!a_order_static || !a_order_static->ext_size || a_order_static->ext[0]!=0x52)
         return false;
     if(a_continent_num) {
-       if((uint8_t)a_order->ext[1]!=0xff)
-           memcpy(a_continent_num, a_order->ext + 1, sizeof(uint8_t));
+       if((uint8_t)a_order_static->ext[1]!=0xff)
+           memcpy(a_continent_num, a_order_static->ext + 1, sizeof(uint8_t));
         else
            a_continent_num = 0;
     }
     if(a_region) {
-        size_t l_size = a_order->ext_size - sizeof(uint8_t) - 1;
+        size_t l_size = a_order_static->ext_size - sizeof(uint8_t) - 1;
         if(l_size > 0) {
             *a_region = DAP_NEW_SIZE(char, l_size);
-            memcpy(*a_region, a_order->ext + 1 + sizeof(uint8_t), l_size);
+            memcpy(*a_region, a_order_static->ext + 1 + sizeof(uint8_t), l_size);
         }
         else
             *a_region = NULL;
@@ -203,9 +203,12 @@ const char* dap_chain_net_srv_order_continent_to_str(int8_t a_num)
 int8_t dap_chain_net_srv_order_continent_to_num(const char *a_continent_str)
 {
     int8_t l_count = dap_chain_net_srv_order_continents_count();
+    // convert to to upper case
     char *l_continent_str = dap_strup(a_continent_str, -1);
     for(int8_t i = 1; i < l_count; i++) {
+        // convert to to upper case
         char *l_server_continents = dap_strup(s_server_continents[i], -1);
+        // compare strings in upper case
         if(!dap_strcmp(l_continent_str, l_server_continents)) {
             DAP_DELETE(l_server_continents);
             DAP_DELETE(l_continent_str);
@@ -214,7 +217,8 @@ int8_t dap_chain_net_srv_order_continent_to_num(const char *a_continent_str)
         DAP_DELETE(l_server_continents);
     }
     DAP_DELETE(l_continent_str);
-    return -1;
+    // none
+    return 0;
 }
 
 char * dap_chain_net_srv_order_create(
diff --git a/modules/net/srv/include/dap_chain_net_srv_order.h b/modules/net/srv/include/dap_chain_net_srv_order.h
index f4a65545ea90428e278f79e85c0bdab4fda83b7e..a39ef94d3bd625beebecb770cf2b883458c6b720 100644
--- a/modules/net/srv/include/dap_chain_net_srv_order.h
+++ b/modules/net/srv/include/dap_chain_net_srv_order.h
@@ -124,3 +124,17 @@ DAP_STATIC_INLINE char * dap_chain_net_srv_order_get_gdb_group(dap_chain_net_t *
    }
    return NULL;
 }
+
+/**
+* @brief dap_chain_net_srv_order_get_gdb_group_mempool
+* @param l_chain
+* @return
+*/
+DAP_STATIC_INLINE char * dap_chain_net_srv_order_get_nodelist_group(dap_chain_net_t * a_net)
+{
+   if ( a_net ) {
+       const char c_srv_order_group_str[]="service.orders.static_nodelist";
+       return dap_strdup_printf("%s.%s",a_net->pub.gdb_groups_prefix,c_srv_order_group_str);
+   }
+   return NULL;
+}