diff --git a/src/lib66/resolve.c b/src/lib66/resolve.c
index aae4aca3bee2b348e30f880884351458bff6ea94..a575a752ae59e3be95325ddbdd39c85e533a0da9 100644
--- a/src/lib66/resolve.c
+++ b/src/lib66/resolve.c
@@ -35,6 +35,7 @@
 #include <66/parser.h>//resolve need to find stralloc keep
 #include <66/resolve.h>
 #include <66/ssexec.h>
+#include <66/graph.h>
 
 #include <s6/s6-supervise.h>
 #include <stdio.h>
@@ -126,9 +127,7 @@ int ss_resolve_pointo(stralloc *sa,ssexec_t *info,unsigned int type, unsigned in
 	if (where == SS_RESOLVE_LIVE)
 	{
 		if (!stralloc_catb(&tmp,info->live.s,info->live.len - 1) ||
-		!stralloc_cats(&tmp,SS_RESOLVE) ||
-		!stralloc_cats(&tmp,"/") ||
-		!stralloc_cats(&tmp,ownerstr) ||
+		!stralloc_cats(&tmp,SS_STATE) ||
 		!stralloc_cats(&tmp,"/") ||
 		!stralloc_cats(&tmp,info->treename.s)) goto err ;
 	}
@@ -353,6 +352,7 @@ int ss_resolve_pack(stralloc *sa, ss_resolve_t *res)
 	!ss_resolve_add_uint32(sa,res->runat) ||
 	!ss_resolve_add_uint32(sa,res->tree) ||
 	!ss_resolve_add_uint32(sa,res->treename) ||
+	!ss_resolve_add_uint32(sa,res->resolve) ||
 	!ss_resolve_add_uint32(sa,res->exec_run) ||
 	!ss_resolve_add_uint32(sa,res->exec_finish) ||
 	!ss_resolve_add_uint32(sa,res->type) ||
@@ -368,10 +368,11 @@ int ss_resolve_pack(stralloc *sa, ss_resolve_t *res)
 	return 1 ;
 }
 
-int ss_resolve_write(ss_resolve_t *res, char const *dst, char const *name)
+int ss_resolve_write(ss_resolve_t *res, char const *dst, char const *name,int both)
 {
 	
 	stralloc sa = STRALLOC_ZERO ;
+	stralloc sasrc = STRALLOC_ZERO ;
 	
 	size_t dstlen = strlen(dst) ;
 	size_t namelen = strlen(name) ;
@@ -384,17 +385,26 @@ int ss_resolve_write(ss_resolve_t *res, char const *dst, char const *name)
 	tmp[dstlen + SS_RESOLVE_LEN + 1 + namelen] = 0 ;
 	
 	if (!ss_resolve_pack(&sa,res)) goto err ;
-	if (dir_search(tmp,sa.s,S_IFREG))
+	if (!openwritenclose_unsafe(tmp,sa.s,sa.len)) goto err ;
+	if (both)
 	{
-		if (!ss_resolve_rmfile(res,dst,name)) goto err ;
+		/** write in src */
+		if (!stralloc_cats(&sasrc,res->sa.s + res->tree)) goto err ;
+		if (!stralloc_cats(&sasrc,SS_SVDIRS)) goto err ;
+		if (!stralloc_cats(&sasrc,SS_RESOLVE)) goto err ;
+		if (!stralloc_cats(&sasrc,"/")) goto err ;
+		if (!stralloc_cats(&sasrc,name)) goto err ;
+		if (!stralloc_0(&sasrc)) goto err ;
+		if (!openwritenclose_unsafe(sasrc.s,sa.s,sa.len)) goto err ;
 	}
-	if (!openwritenclose_unsafe(tmp,sa.s,sa.len)) goto err ;
-
+	
 	stralloc_free(&sa) ;
+	stralloc_free(&sasrc) ;
 	return 1 ;
 	
 	err:
 		stralloc_free(&sa) ;
+		stralloc_free(&sasrc) ;
 		return 0 ;
 }
 
@@ -445,6 +455,8 @@ int ss_resolve_read(ss_resolve_t *res, char const *src, char const *name)
 	global += 4 ;
 	uint32_unpack_big(sa.s + global,&res->treename) ;
 	global += 4 ;
+	uint32_unpack_big(sa.s + global,&res->resolve) ;
+	global += 4 ;
 	uint32_unpack_big(sa.s + global,&res->exec_run) ;
 	global += 4 ;
 	uint32_unpack_big(sa.s + global,&res->exec_finish) ;
@@ -543,6 +555,7 @@ int ss_resolve_setlognwrite(ss_resolve_t *sv, char const *dst)
 	//res.deps = ss_resolve_add_string(&res,string + sv->name) ;
 	res.tree = ss_resolve_add_string(&res,string + sv->tree) ;
 	res.treename = ss_resolve_add_string(&res,string + sv->treename) ;
+	res.resolve = ss_resolve_add_string(&res,string + sv->resolve) ;
 	//res.ndeps = 1 ;
 	res.type = sv->type ;
 	ss_resolve_setflag(&res,SS_FLAGS_RELOAD,sv->reload) ;
@@ -569,7 +582,7 @@ int ss_resolve_setlognwrite(ss_resolve_t *sv, char const *dst)
 		ss_resolve_setflag(&res,SS_FLAGS_PID,(uint32_t)status.pid) ;
 	}
 	
-	if (!ss_resolve_write(&res,dst,res.sa.s + res.name))
+	if (!ss_resolve_write(&res,dst,res.sa.s + res.name,SS_SIMPLE))
 	{
 		strerr_warnwu5sys("write resolve file: ",dst,SS_RESOLVE,"/",res.sa.s + res.name) ;
 		goto err ;
@@ -590,6 +603,14 @@ int ss_resolve_setnwrite(ss_resolve_t *res, sv_alltype *services, ssexec_t *info
 	char logreal[namelen + SS_LOG_SUFFIX_LEN + 1] ;
 	char stmp[info->livetree.len + 1 + info->treename.len + SS_SVDIRS_LEN + 1 + namelen + SS_LOG_SUFFIX_LEN + 1] ;
 	
+	size_t livelen = info->live.len - 1 ; 
+	char resolve[livelen + SS_STATE_LEN + 1 + info->treename.len + 1] ;
+	memcpy(resolve,info->live.s,livelen) ;
+	memcpy(resolve + livelen, SS_STATE,SS_STATE_LEN) ;
+	resolve[livelen+ SS_STATE_LEN] = '/' ;
+	memcpy(resolve + livelen + SS_STATE_LEN + 1,info->treename.s,info->treename.len) ;
+	resolve[livelen + SS_STATE_LEN + 1 + info->treename.len] = 0 ;
+	
 	s6_svstatus_t status = S6_SVSTATUS_ZERO ;
 	
 		
@@ -602,6 +623,7 @@ int ss_resolve_setnwrite(ss_resolve_t *res, sv_alltype *services, ssexec_t *info
 	res->tree = ss_resolve_add_string(res,info->tree.s) ;
 	res->treename = ss_resolve_add_string(res,info->treename.s) ;
 	res->live = ss_resolve_add_string(res,info->live.s) ;
+	res->resolve = ss_resolve_add_string(res,resolve) ;
 	res->src = ss_resolve_add_string(res,keep.s + services->src) ;
 	if (services->type.classic_longrun.run.exec)
 		res->exec_run = ss_resolve_add_string(res,keep.s + services->type.classic_longrun.run.exec) ;
@@ -755,7 +777,7 @@ int ss_resolve_setnwrite(ss_resolve_t *res, sv_alltype *services, ssexec_t *info
 		if (!ss_resolve_setlognwrite(res,dst)) goto err ;
 	}
 	
-	if (!ss_resolve_write(res,dst,res->sa.s + res->name))
+	if (!ss_resolve_write(res,dst,res->sa.s + res->name,SS_SIMPLE))
 	{
 		strerr_warnwu5sys("write resolve file: ",dst,SS_RESOLVE,"/",res->sa.s + res->name) ;
 		goto err ;
@@ -790,7 +812,7 @@ int ss_resolve_addlogger(ssexec_t *info,genalloc *ga)
 	stralloc tmp = STRALLOC_ZERO ;
 	genalloc gatmp = GENALLOC_ZERO ;
 
-	if (!ss_resolve_pointo(&tmp,info,SS_NOTYPE,SS_RESOLVE_SRC))		
+	if (!ss_resolve_pointo(&tmp,info,SS_NOTYPE,SS_RESOLVE_LIVE))		
 		goto err ;
 	
 	for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,ga) ; i++) 
@@ -823,7 +845,7 @@ int ss_resolve_addlogger(ssexec_t *info,genalloc *ga)
 		stralloc_free(&tmp) ;
 		return 0 ;
 }
-
+	
 void ss_resolve_setflag(ss_resolve_t *res,int flags,int flags_val)
 {
 	switch (flags)
@@ -839,7 +861,7 @@ void ss_resolve_setflag(ss_resolve_t *res,int flags,int flags_val)
 	}
 }
 
-int ss_resolve_deps(genalloc *tokeep,ss_resolve_t *res, ssexec_t *info)
+int ss_resolve_add_deps(genalloc *tokeep,ss_resolve_t *res, ssexec_t *info)
 {
 	unsigned int i = 0 ;
 	genalloc tmp = GENALLOC_ZERO ;
@@ -852,7 +874,7 @@ int ss_resolve_deps(genalloc *tokeep,ss_resolve_t *res, ssexec_t *info)
 	char *name = res->sa.s + res->name ;
 	char *deps = res->sa.s + res->deps ;
 	if (!ss_resolve_cmp(tokeep,name))
-		if (!genalloc_append(ss_resolve_t,tokeep,res)) return 0 ;
+		if (!genalloc_append(ss_resolve_t,tokeep,res)) goto err ;
 	
 	if (res->ndeps)
 	{
@@ -861,48 +883,57 @@ int ss_resolve_deps(genalloc *tokeep,ss_resolve_t *res, ssexec_t *info)
 		{
 			
 			ss_resolve_t dres = RESOLVE_ZERO ;
-			if (!ss_resolve_check(info,gaistr(&tmp,i),SS_RESOLVE_SRC)) return 0 ;
-			if (!ss_resolve_read(&dres,src,gaistr(&tmp,i))) return 0 ;
-			if (dres.ndeps) ss_resolve_deps(tokeep,&dres,info) ;
+			if (!ss_resolve_check(info,gaistr(&tmp,i),SS_RESOLVE_LIVE)) goto err ;
+			if (!ss_resolve_read(&dres,src,gaistr(&tmp,i))) goto err ;
+			if (dres.ndeps) ss_resolve_add_deps(tokeep,&dres,info) ;
 			
 			if (!ss_resolve_cmp(tokeep,gaistr(&tmp,i)))
-				if (!genalloc_append(ss_resolve_t,tokeep,&dres)) return 0 ;
+				if (!genalloc_append(ss_resolve_t,tokeep,&dres)) goto err ;
 		}
 	}
 	genalloc_deepfree(stralist,&tmp,stra_free) ;
 	return 1 ;
+	err:
+		genalloc_deepfree(stralist,&tmp,stra_free) ;
+		return 0 ;
 }
 
-int ss_resolve_rdeps(genalloc *tokeep,genalloc *nsv, ss_resolve_t *res,ssexec_t *info)
+int ss_resolve_add_rdeps(genalloc *tokeep, ss_resolve_t *res,ssexec_t *info)
 {
 	genalloc tmp = GENALLOC_ZERO ;
+	genalloc nsv = GENALLOC_ZERO ;
+	int type ;
 	char *name = res->sa.s + res->name ;
 	size_t srclen = strlen(res->sa.s + res->tree) ;
 	char src[srclen + SS_SVDIRS_LEN + 1] ;
 	memcpy(src,res->sa.s + res->tree,srclen) ;
 	memcpy(src + srclen, SS_SVDIRS,SS_SVDIRS_LEN) ;
 	src[srclen + SS_SVDIRS_LEN] = 0 ;
+	if (res->type == CLASSIC) type = 0 ;
+	else type = 1 ;
+	if (!graph_type_src(&nsv,src,type)) goto err ; 
 	if (!ss_resolve_cmp(tokeep,name))
-		if (!genalloc_append(ss_resolve_t,tokeep,res)) return 0 ;
-		
-	for (unsigned int i = 0 ; i < genalloc_len(stralist,nsv) ; i++)
+		if (!genalloc_append(ss_resolve_t,tokeep,res)) goto err ;
+	
+	for (unsigned int i = 0 ; i < genalloc_len(stralist,&nsv) ; i++)
 	{
 		genalloc_deepfree(stralist,&tmp,stra_free) ;
 		ss_resolve_t dres = RESOLVE_ZERO ;
-		char *dname = gaistr(nsv,i) ;
+		char *dname = gaistr(&nsv,i) ;
 		if (obstr_equal(name,dname)) continue ;
-		if (!ss_resolve_check(info,dname,SS_RESOLVE_SRC)) return 0 ;
-		if (!ss_resolve_read(&dres,src,gaistr(nsv,i))) return 0 ;
-		if (dres.ndeps || (dres.type == BUNDLE && dres.ndeps))
+		if (!ss_resolve_check(info,dname,SS_RESOLVE_LIVE)) goto err ;
+		if (!ss_resolve_read(&dres,src,gaistr(&nsv,i))) goto err ;
+		if (dres.ndeps || (dres.type == BUNDLE && dres.ndeps) || (res->type == BUNDLE && res->ndeps))
 		{
-			if (!clean_val(&tmp,dres.sa.s + dres.deps)) return 0 ;
+			if (!clean_val(&tmp,dres.sa.s + dres.deps)) goto err ;
 			for (unsigned int j = 0 ; j < genalloc_len(stralist,&tmp) ; j++)
 			{
-				if (obstr_equal(name,gaistr(&tmp,j)))
+				if (obstr_equal(name,gaistr(&tmp,j)) || res->type == BUNDLE)
 				{
 					if (!ss_resolve_cmp(tokeep,dname))
 					{
-						if (!genalloc_append(ss_resolve_t,tokeep,&dres)) return 0 ;
+						if (!genalloc_append(ss_resolve_t,tokeep,&dres)) goto err ;
+						if (!ss_resolve_add_rdeps(tokeep,&dres,info)) goto err ;
 						break ;
 					}
 				}
@@ -911,4 +942,7 @@ int ss_resolve_rdeps(genalloc *tokeep,genalloc *nsv, ss_resolve_t *res,ssexec_t
 	}
 	genalloc_deepfree(stralist,&tmp,stra_free) ;
 	return 1 ;
+	err:
+		genalloc_deepfree(stralist,&tmp,stra_free) ;
+		return 0 ;
 }