diff --git a/src/include/66/state.h b/src/include/66/state.h
index edd319e66aa48991a9997e3e5b762dd452270c88..7f0e49fb72703d6bd8bdc8f568e42c761af440df 100644
--- a/src/include/66/state.h
+++ b/src/include/66/state.h
@@ -19,6 +19,8 @@
 
 #include <skalibs/uint32.h>
 
+#include <66/service.h>
+
 #define STATE_STATE_SIZE 44
 
 #define STATE_FLAGS_FALSE (1 << 1) // 2
@@ -63,14 +65,13 @@ struct ss_state_s
 #define STATE_ZERO { 2,2,2,2,2,2,2,2,2,2,2 }
 extern ss_state_t const ss_state_zero ;
 
-extern int state_check(char const *base, char const *name) ;
-extern void state_rmfile(char const *base, char const *name) ;
+extern void state_rmfile(resolve_service_t *res) ;
 extern void state_pack(char *base, ss_state_t *sta) ;
 extern void state_unpack(char *pack, ss_state_t *sta) ;
-extern int state_write(ss_state_t *sta, char const *base, char const *name) ;
-extern int state_read(ss_state_t *sta, char const *base, char const *name) ;
 extern void state_set_flag(ss_state_t *sta, int flags,int flags_val) ;
-extern int state_get_flags(char const *base, char const *name, int flags) ;
-extern int state_messenger(char const *base, char const *name, uint32_t flag, uint32_t value) ;
+extern int state_check(resolve_service_t *res) ;
+extern int state_write(ss_state_t *sta, resolve_service_t *res) ;
+extern int state_read(ss_state_t *sta, resolve_service_t *res) ;
+extern int state_messenger(resolve_service_t *res, uint32_t flag, uint32_t value) ;
 
 #endif
diff --git a/src/lib66/exec/ssexec_init.c b/src/lib66/exec/ssexec_init.c
index adf22c4c5442f38a7ae44d8bf5d2371470fe9d4b..238f7cec72f977fd7c384850c6b6efdca5621742 100644
--- a/src/lib66/exec/ssexec_init.c
+++ b/src/lib66/exec/ssexec_init.c
@@ -33,6 +33,7 @@
 #include <66/state.h>
 #include <66/graph.h>
 #include <66/sanitize.h>
+
 /**
  *
  *
@@ -83,7 +84,7 @@ static void doit(stralloc *sa, ssexec_t *info, uint8_t earlier)
 
             } else {
 
-                if (!state_read(&ste, ares[aresid].sa.s + ares[aresid].path.home, sa->s + n))
+                if (!state_read(&ste, &ares[aresid]))
                     log_dieusys(LOG_EXIT_SYS, "read state file of service: ", sa->s + n) ;
 
                 if (service_is(&ste, STATE_FLAGS_ISENABLED)) {
@@ -118,7 +119,7 @@ static void doit(stralloc *sa, ssexec_t *info, uint8_t earlier)
 
                 } else {
 
-                    if (!state_read(&ste, ares[aresid].sa.s + ares[aresid].path.home, name))
+                    if (!state_read(&ste, &ares[aresid]))
                         log_dieusys(LOG_EXIT_SYS, "read state file of service: ", name) ;
 
                     if (service_is(&ste, STATE_FLAGS_ISENABLED)) {
@@ -171,7 +172,7 @@ int ssexec_init(int argc, char const *const *argv, ssexec_t *info)
     if (!argc)
         log_usage(info->usage, "\n", info->help) ;
 
-    treename = argv[1] ;
+    treename = argv[0] ;
 
     if (!tree_isvalid(info->base.s, treename))
         log_diesys(LOG_EXIT_USER, "invalid tree name: ", treename) ;
diff --git a/src/lib66/exec/ssexec_state.c b/src/lib66/exec/ssexec_state.c
index 61fc74ad4102ee6beeca28bbcc34c06bb6db0d90..55c8f7cd3bb595c8333f62633ccd01781e39cf19 100644
--- a/src/lib66/exec/ssexec_state.c
+++ b/src/lib66/exec/ssexec_state.c
@@ -12,28 +12,20 @@
  * except according to the terms contained in the LICENSE file./
  */
 
-
-#include <string.h>
 #include <wchar.h>
 
 #include <oblibs/log.h>
-#include <oblibs/sastr.h>
-#include <oblibs/string.h>
-#include <oblibs/obgetopt.h>
-#include <oblibs/types.h>
 
 #include <skalibs/types.h>
-#include <skalibs/stralloc.h>
 #include <skalibs/lolstdio.h>
 #include <skalibs/buffer.h>
 
-#include <66/resolve.h>
-#include <66/ssexec.h>
 #include <66/info.h>
-#include <66/utils.h>
-#include <66/constants.h>
+#include <66/resolve.h>
+#include <66/service.h>
 #include <66/state.h>
 #include <66/config.h>
+#include <66/ssexec.h>
 
 #define MAXOPTS 11
 
@@ -70,13 +62,12 @@ static void info_display_int(char const *field,unsigned int id)
 
 int ssexec_state(int argc, char const *const *argv, ssexec_t *info)
 {
-    int found = 0 ;
+    int 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 + 1] ;
+
     ss_state_t sta = STATE_ZERO ;
     char const *svname = 0 ;
-    char const *ste = 0 ;
     char atree[SS_MAX_TREENAME + 1] ;
 
     char buf[MAXOPTS][INFO_FIELD_MAXLEN] = {
@@ -94,22 +85,25 @@ int ssexec_state(int argc, char const *const *argv, ssexec_t *info)
     argc-- ;
     argv++ ;
 
-    if (!argc) log_usage(info->usage, "\n", info->help) ;
-    svname = *argv ;
+    if (!argc)
+        log_usage(info->usage, "\n", info->help) ;
 
-    if (!set_ownersysdir_stack(base, getuid()))
-        log_dieu(LOG_EXIT_SYS, "set owner directory") ;
+    svname = *argv ;
 
-    found = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ;
-    if (found == -1)
+    r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ;
+    if (r == -1)
         log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please a bug report") ;
-    else if (!found)
+    else if (!r)
         log_die(LOG_EXIT_USER, "unknown service: ", svname) ;
 
+    r = resolve_read_g(wres, info->base.s, svname) ;
+    if (r < 0)
+        log_dieu(LOG_EXIT_SYS, "read resolve file: ", svname) ;
+
     info_field_align(buf,fields,field_suffix,MAXOPTS) ;
 
-    if (!state_check(base, svname)) log_diesys(111,"unitialized service: ",svname) ;
-    if (!state_read(&sta, base, svname)) log_dieusys(111,"read state file of: ",ste,"/",svname) ;
+    if (!state_read(&sta, &res))
+        log_dieusys(111,"read state file of: ", svname) ;
 
     info_display_int(fields[0],sta.toinit) ;
     info_display_int(fields[1],sta.toreload) ;
@@ -122,7 +116,6 @@ int ssexec_state(int argc, char const *const *argv, ssexec_t *info)
     info_display_int(fields[8],sta.issupervised) ;
     info_display_int(fields[9],sta.isup) ;
 
-
     resolve_free(wres) ;
 
     return 0 ;
diff --git a/src/lib66/exec/ssexec_tree_status.c b/src/lib66/exec/ssexec_tree_status.c
index 4b2acd5d4cc5d203e571537d4c241adf0ec3e320..bc8a1a7fd74406671b9fc876d014a0a6a8d7456f 100644
--- a/src/lib66/exec/ssexec_tree_status.c
+++ b/src/lib66/exec/ssexec_tree_status.c
@@ -41,6 +41,7 @@
 #include <66/service.h>
 #include <66/graph.h>
 #include <66/ssexec.h>
+#include <66/state.h>
 
 static unsigned int REVERSE = 0 ;
 static unsigned int NOFIELD = 1 ;
diff --git a/src/lib66/info/info_graph_display_service.c b/src/lib66/info/info_graph_display_service.c
index 52c517b8ed36afc5992192e02d197fc8af8b1db1..6122322e9d6f991e1aebe52e6dd20cbbb39d8652 100644
--- a/src/lib66/info/info_graph_display_service.c
+++ b/src/lib66/info/info_graph_display_service.c
@@ -55,8 +55,8 @@ int info_graph_display_service(char const *name)
         goto freed ;
     }
 
-    if (!state_read(&sta, res.sa.s + res.path.home, name)) {
-        log_warnusys("read state of: ",name) ;
+    if (!state_read(&sta, &res)) {
+        log_warnusys("read state of: ", name) ;
         goto freed ;
     }
 
diff --git a/src/lib66/sanitize/sanitize_livestate.c b/src/lib66/sanitize/sanitize_livestate.c
index 1055736684e85d996438cd2a412fe698c4e04bb3..c633b706b88ec191c25b57fbcf73cfa225a34b18 100644
--- a/src/lib66/sanitize/sanitize_livestate.c
+++ b/src/lib66/sanitize/sanitize_livestate.c
@@ -51,6 +51,7 @@ static void sanitize_livestate_directory(resolve_service_t *res)
         log_diesys(LOG_EXIT_SYS, "conflicting format for: ", ste) ;
     if (!r) {
 
+        log_trace("create directory: ", ste) ;
         r = dir_create_parent(ste, 0700) ;
         if (!r)
             log_dieusys(LOG_EXIT_SYS, "create directory: ", ste) ;
@@ -72,7 +73,6 @@ static void sanitize_livestate_service_symlink(resolve_service_t *res)
     size_t livelen = strlen(res->sa.s + res->live.livedir) ;
     size_t ownerlen = strlen(res->sa.s + res->ownerstr) ;
     size_t homelen = strlen(res->sa.s + res->path.home) ;
-
     char sym[livelen + SS_STATE_LEN + 1 + ownerlen + 1 + namelen + 1] ;
     char dst[homelen + SS_SYSTEM_LEN + SS_SERVICE_LEN + SS_SVC_LEN + 1 + namelen + 1] ;
 
@@ -80,6 +80,7 @@ static void sanitize_livestate_service_symlink(resolve_service_t *res)
 
     auto_strings(dst, res->sa.s + res->path.home, SS_SYSTEM, SS_SERVICE, SS_SVC, "/", name) ;
 
+    log_trace("symlink: ", sym, " to: ", dst) ;
     if (!atomic_symlink(dst, sym, "livestate"))
        log_dieu(LOG_EXIT_SYS, "symlink: ", sym, " to: ", dst) ;
 }
@@ -95,6 +96,7 @@ void sanitize_livestate(resolve_service_t *res, uint32_t flag)
     size_t ownerlen = strlen(res->sa.s + res->owner) ;
 
     char ste[livelen + SS_STATE_LEN + 1 + ownerlen + 1 + namelen + 1] ;
+
     auto_strings(ste, res->sa.s + res->live.livedir, SS_STATE + 1, "/", res->sa.s + res->ownerstr, "/", name) ;
 
     r = access(ste, F_OK) ;
@@ -108,14 +110,15 @@ void sanitize_livestate(resolve_service_t *res, uint32_t flag)
 
         if (FLAGS_ISSET(flag, STATE_FLAGS_TOUNSUPERVISE)) {
 
+            log_trace("unlink: ", ste) ;
             unlink_void(ste) ;
 
-            if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TORELOAD, STATE_FLAGS_FALSE))
+            if (!state_messenger(res, STATE_FLAGS_TORELOAD, STATE_FLAGS_FALSE))
                 log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ;
         }
     }
 
-    if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TOINIT, STATE_FLAGS_FALSE))
+    if (!state_messenger(res, STATE_FLAGS_TOINIT, STATE_FLAGS_FALSE))
         log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ;
 
 }
diff --git a/src/lib66/sanitize/sanitize_scandir.c b/src/lib66/sanitize/sanitize_scandir.c
index 4a3be0201214ee5a88be19fb25a24a0df27d0586..e57e9b506fd0fe995ef951efdea48b2a865e7516 100644
--- a/src/lib66/sanitize/sanitize_scandir.c
+++ b/src/lib66/sanitize/sanitize_scandir.c
@@ -46,6 +46,7 @@ static void scandir_scandir_to_livestate(resolve_service_t *res)
 
     auto_strings(dst, res->sa.s + res->live.livedir, SS_STATE + 1, "/", res->sa.s + res->ownerstr, "/", name) ;
 
+    log_trace("symlink: ", sym, " to: ", dst) ;
     if (!atomic_symlink(dst, sym, "scandir"))
        log_dieu(LOG_EXIT_SYS, "symlink: ", sym, " to: ", dst) ;
 }
@@ -66,6 +67,7 @@ static void scandir_service_to_scandir(resolve_service_t *res)
 
     auto_strings(dst, res->sa.s + res->live.livedir, SS_SCANDIR, "/", res->sa.s + res->ownerstr) ;
 
+    log_trace("symlink: ", sym, " to: ", dst) ;
     if (!atomic_symlink(dst, sym, "scandir"))
        log_dieu(LOG_EXIT_SYS, "symlink: ", sym, " to: ", dst) ;
 }
@@ -77,6 +79,7 @@ static void compute_supervision_dir(resolve_service_t *res)
     char *supervise = res->sa.s + res->live.supervisedir ;
 
     /* event dir */
+    log_trace("create directory: ", event) ;
     int r = dir_create_parent(event, 0700) ;
     if (!r)
         log_dieusys(LOG_EXIT_SYS, "create directory: ", event) ;
@@ -88,6 +91,7 @@ static void compute_supervision_dir(resolve_service_t *res)
         log_dieusys(LOG_EXIT_SYS, "chmod: ", event) ;
 
     /* supervise dir*/
+    log_trace("create directory: ", supervise) ;
     r = dir_create_parent(supervise, 0700) ;
     if (!r)
         log_dieusys(LOG_EXIT_SYS, "create directory: ", event) ;
@@ -124,10 +128,10 @@ void sanitize_scandir(resolve_service_t *res, uint32_t flag)
                 log_dieu(LOG_EXIT_SYS, "reload scandir: ", svcandir) ;
         }
 
-        if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_ISSUPERVISED, STATE_FLAGS_TRUE))
+        if (!state_messenger(res, STATE_FLAGS_ISSUPERVISED, STATE_FLAGS_TRUE))
            log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ;
 
-        if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE))
+        if (!state_messenger(res, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE))
             log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ;
 
     } else {
@@ -139,10 +143,10 @@ void sanitize_scandir(resolve_service_t *res, uint32_t flag)
 
             unlink_void(s) ;
 
-            if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_ISSUPERVISED, STATE_FLAGS_FALSE))
+            if (!state_messenger(res, STATE_FLAGS_ISSUPERVISED, STATE_FLAGS_FALSE))
                 log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ;
 
-            if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE))
+            if (!state_messenger(res, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE))
                 log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ;
 
             if (svc_scandir_send(svcandir, "an") <= 0)
@@ -154,10 +158,10 @@ void sanitize_scandir(resolve_service_t *res, uint32_t flag)
             if (svc_scandir_send(svcandir, "a") <= 0)
                 log_dieu(LOG_EXIT_SYS, "reload scandir: ", svcandir) ;
 
-            if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TORELOAD, STATE_FLAGS_FALSE))
+            if (!state_messenger(res, STATE_FLAGS_TORELOAD, STATE_FLAGS_FALSE))
                 log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ;
 
-            if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE))
+            if (!state_messenger(res, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE))
                 log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ;
         }
     }
diff --git a/src/lib66/service/service_graph_build.c b/src/lib66/service/service_graph_build.c
index 21a0df535aa97a4d91810c97aa6bed8d415a98bb..6a5fce7c64487c7c2b00d78d4d7fe9a270b770a8 100644
--- a/src/lib66/service/service_graph_build.c
+++ b/src/lib66/service/service_graph_build.c
@@ -24,7 +24,7 @@
 #include <66/graph.h>
 #include <66/state.h>
 
-static void issupervised(char *store, char const *base, char const *str)
+static void issupervised(char *store, resolve_service_t *ares, unsigned int areslen, char const *str)
 {
     size_t pos = 0 ;
     ss_state_t ste = STATE_ZERO ;
@@ -39,10 +39,16 @@ static void issupervised(char *store, char const *base, char const *str)
 
         char *name = sa.s + pos ;
 
-        if (!state_check(base, name))
+        int aresid = service_resolve_array_search(ares, areslen, name) ;
+        if (aresid < 0) {
+            log_warn("service: ", name, " not available -- ignore it") ;
+            continue ;
+        }
+
+        if (!state_check(&ares[aresid]))
             continue ;
 
-        if (!state_read(&ste, base, name))
+        if (!state_read(&ste, &ares[aresid]))
             continue ;
 
         if (service_is(&ste, STATE_FLAGS_ISSUPERVISED))
@@ -79,8 +85,7 @@ void service_graph_build(graph_t *g, resolve_service_t *ares, unsigned int aresl
 
                 if (FLAGS_ISSET(flag, STATE_FLAGS_ISSUPERVISED)) {
 
-                    issupervised(store, pres->sa.s + pres->path.home, pres->sa.s + pres->dependencies.depends) ;
-
+                    issupervised(store, ares, areslen, pres->sa.s + pres->dependencies.depends) ;
 
                 } else {
 
@@ -99,7 +104,7 @@ void service_graph_build(graph_t *g, resolve_service_t *ares, unsigned int aresl
 
                 if (FLAGS_ISSET(flag, STATE_FLAGS_ISSUPERVISED)) {
 
-                    issupervised(store, pres->sa.s + pres->path.home, pres->sa.s + pres->dependencies.requiredby) ;
+                    issupervised(store, ares, areslen, pres->sa.s + pres->dependencies.requiredby) ;
 
                 } else {
 
diff --git a/src/lib66/service/service_graph_collect.c b/src/lib66/service/service_graph_collect.c
index bfd81d7948e409c887c2afb678549143bc22ef59..2cc14a0187780220bd3bf6360901938270839053 100644
--- a/src/lib66/service/service_graph_collect.c
+++ b/src/lib66/service/service_graph_collect.c
@@ -76,7 +76,7 @@ void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_s
             } else if (!FLAGS_ISSET(flag, STATE_FLAGS_TOPARSE))
                 continue ;
 
-            if (FLAGS_ISSET(flag, STATE_FLAGS_TOPARSE))
+            if (FLAGS_ISSET(flag, STATE_FLAGS_TOPARSE) && !r)
                 sanitize_source(name, info, flag) ;
 
             if (!resolve_read_g(wres, info->base.s, name))
@@ -84,7 +84,7 @@ void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_s
 
             if (FLAGS_ISSET(flag, STATE_FLAGS_ISSUPERVISED)) {
 
-                if (!state_read(&ste, res.sa.s + res.path.home, name))
+                if (!state_read(&ste, &res))
                     log_dieu(LOG_EXIT_SYS, "read state file of: ", name, " -- please make a bug report") ;
 
                 if (service_is(&ste, STATE_FLAGS_ISSUPERVISED)) {
@@ -110,15 +110,6 @@ void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_s
 
             if (FLAGS_ISSET(flag, STATE_FLAGS_TOPROPAGATE)) {
 
-                stralloc module = STRALLOC_ZERO ;
-
-                if (res.type == TYPE_MODULE) {
-
-                    if (res.regex.ncontents)
-                        if (!sastr_clean_string(&module, res.sa.s + res.regex.contents))
-                            log_dieu(LOG_EXIT_SYS, "clean string") ;
-                }
-
                 if (res.dependencies.ndepends && FLAGS_ISSET(flag, STATE_FLAGS_WANTUP)) {
 
                     sa.len = 0 ;
@@ -126,14 +117,6 @@ void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_s
                     if (!sastr_clean_string(&sa, res.sa.s + res.dependencies.depends))
                         log_dieu(LOG_EXIT_SYS, "clean string") ;
 
-                    if (module.len) {
-                        FOREACH_SASTR(&module, pos)
-                            sastr_add_string(&sa, module.s + pos) ;
-                    }
-
-                    stralloc_0(&sa) ;
-                    sa.len-- ;
-
                     service_graph_collect(g, sa.s, sa.len, ares, areslen, info, flag) ;
 
                 }
@@ -145,18 +128,9 @@ void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_s
                     if (!sastr_clean_string(&sa, res.sa.s + res.dependencies.requiredby))
                         log_dieu(LOG_EXIT_SYS, "clean string") ;
 
-                    if (module.len) {
-                        FOREACH_SASTR(&module, pos)
-                            sastr_add_string(&sa, module.s + pos) ;
-                    }
-
-                    stralloc_0(&sa) ;
-                    sa.len-- ;
-
                     service_graph_collect(g, sa.s, sa.len, ares, areslen, info, flag) ;
                 }
 
-                stralloc_free(&module) ;
             }
             resolve_free(wres) ;
         }
diff --git a/src/lib66/service/service_is_g.c b/src/lib66/service/service_is_g.c
index 4ed6b37dec9a472e4e2a7460963adfceccff3a37..cf36bd692e59d05a88b97f3508034934b3178330 100644
--- a/src/lib66/service/service_is_g.c
+++ b/src/lib66/service/service_is_g.c
@@ -113,7 +113,7 @@ int service_is_g(char *atree, char const *name, uint32_t flag)
 
     auto_strings(atree, res.sa.s + res.treename) ;
 
-    if (!state_read(&ste, res.sa.s + res.path.home, name)) {
+    if (!state_read(&ste, &res)) {
         log_warnu("read state file of: ", name, " -- please make a bug report") ;
         goto freed ;
     }
diff --git a/src/lib66/state/deps-lib/deps b/src/lib66/state/deps-lib/deps
index 8e957dc4637f3e4e4be9f08e1137f8f2665d6a49..aff0afdb1386915c3593dbad1d3f333d8c278b43 100644
--- a/src/lib66/state/deps-lib/deps
+++ b/src/lib66/state/deps-lib/deps
@@ -1,5 +1,4 @@
 state_check.o
-state_get_flags.o
 state_messenger.o
 state_pack.o
 state_read.o
diff --git a/src/lib66/state/state_check.c b/src/lib66/state/state_check.c
index 4985757280c495b40c70d84396a11dbad11db998..7f8336f387e06a1cea0b0721ec920a707c924197 100644
--- a/src/lib66/state/state_check.c
+++ b/src/lib66/state/state_check.c
@@ -20,17 +20,17 @@
 
 #include <66/state.h>
 #include <66/constants.h>
-#include <66/resolve.h>
+#include <66/service.h>
 
-int state_check(char const *base, char const *name)
+int state_check(resolve_service_t *res)
 {
     log_flow() ;
 
-    size_t baselen = strlen(base) ;
-    size_t namelen = strlen(name) ;
-    char target[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + SS_SVC_LEN + 1 + namelen + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ;
+    size_t len = strlen(res->sa.s + res->path.servicedir) ;
 
-    auto_strings(target, base, SS_SYSTEM, SS_RESOLVE, SS_SERVICE, "/", name, SS_SVC, "/", name, SS_STATE, "/", SS_STATUS) ;
+    char target[len + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ;
+
+    auto_strings(target, res->sa.s + res->path.servicedir, SS_STATE, "/", SS_STATUS) ;
 
     if (access(target, F_OK) < 0)
         return 0 ;
diff --git a/src/lib66/state/state_get_flags.c b/src/lib66/state/state_get_flags.c
deleted file mode 100644
index f73128459d65498c8a4a67655bfe130a5b6b60a7..0000000000000000000000000000000000000000
--- a/src/lib66/state/state_get_flags.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * state_get_flags.c
- *
- * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
- *
- * All rights reserved.
- *
- * This file is part of Obarun. It is subject to the license terms in
- * the LICENSE file found in the top-level directory of this
- * distribution.
- * This file may not be copied, modified, propagated, or distributed
- * except according to the terms contained in the LICENSE file./
- */
-
-#include <oblibs/log.h>
-
-#include <66/state.h>
-
-int state_get_flags(char const *base, char const *name, int flags)
-{
-    log_flow() ;
-
-    /** not parsed.
-     * Return -1 to make a distinction between
-     * file absent and flag == 0. */
-    if (!state_check(base, name))
-        return -1 ;
-
-    ss_state_t sta = STATE_ZERO ;
-
-    if (!state_read(&sta, base, name))
-        // should not happen
-        return -1 ;
-
-    switch (flags)
-    {
-        case STATE_FLAGS_TOINIT: return sta.toinit ;
-        case STATE_FLAGS_TORELOAD: return sta.toreload ;
-        case STATE_FLAGS_TORESTART: return sta.torestart ;
-        case STATE_FLAGS_TOUNSUPERVISE: return sta.tounsupervise ;
-        case STATE_FLAGS_TOPARSE: return sta.toparse ;
-        case STATE_FLAGS_ISDOWNFILE: return sta.isdownfile ;
-        case STATE_FLAGS_ISEARLIER: return sta.isearlier ;
-        case STATE_FLAGS_ISENABLED: return sta.isenabled ;
-        case STATE_FLAGS_ISPARSED: return sta.isparsed ;
-        case STATE_FLAGS_ISSUPERVISED: return sta.issupervised ;
-        case STATE_FLAGS_ISUP: return sta.isup ;
-        default:
-            // should never happen
-            return -1 ;
-    }
-
-}
diff --git a/src/lib66/state/state_messenger.c b/src/lib66/state/state_messenger.c
index 876887e6e6a9592290e5c461bc4dcb02b7cf7cd5..35ca82f2f9308030965032f571f6106e2881ad64 100644
--- a/src/lib66/state/state_messenger.c
+++ b/src/lib66/state/state_messenger.c
@@ -16,21 +16,21 @@
 
 #include <oblibs/log.h>
 #include <66/state.h>
+#include <66/service.h>
 
-int state_messenger(char const *base, char const *name, uint32_t flag, uint32_t value)
+int state_messenger(resolve_service_t *res, uint32_t flag, uint32_t value)
 {
     log_flow() ;
 
     ss_state_t sta = STATE_ZERO ;
 
-    if (!state_read(&sta, base, name))
-        log_warnusys_return(LOG_EXIT_ZERO, "read status file of: ", name) ;
+    if (!state_read(&sta, res))
+        log_warnusys_return(LOG_EXIT_ZERO, "read status file of: ", res->sa.s + res->name) ;
 
     state_set_flag(&sta, flag, value) ;
 
-    if (!state_write(&sta, base, name))
-        log_warnusys_return(LOG_EXIT_ZERO, "write status file of: ", name) ;
-
+    if (!state_write(&sta, res))
+        log_warnusys_return(LOG_EXIT_ZERO, "write status file of: ", res->sa.s + res->name) ;
 
     return 1 ;
 }
diff --git a/src/lib66/state/state_read.c b/src/lib66/state/state_read.c
index faccddb5d56299ebf15f8ccf7c4b9d0d263f1258..0d696a111af1a5a8931be3f7ebe4cdb7349f1020 100644
--- a/src/lib66/state/state_read.c
+++ b/src/lib66/state/state_read.c
@@ -21,18 +21,18 @@
 
 #include <66/state.h>
 #include <66/constants.h>
-#include <66/resolve.h>
+#include <66/service.h>
 
-int state_read(ss_state_t *sta, char const *base, char const *name)
+int state_read(ss_state_t *sta, resolve_service_t *res)
 {
     log_flow() ;
 
-    size_t baselen = strlen(base) ;
-    size_t namelen = strlen(name) ;
+    size_t len = strlen(res->sa.s + res->path.servicedir) ;
+
     char pack[STATE_STATE_SIZE] ;
-    char target[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + SS_SVC_LEN + 1 + namelen + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ;
+    char target[len + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ;
 
-    auto_strings(target, base, SS_SYSTEM, SS_RESOLVE, SS_SERVICE, "/", name, SS_SVC, "/", name, SS_STATE, "/", SS_STATUS) ;
+    auto_strings(target, res->sa.s + res->path.servicedir, SS_STATE, "/", SS_STATUS) ;
 
     if (openreadnclose(target, pack, STATE_STATE_SIZE) < STATE_STATE_SIZE)
         return 0 ;
diff --git a/src/lib66/state/state_rmfile.c b/src/lib66/state/state_rmfile.c
index 29162993c329c8436bcd55e371ac99cf8a9ef28a..a0e0aa09e2b89e26ba1fa36f5a51fb05a4c60767 100644
--- a/src/lib66/state/state_rmfile.c
+++ b/src/lib66/state/state_rmfile.c
@@ -21,17 +21,17 @@
 
 #include <66/state.h>
 #include <66/constants.h>
-#include <66/resolve.h>
+#include <66/service.h>
 
-void state_rmfile(char const *base, char const *name)
+void state_rmfile(resolve_service_t *res)
 {
     log_flow() ;
 
-    size_t baselen = strlen(base) ;
-    size_t namelen = strlen(name) ;
-    char target[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + SS_SVC_LEN + 1 + namelen + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ;
+    size_t len = strlen(res->sa.s + res->path.servicedir) ;
 
-    auto_strings(target, base, SS_SYSTEM, SS_RESOLVE, SS_SERVICE, "/", name, SS_SVC, "/", name, SS_STATE, "/", SS_STATUS) ;
+    char target[len + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ;
+
+    auto_strings(target, res->sa.s + res->path.servicedir, SS_STATE, "/", SS_STATUS) ;
 
     unlink_void(target) ;
 }
diff --git a/src/lib66/state/state_write.c b/src/lib66/state/state_write.c
index 656bef33327fb1bb0dc05e05d514396b02e7bf42..30f37be381352b4e95075a847b905a6f1eac335f 100644
--- a/src/lib66/state/state_write.c
+++ b/src/lib66/state/state_write.c
@@ -23,28 +23,34 @@
 
 #include <66/state.h>
 #include <66/constants.h>
-#include <66/resolve.h>
+#include <66/service.h>
 
-int state_write(ss_state_t *sta, char const *base, char const *name)
+int state_write(ss_state_t *sta, resolve_service_t *res)
 {
     log_flow() ;
 
-    size_t baselen = strlen(base) ;
-    size_t namelen = strlen(name) ;
-    char target[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + SS_SVC_LEN + 1 + namelen + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ;
+    size_t len = strlen(res->sa.s + res->path.servicedir) ;
 
-    auto_strings(target, base, SS_SYSTEM, SS_RESOLVE, SS_SERVICE, "/", name, SS_SVC, "/", name, SS_STATE) ;
+    char target[len + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ;
 
-    if (access(target, F_OK) < 0)
+    auto_strings(target, res->sa.s + res->path.servicedir, SS_STATE) ;
+
+    if (access(target, F_OK) < 0) {
+        log_trace("create directory: ", target) ;
         if (!dir_create_parent(target, 0755))
             log_warnusys_return(LOG_EXIT_ZERO, "create directory: ", target) ;
+    }
 
-    auto_strings(target + baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + SS_SVC_LEN + 1 + namelen + SS_STATE_LEN, "/", SS_STATUS) ;
+    auto_strings(target + len + SS_STATE_LEN, "/", SS_STATUS) ;
 
     char pack[STATE_STATE_SIZE] ;
 
     state_pack(pack, sta) ;
-    if (!openwritenclose_unsafe(target, pack, STATE_STATE_SIZE)) return 0 ;
+
+    log_trace("write status file at: ", target) ;
+
+    if (!openwritenclose_unsafe(target, pack, STATE_STATE_SIZE))
+        return 0 ;
 
     return 1 ;
 }