diff --git a/src/main/java/org/onap/clamp/clds/Application.java b/src/main/java/org/onap/clamp/clds/Application.java
index 2727535..281a87c 100644
--- a/src/main/java/org/onap/clamp/clds/Application.java
+++ b/src/main/java/org/onap/clamp/clds/Application.java
@@ -26,6 +26,7 @@
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 
+import org.apache.camel.component.servlet.CamelHttpTransportServlet;
 import org.apache.catalina.connector.Connector;
 import org.onap.clamp.clds.model.prop.Holmes;
 import org.onap.clamp.clds.model.prop.ModelProperties;
@@ -41,6 +42,7 @@
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
 import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
 import org.springframework.boot.web.support.SpringBootServletInitializer;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
@@ -89,6 +91,19 @@
     }
 
     /**
+     * This method is used to declare the camel servlet.
+     * 
+     * @return A servlet bean
+     */
+    @Bean
+    public ServletRegistrationBean camelServletRegistrationBean() {
+        ServletRegistrationBean registration = new ServletRegistrationBean(new CamelHttpTransportServlet(),
+                "/restservices/clds/v2");
+        registration.setName("CamelServlet");
+        return registration;
+    }
+
+    /**
      * This method is used by Spring to create the servlet container factory.
      * 
      * @return The TomcatEmbeddedServletContainerFactory just created
diff --git a/src/main/java/org/onap/clamp/clds/camel/CamelProxy.java b/src/main/java/org/onap/clamp/clds/camel/CamelProxy.java
new file mode 100644
index 0000000..66cd1f5
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/camel/CamelProxy.java
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * 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============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.camel;
+
+import org.apache.camel.ExchangeProperty;
+
+/**
+ * This interface describes the CamelProxy parameters that must be passed to the
+ * Camel flow.
+ */
+public interface CamelProxy {
+
+    /**
+     * This method is called when invoking a camel flow.
+     * 
+     * @param actionCommand
+     *            The action coming from the Clamp UI (like SUBMIT, UPDATE,
+     *            DELETE, ...)
+     * @param modelProperties
+     *            The Model properties created based on the BPMN Json and
+     *            Properties Json
+     * @param modelBpmnProperties
+     *            The Json with all the properties describing the flow
+     * @param modelName
+     *            The model name
+     * @param controlName
+     *            The control loop name
+     * @param docText
+     *            The Global properties JSON containing YAML (coming from CLamp
+     *            template)
+     * @param isTest
+     *            Is a test or not (flag coming from the UI)
+     * @param userId
+     *            The user ID coming from the UI
+     * @param isInsertTestEvent
+     *            Is a test or not (flag coming from the UI)
+     * @return A string containing the result of the Camel flow execution
+     */
+    String submit(@ExchangeProperty("actionCd") String actionCommand,
+            @ExchangeProperty("modelProp") String modelProperties,
+            @ExchangeProperty("modelBpmnProp") String modelBpmnProperties,
+            @ExchangeProperty("modelName") String modelName, @ExchangeProperty("controlName") String controlName,
+            @ExchangeProperty("docText") String docText, @ExchangeProperty("isTest") boolean isTest,
+            @ExchangeProperty("userid") String userId,
+            @ExchangeProperty("isInsertTestEvent") boolean isInsertTestEvent);
+}
diff --git a/src/main/java/org/onap/clamp/clds/client/CldsEventDelegate.java b/src/main/java/org/onap/clamp/clds/client/CldsEventDelegate.java
index 4886b0d..dcc3189 100644
--- a/src/main/java/org/onap/clamp/clds/client/CldsEventDelegate.java
+++ b/src/main/java/org/onap/clamp/clds/client/CldsEventDelegate.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,40 +26,44 @@
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 
-import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
 import org.onap.clamp.clds.dao.CldsDao;
 import org.onap.clamp.clds.model.CldsEvent;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * Create CLDS Event.
  */
-public class CldsEventDelegate implements JavaDelegate {
-    protected static final EELFLogger logger        = EELFManager.getInstance().getLogger(CldsEventDelegate.class);
+@Component
+public class CldsEventDelegate {
+
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsEventDelegate.class);
     protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
     @Autowired
-    private CldsDao                   cldsDao;
+    private CldsDao cldsDao;
 
     /**
      * Insert event using process variables.
      *
-     * @param execution
+     * @param camelExchange
+     *            The Camel Exchange object containing the properties
      */
-    @Override
-    public void execute(DelegateExecution execution) {
-        String controlName = (String) execution.getVariable("controlName");
-        String actionCd = (String) execution.getVariable("actionCd");
-        String actionStateCd = (String) execution.getVariable("actionStateCd");
+    @Handler
+    public void execute(Exchange camelExchange) {
+        String controlName = (String) camelExchange.getProperty("controlName");
+        String actionCd = (String) camelExchange.getProperty("actionCd");
+        String actionStateCd = (String) camelExchange.getProperty("actionStateCd");
         // Flag indicate whether it is triggered by Validation Test button from
         // UI
-        boolean isTest = (boolean) execution.getVariable("isTest");
-        boolean isInsertTestEvent = (boolean) execution.getVariable("isInsertTestEvent");
-        String userid = (String) execution.getVariable("userid");
+        boolean isTest = (boolean) camelExchange.getProperty("isTest");
+        boolean isInsertTestEvent = (boolean) camelExchange.getProperty("isInsertTestEvent");
+        String userid = (String) camelExchange.getProperty("userid");
         // do not insert events for test actions unless flag set to insert them
         if (!isTest || isInsertTestEvent) {
             // won't really have userid here...
-            CldsEvent.insEvent(cldsDao, controlName, userid, actionCd, actionStateCd, execution.getProcessInstanceId());
+            CldsEvent.insEvent(cldsDao, controlName, userid, actionCd, actionStateCd, camelExchange.getExchangeId());
         }
     }
 }
diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java b/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
index b8863e0..6053a0d 100644
--- a/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
+++ b/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
@@ -35,24 +35,26 @@
 import org.onap.clamp.clds.model.refprop.RefProp;
 import org.onap.clamp.clds.util.LoggingUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * This class implements the communication with DCAE for the service
  * deployments.
- *
  */
+@Component
 public class DcaeDispatcherServices {
-    protected static final EELFLogger logger                       = EELFManager.getInstance()
-            .getLogger(DcaeDispatcherServices.class);
-    protected static final EELFLogger metricsLogger                = EELFManager.getInstance().getMetricsLogger();
+
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(DcaeDispatcherServices.class);
+    protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
     @Autowired
-    private RefProp                   refProp;
-    private static final String       STATUS_URL_LOG               = "Status URL extracted: ";
-    private static final String       DCAE_URL_PREFIX              = "/dcae-deployments/";
-    private static final String       DCAE_URL_PROPERTY_NAME       = "DCAE_DISPATCHER_URL";
-    public static final String        DCAE_REQUESTID_PROPERTY_NAME = "dcae.header.requestId";
-    private static final String       DCAE_LINK_FIELD              = "links";
-    private static final String       DCAE_STATUS_FIELD            = "status";
+    private RefProp refProp;
+    private static final String STATUS_URL_LOG = "Status URL extracted: ";
+    private static final String DCAE_URL_PREFIX = "/dcae-deployments/";
+    private static final String DCAE_URL_PROPERTY_NAME = "DCAE_DISPATCHER_URL";
+    private static final String DCAE_REQUEST_FAILED_LOG = "RequestFailed - responseStr=";
+    public static final String DCAE_REQUESTID_PROPERTY_NAME = "dcae.header.requestId";
+    private static final String DCAE_LINK_FIELD = "links";
+    private static final String DCAE_STATUS_FIELD = "status";
 
     /**
      * Delete the deployment on DCAE.
@@ -76,7 +78,7 @@
             LoggingUtils.setResponseContext("0", "Delete deployments success", this.getClass().getName());
             return statusUrl;
         } catch (Exception e) {
-        	//Log StatusCode during exception in metrics log 
+            // Log StatusCode during exception in metrics log
             LoggingUtils.setResponseContext("900", "Delete deployments failed", this.getClass().getName());
             LoggingUtils.setErrorContext("900", "Delete deployments error");
             logger.error("Exception occurred during Delete Deployment Operation with DCAE", e);
@@ -93,7 +95,6 @@
      * @param statusUrl
      *            The URL provided by a previous DCAE Query
      * @return The status
-     * 
      */
     public String getOperationStatus(String statusUrl) {
         // Assigning processing status to monitor operation status further
@@ -111,7 +112,7 @@
             LoggingUtils.setResponseContext("0", "Get operation status success", this.getClass().getName());
             opStatus = status;
         } catch (Exception e) {
-        	//Log StatusCode during exception in metrics log 
+            // Log StatusCode during exception in metrics log
             LoggingUtils.setResponseContext("900", "Get operation status failed", this.getClass().getName());
             LoggingUtils.setErrorContext("900", "Get operation status error");
             logger.error("Exception occurred during getOperationStatus Operation with DCAE", e);
@@ -124,7 +125,6 @@
 
     /**
      * This method send a getDeployments operation to DCAE.
-     * 
      */
     public void getDeployments() {
         Date startTime = new Date();
@@ -134,7 +134,7 @@
             DcaeHttpConnectionManager.doDcaeHttpQuery(url, "GET", null, null);
             LoggingUtils.setResponseContext("0", "Get deployments success", this.getClass().getName());
         } catch (Exception e) {
-        	//Log StatusCode during exception in metrics log 
+            // Log StatusCode during exception in metrics log
             LoggingUtils.setResponseContext("900", "Get deployments failed", this.getClass().getName());
             LoggingUtils.setErrorContext("900", "Get deployments error");
             logger.error("Exception occurred during getDeployments Operation with DCAE", e);
@@ -174,7 +174,7 @@
             LoggingUtils.setResponseContext("0", "Create new deployment failed", this.getClass().getName());
             return statusUrl;
         } catch (Exception e) {
-        	//Log StatusCode during exception in metrics log 
+            // Log StatusCode during exception in metrics log
             LoggingUtils.setResponseContext("900", "Create new deployment failed", this.getClass().getName());
             LoggingUtils.setErrorContext("900", "Create new deployment error");
             logger.error("Exception occurred during createNewDeployment Operation with DCAE", e);
@@ -212,7 +212,7 @@
             LoggingUtils.setResponseContext("0", "Delete existing deployment success", this.getClass().getName());
             return statusUrl;
         } catch (Exception e) {
-        	//Log StatusCode during exception in metrics log 
+            // Log StatusCode during exception in metrics log
             LoggingUtils.setResponseContext("900", "Delete existing deployment failed", this.getClass().getName());
             LoggingUtils.setErrorContext("900", "Delete existing deployment error");
             logger.error("Exception occurred during deleteExistingDeployment Operation with DCAE", e);
diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java
index 94ebaca..4dfe089 100644
--- a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java
+++ b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java
@@ -50,10 +50,12 @@
 import org.onap.clamp.clds.model.refprop.RefProp;
 import org.onap.clamp.clds.util.LoggingUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * This class implements the communication with DCAE for the service inventory.
  */
+@Component
 public class DcaeInventoryServices {
 
     protected static final EELFLogger logger = EELFManager.getInstance().getLogger(DcaeInventoryServices.class);
@@ -107,12 +109,12 @@
             dcaeEvent.setEvent(DcaeEvent.EVENT_DISTRIBUTION);
             LoggingUtils.setResponseContext("0", "Set inventory success", this.getClass().getName());
         } catch (JsonProcessingException e) {
-        	LoggingUtils.setResponseContext("900", "Set inventory failed", this.getClass().getName());
-        	LoggingUtils.setErrorContext("900", "Set inventory error");
+            LoggingUtils.setResponseContext("900", "Set inventory failed", this.getClass().getName());
+            LoggingUtils.setErrorContext("900", "Set inventory error");
             logger.error("Error during JSON decoding", e);
         } catch (IOException ex) {
-        	LoggingUtils.setResponseContext("900", "Set inventory failed", this.getClass().getName());
-        	LoggingUtils.setErrorContext("900", "Set inventory error");
+            LoggingUtils.setResponseContext("900", "Set inventory failed", this.getClass().getName());
+            LoggingUtils.setErrorContext("900", "Set inventory error");
             logger.error("Error during DCAE communication", ex);
         } finally {
             LoggingUtils.setTimeContext(startTime, new Date());
@@ -209,7 +211,7 @@
      *            The vf UUID
      * @return The DCAE inventory type id
      */
-    public String createUpdateDCAEServiceType(String blueprintTemplate, String owner, String typeName, int typeVersion,
+    public String createupdateDCAEServiceType(String blueprintTemplate, String owner, String typeName, int typeVersion,
             String asdcServiceId, String asdcResourceId) {
         Date startTime = new Date();
         LoggingUtils.setTargetContext("DCAE", "createDCAEServiceType");
@@ -237,20 +239,22 @@
             Object obj0 = parser.parse(responseStr);
             JSONObject jsonObj = (JSONObject) obj0;
             typeId = (String) jsonObj.get("typeId"); // need to save this
-                                                            // as
-                                                            // service_type_id
-                                                            // in model table
+                                                     // as
+                                                     // service_type_id
+                                                     // in model table
         } catch (IOException | ParseException e) {
             logger.error("Exception occurred during createupdateDCAEServiceType Operation with DCAE", e);
             throw new BadRequestException("Exception occurred during createupdateDCAEServiceType Operation with DCAE",
                     e);
         } finally {
-        	if(typeId != null) {
-        		LoggingUtils.setResponseContext("0", "Create update DCAE ServiceType success", this.getClass().getName());
-        	} else {
-        		LoggingUtils.setResponseContext("900", "Create update DCAE ServiceType failed", this.getClass().getName());
+            if (typeId != null) {
+                LoggingUtils.setResponseContext("0", "Create update DCAE ServiceType success",
+                        this.getClass().getName());
+            } else {
+                LoggingUtils.setResponseContext("900", "Create update DCAE ServiceType failed",
+                        this.getClass().getName());
                 LoggingUtils.setErrorContext("900", "Create update DCAE ServiceType error");
-        	}
+            }
             LoggingUtils.setTimeContext(startTime, new Date());
             metricsLogger.info("createupdateDCAEServiceType complete");
         }
diff --git a/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDelegate.java b/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDelegate.java
index aaa4a2c..3465598 100644
--- a/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDelegate.java
+++ b/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDelegate.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,41 +28,45 @@
 
 import java.util.UUID;
 
-import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
 import org.onap.clamp.clds.client.req.policy.PolicyClient;
 import org.onap.clamp.clds.model.prop.Holmes;
 import org.onap.clamp.clds.model.prop.ModelProperties;
 import org.onap.clamp.clds.model.refprop.RefProp;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * Send Holmes info to policy api.
  */
-public class HolmesPolicyDelegate implements JavaDelegate {
-    protected static final EELFLogger logger        = EELFManager.getInstance().getLogger(HolmesPolicyDelegate.class);
+@Component
+public class HolmesPolicyDelegate {
+
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(HolmesPolicyDelegate.class);
     protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
     @Autowired
-    private PolicyClient              policyClient;
+    private PolicyClient policyClient;
     @Autowired
-    private RefProp                   refProp;
+    private RefProp refProp;
 
     /**
      * Perform activity. Send Holmes info to policy api.
      *
-     * @param execution
+     * @param camelExchange
+     *            The Camel Exchange object containing the properties
      */
-    @Override
-    public void execute(DelegateExecution execution) {
+    @Handler
+    public void execute(Exchange camelExchange) {
         String holmesPolicyRequestUuid = UUID.randomUUID().toString();
-        execution.setVariable("holmesPolicyRequestUuid", holmesPolicyRequestUuid);
-        ModelProperties prop = ModelProperties.create(execution);
+        camelExchange.setProperty("holmesPolicyRequestUuid", holmesPolicyRequestUuid);
+        ModelProperties prop = ModelProperties.create(camelExchange);
         Holmes holmes = prop.getType(Holmes.class);
         if (holmes.isFound()) {
             String responseMessage = policyClient.sendBasePolicyInOther(formatHolmesConfigBody(prop, holmes),
                     holmes.getConfigPolicyName(), prop, holmesPolicyRequestUuid);
             if (responseMessage != null) {
-                execution.setVariable("holmesPolicyResponseMessage", responseMessage.getBytes());
+                camelExchange.setProperty("holmesPolicyResponseMessage", responseMessage.getBytes());
             }
         }
     }
diff --git a/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDeleteDelegate.java b/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDeleteDelegate.java
index 72db328..28da148 100644
--- a/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDeleteDelegate.java
+++ b/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDeleteDelegate.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,34 +26,34 @@
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 
-import java.io.IOException;
-
-import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
 import org.onap.clamp.clds.client.req.policy.PolicyClient;
 import org.onap.clamp.clds.model.prop.Holmes;
 import org.onap.clamp.clds.model.prop.ModelProperties;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * Delete Holmes Policy via policy api.
  */
-public class HolmesPolicyDeleteDelegate implements JavaDelegate {
-    protected static final EELFLogger logger        = EELFManager.getInstance()
-            .getLogger(HolmesPolicyDeleteDelegate.class);
+@Component
+public class HolmesPolicyDeleteDelegate {
+
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(HolmesPolicyDeleteDelegate.class);
     protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
     @Autowired
-    private PolicyClient              policyClient;
+    private PolicyClient policyClient;
 
     /**
      * Perform activity. Delete Holmes Policy via policy api.
      *
-     * @param execution
-     * @throws IOException
+     * @param camelExchange
+     *            The Camel Exchange object containing the properties
      */
-    @Override
-    public void execute(DelegateExecution execution) {
-        ModelProperties prop = ModelProperties.create(execution);
+    @Handler
+    public void execute(Exchange camelExchange) {
+        ModelProperties prop = ModelProperties.create(camelExchange);
         Holmes holmes = prop.getType(Holmes.class);
         if (holmes.isFound()) {
             prop.setCurrentModelElementId(holmes.getId());
diff --git a/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDelegate.java b/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDelegate.java
index e2d16c5..77d7680 100644
--- a/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDelegate.java
+++ b/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDelegate.java
@@ -29,8 +29,8 @@
 import java.io.UnsupportedEncodingException;
 import java.util.Map;
 
-import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
 import org.onap.clamp.clds.client.req.policy.OperationalPolicyReq;
 import org.onap.clamp.clds.client.req.policy.PolicyClient;
 import org.onap.clamp.clds.model.prop.ModelProperties;
@@ -41,41 +41,42 @@
 import org.onap.policy.api.AttributeType;
 import org.onap.policy.controlloop.policy.builder.BuilderException;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * Send Operational Policy info to policy api. It uses the policy code to define
  * the model and communicate with it. See also the PolicyClient class.
- * 
  */
-public class OperationalPolicyDelegate implements JavaDelegate {
-    protected static final EELFLogger logger        = EELFManager.getInstance()
-            .getLogger(OperationalPolicyDelegate.class);
+@Component
+public class OperationalPolicyDelegate {
+
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(OperationalPolicyDelegate.class);
     protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
     /**
      * Automatically injected by Spring, define in CldsConfiguration as a bean.
      */
     @Autowired
-    private PolicyClient              policyClient;
+    private PolicyClient policyClient;
     /**
      * Automatically injected by Spring, define in CldsConfiguration as a bean.
      */
     @Autowired
-    private RefProp                   refProp;
+    private RefProp refProp;
 
     /**
      * Perform activity. Send Operational Policy info to policy api.
      *
-     * @param execution
-     *            The DelegateExecution
+     * @param camelExchange
+     *            The Camel Exchange object containing the properties
      * @throws BuilderException
      *             In case of issues with OperationalPolicyReq
      * @throws UnsupportedEncodingException
      *             In case of issues with the Charset encoding
      */
-    @Override
-    public void execute(DelegateExecution execution) throws BuilderException, UnsupportedEncodingException {
+    @Handler
+    public void execute(Exchange camelExchange) throws BuilderException, UnsupportedEncodingException {
         String responseMessage = null;
-        ModelProperties prop = ModelProperties.create(execution);
+        ModelProperties prop = ModelProperties.create(camelExchange);
         Policy policy = prop.getType(Policy.class);
         if (policy.isFound()) {
             for (PolicyChain policyChain : prop.getType(Policy.class).getPolicyChains()) {
@@ -84,7 +85,7 @@
                 responseMessage = policyClient.sendBrmsPolicy(attributes, prop, LoggingUtils.getRequestId());
             }
             if (responseMessage != null) {
-                execution.setVariable("operationalPolicyResponseMessage", responseMessage.getBytes());
+                camelExchange.setProperty("operationalPolicyResponseMessage", responseMessage.getBytes());
             }
         }
     }
diff --git a/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDeleteDelegate.java b/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDeleteDelegate.java
index 2bca639..4dd2040 100644
--- a/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDeleteDelegate.java
+++ b/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDeleteDelegate.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,35 +26,36 @@
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 
-import java.io.IOException;
-
-import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
 import org.onap.clamp.clds.client.req.policy.PolicyClient;
 import org.onap.clamp.clds.model.prop.ModelProperties;
 import org.onap.clamp.clds.model.prop.Policy;
 import org.onap.clamp.clds.model.prop.PolicyChain;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * Delete Operational Policy via policy api.
  */
-public class OperationalPolicyDeleteDelegate implements JavaDelegate {
-    protected static final EELFLogger logger        = EELFManager.getInstance()
+@Component
+public class OperationalPolicyDeleteDelegate {
+
+    protected static final EELFLogger logger = EELFManager.getInstance()
             .getLogger(OperationalPolicyDeleteDelegate.class);
     protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
     @Autowired
-    private PolicyClient              policyClient;
+    private PolicyClient policyClient;
 
     /**
      * Perform activity. Delete Operational Policy via policy api.
      *
-     * @param execution
-     * @throws IOException
+     * @param camelExchange
+     *            The Camel Exchange object containing the properties
      */
-    @Override
-    public void execute(DelegateExecution execution) {
-        ModelProperties prop = ModelProperties.create(execution);
+    @Handler
+    public void execute(Exchange camelExchange) {
+        ModelProperties prop = ModelProperties.create(camelExchange);
         Policy policy = prop.getType(Policy.class);
         prop.setCurrentModelElementId(policy.getId());
         String responseMessage = "";
@@ -64,7 +65,7 @@
                 responseMessage = policyClient.deleteBrms(prop);
             }
             if (responseMessage != null) {
-                execution.setVariable("operationalPolicyDeleteResponseMessage", responseMessage.getBytes());
+                camelExchange.setProperty("operationalPolicyDeleteResponseMessage", responseMessage.getBytes());
             }
         }
     }
diff --git a/src/main/java/org/onap/clamp/clds/client/SdcSendReqDelegate.java b/src/main/java/org/onap/clamp/clds/client/SdcSendReqDelegate.java
index b582349..e21bfce 100644
--- a/src/main/java/org/onap/clamp/clds/client/SdcSendReqDelegate.java
+++ b/src/main/java/org/onap/clamp/clds/client/SdcSendReqDelegate.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,82 +26,88 @@
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 
+import java.io.IOException;
+import java.security.GeneralSecurityException;
 import java.util.List;
 
-import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
+import org.apache.commons.codec.DecoderException;
 import org.onap.clamp.clds.client.req.sdc.SdcCatalogServices;
 import org.onap.clamp.clds.client.req.sdc.SdcReq;
 import org.onap.clamp.clds.model.DcaeEvent;
+import org.onap.clamp.clds.model.prop.Global;
 import org.onap.clamp.clds.model.prop.ModelProperties;
 import org.onap.clamp.clds.model.refprop.RefProp;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * Send control loop model to dcae proxy.
  */
-public class SdcSendReqDelegate implements JavaDelegate {
-    protected static final EELFLogger logger        = EELFManager.getInstance().getLogger(SdcSendReqDelegate.class);
+@Component
+public class SdcSendReqDelegate {
+
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcSendReqDelegate.class);
     protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
     @Autowired
-    private SdcReq                    sdcReq;
+    private SdcCatalogServices sdcCatalogServices;
     @Autowired
-    private RefProp                   refProp;
+    private SdcReq sdcReq;
     @Autowired
-    private SdcCatalogServices        sdcCatalogServices;
-    private String                    baseUrl;
-    private String                    artifactType;
-    private String                    locationArtifactType;
-    private String                    artifactLabel;
-    private String                    locationArtifactLabel;
+    private RefProp refProp;
 
     /**
      * Perform activity. Send to sdc proxy.
      *
-     * @param execution
+     * @param camelExchange
+     *            The camel object that contains all fields
+     * @throws DecoderException
+     *             In case of issues with password decryption
+     * @throws GeneralSecurityException
+     *             In case of issues with password decryption
+     * @throws IOException
+     *             In case of issues with file opening
      */
-    @Override
-    public void execute(DelegateExecution execution) throws Exception {
-        String userid = (String) execution.getVariable("userid");
-        logger.info("userid=" + userid);
-        String docText = new String((byte[]) execution.getVariable("docText"));
-        String artifactName = (String) execution.getVariable("controlName") + DcaeEvent.ARTIFACT_NAME_SUFFIX;
-        execution.setVariable("artifactName", artifactName);
-        getSdcAttributes((String) execution.getVariable("controlName"));
-        ModelProperties prop = ModelProperties.create(execution);
-        String bluprintPayload = sdcReq.formatBlueprint(prop, docText);
+    @Handler
+    public void execute(Exchange camelExchange) throws GeneralSecurityException, DecoderException, IOException {
+        String controlName = (String) camelExchange.getProperty("controlName");
+        String baseUrl = refProp.getStringValue("sdc.serviceUrl");
+        String artifactLabel = sdcReq
+                .normalizeResourceInstanceName(refProp.getStringValue("sdc.artifactLabel") + "-" + controlName);
+        String locationArtifactLabel = sdcReq
+                .normalizeResourceInstanceName(refProp.getStringValue("sdc.locationArtifactLabel") + "-" + controlName);
+        String artifactType = refProp.getStringValue("sdc.artifactType");
+        String locationArtifactType = refProp.getStringValue("sdc.locationArtifactType");
+        String userid = (String) camelExchange.getProperty("userid");
+        String docText = (String) camelExchange.getProperty("docText");
+        String artifactName = (String) camelExchange.getProperty("controlName") + DcaeEvent.ARTIFACT_NAME_SUFFIX;
+        camelExchange.setProperty("artifactName", artifactName);
+        ModelProperties prop = ModelProperties.create(camelExchange);
+        String bluprintPayload;
+        bluprintPayload = sdcReq.formatBlueprint(prop, docText);
         // no need to upload blueprint for Holmes, thus blueprintPayload for
         // Holmes is empty
         if (!bluprintPayload.isEmpty()) {
             String formattedSdcReq = sdcReq.formatSdcReq(bluprintPayload, artifactName, artifactLabel, artifactType);
             if (formattedSdcReq != null) {
-                execution.setVariable("formattedArtifactReq", formattedSdcReq.getBytes());
+                camelExchange.setProperty("formattedArtifactReq", formattedSdcReq.getBytes());
             }
-            List<String> sdcReqUrlsList = sdcReq.getSdcReqUrlsList(prop, baseUrl, sdcCatalogServices, execution);
+            Global globalProps = prop.getGlobal();
+            if (globalProps != null && globalProps.getService() != null) {
+                String serviceInvariantUUID = globalProps.getService();
+                camelExchange.setProperty("serviceInvariantUUID", serviceInvariantUUID);
+            }
+            List<String> sdcReqUrlsList = sdcReq.getSdcReqUrlsList(prop, baseUrl);
             String sdcLocationsPayload = sdcReq.formatSdcLocationsReq(prop, artifactName);
-            String locationArtifactName = (String) execution.getVariable("controlName") + "-location.json";
+            String locationArtifactName = (String) camelExchange.getProperty("controlName") + "-location.json";
             String formattedSdcLocationReq = sdcReq.formatSdcReq(sdcLocationsPayload, locationArtifactName,
                     locationArtifactLabel, locationArtifactType);
             if (formattedSdcLocationReq != null) {
-                execution.setVariable("formattedLocationReq", formattedSdcLocationReq.getBytes());
+                camelExchange.setProperty("formattedLocationReq", formattedSdcLocationReq.getBytes());
             }
             sdcCatalogServices.uploadToSdc(prop, userid, sdcReqUrlsList, formattedSdcReq, formattedSdcLocationReq,
                     artifactName, locationArtifactName);
         }
     }
-
-    /**
-     * Method to get sdc service values from properties file.
-     * 
-     * @param controlName
-     */
-    private void getSdcAttributes(String controlName) {
-        baseUrl = refProp.getStringValue("sdc.serviceUrl");
-        artifactLabel = sdcReq
-                .normalizeResourceInstanceName(refProp.getStringValue("sdc.artifactLabel") + "-" + controlName);
-        locationArtifactLabel = sdcReq
-                .normalizeResourceInstanceName(refProp.getStringValue("sdc.locationArtifactLabel") + "-" + controlName);
-        artifactType = refProp.getStringValue("sdc.artifactType");
-        locationArtifactType = refProp.getStringValue("sdc.locationArtifactType");
-    }
 }
diff --git a/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java b/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java
index 035e64a..2657a03 100644
--- a/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java
+++ b/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,44 +28,46 @@
 
 import java.util.UUID;
 
-import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
 import org.onap.clamp.clds.client.req.policy.PolicyClient;
 import org.onap.clamp.clds.client.req.tca.TcaRequestFormatter;
 import org.onap.clamp.clds.model.prop.ModelProperties;
 import org.onap.clamp.clds.model.prop.Tca;
 import org.onap.clamp.clds.model.refprop.RefProp;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * Send Tca info to policy api.
- *
- *
  */
-public class TcaPolicyDelegate implements JavaDelegate {
-    protected static final EELFLogger logger        = EELFManager.getInstance().getLogger(TcaPolicyDelegate.class);
+@Component
+public class TcaPolicyDelegate {
+
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(TcaPolicyDelegate.class);
     protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
     @Autowired
-    private RefProp                   refProp;
+    private RefProp refProp;
     @Autowired
-    private PolicyClient              policyClient;
+    private PolicyClient policyClient;
 
     /**
      * Perform activity. Send Tca info to policy api.
      *
-     * @param execution
+     * @param camelExchange
+     *            The Camel Exchange object containing the properties
      */
-    @Override
-    public void execute(DelegateExecution execution) throws Exception {
+    @Handler
+    public void execute(Exchange camelExchange) {
         String tcaPolicyRequestUuid = UUID.randomUUID().toString();
-        execution.setVariable("tcaPolicyRequestUuid", tcaPolicyRequestUuid);
-        ModelProperties prop = ModelProperties.create(execution);
+        camelExchange.setProperty("tcaPolicyRequestUuid", tcaPolicyRequestUuid);
+        ModelProperties prop = ModelProperties.create(camelExchange);
         Tca tca = prop.getType(Tca.class);
         if (tca.isFound()) {
             String policyJson = TcaRequestFormatter.createPolicyJson(refProp, prop);
             String responseMessage = policyClient.sendMicroServiceInOther(policyJson, prop);
             if (responseMessage != null) {
-                execution.setVariable("tcaPolicyResponseMessage", responseMessage.getBytes());
+                camelExchange.setProperty("tcaPolicyResponseMessage", responseMessage.getBytes());
             }
         }
     }
diff --git a/src/main/java/org/onap/clamp/clds/client/TcaPolicyDeleteDelegate.java b/src/main/java/org/onap/clamp/clds/client/TcaPolicyDeleteDelegate.java
index e88b720..c2aa303 100644
--- a/src/main/java/org/onap/clamp/clds/client/TcaPolicyDeleteDelegate.java
+++ b/src/main/java/org/onap/clamp/clds/client/TcaPolicyDeleteDelegate.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,46 +23,44 @@
 
 package org.onap.clamp.clds.client;
 
-import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.camunda.bpm.engine.delegate.JavaDelegate;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
 import org.onap.clamp.clds.client.req.policy.PolicyClient;
 import org.onap.clamp.clds.model.prop.ModelProperties;
 import org.onap.clamp.clds.model.prop.Tca;
 import org.springframework.beans.factory.annotation.Autowired;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
+import org.springframework.stereotype.Component;
 
 /**
  * Delete Tca Policy via policy api.
- *
- *
  */
-public class TcaPolicyDeleteDelegate implements JavaDelegate {
-    protected static final EELFLogger logger        = EELFManager.getInstance().getLogger(TcaPolicyDeleteDelegate.class);
-    protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
+@Component
+public class TcaPolicyDeleteDelegate {
 
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(TcaPolicyDeleteDelegate.class);
+    protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
     @Autowired
-    private PolicyClient            policyClient;
+    private PolicyClient policyClient;
 
     /**
      * Perform activity. Delete Tca Policy via policy api.
      *
-     * @param execution
+     * @param camelExchange
+     *            The Camel Exchange object containing the properties
      */
-    @Override
-    public void execute(DelegateExecution execution) throws Exception {
-
-        ModelProperties prop = ModelProperties.create(execution);
+    @Handler
+    public void execute(Exchange camelExchange) {
+        ModelProperties prop = ModelProperties.create(camelExchange);
         Tca tca = prop.getType(Tca.class);
         if (tca.isFound()) {
             prop.setCurrentModelElementId(tca.getId());
-
             String responseMessage = policyClient.deleteMicrosService(prop);
             if (responseMessage != null) {
-                execution.setVariable("tcaPolicyDeleteResponseMessage", responseMessage.getBytes());
+                camelExchange.setProperty("tcaPolicyDeleteResponseMessage", responseMessage.getBytes());
             }
         }
     }
-
 }
diff --git a/src/main/java/org/onap/clamp/clds/client/req/policy/PolicyClient.java b/src/main/java/org/onap/clamp/clds/client/req/policy/PolicyClient.java
index b4cad94..0460033 100644
--- a/src/main/java/org/onap/clamp/clds/client/req/policy/PolicyClient.java
+++ b/src/main/java/org/onap/clamp/clds/client/req/policy/PolicyClient.java
@@ -57,23 +57,26 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
 
 /**
  * Policy utility methods - specifically, send the policy.
  */
+@Component
 public class PolicyClient {
-    protected static final String     POLICY_PREFIX_BASE            = "Config_";
-    protected static final String     LOG_POLICY_PREFIX             = "Response is ";
+
+    protected static final String POLICY_PREFIX_BASE = "Config_";
+    protected static final String LOG_POLICY_PREFIX = "Response is ";
     protected static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyClient.class);
-    protected static final EELFLogger metricsLogger                 = EELFManager.getInstance().getMetricsLogger();
-    protected static final String     POLICY_MSTYPE_PROPERTY_NAME   = "policy.ms.type";
-    protected static final String     POLICY_ONAPNAME_PROPERTY_NAME = "policy.onap.name";
+    protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
+    protected static final String POLICY_MSTYPE_PROPERTY_NAME = "policy.ms.type";
+    protected static final String POLICY_ONAPNAME_PROPERTY_NAME = "policy.onap.name";
     @Value("${org.onap.clamp.config.files.cldsPolicyConfig:'classpath:/clds/clds-policy-config.properties'}")
-    protected String                  cldsPolicyConfigFile;
+    protected String cldsPolicyConfigFile;
     @Autowired
-    protected ApplicationContext      appContext;
+    protected ApplicationContext appContext;
     @Autowired
-    protected RefProp                 refProp;
+    protected RefProp refProp;
 
     /**
      * Perform BRMS policy type.
@@ -229,19 +232,19 @@
                 responseMessage = response.getResponseMessage();
             }
         } catch (Exception e) {
-        	LoggingUtils.setResponseContext("900", "Policy send failed", this.getClass().getName());
-        	LoggingUtils.setErrorContext("900", "Policy send error");
+            LoggingUtils.setResponseContext("900", "Policy send failed", this.getClass().getName());
+            LoggingUtils.setErrorContext("900", "Policy send error");
             logger.error("Exception occurred during policy communication", e);
             throw new PolicyClientException("Exception while communicating with Policy", e);
         }
         logger.info(LOG_POLICY_PREFIX + responseMessage);
         LoggingUtils.setTimeContext(startTime, new Date());
         if (response.getResponseCode() == 200) {
-        	LoggingUtils.setResponseContext("0", "Policy send success", this.getClass().getName());
+            LoggingUtils.setResponseContext("0", "Policy send success", this.getClass().getName());
             logger.info("Policy send successful");
             metricsLogger.info("Policy send success");
         } else {
-        	LoggingUtils.setResponseContext("900", "Policy send failed", this.getClass().getName());
+            LoggingUtils.setResponseContext("900", "Policy send failed", this.getClass().getName());
             logger.warn("Policy send failed: " + responseMessage);
             metricsLogger.info("Policy send failure");
             throw new BadRequestException("Policy send failed: " + responseMessage);
@@ -278,25 +281,25 @@
         PolicyChangeResponse response;
         String responseMessage = "";
         try {
-        	LoggingUtils.setTargetContext("Policy", "pushPolicy");
+            LoggingUtils.setTargetContext("Policy", "pushPolicy");
             logger.info("Attempting to push policy...");
             response = getPolicyEngine().pushPolicy(pushPolicyParameters);
             if (response != null) {
                 responseMessage = response.getResponseMessage();
             }
         } catch (Exception e) {
-        	LoggingUtils.setResponseContext("900", "Policy push failed", this.getClass().getName());
+            LoggingUtils.setResponseContext("900", "Policy push failed", this.getClass().getName());
             LoggingUtils.setErrorContext("900", "Policy push error");
             logger.error("Exception occurred during policy communication", e);
             throw new PolicyClientException("Exception while communicating with Policy", e);
         }
         logger.info(LOG_POLICY_PREFIX + responseMessage);
         if (response != null && (response.getResponseCode() == 200 || response.getResponseCode() == 204)) {
-        	LoggingUtils.setResponseContext("0", "Policy push success", this.getClass().getName());
+            LoggingUtils.setResponseContext("0", "Policy push success", this.getClass().getName());
             logger.info("Policy push successful");
             metricsLogger.info("Policy push success");
         } else {
-        	LoggingUtils.setResponseContext("900", "Policy push failed", this.getClass().getName());
+            LoggingUtils.setResponseContext("900", "Policy push failed", this.getClass().getName());
             logger.warn("Policy push failed: " + responseMessage);
             metricsLogger.info("Policy push failure");
             throw new BadRequestException("Policy push failed: " + responseMessage);
@@ -350,7 +353,7 @@
     private PolicyEngine getPolicyEngine() {
         PolicyEngine policyEngine;
         try {
-            policyEngine = new PolicyEngine(appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath());
+            policyEngine = new PolicyEngine(appContext.getResource(cldsPolicyConfigFile).getURL().getPath());
         } catch (IOException e1) {
             throw new PolicyClientException("Exception when opening policy config file", e1);
         } catch (PolicyEngineException e) {
@@ -399,7 +402,6 @@
      *
      * @param prop
      *            The ModelProperties
-     *
      * @return The response message from policy
      */
     protected String deletePolicy(ModelProperties prop, String policyType) {
diff --git a/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcCatalogServices.java b/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcCatalogServices.java
index 6684f1a..45dbf81 100644
--- a/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcCatalogServices.java
+++ b/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcCatalogServices.java
@@ -60,7 +60,6 @@
 import org.apache.http.HttpHeaders;
 import org.onap.clamp.clds.exception.SdcCommunicationException;
 import org.onap.clamp.clds.model.CldsAlarmCondition;
-import org.onap.clamp.clds.model.CldsDBServiceCache;
 import org.onap.clamp.clds.model.CldsSdcArtifact;
 import org.onap.clamp.clds.model.CldsSdcResource;
 import org.onap.clamp.clds.model.CldsSdcResourceBasicInfo;
@@ -76,23 +75,25 @@
 import org.onap.clamp.clds.util.CryptoUtils;
 import org.onap.clamp.clds.util.LoggingUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
+@Component
 public class SdcCatalogServices {
 
     private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcCatalogServices.class);
     private static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
-    private static final String       RESOURCE_VF_TYPE              = "VF";
-    private static final String       RESOURCE_VFC_TYPE             = "VFC";
-    private static final String       RESOURCE_CVFC_TYPE            = "CVFC";
+    private static final String RESOURCE_VF_TYPE = "VF";
+    private static final String RESOURCE_VFC_TYPE = "VFC";
+    private static final String RESOURCE_CVFC_TYPE = "CVFC";
     private static final String SDC_REQUESTID_PROPERTY_NAME = "sdc.header.requestId";
-    private static final String       SDC_METADATA_URL_PREFIX       = "/metadata";
-    private static final String       SDC_INSTANCE_ID_PROPERTY_NAME = "sdc.InstanceID";
-    private static final String       SDC_CATALOG_URL_PROPERTY_NAME = "sdc.catalog.url";
-    private static final String       SDC_SERVICE_URL_PROPERTY_NAME = "sdc.serviceUrl";
-    private static final String       SDC_INSTANCE_ID_CLAMP         = "CLAMP-Tool";
-    private static final String       RESOURCE_URL_PREFIX           = "resources";
+    private static final String SDC_METADATA_URL_PREFIX = "/metadata";
+    private static final String SDC_INSTANCE_ID_PROPERTY_NAME = "sdc.InstanceID";
+    private static final String SDC_CATALOG_URL_PROPERTY_NAME = "sdc.catalog.url";
+    private static final String SDC_SERVICE_URL_PROPERTY_NAME = "sdc.serviceUrl";
+    private static final String SDC_INSTANCE_ID_CLAMP = "CLAMP-Tool";
+    private static final String RESOURCE_URL_PREFIX = "resources";
     @Autowired
-    private RefProp                   refProp;
+    private RefProp refProp;
 
     /**
      * Return SDC id and pw as a HTTP Basic Auth string (for example: Basic
@@ -131,7 +132,7 @@
         LoggingUtils.setTargetContext("SDC", "getSdcServicesInformation");
         try {
             String url = baseUrl;
-            if (uuid != null) {
+            if (uuid != null && !uuid.isEmpty()) {
                 url = baseUrl + "/" + uuid + SDC_METADATA_URL_PREFIX;
             }
             URL urlObj = new URL(url);
@@ -142,7 +143,7 @@
             conn.setRequestProperty(refProp.getStringValue(SDC_REQUESTID_PROPERTY_NAME), LoggingUtils.getRequestId());
             conn.setRequestMethod("GET");
             String resp = getResponse(conn);
-            logger.info(resp);
+            logger.debug("Services list received from SDC:" + resp);
             // metrics log
             LoggingUtils.setResponseContext("0", "Get sdc services success", this.getClass().getName());
             return resp;
@@ -333,7 +334,6 @@
         }
     }
 
-
     // upload artifact to sdc based on serviceUUID and resource name on url
     private String uploadArtifactToSdc(ModelProperties prop, String userid, String url, String formattedSdcReq) {
         // Verify whether it is triggered by Validation Test button from UI
@@ -422,23 +422,11 @@
         }
     }
 
-    public CldsDBServiceCache getCldsDbServiceCacheUsingCldsServiceData(CldsServiceData cldsServiceData) {
-        try {
-            CldsDBServiceCache cldsDbServiceCache = new CldsDBServiceCache();
-            cldsDbServiceCache.setCldsDataInstream(cldsServiceData);
-            cldsDbServiceCache.setInvariantId(cldsServiceData.getServiceInvariantUUID());
-            cldsDbServiceCache.setServiceId(cldsServiceData.getServiceUUID());
-            return cldsDbServiceCache;
-        } catch (IOException e) {
-            logger.error("Exception when getting service in cache", e);
-            throw new SdcCommunicationException("Exception when getting service in cache", e);
-        }
-    }
-
     /**
      * Check if the SDC Info in cache has expired.
      * 
      * @param cldsServiceData
+     *            The object representing the service data
      * @return boolean flag
      * @throws GeneralSecurityException
      *             In case of issues with the decryting the encrypted password
@@ -447,23 +435,25 @@
      */
     public boolean isCldsSdcCacheDataExpired(CldsServiceData cldsServiceData)
             throws GeneralSecurityException, DecoderException {
-        boolean expired = false;
         if (cldsServiceData != null && cldsServiceData.getServiceUUID() != null) {
             String cachedServiceUuid = cldsServiceData.getServiceUUID();
             String latestServiceUuid = getServiceUuidFromServiceInvariantId(cldsServiceData.getServiceInvariantUUID());
-            String defaultRecordAge = refProp.getStringValue("CLDS_SERVICE_CACHE_MAX_SECONDS");
-            if ((!cachedServiceUuid.equalsIgnoreCase(latestServiceUuid)) || (cldsServiceData.getAgeOfRecord() != null
-                    && cldsServiceData.getAgeOfRecord() > Long.parseLong(defaultRecordAge))) {
-                expired = true;
+            String configuredMaxAge = refProp.getStringValue("clds.service.cache.invalidate.after.seconds");
+            if (configuredMaxAge == null) {
+                logger.warn(
+                        "clds.service.cache.invalidate.after.seconds NOT set in clds-reference.properties file, taking 60s as default");
+                configuredMaxAge = "60";
             }
+            return (!cachedServiceUuid.equalsIgnoreCase(latestServiceUuid)) || (cldsServiceData.getAgeOfRecord() != null
+                    && cldsServiceData.getAgeOfRecord() > Long.parseLong(configuredMaxAge));
         } else {
-            expired = true;
+            return true;
         }
-        return expired;
     }
 
     /**
-     * Get the Service Data with Alarm Conditions for a given invariantServiceUuid.
+     * Get the Service Data with Alarm Conditions for a given
+     * invariantServiceUuid.
      * 
      * @param invariantServiceUuid
      * @return The CldsServiceData
@@ -510,8 +500,7 @@
                     cldsServiceData.setCldsVfs(cldsVfDataList);
                     // For each vf in the list , add all vfc's
                     getAllVfcForVfList(cldsVfDataList, catalogUrl);
-                    logger.info("value of cldsServiceData:" + cldsServiceData);
-                    logger.info("value of cldsServiceData:" + cldsServiceData.getServiceInvariantUUID());
+                    logger.info("Invariant Service ID of cldsServiceData:" + cldsServiceData.getServiceInvariantUUID());
                 }
             }
         }
@@ -606,17 +595,17 @@
 
     private void handleVFCtypeNode(ObjectNode currVfcNode, List<CldsVfcData> cldsVfcDataList) {
         CldsVfcData currCldsVfcData = new CldsVfcData();
-                    TextNode vfcResourceName = (TextNode) currVfcNode.get("resourceInstanceName");
-                    TextNode vfcInvariantResourceUuid = (TextNode) currVfcNode.get("resourceInvariantUUID");
-                    currCldsVfcData.setVfcName(vfcResourceName.textValue());
-                    currCldsVfcData.setVfcInvariantResourceUUID(vfcInvariantResourceUuid.textValue());
-                    cldsVfcDataList.add(currCldsVfcData);
+        TextNode vfcResourceName = (TextNode) currVfcNode.get("resourceInstanceName");
+        TextNode vfcInvariantResourceUuid = (TextNode) currVfcNode.get("resourceInvariantUUID");
+        currCldsVfcData.setVfcName(vfcResourceName.textValue());
+        currCldsVfcData.setVfcInvariantResourceUUID(vfcInvariantResourceUuid.textValue());
+        cldsVfcDataList.add(currCldsVfcData);
     }
 
     private void handleCVFCtypeNode(ObjectNode currVfcNode, List<CldsVfcData> cldsVfcDataList) {
         handleVFCtypeNode(currVfcNode, cldsVfcDataList);
-                    cldsVfcDataList.addAll(getVFCfromCVFC(currVfcNode.get("resourceUUID").textValue()));
-                }
+        cldsVfcDataList.addAll(getVFCfromCVFC(currVfcNode.get("resourceUUID").textValue()));
+    }
 
     private List<CldsVfcData> getVFCfromCVFC(String resourceUUID) {
         String catalogUrl = refProp.getStringValue(SDC_CATALOG_URL_PROPERTY_NAME);
@@ -786,7 +775,6 @@
         cldsAlarmConditionList.add(cldsAlarmCondition);
     }
 
-
     // Get the responses for the current artifact from the artifacts URL.
     private String getResponsesFromArtifactUrl(String artifactsUrl) {
         String hostUrl = refProp.getStringValue("sdc.hostUrl");
@@ -802,9 +790,9 @@
      * Service to services/resources/artifacts from sdc.Pass alarmConditions as
      * true to get alarm conditons from artifact url and else it is false
      * 
-     * @param url The URL to trigger
+     * @param url
+     *            The URL to trigger
      * @return The String containing the payload
-     * 
      */
     public String getCldsServicesOrResourcesBasedOnURL(String url) {
         Date startTime = new Date();
@@ -832,12 +820,12 @@
             logger.error("Exception occurred during query to SDC", e);
             return "";
         } catch (DecoderException e) {
-        	LoggingUtils.setResponseContext("900", "Get sdc resources failed", this.getClass().getName());
+            LoggingUtils.setResponseContext("900", "Get sdc resources failed", this.getClass().getName());
             LoggingUtils.setErrorContext("900", "Get sdc resources error");
             logger.error("Exception when attempting to decode the Hex string", e);
             throw new SdcCommunicationException("Exception when attempting to decode the Hex string", e);
         } catch (GeneralSecurityException e) {
-        	LoggingUtils.setResponseContext("900", "Get sdc resources failed", this.getClass().getName());
+            LoggingUtils.setResponseContext("900", "Get sdc resources failed", this.getClass().getName());
             LoggingUtils.setErrorContext("900", "Get sdc resources error");
             logger.error("Exception when attempting to decrypt the encrypted password", e);
             throw new SdcCommunicationException("Exception when attempting to decrypt the encrypted password", e);
@@ -901,7 +889,7 @@
             byIdObjectNode.putPOJO("byAlertDescription", alertDescObjectNodeByAlert);
             globalPropsJson = decodeGlobalProp(globalProps, mapper);
             globalPropsJson.putPOJO("shared", byIdObjectNode);
-            logger.info("value of objNode:" + globalPropsJson);
+            logger.info("Global properties JSON created with SDC info:" + globalPropsJson);
         } else {
             /**
              * to create json with total properties when no serviceUUID passed
diff --git a/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcReq.java b/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcReq.java
index d4b5b08..3fb53a3 100644
--- a/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcReq.java
+++ b/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcReq.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,8 +25,6 @@
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -42,7 +40,6 @@
 import java.util.Map.Entry;
 
 import org.apache.commons.codec.DecoderException;
-import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.onap.clamp.clds.client.req.tca.TcaRequestFormatter;
 import org.onap.clamp.clds.model.CldsSdcResource;
 import org.onap.clamp.clds.model.CldsSdcServiceDetail;
@@ -51,15 +48,20 @@
 import org.onap.clamp.clds.model.prop.Tca;
 import org.onap.clamp.clds.model.refprop.RefProp;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * Construct a Sdc request given CLDS objects.
  */
+@Component
 public class SdcReq {
-    protected static final EELFLogger logger        = EELFManager.getInstance().getLogger(SdcReq.class);
+
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcReq.class);
     protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
     @Autowired
-    protected RefProp                 refProp;
+    private SdcCatalogServices sdcCatalogServices;
+    @Autowired
+    protected RefProp refProp;
 
     /**
      * Format the Blueprint from a Yaml
@@ -68,17 +70,11 @@
      *            The ModelProperties describing the clds model
      * @param docText
      *            The Yaml file that must be converted
-     *
      * @return A String containing the BluePrint
-     * @throws JsonParseException
-     *             In case of issues
-     * @throws JsonMappingException
-     *             In case of issues
      * @throws IOException
      *             In case of issues
      */
-    public String formatBlueprint(ModelProperties prop, String docText)
-            throws JsonParseException, JsonMappingException, IOException {
+    public String formatBlueprint(ModelProperties prop, String docText) throws IOException {
         String yamlvalue = getYamlvalue(docText);
         String updatedBlueprint = "";
         Tca tca = prop.getType(Tca.class);
@@ -96,7 +92,6 @@
      *            The ModelProperties describing the clds model
      * @param artifactName
      *            The name of the artifact
-     *
      * @return SDC Locations request in the JSON Format
      */
     public String formatSdcLocationsReq(ModelProperties prop, String artifactName) {
@@ -127,11 +122,8 @@
      * @param artifactType
      *            The type of the artifact
      * @return formatted SDC Request
-     * @throws IOException
-     *             In case of issues
      */
-    public String formatSdcReq(String payloadData, String artifactName, String artifactLabel, String artifactType)
-            throws IOException {
+    public String formatSdcReq(String payloadData, String artifactName, String artifactLabel, String artifactType) {
         logger.info("artifact=" + payloadData);
         String base64Artifact = Base64.getEncoder().encodeToString(payloadData.getBytes(StandardCharsets.UTF_8));
         return "{ \n" + "\"payloadData\" : \"" + base64Artifact + "\",\n" + "\"artifactLabel\" : \"" + artifactLabel
@@ -144,46 +136,47 @@
      * To get List of urls for all vfresources
      *
      * @param prop
+     *            The model properties JSON describing the closed loop flow
      * @param baseUrl
-     * @param sdcCatalogServices
-     * @param execution
-     * @return
+     *            The URL to trigger
+     * @return A list of Service URL
      * @throws GeneralSecurityException
      *             In case of issues when decrypting the password
      * @throws DecoderException
      *             In case of issues when decoding the Hex String
      */
-    public List<String> getSdcReqUrlsList(ModelProperties prop, String baseUrl, SdcCatalogServices sdcCatalogServices,
-            DelegateExecution execution) throws GeneralSecurityException, DecoderException {
-        // TODO : refact and regroup with very similar code
+    public List<String> getSdcReqUrlsList(ModelProperties prop, String baseUrl)
+            throws GeneralSecurityException, DecoderException {
         List<String> urlList = new ArrayList<>();
         Global globalProps = prop.getGlobal();
-        if (globalProps != null) {
-            if (globalProps.getService() != null) {
-                String serviceInvariantUUID = globalProps.getService();
-                execution.setVariable("serviceInvariantUUID", serviceInvariantUUID);
-                List<String> resourceVfList = globalProps.getResourceVf();
-                String serviceUUID = sdcCatalogServices.getServiceUuidFromServiceInvariantId(serviceInvariantUUID);
-                String sdcServicesInformation = sdcCatalogServices.getSdcServicesInformation(serviceUUID);
-                CldsSdcServiceDetail cldsSdcServiceDetail = sdcCatalogServices
-                        .getCldsSdcServiceDetailFromJson(sdcServicesInformation);
-                if (cldsSdcServiceDetail != null && resourceVfList != null) {
-                    List<CldsSdcResource> cldsSdcResourcesList = cldsSdcServiceDetail.getResources();
-                    if (cldsSdcResourcesList != null && !cldsSdcResourcesList.isEmpty()) {
-                        for (CldsSdcResource CldsSdcResource : cldsSdcResourcesList) {
-                            if (CldsSdcResource != null && CldsSdcResource.getResoucreType() != null
-                                    && CldsSdcResource.getResoucreType().equalsIgnoreCase("VF")
-                                    && resourceVfList.contains(CldsSdcResource.getResourceInvariantUUID())) {
-                                String normalizedResourceInstanceName = normalizeResourceInstanceName(
-                                        CldsSdcResource.getResourceInstanceName());
-                                String svcUrl = baseUrl + "/" + serviceUUID + "/resourceInstances/"
-                                        + normalizedResourceInstanceName + "/artifacts";
-                                urlList.add(svcUrl);
-                            }
+        if (globalProps != null && globalProps.getService() != null) {
+            String serviceInvariantUUID = globalProps.getService();
+            List<String> resourceVfList = globalProps.getResourceVf();
+            String serviceUUID = sdcCatalogServices.getServiceUuidFromServiceInvariantId(serviceInvariantUUID);
+            CldsSdcServiceDetail cldsSdcServiceDetail = sdcCatalogServices
+                    .getCldsSdcServiceDetailFromJson(sdcCatalogServices.getSdcServicesInformation(serviceUUID));
+            if (cldsSdcServiceDetail != null && resourceVfList != null) {
+                List<CldsSdcResource> cldsSdcResourcesList = cldsSdcServiceDetail.getResources();
+                if (cldsSdcResourcesList != null && !cldsSdcResourcesList.isEmpty()) {
+                    for (CldsSdcResource cldsSdcResource : cldsSdcResourcesList) {
+                        if (cldsSdcResource != null && cldsSdcResource.getResoucreType() != null
+                                && cldsSdcResource.getResoucreType().equalsIgnoreCase("VF")
+                                && resourceVfList.contains(cldsSdcResource.getResourceInvariantUUID())) {
+                            String normalizedResourceInstanceName = normalizeResourceInstanceName(
+                                    cldsSdcResource.getResourceInstanceName());
+                            String svcUrl = baseUrl + "/" + serviceUUID + "/resourceInstances/"
+                                    + normalizedResourceInstanceName + "/artifacts";
+                            urlList.add(svcUrl);
+                        } else {
+                            logger.warn("The VF Resource invariant UUID (" + cldsSdcResource.getResourceInvariantUUID()
+                                    + ") has not been found in the Service (Invariant ID:" + serviceInvariantUUID
+                                    + ")VF resource list");
                         }
                     }
                 }
             }
+        } else {
+            logger.warn("GlobalProperties json is empty, skipping getSdcReqUrlsList and returning empty list");
         }
         return urlList;
     }
@@ -201,16 +194,18 @@
     }
 
     /**
-     * Method to get yaml/template properties value from json
+     * Method to get yaml/template properties value from json.
      *
-     * @param docText
-     * @return
+     * @param jsonGlobal
+     *            The Json containing a Yaml file
+     * @return The yaml extracted from the JSON
      * @throws IOException
+     *             In case of issues with the Json parser
      */
-    public String getYamlvalue(String docText) throws IOException {
+    protected String getYamlvalue(String jsonGlobal) throws IOException {
         ObjectMapper objectMapper = new ObjectMapper();
         String yamlFileValue = "";
-        ObjectNode root = objectMapper.readValue(docText, ObjectNode.class);
+        ObjectNode root = objectMapper.readValue(jsonGlobal, ObjectNode.class);
         Iterator<Entry<String, JsonNode>> entryItr = root.fields();
         while (entryItr.hasNext()) {
             Entry<String, JsonNode> entry = entryItr.next();
diff --git a/src/main/java/org/onap/clamp/clds/config/CamundaEngineConfiguration.java b/src/main/java/org/onap/clamp/clds/config/CamundaEngineConfiguration.java
deleted file mode 100644
index 3790e23..0000000
--- a/src/main/java/org/onap/clamp/clds/config/CamundaEngineConfiguration.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
- *                             reserved.
- * ================================================================================
- * 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============================================
- * ===================================================================
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- */
-
-package org.onap.clamp.clds.config;
-
-import java.security.GeneralSecurityException;
-
-import javax.sql.DataSource;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-@Configuration
-public class CamundaEngineConfiguration {
-    /**
-     * Camunda Identity database DataSource configuration
-     * 
-     * @return
-     * @throws GeneralSecurityException
-     *             In case of issue during the decoding of the password
-     */
-    @Primary
-    @Bean(name = "camundaBpmDataSource")
-    @ConfigurationProperties(prefix = "spring.datasource.camunda")
-    public DataSource dataSource() {
-        return new EncodedPasswordBasicDataSource();
-    }
-}
diff --git a/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java b/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java
index b99d3a9..ae97041 100644
--- a/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java
+++ b/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java
@@ -26,21 +26,7 @@
 import javax.sql.DataSource;
 import javax.xml.transform.TransformerConfigurationException;
 
-import org.onap.clamp.clds.client.CldsEventDelegate;
-import org.onap.clamp.clds.client.DcaeDispatcherServices;
-import org.onap.clamp.clds.client.DcaeInventoryServices;
-import org.onap.clamp.clds.client.HolmesPolicyDelegate;
-import org.onap.clamp.clds.client.HolmesPolicyDeleteDelegate;
-import org.onap.clamp.clds.client.OperationalPolicyDelegate;
-import org.onap.clamp.clds.client.OperationalPolicyDeleteDelegate;
-import org.onap.clamp.clds.client.SdcSendReqDelegate;
-import org.onap.clamp.clds.client.TcaPolicyDelegate;
-import org.onap.clamp.clds.client.TcaPolicyDeleteDelegate;
-import org.onap.clamp.clds.client.req.policy.PolicyClient;
-import org.onap.clamp.clds.client.req.sdc.SdcCatalogServices;
-import org.onap.clamp.clds.client.req.sdc.SdcReq;
 import org.onap.clamp.clds.dao.CldsDao;
-import org.onap.clamp.clds.model.refprop.RefProp;
 import org.onap.clamp.clds.transform.XslTransformer;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.config.PropertiesFactoryBean;
@@ -85,74 +71,4 @@
         xslTransformer.setXslResourceName("xsl/clds-bpmn-transformer.xsl");
         return xslTransformer;
     }
-
-    @Bean
-    public RefProp getRefProp() {
-        return new RefProp();
-    }
-
-    @Bean
-    public SdcReq getSdcReq() {
-        return new SdcReq();
-    }
-
-    @Bean
-    public PolicyClient getPolicyClient() {
-        return new PolicyClient();
-    }
-
-    @Bean(name = "cldsEventDelegate")
-    public CldsEventDelegate getCldsEventDelegate() {
-        return new CldsEventDelegate();
-    }
-
-    @Bean(name = "sdcSendReqDelegate")
-    public SdcSendReqDelegate getSdcSendReqDelegate() {
-        return new SdcSendReqDelegate();
-    }
-
-    @Bean(name = "operationalPolicyDelegate")
-    public OperationalPolicyDelegate getOperationalPolicyDelegate() {
-        return new OperationalPolicyDelegate();
-    }
-
-    @Bean(name = "operationalPolicyDeleteDelegate")
-    public OperationalPolicyDeleteDelegate getOperationalPolicyDeleteDelegate() {
-        return new OperationalPolicyDeleteDelegate();
-    }
-
-    @Bean(name = "sdcCatalogServices")
-    public SdcCatalogServices getSdcCatalogServices() {
-        return new SdcCatalogServices();
-    }
-
-    @Bean(name = "dcaeDispatcherServices")
-    public DcaeDispatcherServices getDcaeDispatcherServices() {
-        return new DcaeDispatcherServices();
-    }
-
-    @Bean(name = "dcaeInventoryServices")
-    public DcaeInventoryServices getDcaeInventoryServices() {
-        return new DcaeInventoryServices();
-    }
-
-    @Bean(name = "tcaPolicyDelegate")
-    public TcaPolicyDelegate getTcaPolicyDelegate() {
-        return new TcaPolicyDelegate();
-    }
-
-    @Bean(name = "tcaPolicyDeleteDelegate")
-    public TcaPolicyDeleteDelegate getTcaPolicyDeleteDelegate() {
-        return new TcaPolicyDeleteDelegate();
-    }
-
-    @Bean(name = "holmesPolicyDelegate")
-    public HolmesPolicyDelegate getHolmesPolicyDelegate() {
-        return new HolmesPolicyDelegate();
-    }
-
-    @Bean(name = "holmesPolicyDeleteDelegate")
-    public HolmesPolicyDeleteDelegate getHolmesPolicyDeleteDelegate() {
-        return new HolmesPolicyDeleteDelegate();
-    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/onap/clamp/clds/exception/CldsDelegateException.java b/src/main/java/org/onap/clamp/clds/exception/CldsDelegateException.java
new file mode 100644
index 0000000..3a6a816
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/exception/CldsDelegateException.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * 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============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.exception;
+
+/**
+ * New exception to CldsDelegate errors.
+ */
+public class CldsDelegateException extends RuntimeException {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = -2705212640916671093L;
+
+    /**
+     * This constructor can be used to create a new CldsDelegateException.
+     * 
+     * @param message
+     *            A string message detailing the problem
+     * @param e
+     *            The exception sent by the code
+     */
+    public CldsDelegateException(String message, Throwable e) {
+        super(message, e);
+    }
+
+    /**
+     * This constructor can be used to create a new CldsDelegateException. Use
+     * this constructor only if you are creating a new exception stack, not if
+     * an exception was already raised by another code.
+     *
+     * @param message
+     *            A string message detailing the problem
+     */
+    public CldsDelegateException(String message) {
+        super(message);
+    }
+}
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java b/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java
index fae5e58..dca93e4 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,7 +25,6 @@
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
@@ -37,7 +36,7 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.apache.camel.Exchange;
 import org.onap.clamp.clds.exception.ModelBpmnException;
 import org.onap.clamp.clds.model.CldsEvent;
 import org.onap.clamp.clds.model.CldsModel;
@@ -47,22 +46,21 @@
  * Parse model properties.
  */
 public class ModelProperties {
-    protected static final EELFLogger                                 logger              = EELFManager.getInstance()
-            .getLogger(CldsService.class);
-    protected static final EELFLogger                                 auditLogger         = EELFManager.getInstance()
-            .getAuditLogger();
-    private ModelBpmn                                                 modelBpmn;
-    private JsonNode                                                  modelJson;
-    private final String                                              modelName;
-    private final String                                              controlName;
-    private final String                                              actionCd;
+
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsService.class);
+    protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger();
+    private ModelBpmn modelBpmn;
+    private JsonNode modelJson;
+    private final String modelName;
+    private final String controlName;
+    private final String actionCd;
     // Flag indicate whether it is triggered by Validation Test button from UI
-    private final boolean                                             testOnly;
-    private Global                                                    global;
-    private final Map<String, AbstractModelElement>                   modelElements       = new ConcurrentHashMap<>();
-    private String                                                    currentModelElementId;
-    private String                                                    policyUniqueId;
-    private static final Object                                       lock                = new Object();
+    private final boolean testOnly;
+    private Global global;
+    private final Map<String, AbstractModelElement> modelElements = new ConcurrentHashMap<>();
+    private String currentModelElementId;
+    private String policyUniqueId;
+    private static final Object lock = new Object();
     private static Map<Class<? extends AbstractModelElement>, String> modelElementClasses = new ConcurrentHashMap<>();
     static {
         synchronized (lock) {
@@ -107,11 +105,9 @@
 
     /**
      * This method is meant to ensure that one ModelElement instance exists for
-     * each ModelElement class.
-     *
-     * As new ModelElement classes could have been registered after
-     * instantiation of this ModelProperties, we need to build the missing
-     * ModelElement instances.
+     * each ModelElement class. As new ModelElement classes could have been
+     * registered after instantiation of this ModelProperties, we need to build
+     * the missing ModelElement instances.
      */
     private final void instantiateMissingModelElements() {
         if (modelElementClasses.size() != modelElements.size()) {
@@ -160,20 +156,21 @@
     }
 
     /**
-     * Create ModelProperties for Camunda Delegate.
+     * Create ModelProperties extracted from a CamelExchange.
      *
-     * @param execution
-     * @return
-     * @throws JsonProcessingException
-     * @throws IOException
+     * @param camelExchange
+     *            The camel Exchange object that contains all info provided to
+     *            the flow
+     * @return A model Properties created from the parameters found in
+     *         camelExchange object
      */
-    public static ModelProperties create(DelegateExecution execution) {
-        String modelProp = new String((byte[]) execution.getVariable("modelProp"));
-        String modelBpmnProp = (String) execution.getVariable("modelBpmnProp");
-        String modelName = (String) execution.getVariable("modelName");
-        String controlName = (String) execution.getVariable("controlName");
-        String actionCd = (String) execution.getVariable("actionCd");
-        boolean isTest = (boolean) execution.getVariable("isTest");
+    public static ModelProperties create(Exchange camelExchange) {
+        String modelProp = (String) camelExchange.getProperty("modelProp");
+        String modelBpmnProp = (String) camelExchange.getProperty("modelBpmnProp");
+        String modelName = (String) camelExchange.getProperty("modelName");
+        String controlName = (String) camelExchange.getProperty("controlName");
+        String actionCd = (String) camelExchange.getProperty("actionCd");
+        boolean isTest = (boolean) camelExchange.getProperty("isTest");
         return new ModelProperties(modelName, controlName, actionCd, isTest, modelBpmnProp, modelProp);
     }
 
diff --git a/src/main/java/org/onap/clamp/clds/model/refprop/RefProp.java b/src/main/java/org/onap/clamp/clds/model/refprop/RefProp.java
index 5965a41..f0cf71c 100644
--- a/src/main/java/org/onap/clamp/clds/model/refprop/RefProp.java
+++ b/src/main/java/org/onap/clamp/clds/model/refprop/RefProp.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,18 +25,22 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.annotation.PostConstruct;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.io.Resource;
-
-import javax.annotation.PostConstruct;
-import java.io.IOException;
-import java.util.Properties;
+import org.springframework.stereotype.Component;
 
 /**
  * Holds reference properties.
  */
+@Component
 public class RefProp {
 
     @Autowired
@@ -103,5 +107,4 @@
         ObjectMapper objectMapper = new ObjectMapper();
         return objectMapper.readValue(getStringValue(key1, key2), JsonNode.class);
     }
-
 }
diff --git a/src/main/java/org/onap/clamp/clds/service/CldsService.java b/src/main/java/org/onap/clamp/clds/service/CldsService.java
index 1238236..a139de1 100644
--- a/src/main/java/org/onap/clamp/clds/service/CldsService.java
+++ b/src/main/java/org/onap/clamp/clds/service/CldsService.java
@@ -56,11 +56,11 @@
 import javax.ws.rs.core.MediaType;
 import javax.xml.transform.TransformerException;
 
+import org.apache.camel.Produce;
 import org.apache.commons.codec.DecoderException;
 import org.apache.commons.lang3.StringUtils;
-import org.camunda.bpm.engine.RuntimeService;
-import org.camunda.bpm.engine.runtime.ProcessInstance;
 import org.json.simple.parser.ParseException;
+import org.onap.clamp.clds.camel.CamelProxy;
 import org.onap.clamp.clds.client.DcaeDispatcherServices;
 import org.onap.clamp.clds.client.DcaeInventoryServices;
 import org.onap.clamp.clds.client.req.sdc.SdcCatalogServices;
@@ -101,6 +101,8 @@
 @Path("/clds")
 public class CldsService extends SecureServiceBase {
 
+    @Produce(uri = "direct:processSubmit")
+    private CamelProxy camelProxy;
     protected static final EELFLogger securityLogger = EELFManager.getInstance().getSecurityLogger();
     @Autowired
     private ApplicationContext appContext;
@@ -138,8 +140,6 @@
     @Autowired
     private CldsDao cldsDao;
     @Autowired
-    private RuntimeService runtimeService;
-    @Autowired
     private XslTransformer cldsBpmnTransformer;
     @Autowired
     private RefProp refProp;
@@ -410,7 +410,7 @@
                 cldsPermissionInstance, actionCd);
         isAuthorized(permisionManage);
         isAuthorizedForVf(model);
-        String userid = getUserId();
+        String userId = getUserId();
         String actionStateCd = CldsEvent.ACTION_STATE_INITIATED;
         String processDefinitionKey = "clds-process-action-wf";
         logger.info("PUT actionCd={}", actionCd);
@@ -420,7 +420,7 @@
         logger.info("PUT test={}", test);
         logger.info("PUT bpmnText={}", model.getBpmnText());
         logger.info("PUT propText={}", model.getPropText());
-        logger.info("PUT userid={}", userid);
+        logger.info("PUT userId={}", userId);
         logger.info("PUT getTypeId={}", model.getTypeId());
         logger.info("PUT deploymentId={}", model.getDeploymentId());
         if (model.getTemplateName() != null) {
@@ -462,7 +462,7 @@
         logger.info("PUT isInsertTestEvent={}", isInsertTestEvent);
         // determine if requested action is permitted
         model.validateAction(actionCd);
-        // input variables to camunda process
+        // input variables for Camel process
         Map<String, Object> variables = new HashMap<>();
         variables.put("actionCd", actionCd);
         variables.put("modelProp", prop.getBytes());
@@ -471,18 +471,18 @@
         variables.put("controlName", controlName);
         variables.put("docText", docText.getBytes());
         variables.put("isTest", isTest);
-        variables.put("userid", userid);
+        variables.put("userid", userId);
         variables.put("isInsertTestEvent", isInsertTestEvent);
         logger.info("modelProp - " + prop);
         logger.info("docText - " + docText);
+        // ModelProperties modelProperties = new ModelProperties(modelName,
+        // controlName, actionCd, isTest, modelBpmnProp, modelProp);
         try {
-            // start camunda process
-            ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);
-            // log process info
-            logger.info("Started processDefinitionId={}, processInstanceId={}", pi.getProcessDefinitionId(),
-                    pi.getProcessInstanceId());
+            String result = camelProxy.submit(actionCd, prop, bpmnJson, modelName, controlName, docText, isTest, userId,
+                    isInsertTestEvent);
+            logger.info("Starting Camel flow on request, result is: ", result);
         } catch (SdcCommunicationException | PolicyClientException | BadRequestException e) {
-            logger.error("Exception occured during invoking bpmn process", e);
+            logger.error("Exception occured during invoking Camel process", e);
             throw new CldsConfigException(e.getMessage(), e);
         }
         // refresh model info from db (get fresh event info)
@@ -605,39 +605,26 @@
      *             In case of issues with the decryting the encrypted password
      * @throws DecoderException
      *             In case of issues with the decoding of the Hex String
+     * @throws IOException
+     *             In case of issue to convert CldsServiceCache to InputStream
      */
     @GET
     @Path("/properties/{serviceInvariantUUID}")
     @Produces(MediaType.APPLICATION_JSON)
     public String getSdcPropertiesByServiceUUIDForRefresh(
             @PathParam("serviceInvariantUUID") String serviceInvariantUUID,
-            @DefaultValue("false") @QueryParam("refresh") String refresh)
-            throws GeneralSecurityException, DecoderException {
+            @DefaultValue("false") @QueryParam("refresh") boolean refresh)
+            throws GeneralSecurityException, DecoderException, IOException {
         Date startTime = new Date();
         LoggingUtils.setRequestContext("CldsService: GET sdc properties by uuid", getPrincipalName());
         CldsServiceData cldsServiceData = new CldsServiceData();
         cldsServiceData.setServiceInvariantUUID(serviceInvariantUUID);
-        boolean isCldsSdcDataExpired = true;
-        // To getcldsService information from database cache using invariantUUID
-        // only when refresh = false
-        if (refresh != null && refresh.equalsIgnoreCase("false")) {
-            cldsServiceData = cldsServiceData.getCldsServiceCache(cldsDao, serviceInvariantUUID);
-            // If cldsService is available in database Cache , verify is data
-            // expired or not
-            if (cldsServiceData != null) {
-                isCldsSdcDataExpired = sdcCatalogServices.isCldsSdcCacheDataExpired(cldsServiceData);
-            }
+        if (!refresh) {
+            cldsServiceData = cldsDao.getCldsServiceCache(serviceInvariantUUID);
         }
-        // If user Requested for refresh or database cache expired , get all
-        // data from sdc api.
-        if ((refresh != null && refresh.equalsIgnoreCase("true")) || isCldsSdcDataExpired) {
+        if (sdcCatalogServices.isCldsSdcCacheDataExpired(cldsServiceData)) {
             cldsServiceData = sdcCatalogServices.getCldsServiceDataWithAlarmConditions(serviceInvariantUUID);
-            CldsDBServiceCache cldsDBServiceCache = sdcCatalogServices
-                    .getCldsDbServiceCacheUsingCldsServiceData(cldsServiceData);
-            if (cldsDBServiceCache != null && cldsDBServiceCache.getInvariantId() != null
-                    && cldsDBServiceCache.getServiceId() != null) {
-                cldsServiceData.setCldsServiceCache(cldsDao, cldsDBServiceCache);
-            }
+            cldsDao.setCldsServiceCache(new CldsDBServiceCache(cldsServiceData));
         }
         // filter out VFs the user is not authorized for
         cldsServiceData.filterVfs(this);
diff --git a/src/main/java/org/onap/clamp/clds/service/CldsUser.java b/src/main/java/org/onap/clamp/clds/service/CldsUser.java
index 3dfeaeb..fa7a738 100644
--- a/src/main/java/org/onap/clamp/clds/service/CldsUser.java
+++ b/src/main/java/org/onap/clamp/clds/service/CldsUser.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License"); 
@@ -29,9 +29,8 @@
  * The class represents the CldsUser that can be extracted from cldsusers.json.
  */
 public class CldsUser {
-
-    private String user;
-    private String password;
+    private String                    user;
+    private String                    password;
     private SecureServicePermission[] permissions;
 
     /**
diff --git a/src/main/java/org/onap/clamp/clds/service/JerseyConfig.java b/src/main/java/org/onap/clamp/clds/service/JaxrsApplication.java
similarity index 78%
rename from src/main/java/org/onap/clamp/clds/service/JerseyConfig.java
rename to src/main/java/org/onap/clamp/clds/service/JaxrsApplication.java
index 0ffe410..d6e74ae 100644
--- a/src/main/java/org/onap/clamp/clds/service/JerseyConfig.java
+++ b/src/main/java/org/onap/clamp/clds/service/JaxrsApplication.java
@@ -23,19 +23,12 @@
 
 package org.onap.clamp.clds.service;
 
-import org.glassfish.jersey.server.ResourceConfig;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
 import org.springframework.stereotype.Component;
 
 @Component
-public class JerseyConfig extends ResourceConfig {
-
-    public JerseyConfig() {
-        registerEndpoints();
-    }
-
-    private void registerEndpoints() {
-        register(CldsService.class);
-        register(UserService.class);
-        register(CldsTemplateService.class);
-    }
+@ApplicationPath("/restservices/clds/v1")
+public class JaxrsApplication extends Application {
 }
\ No newline at end of file
diff --git a/src/main/java/org/onap/clamp/clds/service/JerseyConfig.java b/src/main/java/org/onap/clamp/clds/util/LogMessages.java
similarity index 66%
copy from src/main/java/org/onap/clamp/clds/service/JerseyConfig.java
copy to src/main/java/org/onap/clamp/clds/util/LogMessages.java
index 0ffe410..8088786 100644
--- a/src/main/java/org/onap/clamp/clds/service/JerseyConfig.java
+++ b/src/main/java/org/onap/clamp/clds/util/LogMessages.java
@@ -2,40 +2,34 @@
  * ============LICENSE_START=======================================================
  * ONAP CLAMP
  * ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
+ * 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
+ * 
+ * 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============================================
  * ===================================================================
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
  */
 
-package org.onap.clamp.clds.service;
+package org.onap.clamp.clds.util;
 
-import org.glassfish.jersey.server.ResourceConfig;
-import org.springframework.stereotype.Component;
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import com.att.eelf.i18n.EELFResourceManager;
 
-@Component
-public class JerseyConfig extends ResourceConfig {
+public enum LogMessages implements EELFResolvableErrorEnum {
+    LOGSERVICE_HELLO_MESSAGE, LOGSERVICE_EMAIL_ERROR, LOGSERVICE_EMAIL_CLASS, LOGSERVICE_EMAIL_CLASS_NULL, PROCESS_INSTANCE_ID;
 
-    public JerseyConfig() {
-        registerEndpoints();
+    static {
+        EELFResourceManager.loadMessageBundle("logmessages");
     }
-
-    private void registerEndpoints() {
-        register(CldsService.class);
-        register(UserService.class);
-        register(CldsTemplateService.class);
-    }
-}
\ No newline at end of file
+}
diff --git a/src/main/resources/META-INF/processes.xml b/src/main/resources/META-INF/processes.xml
deleted file mode 100644
index 921a102..0000000
--- a/src/main/resources/META-INF/processes.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ============LICENSE_START=======================================================
-  ONAP CLAMP
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights
-                              reserved.
-  ================================================================================
-  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============================================
-  ===================================================================
-  ECOMP is a trademark and service mark of AT&T Intellectual Property.
-  -->
-
-<process-application
-	xmlns="http://www.camunda.org/schema/1.0/ProcessApplication" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<process-archive name="clds-process-archive">
-		<process-engine>default</process-engine>
-		<resource>bpmn/clds-process-action.bpmn</resource>
-		<properties>
-			<property name="isDeleteUponUndeploy">true</property>
-			<property name="isScanForProcessDefinitions">false</property>
-		</properties>
-	</process-archive>
-
-</process-application>
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 1db0875..dd4ea6d 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -62,8 +62,6 @@
 
 server.contextPath=/
 #Modified engine-rest applicationpath
-#camel.component.servlet.mapping.context-path=/restservices/clds/v1/*
-spring.jersey.application-path=/restservices/clds/v1
 spring.profiles.active=clamp-default,clamp-spring-authentication
 
 #The max number of active threads in this pool
@@ -78,34 +76,15 @@
 
 camel.springboot.consumer-template-cache-size=1000
 camel.springboot.producer-template-cache-size=1000
-camel.springboot.jmx-enabled=true
+camel.springboot.jmx-enabled=false
 camel.defaultthreadpool.poolsize=10
 camel.defaultthreadpool.maxpoolsize=20
 camel.defaultthreadpool.maxqueuesize=1000
 camel.defaultthreadpool.keepaliveTime=60
 camel.defaultthreadpool.rejectpolicy=CallerRuns
-
-#server.port=0
-#Camunda Process Engine DataSource connection Details
-spring.datasource.camunda.driverClassName=org.mariadb.jdbc.Driver
-spring.datasource.camunda.url=jdbc:mariadb:sequential://localhost:${docker.mariadb.port.host}/camundabpm?autoReconnect=true&retriesAllDown=2147483647&failoverLoopRetries=2147483647
-spring.datasource.camunda.username=camunda
-spring.datasource.camunda.password=e1bb2a8381d1aa6c09879bd627db3bb560ad29e8a3343fe6aa7e6a7ba622da4e
-spring.datasource.camunda.validationQuery=SELECT 1
-spring.datasource.camunda.validationQueryTimeout=20000
-spring.datasource.camunda.validationInterval=30000
-spring.datasource.camunda.testWhileIdle = true
-spring.datasource.camunda.minIdle = 0
-spring.datasource.camunda.initialSize=0
-# Automatically test whether a connection provided is good or not
-spring.datasource.camunda.testOnBorrow=true
-spring.datasource.camunda.ignoreExceptionOnPreLoad=true
-
-#Camunda application properties
-#Camunda history level
-camunda.bpm.history-level=auto
-camunda.bpm.database.type=mariadb
-camunda.bpm.database.schema-update=true
+#camel.springboot.xmlRoutes = false
+camel.springboot.xmlRoutes=classpath:/clds/camel/*.xml
+#camel.springboot.typeConversion = false
 
 #clds datasource connection details
 spring.datasource.cldsdb.driverClassName=org.mariadb.jdbc.Driver
diff --git a/src/main/resources/bpmn/clds-process-action.bpmn b/src/main/resources/bpmn/clds-process-action.bpmn
deleted file mode 100644
index 11edc07..0000000
--- a/src/main/resources/bpmn/clds-process-action.bpmn
+++ /dev/null
@@ -1,384 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_-A31MBMpEea185sFktMJ7Q" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.7.2" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
-  <bpmn2:collaboration id="_Collaboration_2">
-    <bpmn2:participant id="_Participant_2" name="Process Action" processRef="clds-process-action-wf" />
-  </bpmn2:collaboration>
-  <bpmn2:process id="clds-process-action-wf" name="CLDS Process Action Workflow" isExecutable="true">
-    <bpmn2:laneSet id="LaneSet_1" name="Lane Set 1">
-      <bpmn2:lane id="Lane_1" name="Submit or Resubmit">
-        <bpmn2:flowNodeRef>ExclusiveGateway_2</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>EndEvent_1</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>insEvent</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>ExclusiveGateway_3</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>sendOpPolicyReqDistribute</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>StartEvent_1</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>ServiceTask_0x8ypxf</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>sendTcaReqDistribute</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>sendHolmesReqDistribute</bpmn2:flowNodeRef>
-      </bpmn2:lane>
-      <bpmn2:lane id="Lane_5" name="Delete">
-        <bpmn2:flowNodeRef>sendTcaReqDelete</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>sendOpPolicyReqDelete</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>sendHolmesReqDelete</bpmn2:flowNodeRef>
-      </bpmn2:lane>
-      <bpmn2:lane id="Lane_4" name="Update">
-        <bpmn2:flowNodeRef>sendOpPolicyReqUpdate</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>sendTcaReqUpdate</bpmn2:flowNodeRef>
-        <bpmn2:flowNodeRef>sendHolmesReqUpdate</bpmn2:flowNodeRef>
-      </bpmn2:lane>
-      <bpmn2:lane id="Lane_6" name="Stop">
-        <bpmn2:flowNodeRef>sendOpPolicyReqStop</bpmn2:flowNodeRef>
-      </bpmn2:lane>
-      <bpmn2:lane id="Lane_7" name="Restart">
-        <bpmn2:flowNodeRef>sendOpPolicyReqRestart</bpmn2:flowNodeRef>
-      </bpmn2:lane>
-    </bpmn2:laneSet>
-    <bpmn2:exclusiveGateway id="ExclusiveGateway_2">
-      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing>
-      <bpmn2:outgoing>SequenceFlow_27</bpmn2:outgoing>
-      <bpmn2:outgoing>SequenceFlow_29</bpmn2:outgoing>
-      <bpmn2:outgoing>SequenceFlow_31</bpmn2:outgoing>
-      <bpmn2:outgoing>SequenceFlow_15</bpmn2:outgoing>
-      <bpmn2:outgoing>SequenceFlow_1xlfq66</bpmn2:outgoing>
-    </bpmn2:exclusiveGateway>
-    <bpmn2:sequenceFlow id="SequenceFlow_4" name="" sourceRef="ExclusiveGateway_2" targetRef="ServiceTask_0x8ypxf">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[${ actionCd == 'SUBMIT' || actionCd == 'RESUBMIT' }]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
-    <bpmn2:endEvent id="EndEvent_1">
-      <bpmn2:incoming>SequenceFlow_16</bpmn2:incoming>
-    </bpmn2:endEvent>
-    <bpmn2:serviceTask id="insEvent" name="Insert Event to indicate that the action was completed" camunda:delegateExpression="${cldsEventDelegate}">
-      <bpmn2:extensionElements>
-        <camunda:inputOutput>
-          <camunda:inputParameter name="actionStateCd">SENT</camunda:inputParameter>
-        </camunda:inputOutput>
-      </bpmn2:extensionElements>
-      <bpmn2:incoming>SequenceFlow_7</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_16</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_16" name="" sourceRef="insEvent" targetRef="EndEvent_1" />
-    <bpmn2:exclusiveGateway id="ExclusiveGateway_3">
-      <bpmn2:incoming>SequenceFlow_10</bpmn2:incoming>
-      <bpmn2:incoming>SequenceFlow_28</bpmn2:incoming>
-      <bpmn2:incoming>SequenceFlow_30</bpmn2:incoming>
-      <bpmn2:incoming>SequenceFlow_32</bpmn2:incoming>
-      <bpmn2:incoming>SequenceFlow_6</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_7</bpmn2:outgoing>
-    </bpmn2:exclusiveGateway>
-    <bpmn2:sequenceFlow id="SequenceFlow_7" name="" sourceRef="ExclusiveGateway_3" targetRef="insEvent" />
-    <bpmn2:serviceTask id="sendOpPolicyReqDistribute" name="Send Operation Policy Request [Submit]" camunda:delegateExpression="${operationalPolicyDelegate}">
-      <bpmn2:incoming>SequenceFlow_1tu9g11</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_10</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_10" name="" sourceRef="sendOpPolicyReqDistribute" targetRef="ExclusiveGateway_3" />
-    <bpmn2:serviceTask id="sendOpPolicyReqUpdate" name="Send Operation Policy Request [Update]" camunda:delegateExpression="${operationalPolicyDelegate}">
-      <bpmn2:incoming>SequenceFlow_0ejpmee</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_28</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_27" name="" sourceRef="ExclusiveGateway_2" targetRef="sendTcaReqUpdate">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[${ actionCd == 'UPDATE' }]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
-    <bpmn2:sequenceFlow id="SequenceFlow_28" name="" sourceRef="sendOpPolicyReqUpdate" targetRef="ExclusiveGateway_3" />
-    <bpmn2:serviceTask id="sendOpPolicyReqStop" name="Send Operation Policy Request [Stop]" camunda:delegateExpression="${operationalPolicyDeleteDelegate}">
-      <bpmn2:incoming>SequenceFlow_29</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_30</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_29" name="" sourceRef="ExclusiveGateway_2" targetRef="sendOpPolicyReqStop">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[${ actionCd == 'STOP' }]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
-    <bpmn2:sequenceFlow id="SequenceFlow_30" name="" sourceRef="sendOpPolicyReqStop" targetRef="ExclusiveGateway_3" />
-    <bpmn2:serviceTask id="sendOpPolicyReqRestart" name="Send Operation Policy Request [Restart]" camunda:delegateExpression="${operationalPolicyDelegate}">
-      <bpmn2:incoming>SequenceFlow_31</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_32</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_31" name="" sourceRef="ExclusiveGateway_2" targetRef="sendOpPolicyReqRestart">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[${ actionCd == 'RESTART' }]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
-    <bpmn2:sequenceFlow id="SequenceFlow_32" name="" sourceRef="sendOpPolicyReqRestart" targetRef="ExclusiveGateway_3" />
-    <bpmn2:startEvent id="StartEvent_1">
-      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>
-    </bpmn2:startEvent>
-    <bpmn2:sequenceFlow id="SequenceFlow_2" name="" sourceRef="StartEvent_1" targetRef="ExclusiveGateway_2" />
-    <bpmn2:sequenceFlow id="SequenceFlow_6" name="" sourceRef="sendOpPolicyReqDelete" targetRef="ExclusiveGateway_3" />
-    <bpmn2:sequenceFlow id="SequenceFlow_15" name="" sourceRef="ExclusiveGateway_2" targetRef="sendTcaReqDelete">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[${ actionCd == 'DELETE' }]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
-    <bpmn2:sequenceFlow id="SequenceFlow_0w39hon" sourceRef="ServiceTask_0x8ypxf" targetRef="sendTcaReqDistribute" />
-    <bpmn2:sequenceFlow id="SequenceFlow_1xlfq66" sourceRef="ExclusiveGateway_2" targetRef="ServiceTask_0x8ypxf">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[${ actionCd == 'SUBMIT' || actionCd == 'RESUBMIT' }]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
-    <bpmn2:serviceTask id="ServiceTask_0x8ypxf" name="Send to SDC [Submit]" camunda:delegateExpression="${sdcSendReqDelegate}">
-      <bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>
-      <bpmn2:incoming>SequenceFlow_1xlfq66</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0w39hon</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_1rga27p" sourceRef="sendTcaReqDistribute" targetRef="sendHolmesReqDistribute" />
-    <bpmn2:sequenceFlow id="SequenceFlow_0tpegxf" sourceRef="sendTcaReqDelete" targetRef="sendHolmesReqDelete" />
-    <bpmn2:serviceTask id="sendTcaReqDelete" name="Send Tca Micro Service request to Policy [Delete]" camunda:delegateExpression="${tcaPolicyDeleteDelegate}">
-      <bpmn2:incoming>SequenceFlow_15</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0tpegxf</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_1kegg6u" sourceRef="sendTcaReqUpdate" targetRef="sendHolmesReqUpdate" />
-    <bpmn2:serviceTask id="sendTcaReqDistribute" name="Send Tca Micro Service request to Policy [Submit]" camunda:delegateExpression="${tcaPolicyDelegate}">
-      <bpmn2:incoming>SequenceFlow_0w39hon</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1rga27p</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_1tu9g11" sourceRef="sendHolmesReqDistribute" targetRef="sendOpPolicyReqDistribute" />
-    <bpmn2:serviceTask id="sendHolmesReqDistribute" name="Send Holmes Micro Service request to Policy [Submit]" camunda:delegateExpression="${holmesPolicyDelegate}">
-      <bpmn2:incoming>SequenceFlow_1rga27p</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1tu9g11</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:serviceTask id="sendOpPolicyReqDelete" name="Send Operation Policy Request [Delete]" camunda:delegateExpression="${operationalPolicyDeleteDelegate}">
-      <bpmn2:incoming>SequenceFlow_1mtizad</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_6</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:serviceTask id="sendHolmesReqDelete" name="Send Holmes Micro Service request to Policy [Delete]" camunda:delegateExpression="${holmesPolicyDeleteDelegate}">
-      <bpmn2:incoming>SequenceFlow_0tpegxf</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1mtizad</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_1mtizad" sourceRef="sendHolmesReqDelete" targetRef="sendOpPolicyReqDelete" />
-    <bpmn2:serviceTask id="sendTcaReqUpdate" name="Send Tca Micro Service request to Policy [Update]" camunda:delegateExpression="${tcaPolicyDelegate}">
-      <bpmn2:incoming>SequenceFlow_27</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1kegg6u</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:serviceTask id="sendHolmesReqUpdate" name="Send Holmes Micro Service request to Policy [Update]" camunda:delegateExpression="${holmesPolicyDelegate}">
-      <bpmn2:incoming>SequenceFlow_1kegg6u</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0ejpmee</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_0ejpmee" sourceRef="sendHolmesReqUpdate" targetRef="sendOpPolicyReqUpdate" />
-  </bpmn2:process>
-  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
-    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="_Collaboration_2">
-      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_4" bpmnElement="StartEvent_1">
-        <dc:Bounds x="72" y="220" width="36" height="36" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="90" y="261" width="0" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="_BPMNShape_EndEvent_104" bpmnElement="EndEvent_1">
-        <dc:Bounds x="1320" y="216" width="36" height="36" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1338" y="257" width="0" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="_BPMNShape_ServiceTask_6" bpmnElement="sendOpPolicyReqDistribute">
-        <dc:Bounds x="912" y="89" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="_BPMNShape_ServiceTask_7" bpmnElement="insEvent">
-        <dc:Bounds x="1188" y="194" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_16" bpmnElement="SequenceFlow_16" sourceElement="_BPMNShape_ServiceTask_7" targetElement="_BPMNShape_EndEvent_104">
-        <di:waypoint xsi:type="dc:Point" x="1288" y="234" />
-        <di:waypoint xsi:type="dc:Point" x="1320" y="234" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1295" y="234" width="6" height="6" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="_BPMNShape_Participant_2" bpmnElement="_Participant_2" isHorizontal="true">
-        <dc:Bounds x="0" y="0" width="1369" height="833" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="_BPMNShape_Lane_2" bpmnElement="Lane_1" isHorizontal="true">
-        <dc:Bounds x="30" y="0" width="1339" height="289" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="_BPMNShape_Lane_6" bpmnElement="Lane_5" isHorizontal="true">
-        <dc:Bounds x="30" y="288" width="1339" height="197" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="_BPMNShape_ExclusiveGateway_3" bpmnElement="ExclusiveGateway_2" isMarkerVisible="true">
-        <dc:Bounds x="144" y="212" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="169" y="267" width="0" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_2" bpmnElement="SequenceFlow_2" sourceElement="_BPMNShape_StartEvent_4" targetElement="_BPMNShape_ExclusiveGateway_3">
-        <di:waypoint xsi:type="dc:Point" x="108" y="238" />
-        <di:waypoint xsi:type="dc:Point" x="126" y="238" />
-        <di:waypoint xsi:type="dc:Point" x="126" y="237" />
-        <di:waypoint xsi:type="dc:Point" x="144" y="237" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="128" y="237" width="6" height="6" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="_BPMNShape_ExclusiveGateway_4" bpmnElement="ExclusiveGateway_3" isMarkerVisible="true">
-        <dc:Bounds x="1104" y="208" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1129" y="263" width="0" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_7" bpmnElement="SequenceFlow_7" sourceElement="_BPMNShape_ExclusiveGateway_4" targetElement="_BPMNShape_ServiceTask_7">
-        <di:waypoint xsi:type="dc:Point" x="1154" y="233" />
-        <di:waypoint xsi:type="dc:Point" x="1188" y="234" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1175" y="234" width="6" height="6" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_10" bpmnElement="SequenceFlow_10" sourceElement="_BPMNShape_ServiceTask_6" targetElement="_BPMNShape_ExclusiveGateway_4">
-        <di:waypoint xsi:type="dc:Point" x="1012" y="130" />
-        <di:waypoint xsi:type="dc:Point" x="1057" y="130" />
-        <di:waypoint xsi:type="dc:Point" x="1057" y="233" />
-        <di:waypoint xsi:type="dc:Point" x="1104" y="233" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1027" y="178.5" width="90" height="6" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="_BPMNShape_ServiceTask_12" bpmnElement="sendOpPolicyReqDelete">
-        <dc:Bounds x="831" y="385" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="_BPMNShape_Lane_9" bpmnElement="Lane_4" isHorizontal="true">
-        <dc:Bounds x="30" y="484" width="1339" height="117" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="_BPMNShape_ServiceTask_15" bpmnElement="sendOpPolicyReqUpdate">
-        <dc:Bounds x="912" y="500" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_27" bpmnElement="SequenceFlow_27" sourceElement="_BPMNShape_ExclusiveGateway_3" targetElement="ServiceTask_08pqhb3_di">
-        <di:waypoint xsi:type="dc:Point" x="169" y="262" />
-        <di:waypoint xsi:type="dc:Point" x="169" y="540" />
-        <di:waypoint xsi:type="dc:Point" x="496" y="540" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="139" y="398" width="90" height="6" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_28" bpmnElement="SequenceFlow_28" sourceElement="_BPMNShape_ServiceTask_15" targetElement="_BPMNShape_ExclusiveGateway_4">
-        <di:waypoint xsi:type="dc:Point" x="1012" y="539" />
-        <di:waypoint xsi:type="dc:Point" x="1058" y="538" />
-        <di:waypoint xsi:type="dc:Point" x="1058" y="233" />
-        <di:waypoint xsi:type="dc:Point" x="1104" y="233" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1028" y="382.5" width="90" height="6" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="_BPMNShape_Lane_10" bpmnElement="Lane_6" isHorizontal="true">
-        <dc:Bounds x="30" y="600" width="1339" height="117" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="_BPMNShape_ServiceTask_16" bpmnElement="sendOpPolicyReqStop">
-        <dc:Bounds x="912" y="619" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_29" bpmnElement="SequenceFlow_29" sourceElement="_BPMNShape_ExclusiveGateway_3" targetElement="_BPMNShape_ServiceTask_16">
-        <di:waypoint xsi:type="dc:Point" x="169" y="262" />
-        <di:waypoint xsi:type="dc:Point" x="169" y="659" />
-        <di:waypoint xsi:type="dc:Point" x="912" y="659" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="139" y="457.5" width="90" height="6" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_30" bpmnElement="SequenceFlow_30" sourceElement="_BPMNShape_ServiceTask_16" targetElement="_BPMNShape_ExclusiveGateway_4">
-        <di:waypoint xsi:type="dc:Point" x="1012" y="658" />
-        <di:waypoint xsi:type="dc:Point" x="1058" y="658" />
-        <di:waypoint xsi:type="dc:Point" x="1058" y="233" />
-        <di:waypoint xsi:type="dc:Point" x="1104" y="233" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1028" y="442.5" width="90" height="6" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="_BPMNShape_Lane_11" bpmnElement="Lane_7" isHorizontal="true">
-        <dc:Bounds x="30" y="716" width="1339" height="117" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="_BPMNShape_ServiceTask_17" bpmnElement="sendOpPolicyReqRestart">
-        <dc:Bounds x="912" y="735" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_31" bpmnElement="SequenceFlow_31" sourceElement="_BPMNShape_ExclusiveGateway_3" targetElement="_BPMNShape_ServiceTask_17">
-        <di:waypoint xsi:type="dc:Point" x="169" y="262" />
-        <di:waypoint xsi:type="dc:Point" x="169" y="775" />
-        <di:waypoint xsi:type="dc:Point" x="912" y="775" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="139" y="515.5" width="90" height="6" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_32" bpmnElement="SequenceFlow_32" sourceElement="_BPMNShape_ServiceTask_17" targetElement="_BPMNShape_ExclusiveGateway_4">
-        <di:waypoint xsi:type="dc:Point" x="1012" y="775" />
-        <di:waypoint xsi:type="dc:Point" x="1058" y="775" />
-        <di:waypoint xsi:type="dc:Point" x="1058" y="234" />
-        <di:waypoint xsi:type="dc:Point" x="1105" y="234" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1028" y="501.5" width="90" height="6" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_15" bpmnElement="SequenceFlow_15" sourceElement="_BPMNShape_ExclusiveGateway_3" targetElement="ServiceTask_0y2gwy4_di">
-        <di:waypoint xsi:type="dc:Point" x="169" y="262" />
-        <di:waypoint xsi:type="dc:Point" x="169" y="425" />
-        <di:waypoint xsi:type="dc:Point" x="496" y="425" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="139" y="333.5" width="90" height="20" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ServiceTask_0x8ypxf_di" bpmnElement="ServiceTask_0x8ypxf">
-        <dc:Bounds x="204" y="89" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0w39hon_di" bpmnElement="SequenceFlow_0w39hon">
-        <di:waypoint xsi:type="dc:Point" x="304" y="129" />
-        <di:waypoint xsi:type="dc:Point" x="546" y="129" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="380" y="114" width="90" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1xlfq66_di" bpmnElement="SequenceFlow_1xlfq66">
-        <di:waypoint xsi:type="dc:Point" x="169" y="212" />
-        <di:waypoint xsi:type="dc:Point" x="169" y="129" />
-        <di:waypoint xsi:type="dc:Point" x="204" y="129" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="184" y="170.5" width="0" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1rga27p_di" bpmnElement="SequenceFlow_1rga27p">
-        <di:waypoint xsi:type="dc:Point" x="646" y="129" />
-        <di:waypoint xsi:type="dc:Point" x="729" y="129" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="642.5" y="104" width="90" height="20" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ServiceTask_1r1brt6_di" bpmnElement="sendTcaReqDistribute">
-        <dc:Bounds x="546" y="89" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0tpegxf_di" bpmnElement="SequenceFlow_0tpegxf">
-        <di:waypoint xsi:type="dc:Point" x="596" y="425" />
-        <di:waypoint xsi:type="dc:Point" x="665" y="425" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="585.5" y="400" width="90" height="20" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ServiceTask_0y2gwy4_di" bpmnElement="sendTcaReqDelete">
-        <dc:Bounds x="495.71500000000003" y="385" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1kegg6u_di" bpmnElement="SequenceFlow_1kegg6u">
-        <di:waypoint xsi:type="dc:Point" x="596" y="540" />
-        <di:waypoint xsi:type="dc:Point" x="688" y="540" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="597" y="515" width="90" height="20" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ServiceTask_08pqhb3_di" bpmnElement="sendTcaReqUpdate">
-        <dc:Bounds x="496" y="500" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ServiceTask_1a6a3ro_di" bpmnElement="sendHolmesReqDistribute">
-        <dc:Bounds x="729" y="89" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1tu9g11_di" bpmnElement="SequenceFlow_1tu9g11">
-        <di:waypoint xsi:type="dc:Point" x="829" y="129" />
-        <di:waypoint xsi:type="dc:Point" x="912" y="129" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="870.5" y="108" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ServiceTask_1234ame_di" bpmnElement="sendHolmesReqDelete">
-        <dc:Bounds x="665" y="385" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1mtizad_di" bpmnElement="SequenceFlow_1mtizad">
-        <di:waypoint xsi:type="dc:Point" x="765" y="425" />
-        <di:waypoint xsi:type="dc:Point" x="831" y="425" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="798" y="404" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ServiceTask_17vvyrl_di" bpmnElement="sendHolmesReqUpdate">
-        <dc:Bounds x="688" y="500" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0ejpmee_di" bpmnElement="SequenceFlow_0ejpmee">
-        <di:waypoint xsi:type="dc:Point" x="788" y="540" />
-        <di:waypoint xsi:type="dc:Point" x="912" y="540" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="850" y="519" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-    </bpmndi:BPMNPlane>
-  </bpmndi:BPMNDiagram>
-</bpmn2:definitions>
diff --git a/src/main/resources/clds/camel/flexible-flow.xml b/src/main/resources/clds/camel/flexible-flow.xml
new file mode 100644
index 0000000..7a3ebdb
--- /dev/null
+++ b/src/main/resources/clds/camel/flexible-flow.xml
@@ -0,0 +1,36 @@
+<routes xmlns="http://camel.apache.org/schema/spring">
+		<route id="submit">
+				<from uri="direct:processSubmit" />
+				<choice>
+						<when>
+								<simple> ${exchangeProperty.actionCd} == 'SUBMIT' || ${exchangeProperty.actionCd} == 'RESUBMIT'</simple>
+								<to uri="bean:org.onap.clamp.clds.client.SdcSendReqDelegate" />	
+								<to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
+								<to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
+								<to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
+						</when>
+						<when>
+								<simple> ${exchangeProperty.actionCd} == 'DELETE'</simple>
+								<to uri="bean:org.onap.clamp.clds.client.TcaPolicyDeleteDelegate" />
+								<to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDeleteDelegate" />
+								<to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDeleteDelegate" />
+						</when>
+						<when>
+								<simple> ${exchangeProperty.actionCd} == 'UPDATE'</simple>
+								<to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
+								<to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
+								<to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
+						</when>
+						<when>
+								<simple> ${exchangeProperty.actionCd} == 'STOP'</simple>
+								<to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDeleteDelegate" />
+						</when>
+						<when>
+								<simple> ${exchangeProperty.actionCd} == 'RESTART'</simple>
+								<to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
+						</when>
+				</choice>
+				<to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate" />
+		</route>
+
+</routes>
\ No newline at end of file
diff --git a/src/main/resources/clds/clds-reference.properties b/src/main/resources/clds/clds-reference.properties
index 95ba919..09cb5c9 100644
--- a/src/main/resources/clds/clds-reference.properties
+++ b/src/main/resources/clds/clds-reference.properties
@@ -80,8 +80,8 @@
 sdc.catalog.url=http://sdc.api.simpledemo.onap.org:8080/sdc/v1/catalog/
 sdc.hostUrl=http://sdc.api.simpledemo.onap.org:8080
 sdc.serviceUrl=http://sdc.api.simpledemo.onap.org:8080/sdc/v1/catalog/services
-sdc.serviceUsername=test
-sdc.servicePassword=aa2871669d793c7fb7abbcda31b88b4c29bf2982755b25f08f8d0130539c11b0
+sdc.serviceUsername=clamp
+sdc.servicePassword=b7acccda32b98c5bb7acccda32b98c5b05D511BD6D93626E90D18E9D24D9B78CD34C7EE8012F0A189A28763E82271E50A5D4EC10C7D93E06E0A2D27CAE66B981
 sdc.artifactLabel=blueprintclampcockpit
 sdc.sdcX-InstanceID=CLAMP
 sdc.artifactType=DCAE_INVENTORY_BLUEPRINT
@@ -98,7 +98,7 @@
 action.test.override=false
 # if action.insert.test.event is true, then insert event even if the action is set to test
 action.insert.test.event=false
-CLDS_SERVICE_CACHE_MAX_SECONDS=30
+clds.service.cache.invalidate.after.seconds=120
 
 #DCAE Inventory Url Properties
 DCAE_INVENTORY_URL = http://dcae.api.simpledemo.onap.org:8080
diff --git a/src/main/resources/clds/clds-users.json b/src/main/resources/clds/clds-users.json
index 5909e8e..d2c06c8 100644
--- a/src/main/resources/clds/clds-users.json
+++ b/src/main/resources/clds/clds-users.json
@@ -7,8 +7,7 @@
 	               "permission-type-cl|dev|update",
 	               "permission-type-cl-manage|dev|*",
 	               "permission-type-filter-vf|dev|*",
-	               "permission-type-template|dev|read",
-	               "permission-type-template|dev|update"
+	               "permission-type-template|dev|read"
 	            ]
 	},
 	{
