diff --git a/src/66/66-inresolve.c b/src/66/66-inresolve.c
index 8779e5b02bc0f9393301555cc5421d03d199dbf4..1ba06a4485190e5b4995a4b160081b0dfbc6a8ac 100644
--- a/src/66/66-inresolve.c
+++ b/src/66/66-inresolve.c
@@ -31,12 +31,12 @@
 #include <66/utils.h>
 #include <66/constants.h>
 
-#define MAXOPTS 30
+#define MAXOPTS 32
 
 static wchar_t const field_suffix[] = L" :" ;
 static char fields[INFO_NKEY][INFO_FIELD_MAXLEN] = {{ 0 }} ;
 
-#define USAGE "66-inresolve [ -h ] [ -z ] [ -t tree ] [ -l ] service"
+#define USAGE "66-inresolve [ -h ] [ -z ] [ -v verbosity ] [ -t tree ] [ -l ] tree|service name"
 
 static inline void info_help (void)
 {
@@ -47,6 +47,7 @@ static inline void info_help (void)
 "options :\n"
 "   -h: print this help\n"
 "   -z: use color\n"
+"   -v: increase/decrease verbosity\n"
 "   -t: only search service at the specified tree\n"
 "   -l: prints information of the associated logger if exist\n"
 ;
@@ -54,6 +55,30 @@ static inline void info_help (void)
     log_info(USAGE,"\n",help) ;
 }
 
+static inline unsigned int lookup (char const *const *table, char const *data)
+{
+    log_flow() ;
+
+    unsigned int i = 0 ;
+    for (; table[i] ; i++) if (!strcmp(data, table[i])) break ;
+    return i ;
+}
+
+static inline unsigned int parse_what (char const *str)
+{
+    log_flow() ;
+
+    static char const *const table[] =
+    {
+        "service",
+        "tree",
+        0
+    } ;
+  unsigned int i = lookup(table, str) ;
+  if (!table[i]) i = 2 ;
+  return i ;
+}
+
 static void info_display_string(char const *field,char const *str)
 {
     info_display_field_name(field) ;
@@ -84,12 +109,9 @@ static void info_display_int(char const *field,unsigned int id)
 
 int main(int argc, char const *const *argv)
 {
-    int found = 0 ;
+    int found = 0, what = 0 ;
     uint8_t logger = 0 ;
-    resolve_service_t res = RESOLVE_SERVICE_ZERO ;
-    resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, &res) ;
-    resolve_service_t lres = RESOLVE_SERVICE_ZERO ;
-    resolve_wrapper_t_ref lwres = resolve_set_struct(SERVICE_STRUCT, &lres) ;
+
     stralloc satree = STRALLOC_ZERO ;
     stralloc src = STRALLOC_ZERO ;
     stralloc tmp = STRALLOC_ZERO ;
@@ -98,141 +120,248 @@ int main(int argc, char const *const *argv)
 
     log_color = &log_color_disable ;
 
-    char buf[MAXOPTS][INFO_FIELD_MAXLEN] = {
-        "Name",
-        "Description" ,
-        "Version",
-        "Logger",
-        "Logreal",
-        "Logassoc",
-        "Dstlog",
-        "Deps",
-        "Optsdeps",
-        "Extdeps",
-        "Contents" ,
-        "Src" ,
-        "Srconf",
-        "Live",
-        "Runat",
-        "Tree",
-        "Treename",
-        "State",
-        "Exec_run" ,
-        "Real_exec_run" ,
-        "Exec_finish" ,
-        "Real_exec_finish" ,
-        "Type" ,
-        "Ndeps" ,
-        "Noptsdeps" ,
-        "Nextdeps" ,
-        "Ncontents" ,
-        "Down" ,
-        "Disen",
-        "Real_logger_name" } ;
-
     PROG = "66-inresolve" ;
     {
         subgetopt l = SUBGETOPT_ZERO ;
 
         for (;;)
         {
-            int opt = getopt_args(argc,argv, ">hzlt:", &l) ;
+            int opt = getopt_args(argc,argv, ">hv:zlt:", &l) ;
             if (opt == -1) break ;
             if (opt == -2) log_die(LOG_EXIT_USER,"options must be set first") ;
             switch (opt)
             {
-                case 'h' : info_help(); return 0 ;
-                case 'z' : log_color = !isatty(1) ? &log_color_disable : &log_color_enable ; break ;
-                case 't' : tname = l.arg ; break ;
-                case 'l' : logger = 1 ; break ;
-                default : log_usage(USAGE) ;
+                case 'h' :
+
+                    info_help();
+                    return 0 ;
+
+                case 'v' :
+
+                    if (!uint0_scan(l.arg, &VERBOSITY))
+                        log_usage(USAGE) ;
+                    break ;
+
+                case 'z' :
+
+                    log_color = !isatty(1) ? &log_color_disable : &log_color_enable ;
+                    break ;
+
+                case 't' :
+
+                    tname = l.arg ;
+                    break ;
+
+                case 'l' :
+
+                    logger = 1 ;
+                    break ;
+
+                default :
+
+                    log_usage(USAGE) ;
             }
         }
         argc -= l.ind ; argv += l.ind ;
     }
 
     if (!argc) log_usage(USAGE) ;
+
+    what = parse_what(*argv) ;
+    if (what == 2)
+        log_usage(USAGE) ;
+
+    argv++;
+    argc--;
     svname = *argv ;
 
-    found = service_intree(&src,svname,tname) ;
-    if (found == -1) log_dieu(LOG_EXIT_SYS,"resolve tree source of sv: ",svname) ;
-    else if (!found) {
-        log_info("no tree exist yet") ;
-        goto freed ;
-    }
-    else if (found > 2) {
-        log_die(LOG_EXIT_SYS,svname," is set on different tree -- please use -t options") ;
-    }
-    else if (found == 1) log_die(LOG_EXIT_SYS,"unknown service: ",svname) ;
-
-    if (!resolve_read(wres,src.s,svname)) log_dieusys(111,"read resolve file") ;
-
-    info_field_align(buf,fields,field_suffix,MAXOPTS) ;
-
-    info_display_string(fields[0],res.sa.s + res.name) ;
-    info_display_string(fields[1],res.sa.s + res.description) ;
-    info_display_string(fields[2],res.sa.s + res.version) ;
-    info_display_string(fields[3],res.sa.s + res.logger) ;
-    info_display_string(fields[4],res.sa.s + res.logreal) ;
-    info_display_string(fields[5],res.sa.s + res.logassoc) ;
-    info_display_string(fields[6],res.sa.s + res.dstlog) ;
-    info_display_string(fields[7],res.sa.s + res.deps) ;
-    info_display_string(fields[8],res.sa.s + res.optsdeps) ;
-    info_display_string(fields[9],res.sa.s + res.extdeps) ;
-    info_display_string(fields[10],res.sa.s + res.contents) ;
-    info_display_string(fields[11],res.sa.s + res.src) ;
-    info_display_string(fields[12],res.sa.s + res.srconf) ;
-    info_display_string(fields[13],res.sa.s + res.live) ;
-    info_display_string(fields[14],res.sa.s + res.runat) ;
-    info_display_string(fields[15],res.sa.s + res.tree) ;
-    info_display_string(fields[16],res.sa.s + res.treename) ;
-    info_display_string(fields[17],res.sa.s + res.state) ;
-    info_display_string(fields[18],res.sa.s + res.exec_run) ;
-    info_display_string(fields[19],res.sa.s + res.real_exec_run) ;
-    info_display_string(fields[20],res.sa.s + res.exec_finish) ;
-    info_display_string(fields[21],res.sa.s + res.real_exec_finish) ;
-    info_display_int(fields[22],res.type) ;
-    info_display_int(fields[23],res.ndeps) ;
-    info_display_int(fields[24],res.noptsdeps) ;
-    info_display_int(fields[25],res.nextdeps) ;
-    info_display_int(fields[26],res.ncontents) ;
-    info_display_int(fields[27],res.down) ;
-    info_display_int(fields[28],res.disen) ;
-
-    if (res.logger && logger)
-    {
-        if (!resolve_read(lwres,src.s,res.sa.s + res.logger)) log_dieusys(111,"read resolve file of: ",res.sa.s + res.logger) ;
+    if (!what) {
 
-        if (buffer_putsflush(buffer_1,"\n") == -1)
-            log_dieusys(LOG_EXIT_SYS,"write to stdout") ;
+        char service_buf[MAXOPTS][INFO_FIELD_MAXLEN] = {
+            "Name",
+            "Description" ,
+            "Version",
+            "Logger",
+            "Logreal",
+            "Logassoc",
+            "Dstlog",
+            "Depends",
+            "Requiredby",
+            "Optsdeps",
+            "Extdeps",
+            "Contents" ,
+            "Src" ,
+            "Srconf",
+            "Live",
+            "Runat",
+            "Tree",
+            "Treename",
+            "State",
+            "Exec_run" ,
+            "Real_exec_run" ,
+            "Exec_finish" ,
+            "Real_exec_finish" ,
+            "Type" ,
+            "Ndepends" ,
+            "Nrequiredby" ,
+            "Noptsdeps" ,
+            "Nextdeps" ,
+            "Ncontents" ,
+            "Down" ,
+            "Disen",
+            "Real_logger_name" } ;
 
-        info_display_string(fields[29],res.sa.s + res.logreal) ;
-        info_display_string(fields[0],lres.sa.s + lres.name) ;
-        info_display_string(fields[1],lres.sa.s + lres.description) ;
-        info_display_string(fields[2],lres.sa.s + lres.version) ;
-        info_display_string(fields[3],lres.sa.s + lres.logger) ;
-        info_display_string(fields[4],lres.sa.s + lres.logreal) ;
-        info_display_string(fields[5],lres.sa.s + lres.logassoc) ;
-        info_display_string(fields[6],lres.sa.s + lres.dstlog) ;
-        info_display_string(fields[7],lres.sa.s + lres.deps) ;
-        info_display_string(fields[11],lres.sa.s + lres.src) ;
-        info_display_string(fields[12],lres.sa.s + lres.srconf) ;
-        info_display_string(fields[13],lres.sa.s + lres.live) ;
-        info_display_string(fields[14],lres.sa.s + lres.runat) ;
-        info_display_string(fields[15],lres.sa.s + lres.tree) ;
-        info_display_string(fields[16],lres.sa.s + lres.treename) ;
-        info_display_string(fields[17],lres.sa.s + lres.state) ;
-        info_display_string(fields[18],lres.sa.s + lres.exec_log_run) ;
-        info_display_string(fields[19],lres.sa.s + lres.real_exec_log_run) ;
-        info_display_int(fields[22],lres.type) ;
-        info_display_int(fields[23],lres.ndeps) ;
-        info_display_int(fields[27],lres.down) ;
-        info_display_int(fields[28],lres.disen) ;
-    }
+        resolve_service_t res = RESOLVE_SERVICE_ZERO ;
+        resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ;
+        resolve_service_t lres = RESOLVE_SERVICE_ZERO ;
+        resolve_wrapper_t_ref lwres = resolve_set_struct(DATA_SERVICE, &lres) ;
+
+        found = service_intree(&src,svname,tname) ;
+        if (found == -1) log_dieu(LOG_EXIT_SYS,"resolve tree source of sv: ",svname) ;
+        else if (!found) {
+            log_info("no tree exist yet") ;
+            goto freed ;
+        }
+        else if (found > 2) {
+            log_die(LOG_EXIT_SYS,svname," is set on different tree -- please use -t options") ;
+        }
+        else if (found == 1) log_die(LOG_EXIT_SYS,"unknown service: ",svname) ;
+
+        if (!resolve_read(wres,src.s,svname)) log_dieusys(LOG_EXIT_SYS,"read resolve file") ;
+
+        info_field_align(service_buf,fields,field_suffix,MAXOPTS) ;
+
+        info_display_string(fields[0],res.sa.s + res.name) ;
+        info_display_string(fields[1],res.sa.s + res.description) ;
+        info_display_string(fields[2],res.sa.s + res.version) ;
+        info_display_string(fields[3],res.sa.s + res.logger) ;
+        info_display_string(fields[4],res.sa.s + res.logreal) ;
+        info_display_string(fields[5],res.sa.s + res.logassoc) ;
+        info_display_string(fields[6],res.sa.s + res.dstlog) ;
+        info_display_string(fields[7],res.sa.s + res.depends) ;
+        info_display_string(fields[8],res.sa.s + res.requiredby) ;
+        info_display_string(fields[9],res.sa.s + res.optsdeps) ;
+        info_display_string(fields[10],res.sa.s + res.extdeps) ;
+        info_display_string(fields[11],res.sa.s + res.contents) ;
+        info_display_string(fields[12],res.sa.s + res.src) ;
+        info_display_string(fields[13],res.sa.s + res.srconf) ;
+        info_display_string(fields[14],res.sa.s + res.live) ;
+        info_display_string(fields[15],res.sa.s + res.runat) ;
+        info_display_string(fields[16],res.sa.s + res.tree) ;
+        info_display_string(fields[17],res.sa.s + res.treename) ;
+        info_display_string(fields[18],res.sa.s + res.state) ;
+        info_display_string(fields[19],res.sa.s + res.exec_run) ;
+        info_display_string(fields[20],res.sa.s + res.real_exec_run) ;
+        info_display_string(fields[21],res.sa.s + res.exec_finish) ;
+        info_display_string(fields[22],res.sa.s + res.real_exec_finish) ;
+        info_display_int(fields[23],res.type) ;
+        info_display_int(fields[24],res.ndepends) ;
+        info_display_int(fields[25],res.nrequiredby) ;
+        info_display_int(fields[26],res.noptsdeps) ;
+        info_display_int(fields[27],res.nextdeps) ;
+        info_display_int(fields[28],res.ncontents) ;
+        info_display_int(fields[29],res.down) ;
+        info_display_int(fields[30],res.disen) ;
+
+        if (res.logger && logger)
+        {
+            if (!resolve_read(lwres,src.s,res.sa.s + res.logger)) log_dieusys(111,"read resolve file of: ",res.sa.s + res.logger) ;
+
+            if (buffer_putsflush(buffer_1,"\n") == -1)
+                log_dieusys(LOG_EXIT_SYS,"write to stdout") ;
+
+            info_display_string(fields[31],res.sa.s + res.logreal) ;
+            info_display_string(fields[0],lres.sa.s + lres.name) ;
+            info_display_string(fields[1],lres.sa.s + lres.description) ;
+            info_display_string(fields[2],lres.sa.s + lres.version) ;
+            info_display_string(fields[3],lres.sa.s + lres.logger) ;
+            info_display_string(fields[4],lres.sa.s + lres.logreal) ;
+            info_display_string(fields[5],lres.sa.s + lres.logassoc) ;
+            info_display_string(fields[6],lres.sa.s + lres.dstlog) ;
+            info_display_string(fields[7],lres.sa.s + lres.depends) ;
+            info_display_string(fields[8],lres.sa.s + lres.requiredby) ;
+            info_display_string(fields[12],lres.sa.s + lres.src) ;
+            info_display_string(fields[13],lres.sa.s + lres.srconf) ;
+            info_display_string(fields[14],lres.sa.s + lres.live) ;
+            info_display_string(fields[15],lres.sa.s + lres.runat) ;
+            info_display_string(fields[16],lres.sa.s + lres.tree) ;
+            info_display_string(fields[17],lres.sa.s + lres.treename) ;
+            info_display_string(fields[15],lres.sa.s + lres.state) ;
+            info_display_string(fields[19],lres.sa.s + lres.exec_log_run) ;
+            info_display_string(fields[20],lres.sa.s + lres.real_exec_log_run) ;
+            info_display_int(fields[23],lres.type) ;
+            info_display_int(fields[24],lres.ndepends) ;
+            info_display_int(fields[25],lres.nrequiredby) ;
+            info_display_int(fields[29],lres.down) ;
+            info_display_int(fields[30],lres.disen) ;
+        }
+
+        resolve_free(wres) ;
+        resolve_free(lwres) ;
 
+    } else {
+
+        char tree_buf[MAXOPTS][INFO_FIELD_MAXLEN] = {
+            "Name",
+            "Depends" ,
+            "Requiredby",
+            "Allow",
+            "Groups",
+            "Contents",
+            "Enabled",
+            "Current",
+            "Ndepends",
+            "Nrequiredby",
+            "Nallow",
+            "Ngroups",
+            "Ncontents",
+            "Init" ,
+            "Disen",
+            "Nenabled" } ;
+
+        resolve_tree_t tres = RESOLVE_TREE_ZERO ;
+        resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ;
+
+        if (!set_ownersysdir(&src, getuid()))
+            log_dieusys(LOG_EXIT_SYS, "set owner directory") ;
+
+        found = tree_isvalid(src.s,svname) ;
+        if (found < 0)
+            log_diesys(LOG_EXIT_SYS, "invalid tree directory") ;
+
+        if (!found)
+            log_dieusys(LOG_EXIT_SYS,"find tree: ", svname) ;
+
+        if (!auto_stra(&src, SS_SYSTEM))
+            log_die_nomem("stralloc") ;
+
+        if (!resolve_read(wres,src.s,svname))
+            log_dieusys(LOG_EXIT_SYS,"read resolve file") ;
+
+        info_field_align(tree_buf,fields,field_suffix,MAXOPTS) ;
+
+        info_display_string(fields[0],tres.sa.s + tres.name) ;
+        info_display_string(fields[1],tres.sa.s + tres.depends) ;
+        info_display_string(fields[2],tres.sa.s + tres.requiredby) ;
+        info_display_string(fields[3],tres.sa.s + tres.allow) ;
+        info_display_string(fields[4],tres.sa.s + tres.groups) ;
+        info_display_string(fields[5],tres.sa.s + tres.contents) ;
+        info_display_string(fields[6],tres.sa.s + tres.enabled) ;
+        info_display_string(fields[7],tres.sa.s + tres.current) ;
+        info_display_int(fields[8],tres.ndepends) ;
+        info_display_int(fields[9],tres.nrequiredby) ;
+        info_display_int(fields[10],tres.nallow) ;
+        info_display_int(fields[11],tres.ngroups) ;
+        info_display_int(fields[12],tres.ncontents) ;
+        info_display_int(fields[13],tres.init) ;
+        info_display_int(fields[14],tres.disen) ;
+        info_display_int(fields[15],tres.nenabled) ;
+
+        resolve_free(wres) ;
+
+    }
     freed:
-    resolve_free(wres) ;
-    resolve_free(lwres) ;
+
     stralloc_free(&satree) ;
     stralloc_free(&src) ;
     stralloc_free(&tmp) ;