diff --git a/src/include/66/66.h b/src/include/66/66.h
index 16ea168cb24a67e00ed5c2f5b67a8fe282e96dd0..c2ab9888110639365f7932b36eb30556c650eba1 100644
--- a/src/include/66/66.h
+++ b/src/include/66/66.h
@@ -22,7 +22,7 @@
 #include <66/graph.h>
 #include <66/hpr.h>
 #include <66/info.h>
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/resolve.h>
 #include <66/sanitize.h>
 #include <66/service.h>
diff --git a/src/include/66/environ.h b/src/include/66/environ.h
index b531c2e56d45f4fb0d4d24174192f5bd038ec211..58f7a0506695eeee1abcf7a39064ca719c8f0246 100644
--- a/src/include/66/environ.h
+++ b/src/include/66/environ.h
@@ -20,7 +20,7 @@
 
 #include <skalibs/stralloc.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/service.h>
 
 extern int env_resolve_conf(stralloc *env,char const *svname,uid_t owner) ;
diff --git a/src/include/66/parser.h b/src/include/66/parse.h
similarity index 86%
rename from src/include/66/parser.h
rename to src/include/66/parse.h
index 7429330e58212e957ef7f535c12b9eaa70d4daf8..de23ecb5295ac67d2f9866c82288b2bd67fa3932 100644
--- a/src/include/66/parser.h
+++ b/src/include/66/parse.h
@@ -1,5 +1,5 @@
 /*
- * parser.h
+ * parse.h
  *
  * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
  *
@@ -12,8 +12,8 @@
  * except according to the terms contained in the LICENSE file./
  */
 
-#ifndef SS_PARSER_H
-#define SS_PARSER_H
+#ifndef SS_PARSE_H
+#define SS_PARSE_H
 
 #include <sys/types.h>
 #include <stdint.h>
@@ -47,8 +47,8 @@ extern void ssexec_enable_cleanup(void) ;
 extern void start_parser(char const *sv, ssexec_t *info, uint8_t disable_module, char const *directory_forced) ;
 
 extern void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf) ;
-extern int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint8_t force, uint8_t conf, unsigned int *residx, char const *forced_directory, char const *main) ;
-extern int parse_dependencies(resolve_service_t *res, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint8_t force,uint8_t conf, char const *forced_directory, char const *main, uint8_t requiredby) ;
+extern int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint8_t force, uint8_t conf, char const *forced_directory, char const *main, char const *inmodule) ;
+extern int parse_interdependences(char const *service, char const *list, unsigned int listlen, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint8_t force, uint8_t conf, char const *forced_directory, char const *main, char const *inmodule) ;
 
 /** split */
 extern int parse_section(stralloc *secname, char const *str, size_t *pos) ;
@@ -78,6 +78,6 @@ extern void parse_error(int ierr, int idsec, int idkey) ;
 extern void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint8_t force) ;
 
 /** resolve */
-extern void parse_compute_resolve(resolve_service_t *res, ssexec_t *info) ;
+extern void parse_compute_resolve(unsigned int idx, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info) ;
 
 #endif
diff --git a/src/lib66/environ/env_compute.c b/src/lib66/environ/env_compute.c
index 3d7c6b77c99e2369a3f14d38c5ff9c4df4bfb2da..97f49fd6beb6f2f63c268e806b448857bc7cab41 100644
--- a/src/lib66/environ/env_compute.c
+++ b/src/lib66/environ/env_compute.c
@@ -22,7 +22,7 @@
 
 #include <66/environ.h>
 #include <66/service.h>
-#include <66/parser.h>
+#include <66/parse.h>
 
 
 int env_compute(stralloc *result, resolve_service_t *res)
diff --git a/src/lib66/environ/env_make_symlink.c b/src/lib66/environ/env_make_symlink.c
index ca4c0857ff5ab7282f088b9e4a31d0cc06773813..7e27c3fd45d261b54549eb736deb0bd14eb2ad13 100644
--- a/src/lib66/environ/env_make_symlink.c
+++ b/src/lib66/environ/env_make_symlink.c
@@ -21,7 +21,7 @@
 #include <skalibs/unix-transactional.h>//atomic_symlink
 
 #include <66/environ.h>
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/constants.h>
 #include <66/service.h>
 
diff --git a/src/lib66/environ/env_prepare_for_write.c b/src/lib66/environ/env_prepare_for_write.c
index 49063b782d82805273a9bc87abc511df05c5b84c..b688aea9f1b83d1c3667ca247af1cabfd0ead798 100644
--- a/src/lib66/environ/env_prepare_for_write.c
+++ b/src/lib66/environ/env_prepare_for_write.c
@@ -24,7 +24,7 @@
 #include <66/environ.h>
 #include <66/constants.h>
 #include <66/service.h>
-#include <66/parser.h>
+#include <66/parse.h>
 
 int env_prepare_for_write(stralloc *dst, stralloc *contents, resolve_service_t *res)
 {
diff --git a/src/lib66/exec/ssexec_parse.c b/src/lib66/exec/ssexec_parse.c
index 1e22bf68b711b6a2f8fc4dc0e9938847d4ad0c77..774f9775d846aa467ee5b885009014fa9860ee33 100644
--- a/src/lib66/exec/ssexec_parse.c
+++ b/src/lib66/exec/ssexec_parse.c
@@ -23,7 +23,7 @@
 #include <oblibs/obgetopt.h>
 #include <oblibs/sastr.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/ssexec.h>
 #include <66/utils.h>
 #include <66/sanitize.h>
diff --git a/src/lib66/parse/parse_clean_runas.c b/src/lib66/parse/parse_clean_runas.c
index 3db2aaf22eb7e1d7ff6d47984e521407155f9481..2e5070b61e5403e41eaf2a6fb998286f138ac568 100644
--- a/src/lib66/parse/parse_clean_runas.c
+++ b/src/lib66/parse/parse_clean_runas.c
@@ -22,7 +22,7 @@
 
 #include <skalibs/types.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/utils.h>
 
 int parse_clean_runas(char const *str, int idsec, int idkey)
diff --git a/src/lib66/parse/parse_compute_list.c b/src/lib66/parse/parse_compute_list.c
index ad6c21575e3427efb672f7161dfcb2eb6c073cd0..211912d9211b7394009cedd476806afe64ca7ef3 100644
--- a/src/lib66/parse/parse_compute_list.c
+++ b/src/lib66/parse/parse_compute_list.c
@@ -22,7 +22,7 @@
 
 #include <skalibs/stralloc.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/resolve.h>
 #include <66/service.h>
 
@@ -34,26 +34,23 @@ int parse_compute_list(resolve_wrapper_t_ref wres, stralloc *sa, uint32_t *res,
     int r, found = 0 ;
     size_t len = sa->len, pos = 0 ;
     size_t nelement = sastr_nelement(sa) ;
-    char t[len + nelement + 2] ;
+    stralloc tmp = STRALLOC_ZERO ;
     char f[len + nelement + 2] ;
 
     memset(f, 0, len) ;
-    memset(t, 0, len) ;
 
-    sastr_to_char(t, sa) ;
+    for (; pos < sa->len ; pos += strlen(sa->s + pos) + 1) {
 
-    for (; pos < len ; pos += strlen(t + pos) + 1) {
-
-        if (t[pos] == '#')
+        if (sa->s[pos] == '#')
             continue ;
 
         if (opts) {
 
-            sa->len = 0 ;
+            tmp.len = 0 ;
 
-            r = service_frontend_path(sa, t + pos, getuid(), 0) ;
+            r = service_frontend_path(&tmp, sa->s + pos, getuid(), 0) ;
             if (r == -1)
-                log_dieu(LOG_EXIT_SYS, "get frontend service file of: ", t + pos) ;
+                log_dieu(LOG_EXIT_SYS, "get frontend service file of: ", sa->s + pos) ;
 
             if (!r)
                 continue ;
@@ -62,7 +59,7 @@ int parse_compute_list(resolve_wrapper_t_ref wres, stralloc *sa, uint32_t *res,
 
         }
 
-        auto_strings(f + strlen(f), t + pos, " ") ;
+        auto_strings(f + strlen(f), sa->s + pos, " ") ;
 
         (*res)++ ;
 
@@ -72,6 +69,8 @@ int parse_compute_list(resolve_wrapper_t_ref wres, stralloc *sa, uint32_t *res,
 
     f[strlen(f) - 1] = 0 ;
 
+    stralloc_free(&tmp) ;
+
     return resolve_add_string(wres, f) ;
 
 }
diff --git a/src/lib66/parse/parse_contents.c b/src/lib66/parse/parse_contents.c
index 517a1d99cf454fb9b4bb21d0989f6bb5e6049201..46cc33080d3037dca821346152ee1ad2cdbdd2ef 100644
--- a/src/lib66/parse/parse_contents.c
+++ b/src/lib66/parse/parse_contents.c
@@ -19,7 +19,7 @@
 
 #include <skalibs/stralloc.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/resolve.h>
 #include <66/enum.h>
 
diff --git a/src/lib66/parse/parse_line_g.c b/src/lib66/parse/parse_line_g.c
index e4646b30e6c3e84c81e2ac5458baaa1b14b6b65c..6ca436db1334b83d6876c019cf9df92de432452e 100644
--- a/src/lib66/parse/parse_line_g.c
+++ b/src/lib66/parse/parse_line_g.c
@@ -19,7 +19,7 @@
 
 #include <skalibs/stralloc.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 
 /* @Return 2 if bad format */
 int parse_line_g(char *store, parse_mill_t *config, char const *str, size_t *pos)
diff --git a/src/lib66/parse/parse_mandatory.c b/src/lib66/parse/parse_mandatory.c
index 4c09d6504c46506f5a46f7d80d5296298b4c8d95..cc4e34273611765c65ef7c9408d9e75db8123a47 100644
--- a/src/lib66/parse/parse_mandatory.c
+++ b/src/lib66/parse/parse_mandatory.c
@@ -14,7 +14,7 @@
 
 #include <oblibs/log.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/resolve.h>
 #include <66/enum.h>
 
diff --git a/src/lib66/parse/parse_parentheses.c b/src/lib66/parse/parse_parentheses.c
index fc3bbd6cc5a345a42d91482de36c8fdf579c4f2e..eacf60b612f7b705cdcadb30b791e6d02a9c66a1 100644
--- a/src/lib66/parse/parse_parentheses.c
+++ b/src/lib66/parse/parse_parentheses.c
@@ -17,7 +17,7 @@
 
 #include <oblibs/string.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 
 static char parse_char_next(char const *s, size_t *pos)
 {
diff --git a/src/lib66/parse/parse_section.c b/src/lib66/parse/parse_section.c
index 014c5abd5758c0bc82113b0936e1db9ca59859db..80c5a40484ee914eefc2f3890354ad0dc3c1c7dd 100644
--- a/src/lib66/parse/parse_section.c
+++ b/src/lib66/parse/parse_section.c
@@ -20,7 +20,7 @@
 
 #include <skalibs/stralloc.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/enum.h>
 
 int parse_section(stralloc *secname, char const *str, size_t *pos)
diff --git a/src/lib66/parse/parse_split_from_section.c b/src/lib66/parse/parse_split_from_section.c
index 71b9c7365bb464e78145692a091372fffae9abc0..1e77451fc1a0882e570485e9aeaf4cb9b3f8e8ed 100644
--- a/src/lib66/parse/parse_split_from_section.c
+++ b/src/lib66/parse/parse_split_from_section.c
@@ -23,7 +23,7 @@
 #include <skalibs/stralloc.h>
 #include <skalibs/types.h> //UINT_FMT
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/resolve.h>
 #include <66/enum.h>
 
diff --git a/src/lib66/parse/parse_store_environ.c b/src/lib66/parse/parse_store_environ.c
index f988ef74c5b8adf1aea046f108e17ce32d24d8dd..765e5aef1830153b339da72d614c83ba7f4d65be 100644
--- a/src/lib66/parse/parse_store_environ.c
+++ b/src/lib66/parse/parse_store_environ.c
@@ -19,7 +19,7 @@
 
 #include <skalibs/stralloc.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/resolve.h>
 #include <66/enum.h>
 #include <66/utils.h>
diff --git a/src/lib66/parse/parse_store_g.c b/src/lib66/parse/parse_store_g.c
index a0c876769457bbd842f0ad3bf3bfce70dd9d4b5e..f3f5d6098b13ba36a51ec3ab764d6350b2d8b391 100644
--- a/src/lib66/parse/parse_store_g.c
+++ b/src/lib66/parse/parse_store_g.c
@@ -14,7 +14,7 @@
 
 #include <oblibs/log.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/resolve.h>
 #include <66/enum.h>
 
diff --git a/src/lib66/parse/parse_store_logger.c b/src/lib66/parse/parse_store_logger.c
index 049b4a9e715013161117b69bcaf377b30e953a89..733e3b17447bf3741f89dfeb21f505695317fb6f 100644
--- a/src/lib66/parse/parse_store_logger.c
+++ b/src/lib66/parse/parse_store_logger.c
@@ -18,7 +18,7 @@
 
 #include <skalibs/types.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/resolve.h>
 #include <66/service.h>
 #include <66/enum.h>
diff --git a/src/lib66/parse/parse_store_regex.c b/src/lib66/parse/parse_store_regex.c
index cbdb40905ae1d23535fffa817673d3f8e1ed5372..4f938d98930364d0c380ae147a5995ba57949f64 100644
--- a/src/lib66/parse/parse_store_regex.c
+++ b/src/lib66/parse/parse_store_regex.c
@@ -19,7 +19,7 @@
 
 #include <skalibs/stralloc.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/resolve.h>
 #include <66/enum.h>
 
@@ -27,7 +27,7 @@ int parse_store_regex(resolve_service_t *res, char *store, int idsec, int idkey)
 {
     log_flow() ;
 
-    if (res->type == TYPE_CLASSIC || res->type == TYPE_ONESHOT)
+    if (res->type != TYPE_MODULE)
         return 1 ;
 
     stralloc sa = STRALLOC_ZERO ;
diff --git a/src/lib66/parse/parse_store_start_stop.c b/src/lib66/parse/parse_store_start_stop.c
index 9b579ca67149c63b1a69fd5a56d69594e447f5dc..413a9d451e06fdd07cdc214705a5b3313bec4d36 100644
--- a/src/lib66/parse/parse_store_start_stop.c
+++ b/src/lib66/parse/parse_store_start_stop.c
@@ -18,7 +18,7 @@
 
 #include <skalibs/stralloc.h>
 
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/resolve.h>
 #include <66/service.h>
 #include <66/enum.h>
diff --git a/src/lib66/sanitize/sanitize_graph.c b/src/lib66/sanitize/sanitize_graph.c
index 7e8efb128fc5b80a8b5de6de7d70adcae9af0bef..77c4d54cecc99cf6a036ff6905234ea05b788128 100644
--- a/src/lib66/sanitize/sanitize_graph.c
+++ b/src/lib66/sanitize/sanitize_graph.c
@@ -24,7 +24,7 @@
 #include <66/ssexec.h>
 #include <66/service.h>
 #include <66/resolve.h>
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/state.h>
 #include <66/graph.h>