diff --git a/src/include/66/service.h b/src/include/66/service.h
index fe26e010d2453214dd21e0c884501c8f8cd399e7..bfb1381246c6f0a249ccf972044e700c4bd000cf 100644
--- a/src/include/66/service.h
+++ b/src/include/66/service.h
@@ -305,7 +305,8 @@ extern int service_cmp_basedir(char const *dir) ;
 extern int service_endof_dir(char const *dir, char const *name) ;
 extern int service_frontend_path(stralloc *sasrc,char const *sv, uid_t owner,char const *directory_forced, char const **exclude) ;
 extern int service_frontend_src(stralloc *sasrc, char const *name, char const *src, char const **exclude) ;
-extern int service_is_g(char *atree, char const *name, uint32_t flag) ;
+extern int service_is_g(char const *name, uint32_t flag) ;
+extern int service_get_treename(char *atree, char const *name, uint32_t flag) ;
 extern void service_resolve_array_free(resolve_service_t *ares, unsigned int areslen) ;
 extern int service_resolve_array_search(resolve_service_t *ares, unsigned int areslen, char const *name) ;
 extern int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res) ;
diff --git a/src/lib66/exec/ssexec_env.c b/src/lib66/exec/ssexec_env.c
index d0cb5f2e4e315577539bb13058d0b66ac7f92aec..b4fbd8bcb6699e31cde3d77e2fd88b688271389e 100644
--- a/src/lib66/exec/ssexec_env.c
+++ b/src/lib66/exec/ssexec_env.c
@@ -218,8 +218,6 @@ int ssexec_env(int argc, char const *const *argv, ssexec_t *info)
     resolve_service_t res = RESOLVE_SERVICE_ZERO ;
     resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ;
 
-    char atree[SS_MAX_TREENAME + 1] ;
-
     uint8_t todo = T_UNSET ;
 
     char const *sv = 0, *svconf = 0, *src = 0, *import = 0 ;
@@ -300,7 +298,7 @@ int ssexec_env(int argc, char const *const *argv, ssexec_t *info)
 
     if (todo == T_UNSET && !import && !saversion.len && !eversion.len) todo = T_EDIT ;
 
-    r = service_is_g(atree, sv, STATE_FLAGS_ISPARSED) ;
+    r = service_is_g(sv, STATE_FLAGS_ISPARSED) ;
     if (r == -1)
         log_dieusys(LOG_EXIT_SYS, "get information of service: ", sv, " -- please a bug report") ;
     else if (!r || r == STATE_FLAGS_FALSE) {
diff --git a/src/lib66/exec/ssexec_reconfigure.c b/src/lib66/exec/ssexec_reconfigure.c
index d2515e54b9ec8d8e3ad3d6ead034ca0cc85e90cc..0572da566a06e4a6978fad07c7c90c13f058676a 100644
--- a/src/lib66/exec/ssexec_reconfigure.c
+++ b/src/lib66/exec/ssexec_reconfigure.c
@@ -44,7 +44,6 @@ int ssexec_reconfigure(int argc, char const *const *argv, ssexec_t *info)
 
     unsigned int areslen = 0, list[SS_MAX_SERVICE + 1], visit[SS_MAX_SERVICE + 1], nservice = 0, n = 0 ;
     resolve_service_t ares[SS_MAX_SERVICE + 1] ;
-    char atree[SS_MAX_TREENAME + 1] ;
 
     FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_TOPARSE|STATE_FLAGS_WANTUP) ;
 
@@ -96,7 +95,7 @@ int ssexec_reconfigure(int argc, char const *const *argv, ssexec_t *info)
         if (!state_messenger(&ares[aresid], STATE_FLAGS_TOPARSE, STATE_FLAGS_TRUE))
             log_dieusys(LOG_EXIT_SYS, "send message to state of: ", argv[n]) ;
 
-        r = service_is_g(atree, argv[n], STATE_FLAGS_ISSUPERVISED) ;
+        r = service_is_g(argv[n], STATE_FLAGS_ISSUPERVISED) ;
         if (r < 0)
             log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ;
 
diff --git a/src/lib66/exec/ssexec_reload.c b/src/lib66/exec/ssexec_reload.c
index f6c7361cb9ff31b3c9d0b5326a756346eb232cee..436a0d644efcacc256bd9218edb5e6ae3a4a2521 100644
--- a/src/lib66/exec/ssexec_reload.c
+++ b/src/lib66/exec/ssexec_reload.c
@@ -40,7 +40,6 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info)
 
     unsigned int areslen = 0, m = 0 ;
     resolve_service_t ares[SS_MAX_SERVICE + 1] ;
-    char atree[SS_MAX_TREENAME + 1] ;
 
     FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_WANTUP) ;
 
@@ -84,7 +83,7 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info)
 
     for (; n < argc ; n++) {
 
-        r = service_is_g(atree, argv[n], STATE_FLAGS_ISPARSED) ;
+        r = service_is_g(argv[n], STATE_FLAGS_ISPARSED) ;
         if (r < 0)
             log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ;
 
@@ -94,7 +93,7 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info)
             return 0 ;
         }
 
-        r = service_is_g(atree, argv[n], STATE_FLAGS_ISSUPERVISED) ;
+        r = service_is_g(argv[n], STATE_FLAGS_ISSUPERVISED) ;
         if (r < 0)
             log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ;
 
diff --git a/src/lib66/exec/ssexec_resolve.c b/src/lib66/exec/ssexec_resolve.c
index 00610854a3881f1649fa735efb34461acd263307..f8df5af4946c8eec4b0dd7bf8a6d8d8a148df92f 100644
--- a/src/lib66/exec/ssexec_resolve.c
+++ b/src/lib66/exec/ssexec_resolve.c
@@ -163,7 +163,6 @@ int ssexec_resolve(int argc, char const *const *argv, ssexec_t *info)
     int r = 0 ;
 
     char const *svname = 0 ;
-    char atree[SS_MAX_TREENAME + 1] ;
 
     resolve_service_t res = RESOLVE_SERVICE_ZERO ;
     resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ;
@@ -260,7 +259,7 @@ int ssexec_resolve(int argc, char const *const *argv, ssexec_t *info)
     } ;
 
 
-    r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ;
+    r = service_is_g(svname, STATE_FLAGS_ISPARSED) ;
     if (r == -1)
         log_dieu(LOG_EXIT_SYS, "get information of service: ", svname, " -- please a bug report") ;
     else if (!r || r == STATE_FLAGS_FALSE)
diff --git a/src/lib66/exec/ssexec_state.c b/src/lib66/exec/ssexec_state.c
index 61d11b30193209500285b5837a166f047a3a939c..cb28b86651746ceff161aeb60e13dc88eb991fb7 100644
--- a/src/lib66/exec/ssexec_state.c
+++ b/src/lib66/exec/ssexec_state.c
@@ -67,7 +67,6 @@ int ssexec_state(int argc, char const *const *argv, ssexec_t *info)
 
     ss_state_t sta = STATE_ZERO ;
     char const *svname = 0 ;
-    char atree[SS_MAX_TREENAME + 1] ;
 
     char buf[MAXOPTS][INFO_FIELD_MAXLEN] = {
         "toinit",
@@ -90,7 +89,7 @@ int ssexec_state(int argc, char const *const *argv, ssexec_t *info)
 
     svname = *argv ;
 
-    r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ;
+    r = service_is_g(svname, STATE_FLAGS_ISPARSED) ;
     if (r == -1)
         log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please a bug report") ;
     else if (!r || r == STATE_FLAGS_FALSE)
diff --git a/src/lib66/exec/ssexec_status.c b/src/lib66/exec/ssexec_status.c
index 0cebee134d1e37d873fb1dbb7f604e78ce5ae547..2c021f6ed3a7b5b4de306cd8c927ab3bb798f537 100644
--- a/src/lib66/exec/ssexec_status.c
+++ b/src/lib66/exec/ssexec_status.c
@@ -881,7 +881,6 @@ int ssexec_status(int argc, char const *const *argv, ssexec_t *info)
     resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ;
 
     char const *svname = 0 ;
-    char atree[SS_MAX_TREENAME + 1] ;
 
     for (int i = 0 ; i < MAXOPTS ; i++)
         what[i] = -1 ;
@@ -953,7 +952,7 @@ int ssexec_status(int argc, char const *const *argv, ssexec_t *info)
     if(!strcmp(nl_langinfo(CODESET), "UTF-8"))
         S_STYLE = &graph_utf8;
 
-    r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ;
+    r = service_is_g(svname, STATE_FLAGS_ISPARSED) ;
     if (r < 0)
         log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please make a bug report") ;
 
diff --git a/src/lib66/info/info_walk.c b/src/lib66/info/info_walk.c
index bc6d72b9827a1a82e89d1f4aa7945712949acf4a..e6acb907a3c883479c9f5aa0cdc82ba9b042f484 100644
--- a/src/lib66/info/info_walk.c
+++ b/src/lib66/info/info_walk.c
@@ -73,7 +73,8 @@ int info_walk(graph_t *g, char const *name, char const *treename, info_graph_fun
         if (depth->level == 1 && treename) {
             char atree[SS_MAX_TREENAME + 1] ;
 
-            service_is_g(atree, name, 0) ;
+            if (!service_get_treename(atree, name, 0))
+                goto err ;
 
             if (strcmp(treename, atree))
                 continue ;
diff --git a/src/lib66/parse/parse_frontend.c b/src/lib66/parse/parse_frontend.c
index 31f88b9c693f063246e80a7d160af26a65dfb171..39edf232d4dac5156491f2d21eebb62159560207 100644
--- a/src/lib66/parse/parse_frontend.c
+++ b/src/lib66/parse/parse_frontend.c
@@ -92,7 +92,6 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
     uint8_t opt_tree_forced = 0 ;
     size_t svlen = strlen(sv) ;
     char svname[svlen + 1], svsrc[svlen + 1] ;
-    char atree[SS_MAX_TREENAME + 1] ;
     stralloc sa = STRALLOC_ZERO ;
 
     if (!ob_basename(svname, sv))
@@ -142,7 +141,7 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
     char file[sa.len + 1] ;
     auto_strings(file, sa.s) ;
 
-    isparsed = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ;
+    isparsed = service_is_g(svname, STATE_FLAGS_ISPARSED) ;
     if (isparsed == -1)
         log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please make a bug report") ;
     else if (!isparsed)
diff --git a/src/lib66/sanitize/sanitize_source.c b/src/lib66/sanitize/sanitize_source.c
index f678f0edd990e6a1ad3b0562991f19827476a199..1b54882e9129df3560fba6c0902a65e7da54fc97 100644
--- a/src/lib66/sanitize/sanitize_source.c
+++ b/src/lib66/sanitize/sanitize_source.c
@@ -31,9 +31,8 @@ void sanitize_source(char const *name, ssexec_t *info)
 
     int r ;
     ssize_t logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ;
-    char atree[SS_MAX_TREENAME + 1] ;
 
-    r = service_is_g(atree, name, STATE_FLAGS_ISPARSED) ;
+    r = service_is_g(name, STATE_FLAGS_ISPARSED) ;
     if (r == -1)
         log_dieusys(LOG_EXIT_SYS, "get information of service: ", name, " -- please a bug report") ;
 
diff --git a/src/lib66/service/service_is_g.c b/src/lib66/service/service_is_g.c
index 22da6385a56306b9b1b40d461dbc7db3eb74187f..16656602bca3fa0674f3d05cccfebd2c493d82d4 100644
--- a/src/lib66/service/service_is_g.c
+++ b/src/lib66/service/service_is_g.c
@@ -65,11 +65,53 @@ int service_is(ss_state_t *ste, uint32_t flag)
     return STATE_FLAGS_FALSE ;
 }
 
+int service_get_treename(char *atree, char const *name, uint32_t flag)
+{
+    log_flow() ;
+
+    int e = 0, r = -1 ;
+    resolve_service_t res = RESOLVE_SERVICE_ZERO ;
+    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ;
+
+    char base[SS_MAX_PATH_LEN + SS_SYSTEM_LEN + 1] ;
+
+    if (!set_ownersysdir_stack(base, getuid())) {
+        resolve_free(wres) ;
+        log_warnusys_return(LOG_EXIT_ZERO, "set owner directory") ;
+    }
+
+    size_t baselen = strlen(base) ;
+    auto_strings(base + baselen, SS_SYSTEM) ;
+
+    // no tree exist yet
+    if (!scan_mode(base, S_IFDIR))
+        goto freed ;
+
+    base[baselen] = 0 ;
+
+    r = resolve_read_g(wres, base, name) ;
+    if (r == -1 || !r)
+        goto freed ;
+
+    if (strlen(res.sa.s + res.treename) >= SS_MAX_TREENAME) {
+        errno = ENAMETOOLONG ;
+        goto freed ;
+    }
+
+    auto_strings(atree, res.sa.s + res.treename) ;
+
+    e = 1 ;
+
+    freed:
+        resolve_free(wres) ;
+        return e ;
+}
+
 /*@Return :
  * -1 system error
  * 0 check fail
  * STATE_FLAGS_TRUE/STATE_FLAGS_FALSE check success */
-int service_is_g(char *atree, char const *name, uint32_t flag)
+int service_is_g(char const *name, uint32_t flag)
 {
 
     log_flow() ;
@@ -106,13 +148,6 @@ int service_is_g(char *atree, char const *name, uint32_t flag)
         goto freed ;
     }
 
-    if (strlen(res.sa.s + res.treename) >= SS_MAX_TREENAME) {
-        errno = ENAMETOOLONG ;
-        goto freed ;
-    }
-
-    auto_strings(atree, res.sa.s + res.treename) ;
-
     if (!state_read(&ste, &res)) {
         log_warnu("read state file of: ", name, " -- please make a bug report") ;
         goto freed ;