diff --git a/src/main/java/org/etsi/osl/osom/lcm/LCMRulesExecutorVariables.java b/src/main/java/org/etsi/osl/osom/lcm/LCMRulesExecutorVariables.java
index 198e5b3f1b86c237597c1225990d79515da75029..312490ca7788de280a8e6981a347bf39b050b6af 100644
--- a/src/main/java/org/etsi/osl/osom/lcm/LCMRulesExecutorVariables.java
+++ b/src/main/java/org/etsi/osl/osom/lcm/LCMRulesExecutorVariables.java
@@ -28,7 +28,7 @@ public class LCMRulesExecutorVariables {
 	private Service service;
 	private List<String> compileDiagnosticErrors;
 	private ServiceOrderManager serviceOrderManager;
-	private Map<String, String> outParams;
+	private Map<String, Map<String, String> > outParams;
 
 	/**
 	 * @param spec
@@ -50,6 +50,7 @@ public class LCMRulesExecutorVariables {
 		this.service = serviceInstance;
 		this.serviceOrderManager = aServiceOrderManager;
 		this.compileDiagnosticErrors = new ArrayList<>();
-		this.outParams = new HashMap<String,String>();
+		
+		this.outParams = new HashMap<>();
 	}
 }
diff --git a/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java b/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java
index c7e3bc81ab4a1083ac49f10e05e262918c31d2c9..c851b5d9a005afb40f51e1b51fc4afa38135e7c2 100644
--- a/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java
+++ b/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java
@@ -938,7 +938,7 @@ public abstract class LcmBaseExecutor {
 	
 
   //createServiceRefIf("Bundle B", getServiceRefPropValue("BundleA", "state", "").equals("active")==true);
-	public boolean createServiceRefIf(String serviceName, boolean b) {
+	public boolean createServiceRefIf(String serviceName, boolean b, HashMap<String, String> charvals) {
 
 		logger.debug( String.format("createServiceRefwhen serviceName=%s = %s", serviceName, b ) );
 		
@@ -952,7 +952,8 @@ public abstract class LcmBaseExecutor {
 		
 		
 		if (serviceIDToCheckDependcy != null) {		
-			this.vars.getOutParams().put( serviceIDToCheckDependcy, Boolean.toString(b) );
+		  charvals.put("_CREATESERVICEREF_", Boolean.toString(b));
+		  this.vars.getOutParams().put( serviceIDToCheckDependcy, charvals );
 		}
 		
 		return false;
diff --git a/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java b/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java
index f6a8955533feda277f9f2c7468f81dd47fceb9ec..5e6270d5449de0665ac8112fea0055f9ffe99504 100644
--- a/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java
+++ b/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java
@@ -3,7 +3,9 @@ package org.etsi.osl.osom.management;
 import java.time.OffsetDateTime;
 import java.time.ZoneOffset;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.etsi.osl.osom.lcm.LCMRulesController;
@@ -96,9 +98,16 @@ public class CreateReservedService implements JavaDelegate {
 		logger.debug("Retrieved Service ID:" + spec.getId());
 		logger.debug("Retrieved Service Name:" + spec.getName());
 		
+	      //this map contains as key the id of the serviceSpecs to be created
+        //and as value a Map of initial characteristics and their values
+        Map<String, Map<String,String>> tobeCreatedInitialCharValues = new HashMap<>();
+        
+        if ( execution.getVariable("serviceSpecsToCreateInitialCharValues") != null ) {
+          tobeCreatedInitialCharValues = (Map<String, Map<String, String>>) execution.getVariable("serviceSpecsToCreateInitialCharValues");
+        }
 		
 		//this is a main underlying service for the requested service (restriction)					
-		Service createdUnderlService = addServicesToVariables( spec, sor, soi,  parentService );
+		Service createdUnderlService = addServicesToVariables( spec, sor, soi,  parentService, tobeCreatedInitialCharValues );
 		
 		soi.getService().setState( ServiceStateType.RESERVED );
 		soi.setState(ServiceOrderStateType.INPROGRESS);
@@ -145,11 +154,12 @@ public class CreateReservedService implements JavaDelegate {
 	 * @param servicesHandledByNFVOAutomated
 	 * @param servicesLocallyAutomated
 	 * @param parentService 
+	 * @param tobeCreatedInitialCharValues 
 	 * @return 
 	 */
 	private Service addServicesToVariables(ServiceSpecification specrel, 
 			ServiceOrder sor, ServiceOrderItem soi, 
-			Service parentService) {
+			Service parentService, Map<String, Map<String, String>> tobeCreatedInitialCharValues) {
 		
 		logger.debug("\tService spec name :" + specrel.getName());
 		logger.debug("\tService spec type :" + specrel.getType());
@@ -159,23 +169,23 @@ public class CreateReservedService implements JavaDelegate {
 		
 		
 		if ( partnerOrg != null  ) {
-			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, partnerOrg, parentService);
+			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, partnerOrg, parentService, tobeCreatedInitialCharValues);
 		}	
 		else if (specrel.getType().equals("ResourceFacingServiceSpecification")) {
-			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService);
+			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService, tobeCreatedInitialCharValues);
 			
 		} else if ( specrel.getType().equals("CustomerFacingServiceSpecification") && (specrel.isIsBundle()!=null) && specrel.isIsBundle() ) {
-			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService);			
+			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService, tobeCreatedInitialCharValues);			
 			
 		} else if ( specrel.getType().equals("CustomerFacingServiceSpecification") && (specrel.findSpecCharacteristicByName("OSAUTOMATED") != null )  ) {
-			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService);			
+			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService, tobeCreatedInitialCharValues);			
 			
 		} else if ( specrel.getType().equals("CustomerFacingServiceSpecification") && (specrel.findSpecCharacteristicByName("testSpecRef") != null )  ) {
-			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService);			
+			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService, tobeCreatedInitialCharValues);			
 			
 		}	
 		else {
-			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.MANUALLY_BY_SERVICE_PROVIDER, null, parentService);			
+			createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.MANUALLY_BY_SERVICE_PROVIDER, null, parentService, tobeCreatedInitialCharValues);			
 		}		
 		
 		//add now the serviceRef
@@ -226,16 +236,20 @@ public class CreateReservedService implements JavaDelegate {
 		
 	}
 	
-	
+
 	/**
 	 * @param sor
-	 * @param soi 
+	 * @param soi
 	 * @param spec
-	 * @return 
+	 * @param startMode
+	 * @param partnerOrg
+	 * @param parentService
+	 * @param tobeCreatedInitialCharValues
+	 * @return
 	 */
 	private Service createServiceByServiceSpec(ServiceOrder sor, ServiceOrderItem soi,
 			ServiceSpecification spec, EServiceStartMode startMode, 
-			RelatedParty partnerOrg, Service parentService) {
+			RelatedParty partnerOrg, Service parentService, Map<String, Map<String, String>> tobeCreatedInitialCharValues) {
 
 		ServiceCreate serviceToCreate = new ServiceCreate();
 		String servicename = spec.getName();
@@ -282,15 +296,33 @@ public class CreateReservedService implements JavaDelegate {
 			}			
 		}
 		
+	    //this map contains as key the id of the serviceSpecs to be created
+        //and as value a Map of initial characteristics and their values
+		Map<String, String> initCharValues = tobeCreatedInitialCharValues.get( spec.getId() );
+		
 		//we need to be careful here with the bundle and the related Service Specs, to properly propagate the rules inside
 		//first copy into the newly created service any characteristic values from the order
 		for (ServiceSpecCharacteristic c : spec.getServiceSpecCharacteristic()) {
 			
 			boolean characteristicFound = false;
+			
+			//pass any initial value. This has high priority
+			if ( initCharValues != null ) {
+			  if ( initCharValues.get( c.getName() ) != null ) {
+			    Characteristic orderCharacteristic = new Characteristic()
+			        .value( new Any( initCharValues.get( c.getName() ), initCharValues.get( c.getName() ))) ;
+                serviceToCreate.addServiceCharacteristicItem( helperCreateCharacteristicItem(c, orderCharacteristic ) );
+                characteristicFound = true;
+                break;
+			    
+			  }
+			}
+			
+			
 			for (Characteristic orderCharacteristic : soi.getService().getServiceCharacteristic()) {
 				String specCharacteristicToSearch = spec.getName() + "::" +c.getName();
 				 if ( orderCharacteristic.getName().equals( specCharacteristicToSearch )) { //copy only characteristics that are related from the order
-					serviceToCreate.addServiceCharacteristicItem( addServiceCharacteristicItem(c, orderCharacteristic) );
+					serviceToCreate.addServiceCharacteristicItem( helperCreateCharacteristicItem(c, orderCharacteristic) );
 					characteristicFound = true;
 					break;
 				}
@@ -301,7 +333,7 @@ public class CreateReservedService implements JavaDelegate {
 					String specCharacteristicToSearch = c.getName();
 					 if ( orderCharacteristic.getName().equals( specCharacteristicToSearch )) { //copy only characteristics that are related from the order							 
 						
-						serviceToCreate.addServiceCharacteristicItem( addServiceCharacteristicItem(c, orderCharacteristic) );
+						serviceToCreate.addServiceCharacteristicItem( helperCreateCharacteristicItem(c, orderCharacteristic) );
 						characteristicFound = true;
 						break;
 					}
@@ -309,6 +341,8 @@ public class CreateReservedService implements JavaDelegate {
 				
 			}
 			
+			
+			
 		}	
 		
 		if ( serviceToCreate.getServiceCharacteristic() == null ) {
@@ -383,7 +417,7 @@ public class CreateReservedService implements JavaDelegate {
 		return null;
 	}
 	
-	private Characteristic addServiceCharacteristicItem(ServiceSpecCharacteristic c, Characteristic orderCharacteristic) {
+	private Characteristic helperCreateCharacteristicItem(ServiceSpecCharacteristic c, Characteristic orderCharacteristic) {
 		Characteristic serviceCharacteristicItem =  new Characteristic();
 		serviceCharacteristicItem.setName( c.getName() );
 		serviceCharacteristicItem.setValueType( c.getValueType() );
diff --git a/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java b/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java
index 872cf39e394606e3455aa4b8142c26cbbd29d082..f5be29265506e746c714135b6949c69665249f95 100644
--- a/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java
+++ b/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java
@@ -48,6 +48,9 @@ public class ProcessCreateServiceRules implements JavaDelegate {
 		execution.setVariable("allSupportingServicesCreated", allSupportingServicesCreated ); //by default
 		
 
+
+        
+        
 		Service contextService = null;
 		String contextServiceId = (String) execution.getVariable("contextServiceId"); 
 		if ( contextServiceId != null ) {
@@ -69,29 +72,18 @@ public class ProcessCreateServiceRules implements JavaDelegate {
 		 * first find all referenced ServiceSpecs of a ServiceSpec to be created
 		 */
 		boolean foundCreatedButNOTACTIVEServices = false;
-		Map<String, Boolean> tobeCreated = new HashMap<>();
+		
+		//this map contains as key the id of the serviceSpecs to be created
+		//and as value a Map of initial characteristics and their values
+		Map<String, Map<String,String>> tobeCreated = new HashMap<>();
+		
 		for (ServiceSpecRelationship specRels : spec.getServiceSpecRelationship()) {
 			logger.debug("\tService specRelsId:" + specRels.getId());
-			tobeCreated.put(specRels.getId(), true);
+			tobeCreated.put(specRels.getId(), null);
 		}
 		
 		
-		for ( ServiceRef serviceRef: contextService.getSupportingService()  ) {
-			
-			Service theServiceReferenced = serviceOrderManager.retrieveService( serviceRef.getId() );
-			
-			if ( tobeCreated.get(theServiceReferenced.getServiceSpecificationRef().getId() ) != null ) {	
-				tobeCreated.put( theServiceReferenced.getServiceSpecificationRef().getId(), false);
-			}
-			
 
-			if ( theServiceReferenced != null ) {
-				if ( theServiceReferenced.getState().equals( ServiceStateType.RESERVED) ) {
-					foundCreatedButNOTACTIVEServices = true;
-				}
-			}
-			
-		}
 		
 		
 		/**
@@ -123,20 +115,45 @@ public class ProcessCreateServiceRules implements JavaDelegate {
 
 		for (String serviceId : vars.getOutParams().keySet()) {
 			if (  vars.getOutParams().get(serviceId) !=null) {
-				if (  vars.getOutParams().get(serviceId).equals( "true")  ) {	
-					tobeCreated.put( serviceId, true && tobeCreated.get(serviceId) );				
-				} else {
-					tobeCreated.put( serviceId, false);
-					allSupportingServicesCreated = false;	
-				}				
+			  
+
+			  if (  vars.getOutParams().get(serviceId) != null && vars.getOutParams().get(serviceId).get("_CREATESERVICEREF_") !=null) {
+                
+                if (  vars.getOutParams().get(serviceId).get("_CREATESERVICEREF_").equals( "true")  ) {   
+                  vars.getOutParams().get(serviceId).remove( "_CREATESERVICEREF_" );
+                  HashMap<String, String> myChars = new HashMap< String , String >( vars.getOutParams().get(serviceId) );
+                  tobeCreated.put( serviceId, myChars  );               
+                } else {
+                    tobeCreated.remove( serviceId);
+                    allSupportingServicesCreated = false;   
+                }
+              }
+			  
 			}
 		}
+		
+		
+		//now compare those to be created, with those already created
+        for ( ServiceRef serviceRef: contextService.getSupportingService()  ) {            
+            Service theServiceReferenced = serviceOrderManager.retrieveService( serviceRef.getId() );            
+            if ( tobeCreated.containsKey(theServiceReferenced.getServiceSpecificationRef().getId() )  ) {               
+                tobeCreated.remove( theServiceReferenced.getServiceSpecificationRef().getId());
+            }           
+
+            if ( theServiceReferenced != null ) {
+                if ( theServiceReferenced.getState().equals( ServiceStateType.RESERVED) ) {
+                    foundCreatedButNOTACTIVEServices = true;
+                }
+            }
+            
+        }
+      
 
 		serviceOrderManager.updateService( contextService.getId() , supd, false); //update context service
 		
 		List<String> servicesToCreate = new ArrayList<>();
 		for (String specid : tobeCreated.keySet()) {
-			if ( tobeCreated.get(specid) ) {
+			if ( tobeCreated.get(specid) !=null ) {
 				servicesToCreate.add(specid);
 				allSupportingServicesCreated = false;				
 			}
@@ -161,11 +178,21 @@ public class ProcessCreateServiceRules implements JavaDelegate {
 			
 		}
 		
+		if ( contextService.getState().equals( ServiceStateType.INACTIVE ) || contextService.getState().equals( ServiceStateType.TERMINATED ) ) {
+          allSupportingServicesCreatedAndActive = true;
+          allSupportingServicesCreated = true;    
+         // this will help us to avoid a deadlock if a failure occurs
+      } 
+		
 
 		execution.setVariable("allSupportingServicesCreated", allSupportingServicesCreated ); 
 		execution.setVariable("allSupportingServicesCreatedAndActive", allSupportingServicesCreatedAndActive && allSupportingServicesCreated ); //by default
 		execution.setVariable("parentServiceId", contextServiceId);
-		execution.setVariable("serviceSpecsToCreate", servicesToCreate);
+        execution.setVariable("serviceSpecsToCreate", servicesToCreate);
+        execution.setVariable("serviceSpecsToCreateInitialCharValues", tobeCreated);
+		
+		
+		
 	}