diff --git a/dap_chain_net_srv.c b/dap_chain_net_srv.c
index fc9b2f7e9015c9813b567a0b89bd284a33461a48..8941972a885d55f74fc879b262377eaad0896af2 100755
--- a/dap_chain_net_srv.c
+++ b/dap_chain_net_srv.c
@@ -181,10 +181,117 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
         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);
-        if ( l_order_str == NULL){
-            dap_string_append_printf( l_string_ret, "Expected subcommand. Variants: find, dump, create, delete\n");
-            ret=-3;
-        } else if ( strcmp( l_order_str, "find" ) == 0 ){
+
+        // Order direction
+        const char *l_direction_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-direction", &l_direction_str);
+
+        const char* l_srv_uid_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-srv_uid", &l_srv_uid_str);
+
+        const char* l_srv_class_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-srv_class", &l_srv_class_str);
+
+        const char* l_node_addr_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-node_addr", &l_node_addr_str);
+
+        const char* l_tx_cond_hash_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-tx_cond", &l_tx_cond_hash_str);
+
+        const char* l_price_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price", &l_price_str);
+
+        const char* l_expires_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-expires", &l_expires_str);
+
+        const char* l_price_unit_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price_unit", &l_price_unit_str);
+
+        const char* l_price_token_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price_token", &l_price_token_str);
+
+        const char* l_ext = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-ext", &l_ext);
+
+        const char *l_order_hash_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-hash", &l_order_hash_str);
+
+        const char* l_region_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-region", &l_region_str);
+        const char* l_continent_str = NULL;
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-continent", &l_continent_str);
+
+        int8_t l_continent_num = dap_chain_net_srv_order_continent_to_num(l_continent_str);
+
+        if(l_continent_str && l_continent_num <= 0) {
+            dap_string_t *l_string_err = dap_string_new("Unrecognized \"-continent\" option=");
+            dap_string_append_printf(l_string_err, "\"%s\". Variants: ", l_continent_str);
+            int i = 0;
+            while(1) {
+                const char *l_continent = dap_chain_net_srv_order_continent_to_str(i);
+                if(!l_continent)
+                    break;
+                if(!i)
+                    dap_string_append_printf(l_string_err, "\"%s\"", l_continent);
+                else
+                    dap_string_append_printf(l_string_err, ", \"%s\"", l_continent);
+                i++;
+            }
+            dap_string_append_printf(l_string_ret, "%s\n", l_string_err->str);
+            dap_string_free(l_string_err, true);
+            ret = -1;
+        }
+        // Update order
+        else if(dap_strcmp(l_order_str, "update") == 0) {
+
+            if(!l_order_hash_str) {
+                ret = -1;
+                dap_string_append(l_string_ret, "Can't find option '-hash'\n");
+            }
+            else {
+                dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str);
+                if(!l_order) {
+                    ret = -2;
+                    dap_string_append_printf(l_string_ret, "Can't find order with hash %s\n", l_order_hash_str);
+                }
+                else {
+                    if(l_ext) {
+                        l_order->ext_size = strlen(l_ext) + 1;
+                        l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size);
+                        strncpy(l_order->ext, l_ext, l_order->ext_size);
+                    }
+                    else
+                        dap_chain_net_srv_order_set_continent_region(&l_order, l_continent_num, l_region_str);
+                    /*if(l_region_str) {
+                        strncpy(l_order->region, l_region_str, min(sizeof(l_order->region) - 1, strlen(l_region_str) + 1));
+                    }
+                    if(l_continent_num>=0)
+                        l_order->continent = l_continent_num;*/
+
+
+                    ret = dap_chain_net_srv_order_save(l_net, l_order);
+                    if(!ret)
+                        ret = 0;
+                    if(!ret) {
+                        dap_chain_hash_fast_t l_new_order_hash;
+                        size_t l_new_order_size = dap_chain_net_srv_order_get_size(l_order);
+                        dap_hash_fast(l_order, l_new_order_size, &l_new_order_hash);
+                        char * l_new_order_hash_str = dap_chain_hash_fast_to_str_new(&l_new_order_hash);
+                        // delete prev order
+                        if(dap_strcmp(l_new_order_hash_str, l_order_hash_str))
+                            dap_chain_net_srv_order_delete_by_hash_str(l_net, l_order_hash_str);
+                        DAP_DELETE(l_new_order_hash_str);
+                        dap_string_append_printf(l_string_ret, "order updated\n");
+                    }
+                    else
+                        dap_string_append_printf(l_string_ret, "order did not updated\n");
+
+                    DAP_DELETE(l_order);
+                }
+            }
+
+        }
+        else if ( dap_strcmp( l_order_str, "find" ) == 0 ){
 
             // Order direction
             const char *l_direction_str = NULL;
@@ -235,11 +342,14 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
                 l_price_unit.uint32 = (uint32_t) atol ( l_price_unit_str );
 
             dap_chain_net_srv_order_t * l_orders;
-            size_t l_orders_size =0;
-            if( dap_chain_net_srv_order_find_all_by( l_net, l_direction,l_srv_uid,l_price_unit,l_price_token_str,l_price_min, l_price_max,&l_orders,&l_orders_size) == 0 ){
-                dap_string_append_printf(l_string_ret,"Found %u orders:\n",l_orders_size);
-                for (size_t i = 0; i< l_orders_size; i++){
-                    dap_chain_net_srv_order_dump_to_string(l_orders+i,l_string_ret);
+            size_t l_orders_num = 0;
+            if( dap_chain_net_srv_order_find_all_by( l_net, l_direction,l_srv_uid,l_price_unit,l_price_token_str,l_price_min, l_price_max,&l_orders,&l_orders_num) == 0 ){
+                dap_string_append_printf(l_string_ret,"Found %u orders:\n",l_orders_num);
+                size_t l_orders_size = 0;
+                for (size_t i = 0; i< l_orders_num; i++){
+                    dap_chain_net_srv_order_t *l_order = (char*) l_orders + l_orders_size;
+                    dap_chain_net_srv_order_dump_to_string(l_order, l_string_ret);
+                    l_orders_size += dap_chain_net_srv_order_get_size(l_order);
                     dap_string_append(l_string_ret,"\n");
                 }
                 ret = 0;
@@ -247,11 +357,10 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
                 ret = -5 ;
                 dap_string_append(l_string_ret,"Can't get orders: some internal error or wrong params\n");
             }
+            DAP_DELETE(l_orders);
 
-        }else if( strcmp( l_order_str, "dump" ) == 0 ){
+        }else if( dap_strcmp( l_order_str, "dump" ) == 0 ){
             // Select with specified service uid
-            const char *l_order_hash_str = NULL;
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-hash", &l_order_hash_str);
             if ( l_order_hash_str ){
                 dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str( l_net, l_order_hash_str );
                 if (l_order){
@@ -264,68 +373,47 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
             } else{
 
                 dap_chain_net_srv_order_t * l_orders = NULL;
-                size_t l_orders_size =0;
+                size_t l_orders_num =0;
                 dap_chain_net_srv_uid_t l_srv_uid={{0}};
                 uint64_t l_price_min=0, l_price_max =0 ;
                 dap_chain_net_srv_price_unit_uid_t l_price_unit={{0}};
                 dap_chain_net_srv_order_direction_t l_direction = SERV_DIR_UNDEFINED;
 
-                if( dap_chain_net_srv_order_find_all_by( l_net,l_direction,l_srv_uid,l_price_unit, NULL, l_price_min, l_price_max,&l_orders,&l_orders_size) == 0 ){
-                    dap_string_append_printf(l_string_ret,"Found %zd orders:\n",l_orders_size);
-                    for (size_t i = 0; i< l_orders_size; i++){
-                        dap_chain_net_srv_order_dump_to_string(&l_orders[i],l_string_ret);
-                        dap_string_append(l_string_ret,"\n");
+                if( dap_chain_net_srv_order_find_all_by( l_net,l_direction,l_srv_uid,l_price_unit, NULL, l_price_min, l_price_max,&l_orders,&l_orders_num) == 0 ){
+                    dap_string_append_printf(l_string_ret,"Found %zd orders:\n",l_orders_num);
+                    size_t l_orders_size = 0;
+                    for(size_t i = 0; i < l_orders_num; i++) {
+                        dap_chain_net_srv_order_t *l_order = (char*) l_orders + l_orders_size;
+                        dap_chain_net_srv_order_dump_to_string(l_order, l_string_ret);
+                        l_orders_size += dap_chain_net_srv_order_get_size(l_order);
+                        dap_string_append(l_string_ret, "\n");
                     }
                     ret = 0;
                 }else{
                     ret = -5 ;
                     dap_string_append(l_string_ret,"Can't get orders: some internal error or wrong params\n");
                 }
+                DAP_DELETE(l_orders);
             }
-        }else if( strcmp( l_order_str, "delete" ) == 0 ){
+        }else if( dap_strcmp( l_order_str, "delete" ) == 0 ){
             // Select with specified service uid
             const char *l_order_hash_str = NULL;
             dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-hash", &l_order_hash_str);
             if ( l_order_hash_str ){
-                if (dap_chain_net_srv_order_delete_by_hash_str(l_net,l_order_hash_str) == 0){
+                dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str( l_net, l_order_hash_str );
+                if (l_order && dap_chain_net_srv_order_delete_by_hash_str(l_net,l_order_hash_str) == 0){
                     ret = 0 ;
                     dap_string_append_printf(l_string_ret,"Deleted order %s\n", l_order_hash_str );
                 }else{
                     ret = -8 ;
                     dap_string_append_printf(l_string_ret,"Can't find order with hash %s\n", l_order_hash_str );
                 }
+                DAP_DELETE(l_order);
             } else{
                 ret = -9 ;
                 dap_string_append(l_string_ret,"need -hash param to obtain what the order we need to dump\n");
             }
-        }else if( strcmp( l_order_str, "create" ) == 0 ){
-            // Order direction
-            const char *l_direction_str = NULL;
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-direction", &l_direction_str);
-
-            const char* l_srv_uid_str = NULL;
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-srv_uid", &l_srv_uid_str);
-
-            const char* l_node_addr_str = NULL;
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-node_addr", &l_node_addr_str);
-
-            const char*  l_tx_cond_hash_str = NULL;
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-tx_cond", &l_tx_cond_hash_str);
-
-            const char*  l_price_str = NULL;
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price", &l_price_str);
-
-            const char*  l_expires_str = NULL;
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-expires", &l_expires_str);
-
-            const char*  l_price_unit_str = NULL;
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price_unit", &l_price_unit_str);
-
-            const char*  l_price_token_str = NULL;
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price_token", &l_price_token_str);
-
-            const char*  l_ext = NULL;
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-ext", &l_ext);
+        }else if( dap_strcmp( l_order_str, "create" ) == 0 ){
 
             if ( l_srv_uid_str && l_price_str && l_price_token_str && l_price_unit_str) {
                 dap_chain_net_srv_uid_t l_srv_uid={{0}};
@@ -365,7 +453,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
 
                 char * l_order_new_hash_str = dap_chain_net_srv_order_create(
                             l_net,l_direction, l_srv_uid, l_node_addr,l_tx_cond_hash, l_price, l_price_unit,
-                            l_price_token, l_expires,l_ext);
+                            l_price_token, l_expires,l_ext, l_region_str, l_continent_num);
                 if (l_order_new_hash_str)
                     dap_string_append_printf( l_string_ret, "Created order %s\n", l_order_new_hash_str);
                 else{
diff --git a/dap_chain_net_srv_order.c b/dap_chain_net_srv_order.c
index 86187a6ad90cc175823bb28ee538a69b3a1cb453..8ac6e2c6c5991b20b78b13c0867a2f705000866c 100644
--- a/dap_chain_net_srv_order.c
+++ b/dap_chain_net_srv_order.c
@@ -29,6 +29,15 @@
 
 #define LOG_TAG "dap_chain_net_srv_order"
 
+char *s_server_continents[]={
+        "None",
+        "Africa",
+        "Europe",
+        "North America",
+        "South America",
+        "Southeast Asia",
+        "Near East",
+ };
 
 /**
  * @brief dap_chain_net_srv_order_init
@@ -48,6 +57,114 @@ void dap_chain_net_srv_order_deinit()
 
 }
 
+size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order)
+{
+    return a_order ? sizeof(dap_chain_net_srv_order_t) + a_order->ext_size : 0;
+}
+
+/**
+ * @brief dap_chain_net_srv_order_get_region_continent
+ * @param a_continent_num [in]
+ * @param a_region [in]
+ */
+bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_order, uint8_t a_continent_num, const char *a_region)
+{
+    dap_chain_net_srv_order_t *l_order = *a_order;
+    if(!l_order || (!a_continent_num && !a_region))
+        return false;
+    uint8_t l_continent_num_prev = 0;
+    char *l_region_prev = NULL;
+    dap_chain_net_srv_order_get_continent_region(*a_order, &l_continent_num_prev, &l_region_prev);
+    uint32_t l_ext_size = 1 + sizeof(uint8_t);
+    if(a_region)
+        l_ext_size += strlen(a_region) + 1;
+    else if(l_region_prev)
+        l_ext_size += strlen(l_region_prev) + 1;
+
+    l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_ext_size);
+    l_order->ext[0] =0x52;
+    if(a_continent_num > 0)
+        memcpy(l_order->ext + 1, &a_continent_num, sizeof(uint8_t));
+    else
+        memcpy(l_order->ext + 1, &l_continent_num_prev, sizeof(uint8_t));
+    if(a_region)
+        memcpy(l_order->ext + 1 + sizeof(uint8_t), a_region, strlen(a_region) + 1);
+    else if(l_region_prev)
+        memcpy(l_order->ext + 1 + sizeof(uint8_t), l_region_prev, strlen(l_region_prev) + 1);
+    //dap_sprintf(l_order->ext, "\52%d-%s", a_continent_num, a_region);
+    l_order->ext_size = l_ext_size;
+    *a_order = l_order;
+    DAP_DELETE(l_region_prev);
+    return true;
+}
+
+/**
+ * @brief dap_chain_net_srv_order_get_region_continent
+ * @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)
+{
+    if(!a_order || !a_order->ext_size || !a_order->ext || a_order->ext[0]!=0x52)
+        return false;
+    if(a_continent_num) {
+        memcpy(a_continent_num, a_order->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;
+        if(l_size > 0) {
+            *a_region = DAP_NEW_SIZE(char, l_size);
+            memcpy(*a_region, a_order->ext + 1 + sizeof(uint8_t), l_size);
+        }
+        else
+            *a_region = NULL;
+    }
+    return true;
+}
+
+
+/**
+ * @brief dap_chain_net_srv_order_continents_count
+ */
+size_t dap_chain_net_srv_order_continents_count(void)
+{
+    size_t l_count = sizeof(s_server_continents) / sizeof(char*);
+    return l_count;
+}
+
+/**
+ * @brief dap_chain_net_srv_order_get_continent_str
+ */
+const char* dap_chain_net_srv_order_continent_to_str(int8_t a_num)
+{
+    int8_t l_count = dap_chain_net_srv_order_continents_count();
+    if(a_num >= l_count)
+        return NULL;
+    return s_server_continents[a_num];
+}
+
+/**
+ * @brief dap_chain_net_srv_order_get_continent_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();
+    char *l_continent_str = dap_strup(a_continent_str, -1);
+    for(int8_t i = 1; i < l_count; i++) {
+        char *l_server_continents = dap_strup(s_server_continents[i], -1);
+        if(!dap_strcmp(l_continent_str, l_server_continents)) {
+            DAP_DELETE(l_server_continents);
+            DAP_DELETE(l_continent_str);
+            return i;
+        }
+        DAP_DELETE(l_server_continents);
+    }
+    DAP_DELETE(l_continent_str);
+    return -1;
+}
+
 char* dap_chain_net_srv_order_create(
         dap_chain_net_t * a_net,
         dap_chain_net_srv_order_direction_t a_direction,
@@ -58,7 +175,9 @@ char* dap_chain_net_srv_order_create(
         dap_chain_net_srv_price_unit_uid_t a_price_unit, // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
         char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
         dap_chain_time_t a_expires, // TS when the service expires
-        const char * a_ext
+        const char *a_ext,
+        const char *a_region,
+        int8_t a_continent_num
         )
 {
     if (a_net) {
@@ -69,6 +188,11 @@ char* dap_chain_net_srv_order_create(
         l_order->direction = a_direction;
         l_order->ts_created = (dap_chain_time_t) time(NULL);
 
+        if(a_ext)
+            strncpy(l_order->ext, a_ext, strlen(l_order->ext) + 1);
+        else
+            dap_chain_net_srv_order_set_continent_region(&l_order, a_continent_num, a_region);
+
         if ( a_node_addr.uint64)
             l_order->node_addr.uint64 = a_node_addr.uint64;
 
@@ -79,13 +203,11 @@ char* dap_chain_net_srv_order_create(
         if ( a_price_ticker)
             strncpy(l_order->price_ticker, a_price_ticker,sizeof(l_order->price_ticker)-1);
 
-        if ( a_ext)
-            strncpy(l_order->ext, a_ext, sizeof ( l_order->ext)-1 );
-
-        dap_hash_fast( l_order, sizeof ( *l_order), l_order_hash );
+        size_t l_order_size = dap_chain_net_srv_order_get_size(l_order);
+        dap_hash_fast( l_order, l_order_size, l_order_hash );
         char * l_order_hash_str = dap_chain_hash_fast_to_str_new( l_order_hash );
         char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group( a_net);
-        if ( !dap_chain_global_db_gr_set( dap_strdup(l_order_hash_str), l_order, sizeof (*l_order), l_gdb_group_str ) ){
+        if ( !dap_chain_global_db_gr_set( dap_strdup(l_order_hash_str), l_order, l_order_size, l_gdb_group_str ) ){
             DAP_DELETE( l_order );
             DAP_DELETE( l_order_hash );
             DAP_DELETE( l_order_hash_str );
@@ -93,13 +215,37 @@ char* dap_chain_net_srv_order_create(
             return NULL;
         }
         DAP_DELETE( l_order_hash );
-        DAP_DELETE(l_order_hash_str );
+        //DAP_DELETE(l_order_hash_str );
         DAP_DELETE( l_gdb_group_str );
         return  l_order_hash_str;
     }else
         return NULL;
 }
 
+/**
+ * @brief dap_chain_net_srv_order_update
+ * @param a_net
+ * @param a_order
+ * @return
+ */
+int dap_chain_net_srv_order_save(dap_chain_net_t * a_net, dap_chain_net_srv_order_t *a_order)
+{
+    if (!a_net || !a_order)
+        return -1;
+
+    dap_chain_hash_fast_t l_order_hash;
+    size_t l_order_size = dap_chain_net_srv_order_get_size(a_order);
+    dap_hash_fast( a_order, l_order_size, &l_order_hash );
+    char * l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_order_hash);
+    char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group( a_net);
+    if ( !dap_chain_global_db_gr_set(l_order_hash_str, a_order, l_order_size, l_gdb_group_str ) ){
+        DAP_DELETE( l_gdb_group_str );
+        return -1;
+    }
+    DAP_DELETE( l_gdb_group_str );
+    return 0;
+}
+
 /**
  * @brief dap_chain_net_srv_order_find_by_hash_str
  * @param a_net
@@ -113,7 +259,8 @@ dap_chain_net_srv_order_t * dap_chain_net_srv_order_find_by_hash_str(dap_chain_n
         char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group( a_net);
         size_t l_order_size =0;
         l_order = (dap_chain_net_srv_order_t *) dap_chain_global_db_gr_get(a_hash_str, &l_order_size, l_gdb_group_str );
-        if (l_order_size != sizeof (dap_chain_net_srv_order_t) ){
+        // check order size
+        if(l_order_size != dap_chain_net_srv_order_get_size(l_order)) {
             log_it( L_ERROR, "Found wrong size order");
             DAP_DELETE( l_order );
             DAP_DELETE( l_gdb_group_str );
@@ -148,9 +295,11 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_
         dap_global_db_obj_t * l_orders = dap_chain_global_db_gr_load(l_gdb_group_str,&l_orders_count);
         log_it( L_DEBUG ,"Loaded %zd orders", l_orders_count);
         bool l_order_pass_first=true;
-        size_t l_order_passed_index;
+        size_t l_order_passed_index = 0;
+        size_t l_orders_size = 0;
 lb_order_pass:
-        l_order_passed_index =0;
+        l_order_passed_index = 0;
+        l_orders_size = 0;
         for (size_t i=0; i< l_orders_count; i++){
             dap_chain_net_srv_order_t * l_order = (dap_chain_net_srv_order_t *) l_orders[i].value;
             // Check direction
@@ -179,8 +328,14 @@ lb_order_pass:
                 if ( strcmp( l_order->price_ticker, a_price_ticker) != 0 )
                     continue;
 
-            if( !l_order_pass_first )
-                memcpy( *a_output_orders+l_order_passed_index, l_order, sizeof (dap_chain_net_srv_order_t));
+            if( !l_order_pass_first ){
+                size_t l_order_size = dap_chain_net_srv_order_get_size(l_order);
+                memcpy((char*)*a_output_orders + l_orders_size, l_order, l_order_size);
+                l_orders_size += l_order_size;
+            }
+            else
+                // calc size of all orders
+                l_orders_size += dap_chain_net_srv_order_get_size(l_order);
             l_order_passed_index++;
 
         }
@@ -188,7 +343,7 @@ lb_order_pass:
         if (l_order_pass_first) {
             l_order_pass_first = false;
             *a_output_orders_count = l_order_passed_index;
-            *a_output_orders = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, sizeof (dap_chain_net_srv_order_t)*l_order_passed_index );
+            *a_output_orders = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, l_orders_size);
             goto lb_order_pass;
         }
         // If we here - its the second pass through
@@ -228,7 +383,7 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d
     if (a_order && a_str_out ){
         dap_chain_hash_fast_t l_hash;
         char l_hash_str[DAP_CHAIN_HASH_FAST_SIZE * 2 + 4];
-        dap_hash_fast(a_order,sizeof (*a_order),&l_hash );
+        dap_hash_fast(a_order, dap_chain_net_srv_order_get_size(a_order), &l_hash);
         dap_chain_hash_fast_to_str(&l_hash,l_hash_str,sizeof(l_hash_str)-1);
         dap_string_append_printf(a_str_out, "== Order %s ==\n", l_hash_str);
         dap_string_append_printf(a_str_out, "  version:          %u\n", a_order->version );
@@ -240,14 +395,29 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d
         }
 
         dap_string_append_printf(a_str_out, "  srv_uid:          0x%016llX\n", a_order->srv_uid.uint64 );
-        dap_string_append_printf(a_str_out, "  price:            \u00a0%.7Lf (%llu)\n", dap_chain_balance_to_coins(a_order->price) , a_order->price);
+        dap_string_append_printf(a_str_out, "  price:           \u00a0%.7Lf (%llu)\n", dap_chain_balance_to_coins(a_order->price) , a_order->price);
         if( a_order->price_unit.uint32 )
-            dap_string_append_printf(a_str_out, "  price_unit:       0x%016llX\n", dap_chain_net_srv_price_unit_uid_to_str(a_order->price_unit) );
+            dap_string_append_printf(a_str_out, "  price_unit:       %s\n", dap_chain_net_srv_price_unit_uid_to_str(a_order->price_unit) );
         if ( a_order->node_addr.uint64)
             dap_string_append_printf(a_str_out, "  node_addr:        "NODE_ADDR_FP_STR"\n", NODE_ADDR_FP_ARGS_S(a_order->node_addr) );
 
-        dap_chain_hash_fast_to_str(&a_order->tx_cond_hash,l_hash_str,sizeof(l_hash_str)-1);
-        dap_string_append_printf(a_str_out, "  tx_cond_hash:          %s\n", l_hash_str );
-        dap_string_append_printf(a_str_out, "  ext:          \"%s\"\n", a_order->ext );
+        char *l_region = NULL;
+        uint8_t l_continent_num = 0;
+        const char *l_continent_str = NULL;
+        if(dap_chain_net_srv_order_get_continent_region(a_order, &l_continent_num, &l_region))
+            l_continent_str = dap_chain_net_srv_order_continent_to_str(l_continent_num);
+        dap_string_append_printf(a_str_out, "  node_location:    %s - %s\n", l_continent_str ? l_continent_str : "None" , l_region ? l_region : "None");
+        DAP_DELETE(l_region);
+
+        dap_chain_hash_fast_to_str(&a_order->tx_cond_hash,l_hash_str, sizeof(l_hash_str)-1);
+        dap_string_append_printf(a_str_out, "  tx_cond_hash:     %s\n", l_hash_str );
+        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);
+        if(l_ext_out)
+            dap_string_append_printf(a_str_out, "  ext:              0x%s\n", l_ext_out);
+        else
+            dap_string_append_printf(a_str_out, "  ext:              0x0\n");
+
+        DAP_DELETE(l_ext_out);
     }
 }
diff --git a/dap_chain_net_srv_order.h b/dap_chain_net_srv_order.h
index b45274fca1f4ba5d4248e6b337289f08ed5fcac2..3aa88fd18145045a68c158a1edd97bd760588f22 100644
--- a/dap_chain_net_srv_order.h
+++ b/dap_chain_net_srv_order.h
@@ -42,13 +42,25 @@ typedef struct dap_chain_net_srv_order
     dap_chain_time_t ts_expires;
     uint64_t price; //  service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT  for one unit.
     char price_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; // Token ticker to pay for service
-    char ext[128];
+    //uint8_t continent;
+    //char region[32];
+    uint32_t ext_size;
+    char ext[];
 } DAP_ALIGN_PACKED dap_chain_net_srv_order_t;
 
 // Init/deinit should be call only if private
 int dap_chain_net_srv_order_init(void);
 void dap_chain_net_srv_order_deinit(void);
 
+size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order);
+
+bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_order, uint8_t a_continent_num, const char *a_region);
+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);
+
+size_t dap_chain_net_srv_order_continents_count(void);
+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 *l_continent_str);
+
 dap_chain_net_srv_order_t * dap_chain_net_srv_order_find_by_hash_str(dap_chain_net_t * a_net, const char * a_hash_str);
 
 DAP_STATIC_INLINE dap_chain_net_srv_order_t * dap_chain_net_srv_order_find_by_hash(dap_chain_net_t * a_net, dap_chain_hash_fast_t * a_hash)
@@ -88,9 +100,12 @@ char* dap_chain_net_srv_order_create(
         dap_chain_net_srv_price_unit_uid_t a_price_unit, // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
         char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
         dap_chain_time_t a_expires, // TS when the service expires
-        const char * a_comments
+        const char *a_ext,
+        const char *a_region,
+        int8_t a_continent_num
         );
 
+int dap_chain_net_srv_order_save(dap_chain_net_t * a_net, dap_chain_net_srv_order_t *a_order);
 void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,dap_string_t * a_str_out);
 
 /**