diff --git a/dap_chain_net_srv_vpn_cdb.c b/dap_chain_net_srv_vpn_cdb.c
index 92fedc963516f6a81e49f8e366c81c9ee5c06b92..7ad40d6b94366ca091f99c6b6dd158a3a173b4cf 100644
--- a/dap_chain_net_srv_vpn_cdb.c
+++ b/dap_chain_net_srv_vpn_cdb.c
@@ -284,8 +284,18 @@ void dap_chain_net_srv_vpn_cdb_auth_after(enc_http_delegate_t* a_delegate, const
         // Try to load from gdb
         char *l_tx_cond_gdb_group =  dap_strdup_printf( "%s.%s.tx_cond", l_tpl->net->pub.name, DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX);
         log_it(L_DEBUG, "Checkout group %s", l_tx_cond_gdb_group);
-        dap_chain_hash_fast_t *l_tx_cond_hash =
-            (dap_chain_hash_fast_t*) dap_chain_global_db_gr_get(a_login, &l_gdb_group_size, l_tx_cond_gdb_group);
+        // get key for tx_cond
+        char *l_user_key;
+        {
+            dap_chain_hash_fast_t l_hash = { 0 };
+            char *l_key_hash_str;
+            if(dap_hash_fast(a_pkey_b64, dap_strlen(a_pkey_b64), &l_hash))
+                l_key_hash_str = dap_chain_hash_fast_to_str_new(&l_hash);
+            l_user_key = dap_strdup_printf("%s/%s", a_login, l_key_hash_str);
+            DAP_DELETE(l_key_hash_str);
+        }
+        log_it(L_DEBUG, "\ndbg l_user_key=%s\n", l_user_key);
+        dap_chain_hash_fast_t *l_tx_cond_hash = (dap_chain_hash_fast_t*) dap_chain_global_db_gr_get(l_user_key, &l_gdb_group_size, l_tx_cond_gdb_group);
 
         // Check for entry size
         if (l_gdb_group_size && l_gdb_group_size != sizeof(dap_chain_hash_fast_t)) {
@@ -333,12 +343,13 @@ void dap_chain_net_srv_vpn_cdb_auth_after(enc_http_delegate_t* a_delegate, const
                 log_it(L_ERROR, "Can't create condition for user");
             } else {
                 // save transaction for login
-                dap_chain_global_db_gr_set(a_login, l_tx_cond_hash, sizeof(dap_chain_hash_fast_t), l_tx_cond_gdb_group);
+                dap_chain_global_db_gr_set(l_user_key, l_tx_cond_hash, sizeof(dap_chain_hash_fast_t), l_tx_cond_gdb_group);
                 log_it(L_NOTICE, "User \"%s\": created conditioned transaction from %s(%s) on "
                                 , a_login, l_tpl->wallet_name, l_addr_from_str);
             }
             DAP_DELETE( l_addr_from_str );
         }
+        DAP_DELETE(l_user_key);
         // dbg
         //dap_ledger_t * l_ledger = dap_chain_ledger_by_net_name( l_tpl->net->pub.name);
         //dap_chain_datum_tx_t *l_tx = dap_chain_ledger_tx_find_by_hash( l_ledger, l_tx_cond_hash);
diff --git a/dap_chain_net_srv_vpn_cdb_auth.c b/dap_chain_net_srv_vpn_cdb_auth.c
index 0e277e0147d14f8ab05420f8f78c2086d7767a58..06aef6a66f37dd3fe4a8204a5fef740b9a458e7a 100644
--- a/dap_chain_net_srv_vpn_cdb_auth.c
+++ b/dap_chain_net_srv_vpn_cdb_auth.c
@@ -153,7 +153,7 @@ int dap_chain_net_srv_vpn_cdb_auth_check(const char * a_login, const char * a_pa
 
     char * l_hash_str = dap_strdup_printf("%s%s",a_password, s_salt_str );
     dap_chain_hash_fast_t l_password_hash = {0};
-    dap_hash_fast(l_hash_str,strlen(l_hash_str), &l_password_hash );
+    dap_hash_fast(l_hash_str,dap_strlen(l_hash_str), &l_password_hash );
     DAP_DELETE(l_hash_str);
 
     l_ret = (memcmp(&l_password_hash, l_gdb_password_hash,sizeof (l_password_hash) ) == 0)? 0: -2;
@@ -231,7 +231,7 @@ int dap_chain_net_srv_vpn_cdb_auth_cli_cmd (    const char *a_user_str,int a_arg
             if (l_password_str){
                 char * l_hash_str = dap_strdup_printf("%s%s",l_password_str, s_salt_str );
                 dap_chain_hash_fast_t *l_password_hash = DAP_NEW_Z(dap_chain_hash_fast_t);
-                dap_hash_fast(l_hash_str,strlen(l_hash_str), l_password_hash );
+                dap_hash_fast(l_hash_str,dap_strlen(l_hash_str), l_password_hash );
                 DAP_DELETE(l_hash_str);
                 dap_chain_global_db_gr_set(dap_strdup(l_login_str), l_password_hash,sizeof(*l_password_hash),s_group_password );
             }
@@ -627,7 +627,7 @@ static void s_http_enc_proc(enc_http_delegate_t *a_delegate, void * a_arg)
                         // Hash password with salt
                         char * l_hash_str = dap_strdup_printf("%s%s",l_password, s_salt_str );
                         dap_chain_hash_fast_t *l_password_hash = DAP_NEW_Z(dap_chain_hash_fast_t);
-                        dap_hash_fast(l_hash_str,strlen(l_hash_str), l_password_hash );
+                        dap_hash_fast(l_hash_str,dap_strlen(l_hash_str), l_password_hash );
                         DAP_DELETE(l_hash_str);
                         dap_chain_global_db_gr_set(dap_strdup(l_login), l_password_hash,sizeof(*l_password_hash),s_group_password );
 
diff --git a/dap_chain_net_srv_vpn_cdb_server_list.c b/dap_chain_net_srv_vpn_cdb_server_list.c
index 55ee90f807fcd374ba9d8c1df701acbe378f86b2..f67b52a8fb0f982f12723d3ffb6879bccac82816 100644
--- a/dap_chain_net_srv_vpn_cdb_server_list.c
+++ b/dap_chain_net_srv_vpn_cdb_server_list.c
@@ -26,6 +26,7 @@
 
 #include <time.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
@@ -84,6 +85,69 @@ void dap_chain_net_srv_vpn_cdb_server_list_deinit(void)
 }
 
 
+/**
+ * @brief order_info_print
+ * @param a_server_location for server name, NULL not used
+ * @param a_node_number for server name, <0 not use
+ */
+static int order_info_print(dap_string_t *a_reply_str, dap_chain_net_t * a_net, dap_chain_net_srv_order_t * a_order, const char *a_server_name, int a_node_number)
+{
+    dap_chain_node_info_t * l_node_info = dap_chain_node_info_read(a_net, &a_order->node_addr);
+    if(l_node_info) {
+        char l_node_ext_ipv4_str[INET_ADDRSTRLEN] = { 0 };
+        char l_node_ext_ipv6_str[INET6_ADDRSTRLEN] = { 0 };
+        if(l_node_info->hdr.ext_addr_v4.s_addr)
+            inet_ntop(AF_INET, &l_node_info->hdr.ext_addr_v4, l_node_ext_ipv4_str, sizeof(l_node_ext_ipv4_str));
+        if(*((uint128_t *) l_node_info->hdr.ext_addr_v6.s6_addr))
+            inet_ntop(AF_INET6, &l_node_info->hdr.ext_addr_v6, l_node_ext_ipv6_str, sizeof(l_node_ext_ipv6_str));
+
+        uint8_t l_continent_num = 0;
+        char *l_region = NULL;
+        dap_chain_net_srv_order_get_continent_region(a_order, &l_continent_num, &l_region);
+        const char *l_continent_str = dap_chain_net_srv_order_continent_to_str(l_continent_num);
+        // ext_out in hex view
+        char *l_ext_out = a_order->ext_size ? DAP_NEW_Z_SIZE(char, a_order->ext_size * 2 + 1) : NULL;
+        dap_bin2hex(l_ext_out, a_order->ext, a_order->ext_size);
+
+        dap_string_append_printf(a_reply_str, "    {\n");
+        dap_string_append_printf(a_reply_str, "        \"Location\":\"%s\",\n", l_region ? l_region : "None"); //NETHERLANDS
+                //l_continent_str ? l_continent_str : "None", l_region ? l_region : "None");
+
+
+        dap_string_append_printf(a_reply_str, "        \"ChainNet\":\"%s\",\n", a_net->pub.name);
+        //dap_string_append_printf(a_reply_str, "        \"Name\":\"%s.Cell-%lu.%zd\",\n", a_net->pub.name, l_node_info->hdr.cell_id.uint64, 0);
+        if(a_server_name)
+            dap_string_append_printf(a_reply_str, "        \"Name\":\"%s\",\n", a_server_name);
+        else
+            dap_string_append_printf(a_reply_str, "        \"Name\":\"%s.%s.%zd\",\n", l_continent_str ? l_continent_str : "", l_region ? l_region : "", a_node_number + 1);
+            //dap_string_append_printf(a_reply_str, "        \"Name\":\"%s.%s.Cell-%lu.%zd\",\n", l_continent_str ? l_continent_str : "", l_region ? l_region : "", l_node_info->hdr.cell_id.uint64, a_node_number + 1);
+        if(l_node_ext_ipv4_str[0])
+            dap_string_append_printf(a_reply_str, "        \"Address\":\"%s\",\n", l_node_ext_ipv4_str);
+        if(l_node_ext_ipv6_str[0])
+            dap_string_append_printf(a_reply_str, "        \"Address6\":\"%s\",\n", l_node_ext_ipv6_str);
+        dap_string_append_printf(a_reply_str, "        \"Port\":%hu,\n", l_node_info->hdr.ext_port ? l_node_info->hdr.ext_port : 80);
+
+        //dap_string_append_printf(a_reply_str, "        \"Ext\":\"%s-%s\",\n", l_continent_str ? l_continent_str : "", l_region ? l_region : "");
+        if(l_ext_out)
+            dap_string_append_printf(a_reply_str, "        \"Ext\":\"0x%s\",\n", l_ext_out);
+        else
+            dap_string_append_printf(a_reply_str, "        \"Ext\":\"0x0\",\n");
+        dap_string_append_printf(a_reply_str, "        \"Price\":%lu,\n", a_order->price);
+        dap_string_append_printf(a_reply_str, "        \"PriceUnits\":%u,\n", a_order->price_unit.uint32);
+        dap_string_append_printf(a_reply_str, "        \"PriceToken\":\"%s\"\n", a_order->price_ticker);
+        dap_string_append_printf(a_reply_str, "    }");
+        DAP_DELETE(l_region);
+        DAP_DELETE(l_ext_out);
+
+
+    } else{
+        log_it(L_WARNING, "Order in \"%s\" network issued by node without ext_ipv4 field", a_net->pub.name);
+        return -1;
+    }
+    return 0;
+}
+
+
 static void s_http_simple_proc(dap_http_simple_t *a_http_simple, void *a_arg)
 {
     http_status_code_t * l_ret_code = (http_status_code_t*)a_arg;
@@ -96,44 +160,143 @@ static void s_http_simple_proc(dap_http_simple_t *a_http_simple, void *a_arg)
         dap_chain_net_t * l_net = s_cdb_net[i];
         if ( l_net ) {
             dap_chain_net_srv_order_t * l_orders = NULL;
-            size_t l_orders_count = 0;
+            size_t l_orders_num = 0;
             dap_chain_net_srv_price_unit_uid_t l_unit_uid = {{0}};
             dap_chain_net_srv_uid_t l_srv_uid = { .uint64 =DAP_CHAIN_NET_SRV_VPN_ID };
             dap_chain_net_srv_order_find_all_by( l_net, SERV_DIR_SELL,  l_srv_uid, l_unit_uid ,
-                                                 NULL,0,0, &l_orders, &l_orders_count );
-            log_it(L_DEBUG, "Found %zd orders in \"%s\" network", l_orders_count, l_net->pub.name );
-
-            for ( size_t j = 0; j < l_orders_count ; j++ ) {
-                dap_chain_node_info_t * l_node_info = dap_chain_node_info_read( l_net, &l_orders[j].node_addr );
-                if ( l_node_info ){
-                    char l_node_ext_ipv4_str[INET_ADDRSTRLEN]={0};
-                    char l_node_ext_ipv6_str[INET6_ADDRSTRLEN]={0};
-                    if (l_node_info->hdr.ext_addr_v4.s_addr)
-                        inet_ntop(AF_INET,&l_node_info->hdr.ext_addr_v4,l_node_ext_ipv4_str,sizeof(l_node_ext_ipv4_str));
-                    if (  *((uint128_t *) l_node_info->hdr.ext_addr_v6.s6_addr ) )
-                        inet_ntop(AF_INET6,&l_node_info->hdr.ext_addr_v6,l_node_ext_ipv6_str,sizeof(l_node_ext_ipv6_str));
-                    dap_string_append_printf( l_reply_str, "    {\n");
-
-                    dap_string_append_printf( l_reply_str, "        \"Location\":\"NETHERLANDS\",\n");
-                    dap_string_append_printf( l_reply_str, "        \"ChainNet\":\"%s\",\n",l_net->pub.name );
-                    dap_string_append_printf( l_reply_str, "        \"Name\":\"%s.Cell-%lu.%zd\",\n",l_net->pub.name, l_node_info->hdr.cell_id.uint64, j);
-                    if ( l_node_ext_ipv4_str[0] )
-                        dap_string_append_printf( l_reply_str,"        \"Address\":\"%s\",\n",l_node_ext_ipv4_str);
-                    if ( l_node_ext_ipv6_str[0] )
-                        dap_string_append_printf( l_reply_str, "        \"Address6\":\"%s\",\n",l_node_ext_ipv6_str);
-                    dap_string_append_printf( l_reply_str, "        \"Port\":%hu,\n",l_node_info->hdr.ext_port?l_node_info->hdr.ext_port:80);
-                    dap_string_append_printf( l_reply_str, "        \"Ext\":\"%s\",\n",l_orders[j].ext);
-                    dap_string_append_printf( l_reply_str, "        \"Price\":%lu,\n",l_orders[j].price);
-                    dap_string_append_printf( l_reply_str, "        \"PriceUnits\":%u,\n",l_orders[j].price_unit.uint32);
-                    dap_string_append_printf( l_reply_str, "        \"PriceToken\":\"%s\"\n",l_orders[j].price_ticker);
-                    if ( j != l_orders_count-1)
-                        dap_string_append_printf( l_reply_str, "    },\n");
-                    else
-                        dap_string_append_printf( l_reply_str, "    }\n");
+                                                 NULL,0,0, &l_orders, &l_orders_num );
+            log_it(L_DEBUG, "Found %zd orders in \"%s\" network", l_orders_num, l_net->pub.name );
+
+
+            // find the shift for each node
+            dap_chain_net_srv_order_t *l_orders_pos[l_orders_num];
+            size_t l_orders_size = 0;
+            for(size_t j = 0; j < l_orders_num; j++) {
+                l_orders_pos[j] = (dap_chain_net_srv_order_t*) ((char*) l_orders + l_orders_size);
+                l_orders_size += dap_chain_net_srv_order_get_size(l_orders_pos[j]);
+            }
+
+
+            // list of node numbers
+            size_t l_continents_count = dap_chain_net_srv_order_continents_count(); //int *l_node_numbering = DAP_NEW_Z_SIZE(int, l_orders_num * sizeof(int));
+            // list of the number of nodes in each continent
+            int l_continents_numbers[l_continents_count]; //int *l_continents_numbers = DAP_NEW_Z_SIZE(int, l_continents_count * sizeof(int));
+            int l_node_numbering[l_continents_count][l_orders_num];
+            // init arrays
+            for(size_t m1 = 0; m1 < l_continents_count; m1++) {
+                l_continents_numbers[m1] = 0;
+                for(size_t m2 = 0; m2 < l_orders_num; m2++)
+                    l_node_numbering[m1][m2] = -1;
+            }
+
+            // node numbering
+            {
+                // filling l_continents_numbers and l_node_numbering
+                for(size_t j = 0; j < l_orders_num; j++) {
+                    dap_chain_net_srv_order_t *l_order = l_orders_pos[j];
+                    uint8_t l_continent_num;
+                    if(!dap_chain_net_srv_order_get_continent_region(l_order, &l_continent_num, NULL))
+                        continue;
+                    l_node_numbering[l_continent_num][j] = l_continents_numbers[l_continent_num]++;
+                }
+                // shuffle nodes for each continent
+                for(size_t m1 = 0; m1 < l_continents_count; m1++) {
+                    int l_cont_num = l_continents_numbers[m1];
+                    if(l_cont_num <= 1)
+                        continue;
+                    // number of shuffles
+                    int l_shuffle_num = rand() % (l_cont_num + 1);
+                    for(size_t l_sh = 0; l_sh <= l_shuffle_num; l_sh++) {
+                        size_t l_pos1 = 0;
+                        size_t l_pos2 = 0;
+                        while(l_pos1 == l_pos2) {
+                            l_pos1 = rand() % l_cont_num;
+                            l_pos2 = rand() % l_cont_num;
+                        }
+                        for(size_t m2 = 0; m2 < l_orders_num; m2++) {
+                            if(l_node_numbering[m1][m2] == l_pos1)
+                                l_node_numbering[m1][m2] = l_pos2;
+                            else if(l_node_numbering[m1][m2] == l_pos2)
+                                l_node_numbering[m1][m2] = l_pos1;
+                        }
+                    }
+                }
+            }
 
-                }else
-                    log_it( L_WARNING, "Order %zd in \"%s\" network issued by node without ext_ipv4 field",j,l_net->pub.name);
+            // random node
+            int l_count = 0;
+            while(l_orders_num > 0) {
+                // first random node
+                size_t k = rand() % l_orders_num;
+                dap_chain_net_srv_order_t *l_order = l_orders_pos[k];
+                if(!order_info_print(l_reply_str, l_net, l_order, "Auto", -1)){
+                    dap_string_append_printf(l_reply_str, ",\n");
+                    break;
+                }
+                if (l_count>20)
+                    break;
+                l_count++;
             }
+            // random nodes for continents
+            for(size_t l_c = 0; l_c < l_continents_count; l_c++) {
+                while(l_continents_numbers[l_c] > 0) {
+                    // random node for continent
+                    size_t k = rand() % l_continents_numbers[l_c];
+                    size_t l_node_pos = -1;
+                    for(size_t j2 = 0; j2 <= l_orders_num; j2++) {
+                        if(k == l_node_numbering[l_c][j2]) {
+                            l_node_pos = j2;
+                            break;
+                        }
+                    }
+                    if(l_node_pos == -1)
+                        break;
+                    dap_chain_net_srv_order_t *l_order = l_orders_pos[l_node_pos];
+                    char *l_server_name = dap_strdup_printf("%s", dap_chain_net_srv_order_continent_to_str(l_c));
+                    if(!order_info_print(l_reply_str, l_net, l_order, l_server_name, -1)) {
+                        dap_string_append_printf(l_reply_str, ",\n");
+                        DAP_DELETE(l_server_name);
+                        break;
+                    }
+                    else
+                        DAP_DELETE(l_server_name);
+                    if(l_count > 20)
+                        break;
+                    l_count++;
+                }
+            }
+            for(size_t l_c = 0; l_c < l_continents_count; l_c++) {
+                // print all nodes for continent
+                for(size_t l_n = 0; l_n < l_continents_numbers[l_c]; l_n++) {
+                    // since the nodes are shuffled, look for the desired node index
+                    for(size_t l_o = 0; l_o < l_orders_num; l_o++) {
+                        if(l_node_numbering[l_c][l_o] != l_n)
+                            continue;
+                        dap_chain_net_srv_order_t *l_order = l_orders_pos[l_o];
+                        if(!order_info_print(l_reply_str, l_net, l_order, NULL, l_n)) {
+                            if(l_o != l_orders_num - 1)
+                                dap_string_append_printf(l_reply_str, ",\n");
+                            else
+                                dap_string_append_printf(l_reply_str, "\n");
+                        }
+                        break;
+                    }
+                }
+            }
+            //DAP_DELETE(l_continents_numbers);
+/*            for(size_t j = 0; j < l_orders_num; j++) {
+                dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t*) ((char*) l_orders + l_orders_size);
+                l_orders_size += dap_chain_net_srv_order_get_size(l_order);
+                uint8_t l_continent_num = 0;
+                dap_chain_net_srv_order_get_continent_region(l_order, &l_continent_num, NULL);
+                if(!order_info_print(l_reply_str, l_net, l_order, NULL, l_node_numbering[l_continent_num][j])) {
+                    if(j != l_orders_num - 1)
+                        dap_string_append_printf(l_reply_str, ",\n");
+                    else
+                        dap_string_append_printf(l_reply_str, "\n");
+                }
+            }*/
+            //DAP_DELETE(l_node_numbering);
         }
     }
     dap_string_append_printf( l_reply_str, "]\n\n");