diff --git a/src/lib66/module/parse_module.c b/src/lib66/module/parse_module.c
index f3b5adb89b4b2d6988f41b196691b0a95ac36325..4fd5d34afac7335d39be5ad78e42551207d31d6f 100644
--- a/src/lib66/module/parse_module.c
+++ b/src/lib66/module/parse_module.c
@@ -122,6 +122,7 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int
 
     int r, insta = -1 ;
     size_t pos = 0, copylen = 0, len = 0 ;
+    uint8_t opt_tree = info->opt_tree ;
     char name[strlen(res->sa.s + res->name) + 1] ;
     auto_strings(name,res->sa.s + res->name) ;
     char *src = res->sa.s + res->path.frontend ;
@@ -245,6 +246,7 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int
 
             sa.len = 0 ;
             out = 0 ;
+            info->opt_tree = opt_tree ;
             char fname[strlen(l + pos)] ;
 
             if (!ob_basename(fname, l + pos))
@@ -278,11 +280,18 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int
                 if (!sastr_add_string(&list, n))
                     log_die_nomem("stralloc") ;
 
+                info->opt_tree = 1 ;
+                info->treename.len = 0 ;
+                if (!auto_stra(&info->treename, res->sa.s + res->intree))
+                    log_die_nomem("stralloc") ;
+
             } else {
 
+                info->opt_tree = 0 ;
 
                 if (res->dependencies.ndepends) {
-
+                    /** TODO: avoid to increase db size by
+                     * storing dependencies into an array */
                     size_t len = strlen(res->sa.s + res->dependencies.depends) ;
                     char tmp[len + strlen(fname) + 2] ;
                     auto_strings(tmp, res->sa.s + res->dependencies.depends, " ", fname) ;
diff --git a/src/lib66/parse/parse_compute_resolve.c b/src/lib66/parse/parse_compute_resolve.c
index d4c24e0121e4095f357386078235d7f7974397e8..54949e31b7042b44f1f738839581b14574c4a5d6 100644
--- a/src/lib66/parse/parse_compute_resolve.c
+++ b/src/lib66/parse/parse_compute_resolve.c
@@ -440,14 +440,6 @@ void parse_compute_resolve(unsigned int idx, resolve_service_t *ares, unsigned i
 
     res->path.home = resolve_add_string(wres, info->base.s) ;
 
-    /** Command line precede frontend file which precede the default tree name*/
-    if (info->opt_tree)
-        res->treename = resolve_add_string(wres, info->treename.s) ;
-    else if (res->intree)
-        res->treename = resolve_add_string(wres, res->sa.s + res->intree) ;
-    else
-        res->treename = resolve_add_string(wres, info->treename.s) ;
-
     /* live */
     res->live.livedir = resolve_add_string(wres, info->live.s) ;
 
@@ -466,7 +458,7 @@ void parse_compute_resolve(unsigned int idx, resolve_service_t *ares, unsigned i
      *
      * which is a symlink pointing to
      *
-     *      /var/lib/66/system/treename/servicedirs/svc/service_name
+     *      /var/lib/66/system/servicedirs/svc/service_name
      *
      * which is a symlink pointing to:
      *
diff --git a/src/lib66/parse/parse_frontend.c b/src/lib66/parse/parse_frontend.c
index a448167455ebaa8bb6a455e519f5ed2b199432cf..c76b7c1cd763aa962dea83c279ca8e33674ea11c 100644
--- a/src/lib66/parse/parse_frontend.c
+++ b/src/lib66/parse/parse_frontend.c
@@ -87,7 +87,8 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
 {
     log_flow() ;
 
-    int insta, r, isparsed ;
+    int insta, isparsed ;
+    uint8_t opt_tree_forced = 0 ;
     size_t svlen = strlen(sv) ;
     char svname[svlen + 1], svsrc[svlen + 1] ;
     char atree[SS_MAX_TREENAME + 1] ;
@@ -149,46 +150,45 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
     if (isparsed == STATE_FLAGS_TRUE && !force)
         log_warn_return(2, "ignoring service: ", svname, " -- already parsed") ;
 
-    if (info->opt_tree) {
+    {
+        /** search for the type field*/
+        if (!environ_get_val_of_key(&sa, get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_TYPE)))
+            log_dieu(LOG_EXIT_SYS, "get field ", get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_TYPE)," of service: ", svname) ;
 
-        r = tree_isvalid(info->base.s, info->treename.s) ;
-        if (r < 0)
-            log_dieu(LOG_EXIT_SYS, "check validity of tree: ", info->treename.s) ;
+        char store[sa.len + 1] ;
+        auto_strings(store, sa.s) ;
 
-        if (!r) {
+        if (!parse_store_main(&res, store, SECTION_MAIN, KEY_MAIN_TYPE))
+            log_dieu(LOG_EXIT_SYS, "store field type of service: ", svname) ;
 
-            /** @intree may not exist */
-            r = sastr_find(&sa, get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_INTREE)) ;
-            if (r == -1)
-                goto follow ;
+        sa.len = 0 ;
+        if (!auto_stra(&sa, file))
+            log_die_nomem("stralloc") ;
+    }
+
+    if (!info->opt_tree) {
 
-            if (!environ_get_val_of_key(&sa, get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_INTREE)))
-                log_dieu(LOG_EXIT_SYS, "get field intree of service: ", sv) ;
+        /** search for the intree field.
+         * This field is not mandatory, do not crash if it not found */
+        if (environ_get_val_of_key(&sa, get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_INTREE))) {
 
-            if (!sastr_clean_element(&sa))
-                log_dieu(LOG_EXIT_SYS, "clean field intree of service: ", sv) ;
+            char store[sa.len + 1] ;
+            auto_strings(store, sa.s) ;
 
-            res.intree = resolve_add_string(wres, sa.s) ;
+            if (!parse_store_main(&res, store, SECTION_MAIN, KEY_MAIN_INTREE))
+                log_dieu(LOG_EXIT_SYS, "store field intree of service: ", svname) ;
 
             info->treename.len = 0 ;
+            info->opt_tree = 1 ;
+            opt_tree_forced = 1 ;
             sa.len = 0 ;
+
             if (!auto_stra(&info->treename, res.sa.s + res.intree) ||
                 !auto_stra(&sa, file))
                     log_die_nomem("stralloc") ;
         }
     }
 
-    follow:
-
-    if (!environ_get_val_of_key(&sa, get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_TYPE)))
-        log_dieu(LOG_EXIT_SYS, "get field ", get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_TYPE)," of service: ", svname) ;
-
-    char store[sa.len + 1] ;
-    auto_strings(store, sa.s) ;
-
-    if (!parse_store_main(&res, store, SECTION_MAIN, KEY_MAIN_TYPE))
-        log_dieu(LOG_EXIT_SYS, "store field type of service: ", svname) ;
-
     if (inmodule) {
 
         char n[strlen(inmodule) + 1 + strlen(svname) + 1] ;
@@ -215,13 +215,9 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
     // keep overwrite_conf
     res.environ.env_overwrite = conf ;
 
-    /** try to create the tree if not exist yet with
-     * the help of the seed files */
-    set_treeinfo(info) ;
-
     /** contents of directory should be listed by service_frontend_path
      * except for module type */
-    if (scan_mode(sv,S_IFDIR) == 1 && res.type != TYPE_MODULE)
+    if (scan_mode(sv, S_IFDIR) == 1 && res.type != TYPE_MODULE)
         goto freed ;
 
     if (!parse_contents(wres, file, svname))
@@ -230,6 +226,15 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
     if (!parse_mandatory(&res))
         log_die(LOG_EXIT_SYS, "some mandatory field is missing for service: ", svname) ;
 
+    /** try to create the tree if not exist yet with
+     * the help of the seed files */
+    set_treeinfo(info) ;
+
+    res.treename = resolve_add_string(wres, info->treename.s) ;
+
+    if (opt_tree_forced)
+        info->opt_tree = 0 ;
+
     /** append res.dependencies.depends list with the optional dependencies list */
     if (res.dependencies.noptsdeps) {
 
diff --git a/src/lib66/parse/parse_store_main.c b/src/lib66/parse/parse_store_main.c
index 2bb6aafd99dbf75bf3d913704d01eb3cc96eed69..2d9a1be7d2133c4bdb12adfa64281d29981dd220 100644
--- a/src/lib66/parse/parse_store_main.c
+++ b/src/lib66/parse/parse_store_main.c
@@ -381,6 +381,10 @@ int parse_store_main(resolve_service_t *res, char *store, int idsec, int idkey)
 
         case KEY_MAIN_INTREE:
 
+            if (res->intree)
+                /** already passed through here */
+                break ;
+
             if (!parse_clean_line(store))
                 parse_error_return(0, 8, idsec, idkey) ;