diff --git a/3rdparty/cuttdb/src/cdb_core.c b/3rdparty/cuttdb/src/cdb_core.c
index 177def87f77f848488b5f7d4838bff0efcd0accb..62c35371b3d26b07d6a275e6f1bb87706b2b6153 100644
--- a/3rdparty/cuttdb/src/cdb_core.c
+++ b/3rdparty/cuttdb/src/cdb_core.c
@@ -296,13 +296,13 @@ CDB *cdb_new()
     db = (CDB *)malloc(sizeof(CDB));
     /* I assume all operation in this layer is 'fast', so no mutex used here */
     for(int i = 0; i < MLOCKNUM; i++) 
-        db->mlock[i] = cdb_lock_new(CDB_LOCKSPIN);
-    db->dpclock = cdb_lock_new(CDB_LOCKSPIN);
-    db->pclock = cdb_lock_new(CDB_LOCKSPIN);
-    db->rclock = cdb_lock_new(CDB_LOCKSPIN);
-    db->stlock = cdb_lock_new(CDB_LOCKSPIN);
-    db->oidlock = cdb_lock_new(CDB_LOCKSPIN);
-    db->bflock = cdb_lock_new(CDB_LOCKSPIN);
+        db->mlock[i] = cdb_lock_new(CDB_LOCKMUTEX);
+    db->dpclock = cdb_lock_new(CDB_LOCKMUTEX);
+    db->pclock = cdb_lock_new(CDB_LOCKMUTEX);
+    db->rclock = cdb_lock_new(CDB_LOCKMUTEX);
+    db->stlock = cdb_lock_new(CDB_LOCKMUTEX);
+    db->oidlock = cdb_lock_new(CDB_LOCKMUTEX);
+    db->bflock = cdb_lock_new(CDB_LOCKMUTEX);
     db->bgtask = cdb_bgtask_new();
     /* every thread should has its own errno */
     db->errkey = (pthread_key_t *)malloc(sizeof(pthread_key_t));
diff --git a/3rdparty/cuttdb/src/cdb_lock.c b/3rdparty/cuttdb/src/cdb_lock.c
index d30b46a87ea55d49d6330207686a6b9fbc6552c6..92aab58be4ec916aaa1037e48b62f641176ee9c6 100644
--- a/3rdparty/cuttdb/src/cdb_lock.c
+++ b/3rdparty/cuttdb/src/cdb_lock.c
@@ -22,10 +22,13 @@
 CDBLOCK *cdb_lock_new(int ltype)
 {
     CDBLOCK *lock = NULL;
+#ifndef DAP_OS_DARWIN
     if (ltype == CDB_LOCKSPIN) {
         lock = (CDBLOCK *)malloc(sizeof(CDBLOCK) + sizeof(pthread_spinlock_t));
         pthread_spin_init((pthread_spinlock_t*)&lock->lock, PTHREAD_PROCESS_PRIVATE);
-    } else if (ltype == CDB_LOCKMUTEX) {
+    } else
+#endif
+    if (ltype == CDB_LOCKMUTEX) {
         lock = (CDBLOCK *)malloc(sizeof(CDBLOCK) + sizeof(pthread_mutex_t));
         pthread_mutex_init((pthread_mutex_t*)&lock->lock, NULL);
     }
@@ -38,28 +41,37 @@ CDBLOCK *cdb_lock_new(int ltype)
 
 void cdb_lock_lock(CDBLOCK *lock)
 {
+#ifndef DAP_OS_DARWIN
     if (lock->ltype == CDB_LOCKSPIN)
         pthread_spin_lock((pthread_spinlock_t*)&lock->lock);
-    else if (lock->ltype == CDB_LOCKMUTEX)
-        pthread_mutex_lock((pthread_mutex_t*)&lock->lock);
+    else
+#endif
+        if (lock->ltype == CDB_LOCKMUTEX)
+            pthread_mutex_lock((pthread_mutex_t*)&lock->lock);
 }
 
 
 void cdb_lock_unlock(CDBLOCK *lock)
 {
+#ifndef DAP_OS_DARWIN
     if (lock->ltype == CDB_LOCKSPIN)
         pthread_spin_unlock((pthread_spinlock_t*)&lock->lock);
-    else if (lock->ltype == CDB_LOCKMUTEX)
+    else
+#endif
+        if (lock->ltype == CDB_LOCKMUTEX)
         pthread_mutex_unlock((pthread_mutex_t*)&lock->lock);
 }
 
 
 void cdb_lock_destory(CDBLOCK *lock)
 {
+#ifndef DAP_OS_DARWIN
     if (lock->ltype == CDB_LOCKSPIN)
         pthread_spin_destroy((pthread_spinlock_t*)&lock->lock);
-    else if (lock->ltype == CDB_LOCKMUTEX)
-        pthread_mutex_destroy((pthread_mutex_t*)&lock->lock);
+    else
+#endif
+        if (lock->ltype == CDB_LOCKMUTEX)
+            pthread_mutex_destroy((pthread_mutex_t*)&lock->lock);
 
     free(lock);
 }
@@ -67,10 +79,13 @@ void cdb_lock_destory(CDBLOCK *lock)
 
 int cdb_lock_trylock(CDBLOCK *lock)
 {
+#ifndef DAP_OS_DARWIN
     if (lock->ltype == CDB_LOCKSPIN)
         return pthread_spin_trylock((pthread_spinlock_t*)&lock->lock);
-    else if (lock->ltype == CDB_LOCKMUTEX)
-        return pthread_mutex_trylock((pthread_mutex_t*)&lock->lock);
+    else
+#endif
+        if (lock->ltype == CDB_LOCKMUTEX)
+            return pthread_mutex_trylock((pthread_mutex_t*)&lock->lock);
     return 0;
 }
 
diff --git a/3rdparty/cuttdb/src/cdb_lock.h b/3rdparty/cuttdb/src/cdb_lock.h
index 587fcdb18b40722da27f0eebff9fdb0e05934ce3..bbd13098603bc0e0048d9e752b646ea7fea7d53a 100644
--- a/3rdparty/cuttdb/src/cdb_lock.h
+++ b/3rdparty/cuttdb/src/cdb_lock.h
@@ -19,7 +19,9 @@
 
 enum {
     /* spinlock */
+#ifndef DAP_OS_DARWIN
     CDB_LOCKSPIN,
+#endif
     /* mutex, which may cause OS context switch, mainly used in where Disk IO happens */
     CDB_LOCKMUTEX,
 };
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 161246a8f440a76b8ce1be4db918e6a463b30a98..e9f56d54e6e539a648ee304481e47615b252be0b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,9 +2,10 @@ project(cellframe-sdk C)
 cmake_minimum_required(VERSION 3.0)
 
 set(CMAKE_C_STANDARD 11)
-set(CELLFRAME_SDK_NATIVE_VERSION "2.8-23")
+set(CELLFRAME_SDK_NATIVE_VERSION "2.8-24")
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 set(DAPSDK_MODULES "")
+message("Cellframe modules: ${CELLFRAME_MODULES}")
 
 if (CELLFRAME_MODULES MATCHES "core")
     SET(DAPSDK_MODULES "${DAPSDK_MODULES} core crypto")
@@ -47,7 +48,7 @@ set(CELLFRAME_LIBS "")
 # Core libs from dap-sdk
 if (CELLFRAME_MODULES MATCHES "core")
     message("[+] Module 'core'")
-    set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_core dap_crypto m pthread)
+    set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_core dap_app_cli dap_crypto m pthread)
 endif()
 
 # General chain libs
diff --git a/cmake/OS_Detection.cmake b/cmake/OS_Detection.cmake
index 4176d19195fab3c37991b1661630b2a66ba4269f..761dc527d54789df7e2032ee1ff7c303460908e3 100644
--- a/cmake/OS_Detection.cmake
+++ b/cmake/OS_Detection.cmake
@@ -47,6 +47,7 @@ if(UNIX)
     if (APPLE)
         add_definitions ("-DDAP_OS_DARWIN -DDARWIN -DDAP_OS_BSD")
         set(DARWIN ON)
+        set(BSD ON)
     endif()
     
     if (${CMAKE_SYSTEM_NAME} MATCHES "BSD" )
@@ -66,8 +67,17 @@ if(UNIX)
         else()
 	    set(_CCOPT "-Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -Wl,--gc-sections -Wl,--strip-all -std=gnu11")
         endif()
-    endif()
-    if (BSD)
+    elseif (DARWIN)
+        if(DAP_DEBUG)
+          set(_CCOPT "-L/usr/local/lib -I/usr/local/include -DDAP_DEBUG -Wall -Wno-unused-command-line-argument -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing")
+          set(_LOPT "-L/usr/local/lib ")
+          SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
+        else()
+          set(_CCOPT "-L /usr/local/lib -I/usr/local/include -Wno-deprecated-declarations -Wno-unused-command-line-argument -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -std=gnu11")
+          set(_LOPT "-L /usr/local/lib ")
+          SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L/usr/local/lib")
+        endif()
+    elseif(BSD)
         if(DAP_DEBUG)
 	  set(_CCOPT "-L/usr/local/lib -I/usr/local/include -DDAP_DEBUG -Wall -Wno-unused-command-line-argument -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -pg -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing")
           set(_LOPT "-pg -L/usr/local/lib ")
diff --git a/dap-sdk/CMakeLists.txt b/dap-sdk/CMakeLists.txt
index 1ebf8ea8c9411dcf736b6ec1218ee91a00d4a23a..b59160cb13fd9d12b6e77d6a5ad637d561cecab1 100644
--- a/dap-sdk/CMakeLists.txt
+++ b/dap-sdk/CMakeLists.txt
@@ -1,9 +1,6 @@
-set(DAP_SDK_NATIVE_VERSION "2.0-14")
-# Core 
-if (DAPSDK_MODULES MATCHES "core")
-    # Core
-    add_subdirectory(core)
-endif()
+set(DAP_SDK_NATIVE_VERSION "2.1-0")
+# Core, add it always
+add_subdirectory(core)
 if (DAPSDK_MODULES MATCHES "crypto")
     # Cryptography
     add_subdirectory(crypto)
diff --git a/dap-sdk/core/CMakeLists.txt b/dap-sdk/core/CMakeLists.txt
index 5612789c0eb6174e47525739a085e6759e482b33..60cb7dc92bb74181db1175cbff2a015ee55576f3 100755
--- a/dap-sdk/core/CMakeLists.txt
+++ b/dap-sdk/core/CMakeLists.txt
@@ -43,7 +43,11 @@ endif()
 
 if(UNIX)
     add_subdirectory(src/unix)
-    target_link_libraries(${PROJECT_NAME} dap_core_unix rt)
+    if(DARWIN)
+        target_link_libraries(${PROJECT_NAME} dap_core_unix)
+    else()
+        target_link_libraries(${PROJECT_NAME} dap_core_unix rt)
+    endif()
 endif()
 
 if(DARWIN)
diff --git a/dap-sdk/net/client/CMakeLists.txt b/dap-sdk/net/client/CMakeLists.txt
index 4e88cd3c00f1a6e1f48d5a9a2a13c07dd930a87a..febe04a7335fd3e77dcc3d5ba758a172dc4502be 100644
--- a/dap-sdk/net/client/CMakeLists.txt
+++ b/dap-sdk/net/client/CMakeLists.txt
@@ -9,7 +9,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CLIENT_HEADERS} ${DAP_CLIENT_SOURCES})
 
 target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_http_server dap_enc_server dap_stream dap_session dap_stream_ch json-c)
 
-if(UNIX AND NOT ANDROID)
+if(UNIX AND NOT ANDROID AND NOT DARWIN)
     target_link_libraries(${PROJECT_NAME} rt)
 endif()
 
diff --git a/dap-sdk/net/core/CMakeLists.txt b/dap-sdk/net/core/CMakeLists.txt
index f8e4ce4246ee2f671b2fb4a84dd7d1149a4855ff..c1176524e4906c864b30309e698af4554e52893d 100644
--- a/dap-sdk/net/core/CMakeLists.txt
+++ b/dap-sdk/net/core/CMakeLists.txt
@@ -24,7 +24,7 @@ if(WIN32)
 endif()
 
 if(UNIX)
-  target_link_libraries(${PROJECT_NAME} dap_core dap_crypto rt)
+  target_link_libraries(${PROJECT_NAME} dap_core dap_crypto)
 
   if(NOT ANDROID)
       target_link_libraries(${PROJECT_NAME} pthread)
diff --git a/dap-sdk/net/server/http_server/CMakeLists.txt b/dap-sdk/net/server/http_server/CMakeLists.txt
index 05eaf454d8bac09a32b60942944a764979df4406..656f8e66cfd03d9b5b471a7847b230ee44bfb7e7 100644
--- a/dap-sdk/net/server/http_server/CMakeLists.txt
+++ b/dap-sdk/net/server/http_server/CMakeLists.txt
@@ -21,6 +21,10 @@ target_include_directories(${PROJECT_NAME} INTERFACE . http_client/include/)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../../3rdparty/uthash/src)
 
+if(DARWIN)
+    target_include_directories(${PROJECT_NAME} PRIVATE /usr/local/include)
+endif()
+
 if(WIN32)
   target_link_libraries(dap_http_server dap_core dap_crypto dap_server_core magic regex tre intl iconv
   KERNEL32
diff --git a/dap-sdk/net/server/http_server/dap_http.c b/dap-sdk/net/server/http_server/dap_http.c
index 6b27d5449f1b4c5f7647bb15a08a0725ac705df6..b931d229d80fee1d272d23c0396e55eaad071893 100644
--- a/dap-sdk/net/server/http_server/dap_http.c
+++ b/dap-sdk/net/server/http_server/dap_http.c
@@ -167,5 +167,6 @@ dap_http_url_proc_t * dap_http_add_proc(dap_http_t *a_http, const char *a_url_pa
     HASH_ADD_STR( a_http->url_proc, url, l_url_proc );
 
     log_it( L_DEBUG, "Added URL processor for '%s' path", l_url_proc->url );
+    return l_url_proc;
 }
 
diff --git a/modules/net/CMakeLists.txt b/modules/net/CMakeLists.txt
index 97ab46d7e9d559de36db6a1bb18e50d91e47fa4e..2df24764a7a786494f0d3e48b6cd1c6ae1012e01 100644
--- a/modules/net/CMakeLists.txt
+++ b/modules/net/CMakeLists.txt
@@ -37,16 +37,16 @@ endif()
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS} ${IPUTILS_SRCS} ${IPUTILS_HEADERS})
 
 if(WIN32)
-  target_link_libraries(dap_chain_net dap_core dap_crypto dap_client dap_ dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain dap_chain_crypto dap_chain_wallet dap_chain_net_srv
+  target_link_libraries(dap_core dap_chain_net dap_crypto dap_client dap_server_core dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain dap_chain_crypto dap_chain_wallet dap_chain_net_srv
                             dap_chain_mempool dap_chain_global_db dap_chain_net_srv_stake dap_chain_cs_none)
 endif()
 
 if(LINUX)
-    target_link_libraries(${PROJECT_NAME} dap_core dap_crypto  dap_notify_srv dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain
+    target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_notify_srv dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain
       dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_chain_global_db dap_chain_net_srv_stake dap_chain_cs_none
       resolv )
 elseif(BSD)
-    target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_notify_srv dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain
+    target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_notify_srv dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain
       dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_chain_global_db dap_chain_net_srv_stake dap_chain_cs_none )
 endif()
 
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index c7f56e6332f6b42f0b371239cd08b3f789b20ce6..c8aa4d25e17ccc2860566b7d571c969df8006d14 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -988,7 +988,9 @@ static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name ,
 #ifndef _WIN32
     pthread_condattr_t l_attr;
     pthread_condattr_init( &l_attr );
+#ifndef DAP_OS_DARWIN
     pthread_condattr_setclock( &l_attr, CLOCK_MONOTONIC );
+#endif
     pthread_cond_init( &PVT(ret)->state_proc_cond, &l_attr );
 #else
     PVT(ret)->state_proc_cond = CreateEventA( NULL, FALSE, FALSE, NULL );
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 0aef4479770b0ed353d7a0d09e5c71dde8c2d1bf..c7154e822196f830532c5d72625327352f1ed13a 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -681,7 +681,9 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t
 #ifndef _WIN32
     pthread_condattr_t attr;
     pthread_condattr_init(&attr);
+#ifndef DAP_OS_DARWIN
     pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
+#endif
     pthread_cond_init(&l_node_client->wait_cond, &attr);
 #else
     l_node_client->wait_cond = CreateEventA( NULL, FALSE, FALSE, NULL );
diff --git a/modules/net/dap_chain_node_ping.c b/modules/net/dap_chain_node_ping.c
index 353bf48fe476ce73cd43c8d7a77d6cca992037a0..bfd102f425675c3be456c92d206172969f2ebe1c 100644
--- a/modules/net/dap_chain_node_ping.c
+++ b/modules/net/dap_chain_node_ping.c
@@ -170,7 +170,7 @@ int wait_node_ping(pthread_t l_thread, int timeout_ms)
     timeout_ms *= 1000;
     l_wait_time.tv_sec += timeout_ms / DAP_USEC_PER_SEC;
     l_wait_time.tv_nsec += 1000 * (timeout_ms % DAP_USEC_PER_SEC);
-#if !defined(_WIN32) && !defined(__ANDROID__)
+#if !defined(_WIN32) && !defined(__ANDROID__) && !defined (DAP_OS_DARWIN)
     int res = pthread_timedjoin_np(l_thread, (void **) &l_ping_time, &l_wait_time);
 #else
     int res = pthread_join(l_thread, (void **) &l_ping_time);