diff --git a/src/lib66/ssexec_svctl.c b/src/lib66/ssexec_svctl.c
index a35daab104e3247a3117c328580e5e7b9ca07f80..191d86997555ac41c012ebbdd7ab9ef1d79d524d 100644
--- a/src/lib66/ssexec_svctl.c
+++ b/src/lib66/ssexec_svctl.c
@@ -17,11 +17,12 @@
 #include <sys/wait.h>
 #include <signal.h>
 #include <unistd.h>//access
-#include <stdio.h>
+//#include <stdio.h>
 //#include <stdlib.h>
 
 #include <oblibs/obgetopt.h>
 #include <oblibs/error2.h>
+#include <oblibs/string.h>
 
 #include <skalibs/types.h>
 #include <skalibs/stralloc.h>
@@ -167,6 +168,7 @@ int handle_case(stralloc *sa, ss_resolve_sig_t *svc)
 	unsigned int state, i = 0 ;
 	state = svc->sig ;
 	err = 2 ;
+
 	for (;i < sa->len ; i++)
 	{
 		p = chtenum[(unsigned char)sa->s[i]] ;
@@ -256,15 +258,15 @@ static int announce(ss_resolve_sig_t *svc)
 	{
 		case 0: VERBO1 strerr_warni4x(sv," is ",(svc->sig > 3) ? "down" : "up"," but not notified by the daemon itself") ; 
 				break ;
-		case 1: VERBO1 strerr_warni4x(sv,": ",(svc->sig > 3) ? "stopped" : "started"," successfully") ;
+		case 1: VERBO1 strerr_warni4x(sv,": ",(svc->sig > 3) ? "stopped" : (svc->sig == 2 || svc->sig == 3) ? "reloaded" : "started"," successfully") ;
 				break ;
-		case 2: VERBO1 strerr_warnwu2x((svc->sig > 3) ? "stop " : "start ", sv) ; 
+		case 2: VERBO1 strerr_warnwu2x((svc->sig > 3) ? "stop " : (svc->sig == 2 || svc->sig == 3) ? "reload" : "start ", sv) ; 
 				break ;
-		case 3: VERBO1 strerr_warnw3x(sv," report permanent failure -- unable to ",(svc->sig > 1) ? "stop" : "start") ;
+		case 3: VERBO1 strerr_warnw3x(sv," report permanent failure -- unable to ",(svc->sig > 1) ? "stop" : (svc->sig == 2 || svc->sig == 3) ? "reload" : "start") ;
 				break ;
-		case 4: VERBO1 strerr_warnwu3x((svc->sig > 3) ? "stop: " : "start: ",sv, ": number of try exceeded") ;
+		case 4: VERBO1 strerr_warnwu3x((svc->sig > 3) ? "stop: " : (svc->sig == 2 || svc->sig == 3) ? "reload" : "start: ",sv, ": number of try exceeded") ;
 				break ;
-		case 5: VERBO1 strerr_warnwu3x((svc->sig > 3) ? "stop: " : "start: ",sv, ": time out reached") ;
+		case 5: VERBO1 strerr_warnwu3x((svc->sig > 3) ? "stop: " : (svc->sig == 2 || svc->sig == 3) ? "reload" : "start: ",sv, ": time out reached") ;
 				break ;
 		case-1: 
 		default:VERBO1 strerr_warnw3x("unexpected data in state file of: ",sv," -- please make a bug report") ;
@@ -357,7 +359,7 @@ static void svc_listen(unsigned int nsv,tain_t *deadline)
 	
 	tain_now_g() ;
 	tain_copynow(&start) ;
-		
+	
 	while(i--)
 		did[i] = 0 ;
 
@@ -365,8 +367,7 @@ static void svc_listen(unsigned int nsv,tain_t *deadline)
 	{
 		r = iopause_g(&x, 1, deadline) ;
 		if (r < 0) strerr_dief1sys(111,"listen iopause") ;
-		/** timeout is not a error , the iopause process did right*/ 
-		else if (!r) strerr_dief1sys(111,"listen time out") ;
+		else if (!r) strerr_dief1x(111,"listen time out") ;
 		if (x.revents & IOPAUSE_READ)  
 		{	
 			i = 0 ;
@@ -468,7 +469,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 	DEATHSV = 5 ;
 	
 	int e, isup, r, ret = 1 ;
-	unsigned int death, tsv, reverse ;
+	unsigned int death, tsv, reverse, tsv_g ;
 	int SIGNAL = -1 ;
 	tain_t ttmain ;
 	
@@ -483,6 +484,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 	s6_svstatus_t status = S6_SVSTATUS_ZERO ;
 	
 	tsv = death = reverse = 0 ;
+	tsv_g = SV_DEADLINE ;
 	
 	//PROG = "66-svctl" ;
 	{
@@ -512,21 +514,23 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 	if (info->timeout) tsv = info->timeout ;
 	if ((scandir_ok(info->scandir.s)) !=1 ) strerr_dief3sys(111,"scandir: ", info->scandir.s," is not running") ;
 	if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC)) strerr_diefu1sys(111,"set revolve pointer to source") ;
-	if (SIGNAL > SIGRUP) reverse = 1 ;
+	if (SIGNAL > SIGR) reverse = 1 ;
 	for(;*argv;argv++)
 	{
 		char const *name = *argv ;
+		int logname = 0 ;
+		logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ;
 		if (!ss_resolve_check(sares.s,name)) strerr_dief2sys(111,"unknown service: ",name) ;
 		if (!ss_resolve_read(&res,sares.s,name)) strerr_diefu2sys(111,"read resolve file of: ",name) ;
 		if (res.type >= BUNDLE) strerr_dief3x(111,name," has type ",get_keybyid(res.type)) ;
+		if (SIGNAL == SIGR && logname < 0) reverse = 1 ;
 		if (!ss_resolve_graph_build(&graph,&res,sares.s,reverse)) strerr_diefu1sys(111,"build services graph") ;
 	}
 	
-	if (SIGNAL == SIGR) reverse = 0 ;
 	r = ss_resolve_graph_publish(&graph,reverse) ;
 	if (r < 0) strerr_dief1x(111,"cyclic dependencies detected") ;
 	if (!r) strerr_diefu1sys(111,"publish service graph") ;
-	
+
 	for(unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,&graph.sorted) ; i++)
 	{
 		ss_resolve_sig_t sv_signal = RESOLVE_SIG_ZERO ;
@@ -553,6 +557,13 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 			VERBO1 strerr_warni2x("Already down: ",string + sv_signal.res.name) ;
 			continue ;
 		}
+		/** special on reload signal, if the process is down
+		 * simply bring it up */
+		else if (!isup && (SIGNAL == SIGR))
+		{
+			sig = "u" ;
+			SIGNAL = SIGUP ;
+		}
 		sv_signal.sigtosend = sig ;	sv_signal.sig = SIGNAL ;
 		
 		/** notification-fd */
@@ -570,7 +581,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 			if (SIGNAL == SIGUP)
 			{ sv_signal.sig = SIGRUP ; sv_signal.sigtosend = "uwU" ; }
 			else if (SIGNAL == SIGR)
-			{ sv_signal.sig = SIGRR ; sv_signal.sigtosend = "uwR" ; }
+			{ sv_signal.sig = SIGRR ; sv_signal.sigtosend = "rwR" ; }
 			else if (SIGNAL == SIGDOWN)
 			{ sv_signal.sig = SIGRDOWN ; sv_signal.sigtosend = "dwD" ; }
 		}
@@ -595,7 +606,11 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 		tain_t tcheck ;
 		tain_from_millisecs(&tcheck,tsv) ;
 		int check = tain_to_millisecs(&tcheck) ;
-		if (check > 0) tain_from_millisecs(&sv_signal.deadline, tsv) ;
+		if (check > 0)
+		{ 
+			tain_from_millisecs(&sv_signal.deadline, tsv) ; 
+			tsv_g += tsv ; 
+		}
 		else
 		{
 			/** timeout-{up/down} */
@@ -612,11 +627,17 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 				if (errno != ENOENT) strerr_diefu2sys(111, "access ", file) ;
 			
 			if (errno == ENOENT)
+			{
 				tain_from_millisecs(&sv_signal.deadline, SV_DEADLINE) ;
+				tsv_g += SV_DEADLINE ;
+			}
 			else
 			{
 				if (!read_uint(file,&t)) strerr_diefu2sys(111,"read: ",file) ;
+				{	
 					tain_from_millisecs(&sv_signal.deadline, t) ;
+					tsv_g += t ;
+				}
 			}
 		}
 		errno = e ;
@@ -625,11 +646,11 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
 	/** nothing to do */
 	if (!genalloc_len(ss_resolve_sig_t,&gakeep)) goto finish ;
 	
-	ttmain = tain_infinite_relative ;
-	
+	//ttmain = tain_infinite_relative ;
+	tain_from_millisecs(&ttmain,tsv_g) ;
 	tain_now_g() ;
 	tain_add_g(&ttmain,&ttmain) ;
-	
+
 	int spfd = selfpipe_init() ;
 	if (spfd < 0) strerr_diefu1sys(111, "selfpipe_trap") ;
 	if (selfpipe_trap(SIGCHLD) < 0) strerr_diefu1sys(111, "selfpipe_trap") ;