diff --git a/src/lib66/ssexec_dbctl.c b/src/lib66/ssexec_dbctl.c
index 5081dc42d95cb176076e3c78ca87fe603224ee12..361094cdc9a0eccb421950c7a66df9e286993dac 100644
--- a/src/lib66/ssexec_dbctl.c
+++ b/src/lib66/ssexec_dbctl.c
@@ -42,7 +42,7 @@
 #include <66/resolve.h>
 #include <66/ssexec.h>
 
-//#include <stdio.h>
+#include <stdio.h>
 
 static unsigned int DEADLINE = 0 ;
 
@@ -87,7 +87,7 @@ int ssexec_dbctl(int argc, char const *const *argv,char const *const *envp,ssexe
 	// be sure that the global var are set correctly
 	DEADLINE = 0 ;
 
-	unsigned int up, down, reload ;
+	unsigned int up, down, reload, ret ;
 	
 	int wstat ;
 	pid_t pid ;
@@ -96,12 +96,14 @@ int ssexec_dbctl(int argc, char const *const *argv,char const *const *envp,ssexe
 	char *mainsv = "Master" ;
 	
 	genalloc gasv = GENALLOC_ZERO ; //stralist
+	genalloc resdeps = GENALLOC_ZERO ; //ss_resolve_t
+	genalloc gasrc = GENALLOC_ZERO ;
 	stralloc tmp = STRALLOC_ZERO ;
 	ss_resolve_t res = RESOLVE_ZERO ;
 	stralloc src = STRALLOC_ZERO ;
 	s6_svstatus_t status = S6_SVSTATUS_ZERO ;
 	
-	up = down = reload = 0 ;
+	up = down = reload = ret = 0 ;
 	
 	if (!ss_resolve_pointo(&src,info,SS_NOTYPE,SS_RESOLVE_SRC)) strerr_diefu1sys(111,"set revolve pointer to source") ;
 	//PROG = "66-dbctl" ;
@@ -160,7 +162,7 @@ int ssexec_dbctl(int argc, char const *const *argv,char const *const *envp,ssexe
 		if (waitpid_nointr(pid,&wstat, 0) < 0)
 			strerr_diefu1sys(111,"wait for s6-rc") ;
 		
-		if (wstat) strerr_diefu3x(111,"bring",down ? " down " : " up ","services list") ;
+		if (wstat) strerr_diefu2x(111,down ? " stop " : " start ","services list") ;
 	}
 	
 	if (down) signal = "-d" ;
@@ -171,7 +173,7 @@ int ssexec_dbctl(int argc, char const *const *argv,char const *const *envp,ssexe
 	if (waitpid_nointr(pid,&wstat, 0) < 0)
 		strerr_diefu1sys(111,"wait for s6-rc") ;
 	
-	if (wstat) strerr_diefu3x(111,"bring",down ? " down " : " up ","services list") ;
+	if (wstat) strerr_diefu2x(111,down ? " start " : " stop ","services list") ;
 	
 	/** we are forced to do this ugly check cause of the design
 	 * of s6-rc(generally s6-svc) which is launch and forgot. So
@@ -182,42 +184,88 @@ int ssexec_dbctl(int argc, char const *const *argv,char const *const *envp,ssexe
 	 * between the end of the s6-rc process and the check of the daemon status,
 	 * the real value of the status can be not written yet,so we can hit
 	 * this window.*/
-	
+	if (!graph_type_src(&gasrc,src.s,1)) strerr_diefu2x(111,"resolve graph source of tree: ",info->treename.s) ; ;
 	for (unsigned int i = 0; i < genalloc_len(stralist,&gasv) ; i++)
 	{
 		res.sa.len = 0 ;
 		char *name = gaistr(&gasv,i) ;
-		if (obstr_equal(name,SS_MASTER + 1)) continue ;
-		
+	
 		if (!ss_resolve_check(info,name,SS_RESOLVE_SRC)) strerr_dief2sys(111,"unknow service: ",name) ;
 		if (!ss_resolve_read(&res,src.s,name)) strerr_diefu2sys(111,"read resolve file of: ",name) ;
+		if (up)
+		{
+			if (!ss_resolve_deps(&resdeps,&res,info)) strerr_diefu2sys(111,"resolve dependencies of: ",name) ;
+		}
+		else if (!ss_resolve_rdeps(&resdeps,&gasrc,&res,info)) strerr_diefu2sys(111,"resolve dependencies of: ",name) ;
+		
+	}
+	
+	for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,&resdeps) ; i++)
+	{ 
+		int nret = 0 ;
+		ss_resolve_t_ref dres = &genalloc_s(ss_resolve_t,&resdeps)[i] ;
+		char *name = dres->sa.s + dres->name ;
+		/** do not touche the Master resolve file*/
+		if (obstr_equal(name,SS_MASTER + 1)) continue ;
 		/** only check longrun service */
-		if (res.type == LONGRUN)
+		if (dres->type == LONGRUN)
 		{	
-			if (!s6_svstatus_read(res.sa.s + res.runat,&status))
+			if (!s6_svstatus_read(dres->sa.s + dres->runat,&status))
 			{
-				strerr_diefu4sys(111,"read status of: ",res.sa.s + res.runat," -- race condition, try 66-info -S ",res.sa.s + res.name) ;
+				strerr_diefu4sys(111,"read status of: ",dres->sa.s + dres->runat," -- race condition, try 66-info -S ",dres->sa.s + dres->name) ;
 			}
 			if (down)
 			{
 				if (WEXITSTATUS(status.wstat) && WIFEXITED(status.wstat) && status.pid)
-					strerr_diefu2x(111,"stop: ",name) ;
+				{
+					VERBO1 strerr_warnwu2x("stop: ",name) ;
+					ss_resolve_setflag(dres,SS_FLAGS_PID,(uint32_t)status.pid) ;
+					nret = 1 ;
+				}
+				else ss_resolve_setflag(dres,SS_FLAGS_PID,SS_FLAGS_FALSE) ;
 			}
 			else if (up)
 			{
 				if (WEXITSTATUS(status.wstat) && WIFEXITED(status.wstat))
-					strerr_diefu2x(111,"start: ",name) ;
+				{
+					VERBO1 strerr_warnwu2x("start: ",name) ;
+					nret = 1 ;
+					ss_resolve_setflag(dres,SS_FLAGS_PID,SS_FLAGS_FALSE) ;
+				}
+				else ss_resolve_setflag(dres,SS_FLAGS_PID,(uint32_t)status.pid) ;
+			}
+		}
+		if (!nret) VERBO1 strerr_warni3x(name,down ? " stopped " : " started ", "successfully") ;
+		if (nret) ret = 111 ;
+		ss_resolve_setflag(dres,SS_FLAGS_RUN,SS_FLAGS_TRUE) ;
+		ss_resolve_setflag(dres,SS_FLAGS_RELOAD,SS_FLAGS_FALSE) ;
+		ss_resolve_setflag(dres,SS_FLAGS_INIT,SS_FLAGS_FALSE) ;
+		ss_resolve_setflag(dres,SS_FLAGS_UNSUPERVISE,SS_FLAGS_FALSE) ;
+		VERBO2 strerr_warni2x("Write resolve file of: ",name) ;
+		if (!ss_resolve_write(dres,src.s,name))
+		{
+			VERBO1 strerr_warnwu2sys("write resolve file of: ",name) ;
+			ret = 111 ;
+		}
+		if (dres->logger)
+		{
+			VERBO2 strerr_warni2x("Write logger resolve file of: ",name) ;
+			if (!ss_resolve_setlognwrite(dres,src.s))
+			{
+				VERBO1 strerr_warnwu2sys("write logger resolve file of: ",name) ;
+				ret = 111 ;
 			}
 		}
-		VERBO1 strerr_warni3x(name,down ? " stopped " : " started ", "successfully") ;
+		ss_resolve_free(dres) ;
 	}
 	
-	ss_resolve_free(&res) ;
+	//ss_resolve_free(&res) ;
 	stralloc_free(&tmp) ;	
 	stralloc_free(&src) ;
 	genalloc_deepfree(stralist,&gasv,stra_free) ;
-	
-	return 0 ;
+	genalloc_deepfree(stralist,&gasrc,stra_free) ;
+	genalloc_deepfree(ss_resolve_t,&resdeps,ss_resolve_free) ;
+	return ret ;
 }