diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bb7d754baa751630b25598e182a30f062e9b6ebd..40be386b981d8564ef04539edebb44dc6a389d39 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -21,7 +21,7 @@ include:
       - ci-templates/default.yml
       - ci-templates/build.yml
     rules:
-      - if: '$CI_COMMIT_REF_PROTECTED && $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop"'
+      - if: '$CI_COMMIT_REF_PROTECTED == "true" && $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop"'
 
   - project: osl/code/org.etsi.osl.main
     ref: develop
@@ -29,7 +29,7 @@ include:
       - ci-templates/default.yml
       - ci-templates/build_unprotected.yml
     rules:
-      - if: '$CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop" && !$CI_COMMIT_REF_PROTECTED'
+      - if: '$CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop" && $CI_COMMIT_REF_PROTECTED == "false"'
 
 maven_build:
   extends: .maven_build
diff --git a/Dockerfile b/Dockerfile
index 68aefbc7f20e13c9ec0b1d461e0b71382edd58af..4709a015efb079474cf8a24dcb980ecc2307b9c7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,7 @@ FROM ibm-semeru-runtimes:open-17.0.7_7-jdk
 MAINTAINER openslice.io
 RUN mkdir /opt/shareclasses
 RUN mkdir -p /opt/openslice/lib/
-COPY target/org.etsi.osl.osom-1.0.0.jar /opt/openslice/lib/
-COPY target/org.etsi.osl.osom-1.0.0-exec.jar /opt/openslice/lib/
+COPY target/org.etsi.osl.osom-1.1.0.jar /opt/openslice/lib/
+COPY target/org.etsi.osl.osom-1.1.0-exec.jar /opt/openslice/lib/
 COPY . /opt/openslice/lib/
-CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.osom-1.0.0-exec.jar"]
\ No newline at end of file
+CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.osom-1.1.0-exec.jar"]
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 9a6a469ef3b67959b07a1863ee7a726fc425c92e..ead5841d3b79af566cde234fa5265e28a20d59f7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,16 +5,20 @@
 	<parent>
 		<groupId>org.etsi.osl</groupId>
 		<artifactId>org.etsi.osl.main</artifactId>
-		<version>1.0.0</version>
+		<version>2024Q4</version>
 		<relativePath>../org.etsi.osl.main</relativePath>
 	</parent>
 
 
 	<artifactId>org.etsi.osl.osom</artifactId>
 	<name>org.etsi.osl.osom</name>
+	<version>${org.etsi.osl.osom.version}</version>
 	<url>http://maven.apache.org</url>
 
-
+	<organization>
+		<name>OpenSlice by ETSI</name>
+		<url>https://osl.etsi.org</url>
+	</organization>
 
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -82,6 +86,7 @@
 		<dependency>
 			<groupId>com.h2database</groupId>
 			<artifactId>h2</artifactId>
+			<version>2.3.232</version>
 		</dependency>
 		<dependency>
 			<groupId>org.etsi.osl</groupId>
diff --git a/src/main/java/org/etsi/osl/osom/management/AutomationCheck.java b/src/main/java/org/etsi/osl/osom/management/AutomationCheck.java
index d8aef5d75a29dd9ea47ed4ce1dbe2387f9579b1e..0f5d87517edb4f2d73a2487ab040f6d7e2ed75b0 100644
--- a/src/main/java/org/etsi/osl/osom/management/AutomationCheck.java
+++ b/src/main/java/org/etsi/osl/osom/management/AutomationCheck.java
@@ -88,8 +88,12 @@ public class AutomationCheck implements JavaDelegate {
 			} else if ( spec.getType().equals("ResourceFacingServiceSpecification") &&  ( spec.findSpecCharacteristicByName( "OSM_NSDCATALOGID" ) != null ) ) {
 				execution.setVariable("brokeActivity", "RFS_OSM" ); 						
 			}  else if ( spec.getType().equals("ResourceFacingServiceSpecification") &&  ( spec.findSpecCharacteristicByName( "_CR_SPEC" ) != null ) ) {
-				execution.setVariable("brokeActivity", "RFS_CRSPEC" ); 						
-			} 		
+				execution.setVariable("brokeActivity", "RFS_CRSPEC" );
+			}  else if ( spec.getType().equals("ResourceFacingServiceSpecification") &&  ( spec.findSpecCharacteristicByName( "_MT_QUERY" ) != null ) ) {
+				 execution.setVariable("brokeActivity", "RFS_MTSPEC" );
+			} else if ( spec.getType().equals("ResourceFacingServiceSpecification") ) {
+              execution.setVariable("brokeActivity", "GRSPEC" );                      
+          }		
 		}
 
 
diff --git a/src/main/java/org/etsi/osl/osom/management/CROrchestrationCheckDeploymentService.java b/src/main/java/org/etsi/osl/osom/management/CROrchestrationCheckDeploymentService.java
index 8d036fe08f7360d1b018579af19d5c4de45e803a..b69a38910d5bb83ccd5e2242916faab9f6a98c43 100644
--- a/src/main/java/org/etsi/osl/osom/management/CROrchestrationCheckDeploymentService.java
+++ b/src/main/java/org/etsi/osl/osom/management/CROrchestrationCheckDeploymentService.java
@@ -91,13 +91,14 @@ public class CROrchestrationCheckDeploymentService implements JavaDelegate {
             Service serviceResult = serviceOrderManager.updateService( aService.getId(), supd, propagateToSO );
             return;
           }
+         
           rlist.add(res);
           
         }
         @Valid
         ServiceStateType currentState = aService.getState();        
         
-	    ServiceStateType nextState = aService.findNextStateBasedOnSupportingResources(rlist);
+	    ServiceStateType nextState =  aService.findNextStateBasedOnResourceList(rlist);
 	    
 	    if (!currentState.equals(nextState)) {
 	        supd.setState( nextState );     
diff --git a/src/main/java/org/etsi/osl/osom/management/CROrchestrationService.java b/src/main/java/org/etsi/osl/osom/management/CROrchestrationService.java
index 235012d76826f393907031bf5c2cf94a126f7f52..cff7c1eecd2da2634ea91d7e724d3d723cf95a9e 100644
--- a/src/main/java/org/etsi/osl/osom/management/CROrchestrationService.java
+++ b/src/main/java/org/etsi/osl/osom/management/CROrchestrationService.java
@@ -108,6 +108,15 @@ public class CROrchestrationService implements JavaDelegate {
         rr.setName( resourceCR.getName());
         rr.setType( resourceCR.getType());
         su.addSupportingResourceItem( rr );
+        su.setState(ServiceStateType.RESERVED);
+        Note successNoteItem = new Note();
+        successNoteItem.setText(String.format("Requesting CRIDGE to deploy crspec"));
+        successNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString());
+        successNoteItem.setAuthor(compname);
+        su.addNoteItem(successNoteItem);        
+        Service supd = serviceOrderManager.updateService(aService.getId(), su, false);
+        
+        
 
         String response = null;
         if (crspec != null) {
@@ -120,22 +129,16 @@ public class CROrchestrationService implements JavaDelegate {
         servicecrspecLast.getValue().setValue( crspec );
         su.addServiceCharacteristicItem(servicecrspecLast);
         
-        if ( response!=null && response.equals("OK")) {
-          su.setState(ServiceStateType.RESERVED);
-          Note successNoteItem = new Note();
-          successNoteItem.setText(String.format("Requesting CRIDGE to deploy crspec"));
-          successNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString());
-          successNoteItem.setAuthor(compname);
-          su.addNoteItem(successNoteItem);
-        } else {
+        if ( response==null || !response.equals("OK")) {
+          su = new ServiceUpdate();
           su.setState(ServiceStateType.TERMINATED);
           Note errNoteItem = new Note();
           errNoteItem.setText(String.format("Requesting CRIDGE to deploy crspec failed with message: " + response));
           errNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString());
           errNoteItem.setAuthor(compname);
           su.addNoteItem(errNoteItem);
+          supd = serviceOrderManager.updateService(aService.getId(), su, false);
         }
-        Service supd = serviceOrderManager.updateService(aService.getId(), su, false);
         
         return;
 
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 d545ff922ec40dafbf9358a270b0ff2eeee5538c..0609bd09b02d19f1490d9129120635795008a452 100644
--- a/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java
+++ b/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java
@@ -310,7 +310,7 @@ public class CreateReservedService implements JavaDelegate {
 			if ( initCharValues != null ) {
 			  if ( initCharValues.get( c.getName() ) != null ) {
 			    Characteristic orderCharacteristic = new Characteristic()
-			        .value( new Any( initCharValues.get( c.getName() ), initCharValues.get( c.getName() ))) ;
+			        .value( new Any( initCharValues.get( c.getName() ), null ) );
                 serviceToCreate.addServiceCharacteristicItem( helperCreateCharacteristicItem(c, orderCharacteristic ) );
                 characteristicFound = true;
                 continue;
diff --git a/src/main/java/org/etsi/osl/osom/management/FetchAcknowledgedProductOrders.java b/src/main/java/org/etsi/osl/osom/management/FetchAcknowledgedProductOrders.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4241bac2aae328fd6caa8a05fa19bdf07e1cef0
--- /dev/null
+++ b/src/main/java/org/etsi/osl/osom/management/FetchAcknowledgedProductOrders.java
@@ -0,0 +1,97 @@
+/*-
+ * ========================LICENSE_START=================================
+ * org.etsi.osl.osom
+ * %%
+ * Copyright (C) 2019 openslice.io
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+package org.etsi.osl.osom.management;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.etsi.osl.tmf.po622.model.ProductOrder;
+import org.etsi.osl.tmf.po622.model.ProductOrderStateType;
+import org.etsi.osl.tmf.so641.model.ServiceOrder;
+import org.etsi.osl.tmf.so641.model.ServiceOrderStateType;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.delegate.JavaDelegate;
+import org.flowable.task.api.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component(value = "fetchAcknowledgedProductOrders") // bean name
+public class FetchAcknowledgedProductOrders implements JavaDelegate {
+
+	private static final transient Log logger = LogFactory.getLog(FetchAcknowledgedProductOrders.class.getName());
+
+
+    @Autowired
+    private ProductOrderManager productOrderManager;
+
+    @Autowired
+    private ServiceOrderManager serviceOrderManager;
+
+	@Autowired
+	private TaskService taskService;
+
+	
+	public void execute(DelegateExecution execution) {
+		logger.info("======================" + execution.getProcessDefinitionId()  + "======================================");
+		logger.info("FetchAcknowledgedProductOrders by Product Order Repository");
+
+		List<String> ordersToBeProcessed = null;
+		if (execution.getVariable("productOrdersToBeProcessed") instanceof ArrayList) {
+			ordersToBeProcessed = (ArrayList<String>) execution.getVariable("productOrdersToBeProcessed");
+			for (String orderid : ordersToBeProcessed) {
+				logger.info("productOrdersToBeProcessed From Previous = " + orderid);
+			}
+		} else {
+			ordersToBeProcessed = new ArrayList<>();
+		}
+
+		List<String> orderlist = productOrderManager.retrieveOrdersByState( ProductOrderStateType.ACKNOWLEDGED );
+		
+		if ( orderlist != null ) {
+			for (String orderid : orderlist) {
+				if ( !ordersToBeProcessed.contains( orderid )  ) {
+					
+
+					ProductOrder sor = productOrderManager.retrieveProductOrder( orderid );
+					if ( sor !=null && sor.getRequestedStartDate() != null ) {
+						Instant instant = Instant.now() ;                          // Capture the current moment as seen in UTC.
+						boolean canStart = sor.getRequestedStartDate().toInstant().isBefore( instant ) ;
+						
+						if ( canStart ) {
+							logger.info("Product order is scheduled to start now, orderid= "+ orderid +" date="+  sor.getRequestedStartDate().toInstant());
+							ordersToBeProcessed.add( orderid );	
+						} else {
+							logger.info("Product order is scheduled to start later, orderid= " + orderid );
+						}
+					}
+					
+				}
+			}	
+		}
+		
+		execution.setVariable("productOrdersToBeProcessed", ordersToBeProcessed);
+		
+
+
+	}
+}
diff --git a/src/main/java/org/etsi/osl/osom/management/GCOrchestrationCheckDeploymentService.java b/src/main/java/org/etsi/osl/osom/management/GCOrchestrationCheckDeploymentService.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f1e4d0c724a72045491d9d141d35bf8723c5156
--- /dev/null
+++ b/src/main/java/org/etsi/osl/osom/management/GCOrchestrationCheckDeploymentService.java
@@ -0,0 +1,130 @@
+/*-
+ * ========================LICENSE_START=================================
+ * org.etsi.osl.osom
+ * %%
+ * Copyright (C) 2019 openslice.io
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+package org.etsi.osl.osom.management;
+
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.etsi.osl.tmf.common.model.service.Note;
+import org.etsi.osl.tmf.common.model.service.ResourceRef;
+import org.etsi.osl.tmf.common.model.service.ServiceStateType;
+import org.etsi.osl.tmf.ri639.model.Resource;
+import org.etsi.osl.tmf.sim638.model.Service;
+import org.etsi.osl.tmf.sim638.model.ServiceUpdate;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.delegate.JavaDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import jakarta.validation.Valid;
+
+
+@Component(value = "gcOrchestrationCheckDeploymentService") //bean name
+public class GCOrchestrationCheckDeploymentService implements JavaDelegate {
+
+	private static final transient Log logger = LogFactory.getLog(GCOrchestrationCheckDeploymentService.class.getName());
+
+
+
+    @Value("${spring.application.name}")
+    private String compname;
+
+	@Autowired
+	private ServiceOrderManager serviceOrderManager;
+	
+	public void execute(DelegateExecution execution) {
+
+		logger.info( "CROrchestrationCheckDeploymentService" );
+		logger.info( execution.getVariableNames().toString() );
+
+
+		if ( execution.getVariable("contextServiceId") == null) {
+
+			logger.error( "Variable contextServiceId is NULL!" );
+			execution.setVariable("serviceDeploymentFinished", Boolean.TRUE );
+			return;
+		}
+		Service aService = serviceOrderManager.retrieveService( (String) execution.getVariable("contextServiceId") );
+
+		if ( aService == null ) {
+			logger.info( "aService is null for contextServiceId = " +(String) execution.getVariable("contextServiceId") );			
+			execution.setVariable("serviceDeploymentFinished", Boolean.TRUE );
+			return;
+		}
+
+		execution.setVariable("serviceDeploymentFinished", Boolean.FALSE );
+
+		ServiceUpdate supd = new ServiceUpdate();
+		boolean propagateToSO = false;
+
+		//retrieve the related supporting resource by id and check its status
+		//ResourceRef supresourceRef = aService.getSupportingResource().stream().findFirst().get();//we assume for now we have only one related resource
+
+		List<Resource> rlist = new ArrayList<Resource>();
+        for (ResourceRef rref : aService.getSupportingResource()) {
+          Resource res = serviceOrderManager.retrieveResource(rref.getId());
+          
+          if (  res == null ) {
+            supd.setState( ServiceStateType.TERMINATED);
+            execution.setVariable("serviceDeploymentFinished", Boolean.TRUE);
+            Service serviceResult = serviceOrderManager.updateService( aService.getId(), supd, propagateToSO );
+            return;
+          }
+          rlist.add(res);
+          
+        }
+        @Valid
+        ServiceStateType currentState = aService.getState();        
+        
+	    ServiceStateType nextState = aService.findNextStateBasedOnResourceList(rlist);
+	    
+	    if (!currentState.equals(nextState)) {
+	        supd.setState( nextState );     
+	        Note n = new Note();
+	        n.setText("Service Status Changed to: " +  nextState);
+	        n.setAuthor(compname);
+	        n.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString());
+	        supd.addNoteItem(n);	        
+	        aService = serviceOrderManager.updateService( aService.getId(), supd, propagateToSO );	      
+	    }
+		
+		if ( aService!= null ) {
+			if ( aService.getState().equals(ServiceStateType.ACTIVE)
+					|| aService.getState().equals(ServiceStateType.TERMINATED)) {
+
+				logger.info("Deployment Status OK. Service state = " + aService.getState() );
+				execution.setVariable("serviceDeploymentFinished", Boolean.TRUE);
+				return;
+			}			
+		}
+		logger.info("Wait For Deployment Status. ");
+		
+		
+
+		
+		
+	}
+
+
+	
+}
diff --git a/src/main/java/org/etsi/osl/osom/management/GCOrchestrationService.java b/src/main/java/org/etsi/osl/osom/management/GCOrchestrationService.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7e0deadfae41bb956259e83d40bea8bce299b9e
--- /dev/null
+++ b/src/main/java/org/etsi/osl/osom/management/GCOrchestrationService.java
@@ -0,0 +1,397 @@
+/*-
+ * ========================LICENSE_START=================================
+ * org.etsi.osl.osom
+ * %%
+ * Copyright (C) 2019 openslice.io
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+package org.etsi.osl.osom.management;
+
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+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.tmf.common.model.Any;
+import org.etsi.osl.tmf.common.model.EValueType;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
+import org.etsi.osl.tmf.common.model.service.Note;
+import org.etsi.osl.tmf.common.model.service.ResourceRef;
+import org.etsi.osl.tmf.common.model.service.ServiceStateType;
+import org.etsi.osl.tmf.rcm634.model.ResourceSpecification;
+import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCharacteristic;
+import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCharacteristicValue;
+import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef;
+import org.etsi.osl.tmf.ri639.model.Resource;
+import org.etsi.osl.tmf.ri639.model.ResourceCreate;
+import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristic;
+import org.etsi.osl.tmf.scm633.model.ServiceSpecification;
+import org.etsi.osl.tmf.sim638.model.Service;
+import org.etsi.osl.tmf.sim638.model.ServiceUpdate;
+import org.etsi.osl.tmf.so641.model.ServiceOrder;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.delegate.JavaDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import jakarta.validation.Valid;
+
+
+@Component(value = "gcOrchestrationService") // bean name
+public class GCOrchestrationService implements JavaDelegate {
+
+  private static final transient Log logger =
+      LogFactory.getLog(GCOrchestrationService.class.getName());
+
+
+  @Value("${spring.application.name}")
+  private String compname;
+
+
+  @Autowired
+  private ServiceOrderManager serviceOrderManager;
+
+
+  public void execute(DelegateExecution execution) {
+
+    logger.debug("Ceneric Controller OrchestrationService");
+    logger.debug("VariableNames:" + execution.getVariableNames().toString());
+    logger.debug("orderid:" + execution.getVariable("orderid").toString());
+    logger.debug("contextServiceId:" + execution.getVariable("contextServiceId").toString());
+
+    try {
+      
+
+    ServiceUpdate su = new ServiceUpdate();// the object to update the service
+    Note noteItem = new Note();
+    noteItem.setText("");
+
+    if (execution.getVariable("contextServiceId") instanceof String contextServiceId)  {
+
+
+
+      ServiceOrder sorder =
+          serviceOrderManager.retrieveServiceOrder(execution.getVariable("orderid").toString());
+      Service aService =
+          serviceOrderManager.retrieveService( contextServiceId );
+      logger.info("Service name:" + aService.getName());
+      logger.info("Service state:" + aService.getState());
+      logger.info("Request for a Custom Resource creation for Service: " + aService.getId());
+
+      // we need to retrieve here the Service Spec of this service
+
+      ServiceSpecification spec =
+          serviceOrderManager.retrieveServiceSpec(aService.getServiceSpecificationRef().getId());
+
+      if (spec != null) {
+
+        
+        
+        
+        //we need to get the equivalent resource spec. since ServiceSpec is an RFS
+        ResourceSpecificationRef rSpecRef = spec.getResourceSpecification().stream().findFirst().get();
+        
+        ResourceSpecification rspec = serviceOrderManager.retrieveResourceSpec(rSpecRef.getId());
+        
+        //we will create a resource based on the values of resourcepsecificationRef
+        ResourceCreate resourceCreate = createRelatedResource( rspec, sorder, aService );
+        
+
+        //save it to TMF API service inventory
+        Resource resourceI = serviceOrderManager.createResource( resourceCreate, sorder, rspec.getId() );
+        
+        
+        ResourceRef rr = new ResourceRef();
+        rr.setId( resourceI.getId() );
+        rr.setName( resourceI.getName());
+        rr.setType( resourceI.getType());
+        su.addSupportingResourceItem( rr );
+
+        su.setState(ServiceStateType.RESERVED);
+        Note successNoteItem = new Note();
+        successNoteItem.setText(String.format("Requesting Controller of "+ rSpecRef.getName() +" to deploy resource"));
+        successNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString());
+        successNoteItem.setAuthor(compname);
+        su.addNoteItem(successNoteItem);
+        Service supd = serviceOrderManager.updateService(aService.getId(), su, false);
+        
+        Resource response = null;
+        
+        response = createNewResourceDeploymentRequest(aService, resourceI, resourceCreate,  sorder.getId() );
+        
+                
+        
+        if ( response==null  ) {
+          su.setState(ServiceStateType.TERMINATED);
+          Note errNoteItem = new Note();
+          errNoteItem.setText(String.format("Requesting Controller to deploy resource failed "));
+          errNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString());
+          errNoteItem.setAuthor(compname);
+          su.addNoteItem(errNoteItem);
+          supd = serviceOrderManager.updateService(aService.getId(), su, false);
+        }
+        
+        return;
+
+      } else {
+
+        logger.error("Cannot retrieve ServiceSpecification for service :"
+            + (String) execution.getVariable("contextServiceId"));
+      }
+    } else {
+      logger.error("Cannot retrieve variable contextServiceId");
+    }
+
+    // if we get here something is wrong so we need to terminate the service.
+
+    
+    
+    }catch (Exception e) {
+      e.printStackTrace();
+    }
+    
+    
+    try {
+      Note noteItem = new Note();
+      noteItem.setText("Request to CR FAILED." + noteItem.getText());
+      noteItem.setAuthor(compname);
+      noteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString());
+      ServiceUpdate su = new ServiceUpdate();// the object to update the service
+      su.addNoteItem(noteItem);
+      su.setState(ServiceStateType.TERMINATED);
+      serviceOrderManager.updateService(execution.getVariable("contextServiceId").toString(), su,
+          false);
+    }catch (Exception e) {
+      e.printStackTrace();
+    }
+
+  }
+
+
+  /**
+   * 
+   * THe resource has a temporary name.
+   * later on the name and its characteristics are updated via the generic controller
+   * 
+   * 
+   * @param rSpecRef
+   * @param sOrder
+   * @param aService
+   * @return
+   */
+  private ResourceCreate createRelatedResource(ResourceSpecification rspec, ServiceOrder sOrder, Service aService) {
+    
+    /**
+     * In future releases, it is better to create some helper function in the TMF model that
+     * Creates a resource from a resource specification, (or a service from a servic spec). 
+     * There are similar functions in other places, so it is better to move them in one place
+     */
+    ResourceCreate resCreate = new ResourceCreate();
+    resCreate.setName(  rspec.getName()+"-" + aService.getId() );
+    resCreate.setCategory( rspec.getCategory() );
+    resCreate.resourceVersion( rspec.getVersion() );
+    
+    resCreate.setStartOperatingDate( aService.getStartDate() );
+    resCreate.setEndOperatingDate(aService.getEndDate());
+    ResourceSpecificationRef rSpecRefObj = new ResourceSpecificationRef() ;
+    rSpecRefObj.id(rspec.getId())
+      .version(rspec.getVersion())
+      .name( rspec.getName())
+      .setType(rspec.getType());
+    resCreate.setResourceSpecification(rSpecRefObj); 
+    
+    
+    for (ResourceSpecificationCharacteristic c : rspec.getResourceSpecCharacteristic()) {
+      for (Characteristic orderCharacteristic : aService.getServiceCharacteristic() ) {
+          String specCharacteristicToSearch = c.getName();
+           if ( orderCharacteristic.getName().equals( specCharacteristicToSearch )) { //copy only characteristics that are related from the order     
+              
+             resCreate.addResourceCharacteristicItem(  addResourceCharacteristicItem(c, orderCharacteristic) );
+             break;
+          }
+      }
+    }
+    
+    //copy to resource the rest of the characteristics that do not exists yet from the above search
+    resCreate = copyRemainingSpecCharacteristicsToResourceCharacteristic(rspec , resCreate );     
+    
+    return resCreate;
+
+    
+    
+  }
+  
+  
+  private org.etsi.osl.tmf.ri639.model.Characteristic addResourceCharacteristicItem(ResourceSpecificationCharacteristic c, Characteristic orderCharacteristic) {
+    org.etsi.osl.tmf.ri639.model.Characteristic resCharacteristicItem =  new org.etsi.osl.tmf.ri639.model.Characteristic();
+    resCharacteristicItem.setName( c.getName() );
+    resCharacteristicItem.setValueType( c.getValueType() );
+                
+    Any val = new Any();
+    val.setValue( orderCharacteristic.getValue().getValue() );
+    val.setAlias( orderCharacteristic.getValue().getAlias() );
+    
+    resCharacteristicItem.setValue( val );
+    
+    return resCharacteristicItem;
+  }
+  
+  
+  /**
+   * 
+   * This helper function it is better in future to be moved in the TMF model.
+   * There is similar in resource order
+   * 
+   * @param spec
+   * @param list
+   */
+  private ResourceCreate copyRemainingSpecCharacteristicsToResourceCharacteristic(ResourceSpecification spec,
+      @Valid ResourceCreate resCreate) {
+    
+    List<org.etsi.osl.tmf.ri639.model.Characteristic> list = resCreate.getResourceCharacteristic();
+    
+    for (ResourceSpecificationCharacteristic sourceCharacteristic : spec.getResourceSpecCharacteristic()) {
+        if (  sourceCharacteristic.getValueType() != null ) {
+            boolean charfound = false;
+            for (org.etsi.osl.tmf.ri639.model.Characteristic destchar : list) {
+                if ( destchar.getName().equals(sourceCharacteristic.getName())) {
+                    charfound = true;
+                    break;
+                }
+            }
+            
+            if (!charfound) {
+            
+                org.etsi.osl.tmf.ri639.model.Characteristic newChar = new org.etsi.osl.tmf.ri639.model.Characteristic();
+                newChar.setName( sourceCharacteristic.getName() );
+                newChar.setValueType( sourceCharacteristic.getValueType() );
+                
+                if (  sourceCharacteristic.getValueType() != null && sourceCharacteristic.getValueType().equals( EValueType.ARRAY.getValue() ) ||
+                         sourceCharacteristic.getValueType() != null && sourceCharacteristic.getValueType().equals( EValueType.SET.getValue() ) ) {
+                    String valString = "";
+                    for (ResourceSpecificationCharacteristicValue specchar : sourceCharacteristic.getResourceSpecCharacteristicValue()) {
+                        if ( ( specchar.isIsDefault()!= null) && specchar.isIsDefault() ) {
+                            if ( !valString.equals("")) {
+                                valString = valString + ",";
+                            }
+                            valString = valString + "{\"value\":\"" + specchar.getValue().getValue() + "\",\"alias\":\"" + specchar.getValue().getAlias() + "\"}";
+                        }
+                        
+                    }
+                    
+                    newChar.setValue( new Any( "[" + valString + "]", "") );
+                    
+                    
+                } else {
+                    for (ResourceSpecificationCharacteristicValue specchar : sourceCharacteristic.getResourceSpecCharacteristicValue()) {
+                        if ( ( specchar.isIsDefault()!= null) && specchar.isIsDefault() ) {
+                            newChar.setValue( new Any(
+                                    specchar.getValue().getValue(), 
+                                    specchar.getValue().getAlias()) );
+                            break;
+                        }else {
+                            if (specchar.isIsDefault()== null){
+  
+                            logger.info("specchar is null value: " + sourceCharacteristic.getName() );
+                            }
+                        }
+  
+                    }                       
+                }
+                
+                
+                if ( newChar.getValue() !=null) {
+                    list.add(newChar );
+                } else {
+                    newChar.setValue( new Any(
+                            "", 
+                            "") );
+                    list.add(newChar );
+                }
+                
+            }
+            
+        }
+        
+        
+    }
+    
+    return resCreate;
+    
+  }
+
+
+  /**
+   * 
+   * This function makes a new deployment resource request for a resource  specification.
+   * The request is performed via the message queue.
+   * The function sends also some headers that maybe are needed for deployment
+   * These are the headers
+   * <br>
+   * <br><b>org.etsi.osl.serviceId:</b> This is the related service id that the created resource has a reference
+   * <br><b>org.etsi.osl.resourceId:</b> This is the related resource id that the created CR will wrap and reference. There
+   * <br><b>org.etsi.osl.prefixName:</b> we need to add a short prefix (default is cr) to various places. For example in K8s cannot start with a number
+   * <br><b>org.etsi.osl.serviceOrderId:</b> the related service order id of this deployment request
+   * <br>
+   * 
+   * @param aService reference to the service that the resource and the CR belongs to
+   * @param resourceI reference the equivalent resource in TMF repo of the target CR. One to one mapping
+   * @param orderId related service order ID
+   * @return a Resource as updated. It might return "OK" if everything is ok. 
+   * "SEE OTHER" if there are multiple CRIDGEs then some other cridge will handle the request for the equivalent cluster. 
+   * Any other response is handled as error
+   * return Resource object from the controller
+   */
+  private Resource createNewResourceDeploymentRequest( Service aService, Resource resourceI,
+      ResourceCreate aResourceCreate, 
+      String orderId) {
+
+    try {
+      Map<String, Object> map = new HashMap<>();
+      map.put("org.etsi.osl.serviceId", aService.getId() );
+      map.put("org.etsi.osl.resourceId", resourceI.getId() );
+      map.put("org.etsi.osl.prefixName", "gr" + resourceI.getId().substring(0, 8) );
+      map.put("org.etsi.osl.serviceOrderId", orderId );
+      
+
+      logger.debug("createNewResourceDeploymentRequest ");
+      
+      String queueName = "jms:queue:CREATE/"+ aResourceCreate.getCategory() + "/" + aResourceCreate.getResourceVersion() ;
+      Resource response  = serviceOrderManager.gcGenericResourceDeploymentRequest(queueName , map, aResourceCreate);
+      
+
+      return response;
+      
+    } catch (Exception e) {
+      logger.error("cridgeDeploymentRequest failed");
+      e.printStackTrace();
+    }
+
+    return null;
+
+  }
+
+
+  private Object getServiceCharacteristic(Service aService, String val) {
+    if (aService.getServiceCharacteristicByName( val ) !=null ) {
+      return aService.getServiceCharacteristicByName( val ).getValue().getValue();
+    }
+    return "";
+  }
+
+
+}
diff --git a/src/main/java/org/etsi/osl/osom/management/InitializeProcessProductOrders.java b/src/main/java/org/etsi/osl/osom/management/InitializeProcessProductOrders.java
new file mode 100644
index 0000000000000000000000000000000000000000..03ffa418c376f5c6052b5302dba6fe3c97bb0afe
--- /dev/null
+++ b/src/main/java/org/etsi/osl/osom/management/InitializeProcessProductOrders.java
@@ -0,0 +1,220 @@
+/*-
+ * ========================LICENSE_START=================================
+ * org.etsi.osl.osom
+ * %%
+ * Copyright (C) 2019 openslice.io
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+package org.etsi.osl.osom.management;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.etsi.osl.tmf.common.model.Any;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
+import org.etsi.osl.tmf.common.model.service.Note;
+import org.etsi.osl.tmf.common.model.service.ServiceSpecificationRef;
+import org.etsi.osl.tmf.pcm620.model.ProductOffering;
+import org.etsi.osl.tmf.pcm620.model.ProductOfferingRef;
+import org.etsi.osl.tmf.pcm620.model.ProductSpecification;
+import org.etsi.osl.tmf.po622.model.ProductOrder;
+import org.etsi.osl.tmf.po622.model.ProductOrderItem;
+import org.etsi.osl.tmf.po622.model.ProductOrderStateType;
+import org.etsi.osl.tmf.po622.model.ProductOrderUpdate;
+import org.etsi.osl.tmf.prm669.model.RelatedParty;
+import org.etsi.osl.tmf.so641.model.ServiceOrder;
+import org.etsi.osl.tmf.so641.model.ServiceOrderCreate;
+import org.etsi.osl.tmf.so641.model.ServiceOrderItem;
+import org.etsi.osl.tmf.so641.model.ServiceOrderStateType;
+import org.etsi.osl.tmf.so641.model.ServiceRestriction;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.delegate.JavaDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import jakarta.validation.Valid;
+
+@Component(value = "initializeProcessProductOrders") // bean name
+public class InitializeProcessProductOrders implements JavaDelegate {
+
+	private static final transient Log logger = LogFactory.getLog(InitializeProcessProductOrders.class.getName());
+
+	@Autowired
+	private ProductOrderManager productOrderManager;
+	
+
+    @Autowired
+    private ServiceOrderManager serviceOrderManager;
+    
+
+    @Value("${spring.application.name}")
+    private String compname;
+
+	@Autowired
+	private RuntimeService runtimeService;
+
+	public void execute(DelegateExecution execution) {
+
+		logger.info("Check if there are new Product Orders for Orchestration: " + execution.getVariables().toString());
+	
+
+		if (execution.getVariable("productOrdersToBeProcessed") instanceof ArrayList) {
+
+			List<String> ordersToBeProcessed = (ArrayList<String>) execution.getVariable("productOrdersToBeProcessed");
+			for (String oId : ordersToBeProcessed) {
+
+			  //process each order request
+			  processOrderRequest( oId );
+				
+			}
+
+		}
+
+	}
+
+  /**
+   * For each product order create a service order and perform the neccessary references
+   * @param oId
+   */
+  private void processOrderRequest(String oId) {
+      
+    //create equivalent service order
+    ProductOrder prodOrder = productOrderManager.retrieveProductOrder(oId);
+    logger.debug("Will send message that Product Order is IN-PROGRESS orderid= " + oId );
+    
+    ServiceOrder serviceOrder = createServiceOrderFromProductOrder(prodOrder);
+    
+    if (serviceOrder==null) {
+      logger.error("Service Order is NULL " );
+      
+      return;
+    }
+    
+    ProductOrderUpdate productOrderUpd = new ProductOrderUpdate();
+    productOrderUpd.setState(ProductOrderStateType.INPROGRESS);
+    for (ProductOrderItem poi : prodOrder.getProductOrderItem() ) {
+      if ( poi.getProduct() != null ) {
+        Characteristic charact = new Characteristic();
+        charact.setName("_SERVICE_ORDER_ID_");
+        charact.setValueType("TEXT");
+        charact.setValue(new Any( serviceOrder.getId() ));        
+        poi.getProduct().addProductCharacteristicItem(charact);
+      }
+      productOrderUpd.addProductOrderItemItem(poi);
+    }
+     
+    productOrderManager.updateProducteOrder( oId, productOrderUpd );                    
+    
+  }
+
+  private ServiceOrder createServiceOrderFromProductOrder(ProductOrder prodOrder) {
+
+
+    ServiceOrderCreate servOrder = new ServiceOrderCreate();
+    servOrder.setCategory("Automated order");
+    servOrder.setDescription("Automatically created for product order " + prodOrder.getId());
+    servOrder.setRequestedStartDate(prodOrder.getRequestedStartDate());
+    servOrder.setRequestedCompletionDate(prodOrder.getExpectedCompletionDate());
+    RelatedParty rpi = new RelatedParty();
+    rpi.setName("OSOM-ProductOrder");
+    rpi.setRole("REQUESTER");
+    rpi.setId("OSOM-ProductOrder");
+    servOrder.addRelatedPartyItem(rpi );
+
+    Note noteItemOrder = new Note();
+    noteItemOrder.text("Automatically created for product order " + prodOrder.getId());
+    noteItemOrder.setAuthor(compname);
+    servOrder.addNoteItem(noteItemOrder);
+
+    for (ProductOrderItem poi : prodOrder.getProductOrderItem()) {
+      @Valid
+      ProductOfferingRef poffRefpoi = poi.getProductOffering();
+
+      ProductOffering pOffer = productOrderManager.retrieveProductOffering(poffRefpoi.getId());
+      if (pOffer == null) {
+        logger.error("Product Order - ProductOffering in ProductOrderItem is NULL");
+        return null;
+      }
+      
+      if ( poi.getProduct() == null ) {
+        logger.error("Product Order - Product in ProductOrderItem is NULL");
+        return null;        
+      }
+
+      ProductSpecification pSepc =
+          productOrderManager.retrieveProductSpec(poi.getProduct().getProductSpecification().getId());
+      if (pSepc == null) {
+        logger.error("Product Order - ProductSpecification in Product, ProductOrderItem is NULL");
+        return null;
+      }
+
+      logger.debug("Product Order - ProductOffering name= " + pOffer.getName());
+      logger.debug("Product Order - ProductSpecification name= " + pSepc.getName());
+
+
+      for (ServiceSpecificationRef serviceSpec : pSepc.getServiceSpecification()) {
+        ServiceOrderItem soi = new ServiceOrderItem();
+        servOrder.getOrderItem().add(soi);
+        soi.setState(ServiceOrderStateType.ACKNOWLEDGED);
+
+        ServiceRestriction serviceRestriction = new ServiceRestriction();
+        ServiceSpecificationRef aServiceSpecificationRef = new ServiceSpecificationRef();
+        aServiceSpecificationRef.setId( serviceSpec.getId() );
+        aServiceSpecificationRef.setName( serviceSpec.getName());
+        aServiceSpecificationRef.setVersion( serviceSpec.getVersion());
+
+        serviceRestriction.setServiceSpecification(aServiceSpecificationRef);
+
+//        πρεπει να perasoyme τιμες από το product order στο service order item
+//        εδω debug
+        
+        for (Characteristic servChar : poi.getProduct().getProductCharacteristic()  ) {
+          servChar.setUuid(null);
+          serviceRestriction.addServiceCharacteristicItem(servChar);
+        }
+
+        
+
+        Characteristic refProductOrderChar = new Characteristic();
+        refProductOrderChar.setName("_PRODUCT_ORDER_ID_");
+        refProductOrderChar.setValueType("TEXT");
+        refProductOrderChar.setValue(new Any( prodOrder.getId() ));
+        serviceRestriction.addServiceCharacteristicItem(refProductOrderChar);
+        
+        Characteristic refProductOrderItemChar = new Characteristic();
+        refProductOrderItemChar.setName("_PRODUCT_ORDER_ITEM_ID_");
+        refProductOrderItemChar.setValueType("TEXT");
+        refProductOrderItemChar.setValue(new Any( poi.getId() ));
+        serviceRestriction.addServiceCharacteristicItem(refProductOrderItemChar);
+        
+        soi.setService(serviceRestriction);
+        
+      }
+      
+
+    }
+
+    ServiceOrder externalSOrder = serviceOrderManager.createServiceOrder(servOrder);
+
+
+    return externalSOrder;
+
+
+  }
+  
+  
+}
diff --git a/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationCheckDeploymentService.java b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationCheckDeploymentService.java
new file mode 100644
index 0000000000000000000000000000000000000000..8809c08d663d564d9efca7ae97eb55250cf0f91b
--- /dev/null
+++ b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationCheckDeploymentService.java
@@ -0,0 +1,95 @@
+package org.etsi.osl.osom.management;
+
+import jakarta.validation.Valid;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.etsi.osl.tmf.common.model.service.Note;
+import org.etsi.osl.tmf.common.model.service.ResourceRef;
+import org.etsi.osl.tmf.common.model.service.ServiceStateType;
+import org.etsi.osl.tmf.ri639.model.Resource;
+import org.etsi.osl.tmf.sim638.model.Service;
+import org.etsi.osl.tmf.sim638.model.ServiceUpdate;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.delegate.JavaDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component(value = "metricoOrchestrationCheckDeploymentService")
+public class MetricoOrchestrationCheckDeploymentService implements JavaDelegate {
+    private static final transient Log logger = LogFactory.getLog(MetricoOrchestrationCheckDeploymentService.class.getName());
+
+    @Autowired
+    private ServiceOrderManager serviceOrderManager;
+
+
+    @Value("${spring.application.name}")
+    private String compname;
+
+    @Override
+    public void execute(DelegateExecution execution) {
+
+        logger.info( "MetricoOrchestrationCheckDeploymentService" );
+        logger.info( execution.getVariableNames().toString() );
+
+        if ( execution.getVariable("contextServiceId") == null) {
+
+            logger.error( "Variable contextServiceId is NULL!" );
+            execution.setVariable("serviceDeploymentFinished", Boolean.TRUE );
+            return;
+        }
+        Service aService = serviceOrderManager.retrieveService( (String) execution.getVariable("contextServiceId") );
+
+        if ( aService == null ) {
+            logger.info( "aService is null for contextServiceId = " +(String) execution.getVariable("contextServiceId") );
+            execution.setVariable("serviceDeploymentFinished", Boolean.TRUE );
+            return;
+        }
+
+        execution.setVariable("serviceDeploymentFinished", Boolean.FALSE );
+        ServiceUpdate supd = new ServiceUpdate();
+        boolean propagateToSO = false;
+
+        List<Resource> rlist = new ArrayList<Resource>();
+        for (ResourceRef rref : aService.getSupportingResource()) {
+            Resource res = serviceOrderManager.retrieveResource(rref.getId());
+
+            if (  res == null ) {
+                supd.setState( ServiceStateType.TERMINATED);
+                execution.setVariable("serviceDeploymentFinished", Boolean.TRUE);
+                Service serviceResult = serviceOrderManager.updateService( aService.getId(), supd, propagateToSO );
+                return;
+            }
+            rlist.add(res);
+        }
+        @Valid
+        ServiceStateType currentState = aService.getState();
+        ServiceStateType nextState = aService.findNextStateBasedOnResourceList(rlist);
+
+        if (!currentState.equals(nextState)) {
+            supd.setState( nextState );
+            Note n = new Note();
+            n.setText("Service Status Changed to: " +  nextState);
+            n.setAuthor(compname);
+            n.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString());
+            supd.addNoteItem(n);
+            aService = serviceOrderManager.updateService( aService.getId(), supd, propagateToSO );
+        }
+
+        if ( aService!= null ) {
+            if ( aService.getState().equals(ServiceStateType.ACTIVE)
+                    || aService.getState().equals(ServiceStateType.TERMINATED)) {
+
+                logger.info("Deployment Status OK. Service state = " + aService.getState() );
+                execution.setVariable("serviceDeploymentFinished", Boolean.TRUE);
+                return;
+            }
+        }
+        logger.info("Wait For Deployment Status. ");
+    }
+}
diff --git a/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2ee32a5c4218e3b0723796d2272ce9622702d61
--- /dev/null
+++ b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java
@@ -0,0 +1,277 @@
+package org.etsi.osl.osom.management;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.camel.ProducerTemplate;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
+import org.etsi.osl.tmf.common.model.service.Note;
+import org.etsi.osl.tmf.common.model.service.ResourceRef;
+import org.etsi.osl.tmf.common.model.service.ServiceStateType;
+import org.etsi.osl.tmf.common.model.Any;
+import org.etsi.osl.tmf.pm628.model.*;
+import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef;
+import org.etsi.osl.tmf.ri639.model.Resource;
+import org.etsi.osl.tmf.ri639.model.ResourceCreate;
+import org.etsi.osl.tmf.ri639.model.ResourceStatusType;
+import org.etsi.osl.tmf.scm633.model.ServiceSpecification;
+import org.etsi.osl.tmf.sim638.model.Service;
+import org.etsi.osl.tmf.sim638.model.ServiceUpdate;
+import org.etsi.osl.tmf.so641.model.ServiceOrder;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.delegate.JavaDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component(value = "metricoOrchestrationService") //bean name
+public class MetricoOrchestrationService implements JavaDelegate {
+
+	private static final transient Log logger = LogFactory.getLog(MetricoOrchestrationService.class.getName());
+
+	
+	
+	@Value("${spring.application.name}")
+	private String compname;
+	
+	
+	@Autowired
+	private ServiceOrderManager serviceOrderManager;
+	
+
+    @Override
+    public void execute(DelegateExecution execution) {
+		ServiceOrder sorder = serviceOrderManager.retrieveServiceOrder(execution.getVariable("orderid").toString());
+		ServiceUpdate su = new ServiceUpdate();// the object to update the service
+		Service aService = serviceOrderManager.retrieveService((String) execution.getVariable("contextServiceId"));
+		logger.info("Service name:" + aService.getName());
+		logger.info("Service state:" + aService.getState());
+		logger.info("Request to TMF628 for Service: " + aService.getId());
+
+
+		ServiceSpecification spec = serviceOrderManager.retrieveServiceSpec(aService.getServiceSpecificationRef().getId());
+
+		if (spec != null) {
+
+			Characteristic serviceCharacteristic;
+			MeasurementCollectionJobFVO mcjFVO = new MeasurementCollectionJobFVO();
+            mcjFVO.setCreationTime( OffsetDateTime.now());
+            mcjFVO.setLastModifiedTime( OffsetDateTime.now());
+
+			mcjFVO.setProducingApplicationId(aService.getId());
+
+			serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_CHARACTERISTIC_NAME");
+			String characteristicName = String.valueOf(serviceCharacteristic.getValue().getValue());
+			mcjFVO.setOutputFormat(characteristicName);
+
+			serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_SERVICEUUID");
+			String cfs_id = String.valueOf(serviceCharacteristic.getValue().getValue());
+			mcjFVO.setConsumingApplicationId(cfs_id);
+
+			serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_END_TIME");
+			String endTimeString = 	String.valueOf(serviceCharacteristic.getValue().getValue());
+			ScheduleDefinitionFVO scheduleDefinition = new ScheduleDefinitionFVO();
+			if (endTimeString != null && !endTimeString.equals("")) {
+				OffsetDateTime endTime = convertStringToOffsetDateTime(endTimeString, DateTimeFormat.ISO.DATE_TIME );
+				scheduleDefinition.setScheduleDefinitionEndTime(endTime);
+			} else{
+				OffsetDateTime endTime = OffsetDateTime.now().plusHours(1);
+				scheduleDefinition.setScheduleDefinitionEndTime(endTime);
+			}
+
+			serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_START_TIME");
+			String startTimeString = String.valueOf(serviceCharacteristic.getValue().getValue());
+			if (startTimeString != null&& !startTimeString.equals("")) {
+				OffsetDateTime startTime = convertStringToOffsetDateTime(startTimeString, DateTimeFormat.ISO.DATE_TIME );
+				scheduleDefinition.setScheduleDefinitionStartTime(startTime);
+			} else{
+				OffsetDateTime startTime = OffsetDateTime.now();
+				scheduleDefinition.setScheduleDefinitionStartTime(startTime);
+			}
+			List<ScheduleDefinitionFVO> scheduleDefinitions = new ArrayList<>();
+			scheduleDefinitions.add(scheduleDefinition);
+			mcjFVO.setScheduleDefinition(scheduleDefinitions);
+
+			serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_RECURRING_INTERVAL");
+			String recurringIntervalString = String.valueOf(serviceCharacteristic.getValue().getValue());
+			if (recurringIntervalString != null) {
+				if (Granularity.contains(recurringIntervalString)){
+					Granularity recurringInterval = Granularity.valueOf(recurringIntervalString.toUpperCase());
+					mcjFVO.setGranularity(recurringInterval);
+				} else {
+					logger.error("Invalid _MT_RECURRING_INTERVAL value. Valid values are:" + Granularity.getPossibleValues() + " It will be set to 1 minute.");
+					Granularity recurringInterval = Granularity.G_1MN;
+					mcjFVO.setGranularity(recurringInterval);
+				}
+			} else {
+				Granularity recurringInterval = Granularity.G_1MN;
+				mcjFVO.setGranularity(recurringInterval);
+			}
+
+			serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_TYPE");
+			String monitoringType = String.valueOf(serviceCharacteristic.getValue().getValue());
+			DataAccessEndpointFVO dataAccessEndpoint = new DataAccessEndpointFVO();
+			dataAccessEndpoint.setApiType(monitoringType);
+
+			serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_QUERY");
+			String monitoringQuery = String.valueOf(serviceCharacteristic.getValue().getValue());
+			serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_URL");
+			String monitoringURL = String.valueOf(serviceCharacteristic.getValue().getValue());
+            try {
+                URI monitoringURI = createUri(monitoringURL, monitoringQuery);
+				dataAccessEndpoint.setUri(monitoringURI);
+            } catch (URISyntaxException e) {
+                throw new RuntimeException(e);
+            }
+
+			List<DataAccessEndpointFVO> dataAccessEndpoints = new ArrayList<>();
+			dataAccessEndpoints.add(dataAccessEndpoint);
+			mcjFVO.setDataAccessEndpoint(dataAccessEndpoints);
+
+			ResourceSpecificationRef resourceSpecificationRef = spec.getResourceSpecification().stream().findFirst().get();
+			Resource resourceMT = createRelatedResource( resourceSpecificationRef, sorder, aService );
+			ResourceRef resourceRef = new ResourceRef();
+
+			resourceRef.setId( resourceMT.getId() );
+			resourceRef.setName( resourceMT.getName());
+			resourceRef.setType( resourceMT.getType());
+			su.addSupportingResourceItem( resourceRef );
+			su.setState(ServiceStateType.RESERVED);
+			Note successNoteItem = new Note();
+			successNoteItem.setText(String.format("Requesting METRICO to create a new monitoring job"));
+			successNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString());
+			successNoteItem.setAuthor(compname);
+			su.addNoteItem(successNoteItem);
+			
+            Service supd = serviceOrderManager.updateService(aService.getId(), su, false);//we nned first to create this in the db
+
+            su = new ServiceUpdate();// the object to update the service
+            MeasurementCollectionJob mcj = serviceOrderManager.addMeasurementCollectionJob(mcjFVO);
+            if  (mcj != null){
+              logger.info("Measurement Collection Job was not created.");
+
+              serviceCharacteristic = new Characteristic();              
+              serviceCharacteristic.setName( "_MT_MCJ_REFID" );
+              serviceCharacteristic.setValueType( "TEXT" );
+              Any val = new Any();
+              val.setValue( mcj.getUuid() );
+              val.setAlias( "" );              
+              serviceCharacteristic.setValue(val);
+              su.addServiceCharacteristicItem(serviceCharacteristic);
+              
+            } else {
+              logger.error("Measurement Collection Job was not created.");
+              su.setState(ServiceStateType.TERMINATED);
+            }
+
+            supd = serviceOrderManager.updateService(aService.getId(), su, false);//we nned first to create this in the db
+
+
+		}
+	}
+
+
+
+
+
+//	Methods created to use in this class
+	public static OffsetDateTime convertStringToOffsetDateTime(String dateTimeString, DateTimeFormat.ISO pattern) {
+		DateTimeFormatter formatter;
+		switch (pattern) {
+			case DATE:
+				formatter = DateTimeFormatter.ISO_DATE;
+				break;
+			case TIME:
+				formatter = DateTimeFormatter.ISO_TIME;
+				break;
+			case DATE_TIME:
+				formatter = DateTimeFormatter.ISO_DATE_TIME;
+				break;
+			default:
+				throw new IllegalArgumentException("Unsupported DateTimeFormat.ISO pattern");
+		}
+		try {
+			OffsetDateTime.parse(dateTimeString, formatter);
+			return OffsetDateTime.parse(dateTimeString, formatter);
+		} catch (DateTimeParseException e) {
+			logger.error(e.getMessage());
+			return null;
+		}
+
+	}
+
+	public static URI createUri(String url, String query) throws URISyntaxException {
+		return new URI(url + "?" + query);
+	}
+
+	public static <T> T toJsonObj(String content, Class<T> valueType)  throws IOException {
+		ObjectMapper mapper = new ObjectMapper();
+		mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+		return mapper.readValue( content, valueType);
+	}
+
+	public static <T> String toJsonString(T object) {
+		ObjectMapper mapper = new ObjectMapper();
+		mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+		try {
+			return mapper.writeValueAsString(object);
+		} catch (JsonProcessingException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+
+
+	/**
+	 *
+	 * The resource maps the created MCJ
+	 * @param rSpecRef
+	 * @param sOrder
+	 * @param aService
+	 * @return
+	 */
+	private Resource createRelatedResource(ResourceSpecificationRef rSpecRef, ServiceOrder sOrder, Service aService) {
+
+		ResourceCreate resCreate = new ResourceCreate();
+		resCreate.setName(   rSpecRef.getName() + "-" + aService.getId() );
+		resCreate.setStartOperatingDate( aService.getStartDate() );
+		resCreate.setEndOperatingDate(aService.getEndDate());
+		resCreate.setResourceStatus (ResourceStatusType.RESERVED);
+
+		ResourceSpecificationRef rSpecRefObj = new ResourceSpecificationRef() ;
+		rSpecRefObj.id(rSpecRef.getId())
+				.name( rSpecRef.getName())
+				.setType(rSpecRef.getType());
+		resCreate.setResourceSpecification(rSpecRefObj);
+
+		org.etsi.osl.tmf.ri639.model.Characteristic resCharacteristicItem =  new org.etsi.osl.tmf.ri639.model.Characteristic();
+		resCharacteristicItem.setName( "_MT_MCJ_REF" );
+		resCharacteristicItem.setValueType( "TEXT" );
+		Any val = new Any();
+		val.setValue( "PENDING" );
+		val.setAlias( "PENDING" );
+		resCharacteristicItem.setValue( val );
+		resCreate.addResourceCharacteristicItem(  resCharacteristicItem );
+
+
+		// 1) need to copy the characteristics of the Resource Specification (use this instead of @param rSpecRef) and populate them with value from the aService (see GCOrchestrationService)
+		// 2) also need to populate the characteristic _MT_MCJ_REF with the UUID of the created MCJ / pass it as @param mcj
+
+		return serviceOrderManager.createResource( resCreate, sOrder, rSpecRef.getId() );
+	}
+
+}
diff --git a/src/main/java/org/etsi/osl/osom/management/OrderCompleteService.java b/src/main/java/org/etsi/osl/osom/management/OrderCompleteService.java
index 8f39cd0e6f790b6032eb4d02cbfded1f29068246..039f7ae306c04d82f4e920d251061e2199d4f24c 100644
--- a/src/main/java/org/etsi/osl/osom/management/OrderCompleteService.java
+++ b/src/main/java/org/etsi/osl/osom/management/OrderCompleteService.java
@@ -22,13 +22,18 @@ 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.tmf.common.model.service.Characteristic;
 import org.etsi.osl.tmf.common.model.service.Note;
 import org.etsi.osl.tmf.common.model.service.ResourceRef;
 import org.etsi.osl.tmf.common.model.service.ServiceRef;
 import org.etsi.osl.tmf.common.model.service.ServiceStateType;
+import org.etsi.osl.tmf.po622.model.ProductOrderStateType;
+import org.etsi.osl.tmf.po622.model.ProductOrderUpdate;
 import org.etsi.osl.tmf.ri639.model.Resource;
 import org.etsi.osl.tmf.sim638.model.Service;
 import org.etsi.osl.tmf.sim638.model.ServiceUpdate;
@@ -54,6 +59,9 @@ public class OrderCompleteService implements JavaDelegate {
 
     @Autowired
     private ServiceOrderManager serviceOrderManager;
+
+    @Autowired
+    private ProductOrderManager productOrderManager;
     
 
     @Autowired
@@ -112,6 +120,7 @@ public class OrderCompleteService implements JavaDelegate {
 			boolean existsInactiveInORder= false;
 			boolean existsTerminatedInORder= false;
 			//boolean updateServiceOrder= false;
+			Map<String, Characteristic> productOrderIds = new HashMap<>();
 			
 			logger.info("ServiceOrder id:" + sOrder.getId());
 			for (ServiceOrderItem soi : sOrder.getOrderItem()) {
@@ -192,6 +201,12 @@ public class OrderCompleteService implements JavaDelegate {
 				allTerminatedItemsInOrder = allTerminatedItemsInOrder && soi.getState().equals( ServiceOrderStateType.COMPLETED );
 
 				logger.info("ServiceOrderItem state:" + sserviceState.toString() );
+				
+				Characteristic prodOrderChar = soi.getService().findCharacteristicByName("_PRODUCT_ORDER_ID_");
+				if ( prodOrderChar != null ) {
+				  productOrderIds.put( prodOrderChar.getValue().getValue(), prodOrderChar);
+				}
+				
 			}
 			
 			   
@@ -221,6 +236,20 @@ public class OrderCompleteService implements JavaDelegate {
 				
 				serviceOrderManager.updateServiceOrderOrder( sOrder.getId() , serviceOrderUpd);
 
+				//pass the state to related product orders, if any
+				for (String prodOredIds : productOrderIds.keySet()) {
+				  ProductOrderUpdate productOrderUpd = new ProductOrderUpdate();
+				  
+				  if ( serviceOrderUpd.getState().equals( ServiceOrderStateType.COMPLETED ) ) {
+				    productOrderUpd.setState( ProductOrderStateType.COMPLETED );
+				  } else if ( serviceOrderUpd.getState().equals( ServiceOrderStateType.FAILED ) ) {
+                    productOrderUpd.setState( ProductOrderStateType.FAILED );
+                  }  
+				  
+				    
+				  productOrderManager.updateProducteOrder(prodOredIds, productOrderUpd);
+                }
+				
 			}
 			
 		}
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 8aa8166bf849b3dfeea36ce6db582bbb4aad9f81..6ca1a256c557b4bc19637f9722944796432b1749 100644
--- a/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java
+++ b/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java
@@ -67,6 +67,11 @@ public class ProcessCreateServiceRules implements JavaDelegate {
 			return;
 		}
 		
+		if ( spec == null) {
+          logger.debug("\tCannot retrieve ServiceSpec:" + contextServiceSpecId);
+		  return;
+		}
+		
 
 		/*
 		 * first find all referenced ServiceSpecs of a ServiceSpec to be created
diff --git a/src/main/java/org/etsi/osl/osom/management/ProcessOrderItemActionCheck.java b/src/main/java/org/etsi/osl/osom/management/ProcessOrderItemActionCheck.java
index 0b49e90173acc5353e5921f14aa6755a6472dc65..1addb48ebd457d2491c14dd30be0ed6e487497d9 100644
--- a/src/main/java/org/etsi/osl/osom/management/ProcessOrderItemActionCheck.java
+++ b/src/main/java/org/etsi/osl/osom/management/ProcessOrderItemActionCheck.java
@@ -34,6 +34,7 @@ public class ProcessOrderItemActionCheck implements JavaDelegate {
 		ServiceOrder sor = serviceOrderManager.retrieveServiceOrder((String) execution.getVariable("orderid"));
 		String orderItemIdToProcess = (String) execution.getVariable("orderItemId");
 		ServiceOrderItem soi = null;
+        execution.setVariable("saction", "NONE");            
 		
 		for (ServiceOrderItem i : sor.getOrderItem()) {
 			if (i.getUuid().equals( orderItemIdToProcess )){
@@ -46,7 +47,6 @@ public class ProcessOrderItemActionCheck implements JavaDelegate {
             logger.error("In ProcessOrderItemActionCheck cannot find ServiceOrderItem orderItemIdToProcess=:" + orderItemIdToProcess);
             logger.error("In ProcessOrderItemActionCheck cannot find ServiceOrderItem sor.getUuid()=:" + sor.getUuid() );
             logger.error("In ProcessOrderItemActionCheck cannot find ServiceOrderItem sor()=:" + sor.toString() );
-            execution.setVariable("saction", "NONE");            
 			return;
 		}
 		
diff --git a/src/main/java/org/etsi/osl/osom/management/ProductOrderManager.java b/src/main/java/org/etsi/osl/osom/management/ProductOrderManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..19b9d6eaa77d998d073519511f05e319f479bee8
--- /dev/null
+++ b/src/main/java/org/etsi/osl/osom/management/ProductOrderManager.java
@@ -0,0 +1,175 @@
+package org.etsi.osl.osom.management;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.camel.ProducerTemplate;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.etsi.osl.tmf.pcm620.model.ProductOffering;
+import org.etsi.osl.tmf.pcm620.model.ProductSpecification;
+import org.etsi.osl.tmf.po622.model.ProductOrder;
+import org.etsi.osl.tmf.po622.model.ProductOrderStateType;
+import org.etsi.osl.tmf.po622.model.ProductOrderUpdate;
+import org.etsi.osl.tmf.so641.model.ServiceOrder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import jakarta.validation.constraints.NotNull;
+
+@Service
+public class ProductOrderManager {
+
+
+  private static final transient Log logger =
+      LogFactory.getLog(ProductOrderManager.class.getName());
+
+
+  @Autowired
+  private ProducerTemplate template;
+
+  @Value("${CATALOG_GET_PRODUCTORDER_IDS_BY_STATE}")
+  private String CATALOG_GET_PRODUCTORDER_IDS_BY_STATE = "";
+
+  @Value("${CATALOG_GET_PRODUCTORDER_BY_ID}")
+  private String CATALOG_GET_PRODUCTORDER_BY_ID = "";
+
+
+  @Value("${CATALOG_UPD_PRODUCTORDER_BY_ID}")
+  private String CATALOG_UPD_PRODUCTORDER_BY_ID = "";
+
+
+  @Value("${CATALOG_GET_PRODUCTSPEC_BY_ID}")
+  private String CATALOG_GET_PRODUCTSPEC_BY_ID = "";
+
+
+  @Value("${CATALOG_GET_PRODUCTOFFERING_BY_ID}")
+  private String CATALOG_GET_PRODUCTOFFERING_BY_ID = "";
+  
+  
+
+  public List<String> retrieveOrdersByState(ProductOrderStateType orderState) {
+    logger.info("will retrieve Product Orders " + orderState.toString() + " from catalog ");
+    try {
+      Map<String, Object> map = new HashMap<>();
+      map.put("orderstate", orderState.toString());
+      Object response =
+          template.requestBodyAndHeaders(CATALOG_GET_PRODUCTORDER_IDS_BY_STATE, "", map);
+
+      logger.debug("will retrieve Service Orders " + orderState.toString()
+          + " from catalog response: " + response.getClass());
+      if (!(response instanceof String)) {
+        logger.error("List  object is wrong.");
+        return null;
+      }
+      // String[] sor = toJsonObj( (String)response, String[].class );
+
+      ArrayList<String> sor = toJsonObj((String) response, ArrayList.class);
+      logger.debug("retrieveOrdersByState response is: " + response);
+
+      // return asList(sor);
+      return sor;
+
+    } catch (Exception e) {
+      logger.error("Cannot retrieve Listof Product Orders " + orderState.toString()
+          + " from catalog. " + e.toString());
+    }
+    return null;
+  }
+
+  public ProductOrder retrieveProductOrder(String orderid) {
+    logger.info("will retrieve Product Order from catalog orderid=" + orderid);
+    try {
+      Object response = template.requestBody(CATALOG_GET_PRODUCTORDER_BY_ID, orderid);
+
+      if (!(response instanceof String)) {
+        logger.error("Product Order object is wrong.");
+        return null;
+      }
+      logger.debug("retrieveProductOrder response is: " + response);
+      ProductOrder sor = toJsonObj((String) response, ProductOrder.class);
+
+      return sor;
+
+    } catch (Exception e) {
+      logger.error("Cannot retrieve Product Order details from catalog. " + e.toString());
+    }
+    return null;
+  }
+
+
+
+  public ProductSpecification retrieveProductSpec(@NotNull String id) {
+    logger.info("will retrieve ProductSpecification from catalog orderid=" + id);
+    try {
+      Object response = template.requestBody(CATALOG_GET_PRODUCTSPEC_BY_ID, id);
+
+      if (!(response instanceof String)) {
+        logger.error("ProductSpecification object is wrong.");
+        return null;
+      }
+      logger.debug("retrieveProductSpecification response is: " + response);
+      ProductSpecification sor = toJsonObj((String) response, ProductSpecification.class);
+
+      return sor;
+
+    } catch (Exception e) {
+      logger.error("Cannot retrieve ProductSpecification  details from catalog. " + e.toString());
+    }
+    return null;
+  }
+
+  public ProductOffering retrieveProductOffering(@NotNull String id) {
+    logger.info("will retrieve ProductOffering from catalog orderid=" + id);
+    try {
+      Object response = template.requestBody(CATALOG_GET_PRODUCTOFFERING_BY_ID, id);
+
+      if (!(response instanceof String)) {
+        logger.error("ProductOffering object is wrong.");
+        return null;
+      }
+      logger.debug("retrievProductOffering response is: " + response);
+      ProductOffering sor = toJsonObj((String) response, ProductOffering.class);
+
+      return sor;
+
+    } catch (Exception e) {
+      logger.error("Cannot retrieve ProductOffering details from catalog. " + e.toString());
+    }
+    return null;
+  }
+
+
+
+  static <T> T toJsonObj(String content, Class<T> valueType) throws IOException {
+    ObjectMapper mapper = new ObjectMapper();
+    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+    return mapper.readValue(content, valueType);
+  }
+
+  static String toJsonString(Object object) throws IOException {
+    ObjectMapper mapper = new ObjectMapper();
+    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+    return mapper.writeValueAsString(object);
+  }
+
+  public void updateProducteOrder(String orderid, ProductOrderUpdate productOrderUpd) {
+    logger.info("will set Product Order in progress orderid=" + orderid);
+    try {
+
+      template.sendBodyAndHeader(CATALOG_UPD_PRODUCTORDER_BY_ID, toJsonString(productOrderUpd),
+          "orderid", orderid);
+
+
+    } catch (Exception e) {
+      logger.error("Cannot set Product Order status from catalog. " + e.toString());
+    }
+
+  }
+
+
+}
diff --git a/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java b/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java
index 6290743ba0d1e9f690c0fd62db7134e3f611de1e..54bc509931a98b683ede8b543afa2c023a7af1a4 100644
--- a/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java
+++ b/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java
@@ -35,11 +35,16 @@ import org.etsi.osl.model.nfv.DeploymentDescriptor;
 import org.etsi.osl.model.nfv.NetworkServiceDescriptor;
 import org.etsi.osl.model.nfv.ScaleDescriptor;
 import org.etsi.osl.osom.serviceactions.NSActionRequestPayload;
+import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob;
+import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobFVO;
 import org.etsi.osl.tmf.pm632.model.Organization;
+import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification;
+import org.etsi.osl.tmf.rcm634.model.ResourceSpecification;
 import org.etsi.osl.tmf.ri639.model.LogicalResource;
 import org.etsi.osl.tmf.ri639.model.PhysicalResource;
 import org.etsi.osl.tmf.ri639.model.Resource;
 import org.etsi.osl.tmf.ri639.model.ResourceCreate;
+import org.etsi.osl.tmf.ri639.model.ResourceUpdate;
 import org.etsi.osl.tmf.scm633.model.ServiceSpecification;
 import org.etsi.osl.tmf.sim638.model.ServiceActionQueueItem;
 import org.etsi.osl.tmf.sim638.model.ServiceCreate;
@@ -188,8 +193,14 @@ public class ServiceOrderManager {
     @Value("${CATALOG_GET_RESOURCE_BY_ID}")
     private String CATALOG_GET_RESOURCE_BY_ID = "";
     
+
+    @Value("${CATALOG_GET_RESOURCESPEC_BY_ID}")
+    private String CATALOG_GET_RESOURCESPEC_BY_ID = "";
+
+    @Value("${PM_MEASUREMENT_COLLECTION_JOB_ADD}")
+    private String PM_MEASUREMENT_COLLECTION_JOB_ADD = "";
+
     
-	
 	@Transactional
 	public void processOrder(ServiceOrder serviceOrder) {
 
@@ -1082,6 +1093,82 @@ public class ServiceOrderManager {
     
   }
 
+  public Resource gcGenericResourceDeploymentRequest(String queueName, Map<String, Object> map, ResourceUpdate aResource) {
+    try {
+
+      logger.debug("gcGenericResourceDeploymentRequest queueName=" + queueName);
+      
+      String req = toJsonString(aResource);
+      Object response = template.requestBodyAndHeaders( queueName, req , map );
+        
+
+        if ( !(response instanceof String)) {
+            logger.error("gcGenericResourceDeploymentRequest response object is wrong.");
+            return null;
+        }
+        logger.debug("gcGenericResourceDeploymentRequest response is: " + response);
+        Resource res = toJsonObj( (String)response, LogicalResource.class);
+        return  res;
+        
+    }catch (Exception e) {
+        logger.error("Cannot retrieve gcGenericResourceDeploymentRequest response. " + e.toString());
+        e.printStackTrace();
+    }
+    return null;
+  }
+  
+  
+
+  
+  /**
+   * get  service spec by id from model via bus
+   * @param id
+   * @return
+   * @throws IOException
+   */
+  public ResourceSpecification retrieveResourceSpec(String specid) {
+      logger.info("will retrieve Resource Specification id=" + specid   );
+      
+      try {
+          Object response = template.
+                  requestBody( CATALOG_GET_RESOURCESPEC_BY_ID, specid);
+
+          if ( !(response instanceof String)) {
+              logger.error("Resource Specification object is wrong.");
+              return null;
+          }
+          LogicalResourceSpecification sor = toJsonObj( (String)response, LogicalResourceSpecification.class); 
+          //logger.debug("retrieveSpec response is: " + response);
+          return sor;
+          
+      }catch (Exception e) {
+          logger.error("Cannot retrieve Resource Specification details from catalog. " + e.toString());
+      }
+      return null;
+  }
+  
+  
+  public MeasurementCollectionJob addMeasurementCollectionJob(MeasurementCollectionJobFVO mcjFVO) {
+
+    logger.debug("Will create a new Measurement Collection Job");
+    try {
+        Object response = template.
+                requestBody( PM_MEASUREMENT_COLLECTION_JOB_ADD, toJsonString(mcjFVO));
+        if ( !(response instanceof String)) {
+            logger.error("Measurement Collection Job object is wrong.");
+            return null;
+        }
+        logger.debug("retrieveMeasurementCollectionJobById response is: " + response);
+        MeasurementCollectionJob mcj = toJsonObj( (String)response, MeasurementCollectionJob.class);
+        return mcj;
+    }catch (Exception e) {
+        logger.error("Cannot create a new Measurement Collection Job. " + e.toString());
+    }
+    return null;
+}
+
+  
+
 
 
 }
diff --git a/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java b/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java
index 6bc7ce47c582184d1a9e7161655637b1df52461c..2602be868670d9edc9ab2d3551eab2a468768d99 100644
--- a/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java
+++ b/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java
@@ -2,21 +2,40 @@ package org.etsi.osl.osom.serviceactions;
 
 import java.time.OffsetDateTime;
 import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.etsi.osl.osom.management.ServiceOrderManager;
+import org.etsi.osl.tmf.common.model.AttachmentRefOrValue;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
 import org.etsi.osl.tmf.common.model.service.Note;
+import org.etsi.osl.tmf.common.model.service.ResourceRef;
+import org.etsi.osl.tmf.prm669.model.RelatedParty;
+import org.etsi.osl.tmf.ri639.model.Feature;
+import org.etsi.osl.tmf.ri639.model.Resource;
+import org.etsi.osl.tmf.ri639.model.ResourceCreate;
+import org.etsi.osl.tmf.ri639.model.ResourceRelationship;
+import org.etsi.osl.tmf.ri639.model.ResourceUpdate;
 import org.etsi.osl.tmf.sim638.model.Service;
+import org.etsi.osl.tmf.sim638.model.ServiceActionQueueAction;
 import org.etsi.osl.tmf.sim638.model.ServiceActionQueueItem;
+import org.etsi.osl.tmf.sim638.model.ServiceOrderRef;
 import org.etsi.osl.tmf.sim638.model.ServiceUpdate;
 import org.flowable.engine.delegate.DelegateExecution;
 import org.flowable.engine.delegate.JavaDelegate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
+import jakarta.validation.Valid;
 
 @Component(value = "AutomaticallyHandleAction") //bean name
 public class AutomaticallyHandleAction  implements JavaDelegate {
@@ -31,7 +50,8 @@ public class AutomaticallyHandleAction  implements JavaDelegate {
     
 	public void execute(DelegateExecution execution) {
 		
-		logger.info("AutomaticallyHandleAction:" + execution.getVariableNames().toString() );
+		logger.debug("AutomaticallyHandleAction:" + execution.getVariableNames().toString() );
+	    logger.debug("VariableNames:" + execution.getVariableNames().toString());
 		
 		
 		ObjectMapper mapper = new ObjectMapper();
@@ -42,12 +62,85 @@ public class AutomaticallyHandleAction  implements JavaDelegate {
 			item = mapper.readValue( execution.getVariable("serviceActionItem").toString(), ServiceActionQueueItem.class);
 			aService = mapper.readValue( execution.getVariable("Service").toString(), Service.class);
 			
+			if ( aService.getSupportingResource().stream().findFirst().isPresent() ) { //there is a resourceRef			  
+
+	            ResourceRef rr = aService.getSupportingResource().stream().findFirst().get();
+	            
+	            Resource relatedResource = serviceOrderManager.retrieveResource( rr.getId() );
+	            
+	            ResourceUpdate aResourceUpdate = resourceToResourceUpdate(relatedResource);
+	            
+	            //pass characteristic values from services to resource
+	            Optional<ServiceOrderRef> sref = aService.getServiceOrder().stream().findFirst();
+	            String serviceOrderID="";
+	            if ( sref.isPresent()) {
+	              serviceOrderID = sref.get().getId();
+	            }
+
+                Boolean allServiceAndResourceCharacteristicsAreTheSame = true;
+                Boolean onlyStatusCharacteristicsChanged = true;
+	            for (org.etsi.osl.tmf.ri639.model.Characteristic resCharacteristic : aResourceUpdate.getResourceCharacteristic()) {
+	               Characteristic servChar = aService.getServiceCharacteristicByName( resCharacteristic.getName() );
+	              if ( servChar !=null) {      
+	                //we need to check if the characteristics that changed are only from the resources (e.g. start with status. )
+	                //if there are only from resources then we will not snd back an update request, otherwise we get into an infinite loop
+	                if ( resCharacteristic.getValue().getValue() != null && 
+	                    servChar.getValue().getValue()  != null &&
+	                    !resCharacteristic.getValue().getValue().equals( servChar.getValue().getValue() ) ) {
+	                  allServiceAndResourceCharacteristicsAreTheSame = false;
+                      if ( !servChar.getValue().getValue().startsWith("status.") ) {
+                        onlyStatusCharacteristicsChanged = false;
+                      } else {
+
+                        logger.debug("Only Status Characteristic Changed. Will not update the resource!" );
+                      }
+                    }
+	                
+
+                    resCharacteristic.getValue().setValue( servChar.getValue().getValue() );
+	                
+	              }
+	            } 
+	            
+	            
+	            try{
+	              
+	                Resource response = null;
+	                
+	                if ( item.getAction().equals( ServiceActionQueueAction.EVALUATE_CHARACTERISTIC_CHANGED  ) 
+	                    || item.getAction().equals( ServiceActionQueueAction.EVALUATE_CHILD_CHARACTERISTIC_CHANGED  ) 
+	                    || item.getAction().equals( ServiceActionQueueAction.EVALUATE_CHARACTERISTIC_CHANGED_MANODAY2  ) ) {
+	                    
+	                  if ( !onlyStatusCharacteristicsChanged && !allServiceAndResourceCharacteristicsAreTheSame) {
+	                      response = createNewResourceDeploymentRequest(aService, 
+	                            relatedResource, aResourceUpdate,  
+	                            serviceOrderID );     
+	                    
+	                  }            
+	                } else {
+
+	                  response = createNewResourceDeleteRequest(aService, 
+	                        relatedResource, aResourceUpdate,  
+	                        serviceOrderID );  
+	                }
+	                
+	              
+	            }catch (Exception e) {
+	              e.printStackTrace();
+	            }
+			  
+			  
+			}
+			
+			
+			
 			ServiceUpdate supd = new ServiceUpdate();
 			Note n = new Note();
 			n.setText("Service Action AutomaticallyHandleAction. Action: " + item.getAction() );
 			n.setAuthor( compname );
 			n.setDate( OffsetDateTime.now(ZoneOffset.UTC).toString() );
 			supd.addNoteItem( n );
+			
 			serviceOrderManager.deleteServiceActionQueueItem( item );			
 			serviceOrderManager.updateService( aService.getId() , supd, false);
 			
@@ -60,5 +153,113 @@ public class AutomaticallyHandleAction  implements JavaDelegate {
 			return;
 		}
 	}
+	
+	
+    private ResourceUpdate resourceToResourceUpdate(Resource source) {
+      if ( source == null ) {
+          return null;
+      }
+
+      ResourceUpdate resourceUpdate = new ResourceUpdate();
+
+      resourceUpdate.setCategory( source.getCategory() );
+      resourceUpdate.setDescription( source.getDescription() );
+      resourceUpdate.setEndOperatingDate( source.getEndOperatingDate() );
+      resourceUpdate.setName( source.getName() );
+      resourceUpdate.setResourceVersion( source.getResourceVersion() );
+      resourceUpdate.setStartOperatingDate( source.getStartOperatingDate() );
+      Set<Feature> set = source.getActivationFeature();
+      if ( set != null ) {
+          resourceUpdate.setActivationFeature( new ArrayList<Feature>( set ) );
+      }
+      resourceUpdate.setAdministrativeState( source.getAdministrativeState() );
+      Set<AttachmentRefOrValue> set1 = source.getAttachment();
+      if ( set1 != null ) {
+          resourceUpdate.setAttachment( new ArrayList<AttachmentRefOrValue>( set1 ) );
+      }
+      Set<Note> set2 = source.getNote();
+      if ( set2 != null ) {
+          resourceUpdate.setNote( new ArrayList<Note>( set2 ) );
+      }
+      resourceUpdate.setOperationalState( source.getOperationalState() );
+      resourceUpdate.setPlace( source.getPlace() );
+      Set<RelatedParty> set3 = source.getRelatedParty();
+      if ( set3 != null ) {
+          resourceUpdate.setRelatedParty( new ArrayList<RelatedParty>( set3 ) );
+      }
+      @Valid Set<org.etsi.osl.tmf.ri639.model.Characteristic> set4 = source.getResourceCharacteristic();
+      if ( set4 != null ) {
+          resourceUpdate.setResourceCharacteristic( new ArrayList<org.etsi.osl.tmf.ri639.model.Characteristic>( set4 ) );
+      }
+      Set<ResourceRelationship> set5 = source.getResourceRelationship();
+      if ( set5 != null ) {
+          resourceUpdate.setResourceRelationship( new ArrayList<ResourceRelationship>( set5 ) );
+      }
+      resourceUpdate.setResourceSpecification( source.getResourceSpecification() );
+      resourceUpdate.setResourceStatus( source.getResourceStatus() );
+      resourceUpdate.setUsageState( source.getUsageState() );
+
+      return resourceUpdate;
+  }
+    
+    private Resource createNewResourceDeploymentRequest( Service aService, 
+        Resource resourceI,
+        ResourceUpdate aResourceUpdate, 
+        String orderId) {
+
+      try {
+        Map<String, Object> map = new HashMap<>();
+        map.put("org.etsi.osl.serviceId", aService.getId() );
+        map.put("org.etsi.osl.resourceId", resourceI.getId() );
+        map.put("org.etsi.osl.prefixName", "gr" + resourceI.getId().substring(0, 8) );
+        map.put("org.etsi.osl.serviceOrderId", orderId );
+        
+
+        logger.debug("createNewResourceDeploymentRequest ");
+        
+        String queueName = "jms:queue:UPDATE/"+ aResourceUpdate.getCategory() + "/" + aResourceUpdate.getResourceVersion() ;
+        Resource response  = serviceOrderManager.gcGenericResourceDeploymentRequest(queueName , map, aResourceUpdate);
+        
+
+        return response;
+        
+      } catch (Exception e) {
+        logger.error("cridgeDeploymentRequest failed");
+        e.printStackTrace();
+      }
+
+      return null;
+
+    }
+    
+    private Resource createNewResourceDeleteRequest( Service aService, 
+        Resource resourceI,
+        ResourceUpdate aResourceUpdate, 
+        String orderId) {
+
+      try {
+        Map<String, Object> map = new HashMap<>();
+        map.put("org.etsi.osl.serviceId", aService.getId() );
+        map.put("org.etsi.osl.resourceId", resourceI.getId() );
+        map.put("org.etsi.osl.prefixName", "gr" + resourceI.getId().substring(0, 8) );
+        map.put("org.etsi.osl.serviceOrderId", orderId );
+        
+
+        logger.debug("createNewResourceDeploymentRequest ");
+        
+        String queueName = "jms:queue:DELETE/"+ aResourceUpdate.getCategory() + "/" + aResourceUpdate.getResourceVersion() ;
+        Resource response  = serviceOrderManager.gcGenericResourceDeploymentRequest(queueName , map, aResourceUpdate);
+        
+
+        return response;
+        
+      } catch (Exception e) {
+        logger.error("cridgeDeploymentRequest failed");
+        e.printStackTrace();
+      }
+
+      return null;
+
+    }
 
 }
diff --git a/src/main/resources/GenericResourceController.md b/src/main/resources/GenericResourceController.md
new file mode 100644
index 0000000000000000000000000000000000000000..55b4418af999439233e07bcd686f853d816a0316
--- /dev/null
+++ b/src/main/resources/GenericResourceController.md
@@ -0,0 +1,90 @@
+@startuml
+
+group Controller Startup [Controller Registration]
+
+	control "ResourceController" as ResourceController
+	entity "TMFAPI" as TMFAPI
+	queue MQa
+	
+    ResourceController -> MQa: RegisterResourceSpec
+    MQa -> TMFAPI: RegisterResourceSpec
+    note left
+    	Register a ResourceSpec with
+    	Name, Category, Version
+    end note
+    ResourceController -> MQa: QueueRegister
+    note left
+    	CREATE/<category_name>/<version>
+    	UPDATE/<category_name>/<version>
+    	DELETE/<category_name>/<version>    
+    end note
+
+	
+end	
+
+
+group Create RFS [Create RFS and underlying resource]
+	control "ResourceController" as ResourceController
+	entity "TMFAPI" as TMFAPI
+	queue MQa
+	entity "OSOM" as OSOM
+
+
+    TMFAPI -> OSOM: ServiceOrderCreate
+
+    OSOM -> OSOM: ServiceCreateTMF
+    	OSOM->MQa    : ServiceCreateMSG
+    	MQa -> TMFAPI: ServiceCreateMSG    	
+    	activate TMFAPI
+    	return Service 
+    	MQa -> OSOM: Service
+    	
+    	OSOM -> OSOM: ResourceCreateTMF
+    	
+    	OSOM->MQa    : ResourceCreateMSG
+    	MQa -> TMFAPI: ResourceCreate MSG   	
+    	activate TMFAPI
+    	return Resource 
+    	MQa -> OSOM: Resource       
+    	
+    		
+    	OSOM -> OSOM: ResourceDeployment
+    	OSOM -> MQa    : CreateGenericResourceMSG
+    	note left
+    		Header contains
+    		more metadata
+    		(ServiceID, ResourceID, OrderID)    	    
+    	end note
+    	MQa -> ResourceController: CreateGenericResourceMSG [CREATE/<category_name>/<version>]
+    	
+    	OSOM -> OSOM: WaitFor resourceStatus
+
+end
+
+
+group Resource Controller Process[Process underlying resource]
+    	ResourceController -> ResourceController: ProcessRequest
+
+    	ResourceController->MQa    : ResourceUpdate
+    	MQa -> TMFAPI: ResourceUpdate   
+    	activate TMFAPI
+    	return Resource  	
+    	MQa -> ResourceController: Resource  
+
+end
+
+group OSOM Check Deployment [Wait for underlying resource]
+    	OSOM -> OSOM: WaitFor resourceStatus
+    	OSOM->MQa: Check GETResource
+    	MQa -> TMFAPI: GETResource  
+    	activate TMFAPI
+    	return Resource  	
+    	MQa -> OSOM: Resource  
+    	note left
+    		Check resource Status
+    		(e.g. ACTIVE or RESERVED or ALARM)   	    
+    	end note
+end
+	
+
+@enduml
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index fd9ed495e9e7ac6aac458ce40f605294166ee911..55f42c5636cfe3b05067d1761724e6c8d98b354e 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,6 +1,9 @@
 server:
   port: 13689
     
+flowable:
+  history-level: none    
+  
 spring:
   application:
     name: openslice-osom
@@ -75,6 +78,19 @@ NFV_CATALOG_GET_NSD_BY_ID: "jms:queue:NFVCATALOG.GET.NSD_BY_ID"
 NFV_CATALOG_UPD_DEPLOYMENT_BY_ID: "jms:queue:NFVCATALOG.UPD.DEPLOYMENT_BY_ID"
 NFV_CATALOG_NS_DAY2_ACTION: "jms:queue:ns.action.run"
 
+CATALOG_GET_PRODUCTSPEC_BY_ID: "jms:queue:CATALOG.GET.PRODUCTSPEC_BY_ID"
+CATALOG_ADD_PRODUCTSPEC: "jms:queue:CATALOG.ADD.PRODUCTSPEC"
+CATALOG_UPD_PRODUCTSPEC: "jms:queue:CATALOG.UPD.PRODUCTSPEC"
+CATALOG_UPDADD_PRODUCTSPEC: "jms:queue:CATALOG.UPDADD.PRODUCTSPEC"
+CATALOG_GET_PRODUCTOFFERING_BY_ID: "jms:queue:CATALOG.GET.PRODUCTOFFERING_BY_ID"
+
+CATALOG_GET_PRODUCTORDERS: "jms:queue:CATALOG.GET.PRODUCTORDERS"
+CATALOG_GET_PRODUCTORDER_BY_ID: "jms:queue:CATALOG.GET.PRODUCTORDER_BY_ID"
+CATALOG_ADD_PRODUCTORDER: "jms:queue:CATALOG.ADD.PRODUCTORDER"
+CATALOG_UPD_PRODUCTORDER_BY_ID: "jms:queue:CATALOG.UPD.PRODUCTORDER_BY_ID"
+CATALOG_GET_INITIAL_PRODUCTORDERS_IDS: "jms:queue:CATALOG.GET.INITIAL_PRODUCTORDERS"
+CATALOG_GET_PRODUCTORDER_IDS_BY_STATE: "jms:queue:CATALOG.GET.ACKNOWLEDGED_PRODUCTORDERS"
+
 #NS ACTIONS
 NFV_CATALOG_NSACTIONS_SCALE: "jms:queue:NSACTIONS.SCALE"
 
@@ -103,9 +119,12 @@ CATALOG_ADD_RESOURCESPEC: "jms:queue:CATALOG.ADD.RESOURCESPEC"
 CATALOG_UPD_RESOURCESPEC: "jms:queue:CATALOG.UPD.RESOURCESPEC"
 CATALOG_UPDADD_RESOURCESPEC: "jms:queue:CATALOG.UPDADD.RESOURCESPEC"
 CATALOG_GET_RESOURCESPEC_BY_ID: "jms:queue:CATALOG.GET.RESOURCESPEC_BY_ID"
-CATALOG_GET_RESOURCESPEC_BY_ΝAME_CATEGORY: "jms:queue:CATALOG.GET.RESOURCESPEC_BY_ΝAME_CATEGORY"
+CATALOG_GET_RESOURCESPEC_BY_NAME_CATEGORY: "jms:queue:CATALOG.GET.RESOURCESPEC_BY_NAME_CATEGORY"
 
 #CRD ACTIONS
 CRD_DEPLOY_CR_REQ: "jms:queue:CRD.DEPLOY.CR_REQ"
 CRD_DELETE_CR_REQ: "jms:queue:CRD.DELETE.CR_REQ"
-CRD_PATCH_CR_REQ: "jms:queue:CRD.PATCH.CR_REQ"
\ No newline at end of file
+CRD_PATCH_CR_REQ: "jms:queue:CRD.PATCH.CR_REQ"
+
+#TMF628 ACTIONS
+PM_MEASUREMENT_COLLECTION_JOB_ADD:         "jms:queue:PM.MEASUREMENTCOLLECTIONJOB.ADD"
\ No newline at end of file
diff --git a/src/main/resources/processes/GenericControllerDeploymentReq.bpmn b/src/main/resources/processes/GenericControllerDeploymentReq.bpmn
new file mode 100644
index 0000000000000000000000000000000000000000..ac06cd088d00f287bd0571384f7c441b62161aa7
--- /dev/null
+++ b/src/main/resources/processes/GenericControllerDeploymentReq.bpmn
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
+  <process id="procGenericControllerDeploymentRequest" name="Generic Controller Deployment Request process" isExecutable="true">
+    <startEvent id="startevent1" name="Start"></startEvent>
+    <serviceTask id="stGCCreatetask" name="Generic Controller Create Task" activiti:delegateExpression="${gcOrchestrationService}"></serviceTask>
+    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="stGCCreatetask"></sequenceFlow>
+    <serviceTask id="stCheckGCServiceDeployment" name="Check Generic Controller Service Deployment" activiti:delegateExpression="${gcOrchestrationCheckDeploymentService}"></serviceTask>
+    <sequenceFlow id="flow2" sourceRef="stGCCreatetask" targetRef="stCheckGCServiceDeployment"></sequenceFlow>
+    <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
+    <sequenceFlow id="flow3" sourceRef="stCheckGCServiceDeployment" targetRef="exclusivegateway1"></sequenceFlow>
+    <intermediateCatchEvent id="timerintermediatecatchevent1" name="Timer start wait 30 secs">
+      <timerEventDefinition>
+        <timeDuration>PT30S</timeDuration>
+      </timerEventDefinition>
+    </intermediateCatchEvent>
+    <sequenceFlow id="flowserviceDeploymentNotFinished" name="Service Deployment Not Finished" sourceRef="exclusivegateway1" targetRef="timerintermediatecatchevent1">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!serviceDeploymentFinished}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow5" sourceRef="timerintermediatecatchevent1" targetRef="stCheckGCServiceDeployment"></sequenceFlow>
+    <endEvent id="endevent1" name="End"></endEvent>
+    <sequenceFlow id="flowServiceDeploymentFinished" name="Service Deployment Finished" sourceRef="exclusivegateway1" targetRef="endevent1">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${serviceDeploymentFinished}]]></conditionExpression>
+    </sequenceFlow>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_procGenericControllerDeploymentRequest">
+    <bpmndi:BPMNPlane bpmnElement="procGenericControllerDeploymentRequest" id="BPMNPlane_procGenericControllerDeploymentRequest">
+      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="121.0" y="145.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="stGCCreatetask" id="BPMNShape_stGCCreatetask">
+        <omgdc:Bounds height="63.0" width="105.0" x="210.0" y="130.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="stCheckGCServiceDeployment" id="BPMNShape_stCheckGCServiceDeployment">
+        <omgdc:Bounds height="83.0" width="111.0" x="390.0" y="120.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
+        <omgdc:Bounds height="40.0" width="40.0" x="700.0" y="147.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="timerintermediatecatchevent1" id="BPMNShape_timerintermediatecatchevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="593.0" y="250.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="850.0" y="150.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="156.0" y="162.0"></omgdi:waypoint>
+        <omgdi:waypoint x="210.0" y="161.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <omgdi:waypoint x="315.0" y="161.0"></omgdi:waypoint>
+        <omgdi:waypoint x="390.0" y="161.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="501.0" y="161.0"></omgdi:waypoint>
+        <omgdi:waypoint x="700.0" y="167.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flowserviceDeploymentNotFinished" id="BPMNEdge_flowserviceDeploymentNotFinished">
+        <omgdi:waypoint x="720.0" y="187.0"></omgdi:waypoint>
+        <omgdi:waypoint x="719.0" y="267.0"></omgdi:waypoint>
+        <omgdi:waypoint x="628.0" y="267.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="42.0" width="100.0" x="721.0" y="208.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
+        <omgdi:waypoint x="593.0" y="267.0"></omgdi:waypoint>
+        <omgdi:waypoint x="445.0" y="267.0"></omgdi:waypoint>
+        <omgdi:waypoint x="445.0" y="203.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flowServiceDeploymentFinished" id="BPMNEdge_flowServiceDeploymentFinished">
+        <omgdi:waypoint x="740.0" y="167.0"></omgdi:waypoint>
+        <omgdi:waypoint x="850.0" y="167.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="42.0" width="100.0" x="739.0" y="132.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>
\ No newline at end of file
diff --git a/src/main/resources/processes/MetricoDeploymentReq.bpmn b/src/main/resources/processes/MetricoDeploymentReq.bpmn
new file mode 100644
index 0000000000000000000000000000000000000000..c931982d3438fea8d68082924fe5b76c9fa1f807
--- /dev/null
+++ b/src/main/resources/processes/MetricoDeploymentReq.bpmn
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
+  <process id="procMetricoDeploymentRequest" name="Metrico Deployment Request" isExecutable="true">
+    <startEvent id="startevent1" name="Start"></startEvent>
+    <serviceTask id="stMetricoCreateTask" name="Metrico Create Task" activiti:delegateExpression="${metricoOrchestrationService}"></serviceTask>
+    <serviceTask id="stCheckMetricoServiceDeployment" name="Check METRICO Service Deployment" activiti:delegateExpression="${metricoOrchestrationCheckDeploymentService}"></serviceTask>
+    <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
+    <intermediateCatchEvent id="timerintermediatecatchevent1" name="TimerCatchEvent">
+      <timerEventDefinition>
+        <timeDuration>PT30S</timeDuration>
+      </timerEventDefinition>
+    </intermediateCatchEvent>
+    <sequenceFlow id="flow3" sourceRef="stCheckMetricoServiceDeployment" targetRef="exclusivegateway1"></sequenceFlow>
+    <sequenceFlow id="flow4" sourceRef="exclusivegateway1" targetRef="timerintermediatecatchevent1">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!serviceDeploymentFinished}]]></conditionExpression>
+    </sequenceFlow>
+    <endEvent id="endevent1" name="End"></endEvent>
+    <sequenceFlow id="flow5" sourceRef="exclusivegateway1" targetRef="endevent1"></sequenceFlow>
+    <sequenceFlow id="flow6" sourceRef="timerintermediatecatchevent1" targetRef="stCheckMetricoServiceDeployment"></sequenceFlow>
+    <sequenceFlow id="flow7" sourceRef="stMetricoCreateTask" targetRef="stCheckMetricoServiceDeployment"></sequenceFlow>
+    <sequenceFlow id="flow8" sourceRef="startevent1" targetRef="stMetricoCreateTask"></sequenceFlow>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_procMetricoDeploymentRequest">
+    <bpmndi:BPMNPlane bpmnElement="procMetricoDeploymentRequest" id="BPMNPlane_procMetricoDeploymentRequest">
+      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="120.0" y="165.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="stMetricoCreateTask" id="BPMNShape_stMetricoCreateTask">
+        <omgdc:Bounds height="91.0" width="105.0" x="250.0" y="140.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="stCheckMetricoServiceDeployment" id="BPMNShape_stCheckMetricoServiceDeployment">
+        <omgdc:Bounds height="91.0" width="105.0" x="500.0" y="140.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
+        <omgdc:Bounds height="40.0" width="40.0" x="800.0" y="165.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="timerintermediatecatchevent1" id="BPMNShape_timerintermediatecatchevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="650.0" y="330.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="950.0" y="165.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="605.0" y="185.0"></omgdi:waypoint>
+        <omgdi:waypoint x="800.0" y="185.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
+        <omgdi:waypoint x="820.0" y="205.0"></omgdi:waypoint>
+        <omgdi:waypoint x="820.0" y="347.0"></omgdi:waypoint>
+        <omgdi:waypoint x="685.0" y="347.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
+        <omgdi:waypoint x="840.0" y="185.0"></omgdi:waypoint>
+        <omgdi:waypoint x="950.0" y="182.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
+        <omgdi:waypoint x="650.0" y="347.0"></omgdi:waypoint>
+        <omgdi:waypoint x="552.0" y="347.0"></omgdi:waypoint>
+        <omgdi:waypoint x="552.0" y="231.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
+        <omgdi:waypoint x="355.0" y="185.0"></omgdi:waypoint>
+        <omgdi:waypoint x="500.0" y="185.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
+        <omgdi:waypoint x="155.0" y="182.0"></omgdi:waypoint>
+        <omgdi:waypoint x="250.0" y="185.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>
\ No newline at end of file
diff --git a/src/main/resources/processes/ProcessOrderItemProcess.bpmn b/src/main/resources/processes/ProcessOrderItemProcess.bpmn
index 4f386ce6a8bc381dd822dce0f16c5f7092f9d025..a6b64894f9cb0d6ea343ef4c579a1dadf472424e 100644
--- a/src/main/resources/processes/ProcessOrderItemProcess.bpmn
+++ b/src/main/resources/processes/ProcessOrderItemProcess.bpmn
@@ -26,6 +26,9 @@
     <sequenceFlow id="flow30" sourceRef="stActionDELETE" targetRef="stProcesOrderItemComplete"></sequenceFlow>
     <sequenceFlow id="flow31" sourceRef="stProcesOrderItemComplete" targetRef="endevent2"></sequenceFlow>
     <sequenceFlow id="flow32" sourceRef="stActionADD" targetRef="CreateServiceProcess"></sequenceFlow>
+    <sequenceFlow id="flow33" name="saction=='NONE'" sourceRef="exclusivegateway1" targetRef="endevent2">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${saction=='NONE'}]]></conditionExpression>
+    </sequenceFlow>
   </process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_ProcessOrderItem">
     <bpmndi:BPMNPlane bpmnElement="ProcessOrderItem" id="BPMNPlane_ProcessOrderItem">
@@ -85,7 +88,7 @@
         <omgdi:waypoint x="320.0" y="367.0"></omgdi:waypoint>
         <omgdi:waypoint x="464.0" y="367.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="88.0" x="340.0" y="339.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="340.0" y="339.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow28" id="BPMNEdge_flow28">
@@ -111,6 +114,15 @@
         <omgdi:waypoint x="515.0" y="87.0"></omgdi:waypoint>
         <omgdi:waypoint x="560.0" y="87.0"></omgdi:waypoint>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow33" id="BPMNEdge_flow33">
+        <omgdi:waypoint x="320.0" y="197.0"></omgdi:waypoint>
+        <omgdi:waypoint x="319.0" y="467.0"></omgdi:waypoint>
+        <omgdi:waypoint x="867.0" y="467.0"></omgdi:waypoint>
+        <omgdi:waypoint x="867.0" y="191.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="14.0" width="100.0" x="335.0" y="449.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </definitions>
\ No newline at end of file
diff --git a/src/main/resources/processes/ProductOrderProcess.bpmn b/src/main/resources/processes/ProductOrderProcess.bpmn
new file mode 100644
index 0000000000000000000000000000000000000000..8ae9ca75079f46ec2375cc3f145e07dce3a07acc
--- /dev/null
+++ b/src/main/resources/processes/ProductOrderProcess.bpmn
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
+  <process id="ProductOrderSchedulerProcess" name="My process" isExecutable="true">
+    <startEvent id="timerstarteventProdOrders" name="Timer start">
+      <timerEventDefinition>
+        <timeCycle>0 0/1 * * * ?</timeCycle>
+      </timerEventDefinition>
+    </startEvent>
+    <serviceTask id="stFetchAcknowledgedProductOrders" name="Fetch Acknowledged Product Orders" activiti:delegateExpression="${fetchAcknowledgedProductOrders}"></serviceTask>
+    <sequenceFlow id="flow1" sourceRef="timerstarteventProdOrders" targetRef="stFetchAcknowledgedProductOrders"></sequenceFlow>
+    <endEvent id="endevent1" name="End"></endEvent>
+    <sequenceFlow id="flow2" sourceRef="stFetchAcknowledgedProductOrders" targetRef="stInitializeProcessProductOrder"></sequenceFlow>
+    <serviceTask id="stInitializeProcessProductOrder" name="Initialize Process Product Order" activiti:delegateExpression="${initializeProcessProductOrders}"></serviceTask>
+    <sequenceFlow id="flow3" sourceRef="stInitializeProcessProductOrder" targetRef="endevent1"></sequenceFlow>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_ProductOrderSchedulerProcess">
+    <bpmndi:BPMNPlane bpmnElement="ProductOrderSchedulerProcess" id="BPMNPlane_ProductOrderSchedulerProcess">
+      <bpmndi:BPMNShape bpmnElement="timerstarteventProdOrders" id="BPMNShape_timerstarteventProdOrders">
+        <omgdc:Bounds height="35.0" width="35.0" x="60.0" y="148.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="stFetchAcknowledgedProductOrders" id="BPMNShape_stFetchAcknowledgedProductOrders">
+        <omgdc:Bounds height="71.0" width="121.0" x="190.0" y="130.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="580.0" y="148.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="stInitializeProcessProductOrder" id="BPMNShape_stInitializeProcessProductOrder">
+        <omgdc:Bounds height="71.0" width="141.0" x="380.0" y="130.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="95.0" y="165.0"></omgdi:waypoint>
+        <omgdi:waypoint x="190.0" y="165.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <omgdi:waypoint x="311.0" y="165.0"></omgdi:waypoint>
+        <omgdi:waypoint x="380.0" y="165.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="521.0" y="165.0"></omgdi:waypoint>
+        <omgdi:waypoint x="580.0" y="165.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>
\ No newline at end of file
diff --git a/src/main/resources/processes/ServiceCreationProcess.bpmn b/src/main/resources/processes/ServiceCreationProcess.bpmn
index cce6e034f6554cedf624ec3ba6e2a9df7300dd85..c2b30e719d3a1016dfbc59817606b7472bc94954 100644
--- a/src/main/resources/processes/ServiceCreationProcess.bpmn
+++ b/src/main/resources/processes/ServiceCreationProcess.bpmn
@@ -80,6 +80,16 @@
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${brokeActivity=='RFS_CRSPEC'}]]></conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="flow44" sourceRef="parallelActivityCRDeploymentReq" targetRef="servicetaskCheckForCreatedServices"></sequenceFlow>
+    <callActivity id="activityGenericResourceDeploymentReq" name="Generic Resource Deployment Request" calledElement="procGenericControllerDeploymentRequest" activiti:inheritVariables="true"></callActivity>
+    <sequenceFlow id="flow45" name="brokeActivity==&quot;GRSPEC&quot;" sourceRef="exclusivegateway2" targetRef="activityGenericResourceDeploymentReq">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${brokeActivity=='GRSPEC'}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow46" sourceRef="activityGenericResourceDeploymentReq" targetRef="servicetaskCheckForCreatedServices"></sequenceFlow>
+    <callActivity id="parallelMetricoReq" name="Metrico Request" activiti:async="true" calledElement="procMetricoDeploymentRequest" activiti:inheritVariables="true"></callActivity>
+    <sequenceFlow id="flow47" sourceRef="parallelMetricoReq" targetRef="servicetaskCheckForCreatedServices"></sequenceFlow>
+    <sequenceFlow id="flow48" name="brokeActivity==&quot;RFS_MTSPEC&quot;" sourceRef="exclusivegateway2" targetRef="parallelMetricoReq">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${brokeActivity=='RFS_MTSPEC'}]]></conditionExpression>
+    </sequenceFlow>
   </process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_CreateServiceProcess">
     <bpmndi:BPMNPlane bpmnElement="CreateServiceProcess" id="BPMNPlane_CreateServiceProcess">
@@ -140,6 +150,12 @@
       <bpmndi:BPMNShape bpmnElement="parallelActivityCRDeploymentReq" id="BPMNShape_parallelActivityCRDeploymentReq">
         <omgdc:Bounds height="90.0" width="129.0" x="1094.0" y="332.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="activityGenericResourceDeploymentReq" id="BPMNShape_activityGenericResourceDeploymentReq">
+        <omgdc:Bounds height="71.0" width="130.0" x="1094.0" y="820.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="parallelMetricoReq" id="BPMNShape_parallelMetricoReq">
+        <omgdc:Bounds height="71.0" width="121.0" x="1070.0" y="900.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge bpmnElement="flow19" id="BPMNEdge_flow19">
         <omgdi:waypoint x="72.0" y="230.0"></omgdi:waypoint>
         <omgdi:waypoint x="100.0" y="231.0"></omgdi:waypoint>
@@ -156,7 +172,7 @@
         <omgdi:waypoint x="557.0" y="250.0"></omgdi:waypoint>
         <omgdi:waypoint x="557.0" y="326.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="70.0" width="100.0" x="567.0" y="256.0"></omgdc:Bounds>
+          <omgdc:Bounds height="65.0" width="100.0" x="567.0" y="256.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow23" id="BPMNEdge_flow23">
@@ -168,7 +184,7 @@
         <omgdi:waypoint x="577.0" y="230.0"></omgdi:waypoint>
         <omgdi:waypoint x="711.0" y="230.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="42.0" width="100.0" x="576.0" y="197.0"></omgdc:Bounds>
+          <omgdc:Bounds height="39.0" width="100.0" x="576.0" y="197.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow25" id="BPMNEdge_flow25">
@@ -184,7 +200,7 @@
         <omgdi:waypoint x="907.0" y="283.0"></omgdi:waypoint>
         <omgdi:waypoint x="1094.0" y="283.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="42.0" width="100.0" x="917.0" y="270.0"></omgdc:Bounds>
+          <omgdc:Bounds height="39.0" width="100.0" x="917.0" y="270.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow28" id="BPMNEdge_flow28">
@@ -192,7 +208,7 @@
         <omgdi:waypoint x="907.0" y="520.0"></omgdi:waypoint>
         <omgdi:waypoint x="1094.0" y="520.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="42.0" width="100.0" x="927.0" y="484.0"></omgdc:Bounds>
+          <omgdc:Bounds height="39.0" width="100.0" x="927.0" y="484.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow29" id="BPMNEdge_flow29">
@@ -200,7 +216,7 @@
         <omgdi:waypoint x="907.0" y="625.0"></omgdi:waypoint>
         <omgdi:waypoint x="1095.0" y="625.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="42.0" width="100.0" x="917.0" y="584.0"></omgdc:Bounds>
+          <omgdc:Bounds height="39.0" width="100.0" x="917.0" y="584.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow30" id="BPMNEdge_flow30">
@@ -208,7 +224,7 @@
         <omgdi:waypoint x="907.0" y="100.0"></omgdi:waypoint>
         <omgdi:waypoint x="1040.0" y="100.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="42.0" width="100.0" x="917.0" y="131.0"></omgdc:Bounds>
+          <omgdc:Bounds height="39.0" width="100.0" x="917.0" y="131.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow31" id="BPMNEdge_flow31">
@@ -220,7 +236,7 @@
         <omgdi:waypoint x="1256.0" y="186.0"></omgdi:waypoint>
         <omgdi:waypoint x="1172.0" y="186.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="42.0" width="100.0" x="1261.0" y="139.0"></omgdc:Bounds>
+          <omgdc:Bounds height="39.0" width="100.0" x="1261.0" y="139.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow33" id="BPMNEdge_flow33">
@@ -233,7 +249,7 @@
         <omgdi:waypoint x="1407.0" y="100.0"></omgdi:waypoint>
         <omgdi:waypoint x="1407.0" y="341.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="42.0" width="100.0" x="1289.0" y="70.0"></omgdc:Bounds>
+          <omgdc:Bounds height="39.0" width="100.0" x="1289.0" y="70.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow35" id="BPMNEdge_flow35">
@@ -256,14 +272,14 @@
         <omgdi:waypoint x="557.0" y="519.0"></omgdi:waypoint>
         <omgdi:waypoint x="508.0" y="520.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="42.0" width="100.0" x="577.0" y="393.0"></omgdc:Bounds>
+          <omgdc:Bounds height="39.0" width="100.0" x="577.0" y="393.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow39" id="BPMNEdge_flow39">
         <omgdi:waypoint x="537.0" y="346.0"></omgdi:waypoint>
         <omgdi:waypoint x="420.0" y="346.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="70.0" width="100.0" x="439.0" y="290.0"></omgdc:Bounds>
+          <omgdc:Bounds height="65.0" width="100.0" x="439.0" y="290.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow40" id="BPMNEdge_flow40">
@@ -276,7 +292,7 @@
         <omgdi:waypoint x="907.0" y="750.0"></omgdi:waypoint>
         <omgdi:waypoint x="1095.0" y="750.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="42.0" width="100.0" x="910.0" y="699.0"></omgdc:Bounds>
+          <omgdc:Bounds height="39.0" width="100.0" x="910.0" y="699.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow42" id="BPMNEdge_flow42">
@@ -289,13 +305,39 @@
         <omgdi:waypoint x="907.0" y="377.0"></omgdi:waypoint>
         <omgdi:waypoint x="1094.0" y="377.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="42.0" width="100.0" x="941.0" y="344.0"></omgdc:Bounds>
+          <omgdc:Bounds height="39.0" width="100.0" x="941.0" y="344.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow44" id="BPMNEdge_flow44">
         <omgdi:waypoint x="1223.0" y="377.0"></omgdi:waypoint>
         <omgdi:waypoint x="1355.0" y="376.0"></omgdi:waypoint>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow45" id="BPMNEdge_flow45">
+        <omgdi:waypoint x="907.0" y="250.0"></omgdi:waypoint>
+        <omgdi:waypoint x="907.0" y="855.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1094.0" y="855.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="39.0" width="100.0" x="910.0" y="789.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow46" id="BPMNEdge_flow46">
+        <omgdi:waypoint x="1224.0" y="855.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1407.0" y="855.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1407.0" y="412.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow47" id="BPMNEdge_flow47">
+        <omgdi:waypoint x="1191.0" y="935.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1407.0" y="935.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1407.0" y="412.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow48" id="BPMNEdge_flow48">
+        <omgdi:waypoint x="907.0" y="250.0"></omgdi:waypoint>
+        <omgdi:waypoint x="907.0" y="935.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1070.0" y="935.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="39.0" width="100.0" x="950.0" y="879.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </definitions>
\ No newline at end of file
diff --git a/src/test/java/org/etsi/osl/osom/ProcessOrderIntegrationTest.java b/src/test/java/org/etsi/osl/osom/ProcessOrderIntegrationTest.java
index 7ef1c9d633fb72b3140eb9fbb2c7cc46881a8616..34e2d5a2bf8ad9055214de2120c664f3d85448a1 100644
--- a/src/test/java/org/etsi/osl/osom/ProcessOrderIntegrationTest.java
+++ b/src/test/java/org/etsi/osl/osom/ProcessOrderIntegrationTest.java
@@ -184,7 +184,7 @@ public class ProcessOrderIntegrationTest {
 		assertThat(specCirros.getServiceSpecCharacteristic().size()  ).isEqualTo(12);
 		assertThat(sorder.getOrderItem().stream().findFirst().get().getService().getServiceCharacteristic().size()  ).isEqualTo(2);
 
-		assertThat(repositoryService.createProcessDefinitionQuery().count()).isEqualTo(15);
+		assertThat(repositoryService.createProcessDefinitionQuery().count()).isEqualTo(16);
 		assertThat(taskService.createTaskQuery().count()).isEqualTo(0);
 
 		assertThat( scmocked.getRequeestedDescriptor() ).isNull();