diff --git a/src/lib66/parser_utils.c b/src/lib66/parser_utils.c
index ca2cd0c751159d8e282e9f75ff1d72b7a8b0049f..76224b3e42174ce2af942aac166199bd577d25fc 100644
--- a/src/lib66/parser_utils.c
+++ b/src/lib66/parser_utils.c
@@ -221,17 +221,15 @@ int key_get_range(genalloc *ga, section_t *sasection)
 				pos = 0 ;	
 				keynocheck nocheck = KEYNOCHECK_ZERO ;
 				nocheck.idsec = i ;
-				nocheck.idkey = KEY_ENVAL ;
+				nocheck.idkey = KEY_ENVIRON_ENVAL ;
 				nocheck.expected = EXPECT_KEYVAL ;
-				nocheck.mandatory = MANDATORY_OPTS ;
 				section_setsa(i,&psasection,sasection) ;
 				if (!stralloc_cats(&nocheck.val,psasection->s+1)) goto err ;//+1 remove the first '\n'
 				if (!environ_get_clean_env(&nocheck.val)) { log_warnu("parse section: ",get_key_by_enum(ENUM_SECTION,i)) ; goto err ; }
 				if (!stralloc_cats(&nocheck.val,"\n") ||
 				!stralloc_0(&nocheck.val)) goto err ;
 				nocheck.val.len-- ;
-				
-				
+
 				if (!genalloc_append(keynocheck,ga,&nocheck)) goto err ;
 			} 
 			else
@@ -260,7 +258,6 @@ int key_get_range(genalloc *ga, section_t *sasection)
 							nocheck.idsec = i ;
 							nocheck.idkey = list[i].list[j].id ;
 							nocheck.expected = list[i].list[j].expected ;
-							nocheck.mandatory = list[i].list[j].mandatory ;
 							found = 1 ;
 							switch(list[i].list[j].expected)
 							{
@@ -323,178 +320,152 @@ int key_get_range(genalloc *ga, section_t *sasection)
 		return 0 ;
 }
 
-int get_mandatory(genalloc *nocheck,int idsec,int idkey)
+int check_mandatory(sv_alltype *service, section_t *sasection)
 {
-	int count, bkey, r, countidsec ;
-	
-	key_all_t const *list = total_list ;
+	if (service->cname.description < 0)
+		log_warn_return(LOG_EXIT_ZERO,"key @description at section [start] must be set") ;
+
+	if (!service->user[0])
+		log_warn_return(LOG_EXIT_ZERO,"key @user at section [start] must be set") ;
 	
-	stralloc sa = STRALLOC_ZERO ;
+	/** just warn here about the @version field to let the time to implement
+	 * it inside all already existing service.
+	 * It will be mandatory when 66-backup will be incorporated. */
+	if (service->cname.version < 0)
+		log_warn("key @version at section [start] is missing -- it will be mandatory in the near future") ;
 	
-	r = -1 ;
-	count = 0 ;
-	bkey = -1 ;
-	countidsec = 0 ;
-
-
-	switch(list[idsec].list[idkey].mandatory){
+	if (service->opts[2] && !sasection->idx[SECTION_ENV])
+		log_warn_return(LOG_EXIT_ZERO,"options env was asked -- section environment must be set") ;
 		
-		case MANDATORY_NEED:
-			for (unsigned int j = 0;j < genalloc_len(keynocheck,nocheck);j++)
-			{
-				if (genalloc_s(keynocheck,nocheck)[j].idsec == idsec)
-				{
-					countidsec++ ;
-					if (genalloc_s(keynocheck,nocheck)[j].idkey == get_enum_by_key(*list[idsec].list[idkey].name))
-					{
-						count++ ;
-						break ;
-					}
-				}
-			}					
-			if ((!count) && (countidsec))
-				log_warn_return(LOG_EXIT_ZERO,"mandatory key: ",*list[idsec].list[idsec].name," not found on section: ",get_key_by_enum(ENUM_SECTION,idsec)) ;
-
+	switch (service->cname.itype)
+	{
+		case TYPE_BUNDLE:
+			if (service->cname.idga < 0)
+				log_warn_return(LOG_EXIT_ZERO,"bundle type detected -- key @contents must be set") ;
 			break ;
-		case MANDATORY_CUSTOM:
-			for (unsigned int j = 0;j < genalloc_len(keynocheck,nocheck);j++)
-			{
-				
-				if (genalloc_s(keynocheck,nocheck)[j].idsec == idsec)
-				{
-					countidsec++ ;
-					if (genalloc_s(keynocheck,nocheck)[j].idkey == KEY_BUILD)
-					{
-						bkey = j ;
-						
-					}
-					
-					if (genalloc_s(keynocheck,nocheck)[j].idkey == get_enum_by_key(*list[idsec].list[idkey].name))
-					{
-						count++ ;
-						break ;
-					}
-				}
-			}
-			if ((!count) && (countidsec) && bkey>=0)
+		case TYPE_ONESHOT:
+			if (service->type.oneshot.up.build < 0)
+				log_warn_return(LOG_EXIT_ZERO,"key @build at section [start] must be set") ;
+			
+			if ((service->type.oneshot.up.build == BUILD_CUSTOM) && (service->type.oneshot.up.shebang < 0))
+					log_warn_return(LOG_EXIT_ZERO,"custom build asked on section [start] -- key @shebang must be set") ;
+			
+			if (service->type.oneshot.up.exec < 0)
+					log_warn_return(LOG_EXIT_ZERO,"key @execute at section [start] must be set") ;
+
+			if (sasection->idx[SECTION_STOP])
 			{
-				if (obstr_equal(genalloc_s(keynocheck,nocheck)[bkey].val.s,get_key_by_enum(ENUM_BUILD,BUILD_CUSTOM)))
-					log_warn_return(LOG_EXIT_ZERO,"custom build asked on section: ",get_key_by_enum(ENUM_SECTION,idsec)," -- key: ",*list[idsec].list[idkey].name," must be set") ;
+				if (service->type.oneshot.down.build < 0)
+					log_warn_return(LOG_EXIT_ZERO,"key @build at section [stop] must be set") ;
+				if ((service->type.oneshot.down.build == BUILD_CUSTOM) && (service->type.oneshot.down.shebang < 0))
+					log_warn_return(LOG_EXIT_ZERO,"custom build asked on section [stop] -- key @shebang must be set") ;
+				if (service->type.oneshot.down.exec < 0)
+					log_warn_return(LOG_EXIT_ZERO,"key @execute at section [stop] must be set") ;
 			}
 			break ;
-		case MANDATORY_BUNDLE:
-			for (unsigned int j = 0;j < genalloc_len(keynocheck,nocheck);j++)
-			{
-				if (genalloc_s(keynocheck,nocheck)[j].idsec == idsec)
-				{
-					countidsec++ ;
-					if (genalloc_s(keynocheck,nocheck)[j].idkey == KEY_TYPE)
-					{
-						bkey = j;
-						
-					}
-					if (genalloc_s(keynocheck,nocheck)[j].idkey == get_enum_by_key(*list[idsec].list[idkey].name))
-					{
-						count++ ;
-					}
-				}
-			}
-			if ((!count) && (countidsec) && bkey>=0)
+		case TYPE_CLASSIC:
+		case TYPE_LONGRUN:
+			if (service->type.classic_longrun.run.build < 0)
+				log_warn_return(LOG_EXIT_ZERO,"key @build at section [start] must be set") ;
+			
+			if ((service->type.classic_longrun.run.build == BUILD_CUSTOM) && (service->type.classic_longrun.run.shebang < 0))
+					log_warn_return(LOG_EXIT_ZERO,"custom build asked on section [start] -- key @shebang must be set") ;
+			
+			if (service->type.classic_longrun.run.exec < 0)
+					log_warn_return(LOG_EXIT_ZERO,"key @execute at section [start] must be set") ;
+
+			if (sasection->idx[SECTION_STOP])
 			{
-				if (obstr_equal(genalloc_s(keynocheck,nocheck)[bkey].val.s,get_key_by_enum(ENUM_TYPE,TYPE_BUNDLE)))
-					log_warn_return(LOG_EXIT_ZERO,"bundle type detected -- key @contents must be set") ;
+				if (service->type.classic_longrun.finish.build < 0)
+					log_warn_return(LOG_EXIT_ZERO,"key @build at section [stop] must be set") ;
+				if ((service->type.classic_longrun.finish.build == BUILD_CUSTOM) && (service->type.classic_longrun.finish.shebang < 0))
+					log_warn_return(LOG_EXIT_ZERO,"custom build asked on section [stop] -- key @shebang must be set") ;
+				if (service->type.classic_longrun.finish.exec < 0)
+					log_warn_return(LOG_EXIT_ZERO,"key @execute at section [stop] must be set") ;
 			}
-			break ;
-		/** only pass through here to check if flags env was asked
-		 * and the corresponding section exist*/	
-		case MANDATORY_OPTS:
-
-			for (unsigned int j = 0;j < genalloc_len(keynocheck,nocheck);j++)
+			if (sasection->idx[SECTION_LOG])
 			{
-				
-				if (genalloc_s(keynocheck,nocheck)[j].idsec == SECTION_ENV)
-					count++ ;
-				
-				if (genalloc_s(keynocheck,nocheck)[j].idsec == SECTION_MAIN) 
+				if (service->type.classic_longrun.log.run.build < 0)
+					log_warn_return(LOG_EXIT_ZERO,"key @build at section [logger] must be set") ;
+					
+				if (service->type.classic_longrun.log.run.build == BUILD_CUSTOM) 
 				{
-					if (genalloc_s(keynocheck,nocheck)[j].idkey == KEY_OPTIONS)
-					{
-						bkey = j;						
-					}
+					if (service->type.classic_longrun.log.run.shebang < 0)
+						log_warn_return(LOG_EXIT_ZERO,"custom build asked on section [logger] -- key @shebang must be set") ;
+					if (service->type.classic_longrun.log.run.exec < 0)
+						log_warn_return(LOG_EXIT_ZERO,"custom build asked on section [logger] -- key @execute must be set") ;
+					if (service->type.classic_longrun.log.destination < 0)
+						log_warn_return(LOG_EXIT_ZERO,"custom build asked on section [logger] -- key @destination must be set") ;
 				}
-			}
-			if (bkey >= 0)
-			{
-				if (!sastr_clean_string(&sa,genalloc_s(keynocheck,nocheck)[bkey].val.s))
-					log_warnu_return(LOG_EXIT_ZERO,"clean value of: ",sa.s) ;
-
-				r = sastr_cmp(&sa,get_key_by_enum(ENUM_OPTS,OPTS_ENVIR)) ;
-				if ((r >= 0) && (!count))
-					log_warn_return(LOG_EXIT_ZERO,"options env was asked -- section environment must be set") ;
-			}
+			}	
 			break ;
+		case TYPE_MODULE:
+			/*if (!sasection->idx[SECTION_REGEX])
+				log_warn_return(LOG_EXIT_ZERO,"section [regex] must be set") ;
+			if (service->type.module.iddir < 0)
+				log_warn_return(LOG_EXIT_ZERO,"key @directories at section [regex] must be set") ;
+			if (service->type.module.idfiles < 0)
+				log_warn_return(LOG_EXIT_ZERO,"key @files at section [regex] must be set") ;
+			if (service->type.module.start_infiles < 0)
+				log_warn_return(LOG_EXIT_ZERO,"key @infiles at section [regex] must be set") ;*/
+			break ;
+		/** really nothing to do here */
 		default: break ;
 	}
-			
-	stralloc_free(&sa) ;
 	return 1 ;
 }
 
 int nocheck_toservice(keynocheck *nocheck,int svtype, sv_alltype *service)
 {
-	int  p ;
-	p = svtype ;
+	int p = svtype ;
 	int ste = 0 ;
 	
-	while (ste < 6)
+	while (ste < 7)
 	{
-	    unsigned int c = p - 0 ;
+	    unsigned int action = actions[ste][p] ;
 	    
-	    unsigned int action = actions[ste][c] ;
-	    ste = states[ste][c] ;
-
-	    switch (action) {
+	    ste = states[ste][p] ;
+		
+		  switch (action) {
 			case ACTION_COMMON:
-				if (!nocheck->idsec)
+				if (nocheck->idsec == SECTION_MAIN)
 					if (!keep_common(service,nocheck,svtype))
 						return 0 ;
-				
 				break ;
 			case ACTION_EXECRUN:
-				if (nocheck->idsec == 1)
+				if (nocheck->idsec == SECTION_START)
 					if (!keep_runfinish(&service->type.classic_longrun.run,nocheck))
 						return 0 ;
-					 
 				break ;
 			case ACTION_EXECFINISH:
-				if (nocheck->idsec == 2)
+				if (nocheck->idsec == SECTION_STOP)
 					if (!keep_runfinish(&service->type.classic_longrun.finish,nocheck))
 						return 0 ;
-				 
 				break ;
 			case ACTION_EXECLOG:
-				if (nocheck->idsec == 3)
+				if (nocheck->idsec == SECTION_LOG)
 					if (!keep_logger(&service->type.classic_longrun.log,nocheck))
 						return 0 ;
-				 
 				break ;
 			case ACTION_EXECUP:
-				if (nocheck->idsec == 1)
+				if (nocheck->idsec == SECTION_START)
 					if (!keep_runfinish(&service->type.oneshot.up,nocheck))
-						return 0 ;
-				 
+						return 0 ; 
 				break ;
 			case ACTION_EXECDOWN:
-				if (nocheck->idsec == 2)
+				if (nocheck->idsec == SECTION_STOP)
 					if (!keep_runfinish(&service->type.oneshot.down,nocheck))
 						return 0 ;
-				 
 				break ;
 			case ACTION_ENVIRON:
-				if (nocheck->idsec == 4)
-					if (!keep_common(service,nocheck,svtype))
+				if (nocheck->idsec == SECTION_ENV)
+					if (!keep_environ(service,nocheck))
+						return 0 ;
+				break ;
+			case ACTION_REGEX:
+				if (nocheck->idsec == SECTION_REGEX)
+					if (!keep_regex(&service->type.module,nocheck))
 						return 0 ;
-				
 				break ;
 			case ACTION_SKIP:
 				break ;
@@ -513,28 +484,32 @@ int keep_common(sv_alltype *service,keynocheck *nocheck,int svtype)
 	int r = 0 ;
 	size_t pos = 0, *chlen = &nocheck->val.len ;
 	char *chval = nocheck->val.s ;
-	
+
 	switch(nocheck->idkey){
-		case KEY_TYPE:
+		case KEY_MAIN_TYPE:
 			r = get_enum(chval,nocheck) ;
 			if (r == -1) return 0 ;
 			service->cname.itype = r ;
 			break ;
-		case KEY_NAME:
+		case KEY_MAIN_NAME:
 			service->cname.name = keep.len ;
 			if (!stralloc_catb(&keep,chval,*chlen + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
 			break ;
-		case KEY_DESCRIPTION:
+		case KEY_MAIN_DESCRIPTION:
 			service->cname.description = keep.len ;
 			if (!stralloc_catb(&keep,chval,*chlen + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
 			break ;
-		case KEY_OPTIONS:
+		case KEY_MAIN_VERSION:
+			service->cname.version = keep.len ;
+			if (!stralloc_catb(&keep,chval,*chlen + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+			break ;
+		case KEY_MAIN_OPTIONS:
 			if (!get_clean_val(nocheck)) return 0 ;
 			for (;pos < *chlen; pos += strlen(chval + pos)+1)
 			{
 				r = get_enum(chval + pos,nocheck) ;
 				if (r == -1) return 0 ;
-				if (svtype == TYPE_CLASSIC || svtype == TYPE_LONGRUN)
+				if (svtype != TYPE_BUNDLE || svtype != TYPE_MODULE)
 				{
 					if (r == OPTS_LOGGER)
 						service->opts[0] = 1 ;/**0 means not enabled*/
@@ -545,7 +520,7 @@ int keep_common(sv_alltype *service,keynocheck *nocheck,int svtype)
 					service->opts[2] = 1 ;
 			}
 			break ;
-		case KEY_FLAGS:
+		case KEY_MAIN_FLAGS:
 			if (!get_clean_val(nocheck)) return 0 ;
 			for (;pos < *chlen; pos += strlen(chval + pos)+1)
 			{
@@ -557,14 +532,15 @@ int keep_common(sv_alltype *service,keynocheck *nocheck,int svtype)
 					service->flags[1] = 1 ;
 			}
 			break ;
-		case KEY_USER:
+		case KEY_MAIN_USER:
 			if (!get_clean_val(nocheck)) return 0 ;
 			{
+				
 				uid_t owner = MYUID ;
 				if (!owner)
 				{
 					if (sastr_find(&nocheck->val,"root") == -1)
-						log_warnu_return(LOG_EXIT_ZERO,"use service: ",keep.s+service->cname.name," -- permission denied") ;
+						log_warnu_return(LOG_EXIT_ZERO,"use the service -- permission denied") ;
 				}
 				/** special case, we don't know which user want to use
 				 * the service, we need a general name to allow all user
@@ -572,7 +548,17 @@ int keep_common(sv_alltype *service,keynocheck *nocheck,int svtype)
 				ssize_t p = sastr_cmp(&nocheck->val,"user") ;
 				for (;pos < *chlen; pos += strlen(chval + pos)+1)
 				{
-					if (pos == (size_t)p) continue ;
+					if (pos == (size_t)p) 
+					{ 
+						struct passwd *pw = getpwuid(owner);
+						if (!pw)
+						{
+							if (!errno) errno = ESRCH ;
+							log_warnu_return(LOG_EXIT_ZERO,"get user name") ;
+						}
+						scan_uidlist(pw->pw_name,(uid_t *)service->user) ;
+						continue ; 
+					}
 					if (!scan_uidlist(chval + pos,(uid_t *)service->user))
 					{
 						parse_err(0,nocheck) ;
@@ -587,11 +573,11 @@ int keep_common(sv_alltype *service,keynocheck *nocheck,int svtype)
 						if (service->user[i] == owner) e = 1 ;
 					
 					if (!e)
-						log_warnu_return(LOG_EXIT_ZERO,"use service: ",keep.s+service->cname.name," -- permission denied") ;
+						log_warnu_return(LOG_EXIT_ZERO,"use the service -- permission denied") ;
 				}
 			}
 			break ;
-		case KEY_HIERCOPY:
+		case KEY_MAIN_HIERCOPY:
 			if (!get_clean_val(nocheck)) return 0 ;
 			{
 				unsigned int idx = 0 ;
@@ -605,9 +591,9 @@ int keep_common(sv_alltype *service,keynocheck *nocheck,int svtype)
 				}
 			}
 			break ;
-		case KEY_DEPENDS:
+		case KEY_MAIN_DEPENDS:
 			if ((service->cname.itype == TYPE_CLASSIC) || (service->cname.itype == TYPE_BUNDLE))
-				log_warn_return(LOG_EXIT_ZERO,"key: ",get_key_by_enum(ENUM_KEY,nocheck->idkey),": is not valid for type ",get_key_by_enum(ENUM_TYPE,service->cname.itype)) ;
+				log_warn_return(LOG_EXIT_ZERO,"key: ",get_key_by_enum(ENUM_KEY_SECTION_MAIN,nocheck->idkey),": is not valid for type ",get_key_by_enum(ENUM_TYPE,service->cname.itype)) ;
 				
 			if (!get_clean_val(nocheck)) return 0 ;
 			service->cname.idga = deps.len ;
@@ -619,9 +605,9 @@ int keep_common(sv_alltype *service,keynocheck *nocheck,int svtype)
 				service->cname.nga++ ;
 			}
 			break ;
-		case KEY_OPTSDEPS:
+		case KEY_MAIN_OPTSDEPS:
 			if ((service->cname.itype == TYPE_CLASSIC) || (service->cname.itype == TYPE_BUNDLE))
-				log_warn_return(LOG_EXIT_ZERO,"key: ",get_key_by_enum(ENUM_KEY,nocheck->idkey),": is not valid for type ",get_key_by_enum(ENUM_TYPE,service->cname.itype)) ;
+				log_warn_return(LOG_EXIT_ZERO,"key: ",get_key_by_enum(ENUM_KEY_SECTION_MAIN,nocheck->idkey),": is not valid for type ",get_key_by_enum(ENUM_TYPE,service->cname.itype)) ;
 			if (!get_clean_val(nocheck)) return 0 ;
 			service->cname.idopts = deps.len ;
 			for (;pos < *chlen; pos += strlen(chval + pos)+1)
@@ -632,9 +618,9 @@ int keep_common(sv_alltype *service,keynocheck *nocheck,int svtype)
 				service->cname.nopts++ ;
 			}
 			break ;
-		case KEY_EXTDEPS:
+		case KEY_MAIN_EXTDEPS:
 			if ((service->cname.itype == TYPE_CLASSIC) || (service->cname.itype == TYPE_BUNDLE))
-				log_warn_return(LOG_EXIT_ZERO,"key: ",get_key_by_enum(ENUM_KEY,nocheck->idkey),": is not valid for type ",get_key_by_enum(ENUM_TYPE,service->cname.itype)) ;
+				log_warn_return(LOG_EXIT_ZERO,"key: ",get_key_by_enum(ENUM_KEY_SECTION_MAIN,nocheck->idkey),": is not valid for type ",get_key_by_enum(ENUM_TYPE,service->cname.itype)) ;
 			if (!get_clean_val(nocheck)) return 0 ;
 			service->cname.idext = deps.len ;
 			for (;pos < *chlen; pos += strlen(chval + pos)+1)
@@ -645,9 +631,9 @@ int keep_common(sv_alltype *service,keynocheck *nocheck,int svtype)
 				service->cname.next++ ;
 			}
 			break ;
-		case KEY_CONTENTS:
+		case KEY_MAIN_CONTENTS:
 			if (service->cname.itype != TYPE_BUNDLE)
-				log_warn_return(LOG_EXIT_ZERO,"key: ",get_key_by_enum(ENUM_KEY,nocheck->idkey),": is not valid for type ",get_key_by_enum(ENUM_TYPE,service->cname.itype)) ;
+				log_warn_return(LOG_EXIT_ZERO,"key: ",get_key_by_enum(ENUM_KEY_SECTION_MAIN,nocheck->idkey),": is not valid for type ",get_key_by_enum(ENUM_TYPE,service->cname.itype)) ;
 
 			if (!get_clean_val(nocheck)) return 0 ;
 			service->cname.idga = deps.len ;
@@ -659,34 +645,26 @@ int keep_common(sv_alltype *service,keynocheck *nocheck,int svtype)
 				service->cname.nga++ ;
 			}
 			break ;
-		case KEY_T_KILL:
-		case KEY_T_FINISH:
-		case KEY_T_UP:
-		case KEY_T_DOWN:
+		case KEY_MAIN_T_KILL:
+		case KEY_MAIN_T_FINISH:
+		case KEY_MAIN_T_UP:
+		case KEY_MAIN_T_DOWN:
 			if (!get_timeout(nocheck,(uint32_t *)service->timeout)) return 0 ;
 			break ;
-		case KEY_DEATH:
+		case KEY_MAIN_DEATH:
 			if (!get_uint(nocheck,&service->death)) return 0 ;
 			break ;
-		case KEY_NOTIFY:
+		case KEY_MAIN_NOTIFY:
 			if (!get_uint(nocheck,&service->notification)) return 0 ;
 			break ;
-		case KEY_ENVAL:
-			if (!environ_clean_nline(&nocheck->val))
-				log_warnu_return(LOG_EXIT_ZERO,"clean environment value: ",chval) ;
-			
-			if (!stralloc_cats(&nocheck->val,"\n")) return 0 ;
-			if (!stralloc_copy(&service->saenv,&nocheck->val))
-				log_warnu_return(LOG_EXIT_ZERO,"store environment value: ",chval) ;
-			break ;
-		case KEY_SIGNAL:
+		case KEY_MAIN_SIGNAL:
 			if (!sig0_scan(chval,&service->signal))
 			{
 				parse_err(3,nocheck) ;
 				return 0 ;
 			}
 			break ;
-		default: log_warn_return(LOG_EXIT_ZERO,"unknown key: ",get_key_by_enum(ENUM_KEY,nocheck->idkey)) ;
+		default: log_warn_return(LOG_EXIT_ZERO,"unknown key: ",get_key_by_enum(ENUM_KEY_SECTION_MAIN,nocheck->idkey)) ;
 			
 	}
 	
@@ -698,20 +676,20 @@ int keep_runfinish(sv_exec *exec,keynocheck *nocheck)
 	int r = 0 ;
 	size_t *chlen = &nocheck->val.len ;
 	char *chval = nocheck->val.s ;
-
+	
 	switch(nocheck->idkey)
 	{
-		case KEY_BUILD:
+		case KEY_STARTSTOP_BUILD:
 			r = get_enum(chval,nocheck) ;
 			if (r == -1) return 0 ;
 			exec->build = r ;
 			break ;
-		case KEY_RUNAS:
+		case KEY_STARTSTOP_RUNAS:
 			if (!check_valid_runas(nocheck)) return 0 ;
 			exec->runas = keep.len ;
 			if (!stralloc_catb(&keep,chval,*chlen + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
 			break ;
-		case KEY_SHEBANG:
+		case KEY_STARTSTOP_SHEBANG:
 			if (chval[0] != '/')
 			{
 				parse_err(4,nocheck) ;
@@ -720,11 +698,11 @@ int keep_runfinish(sv_exec *exec,keynocheck *nocheck)
 			exec->shebang = keep.len ;
 			if (!stralloc_catb(&keep,chval,*chlen + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
 			break ;
-		case KEY_EXEC:
+		case KEY_STARTSTOP_EXEC:
 			exec->exec = keep.len ;
 			if (!stralloc_catb(&keep,chval,*chlen + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
 			break ;
-		default: log_warn_return(LOG_EXIT_ZERO,"unknown key: ",get_key_by_enum(ENUM_KEY,nocheck->idkey)) ;
+		default: log_warn_return(LOG_EXIT_ZERO,"unknown key: ",get_key_by_enum(ENUM_KEY_SECTION_STARTSTOP,nocheck->idkey)) ;
 	}
 	return 1 ;
 }
@@ -736,13 +714,13 @@ int keep_logger(sv_execlog *log,keynocheck *nocheck)
 	char *chval = nocheck->val.s ;
 
 	switch(nocheck->idkey){
-		case KEY_BUILD:
+		case KEY_LOGGER_BUILD:
 			if (!keep_runfinish(&log->run,nocheck)) return 0 ;
 			break ;
-		case KEY_RUNAS:
+		case KEY_LOGGER_RUNAS:
 			if (!keep_runfinish(&log->run,nocheck)) return 0 ;
 			break ;
-		case KEY_DEPENDS:
+		case KEY_LOGGER_DEPENDS:
 			if (!get_clean_val(nocheck)) return 0 ;
 			log->idga = deps.len ;
 			for (;pos < *chlen; pos += strlen(chval + pos) + 1)
@@ -751,17 +729,17 @@ int keep_logger(sv_execlog *log,keynocheck *nocheck)
 				log->nga++ ;
 			}
 			break ;
-		case KEY_SHEBANG:
+		case KEY_LOGGER_SHEBANG:
 			if (!keep_runfinish(&log->run,nocheck)) return 0 ;
 			break ;
-		case KEY_EXEC:
+		case KEY_LOGGER_EXEC:
 			if (!keep_runfinish(&log->run,nocheck)) return 0 ;
 			break ;
-		case KEY_T_KILL:
-		case KEY_T_FINISH:
+		case KEY_LOGGER_T_KILL:
+		case KEY_LOGGER_T_FINISH:
 			if (!get_timeout(nocheck,(uint32_t *)log->timeout)) return 0 ;
 			break ;
-		case KEY_DESTINATION:
+		case KEY_LOGGER_DESTINATION:
 			if (chval[0] != '/')
 			{
 				parse_err(4,nocheck) ;
@@ -770,18 +748,91 @@ int keep_logger(sv_execlog *log,keynocheck *nocheck)
 			log->destination = keep.len ;
 			if (!stralloc_catb(&keep,chval,*chlen + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
 			break ;
-		case KEY_BACKUP:
+		case KEY_LOGGER_BACKUP:
 			if (!get_uint(nocheck,&log->backup)) return 0 ;
 			break ;
-		case KEY_MAXSIZE:
+		case KEY_LOGGER_MAXSIZE:
 			if (!get_uint(nocheck,&log->maxsize)) return 0 ;
 			break ;
-		case KEY_TIMESTP:
+		case KEY_LOGGER_TIMESTP:
 			r = get_enum(chval,nocheck) ;
 			if (r == -1) return 0 ;
 			log->timestamp = r ;
 			break ;
-		default: log_warn_return(LOG_EXIT_ZERO,"unknown key: ",get_key_by_enum(ENUM_KEY,nocheck->idkey)) ;
+		default: log_warn_return(LOG_EXIT_ZERO,"unknown key: ",get_key_by_enum(ENUM_KEY_SECTION_LOGGER,nocheck->idkey)) ;
+	}
+	return 1 ;
+}
+
+int keep_environ(sv_alltype *service,keynocheck *nocheck)
+{
+	char *chval = nocheck->val.s ;
+	
+	switch(nocheck->idkey){
+		case KEY_ENVIRON_ENVAL:
+			if (!environ_clean_nline(&nocheck->val))
+				log_warnu_return(LOG_EXIT_ZERO,"clean environment value: ",chval) ;
+			
+			if (!stralloc_cats(&nocheck->val,"\n")) return 0 ;
+			if (!stralloc_copy(&service->saenv,&nocheck->val))
+				log_warnu_return(LOG_EXIT_ZERO,"store environment value: ",chval) ;
+			break ;
+		default: log_warn_return(LOG_EXIT_ZERO,"unknown key: ",get_key_by_enum(ENUM_KEY_SECTION_ENVIRON,nocheck->idkey)) ;
+	}
+	return 1 ;
+}
+
+int keep_regex(sv_module *module,keynocheck *nocheck)
+{
+	size_t pos = 0, *chlen = &nocheck->val.len ;
+	char *chval = nocheck->val.s ;
+	
+	switch(nocheck->idkey){
+		case KEY_REGEX_CONFIGURE:
+			module->configure = keep.len ;
+			if (!stralloc_catb(&keep,chval,*chlen + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+			break ;
+		case KEY_REGEX_DIRECTORIES:
+			if (!get_clean_val(nocheck)) return 0 ;
+			module->iddir = keep.len ;
+			for (;pos < *chlen; pos += strlen(chval + pos) + 1)
+			{
+				/* allow to comment a service */
+				if (chval[pos] == '#') continue ;
+				if (!stralloc_catb(&keep,chval + pos,strlen(chval + pos) + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+				module->ndir++ ;
+			}
+			break ;
+		case KEY_REGEX_FILES:
+			if (!get_clean_val(nocheck)) return 0 ;
+			module->idfiles = keep.len ;
+			for (;pos < *chlen; pos += strlen(chval + pos) + 1)
+			{
+				/* allow to comment a service */
+				if (chval[pos] == '#') continue ;
+				if (!stralloc_catb(&keep,chval + pos,strlen(chval + pos) + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+				module->nfiles++ ;
+			}
+			break ;
+		case KEY_REGEX_INFILES:
+			if (!environ_get_clean_env(&nocheck->val))
+				log_warnu_return(LOG_EXIT_ZERO,"clean key ",get_key_by_enum(ENUM_KEY_SECTION_REGEX,nocheck->idkey)," field") ;
+			if (!environ_clean_nline(&nocheck->val))
+				log_warnu_return(LOG_EXIT_ZERO,"clean lines of key ",get_key_by_enum(ENUM_KEY_SECTION_REGEX,nocheck->idkey)," field") ;
+			if (!stralloc_0(&nocheck->val))
+				log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;	
+	
+			if (!sastr_split_string_in_nline(&nocheck->val))
+				log_warnu_return(LOG_EXIT_SYS,"split lines of key ",get_key_by_enum(ENUM_KEY_SECTION_REGEX,nocheck->idkey)," field") ;
+			
+			module->start_infiles = keep.len ;
+			for (;pos < *chlen; pos += strlen(chval + pos) + 1)
+				if (!stralloc_catb(&keep,chval + pos,strlen(chval + pos) + 1)) 
+					log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+				
+			module->end_infiles = keep.len ;
+			break ;
+		default: log_warn_return(LOG_EXIT_ZERO,"unknown key: ",get_key_by_enum(ENUM_KEY_SECTION_REGEX,nocheck->idkey)) ;
 	}
 	return 1 ;
 }
@@ -801,7 +852,7 @@ int read_svfile(stralloc *sasv,char const *name,char const *src)
 	memcpy(svtmp + srclen + 1, name, namelen) ;
 	svtmp[srclen + 1 + namelen] = 0 ;
 	
-	log_trace("Read service file of : ",name," from: ",src) ;
+	log_trace("Read service file of: ",src,name) ;
 	
 	size_t filesize=file_get_size(svtmp) ;
 	if (!filesize)
@@ -880,6 +931,7 @@ void section_setsa(int id, stralloc_ref *p,section_t *sa)
 		case SECTION_STOP: *p = &sa->stop ; break ;
 		case SECTION_LOG: *p = &sa->logger ; break ;
 		case SECTION_ENV: *p = &sa->environment ; break ;
+		case SECTION_REGEX: *p = &sa->regex ; break ;
 		default: break ;
 	}
 }
@@ -979,10 +1031,10 @@ int get_enum(char const *str, keynocheck *ch)
 int get_timeout(keynocheck *ch,uint32_t *ui)
 {
 	int time = 0 ;
-	if (ch->idkey == KEY_T_KILL) time = 0 ;
-	else if (ch->idkey == KEY_T_FINISH) time = 1 ;
-	else if (ch->idkey == KEY_T_UP) time = 2 ;
-	else if (ch->idkey == KEY_T_DOWN) time = 3 ;
+	if ((ch->idkey == KEY_MAIN_T_KILL) || (ch->idkey == KEY_LOGGER_T_KILL)) time = 0 ;
+	else if ((ch->idkey == KEY_MAIN_T_FINISH) || (ch->idkey == KEY_LOGGER_T_FINISH)) time = 1 ;
+	else if (ch->idkey == KEY_MAIN_T_UP) time = 2 ;
+	else if (ch->idkey == KEY_MAIN_T_DOWN) time = 3 ;
 	if (scan_timeout(ch->val.s,ui,time) == -1)
 	{
 		parse_err(3,ch) ;
@@ -1018,7 +1070,10 @@ void parse_err(int ierr,keynocheck *check)
 	int idsec = check->idsec ;
 	int idkey = check->idkey ;
 	char const *section = get_key_by_enum(ENUM_SECTION,idsec) ;
-	char const *key = get_key_by_enum(ENUM_KEY,idkey) ;
+	/* start stop enum are the same, enum_all must increase by one to match
+	 * the correct list */
+	char const *key = get_key_by_enum(idsec < 2 ? idsec + 1 : idsec,idkey) ;
+	
 	switch(ierr)
 	{
 		case 0: 
@@ -1056,3 +1111,23 @@ void parse_err(int ierr,keynocheck *check)
 			break ;
 	}
 }
+
+int get_svtype(sv_alltype *sv_before, char const *contents)
+{
+	stralloc sa = STRALLOC_ZERO ;
+
+	if (!auto_stra(&sa,contents)) goto err ;
+
+	if (!environ_get_val_of_key(&sa,get_key_by_enum(ENUM_KEY_SECTION_MAIN,KEY_MAIN_TYPE))) goto err ;
+
+	if (!sastr_clean_element(&sa)) goto err ;
+	sv_before->cname.itype = get_enum_by_key(sa.s) ;
+
+	if (sv_before->cname.itype == -1) goto err ;
+
+	stralloc_free(&sa) ;
+	return 1 ;
+	err:
+		stralloc_free(&sa) ;
+		return 0 ;
+}