diff --git a/src/lib66/ssexec_svctl.c b/src/lib66/ssexec_svctl.c
index e457a7722a1f0f8aa6ef6996fef9844ae823c938..f32cadbd6403c9943f21f8c1d116bb71d15bb6c7 100644
--- a/src/lib66/ssexec_svctl.c
+++ b/src/lib66/ssexec_svctl.c
@@ -83,6 +83,8 @@ int handle_signal_svc(ss_resolve_sig_t *sv_signal)
 		VERBO3 strerr_warnwu2sys("read status of: ",sv) ;
 		return 0 ;
 	}
+	sv_signal->pid = status.pid ;
+	
 	if (WIFSIGNALED(status.wstat) && !WEXITSTATUS(status.wstat) && (WTERMSIG(status.wstat) == 15 )) return 1 ;
 	if (!WIFSIGNALED(status.wstat) && !WEXITSTATUS(status.wstat)) return 1 ;
 	else return 0 ;
@@ -158,48 +160,49 @@ static const uint8_t chtenum[128] =
  * @Return 2 on fail
  * @Return 3 for PERMANENT failure */
 
-int handle_case(char c, ss_resolve_sig_t *sv_signal)
+int handle_case(stralloc *sa, ss_resolve_sig_t *sv_signal)
 {
 	int p, h, err ;
-	unsigned int state ;
+	unsigned int state, i = 0 ;
 	state = sv_signal->sig ;
 	err = 2 ;
 	
-	p = chtenum[(unsigned char)c] ;
-	
-	unsigned char action = actions[state][p] ;
-	
-	switch (action)
+	for (;i < sa->len ; i++)
 	{
-		case GOTIT:
-					h = handle_signal_svc(sv_signal) ;
-					
-					if (!h)
-					{
+		p = chtenum[(unsigned char)sa->s[i]] ;
+		
+		unsigned char action = actions[state][p] ;
+		
+		
+		switch (action)
+		{
+			case GOTIT:
+						h = handle_signal_svc(sv_signal) ;
+						if (!h)
+						{
+							err = 1 ;
+							break ;
+						}
+						err = 0 ;
+						return err ; 
+			case WAIT:
 						err = 1 ;
 						break ;
-					}
-					err = 0 ;
-					break ;
-		case WAIT:
-					err = 1 ;
-					break ;
-		case DEAD:
-					err = 2 ;
-					break ;
-		case DONE:
-					err = 0 ;
-					break ;
-		case PERM:
-					err = 3 ;
-					break ;
-		case UKNOW:
-		default:
-					VERBO3 strerr_warnw1x("invalid state, make a bug report");
-					err = 2 ;
-					break ;
+			case DEAD:
+						err = 2 ;
+						return err ; 
+			case DONE:
+						err = 0 ;
+						return err ; 
+			case PERM:
+						err = 3 ;
+						return err ; 
+			default:
+						VERBO3 strerr_warnw1x("invalid state, make a bug report");
+						err = 2 ;
+						return err ; 
+		}
 	}
-	
 	return err ;
 }
 
@@ -237,6 +240,9 @@ static void announce(ss_resolve_sig_t *sv_signal)
 int svc_listen(genalloc *gasv, ftrigr_t *fifo,int spfd,ss_resolve_sig_t *svc)
 {
 	int r ;
+
+	stralloc sa = STRALLOC_ZERO ;
+	
 	iopause_fd x[2] = { { .fd = ftrigr_fd(fifo), .events = IOPAUSE_READ } , { .fd = spfd, .events = IOPAUSE_READ, .revents = 0 } } ;
 		
 	tain_t t ;
@@ -247,21 +253,19 @@ int svc_listen(genalloc *gasv, ftrigr_t *fifo,int spfd,ss_resolve_sig_t *svc)
 	
 	for(;;)
 	{
-		char receive ;
-		r = ftrigr_check(fifo,svc->ids, &receive) ;
+		r = ftrigr_checksa(fifo,svc->ids, &sa) ;
 		if (r < 0) { VERBO3 strerr_warnwu1sys("ftrigr_check") ; return 0 ; } 
 		if (r)
 		{
-			svc->state = handle_case(receive, svc) ;
-			if (svc->state < 0) return 0 ;
-			if (!svc->state){ announce(svc) ; break ; }
-			else if (svc->state > 2){ announce(svc) ; break ; }
+			svc->state = handle_case(&sa,svc) ;
+			if (!svc->state){ announce(svc) ; goto end ; }
+			else if (svc->state >= 2){ announce(svc) ; goto end ; }
 		}
 		if (!(svc->ndeath))
 		{
 			VERBO2 strerr_warnw2x("number of try exceeded for: ",svc->res.sa.s + svc->res.runat) ;
 			announce(svc) ;
-			break ;
+			goto end ;
 		}
 		
 		r = iopause_g(x, 2, &t) ;
@@ -277,8 +281,9 @@ int svc_listen(genalloc *gasv, ftrigr_t *fifo,int spfd,ss_resolve_sig_t *svc)
 			svc->ndeath--;
 		}
 	}
-	
-	return 1 ;
+	end:
+	stralloc_free(&sa) ;
+	return svc->state ;
 }
 
 int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexec_t *info)
@@ -289,7 +294,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 	DEATHSV = 10 ;
 	tain_t ttmain ;
 	
-	int e, isup ;
+	int e, isup, ret ;
 	unsigned int death, tsv ;
 	int SIGNAL = -1 ;
 	
@@ -300,7 +305,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 	ftrigr_t fifo = FTRIGR_ZERO ;
 	s6_svstatus_t status = S6_SVSTATUS_ZERO ;
 	
-	tsv = death = 0 ;
+	tsv = death = ret = 0 ;
 	
 	//PROG = "66-svctl" ;
 	{
@@ -316,10 +321,10 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 				case 'n' :	if (!uint0_scan(l.arg, &death)) exitusage(usage_svctl) ; break ;
 				case 'u' :	if (SIGNAL > 0) exitusage(usage_svctl) ; SIGNAL = SIGUP ; sig ="u" ; break ;
 				case 'U' :	if (SIGNAL > 0) exitusage(usage_svctl) ; SIGNAL = SIGRUP ; sig = "uwU" ; break ;
-				case 'd' : 	if (SIGNAL > 0) ; SIGNAL = SIGDOWN ; sig = "d" ; break ;
-				case 'D' :	if (SIGNAL > 0) ; SIGNAL = SIGRDOWN ; sig = "dwD" ; break ;
 				case 'r' :	if (SIGNAL > 0) ; SIGNAL = SIGR ; sig = "r" ; break ;
 				case 'R' :	if (SIGNAL > 0) ; SIGNAL = SIGRR ; sig = "rwR" ; break ;
+				case 'd' : 	if (SIGNAL > 0) ; SIGNAL = SIGDOWN ; sig = "d" ; break ;
+				case 'D' :	if (SIGNAL > 0) ; SIGNAL = SIGRDOWN ; sig = "dwD" ; break ;
 				case 'X' :	if (SIGNAL > 0) ; SIGNAL = SIGX ; sig = "xd" ; break ;
 				case 'K' :	if (SIGNAL > 0) ; SIGNAL = SIGRDOWN ; sig = "kd" ; break ;
 				
@@ -482,11 +487,47 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 
 	for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_sig_t,&gakeep) ; i++)
 	{ 
+		int nret = 0 ;
+	
 		ss_resolve_sig_t *sv = &genalloc_s(ss_resolve_sig_t,&gakeep)[i] ;
-		if (!svc_listen(&gakeep,&fifo,spfd,sv)) strerr_diefu1x(111,"listen pipe") ;
+		char *name = sv->res.sa.s + sv->res.name ;
+		int logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ;
+		nret = svc_listen(&gakeep,&fifo,spfd,sv) ;
+		if (nret > 1) ret = 1 ;
+		if (sv->sig <= 3)
+		{
+			if (nret <= 1)
+				ss_resolve_setflag(&sv->res,SS_FLAGS_PID,(uint32_t)sv->pid) ;
+			else ss_resolve_setflag(&sv->res,SS_FLAGS_PID,SS_FLAGS_FALSE) ;
+		}
+		else
+		{
+			if (nret <=1)
+				ss_resolve_setflag(&sv->res,SS_FLAGS_PID,SS_FLAGS_FALSE) ;
+			/** wtf, the system can kill a process?? should never happen */
+			else strerr_diefu1x(111,"kill the process - this should never happen - please, make a bug report") ;
+		}
+		ss_resolve_setflag(&sv->res,SS_FLAGS_RUN,SS_FLAGS_TRUE) ;
+		ss_resolve_setflag(&sv->res,SS_FLAGS_RELOAD,SS_FLAGS_FALSE) ;
+		ss_resolve_setflag(&sv->res,SS_FLAGS_INIT,SS_FLAGS_FALSE) ;
+		ss_resolve_setflag(&sv->res,SS_FLAGS_UNSUPERVISE,SS_FLAGS_FALSE) ;
+		VERBO2 strerr_warni2x("Write resolve file of: ",name) ;
+		if (!ss_resolve_write(&sv->res,src.s,name))
+		{
+			VERBO1 strerr_warnwu2sys("write resolve file of: ",name) ;
+			ret = 1 ;
+		}
+		if (sv->res.logger)
+		{
+			VERBO2 strerr_warni2x("Write logger resolve file of: ",name) ;
+			if (!ss_resolve_setlognwrite(&sv->res,src.s))
+			{
+				VERBO1 strerr_warnwu2sys("write logger resolve file of: ",name) ;
+				ret = 1 ;
+			}
+		}
 		ss_resolve_free(&sv->res) ;
 	}
-	
 	tain_now_g() ;
 	tain_addsec(&ttmain,&STAMP,2) ;
 	
@@ -496,7 +537,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 		if (!ftrigr_unsubscribe_g(&fifo, sv->ids, &ttmain))
 		{ 
 			VERBO3 strerr_warnwu2sys("unsubscribe to fifo of: ",sv->res.sa.s + sv->res.name) ;
-			return 0 ;
+			ret = 1 ;
 		}
 	}
 	
@@ -508,7 +549,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 		genalloc_deepfree(ss_resolve_sig_t,&gakeep,ss_resolve_free) ;
 		
 		
-	return 0 ;		
+	return ret ;		
 }