diff --git a/src/lib66/rc/rc_send.c b/src/lib66/rc/rc_send.c
index 1f1f682ec42366dacb08bfa4ac3e9f2a6c7b1465..95a0bd1b54e9ac9dc77f2dfd4e3664a9bcc93c1a 100644
--- a/src/lib66/rc/rc_send.c
+++ b/src/lib66/rc/rc_send.c
@@ -24,24 +24,24 @@
 #include <66/service.h>
 #include <66/ssexec.h>
 
-int rc_send(ssexec_t *info,genalloc *ga,char const *sig,char const *const *envp)
+int rc_send(ssexec_t *info, resolve_service_t *sv, unsigned int len, char const *sig)
 {
     log_flow() ;
 
-    size_t i = 0 ;
-    int nargc = 3 + genalloc_len(resolve_service_t,ga) ;
+    unsigned int pos = 0 ;
+    int nargc = 3 + len ;
     char const *newargv[nargc] ;
     unsigned int m = 0 ;
 
-    newargv[m++] = "fake_name" ;
+    newargv[m++] = "rc_send" ;
     newargv[m++] = sig ;
 
-    for (; i < genalloc_len(resolve_service_t,ga) ; i++)
-        newargv[m++] = genalloc_s(resolve_service_t,ga)[i].sa.s + genalloc_s(resolve_service_t,ga)[i].name ;
+    for (; pos < len ; pos++)
+        newargv[m++] = sv[pos].sa.s + sv[pos].name ;
 
     newargv[m++] = 0 ;
 
-    if (ssexec_dbctl(nargc,newargv,envp,info))
+    if (ssexec_dbctl(nargc, newargv, (char const *const *) environ, info))
         return 0 ;
 
     return 1 ;
diff --git a/src/lib66/rc/rc_unsupervise.c b/src/lib66/rc/rc_unsupervise.c
index eb6a20fe4d53707258920c1286ee4633b5aed002..a48f524fca9cf5ebe24b0ac1a8a4380d2c04aa05 100644
--- a/src/lib66/rc/rc_unsupervise.c
+++ b/src/lib66/rc/rc_unsupervise.c
@@ -31,84 +31,78 @@
 
 #include <s6-rc/s6rc-servicedir.h>
 
-int rc_unsupervise(ssexec_t *info,genalloc *ga,char const *sig,char const *const *envp)
+int rc_unsupervise(ssexec_t *info, resolve_service_t *sv, unsigned int len)
 {
     log_flow() ;
 
-    size_t i = 0 ;
+    unsigned int pos = 0, e = 0 ;
     resolve_service_t_ref pres ;
-    stralloc sares = STRALLOC_ZERO ;
     ss_state_t sta = STATE_ZERO ;
 
     char prefix[info->treename.len + 2] ;
-    memcpy(prefix,info->treename.s,info->treename.len) ;
-    memcpy(prefix + info->treename.len,"-",1) ;
-    prefix[info->treename.len + 1] = 0 ;
+    auto_strings(prefix, info->treename.s, "-") ;
 
     char live[info->livetree.len + 1 + info->treename.len + 1 ];
-    memcpy(live,info->livetree.s,info->livetree.len) ;
-    live[info->livetree.len] = '/' ;
-    memcpy(live + info->livetree.len + 1,info->treename.s,info->treename.len) ;
-    live[info->livetree.len + 1 + info->treename.len] = 0 ;
-
-    if (!db_switch_to(info,envp,SS_SWSRC))
-    {
-        log_warnu("switch ",info->treename.s," to source") ;
+    auto_strings(live, info->livetree.s, "/", info->treename.s) ;
+
+    if (!db_switch_to(info, SS_SWSRC)) {
+        log_warnu("switch ", info->treename.s, " to source") ;
         goto err ;
     }
 
-    if (!rc_send(info,ga,sig,envp))
-    {
+    if (!rc_send(info, ga, sig, envp)) {
         log_warnu("stop services") ;
         goto err ;
     }
 
-    for (; i < genalloc_len(resolve_service_t,ga) ; i++)
-    {
-        char const *string = genalloc_s(resolve_service_t,ga)[i].sa.s ;
-        char const *name = string + genalloc_s(resolve_service_t,ga)[i].name ;
-        log_trace("delete directory service: ",string + genalloc_s(resolve_service_t,ga)[i].runat) ;
-        s6rc_servicedir_unsupervise(live,prefix,name,0) ;
-        if (rm_rf(string + genalloc_s(resolve_service_t,ga)[i].runat) < 0) goto err ;
-    }
-    if (!sa_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC))
-    {
-        log_warnusys("set revolve pointer to source") ;
-        goto err ;
+    for (; pos < len ; pos++) {
+
+        pres = &sv[pos] ;
+        char const *string = pres->sa.s ;
+        char const *name = string + pres->name ;
+
+        log_trace("delete directory service: ", string + pres->runat) ;
+        s6rc_servicedir_unsupervise(live, prefix, name, 0) ;
+
+        if (rm_rf(string + pres->runat) < 0)
+            goto err ;
     }
-    for (i = 0 ; i < genalloc_len(resolve_service_t,ga) ; i++)
-    {
-        pres = &genalloc_s(resolve_service_t,ga)[i] ;
+
+    char res_s[info->base.len + SS_SYSTEM + 1 + info->treename.len + SS_SVDIRS_LEN + 1] ;
+    auto_strings(res_s, info->base.s, SS_SYSTEM, "/", info->treename.s, SS_SVDIRS) ;
+
+    for (pos = 0 ; pos < len ; pos++) {
+
+        pres = &sv[pos] ;
         char const *string = pres->sa.s ;
         char const *name = string + pres->name  ;
         char const *state = string + pres->state ;
         // remove the resolve/state file if the service is disabled
         if (!pres->disen)
         {
-            log_trace("Delete resolve file of: ",name) ;
-            resolve_rmfile(sares.s,name) ;
-            log_trace("Delete state file of: ",name) ;
-            state_rmfile(state,name) ;
+            log_trace("Delete resolve file of: ", name) ;
+            resolve_rmfile(res_s, name) ;
+            log_trace("Delete state file of: ", name) ;
+            state_rmfile(state, name) ;
         }
         else
         {
-            state_setflag(&sta,SS_FLAGS_RELOAD,SS_FLAGS_FALSE) ;
-            state_setflag(&sta,SS_FLAGS_INIT,SS_FLAGS_TRUE) ;
-    //      state_setflag(&sta,SS_FLAGS_UNSUPERVISE,SS_FLAGS_FALSE) ;
-            state_setflag(&sta,SS_FLAGS_STATE,SS_FLAGS_FALSE) ;
-            state_setflag(&sta,SS_FLAGS_PID,SS_FLAGS_FALSE) ;
+            state_setflag(&sta, SS_FLAGS_RELOAD, SS_FLAGS_FALSE) ;
+            state_setflag(&sta, SS_FLAGS_INIT, SS_FLAGS_TRUE) ;
+    //      state_setflag(&sta, SS_FLAGS_UNSUPERVISE, SS_FLAGS_FALSE) ;
+            state_setflag(&sta, SS_FLAGS_STATE, SS_FLAGS_FALSE) ;
+            state_setflag(&sta, SS_FLAGS_PID, SS_FLAGS_FALSE) ;
             log_trace("Write state file of: ",name) ;
-            if (!state_write(&sta,state,name))
+            if (!state_write(&sta, state, name))
             {
-                log_warnusys("write state file of: ",name) ;
+                log_warnusys("write state file of: ", name) ;
                 goto err ;
             }
         }
-        log_info("Unsupervised successfully: ",name) ;
+        log_info("Unsupervised successfully: ", name) ;
     }
-    stralloc_free(&sares) ;
-    return 1 ;
+    e = 1 ;
+
     err:
-        stralloc_free(&sares) ;
-        return 0 ;
+        return e ;
 }