diff --git a/src/lib66/parse/parse_frontend.c b/src/lib66/parse/parse_frontend.c
index 3533f8e0f736c2a9e78d57e07a2d98e98895e723..f29b18e9e3fbd472b06532d600688db887cd1f4d 100644
--- a/src/lib66/parse/parse_frontend.c
+++ b/src/lib66/parse/parse_frontend.c
@@ -34,9 +34,10 @@
 #include <66/environ.h>
 #include <66/enum.h>
 #include <66/state.h> // service_is_g flag
-#include <66/parser.h>
+#include <66/parse.h>
 #include <66/module.h>
 #include <66/instance.h>
+#include <66/sanitize.h>
 
 static void parse_service_instance(stralloc *frontend, char const *svsrc, char const *sv, int insta)
 {
@@ -64,7 +65,7 @@ static void parse_service_instance(stralloc *frontend, char const *svsrc, char c
  * @Die on fail
  * @Return 1 on success
  * @Return 2 -> already parsed */
-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)
+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)
 {
     log_flow() ;
 
@@ -80,8 +81,19 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
     if (!ob_dirname(svsrc, sv))
         log_dieu(LOG_EXIT_SYS, "get dirname of: ", sv) ;
 
-    if (service_resolve_array_search(ares, *areslen, svname) >= 0)
-        log_warn_return(2, "ignoring: ", svname, " service -- already appended to the selection") ;
+    if (inmodule) {
+
+        char n[strlen(inmodule) + 1 + strlen(svname) + 1] ;
+        auto_strings(n, inmodule, ":", svname) ;
+
+        if (service_resolve_array_search(ares, *areslen, n) >= 0)
+            log_warn_return(2, "ignoring: ", n, " service -- already appended to the selection") ;
+
+    } else {
+
+        if (service_resolve_array_search(ares, *areslen, svname) >= 0)
+            log_warn_return(2, "ignoring: ", svname, " service -- already appended to the selection") ;
+    }
 
     log_trace("parse service: ", sv) ;
 
@@ -111,11 +123,8 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
     if (isparsed == -1)
         log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please make a bug report") ;
 
-    if (isparsed && !force) {
-
-            log_warn("ignoring service: ", svname, " -- already parsed") ;
-            return 2 ;
-    }
+    if (isparsed && !force)
+        log_warn_return(2, "ignoring service: ", svname, " -- already parsed") ;
 
     if (info->opt_tree) {
 
@@ -157,7 +166,18 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
     if (!parse_store_main(&res, store, SECTION_MAIN, KEY_MAIN_TYPE))
         log_dieu(LOG_EXIT_SYS, "store field type of service: ", svname) ;
 
-    res.name = resolve_add_string(wres, svname) ;
+    if (inmodule) {
+
+        char n[strlen(inmodule) + 1 + strlen(svname) + 1] ;
+        auto_strings(n, inmodule,":",svname) ;
+
+        res.name = resolve_add_string(wres, n) ;
+        res.inmodule = resolve_add_string(wres, inmodule) ;
+
+    } else {
+
+        res.name = resolve_add_string(wres, svname) ;
+    }
 
     res.owner = info->owner ;
     res.ownerstr = resolve_add_string(wres, info->ownerstr) ;
@@ -188,7 +208,7 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
         if (res.dependencies.ndepends) {
             size_t len = strlen(res.sa.s + res.dependencies.depends) ;
             char t[len + strlen(res.sa.s + res.dependencies.optsdeps) + 2] ;
-            auto_strings(t + len, " ", res.sa.s + res.dependencies.optsdeps) ;
+            auto_strings(t,res.sa.s + res.dependencies.depends, " ", res.sa.s + res.dependencies.optsdeps) ;
             res.dependencies.depends = resolve_add_string(wres, t) ;
 
         } else {
@@ -198,21 +218,27 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
         res.dependencies.ndepends += res.dependencies.noptsdeps ;
     }
 
-    /** parse dependencies iff the service was never parsed */
-    if (!isparsed)
-        if (!parse_dependencies(&res, ares, areslen, info, force, conf, forced_directory, main, force > 1 ? 1 : 0))
-            log_dieu(LOG_EXIT_SYS, "parse dependencies of service: ", svname) ;
+    /** parse interdependences if the service was never parsed */
+    if (!isparsed) {
+
+        if (!parse_interdependences(svname, res.sa.s + res.dependencies.depends, res.dependencies.ndepends, ares, areslen, info, force, conf, forced_directory, main, inmodule))
+                log_dieu(LOG_EXIT_SYS, "parse dependencies of service: ", svname) ;
+
+        if (res.type == TYPE_BUNDLE)
+            if (!parse_interdependences(svname, res.sa.s + res.dependencies.contents, res.dependencies.ncontents, ares, areslen, info, force, conf, forced_directory, main, inmodule))
+                log_dieu(LOG_EXIT_SYS, "parse contents of bundle service: ", svname) ;
+    }
 
     if (res.type == TYPE_MODULE)
         parse_module(&res, ares, areslen, info, force) ;
 
-    log_trace("add service ", svname, " to the selection") ;
-
     if (service_resolve_array_search(ares, *areslen, svname) < 0) {
+
+        log_trace("add service ", svname, " to the selection") ;
         if (*areslen >= SS_MAX_SERVICE)
             log_die(LOG_EXIT_SYS, "too many services to parse -- compile again 66 changing the --max-service options") ;
-        (*residx) = *areslen ;
         ares[(*areslen)++] = res ;
+
     }
 
     freed: