diff --git a/Makefile b/Makefile
index 4e35b99bb0b59368de7eeccf87560be2c5fbc672..e050c74decfa0c4a577f21df5ab2eb5abd664936 100644
--- a/Makefile
+++ b/Makefile
@@ -63,7 +63,7 @@ ALL_ENV := $(DESTDIR)$(ENV_TARGETS)
 all: $(ALL_LIBS) $(ALL_BINS) $(ALL_INCLUDES)
 
 clean:
-	@exec rm -f $(ALL_LIBS) $(ALL_BINS) $(wildcard src/*/*.o src/*/*.lo) $(EXTRA_TARGETS) $(ENV_TARGETS)
+	@exec rm -f $(ALL_LIBS) $(ALL_BINS) $(wildcard src/*/*.o src/*/*.lo) $(EXTRA_TARGETS) 
 
 distclean: clean
 	@exec rm -f config.mak src/include/$(package)/config.h
diff --git a/doc/index.html b/doc/index.html
index eeb461f281fe63e0150d0abd489ece2ad10591bc..0c1c611bddc4cb82766936642e15a3eddf2f231b 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -87,6 +87,12 @@
 		<li><a href="66-start.html"><tt>66-start</tt></a></li>
 		<li><a href="66-stop.html"><tt>66-stop</tt></a></li>
 	</ul>
+	
+	<h3> execline tools </h3>
+	
+	<ul>
+		<li><a href="execl-cmdline.html"><tt>execl-cmdline</tt></a></li>
+	</ul>
 
 <h2> Why is 66 necessary? </h2>
 
diff --git a/package/deps.mak b/package/deps.mak
index 13d075fcdf52ed7c15c0a39c4291e07959476f3e..7c42587d3fbe735c17e809b66c8653d8eea8f203 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -5,16 +5,17 @@
 src/include/66/66.h: src/include/66/backup.h src/include/66/config.h src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/parser.h src/include/66/svc.h src/include/66/tree.h src/include/66/utils.h
 src/include/66/constants.h: src/include/66/config.h
 src/include/66/parser.h: src/include/66/enum.h
-src/66/66-all.o src/66/66-all.lo: src/66/66-all.c
+src/66/66-all.o src/66/66-all.lo: src/66/66-all.c src/include/66/config.h src/include/66/constants.h src/include/66/tree.h src/include/66/utils.h
 src/66/66-dbctl.o src/66/66-dbctl.lo: src/66/66-dbctl.c src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/tree.h src/include/66/utils.h
 src/66/66-disable.o src/66/66-disable.lo: src/66/66-disable.c src/include/66/backup.h src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/tree.h src/include/66/utils.h
 src/66/66-enable.o src/66/66-enable.lo: src/66/66-enable.c src/include/66/backup.h src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/parser.h src/include/66/svc.h src/include/66/tree.h src/include/66/utils.h
-src/66/66-init.o src/66/66-init.lo: src/66/66-init.c src/include/66/backup.h src/include/66/constants.h src/include/66/tree.h src/include/66/utils.h
+src/66/66-init.o src/66/66-init.lo: src/66/66-init.c src/include/66/backup.h src/include/66/constants.h src/include/66/db.h src/include/66/tree.h src/include/66/utils.h
 src/66/66-scandir.o src/66/66-scandir.lo: src/66/66-scandir.c src/include/66/config.h src/include/66/constants.h src/include/66/utils.h
 src/66/66-start.o src/66/66-start.lo: src/66/66-start.c src/include/66/backup.h src/include/66/config.h src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/svc.h src/include/66/tree.h src/include/66/utils.h
 src/66/66-stop.o src/66/66-stop.lo: src/66/66-stop.c src/include/66/backup.h src/include/66/config.h src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/svc.h src/include/66/tree.h src/include/66/utils.h
 src/66/66-svctl.o src/66/66-svctl.lo: src/66/66-svctl.c src/include/66/constants.h src/include/66/tree.h src/include/66/utils.h
 src/66/66-tree.o src/66/66-tree.lo: src/66/66-tree.c src/include/66/config.h src/include/66/constants.h src/include/66/db.h src/include/66/tree.h src/include/66/utils.h
+src/66/execl-cmdline.o src/66/execl-cmdline.lo: src/66/execl-cmdline.c
 src/lib66/backup_cmd_switcher.o src/lib66/backup_cmd_switcher.lo: src/lib66/backup_cmd_switcher.c src/include/66/constants.h src/include/66/enum.h src/include/66/utils.h
 src/lib66/backup_make_new.o src/lib66/backup_make_new.lo: src/lib66/backup_make_new.c src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/tree.h src/include/66/utils.h
 src/lib66/backup_realpath_sym.o src/lib66/backup_realpath_sym.lo: src/lib66/backup_realpath_sym.c src/include/66/constants.h src/include/66/enum.h src/include/66/utils.h
@@ -75,6 +76,8 @@ src/lib66/tree_switch_tobackup.o src/lib66/tree_switch_tobackup.lo: src/lib66/tr
 66-svctl: src/66/66-svctl.o ${LIB66} -loblibs -ls6 -lskarnet
 66-tree: EXTRA_LIBS :=
 66-tree: src/66/66-tree.o ${LIB66} -loblibs -lskarnet
+execl-cmdline: EXTRA_LIBS :=
+execl-cmdline: src/66/execl-cmdline.o -lexecline -loblibs -lskarnet
 ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),)
 lib66.a.xyzzy: src/lib66/backup_cmd_switcher.o src/lib66/backup_make_new.o src/lib66/backup_realpath_sym.o src/lib66/db_cmd_master.o src/lib66/db_compile.o src/lib66/db_find_compiled_state.o src/lib66/db_get_permissions.o src/lib66/db_ok.o src/lib66/db_switch_to.o src/lib66/db_update.o src/lib66/dir_cmpndel.o src/lib66/find_sv_src.o src/lib66/get_enum.o src/lib66/get_uidgid.o src/lib66/get_userhome.o src/lib66/parser.o src/lib66/parser_utils.o src/lib66/parser_write.o src/lib66/resolve.o src/lib66/scandir_ok.o src/lib66/scandir_send_signal.o src/lib66/set_livedir.o src/lib66/set_livescan.o src/lib66/set_livetree.o src/lib66/set_ownerhome.o src/lib66/set_ownersysdir.o src/lib66/sv_alltype_zero.o src/lib66/svc_switch_to.o src/lib66/tree_cmd_state.o src/lib66/tree_cmd_switcher.o src/lib66/tree_copy.o src/lib66/tree_find_current.o src/lib66/tree_from_current.o src/lib66/tree_get_permissions.o src/lib66/tree_make_backup.o src/lib66/tree_sethome.o src/lib66/tree_switch_current.o src/lib66/tree_switch_tobackup.o
 else
diff --git a/package/modes b/package/modes
index dc256d2e3c9016b54d9859462cdf3b1445124161..63252212f4b74caae2c0bd876425afd71289260b 100644
--- a/package/modes
+++ b/package/modes
@@ -1,10 +1,11 @@
-66-scandir	0755
-66-init		0755
-66-tree		0755
-66-dbctl	0755
-66-enable	0755
-66-disable	0755
-66-start	0755
-66-stop		0755
-66-svctl	0755
-66-all		0755
+66-scandir		0755
+66-init			0755
+66-tree			0755
+66-dbctl		0755
+66-enable		0755
+66-disable		0755
+66-start		0755
+66-stop			0755
+66-svctl		0755
+66-all			0755
+execl-cmdline	0755
diff --git a/package/targets.mak b/package/targets.mak
index 1304eadf12eaf3b66053a1387cdb5cf864316ed9..2a7bbacba32d038d18bae4705fd3dd65797cdf63 100644
--- a/package/targets.mak
+++ b/package/targets.mak
@@ -8,6 +8,7 @@ BIN_TARGETS := \
 66-start \
 66-stop \
 66-svctl \
-66-all
+66-all \
+execl-cmdline
 
 LIB_DEFS := 66=66
diff --git a/src/66/66-all.c b/src/66/66-all.c
index 07f2828b9fde25ddf7d4cb85d3b5c3b917a157d0..6b2e604df7efd21fee78beab1fba188bb3c25fa1 100644
--- a/src/66/66-all.c
+++ b/src/66/66-all.c
@@ -36,6 +36,9 @@
 #include <66/utils.h>
 #include <66/tree.h>
 
+#include <s6/s6-supervise.h>
+#include <s6/config.h>
+
 #include <stdio.h>
 unsigned int VERBOSITY = 1 ;
 static tain_t DEADLINE ;
@@ -312,6 +315,14 @@ int main(int argc, char const *const *argv,char const *const *envp)
 			
 			if (wstat)
 				strerr_diefu2x(111,"init services for tree: ",treename) ;
+			
+			VERBO3 strerr_warnt2x("reload scandir: ",scandir.s) ;
+			r = s6_svc_writectl(scandir.s, S6_SVSCAN_CTLDIR, "an", 2) ;
+			if (r < 0)
+			{
+				VERBO3 strerr_warnw3sys("something is wrong with the ",scandir.s, "/" S6_SVSCAN_CTLDIR " directory. errno reported") ;
+				return -1 ;
+			}
 		}
 		if (!doit(tree.s,treename,live.s,what,envp)) strerr_diefu2x(111,"start service for tree: ",treename) ;
 	}
diff --git a/src/66/66-dbctl.c b/src/66/66-dbctl.c
index a721fc27b90dfa919853f565e5e2b02e2426c659..664d32937d7674d9f6f9dadc03a11c01a751af22 100644
--- a/src/66/66-dbctl.c
+++ b/src/66/66-dbctl.c
@@ -130,7 +130,7 @@ int main(int argc, char const *const *argv,char const *const *envp)
 	if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ;
 	if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ;
 	
-	size_t treelen = get_rlen_until(tree.s,'/',tree.len) ;
+	size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ;
 	size_t treenamelen = (tree.len - 1) - treelen ;
 	char treename[treenamelen + 1] ;
 	memcpy(treename, tree.s + treelen + 1,treenamelen) ;
@@ -278,18 +278,12 @@ int main(int argc, char const *const *argv,char const *const *envp)
 			if (down)
 			{
 				if (WEXITSTATUS(status.wstat) && WIFEXITED(status.wstat) && status.pid)
-				{
-					VERBO3 strerr_warnwu2x("stop: ",svname) ;
-					e = 111 ;
-				}
+					strerr_diefu2x(111,"stop: ",svname) ;
 			}
 			if (up)
 			{
 				if (WEXITSTATUS(status.wstat) && WIFEXITED(status.wstat))
-				{
-					VERBO3 strerr_warnwu2x("start: ",svname) ;
-					e = 111 ;
-				}
+					strerr_diefu2x(111,"start: ",svname) ;
 			}
 		}
 	}
diff --git a/src/66/66-disable.c b/src/66/66-disable.c
index c308bc53b5e9858c7bfeaa8bb43dba611a5c1fd0..2ba8a193335027d0eea15804f23e7a942bed1eb3 100644
--- a/src/66/66-disable.c
+++ b/src/66/66-disable.c
@@ -331,7 +331,7 @@ int main(int argc, char const *const *argv,char const *const *envp)
 	if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ;
 	if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ;
 	
-	size_t treelen = get_rlen_until(tree.s,'/',tree.len) ;
+	size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ;
 	size_t treenamelen = (tree.len - 1) - treelen ;
 	char treename[treenamelen + 1] ;
 	memcpy(treename, tree.s + treelen + 1,treenamelen) ;
diff --git a/src/66/66-enable.c b/src/66/66-enable.c
index cc801c15361696f0b76714ad1f847baaf1d26a90..256a20a37d02e1e79f283e7253dc63ef383297d5 100644
--- a/src/66/66-enable.c
+++ b/src/66/66-enable.c
@@ -135,7 +135,7 @@ int main(int argc, char const *const *argv,char const *const *envp)
 	if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ;
 	if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ;
 	
-	size_t treelen = get_rlen_until(tree.s,'/',tree.len) ;
+	size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ;
 	size_t treenamelen = (tree.len - 1) - treelen ;
 	char treename[treenamelen + 1] ;
 	memcpy(treename, tree.s + treelen + 1,treenamelen) ;
diff --git a/src/66/66-start.c b/src/66/66-start.c
index 93db9c7ead3e05865af6b4f6d2a74d46fce56000..448d44e6fef730fcef06fceb121555d6bfee4623 100644
--- a/src/66/66-start.c
+++ b/src/66/66-start.c
@@ -177,10 +177,7 @@ int svc_start(char const *base,char const *scandir,char const *live,char const *
 	pid_t pid ; 
 	
 	genalloc tot = genalloc_zero ; //stralist
-	/** search logger */
 	
-	
-
 	for (unsigned int i = 0; i < genalloc_len(svstat_t,ga) ; i++)
 	{	
 		if (!stra_add(&tot,genalloc_s(svstat_t,ga)[i].name))
@@ -660,7 +657,7 @@ int main(int argc, char const *const *argv,char const *const *envp)
 	if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ;
 	if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ;
 	
-	size_t treelen = get_rlen_until(tree.s,'/',tree.len) ;
+	size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ;
 	size_t treenamelen = (tree.len - 1) - treelen ;
 	char treename[treenamelen + 1] ;
 	memcpy(treename, tree.s + treelen + 1,treenamelen) ;
@@ -773,6 +770,9 @@ int main(int argc, char const *const *argv,char const *const *envp)
 		if (!rc_sanitize(base.s,live.s,livetree.s,tree.s,treename,&nrc,envp)) strerr_diefu1x(111,"sanitize s6-rc services") ;
 		VERBO2 strerr_warni1x("start rc services ...") ;
 		if (!rc_start(base.s,live.s,livetree.s,tree.s,treename,&nrc,envp,trc)) strerr_diefu1x(111,"update s6-rc services") ;
+		VERBO2 strerr_warni3x("switch rc services of: ",treename," to source") ;
+		if (!db_switch_to(base.s,livetree.s,tree.s,treename,envp,SS_SWSRC))
+			strerr_diefu5x(111,"switch",livetree.s,"/",treename," to source") ;
 	}
 	
 	stralloc_free(&base) ;
diff --git a/src/66/66-stop.c b/src/66/66-stop.c
index a85083de7af51911bc6ac97c12817437667f5d5f..26930bd26ae3f9eb9b6215e955d2923a171e65de 100644
--- a/src/66/66-stop.c
+++ b/src/66/66-stop.c
@@ -167,7 +167,7 @@ int svc_down(char const *base,char const *scandir,char const *live,char const *t
 			{
 				if (!stra_add(&gatoremove,saresolve.s))
 				{
-					VERBO3 strerr_warnwu3x("add logger of: ",svname," as service to remove") ;
+					VERBO3 strerr_warnwu3x("add logger of: ",saresolve.s," as service to remove") ;
 					return 0 ;
 				}
 			}
@@ -175,7 +175,7 @@ int svc_down(char const *base,char const *scandir,char const *live,char const *t
 			{
 				if (!stra_add(&gaunsup,svname))
 				{
-					VERBO3 strerr_warnwu3x("add: ",svname," as service to unsupervise") ;
+					VERBO3 strerr_warnwu3x("add: ",saresolve.s," as service to unsupervise") ;
 					return 0 ;
 				}
 			}
@@ -235,8 +235,33 @@ int svc_down(char const *base,char const *scandir,char const *live,char const *t
 	return 1 ;
 	
 }
-int rc_release(char const *base, char const *live,char const *tree, char const *treename)
+int rc_release(char const *base, char const *scandir, char const *live,char const *tree, char const *treename)
 {
+//	size_t scanlen = strlen(scandir) ;
+/*	size_t treenamelen = strlen(treename) ;
+
+	if (genalloc_len(stralist,&gaunsup))
+	{
+		for (unsigned int i = 0; i < genalloc_len(stralist,&gaunsup); i++)
+		{
+			char const *svname = gaistr(&gaunsup,i) ;
+			size_t svnamelen = gaistrlen(&gaunsup,i) ;
+	
+			char rm[scanlen + 1 + treenamelen + 1 + svnamelen + 1] ;
+			memcpy(rm,scandir,scanlen) ;
+			rm[scanlen] = '/' ;
+			memcpy(rm + scanlen + 1, treename,treenamelen) ;
+			rm[scanlen + 1 + svnamelen] = '-' ;
+			memcpy(rm + scanlen + 1 + treenamelen + 1,svname,svnamelen) ;
+			rm[scanlen + 1 + treenamelen + 1 + svnamelen] = 0 ;
+			VERBO3 strerr_warnt2x("unsupervise: ",rm) ;
+			if (rm_rf(rm) < 0)
+			{
+				VERBO3 strerr_warnwu2sys("remove directory: ",rm) ;
+				return 0 ;
+			}
+		}
+	}*/
 	if (!resolve_pointo(&saresolve,base,live,tree,treename,0,SS_RESOLVE_SRC))
 	{
 		VERBO3 strerr_warnwu1x("set revolve pointer to source") ;
@@ -276,6 +301,7 @@ int rc_down(char const *base, char const *scandir, char const *live, char const
 		
 		char const *svname = genalloc_s(svstat_t,ga)[i].name ;
 		int torm = genalloc_s(svstat_t,ga)[i].remove ;
+	//	int unsup = genalloc_s(svstat_t,ga)[i].unsupervise ;
 		
 		if (!stra_add(&tot,svname))
 		{
@@ -292,6 +318,15 @@ int rc_down(char const *base, char const *scandir, char const *live, char const
 				return 0 ;
 			}
 		}
+		/** unsupervise */
+	/*	if (unsup)
+		{
+			if (!stra_add(&gaunsup,svname))
+			{
+				VERBO3 strerr_warnwu3x("add: ",svname," as service to unsupervise") ;
+				return 0 ;
+			}
+		}*/
 		/** logger */
 		if (!resolve_pointo(&saresolve,base,live,tree,treename,0,SS_RESOLVE_SRC))
 		{
@@ -309,10 +344,18 @@ int rc_down(char const *base, char const *scandir, char const *live, char const
 			{
 				if (!stra_add(&gatoremove,saresolve.s))
 				{
-					VERBO3 strerr_warnwu3x("add logger of: ",svname," as service to remove") ;
+					VERBO3 strerr_warnwu3x("add logger of: ",saresolve.s," as service to remove") ;
 					return 0 ;
 				}
 			}
+		/*	if (unsup)
+			{
+				if (!stra_add(&gaunsup,saresolve.s))
+				{
+					VERBO3 strerr_warnwu3x("add: ",saresolve.s," as service to unsupervise") ;
+					return 0 ;
+				}
+			}*/
 		}
 	}
 	
@@ -458,7 +501,7 @@ int main(int argc, char const *const *argv,char const *const *envp)
 	if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ;
 	if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ;
 	
-	size_t treelen = get_rlen_until(tree.s,'/',tree.len) ;
+	size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ;
 	size_t treenamelen = (tree.len - 1) - treelen ;
 	char treename[treenamelen + 1] ;
 	memcpy(treename, tree.s + treelen + 1,treenamelen) ;
@@ -526,7 +569,7 @@ int main(int argc, char const *const *argv,char const *const *envp)
 				if (!resolve_pointo(&saresolve,base.s,live.s,tree.s,treename,0,SS_RESOLVE_BACK))
 					strerr_diefu1x(111,"set revolve pointer to backup") ;
 				r = resolve_read(&type,saresolve.s,*argv,"type") ;
-				if (r <= 0) strerr_dief3x(111,"service: ",*argv," is not running, you can only start it") ;
+				if (r <= 0 && !UNSUP) strerr_dief3x(111,"service: ",*argv," is not running, you can only start it") ;
 			}
 			if (svsrc.type == CLASSIC)
 			{
@@ -568,13 +611,11 @@ int main(int argc, char const *const *argv,char const *const *envp)
 	}
 	if (genalloc_len(svstat_t,&nrc))
 	{
-		gatoremove = genalloc_zero ;
-		gaunsup = genalloc_zero ;
 		VERBO2 strerr_warni1x("stop rc services ...") ;
 		if (!rc_down(base.s, scandir.s, live.s,livetree.s,tree.s,treename,&nrc,envp,trc))
 			strerr_diefu1x(111,"update rc services") ;
 		VERBO2 strerr_warni1x("release rc services ...") ;
-		if (!rc_release(base.s,live.s,tree.s,treename))
+		if (!rc_release(base.s,scandir.s, live.s,tree.s,treename))
 			strerr_diefu1x(111,"release rc services") ;
 		VERBO2 strerr_warni3x("switch rc services of: ",treename," to source") ;
 		if (!db_switch_to(base.s,livetree.s,tree.s,treename,envp,SS_SWSRC))
diff --git a/src/66/66-svctl.c b/src/66/66-svctl.c
index ee89089068a3fb4bdc0b0bca3b4f86f5e5b28b0d..b919afb3259ecaf4d0f9519702f5e9793fa12e55 100644
--- a/src/66/66-svctl.c
+++ b/src/66/66-svctl.c
@@ -42,7 +42,7 @@
 unsigned int VERBOSITY = 1 ;
 stralloc svkeep = STRALLOC_ZERO ;
 genalloc gakeep = GENALLOC_ZERO ; //type svc_sig_s
-
+stralloc saresolve = STRALLOC_ZERO ;
 typedef struct svc_sig_s svc_sig, *svc_sig_t_ref ;
 struct svc_sig_s
 {
@@ -329,7 +329,7 @@ int iopause_svc(svc_sig *sv_signal,char const *sig, ftrigr_t *fifo)
 							{
 								case GOTIT:
 									h = handle_signal_svc(sv_signal) ;
-									if (!h)
+									if (h)
 									{
 										check = 4 ;
 										break ;
@@ -517,9 +517,7 @@ int main(int argc, char const *const *argv,char const *const *envp)
 	if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ;
 	if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ;
 	
-	stralloc_free(&base) ;
-	
-	size_t treelen = get_rlen_until(tree.s,'/',tree.len) ;
+	size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ;
 	size_t treenamelen = (tree.len - 1) - treelen ;
 	char treename[treenamelen + 1] ;
 	memcpy(treename, tree.s + treelen + 1,treenamelen) ;
@@ -539,8 +537,6 @@ int main(int argc, char const *const *argv,char const *const *envp)
 	if (!r) retstralloc(111,"main") ;
 	if (r < 0 ) strerr_dief3x(111,"live: ",scandir.s," must be an absolute path") ;
 	
-	stralloc_free(&live) ;
-	
 	if ((scandir_ok(scandir.s)) !=1 ) strerr_dief3sys(111,"scandir: ", scandir.s," is not running") ;
 	
 
@@ -564,12 +560,20 @@ int main(int argc, char const *const *argv,char const *const *envp)
 		svok[svoklen] = '/' ;
 		memcpy(svok + svoklen + 1 ,svname,namelen + 1) ;
 		svoklen = svoklen + 1 + namelen ;
-		
-		r = s6_svc_ok(svok) ;
-		if (r < 0) strerr_diefu2sys(111,"check ", svok) ;
-		if (!r)
+		/** do not check the logger*/
+		if (!resolve_pointo(&saresolve,base.s,live.s,tree.s,treename,0,SS_RESOLVE_SRC))
 		{
-			strerr_dief2x(110,svok," is not initialized") ;
+			VERBO3 strerr_warnwu1x("set revolve pointer to source") ;
+			return 0 ;
+		}
+		if (resolve_read(&saresolve,saresolve.s,svname,"logger"))
+		{
+			if (str_diff(saresolve.s,svname))
+			{
+				r = s6_svc_ok(svok) ;
+				if (r < 0) strerr_diefu2sys(111,"check ", svok) ;
+				if (!r)	strerr_dief2x(110,svok," is not initialized") ;
+			}
 		}
 		sv_signal.scan = svkeep.len ;
 		if (!stralloc_catb(&svkeep, svok, svoklen + 1)) retstralloc(111,"main") ;
@@ -659,6 +663,8 @@ int main(int argc, char const *const *argv,char const *const *envp)
 				
 	}
 	
+	stralloc_free(&base) ;
+	stralloc_free(&live) ;
 	stralloc_free(&tree) ;
 	stralloc_free(&scandir) ;
 	
diff --git a/src/66/66-tree.c b/src/66/66-tree.c
index 137f6b1fc395dda6faae8c4a6ae61bba71728ec0..03751634cbd7e1fc310e123af668dc8280174222 100644
--- a/src/66/66-tree.c
+++ b/src/66/66-tree.c
@@ -33,6 +33,7 @@
 #include <66/constants.h>
 #include <66/db.h>
 
+
 #define USAGE "66-tree [ -h help ] [ -v verbosity ] [ -n new ] [ -a allow user,user,... ] [ -d deny user,user,... ] [ -c current ] [ -E enable ] [ -D disable ] [ -R remove ] [ -C clone ] tree"
 
 unsigned int VERBOSITY = 1 ;
@@ -121,18 +122,20 @@ int sanitize_tree(stralloc *dstree, char const *base, char const *tree)
 			return -1 ;
 		}
 	}
+	
 	r = dir_search(dst,tree,S_IFDIR) ;
 	if (r < 0){
 		VERBO3 strerr_warnw3x(dst,tree," is not a directory") ;
 		return -1 ;
 	}
+	
+	if (!r) return 0 ;
+	
 	/** we have one, keep it*/
 	if (!stralloc_cats(dstree,dst)) retstralloc(0,"sanitize_tree") ;
 	if (!stralloc_cats(dstree,"/")) retstralloc(0,"sanitize_tree") ;
 	if (!stralloc_cats(dstree,tree)) retstralloc(0,"sanitize_tree") ;
 	if (!stralloc_0(dstree)) retstralloc(0,"sanitize_tree") ;
-
-	if (!r) return 0 ;
 	
 	return 1 ;
 }
diff --git a/src/66/deps-exe/execl-cmdline b/src/66/deps-exe/execl-cmdline
new file mode 100644
index 0000000000000000000000000000000000000000..c6b27401245136c5d4e0f2b82c6d623381aefe8b
--- /dev/null
+++ b/src/66/deps-exe/execl-cmdline
@@ -0,0 +1,3 @@
+-lexecline
+-loblibs
+-lskarnet
diff --git a/src/66/execl-cmdline.c b/src/66/execl-cmdline.c
new file mode 100644
index 0000000000000000000000000000000000000000..4257ce84779323161c7d02d70320d1c7044594b6
--- /dev/null
+++ b/src/66/execl-cmdline.c
@@ -0,0 +1,96 @@
+/* 
+ * execl-cmdline.c
+ * 
+ * Copyright (c) 2018 Eric Vidal <eric@obarun.org>
+ * 
+ * All rights reserved.
+ * 
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <oblibs/string.h>
+#include <oblibs/stralist.h>
+#include <oblibs/error2.h>
+
+#include <skalibs/stralloc.h>
+#include <skalibs/genalloc.h>
+#include <skalibs/env.h>
+#include <skalibs/djbunix.h>
+#include <skalibs/sgetopt.h>
+
+#include <execline/execline.h>
+
+#define USAGE "execl-cmdline [ -s ] { command... }"
+
+int main(int argc, char const **argv, char const *const *envp)
+{
+
+	int r, argc1, split ;
+
+	PROG = "execl-cmdline" ;
+	
+	stralloc tmodifs = STRALLOC_ZERO ;
+	stralloc modifs = STRALLOC_ZERO ;
+	genalloc ga = GENALLOC_ZERO ;
+	
+	r =  argc1 = split = 0 ;
+	
+	{
+		subgetopt_t l = SUBGETOPT_ZERO ;
+		for (;;)
+		{
+		  int opt = subgetopt_r(argc, argv, "s", &l) ;
+		  if (opt == -1) break ;
+		  switch (opt)
+		  {
+			case 's' : split = 1 ; break ;
+			default : exitusage() ;
+		  }
+		}
+		argc -= l.ind ; argv += l.ind ;
+	}
+	argc1 = el_semicolon(argv) ;
+	if (argc1 >= argc) strerr_dief1x(100, "unterminated block") ;
+	argv[argc1] = 0 ;
+	
+	char const **newargv = argv ;
+	for (int i = 0; i < argc1 ; i++, newargv++)
+	{	
+		if (!*newargv[0])
+			continue ;
+		
+		if (!stralloc_cats(&tmodifs,*newargv)) retstralloc(111,"tmodifs") ;
+		if (split)
+		{
+			if (!stralloc_cats(&tmodifs," ")) retstralloc(111,"tmodifs") ;
+		}
+		else if (!stralloc_0(&tmodifs)) retstralloc(111,"tmodifs_0") ;
+		r++;
+	}
+	
+	if (split)
+	{
+		if (!clean_val(&ga,tmodifs.s)) strerr_diefu2x(111,"clean val: ",tmodifs.s) ;
+		for (unsigned int i = 0 ; i < genalloc_len(stralist,&ga) ; i++)
+		{
+			stralloc_cats(&modifs,gaistr(&ga,i)) ;
+			stralloc_0(&modifs) ;
+		}
+		r = genalloc_len(stralist,&ga) ;
+		genalloc_deepfree(stralist,&ga,stra_free) ;
+	}
+	else if (!stralloc_copy(&modifs,&tmodifs)) retstralloc(111,"copy") ;
+	
+	stralloc_free(&tmodifs) ;
+		
+	char const *newarg[r + 1] ;
+    if (!env_make(newarg, r, modifs.s, modifs.len)) strerr_diefu1sys(111, "env_make") ;
+    newarg[r] = 0 ;
+		
+	xpathexec_run(newarg[0],newarg,envp) ;
+	//el_execsequence(newarg, argv+argc1+1, envp) ;
+}
diff --git a/src/lib66/parser.c b/src/lib66/parser.c
index 84b490583fd28a45397a7d0a0f412dee2922d6dd..180a89f8906d9753abe48486571e2bdc192e3518 100644
--- a/src/lib66/parser.c
+++ b/src/lib66/parser.c
@@ -237,7 +237,6 @@ int parse_service_before(char const *src,char const *sv,char const *tree,strallo
 			if (!r) return 0 ;
 			if (r == 2)	VERBO3 strerr_warni3x("ignore ",deps.s+(genalloc_s(unsigned int,&gadeps)[sv_before.cname.idga+i])," service dependency: already added") ;
 		}
-		
 	}
 
 	stralloc_free(&srctmp) ;
diff --git a/src/lib66/parser_utils.c b/src/lib66/parser_utils.c
index 89027ff3cb96b6db78e690b6cc97b9baead2bb3a..ca384357bf97fa57aef6cab8bc217bbc51be8abe 100644
--- a/src/lib66/parser_utils.c
+++ b/src/lib66/parser_utils.c
@@ -126,8 +126,9 @@ int get_key(char const *s,char const *key,stralloc *keep)
 {
 	int pos,newpos ;
 	size_t end ;
-	
+
 	pos = get_keyline(s,key,keep) ;
+
 	if (pos < 0){
 		return -1 ;
 	}
@@ -299,9 +300,9 @@ int parse_bracket(keynocheck *nocheck)
 	
 	ssize_t start,end,nl ;
 	size_t nlen ;
-	char tmp[nocheck->val.len + 1 + 1] ;
+	char tmp[nocheck->val.len + 1] ;
 	start = end = nl = 0 ;
-	nlen = nocheck->val.len ;
+	nlen = nocheck->val.len - 1 ;
 	start = get_len_until(nocheck->val.s,'(') ;
 	if (start < 0) return 0 ;
 	start++;
diff --git a/src/lib66/parser_write.c b/src/lib66/parser_write.c
index 2ebc85537d5f15871fd584dba401b2ca7685bee3..687eaa4c486d05d9cf8bb7558634ec7578ba61c1 100644
--- a/src/lib66/parser_write.c
+++ b/src/lib66/parser_write.c
@@ -159,7 +159,7 @@ int write_services(sv_alltype *sv, char const *workdir, unsigned int force)
 		{
 			VERBO3 strerr_warnwu2x("write resolve file: reload for service: ",name) ;
 			return 0 ;
-		}
+		}		
 	}
 	if (sv->opts[0])
 	{
@@ -175,12 +175,33 @@ int write_services(sv_alltype *sv, char const *workdir, unsigned int force)
 		}
 		logname[namelen + 4] = 0 ;
 		
+		/** resolve directory*/
+		if (!resolve_remove_service(workdir,logname))
+		{
+			VERBO3 strerr_warnwu2sys("remove resolve directory for: ",name) ;
+			return 0 ;
+		}
 		//VERBO2 strerr_warnt4x("write resolve file ", src,SS_RESOLVE,"/logger ...") ;
 		if (!resolve_write(workdir,name,"logger",logname,force))
 		{
 			VERBO3 strerr_warnwu2x("write resolve file: logger for service: ",name) ;
 			return 0 ;
 		}
+		/** write resolve logger file */
+		if (!resolve_write(workdir,logname,"type",get_keybyid(type),force))
+		{
+			VERBO3 strerr_warnwu2x("write resolve file: type for service: ",logname) ;
+			return 0 ;
+		}
+		if (type == LONGRUN && force)
+		{
+			/** reload file */
+			if (!resolve_write(workdir,logname,"reload","",force))
+			{
+				VERBO3 strerr_warnwu2x("write resolve file: reload for service: ",logname) ;
+				return 0 ;
+			}
+		}
 	}
 	
 		
@@ -429,27 +450,10 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d
 	switch(logbuild)
 	{
 		case AUTO:
+			/** uid */
 			if (!stralloc_cats(&shebang, "#!" EXECLINE_SHEBANGPREFIX "execlineb -P\n")) retstralloc(0,"write_logger") ;
 			if (!stralloc_0(&shebang)) retstralloc(0,"write_logger") ;
-			if (MYUID > 0){
-				if (!stralloc_cats(&ui,"\n")) retstralloc(0,"write_logger") ;
-				if (!stralloc_0(&ui)) retstralloc(0,"write_logger") ;
-				if (!log->destination)
-				{
-					if (!stralloc_cats(&destlog,userhome)) retstralloc(0,"write_logger") ;
-					if (!stralloc_cats(&destlog,"/")) retstralloc(0,"write_logger") ;
-					if (!stralloc_cats(&destlog,SS_LOGGER_USER_DIRECTORY)) retstralloc(0,"write_logger") ;
-					if (!stralloc_cats(&destlog,svname)) retstralloc(0,"write_logger") ;
-				//	if (!stralloc_cats(&destlog,"\n")) retstralloc(0,"write_logger") ;
-				}
-				else
-				{
-					if (!stralloc_cats(&destlog,keep.s+log->destination)) retstralloc(0,"write_logger") ;
-				//	if (!stralloc_cats(&destlog,"\n")) retstralloc(0,"write_logger") ;
-				}
-				if (!stralloc_0(&destlog)) retstralloc(0,"write_logger") ;
-			}
-			else
+			if ((!MYUID && log->run.runas))
 			{
 				if (!stralloc_cats(&ui,S6_BINPREFIX "s6-setuidgid ")) retstralloc(0,"write_logger") ;
 				if (!get_namebyuid(log->run.runas,&ui))
@@ -457,22 +461,32 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d
 					VERBO3 strerr_warnwu1sys("set owner for the logger") ;
 					return 0 ;
 				}
-				if (!stralloc_cats(&ui,"\n")) retstralloc(0,"write_logger") ;
-				if (!stralloc_0(&ui)) retstralloc(0,"write_logger") ;
+			}
+			if (!stralloc_cats(&ui,"\n")) retstralloc(0,"write_logger") ;
+			if (!stralloc_0(&ui)) retstralloc(0,"write_logger") ;
+			/** destination */		
+			if (!log->destination)
+			{	
+				if(MYUID > 0)
+				{	
 				
-				if (!log->destination)
-				{				
-					if (!stralloc_cats(&destlog,SS_LOGGER_SYS_DIRECTORY)) retstralloc(0,"write_logger") ;
+					if (!stralloc_cats(&destlog,userhome)) retstralloc(0,"write_logger") ;
+					if (!stralloc_cats(&destlog,"/")) retstralloc(0,"write_logger") ;
+					if (!stralloc_cats(&destlog,SS_LOGGER_USER_DIRECTORY)) retstralloc(0,"write_logger") ;
 					if (!stralloc_cats(&destlog,svname)) retstralloc(0,"write_logger") ;
-				//	if (!stralloc_cats(&destlog,"\n")) retstralloc(0,"write_logger") ;
 				}
 				else
 				{
-					if (!stralloc_cats(&destlog,keep.s+log->destination)) retstralloc(0,"write_logger") ;
-				//	if (!stralloc_cats(&destlog,"\n")) retstralloc(0,"write_logger") ;
+					if (!stralloc_cats(&destlog,SS_LOGGER_SYS_DIRECTORY)) retstralloc(0,"write_logger") ;
+					if (!stralloc_cats(&destlog,svname)) retstralloc(0,"write_logger") ;
 				}
-				if (!stralloc_0(&destlog)) retstralloc(0,"write_logger") ;
 			}
+			else
+			{
+				if (!stralloc_cats(&destlog,keep.s+log->destination)) retstralloc(0,"write_logger") ;
+			}
+			if (!stralloc_0(&destlog)) retstralloc(0,"write_logger") ;
+			
 			if (log->timestamp == TAI)
 				timestamp = "t" ;
 			else
@@ -497,7 +511,7 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d
 			if (!stralloc_cats(&exec,shebang.s)) retstralloc(0,"write_logger") ;
 			if (!stralloc_cats(&exec,EXECLINE_BINPREFIX "fdmove -c 2 1\n")) retstralloc(0,"write_logger") ;
 			if (!stralloc_cats(&exec,ui.s)) retstralloc(0,"write_logger") ;
-			if (!stralloc_cats(&exec,EXECLINE_BINPREFIX "exec\n" S6_BINPREFIX "s6-log " "n")) retstralloc(0,"write_logger") ;
+			if (!stralloc_cats(&exec,S6_BINPREFIX "s6-log " "n")) retstralloc(0,"write_logger") ;
 			if (!stralloc_cats(&exec,pback)) retstralloc(0,"write_logger") ;
 			if (!stralloc_cats(&exec," ")) retstralloc(0,"write_logger") ;
 			if (!stralloc_cats(&exec,timestamp)) retstralloc(0,"write_logger") ;
@@ -561,7 +575,7 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d
 			return 0 ;
 		}
 	}
-	if (r)
+/*	if (r)
 	{
 		if (force)
 		{
@@ -588,7 +602,7 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d
 			VERBO3 strerr_warnw5x("ignoring creation of: ",destlog.s,"/",svname,": already exist") ;
 			return 1 ;
 		}
-	}
+	}*/
 	
 	
 	stralloc_free(&shebang) ;
@@ -849,10 +863,20 @@ int write_exec(sv_alltype *sv, sv_exec *exec,char const *file,char const *dst,in
 					for (unsigned int i = 0 ; i < genalloc_len(sv_env,&sv->env) ; i++)
 					{
 						key = genalloc_s(sv_env,&sv->env)[i].key ;
-						if (!stralloc_cats(&env,"importas -i ")) retstralloc(0,"write_exec") ;
-						if (!stralloc_cats(&env,saenv.s+key)) retstralloc(0,"write_exec") ;
-						if (!stralloc_cats(&env," ")) retstralloc(0,"write_exec") ;
-						if (!stralloc_cats(&env,saenv.s+key)) retstralloc(0,"write_exec") ;
+						if ((saenv.s+key)[0] == '!')
+						{
+							if (!stralloc_cats(&env,"importas -uD \"\" ")) retstralloc(0,"write_exec") ;
+							if (!stralloc_cats(&env,saenv.s+1+key)) retstralloc(0,"write_exec") ;
+							if (!stralloc_cats(&env," ")) retstralloc(0,"write_exec") ;
+							if (!stralloc_cats(&env,saenv.s+1+key)) retstralloc(0,"write_exec") ;
+						}
+						else
+						{
+							if (!stralloc_cats(&env,"importas -D \"\" ")) retstralloc(0,"write_exec") ;
+							if (!stralloc_cats(&env,saenv.s+key)) retstralloc(0,"write_exec") ;
+							if (!stralloc_cats(&env," ")) retstralloc(0,"write_exec") ;
+							if (!stralloc_cats(&env,saenv.s+key)) retstralloc(0,"write_exec") ;
+						}
 						if (!stralloc_cats(&env,"\n")) retstralloc(0,"write_exec") ;
 					}
 				}
@@ -862,17 +886,11 @@ int write_exec(sv_alltype *sv, sv_exec *exec,char const *file,char const *dst,in
 			{
 				if (!stralloc_cats(&shebang, "#!" EXECLINE_SHEBANGPREFIX "execlineb -P\n")) retstralloc(0,"write_exec") ;
 			}
-			/** command to execute */
-			if (!stralloc_cats(&runuser, keep.s+exec->exec)) retstralloc(0,"write_exec") ;
 			break ;
 		case CUSTOM:
 			if (!stralloc_cats(&shebang, "#!")) retstralloc(0,"write_exec") ;
 			if (!stralloc_cats(&shebang, keep.s+exec->shebang)) retstralloc(0,"write_exec") ;
 			if (!stralloc_cats(&shebang,"\n")) retstralloc(0,"write_exec") ;
-			
-			if (!stralloc_cats(&runuser, keep.s+exec->exec)) retstralloc(0,"write_exec") ;
-			if (!stralloc_cats(&runuser,"\n")) retstralloc(0,"write_exec") ;
-			
 			break ;
 		default:
 			VERBO3 strerr_warnw3x("unknow ", get_keybyid(exec->build)," build type") ;
@@ -885,6 +903,8 @@ int write_exec(sv_alltype *sv, sv_exec *exec,char const *file,char const *dst,in
 	/** close shebang */
 	if (!stralloc_0(&shebang)) retstralloc(0,"write_exec") ;
 	/** close command */
+	if (!stralloc_cats(&runuser, keep.s+exec->exec)) retstralloc(0,"write_exec") ;
+	if (!stralloc_cats(&runuser,"\n")) retstralloc(0,"write_exec") ;
 	if (!stralloc_0(&runuser)) retstralloc(0,"write_exec") ;
 	
 	/** build the file*/	
@@ -963,6 +983,9 @@ int write_env(genalloc *env,stralloc *sa,char const *dst)
 		{
 			key = genalloc_s(sv_env,env)[i].key ;
 			val = genalloc_s(sv_env,env)[i].val ;
+			
+			if ((sa->s+key)[0] == '!')
+				key++ ;
 		/*	if (dir_search(dst,sa->s+key,S_IFREG))
 			{
 				VERBO3 strerr_warnw5x("file: ",dst,"/",sa->s+key," already exist, skip it") ;
diff --git a/src/lib66/tree_find_current.c b/src/lib66/tree_find_current.c
index dbb4d71618534dcd39cdf7f9aebc309c9526aca4..ea3974ed05744e16a0eb804873eaec16fbaa46fe 100644
--- a/src/lib66/tree_find_current.c
+++ b/src/lib66/tree_find_current.c
@@ -26,6 +26,7 @@
 
 #include <66/constants.h>
 
+
 int tree_find_current(stralloc *tree, char const *base)
 {
 	ssize_t r ;
@@ -36,7 +37,7 @@ int tree_find_current(stralloc *tree, char const *base)
 	size_t packlen = uint_fmt(pack,MYUID) ;
 	pack[packlen] = 0 ;
 	
-	char sa[baselen + SS_TREE_CURRENT_LEN + 1 + packlen + 1 + SS_TREE_CURRENT_LEN] ;
+	char sa[baselen + SS_TREE_CURRENT_LEN + 1 + packlen + 1 + SS_TREE_CURRENT_LEN + 1] ;
 	memcpy(sa,base,baselen) ;
 	memcpy(sa + baselen, SS_TREE_CURRENT, SS_TREE_CURRENT_LEN) ;
 	sa[baselen + SS_TREE_CURRENT_LEN] = '/' ;
@@ -47,7 +48,7 @@ int tree_find_current(stralloc *tree, char const *base)
 	
 	r = scan_mode(sa,S_IFDIR) ;
 	if(r <= 0) return 0 ; 
-		
+	//	strerr_warni2x("sa tree_find_current",sa) ;
 	r = sarealpath(tree,sa) ;
 	if (r < 0 ) return 0 ; 
 	if (!stralloc_0(tree)) retstralloc(0,"find_current") ;
diff --git a/src/lib66/tree_sethome.c b/src/lib66/tree_sethome.c
index 158e7db78183ebcaf6ff6065cb72fbaa17e9bfd8..8c8c9fa56fc3f16f03d754ad826c9831be62ef94 100644
--- a/src/lib66/tree_sethome.c
+++ b/src/lib66/tree_sethome.c
@@ -35,7 +35,7 @@ int tree_sethome(stralloc *tree, char const *base)
 	}
 	else
 	{
-		char treename[tree->len] ;
+		char treename[tree->len + 1] ;
 		memcpy(treename,tree->s,tree->len - 1) ;
 		treename[tree->len - 1] = 0 ;
 		tree->len = 0 ;