diff --git a/src/lib66/parse/parse_service.c b/src/lib66/parse/parse_service.c
index d5a5beebfca6aeb331b9ba502c80ab32931a748e..7d1a35f34f01f9553b2afa06a6668eef09a406ae 100644
--- a/src/lib66/parse/parse_service.c
+++ b/src/lib66/parse/parse_service.c
@@ -56,125 +56,7 @@ parse_mill_t MILL_GET_VALUE = \
     .skip = " \t\r", .skiplen = 3, .forceskip = 1, \
     .inner.debug = "get_value" } ;
 
-
-/***
- *
- * Not sure of this implementation. The contents of the a tree can be found easily
- * now with the SS_SYSTEM_DIR/system/.resolve/service directory. This needs is only necessary
- * at worth for the init process to quickly found a service. On the other side, each manipulation
- * of the tree need to be specified at Master service file.
- *
- * Actually, init do not pass through the Master service file of the tree. Maybe a Master service for
- * all trees localized at SS_SYSTEM_DIR/system/.resolve/service/Master can be a better way to do it.
- *
- * At the end, i think that good API to know/acknowledge of a global system state changes should be provide. After all, handling events will appear in the future.
- *
- *
- *
-void service_master_modify_contents(resolve_service_t *res, resolve_service_master_enum_t ENUM)
-{
-    stralloc sa = STRALLOC_ZERO ;
-    resolve_service_master_t mres = RESOLVE_SERVICE_MASTER_ZERO ;
-    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE_MASTER, &mres) ;
-    char *treename = res->sa.s + res->treename ;
-    char *tree = res->sa.s + res->path.tree ;
-    size_t treelen = strlen(tree) ;
-    char solve[treelen + SS_SVDIRS_LEN + SS_RESOLVE_LEN + 1] ;
-
-    char const *exclude[2] = { SS_MASTER + 1, 0 } ;
-
-    log_trace("modify field contents of resolve Master file of services") ;
-
-    auto_strings(solve, tree, SS_SVDIRS, SS_RESOLVE) ;
-
-    if (!sastr_dir_get(&sa, solve, exclude, S_IFREG))
-        log_dieu(LOG_EXIT_SYS, "get resolve files of tree: ", treename) ;
-
-    size_t ncontents = sastr_nelement(&sa) ;
-
-    if (ncontents)
-        if (!sastr_rebuild_in_oneline(&sa))
-            log_dieu(LOG_EXIT_SYS, "rebuild stralloc") ;
-
-    auto_strings(solve, tree, SS_SVDIRS) ;
-
-    if (!resolve_read(wres, solve, SS_MASTER + 1))
-        log_dieusys(LOG_EXIT_SYS, "read resolve Master file of services") ;
-
-    switch (ENUM) {
-
-        case E_RESOLVE_SERVICE_MASTER_CLASSIC:
-
-            if (mres.nclassic)
-                mres.classic = resolve_add_string(wres, sa.s) ;
-            else
-                mres.classic = resolve_add_string(wres, "") ;
-            break ;
-
-        case E_RESOLVE_SERVICE_MASTER_BUNDLE:
-
-            if (mres.nbundle)
-                mres.bundle = resolve_add_string(wres, sa.s) ;
-            else
-                mres.bundle = resolve_add_string(wres, "") ;
-            break ;
-
-        case E_RESOLVE_SERVICE_MASTER_ONESHOT:
-
-            if (mres.noneshot)
-                mres.oneshot = resolve_add_string(wres, sa.s) ;
-            else
-                mres.oneshot = resolve_add_string(wres, "") ;
-            break ;
-
-        case E_RESOLVE_SERVICE_MASTER_MODULE:
-
-            if (mres.nmodule)
-                mres.module = resolve_add_string(wres, sa.s) ;
-            else
-                mres.module = resolve_add_string(wres, "") ;
-            break ;
-
-        case E_RESOLVE_SERVICE_MASTER_ENABLED:
-
-            if (mres.nenabled)
-                mres.enabled = resolve_add_string(wres, sa.s) ;
-            else
-                mres.enabled = resolve_add_string(wres, "") ;
-            break ;
-
-        case E_RESOLVE_SERVICE_MASTER_DISABLED:
-
-            if (mres.ndisabled)
-                mres.disabled = resolve_add_string(wres, sa.s) ;
-            else
-                mres.disabled = resolve_add_string(wres, "") ;
-            break ;
-
-        case E_RESOLVE_SERVICE_MASTER_CONTENTS:
-
-            if (mres.ncontents)
-                mres.contents = resolve_add_string(wres, sa.s) ;
-            else
-                mres.contents = resolve_add_string(wres, "") ;
-
-            //mres.ncontents = (uint32_t)ncontents ;
-
-            break ;
-
-        default:
-            break ;
-    }
-
-    if (!resolve_write(wres, solve, SS_MASTER + 1))
-        log_dieusys(LOG_EXIT_SYS, "write resolve Master file of services") ;
-
-    stralloc_free(&sa) ;
-    resolve_free(wres) ;
-}
-*/
-
-static void service_notify_add_string(stralloc *sa, char const *name, char const *str)
+static void parse_notify_add_string(stralloc *sa, char const *name, char const *str)
 {
     if (!sastr_clean_string(sa, str))
         log_dieu(LOG_EXIT_SYS, "clean string") ;
@@ -186,8 +68,13 @@ static void service_notify_add_string(stralloc *sa, char const *name, char const
         log_dieu(LOG_EXIT_SYS, "sort string") ;
 }
 
-static void service_notify_tree(char const *name, char const *base, char const *treename, uint8_t field)
+static void parse_notify_tree(resolve_service_t *res, char const *base, uint8_t field)
 {
+    log_flow() ;
+
+    char *treename = res->sa.s + res->treename ;
+    char *name = res->sa.s + res->name ;
+
     resolve_tree_t tres = RESOLVE_TREE_ZERO ;
     resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ;
     stralloc sa = STRALLOC_ZERO ;
@@ -199,12 +86,52 @@ static void service_notify_tree(char const *name, char const *base, char const *
 
     if (field == E_RESOLVE_TREE_CONTENTS) {
 
+        char atree[SS_MAX_TREENAME + 1] ;
+
+        if (service_is_g(atree, name, STATE_FLAGS_ISPARSED)) {
+
+            if (strcmp(atree, treename)) {
+
+                /** remove it from the previous used tree */
+                resolve_tree_t res = RESOLVE_TREE_ZERO ;
+                resolve_wrapper_t_ref wtres = resolve_set_struct(DATA_TREE, &res) ;
+
+                if (!resolve_read_g(wtres, base, atree))
+                    log_dieu(LOG_EXIT_SYS, "read resolve file of tree: ", atree) ;
+
+                if (!sastr_clean_string(&sa, res.sa.s + res.contents))
+                    log_dieu(LOG_EXIT_SYS, "clean string") ;
+
+                if (!sastr_remove_element(&sa, name))
+                    log_dieu(LOG_EXIT_SYS, "remove service: ", name, " from tree: ", treename) ;
+
+                if (sa.len) {
+                    if (!sastr_rebuild_in_oneline(&sa))
+                        log_dieu(LOG_EXIT_SYS, "rebuild stralloc list") ;
+                } else
+                    stralloc_0(&sa) ;
+
+
+                if (!tree_resolve_modify_field(&res, E_RESOLVE_TREE_CONTENTS, sa.s))
+                    log_dieu(LOG_EXIT_SYS, "modify resolve field of tree: ", atree) ;
+
+                res.ncontents-- ;
+
+                if (!resolve_write_g(wtres, base, atree))
+                    log_dieu(LOG_EXIT_SYS, "write resolve file of tree: ", atree) ;
+
+                resolve_free(wtres) ;
+            }
+            sa.len = 0 ;
+        }
+
         if (tres.ncontents)
-            service_notify_add_string(&sa, name, tres.sa.s + tres.contents) ;
+            parse_notify_add_string(&sa, name, tres.sa.s + tres.contents) ;
         else if (!sastr_add_string(&sa, name))
             log_dieu(LOG_EXIT_SYS, "add string") ;
 
-        tres.ncontents += 1 ;
+        tres.ncontents++ ;
+
     } else goto freed ;
 
     if (!sastr_rebuild_in_oneline(&sa))
@@ -223,6 +150,8 @@ static void service_notify_tree(char const *name, char const *base, char const *
 
 void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf)
 {
+    log_flow();
+
     unsigned int areslen = 0, residx = 0, pos = 0 ;
     resolve_service_t ares[SS_MAX_SERVICE] ;
 
@@ -237,6 +166,12 @@ void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf)
 
     for (; pos < areslen ; pos++) {
 
+        /** notify first the resolve Master file of the tree
+         * about the location of the service. If the service is
+         * already parsed and the user ask to force it on different tree,
+         * we can know the old place of the service by the old resolve service file*/
+        parse_notify_tree(&ares[pos], info->base.s, E_RESOLVE_TREE_CONTENTS) ;
+
         char dst[strlen(ares[pos].sa.s + ares[pos].path.tree) + SS_SVDIRS_LEN + 1] ;
         auto_strings(dst, ares[pos].sa.s + ares[pos].path.tree, SS_SVDIRS) ;
 
@@ -255,9 +190,6 @@ void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf)
             if (!state_write(&sta, ares[pos].sa.s + ares[pos].path.home, ares[pos].sa.s + ares[pos].logger.name))
                 log_dieu(LOG_EXIT_SYS, "write state file of: ", ares[pos].sa.s + ares[pos].logger.name) ;
 
-        //service_master_modify_contents(&ares[pos], E_RESOLVE_SERVICE_MASTER_CONTENTS) ;
-        service_notify_tree(ares[pos].sa.s + ares[pos].name, info->base.s, ares[pos].sa.s + ares[pos].treename, E_RESOLVE_TREE_CONTENTS) ;
-
         log_info("Parsed successfully: ", ares[pos].sa.s + ares[pos].name, " at tree: ", ares[pos].sa.s + ares[pos].treename) ;
     }