diff --git a/io/dap_context.c b/io/dap_context.c
index c2ac6741799125cab63a5fede46db714aae00600..db352198212efec227f9495da4de81fc89891c2a 100644
--- a/io/dap_context.c
+++ b/io/dap_context.c
@@ -349,6 +349,7 @@ static void *s_context_thread(void *a_arg)
     pthread_cond_destroy(&l_context->started_cond);
     pthread_mutex_destroy(&l_context->started_mutex);
     DAP_DELETE(l_context);
+    DAP_DELETE(l_msg);
 
     return NULL;
 }
diff --git a/io/dap_proc_thread.c b/io/dap_proc_thread.c
index e8fab8317f409e2740f0f2200ae6a38584260ef1..26d5041323e3cec43b915944d526d13a53214717 100644
--- a/io/dap_proc_thread.c
+++ b/io/dap_proc_thread.c
@@ -37,9 +37,31 @@ static dap_proc_thread_t *s_threads = NULL;
 static int s_context_callback_started(dap_context_t *a_context, void *a_arg);
 static int s_context_callback_stopped(dap_context_t *a_context, void *a_arg);
 
+/**
+ * @brief add and run context to thread
+ * @param a_thread alocated thread memory
+ * @param a_cpu_id cpu id to thread assign
+ * @return result of dap_context_run (0 all OK)
+ */
+
+int dap_proc_thread_create(dap_proc_thread_t *a_thread, int a_cpu_id)
+{
+    dap_return_val_if_pass(!a_thread || a_thread->context, -1);
+
+    a_thread->context = dap_context_new(DAP_CONTEXT_TYPE_PROC_THREAD);
+    a_thread->context->_inheritor = a_thread;
+    int l_ret = dap_context_run(a_thread->context, a_cpu_id, DAP_CONTEXT_POLICY_TIMESHARING,
+                                DAP_CONTEXT_PRIORITY_NORMAL, DAP_CONTEXT_FLAG_WAIT_FOR_STARTED,
+                                s_context_callback_started, s_context_callback_stopped, a_thread);
+    if (l_ret) {
+        log_it(L_CRITICAL, "Create thread failed with code %d", l_ret);
+    }
+    return l_ret;
+}
+
 /**
  * @brief dap_proc_thread_init
- * @param a_cpu_count 0 means autodetect
+ * @param a_threads_count 0 means autodetect
  * @return
  */
 
@@ -50,19 +72,11 @@ int dap_proc_thread_init(uint32_t a_threads_count)
         return -1;
     }
     s_threads = DAP_NEW_Z_SIZE(dap_proc_thread_t, sizeof(dap_proc_thread_t) * s_threads_count);
-    for (uint32_t i = 0; i < s_threads_count; i++) {
-        dap_proc_thread_t *l_thread = s_threads + i;
-        l_thread->context = dap_context_new(DAP_CONTEXT_TYPE_PROC_THREAD);
-        l_thread->context->_inheritor = l_thread;
-        int l_ret = dap_context_run(l_thread->context, i, DAP_CONTEXT_POLICY_TIMESHARING,
-                                    DAP_CONTEXT_PRIORITY_NORMAL, DAP_CONTEXT_FLAG_WAIT_FOR_STARTED,
-                                    s_context_callback_started, s_context_callback_stopped, l_thread);
-        if (l_ret) {
-            log_it(L_CRITICAL, "Create thread failed with code %d", l_ret);
-            return l_ret;
-        }
+    int l_ret = 0;
+    for (uint32_t i = 0; i < s_threads_count && !l_ret; ++i) {
+        l_ret = dap_proc_thread_create(s_threads + i, i);
     }
-    return 0;
+    return l_ret;
 }
 
 /**
@@ -167,7 +181,8 @@ int dap_proc_thread_loop(dap_context_t *a_context)
                !(l_item = s_proc_queue_pull(l_thread, &l_item_priority)))
             pthread_cond_wait(&l_thread->queue_event, &l_thread->queue_lock);
         pthread_mutex_unlock(&l_thread->queue_lock);
-        debug_if(g_debug_reactor, L_DEBUG, "Call callback %p with arg %p on thread %p",
+        if (l_item)
+            debug_if(g_debug_reactor, L_DEBUG, "Call callback %p with arg %p on thread %p",
                                             l_item->callback, l_item->callback_arg, l_thread);
         if (!a_context->signal_exit &&
                 l_item->callback(l_item->callback_arg))
diff --git a/io/include/dap_proc_thread.h b/io/include/dap_proc_thread.h
index 0ba6823228090592d8a4733fe4dfa0eb7f6faebe..716b273fe83134ea9a1ef6e9703765996297dde4 100644
--- a/io/include/dap_proc_thread.h
+++ b/io/include/dap_proc_thread.h
@@ -61,6 +61,7 @@ typedef struct dap_proc_thread {
 
 #define DAP_PROC_THREAD(a) (dap_proc_thread_t *)((a)->_inheritor);
 
+int dap_proc_thread_create(dap_proc_thread_t *a_thread, int a_cpu_id);
 int dap_proc_thread_init(uint32_t a_threads_count);
 void dap_proc_thread_deinit();
 int dap_proc_thread_loop(dap_context_t *a_context);
diff --git a/net/link_manager/dap_link_manager.c b/net/link_manager/dap_link_manager.c
index 04467ee8bf1121ea77c94a1153b06db8f9575e43..12ee05a34405ac775b7c0227d3ffb0f1d55c5aaa 100644
--- a/net/link_manager/dap_link_manager.c
+++ b/net/link_manager/dap_link_manager.c
@@ -245,7 +245,7 @@ void dap_link_manager_deinit()
     DL_FOREACH_SAFE(s_link_manager->nets, it, tmp)
         dap_link_manager_remove_net(((dap_managed_net_t *)it->data)->id);
     pthread_rwlock_destroy(&s_link_manager->links_lock);
-    DAP_DELETE(s_link_manager);
+    DAP_DEL_Z(s_link_manager);
 }
 
 /**