diff --git a/modules/net/dap_dns_server.c b/modules/net/dap_dns_server.c
index 7b5af3b8005250bb1bd806a9819c30b82e7011d8..f67b02f5ecebc89dd3d8de4a2b724b48b185dcf0 100644
--- a/modules/net/dap_dns_server.c
+++ b/modules/net/dap_dns_server.c
@@ -89,10 +89,25 @@ void dap_dns_buf_put_uint32(dap_dns_buf_t *buf, uint32_t val) {
     dap_dns_buf_put_uint16(buf, val);
 }
 
-uint32_t dap_dns_resolve_hostname(char *str) {
+/**
+ * @brief dap_dns_buf_put_uint64 Put uint64 to network order
+ * @param buf DNS buffer structure
+ * @param val uint64 in host order
+ * @return none
+ */
+void dap_dns_buf_put_uint64(dap_dns_buf_t *buf, uint64_t val) {
+    dap_dns_buf_put_uint32(buf, val >> 32);
+    dap_dns_buf_put_uint32(buf, val);
+}
+
+dap_chain_node_info_t *dap_dns_resolve_hostname(char *str) {
     log_it(L_DEBUG, "DNS parser retrieve hostname %s", str);
     uint16_t l_nets_count;
     dap_chain_net_t **l_nets = dap_chain_net_list(&l_nets_count);
+    if (!l_nets_count) {
+        log_it(L_WARNING, "No chain network present");
+        return 0;
+    }
     dap_chain_net_t *l_net = l_nets[rand() % l_nets_count];
     // get nodes list from global_db
     dap_global_db_obj_t *l_objs = NULL;
@@ -102,11 +117,11 @@ uint32_t dap_dns_resolve_hostname(char *str) {
     if(!l_nodes_count || !l_objs)
         return 0;
     size_t l_node_num = rand() % l_nodes_count;
-    dap_chain_node_info_t *l_node_info = (dap_chain_node_info_t *) l_objs[l_node_num].value;
-    struct in_addr addr = l_node_info->hdr.ext_addr_v4;
+    dap_chain_node_info_t *l_node_info = DAP_NEW_Z(dap_chain_node_info_t);
+    memcpy(l_node_info, l_objs[l_node_num].value, sizeof(dap_chain_node_info_t));
     dap_chain_global_db_objs_delete(l_objs, l_nodes_count);
-    log_it(L_DEBUG, "DNS resolver find ip %s", inet_ntoa(addr));
-    return addr.s_addr;
+    log_it(L_DEBUG, "DNS resolver find ip %s", inet_ntoa(l_node_info->hdr.ext_addr_v4));
+    return l_node_info;
 }
 
 /**
@@ -222,7 +237,7 @@ void dap_dns_client_read(dap_client_remote_t *client, void * arg) {
     if (val) {                                          // No other sections should present
         goto cleanup;
     }
-    dap_dns_buf_put_uint16(dns_reply, val);
+    dap_dns_buf_put_uint16(dns_reply, 1);               // 1 aditional section
     int dot_count = 0;
     dap_string_t *dns_hostname = dap_string_new("");
     for (int i = 0; i < qdcount; i++) {
@@ -271,16 +286,16 @@ void dap_dns_client_read(dap_client_remote_t *client, void * arg) {
         }
     }
     // Find ip addr
-    uint32_t ip_addr = 0;
+    dap_chain_node_info_t *l_node_info = NULL;
     if (flags->rcode == DNS_ERROR_NONE) {
         dap_dns_zone_callback_t callback = dap_dns_zone_find(dns_hostname->str);
         if (callback) {
-            ip_addr = callback(dns_hostname->str);
+            l_node_info = callback(dns_hostname->str);
         }
     }
-    if (ip_addr) {
+    if (l_node_info) {
     // Compose DNS answer
-        block_len = DNS_ANSWER_SIZE;
+        block_len = DNS_ANSWER_SIZE * 2;
         dns_reply->data = DAP_REALLOC(dns_reply->data, dns_reply->ptr + block_len);
         val = 0xc000 | DNS_HEADER_SIZE;                // Link to host name
         dap_dns_buf_put_uint16(dns_reply, val);
@@ -289,10 +304,20 @@ void dap_dns_client_read(dap_client_remote_t *client, void * arg) {
         val = DNS_CLASS_TYPE_IN;
         dap_dns_buf_put_uint16(dns_reply, val);
         uint32_t ttl = DNS_TIME_TO_LIVE;
+        dap_dns_buf_put_uint32(dns_reply, ttl);                                    
+        dap_dns_buf_put_uint16(dns_reply, 4);           // RD len for ipv4
+        dap_dns_buf_put_uint32(dns_reply, l_node_info->hdr.ext_addr_v4.s_addr);
+        val = 0xc000 | DNS_HEADER_SIZE;                // Link to host name
+        dap_dns_buf_put_uint16(dns_reply, val);
+        val = DNS_RECORD_TYPE_TXT;
+        dap_dns_buf_put_uint16(dns_reply, val);
+        val = DNS_CLASS_TYPE_IN;
+        dap_dns_buf_put_uint16(dns_reply, val);
         dap_dns_buf_put_uint32(dns_reply, ttl);
-        val = 4;                                        // RD len for ipv4
+        val = sizeof(uint16_t) + sizeof(uint64_t);
         dap_dns_buf_put_uint16(dns_reply, val);
-        dap_dns_buf_put_uint32(dns_reply, ip_addr);
+        dap_dns_buf_put_uint16(dns_reply, l_node_info->hdr.ext_port);
+        dap_dns_buf_put_uint64(dns_reply, l_node_info->hdr.address.uint64);
     } else if (flags->rcode == DNS_ERROR_NONE) {
         flags->rcode = DNS_ERROR_NAME;
     }
diff --git a/modules/net/include/dap_dns_server.h b/modules/net/include/dap_dns_server.h
index b5bc00336b5c04d3536a40802f2b264bed94bdae..bfb8aa2211d588e318b6db1aefd5ea9675e5079b 100644
--- a/modules/net/include/dap_dns_server.h
+++ b/modules/net/include/dap_dns_server.h
@@ -29,6 +29,7 @@
 #endif
 #include "dap_server.h"
 #include "uthash.h"
+#include "dap_chain_node.h"
 
 #define DNS_LISTEN_PORT 53      // UDP
 #define DNS_TIME_TO_LIVE 600    // Seconds
@@ -63,7 +64,7 @@ typedef enum _dap_dns_record_type_t {
     DNS_RECORD_TYPE_MG,     // Mail group member (experimental)
     DNS_RECORD_TYPE_MR,     // Mail rename domain name (experimental)
     DNS_RECORD_TYPE_NULL,   // NULL resource record (experimental)
-    DNS_RECORD_TYPE_WKS,    // Well known server description
+    DNS_RECORD_TYPE_WKS,    // Well known services description
     DNS_RECORD_TYPE_PTR,    // Domain name pointer
     DNS_RECORD_TYPE_HINFO,  // Host information
     DNS_RECORD_TYPE_MINFO,  // Mail box or list information
@@ -95,7 +96,7 @@ typedef struct _dap_dns_message_flags_bits_t {
     int qr : 1;             // 0 - query, 1 - response
 } dap_dns_message_flags_bits_t;
 
-typedef uint32_t (*dap_dns_zone_callback_t) (char *hostname); // Callback for DNS zone operations
+typedef dap_chain_node_info_t *(*dap_dns_zone_callback_t) (char *hostname); // Callback for DNS zone operations
 
 typedef union _dap_dns_message_flags_t {
     dap_dns_message_flags_bits_t flags;