Merge "Remove trust level from cache when cm handles deleted"
diff --git a/cps-application/src/main/resources/application.yml b/cps-application/src/main/resources/application.yml
index f61a09b..dd4576e 100644
--- a/cps-application/src/main/resources/application.yml
+++ b/cps-application/src/main/resources/application.yml
@@ -188,22 +188,35 @@
             onap:
                 cps: INFO
 ncmp:
+    policy-executor:
+        enabled: true
+        server:
+            address: "http://localhost"
+            port: "8785"
+        httpclient:
+            all-services:
+                maximumInMemorySizeInMegabytes: 16
+                maximumConnectionsTotal: 100
+                pendingAcquireMaxCount: 50
+                connectionTimeoutInSeconds: 30
+                readTimeoutInSeconds: 30
+                writeTimeoutInSeconds: 30
     dmi:
         httpclient:
             data-services:
+                maximumInMemorySizeInMegabytes: 16
+                maximumConnectionsTotal: 100
+                pendingAcquireMaxCount: 50
                 connectionTimeoutInSeconds: 30
                 readTimeoutInSeconds: 30
                 writeTimeoutInSeconds: 30
-                maximumConnectionsTotal: 100
-                pendingAcquireMaxCount: 50
-                maximumInMemorySizeInMegabytes: 16
             model-services:
+                maximumInMemorySizeInMegabytes: 16
+                maximumConnectionsTotal: 100
+                pendingAcquireMaxCount: 50
                 connectionTimeoutInSeconds: 30
                 readTimeoutInSeconds: 30
                 writeTimeoutInSeconds: 30
-                maximumConnectionsTotal: 100
-                pendingAcquireMaxCount: 50
-                maximumInMemorySizeInMegabytes: 16
         auth:
             username: ${DMI_USERNAME:cpsuser}
             password: ${DMI_PASSWORD:cpsr0cks!}
@@ -244,4 +257,4 @@
     exporter:
         otlp:
             traces:
-                protocol: ${ONAP_OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:grpc}
\ No newline at end of file
+                protocol: ${ONAP_OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:grpc}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/HttpClientConfiguration.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/DmiHttpClientConfig.java
similarity index 78%
rename from cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/HttpClientConfiguration.java
rename to cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/DmiHttpClientConfig.java
index 583d4bb..8eebb89 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/HttpClientConfiguration.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/DmiHttpClientConfig.java
@@ -29,7 +29,7 @@
 @Setter
 @Configuration
 @ConfigurationProperties(prefix = "ncmp.dmi.httpclient")
-public class HttpClientConfiguration {
+public class DmiHttpClientConfig {
 
     private final DataServices dataServices = new DataServices();
     private final ModelServices modelServices = new ModelServices();
@@ -54,19 +54,4 @@
         private int maximumConnectionsTotal = 10;
         private int pendingAcquireMaxCount = 5;
     }
-
-    /**
-     * Base configuration properties for all services.
-     */
-    @Getter
-    @Setter
-    public static class ServiceConfig {
-        private String connectionProviderName = "cpsConnectionPool";
-        private int maximumConnectionsTotal = 100;
-        private int pendingAcquireMaxCount = 50;
-        private Integer connectionTimeoutInSeconds = 30;
-        private long readTimeoutInSeconds = 30;
-        private long writeTimeoutInSeconds = 30;
-        private int maximumInMemorySizeInMegabytes = 1;
-    }
 }
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/PolicyExecutorHttpClientConfig.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/PolicyExecutorHttpClientConfig.java
new file mode 100644
index 0000000..0903c67
--- /dev/null
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/PolicyExecutorHttpClientConfig.java
@@ -0,0 +1,41 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.config;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Getter
+@Setter
+@Configuration
+@ConfigurationProperties(prefix = "ncmp.policy-executor.httpclient")
+public class PolicyExecutorHttpClientConfig {
+
+    private final AllServices allServices = new AllServices();
+
+    @Getter
+    @Setter
+    public static class AllServices extends ServiceConfig {
+        private String connectionProviderName = "policyExecutorConfig";
+    }
+}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/ServiceConfig.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/ServiceConfig.java
new file mode 100644
index 0000000..f1fce0c
--- /dev/null
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/config/ServiceConfig.java
@@ -0,0 +1,36 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.config;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public abstract class ServiceConfig {
+    private String connectionProviderName = "";
+    private int maximumInMemorySizeInMegabytes = 1;
+    private int maximumConnectionsTotal = 1;
+    private int pendingAcquireMaxCount = 1;
+    private Integer connectionTimeoutInSeconds = 1;
+    private long readTimeoutInSeconds = 1;
+    private long writeTimeoutInSeconds = 1;
+}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java
index 90783a8..0cedeae 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java
@@ -41,15 +41,16 @@
 import org.onap.cps.ncmp.impl.data.models.DmiDataOperation;
 import org.onap.cps.ncmp.impl.data.models.DmiDataOperationRequest;
 import org.onap.cps.ncmp.impl.data.models.DmiOperationCmHandle;
+import org.onap.cps.ncmp.impl.data.policyexecutor.PolicyExecutor;
 import org.onap.cps.ncmp.impl.data.utils.DmiDataOperationsHelper;
 import org.onap.cps.ncmp.impl.dmi.DmiProperties;
 import org.onap.cps.ncmp.impl.dmi.DmiRestClient;
-import org.onap.cps.ncmp.impl.dmi.DmiServiceUrlTemplateBuilder;
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters;
 import org.onap.cps.ncmp.impl.inventory.InventoryPersistence;
 import org.onap.cps.ncmp.impl.inventory.models.CmHandleState;
 import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle;
 import org.onap.cps.ncmp.impl.models.DmiRequestBody;
+import org.onap.cps.ncmp.impl.utils.http.RestServiceUrlTemplateBuilder;
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters;
 import org.onap.cps.spi.exceptions.CpsException;
 import org.onap.cps.utils.JsonObjectMapper;
 import org.springframework.http.ResponseEntity;
@@ -212,7 +213,7 @@
                                                            final String optionsParamInQuery,
                                                            final String topicParamInQuery) {
         final String dmiServiceName = yangModelCmHandle.resolveDmiServiceName(DATA);
-        return DmiServiceUrlTemplateBuilder.newInstance()
+        return RestServiceUrlTemplateBuilder.newInstance()
                 .fixedPathSegment("ch")
                 .variablePathSegment("cmHandleId", yangModelCmHandle.getId())
                 .fixedPathSegment("data")
@@ -227,7 +228,7 @@
     private UrlTemplateParameters getUrlTemplateParameters(final String dmiServiceName,
                                                            final String requestId,
                                                            final String topicParamInQuery) {
-        return DmiServiceUrlTemplateBuilder.newInstance()
+        return RestServiceUrlTemplateBuilder.newInstance()
                 .fixedPathSegment("data")
                 .queryParameter("requestId", requestId)
                 .queryParameter("topic", topicParamInQuery)
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/PolicyExecutor.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutor.java
similarity index 98%
rename from cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/PolicyExecutor.java
rename to cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutor.java
index 2b5eb9e..8e7620c 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/PolicyExecutor.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutor.java
@@ -18,7 +18,7 @@
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.ncmp.impl.data;
+package org.onap.cps.ncmp.impl.data.policyexecutor;
 
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImpl.java
index 031cedc..8934c08 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImpl.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImpl.java
@@ -24,8 +24,8 @@
 import org.onap.cps.ncmp.api.datajobs.DataJobResultService;
 import org.onap.cps.ncmp.impl.dmi.DmiProperties;
 import org.onap.cps.ncmp.impl.dmi.DmiRestClient;
-import org.onap.cps.ncmp.impl.dmi.DmiServiceUrlTemplateBuilder;
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters;
+import org.onap.cps.ncmp.impl.utils.http.RestServiceUrlTemplateBuilder;
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters;
 import org.springframework.stereotype.Service;
 
 @Service
@@ -41,7 +41,7 @@
                                    final String dataProducerId,
                                    final String dataProducerJobId,
                                    final String destination) {
-        final UrlTemplateParameters urlTemplateParameters = DmiServiceUrlTemplateBuilder.newInstance()
+        final UrlTemplateParameters urlTemplateParameters = RestServiceUrlTemplateBuilder.newInstance()
                                            .fixedPathSegment("cmwriteJob")
                                            .fixedPathSegment("dataProducer")
                                            .variablePathSegment("dataProducerId", dataProducerId)
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobStatusServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobStatusServiceImpl.java
index fb17f06..1cfb8a9 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobStatusServiceImpl.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobStatusServiceImpl.java
@@ -24,8 +24,8 @@
 import org.onap.cps.ncmp.api.datajobs.DataJobStatusService;
 import org.onap.cps.ncmp.impl.dmi.DmiProperties;
 import org.onap.cps.ncmp.impl.dmi.DmiRestClient;
-import org.onap.cps.ncmp.impl.dmi.DmiServiceUrlTemplateBuilder;
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters;
+import org.onap.cps.ncmp.impl.utils.http.RestServiceUrlTemplateBuilder;
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters;
 import org.springframework.stereotype.Service;
 
 /**
@@ -54,7 +54,7 @@
     private UrlTemplateParameters buildUrlParameters(final String dmiServiceName,
                                                      final String dataProducerId,
                                                      final String dataProducerJobId) {
-        return DmiServiceUrlTemplateBuilder.newInstance()
+        return RestServiceUrlTemplateBuilder.newInstance()
                 .fixedPathSegment("cmwriteJob")
                 .fixedPathSegment("dataProducer")
                 .variablePathSegment("dataProducerId", dataProducerId)
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DmiSubJobRequestHandler.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DmiSubJobRequestHandler.java
index 0d14dac..a118d53 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DmiSubJobRequestHandler.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DmiSubJobRequestHandler.java
@@ -33,9 +33,9 @@
 import org.onap.cps.ncmp.api.datajobs.models.SubJobWriteResponse;
 import org.onap.cps.ncmp.impl.dmi.DmiProperties;
 import org.onap.cps.ncmp.impl.dmi.DmiRestClient;
-import org.onap.cps.ncmp.impl.dmi.DmiServiceUrlTemplateBuilder;
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters;
 import org.onap.cps.ncmp.impl.models.RequiredDmiService;
+import org.onap.cps.ncmp.impl.utils.http.RestServiceUrlTemplateBuilder;
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters;
 import org.onap.cps.utils.JsonObjectMapper;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
@@ -88,7 +88,7 @@
     }
 
     private UrlTemplateParameters getUrlTemplateParameters(final String destination, final ProducerKey producerKey) {
-        return DmiServiceUrlTemplateBuilder.newInstance()
+        return RestServiceUrlTemplateBuilder.newInstance()
                 .fixedPathSegment("cmwriteJob")
                 .queryParameter("destination", destination)
                 .createUrlTemplateParameters(producerKey.dmiServiceName(), dmiProperties.getDmiBasePath());
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiRestClient.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiRestClient.java
index c101320..a177272 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiRestClient.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiRestClient.java
@@ -34,6 +34,7 @@
 import org.onap.cps.ncmp.api.data.models.OperationType;
 import org.onap.cps.ncmp.api.exceptions.DmiClientRequestException;
 import org.onap.cps.ncmp.impl.models.RequiredDmiService;
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters;
 import org.onap.cps.utils.JsonObjectMapper;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.http.HttpHeaders;
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiWebClientsConfiguration.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiWebClientsConfiguration.java
new file mode 100644
index 0000000..4134a56
--- /dev/null
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiWebClientsConfiguration.java
@@ -0,0 +1,68 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.impl.dmi;
+
+import lombok.RequiredArgsConstructor;
+import org.onap.cps.ncmp.config.DmiHttpClientConfig;
+import org.onap.cps.ncmp.impl.utils.http.WebClientConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.function.client.WebClient;
+
+@Configuration
+@RequiredArgsConstructor
+public class DmiWebClientsConfiguration extends WebClientConfiguration {
+
+    private final DmiHttpClientConfig dmiHttpClientConfig;
+
+    /**
+     * Configures and creates a web client bean for DMI data services.
+     *
+     * @param webClientBuilder The builder instance to create the WebClient.
+     * @return a WebClient instance configured for data services.
+     */
+    @Bean
+    public WebClient dataServicesWebClient(final WebClient.Builder webClientBuilder) {
+        return configureWebClient(webClientBuilder, dmiHttpClientConfig.getDataServices());
+    }
+
+    /**
+     * Configures and creates a web client bean for DMI model services.
+     *
+     * @param webClientBuilder The builder instance to create the WebClient.
+     * @return a WebClient instance configured for model services.
+     */
+    @Bean
+    public WebClient modelServicesWebClient(final WebClient.Builder webClientBuilder) {
+        return configureWebClient(webClientBuilder, dmiHttpClientConfig.getModelServices());
+    }
+
+    /**
+     * Configures and creates a web client bean for DMI health check services.
+     *
+     * @param webClientBuilder The builder instance to create the WebClient.
+     * @return a WebClient instance configured for health check services.
+     */
+    @Bean
+    public WebClient healthChecksWebClient(final WebClient.Builder webClientBuilder) {
+        return configureWebClient(webClientBuilder, dmiHttpClientConfig.getHealthCheckServices());
+    }
+}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/DmiModelOperations.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/DmiModelOperations.java
index 433c67f..8ba70b3 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/DmiModelOperations.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/DmiModelOperations.java
@@ -36,10 +36,10 @@
 import org.onap.cps.ncmp.api.inventory.models.YangResource;
 import org.onap.cps.ncmp.impl.dmi.DmiProperties;
 import org.onap.cps.ncmp.impl.dmi.DmiRestClient;
-import org.onap.cps.ncmp.impl.dmi.DmiServiceUrlTemplateBuilder;
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters;
 import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle;
 import org.onap.cps.ncmp.impl.models.DmiRequestBody;
+import org.onap.cps.ncmp.impl.utils.http.RestServiceUrlTemplateBuilder;
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters;
 import org.onap.cps.spi.model.ModuleReference;
 import org.onap.cps.utils.JsonObjectMapper;
 import org.springframework.http.ResponseEntity;
@@ -107,7 +107,7 @@
                                                                   final String jsonRequestBody,
                                                                   final String cmHandle,
                                                                   final String resourceName) {
-        final UrlTemplateParameters urlTemplateParameters = DmiServiceUrlTemplateBuilder.newInstance()
+        final UrlTemplateParameters urlTemplateParameters = RestServiceUrlTemplateBuilder.newInstance()
                 .fixedPathSegment("ch")
                 .variablePathSegment("cmHandleId", cmHandle)
                 .fixedPathSegment(resourceName)
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDog.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDog.java
index 94e493d..7581c4a 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDog.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDog.java
@@ -26,9 +26,9 @@
 import lombok.extern.slf4j.Slf4j;
 import org.onap.cps.ncmp.api.inventory.models.TrustLevel;
 import org.onap.cps.ncmp.impl.dmi.DmiRestClient;
-import org.onap.cps.ncmp.impl.dmi.DmiServiceUrlTemplateBuilder;
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters;
 import org.onap.cps.ncmp.impl.inventory.CmHandleQueryService;
+import org.onap.cps.ncmp.impl.utils.http.RestServiceUrlTemplateBuilder;
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
@@ -73,7 +73,7 @@
     }
 
     private String getDmiHealthStatus(final String dmiServiceBaseUrl) {
-        final UrlTemplateParameters urlTemplateParameters = DmiServiceUrlTemplateBuilder.newInstance()
+        final UrlTemplateParameters urlTemplateParameters = RestServiceUrlTemplateBuilder.newInstance()
                 .createUrlTemplateParametersForHealthCheck(dmiServiceBaseUrl);
         return dmiRestClient.getDmiHealthStatus(urlTemplateParameters).block();
     }
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/policyexecutor/PolicyExecutorWebClientConfiguration.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/policyexecutor/PolicyExecutorWebClientConfiguration.java
new file mode 100644
index 0000000..333030c
--- /dev/null
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/policyexecutor/PolicyExecutorWebClientConfiguration.java
@@ -0,0 +1,46 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.impl.policyexecutor;
+
+import lombok.RequiredArgsConstructor;
+import org.onap.cps.ncmp.config.PolicyExecutorHttpClientConfig;
+import org.onap.cps.ncmp.impl.utils.http.WebClientConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.function.client.WebClient;
+
+@Configuration
+@RequiredArgsConstructor
+public class PolicyExecutorWebClientConfiguration extends WebClientConfiguration {
+
+    private final PolicyExecutorHttpClientConfig policyExecutorHttpClientConfig;
+
+    /**
+     * Configures and creates a web client bean for Policy Executor.
+     *
+     * @param webClientBuilder The builder instance to create the WebClient.
+     * @return a WebClient instance configured for Policy Executor.
+     */
+    @Bean
+    public WebClient policyExecutorWebClient(final WebClient.Builder webClientBuilder) {
+        return configureWebClient(webClientBuilder, policyExecutorHttpClientConfig.getAllServices());
+    }
+}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiServiceUrlTemplateBuilder.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/utils/http/RestServiceUrlTemplateBuilder.java
similarity index 77%
rename from cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiServiceUrlTemplateBuilder.java
rename to cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/utils/http/RestServiceUrlTemplateBuilder.java
index e7dbea8..fafb090 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiServiceUrlTemplateBuilder.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/utils/http/RestServiceUrlTemplateBuilder.java
@@ -18,7 +18,7 @@
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.ncmp.impl.dmi;
+package org.onap.cps.ncmp.impl.utils.http;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -30,7 +30,7 @@
 import org.springframework.web.util.UriComponentsBuilder;
 
 @NoArgsConstructor
-public class DmiServiceUrlTemplateBuilder {
+public class RestServiceUrlTemplateBuilder {
 
     private final UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.newInstance();
     private static final String FIXED_PATH_SEGMENT = null;
@@ -43,8 +43,8 @@
      *
      * @return a new instance of DmiServiceUrlTemplateBuilder
      */
-    public static DmiServiceUrlTemplateBuilder newInstance() {
-        return new DmiServiceUrlTemplateBuilder();
+    public static RestServiceUrlTemplateBuilder newInstance() {
+        return new RestServiceUrlTemplateBuilder();
     }
 
     /**
@@ -53,7 +53,7 @@
      * @param pathSegment the path segment
      * @return this builder instance
      */
-    public DmiServiceUrlTemplateBuilder fixedPathSegment(final String pathSegment) {
+    public RestServiceUrlTemplateBuilder fixedPathSegment(final String pathSegment) {
         pathSegments.put(pathSegment, FIXED_PATH_SEGMENT);
         return this;
     }
@@ -66,7 +66,7 @@
      * @param value       the value to be insert in teh URL for the given variable path segment
      * @return this builder instance
      */
-    public DmiServiceUrlTemplateBuilder variablePathSegment(final String pathSegment, final String value) {
+    public RestServiceUrlTemplateBuilder variablePathSegment(final String pathSegment, final String value) {
         pathSegments.put(pathSegment, value);
         return this;
     }
@@ -80,8 +80,8 @@
      *
      * @return this builder instance
      */
-    public DmiServiceUrlTemplateBuilder queryParameter(final String queryParameterName,
-                                                       final String queryParameterValue) {
+    public RestServiceUrlTemplateBuilder queryParameter(final String queryParameterName,
+                                                        final String queryParameterValue) {
         if (Strings.isNotBlank(queryParameterValue)) {
             queryParameters.put(queryParameterName, queryParameterValue);
         }
@@ -91,12 +91,12 @@
     /**
      * Constructs a URL template with variables based on the accumulated path segments and query parameters.
      *
-     * @param dmiServiceBaseUrl the base URL of the DMI service, e.g., "http://dmi-service.com".
-     * @param dmiBasePath       the base path of the DMI service
+     * @param serviceBaseUrl the base URL of the service, e.g., "http://dmi-service.com".
+     * @param basePath       the base path of the service
      * @return a UrlTemplateParameters instance containing the complete URL template and URL variables
      */
-    public UrlTemplateParameters createUrlTemplateParameters(final String dmiServiceBaseUrl, final String dmiBasePath) {
-        this.uriComponentsBuilder.pathSegment(dmiBasePath)
+    public UrlTemplateParameters createUrlTemplateParameters(final String serviceBaseUrl, final String basePath) {
+        this.uriComponentsBuilder.pathSegment(basePath)
             .pathSegment(VERSION_SEGMENT);
 
         final Map<String, String> urlTemplateVariables = new HashMap<>();
@@ -115,22 +115,21 @@
             urlTemplateVariables.put(paramName, paramValue);
         });
 
-        final String urlTemplate = dmiServiceBaseUrl + this.uriComponentsBuilder.build().toUriString();
+        final String urlTemplate = serviceBaseUrl + this.uriComponentsBuilder.build().toUriString();
         return new UrlTemplateParameters(urlTemplate, urlTemplateVariables);
     }
 
     /**
      * Constructs a URL for DMI health check based on the given base URL.
      *
-     * @param dmiServiceBaseUrl the base URL of the DMI service, e.g., "http://dmi-service.com".
+     * @param serviceBaseUrl the base URL of the service, e.g., "http://dmi-service.com".
      * @return a {@link UrlTemplateParameters} instance containing the complete URL template and empty URL variables,
      *     suitable for DMI health check.
      */
-    public UrlTemplateParameters createUrlTemplateParametersForHealthCheck(final String dmiServiceBaseUrl) {
-        this.uriComponentsBuilder.pathSegment("actuator")
-                .pathSegment("health");
+    public UrlTemplateParameters createUrlTemplateParametersForHealthCheck(final String serviceBaseUrl) {
+        this.uriComponentsBuilder.pathSegment("actuator").pathSegment("health");
 
-        final String urlTemplate = dmiServiceBaseUrl + this.uriComponentsBuilder.build().toUriString();
+        final String urlTemplate = serviceBaseUrl + this.uriComponentsBuilder.build().toUriString();
         return new UrlTemplateParameters(urlTemplate, Collections.emptyMap());
     }
 
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/UrlTemplateParameters.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/utils/http/UrlTemplateParameters.java
similarity index 96%
rename from cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/UrlTemplateParameters.java
rename to cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/utils/http/UrlTemplateParameters.java
index f515111..839af71 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/UrlTemplateParameters.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/utils/http/UrlTemplateParameters.java
@@ -18,7 +18,7 @@
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.ncmp.impl.dmi;
+package org.onap.cps.ncmp.impl.utils.http;
 
 import java.util.Map;
 
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiWebClientConfiguration.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/utils/http/WebClientConfiguration.java
similarity index 64%
rename from cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiWebClientConfiguration.java
rename to cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/utils/http/WebClientConfiguration.java
index c176e40..d8e8350 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiWebClientConfiguration.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/utils/http/WebClientConfiguration.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.ncmp.impl.dmi;
+package org.onap.cps.ncmp.impl.utils.http;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import io.netty.channel.ChannelOption;
@@ -27,10 +27,7 @@
 import io.netty.resolver.DefaultAddressResolverGroup;
 import java.time.Duration;
 import java.util.concurrent.TimeUnit;
-import lombok.RequiredArgsConstructor;
-import org.onap.cps.ncmp.config.HttpClientConfiguration;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
+import org.onap.cps.ncmp.config.ServiceConfig;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.http.client.reactive.ReactorClientHttpConnector;
@@ -39,58 +36,22 @@
 import reactor.netty.resources.ConnectionProvider;
 
 /**
- * Configures and creates WebClient beans for various DMI services including data, model, and health check services.
+ * Configures and creates WebClient beans for various rest services such as DMI and Policy Executor.
  * The configuration utilizes Netty-based HttpClient with custom connection settings, read and write timeouts,
  * and initializes WebClient with these settings to ensure optimal performance and resource management.
  */
-@Configuration
-@RequiredArgsConstructor
-public class DmiWebClientConfiguration {
+public class WebClientConfiguration {
 
-    private final HttpClientConfiguration httpClientConfiguration;
     private static final Duration DEFAULT_RESPONSE_TIMEOUT = Duration.ofSeconds(30);
 
-    /**
-     * Configures and creates a web client bean for DMI data services.
-     *
-     * @param webClientBuilder The builder instance to create the WebClient.
-     * @return a WebClient instance configured for data services.
-     */
-    @Bean
-    public WebClient dataServicesWebClient(final WebClient.Builder webClientBuilder) {
-        return configureWebClient(webClientBuilder, httpClientConfiguration.getDataServices());
-    }
-
-    /**
-     * Configures and creates a web client bean for DMI model services.
-     *
-     * @param webClientBuilder The builder instance to create the WebClient.
-     * @return a WebClient instance configured for model services.
-     */
-    @Bean
-    public WebClient modelServicesWebClient(final WebClient.Builder webClientBuilder) {
-        return configureWebClient(webClientBuilder, httpClientConfiguration.getModelServices());
-    }
-
-    /**
-     * Configures and creates a web client bean for DMI health check services.
-     *
-     * @param webClientBuilder The builder instance to create the WebClient.
-     * @return a WebClient instance configured for health check services.
-     */
-    @Bean
-    public WebClient healthChecksWebClient(final WebClient.Builder webClientBuilder) {
-        return configureWebClient(webClientBuilder, httpClientConfiguration.getHealthCheckServices());
-    }
-
-    private WebClient configureWebClient(final WebClient.Builder webClientBuilder,
-                                         final HttpClientConfiguration.ServiceConfig serviceConfig) {
+    protected WebClient configureWebClient(final WebClient.Builder webClientBuilder,
+                                           final ServiceConfig serviceConfig) {
         final ConnectionProvider connectionProvider = getConnectionProvider(serviceConfig);
         final HttpClient httpClient = createHttpClient(serviceConfig, connectionProvider);
         return buildAndGetWebClient(webClientBuilder, httpClient, serviceConfig.getMaximumInMemorySizeInMegabytes());
     }
 
-    private static HttpClient createHttpClient(final HttpClientConfiguration.ServiceConfig serviceConfig,
+    private static HttpClient createHttpClient(final ServiceConfig serviceConfig,
                                                final ConnectionProvider connectionProvider) {
         return HttpClient.create(connectionProvider)
                 .responseTimeout(DEFAULT_RESPONSE_TIMEOUT)
@@ -103,7 +64,7 @@
     }
 
     @SuppressFBWarnings("BC_UNCONFIRMED_CAST_OF_RETURN_VALUE")
-    private static ConnectionProvider getConnectionProvider(final HttpClientConfiguration.ServiceConfig serviceConfig) {
+    private static ConnectionProvider getConnectionProvider(final ServiceConfig serviceConfig) {
         return ConnectionProvider.builder(serviceConfig.getConnectionProviderName())
                 .maxConnections(serviceConfig.getMaximumConnectionsTotal())
                 .pendingAcquireMaxCount(serviceConfig.getPendingAcquireMaxCount())
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/DmiHttpClientConfigSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/DmiHttpClientConfigSpec.groovy
new file mode 100644
index 0000000..e0ae204
--- /dev/null
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/DmiHttpClientConfigSpec.groovy
@@ -0,0 +1,73 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023-2024 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.config
+
+
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.context.properties.EnableConfigurationProperties
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.test.context.ContextConfiguration
+import spock.lang.Specification
+
+@SpringBootTest
+@ContextConfiguration(classes = [DmiHttpClientConfig])
+@EnableConfigurationProperties(DmiHttpClientConfig)
+class DmiHttpClientConfigSpec extends Specification {
+
+    @Autowired
+    DmiHttpClientConfig dmiHttpClientConfig
+
+    def 'Test http client configuration properties of data with custom and default values'() {
+        expect: 'properties are populated correctly for data services'
+            with(dmiHttpClientConfig.dataServices) {
+                assert maximumInMemorySizeInMegabytes == 1
+                assert maximumConnectionsTotal == 2
+                assert pendingAcquireMaxCount == 3
+                assert connectionTimeoutInSeconds == 4
+                assert readTimeoutInSeconds == 5
+                assert writeTimeoutInSeconds == 6
+            }
+    }
+
+    def 'Test http client configuration properties of model with custom and default values'() {
+        expect: 'properties are populated correctly for model services'
+            with(dmiHttpClientConfig.modelServices) {
+                assert maximumInMemorySizeInMegabytes == 11
+                assert maximumConnectionsTotal == 12
+                assert pendingAcquireMaxCount == 13
+                assert connectionTimeoutInSeconds == 14
+                assert readTimeoutInSeconds == 15
+                assert writeTimeoutInSeconds == 16
+            }
+    }
+
+    def 'Test http client configuration properties of health with default values'() {
+        expect: 'properties are populated correctly for health check services'
+            with(dmiHttpClientConfig.healthCheckServices) {
+                assert maximumInMemorySizeInMegabytes == 21
+                assert maximumConnectionsTotal == 22
+                assert pendingAcquireMaxCount == 23
+                assert connectionTimeoutInSeconds == 24
+                assert readTimeoutInSeconds == 25
+                assert writeTimeoutInSeconds == 26
+            }
+    }
+}
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/HttpClientConfigurationSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/HttpClientConfigurationSpec.groovy
deleted file mode 100644
index 1d3b22f..0000000
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/HttpClientConfigurationSpec.groovy
+++ /dev/null
@@ -1,73 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2023-2024 Nordix Foundation.
- * ================================================================================
- * 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.
- *
- * SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.cps.ncmp.config
-
-
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.boot.context.properties.EnableConfigurationProperties
-import org.springframework.boot.test.context.SpringBootTest
-import org.springframework.test.context.ContextConfiguration
-import spock.lang.Specification
-
-@SpringBootTest
-@ContextConfiguration(classes = [HttpClientConfiguration])
-@EnableConfigurationProperties(HttpClientConfiguration)
-class HttpClientConfigurationSpec extends Specification {
-
-    @Autowired
-    HttpClientConfiguration httpClientConfiguration
-
-    def 'Test http client configuration properties of data with custom and default values'() {
-        expect: 'properties are populated correctly for data'
-            with(httpClientConfiguration.dataServices) {
-                assert connectionTimeoutInSeconds == 123
-                assert readTimeoutInSeconds == 33
-                assert writeTimeoutInSeconds == 30
-                assert maximumConnectionsTotal == 100
-                assert pendingAcquireMaxCount == 22
-                assert maximumInMemorySizeInMegabytes == 7
-            }
-    }
-
-    def 'Test http client configuration properties of model with custom and default values'() {
-        expect: 'properties are populated correctly for model'
-            with(httpClientConfiguration.modelServices) {
-                assert connectionTimeoutInSeconds == 456
-                assert readTimeoutInSeconds == 30
-                assert writeTimeoutInSeconds == 30
-                assert maximumConnectionsTotal == 111
-                assert pendingAcquireMaxCount == 44
-                assert maximumInMemorySizeInMegabytes == 8
-            }
-    }
-
-    def 'Test http client configuration properties of health with default values'() {
-        expect: 'properties are populated correctly for health'
-            with(httpClientConfiguration.healthCheckServices) {
-                assert connectionTimeoutInSeconds == 30
-                assert readTimeoutInSeconds == 30
-                assert writeTimeoutInSeconds == 30
-                assert maximumConnectionsTotal == 10
-                assert pendingAcquireMaxCount == 5
-                assert maximumInMemorySizeInMegabytes == 1
-            }
-    }
-}
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/PolicyExecutorHttpClientConfigSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/PolicyExecutorHttpClientConfigSpec.groovy
new file mode 100644
index 0000000..1946a45
--- /dev/null
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/PolicyExecutorHttpClientConfigSpec.groovy
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.config
+
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.context.properties.EnableConfigurationProperties
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.test.context.ContextConfiguration
+import spock.lang.Specification
+
+@SpringBootTest
+@ContextConfiguration(classes = [PolicyExecutorHttpClientConfig])
+@EnableConfigurationProperties
+class PolicyExecutorHttpClientConfigSpec extends Specification {
+
+    @Autowired
+    PolicyExecutorHttpClientConfig policyExecutorHttpClientConfig
+
+    def 'Test http client configuration properties of data with custom and default values'() {
+        expect: 'properties are populated correctly for all services'
+            with(policyExecutorHttpClientConfig.allServices) {
+                assert maximumInMemorySizeInMegabytes == 31
+                assert maximumConnectionsTotal == 32
+                assert pendingAcquireMaxCount == 33
+                assert connectionTimeoutInSeconds == 34
+                assert readTimeoutInSeconds == 35
+                assert writeTimeoutInSeconds == 36
+            }
+    }
+}
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/DmiDataOperationsSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/DmiDataOperationsSpec.groovy
index 8b369bf..ec13aee 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/DmiDataOperationsSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/DmiDataOperationsSpec.groovy
@@ -28,16 +28,16 @@
 import org.onap.cps.ncmp.api.exceptions.DmiClientRequestException
 import org.onap.cps.ncmp.config.CpsApplicationContext
 import org.onap.cps.ncmp.events.async1_0_0.DataOperationEvent
+import org.onap.cps.ncmp.impl.data.policyexecutor.PolicyExecutor
 import org.onap.cps.ncmp.impl.dmi.DmiOperationsBaseSpec
 import org.onap.cps.ncmp.impl.dmi.DmiProperties
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters
 import org.onap.cps.ncmp.impl.inventory.models.CmHandleState
 import org.onap.cps.ncmp.impl.utils.AlternateIdMatcher
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters
 import org.onap.cps.ncmp.utils.TestUtils
 import org.onap.cps.utils.JsonObjectMapper
 import org.spockframework.spring.SpringBean
 import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.boot.test.context.SpringBootContextLoader
 import org.springframework.boot.test.context.SpringBootTest
 import org.springframework.http.HttpStatus
 import org.springframework.http.ResponseEntity
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/PolicyExecutorSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/PolicyExecutorSpec.groovy
index 6542067..4b09afa 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/PolicyExecutorSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/PolicyExecutorSpec.groovy
@@ -4,6 +4,7 @@
 import ch.qos.logback.classic.Logger
 import ch.qos.logback.classic.spi.ILoggingEvent
 import ch.qos.logback.core.read.ListAppender
+import org.onap.cps.ncmp.impl.data.policyexecutor.PolicyExecutor
 import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle
 import org.slf4j.LoggerFactory
 import org.springframework.beans.factory.annotation.Autowired
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImplSpec.groovy
index 3af4740..74bd048 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImplSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImplSpec.groovy
@@ -22,7 +22,7 @@
 
 import org.onap.cps.ncmp.impl.dmi.DmiProperties
 import org.onap.cps.ncmp.impl.dmi.DmiRestClient
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters
 import reactor.core.publisher.Mono
 import spock.lang.Specification
 
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobStatusServiceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobStatusServiceImplSpec.groovy
index d231dfa..be46d88 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobStatusServiceImplSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobStatusServiceImplSpec.groovy
@@ -22,7 +22,7 @@
 
 import org.onap.cps.ncmp.impl.dmi.DmiProperties
 import org.onap.cps.ncmp.impl.dmi.DmiRestClient
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters
 import reactor.core.publisher.Mono
 import spock.lang.Specification
 
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiRestClientSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiRestClientSpec.groovy
index d92e69a..4d47ef1 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiRestClientSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiRestClientSpec.groovy
@@ -25,6 +25,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper
 import com.fasterxml.jackson.databind.node.ObjectNode
 import org.onap.cps.ncmp.api.exceptions.DmiClientRequestException
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters
 import org.onap.cps.ncmp.utils.TestUtils
 import org.onap.cps.utils.JsonObjectMapper
 import org.springframework.http.HttpHeaders
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiWebClientConfigurationSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiWebClientConfigurationSpec.groovy
deleted file mode 100644
index fca47d8..0000000
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiWebClientConfigurationSpec.groovy
+++ /dev/null
@@ -1,77 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2024 Nordix Foundation.
- * ================================================================================
- * 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.
- *
- * SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.cps.ncmp.impl.dmi
-
-
-import org.onap.cps.ncmp.config.HttpClientConfiguration
-import org.springframework.boot.context.properties.EnableConfigurationProperties
-import org.springframework.boot.test.context.SpringBootTest
-import org.springframework.test.context.ContextConfiguration
-import org.springframework.test.context.TestPropertySource
-import org.springframework.web.reactive.function.client.WebClient
-import spock.lang.Specification
-
-@SpringBootTest
-@ContextConfiguration(classes = [HttpClientConfiguration])
-@TestPropertySource(properties = ['ncmp.dmi.httpclient.data-services.connectionTimeoutInSeconds=1', 'ncmp.dmi.httpclient.model-services.maximumInMemorySizeInMegabytes=1'])
-@EnableConfigurationProperties
-class DmiWebClientConfigurationSpec extends Specification {
-
-    def webClientBuilder = Mock(WebClient.Builder) {
-        defaultHeaders(_) >> it
-        clientConnector(_) >> it
-        codecs(_) >> it
-        build() >> Mock(WebClient)
-    }
-
-    def httpClientConfiguration = Spy(HttpClientConfiguration.class)
-
-    def objectUnderTest = new DmiWebClientConfiguration(httpClientConfiguration)
-
-    def 'Web Client Configuration construction.'() {
-        expect: 'the system can create an instance'
-            new DmiWebClientConfiguration(httpClientConfiguration) != null
-    }
-
-    def 'Creating a web client instance data service.'() {
-        given: 'Web client configuration is invoked'
-            def dataServicesWebClient = objectUnderTest.dataServicesWebClient(webClientBuilder)
-        expect: 'the system can create an instance for data service'
-            assert dataServicesWebClient != null
-            assert dataServicesWebClient instanceof WebClient
-    }
-
-    def 'Creating a web client instance model service.'() {
-        given: 'Web client configuration invoked'
-            def modelServicesWebClient = objectUnderTest.modelServicesWebClient(webClientBuilder)
-        expect: 'the system can create an instance for model service'
-            assert modelServicesWebClient != null
-            assert modelServicesWebClient instanceof WebClient
-    }
-
-    def 'Creating a web client instance health service.'() {
-        given: 'Web client configuration invoked'
-            def healthChecksWebClient = objectUnderTest.healthChecksWebClient(webClientBuilder)
-        expect: 'the system can create an instance for health service'
-            assert healthChecksWebClient != null
-            assert healthChecksWebClient instanceof WebClient
-    }
-}
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiWebClientsConfigurationSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiWebClientsConfigurationSpec.groovy
new file mode 100644
index 0000000..cb209be
--- /dev/null
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiWebClientsConfigurationSpec.groovy
@@ -0,0 +1,70 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.impl.dmi
+
+
+import org.onap.cps.ncmp.config.DmiHttpClientConfig
+import org.springframework.boot.context.properties.EnableConfigurationProperties
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.test.context.ContextConfiguration
+import org.springframework.web.reactive.function.client.WebClient
+import spock.lang.Specification
+
+@SpringBootTest
+@ContextConfiguration(classes = [DmiHttpClientConfig])
+@EnableConfigurationProperties
+class DmiWebClientsConfigurationSpec extends Specification {
+
+    def webClientBuilder = Mock(WebClient.Builder) {
+        defaultHeaders(_) >> it
+        clientConnector(_) >> it
+        codecs(_) >> it
+        build() >> Mock(WebClient)
+    }
+
+    def dmiHttpClientConfiguration = Spy(DmiHttpClientConfig.class)
+
+    def objectUnderTest = new DmiWebClientsConfiguration(dmiHttpClientConfiguration)
+
+    def 'Web client for data services.'() {
+        when: 'creating a web client for dmi data services'
+            def result = objectUnderTest.dataServicesWebClient(webClientBuilder)
+        then: 'a web client is created successfully'
+            assert result != null
+            assert result instanceof WebClient
+    }
+
+    def 'Web client model services.'() {
+        when: 'creating a web client for dmi model services'
+            def result = objectUnderTest.modelServicesWebClient(webClientBuilder)
+        then: 'a web client is created successfully'
+            assert result != null
+            assert result instanceof WebClient
+    }
+
+    def 'Web client health check services.'() {
+        when: 'creating a web client for dmi health check services'
+            def result = objectUnderTest.healthChecksWebClient(webClientBuilder)
+        then: 'a web client is created successfully'
+            assert result != null
+            assert result instanceof WebClient
+    }
+}
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/DmiModelOperationsSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/DmiModelOperationsSpec.groovy
index 196a1cd..c80aa7b 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/DmiModelOperationsSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/DmiModelOperationsSpec.groovy
@@ -25,7 +25,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper
 import org.onap.cps.ncmp.impl.dmi.DmiOperationsBaseSpec
 import org.onap.cps.ncmp.impl.dmi.DmiProperties
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters
 import org.onap.cps.spi.model.ModuleReference
 import org.onap.cps.utils.JsonObjectMapper
 import org.spockframework.spring.SpringBean
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDogSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDogSpec.groovy
index d4c1f54..32f4503 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDogSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDogSpec.groovy
@@ -22,8 +22,8 @@
 
 import org.onap.cps.ncmp.api.inventory.models.TrustLevel
 import org.onap.cps.ncmp.impl.dmi.DmiRestClient
-import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters
 import org.onap.cps.ncmp.impl.inventory.CmHandleQueryService
+import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters
 import reactor.core.publisher.Mono
 import spock.lang.Specification
 
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/policyexecutor/PolicyExecutorWebClientConfigurationSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/policyexecutor/PolicyExecutorWebClientConfigurationSpec.groovy
new file mode 100644
index 0000000..cf5e1a3
--- /dev/null
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/policyexecutor/PolicyExecutorWebClientConfigurationSpec.groovy
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.impl.policyexecutor
+
+import org.onap.cps.ncmp.config.PolicyExecutorHttpClientConfig
+import org.springframework.boot.context.properties.EnableConfigurationProperties
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.test.context.ContextConfiguration
+import org.springframework.web.reactive.function.client.WebClient
+import spock.lang.Specification
+
+@SpringBootTest
+@ContextConfiguration(classes = [PolicyExecutorHttpClientConfig])
+@EnableConfigurationProperties
+class PolicyExecutorWebClientConfigurationSpec extends Specification {
+
+    def webClientBuilder = Mock(WebClient.Builder) {
+        defaultHeaders(_) >> it
+        clientConnector(_) >> it
+        codecs(_) >> it
+        build() >> Mock(WebClient)
+    }
+
+    def httpClientConfiguration = Spy(PolicyExecutorHttpClientConfig.class)
+
+    def objectUnderTest = new PolicyExecutorWebClientConfiguration(httpClientConfiguration)
+
+    def 'Web client policy executor.'() {
+        when: 'create a web client for policy executor'
+            def result = objectUnderTest.policyExecutorWebClient(webClientBuilder)
+        then: 'a web client is created successfully'
+            assert result != null
+            assert result instanceof WebClient
+    }
+}
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiServiceUrlTemplateBuilderSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/utils/http/RestServiceUrlTemplateBuilderSpec.groovy
similarity index 87%
rename from cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiServiceUrlTemplateBuilderSpec.groovy
rename to cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/utils/http/RestServiceUrlTemplateBuilderSpec.groovy
index 9e1b370..9e05115 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiServiceUrlTemplateBuilderSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/utils/http/RestServiceUrlTemplateBuilderSpec.groovy
@@ -18,14 +18,13 @@
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.ncmp.impl.dmi
-
+package org.onap.cps.ncmp.impl.utils.http
 
 import spock.lang.Specification
 
-class DmiServiceUrlTemplateBuilderSpec extends Specification {
+class RestServiceUrlTemplateBuilderSpec extends Specification {
 
-    def objectUnderTest = new DmiServiceUrlTemplateBuilder()
+    def objectUnderTest = new RestServiceUrlTemplateBuilder()
 
     def 'Build URL template parameters with (variable) path segments and query parameters.'() {
         given: 'the URL details are given to the builder'
@@ -35,9 +34,9 @@
             objectUnderTest.queryParameter('param1', 'abc')
             objectUnderTest.queryParameter('param2', 'value?with#special:characters')
         when: 'the URL template parameters are created'
-            def result = objectUnderTest.createUrlTemplateParameters('myDmiServer', 'myBasePath')
+            def result = objectUnderTest.createUrlTemplateParameters('myServer', 'myBasePath')
         then: 'the URL template contains variable names instead of value and un-encoded fixed segment'
-            assert result.urlTemplate == 'myDmiServer/myBasePath/v1/segment/{myVariableSegment}/segment?with:special&characters?param1={param1}&param2={param2}'
+            assert result.urlTemplate == 'myServer/myBasePath/v1/segment/{myVariableSegment}/segment?with:special&characters?param1={param1}&param2={param2}'
         and: 'URL variables contains name and un-encoded value pairs'
             assert result.urlVariables == ['myVariableSegment': 'someValue', 'param1': 'abc', 'param2': 'value?with#special:characters']
     }
@@ -46,7 +45,7 @@
         given: 'the query parameter is given to the builder'
            objectUnderTest.queryParameter('my&param', 'special&characters=are?not\\encoded')
         when: 'the URL template parameters are created'
-            def result = objectUnderTest.createUrlTemplateParameters('myDmiServer', 'myBasePath')
+            def result = objectUnderTest.createUrlTemplateParameters('myServer', 'myBasePath')
         then: 'Special characters are not encoded'
             assert result.urlVariables == ['my&param': 'special&characters=are?not\\encoded']
     }
@@ -55,7 +54,7 @@
         when: 'the query parameter is given to the builder'
             objectUnderTest.queryParameter('param', value)
         and: 'the URL template parameters are create'
-            def result = objectUnderTest.createUrlTemplateParameters('myDmiServer', 'myBasePath')
+            def result = objectUnderTest.createUrlTemplateParameters('myServer', 'myBasePath')
         then: 'no parameter gets added'
             assert result.urlVariables.isEmpty()
         where: 'the following parameter values are used'
diff --git a/cps-ncmp-service/src/test/resources/application.yml b/cps-ncmp-service/src/test/resources/application.yml
index 759de83..72d074a 100644
--- a/cps-ncmp-service/src/test/resources/application.yml
+++ b/cps-ncmp-service/src/test/resources/application.yml
@@ -47,15 +47,26 @@
     dmi:
         httpclient:
             data-services:
-                pendingAcquireMaxCount: 22
-                connectionTimeoutInSeconds: 123
-                maximumInMemorySizeInMegabytes: 7
-                readTimeoutInSeconds: 33
+                maximumInMemorySizeInMegabytes: 1
+                maximumConnectionsTotal: 2
+                pendingAcquireMaxCount: 3
+                connectionTimeoutInSeconds: 4
+                readTimeoutInSeconds: 5
+                writeTimeoutInSeconds: 6
             model-services:
-                pendingAcquireMaxCount: 44
-                connectionTimeoutInSeconds: 456
-                maximumInMemorySizeInMegabytes: 8
-                maximumConnectionsTotal: 111
+                maximumInMemorySizeInMegabytes: 11
+                maximumConnectionsTotal: 12
+                pendingAcquireMaxCount: 13
+                connectionTimeoutInSeconds: 14
+                readTimeoutInSeconds: 15
+                writeTimeoutInSeconds: 16
+            healthCheckServices:
+                maximumInMemorySizeInMegabytes: 21
+                maximumConnectionsTotal: 22
+                pendingAcquireMaxCount: 23
+                connectionTimeoutInSeconds: 24
+                readTimeoutInSeconds: 25
+                writeTimeoutInSeconds: 26
         auth:
             username: some-user
             password: some-password
@@ -75,6 +86,14 @@
         server:
             address: "http://localhost"
             port: "8785"
+        httpclient:
+            all-services:
+                maximumInMemorySizeInMegabytes: 31
+                maximumConnectionsTotal: 32
+                pendingAcquireMaxCount: 33
+                connectionTimeoutInSeconds: 34
+                readTimeoutInSeconds: 35
+                writeTimeoutInSeconds: 36
 
 # Custom Hazelcast Config.
 hazelcast:
diff --git a/csit/install-deps.sh b/csit/install-deps.sh
new file mode 100755
index 0000000..ef0b96a
--- /dev/null
+++ b/csit/install-deps.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+#
+# Copyright 2024 Nordix Foundation.
+#
+# 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.
+#
+
+echo "---> install-deps.sh"
+echo "Installing dependencies"
+
+# Create directory for downloaded binaries.
+mkdir -p bin
+touch bin/.gitignore
+
+# Add it to the PATH, so downloaded versions will be used.
+export PATH="$(pwd)/bin:$PATH"
+
+# Download docker-compose.
+if [ ! -x bin/docker-compose ]; then
+  echo " Downloading docker-compose"
+  curl -s -L https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-linux-x86_64 > bin/docker-compose
+  chmod +x bin/docker-compose
+else
+  echo " docker-compose already installed"
+fi
+docker-compose version
diff --git a/csit/plans/cps/setup.sh b/csit/plans/cps/setup.sh
index 80829eb..036f14b 100755
--- a/csit/plans/cps/setup.sh
+++ b/csit/plans/cps/setup.sh
@@ -1,7 +1,6 @@
 #!/bin/bash
 #
 # Copyright 2016-2017 Huawei Technologies Co., Ltd.
-# Modifications Copyright (C) 2022 Nordix Foundation.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -19,7 +18,7 @@
 # Modifications copyright (c) 2020-2021 Samsung Electronics Co., Ltd.
 # Modifications Copyright (C) 2021 Pantheon.tech
 # Modifications Copyright (C) 2021 Bell Canada.
-# Modifications Copyright (C) 2021 Nordix Foundation.
+# Modifications Copyright (C) 2021-2024 Nordix Foundation.
 #
 # Branched from ccsdk/distribution to this repository Feb 23, 2021
 #
@@ -59,10 +58,6 @@
 ###################### setup cps-ncmp ############################
 cd $CPS_HOME/docker-compose
 
-curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > docker-compose
-chmod +x docker-compose
-docker-compose version
-
 # start CPS/NCMP, DMI Plugin, and PostgreSQL containers with docker compose
 docker-compose --profile dmi-service up -d
 
@@ -82,4 +77,4 @@
 
 ###################### ROBOT Configurations ##########################
 # Pass variables required for Robot test suites in ROBOT_VARIABLES
-ROBOT_VARIABLES="-v CPS_CORE_HOST:$CPS_CORE_HOST -v CPS_CORE_PORT:$CPS_CORE_PORT -v DMI_HOST:$LOCAL_IP -v DMI_PORT:$DMI_PORT -v DMI_CSIT_STUB_HOST:$LOCAL_IP -v DMI_CSIT_STUB_PORT:$DMI_DEMO_STUB_PORT -v DMI_AUTH_ENABLED:$DMI_AUTH_ENABLED -v DATADIR_CPS_CORE:$WORKSPACE/data/cps-core -v DATADIR_NCMP:$WORKSPACE/data/ncmp -v DATADIR_SUBS_NOTIFICATION:$WORKSPACE/data/subscription-notification --exitonfailure"
\ No newline at end of file
+ROBOT_VARIABLES="-v CPS_CORE_HOST:$CPS_CORE_HOST -v CPS_CORE_PORT:$CPS_CORE_PORT -v DMI_HOST:$LOCAL_IP -v DMI_PORT:$DMI_PORT -v DMI_CSIT_STUB_HOST:$LOCAL_IP -v DMI_CSIT_STUB_PORT:$DMI_DEMO_STUB_PORT -v DMI_AUTH_ENABLED:$DMI_AUTH_ENABLED -v DATADIR_CPS_CORE:$WORKSPACE/data/cps-core -v DATADIR_NCMP:$WORKSPACE/data/ncmp -v DATADIR_SUBS_NOTIFICATION:$WORKSPACE/data/subscription-notification --exitonfailure"
diff --git a/csit/run-project-csit.sh b/csit/run-project-csit.sh
index fcb3c92..f362cc7 100755
--- a/csit/run-project-csit.sh
+++ b/csit/run-project-csit.sh
@@ -2,6 +2,7 @@
 #
 # Copyright 2020-2021 © Samsung Electronics Co., Ltd.
 # Modifications Copyright (C) 2021 Pantheon.tech
+# Modifications Copyright (C) 2024 Nordix Foundation.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -28,6 +29,8 @@
 mkdir -p ${WORKSPACE}/archives
 cd ${WORKSPACE}
 
+source install-deps.sh
+
 # Execute all test-suites defined under plans subdirectory
 for dir in plans/*/
 do
diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/DataJobResultServiceSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/DataJobResultServiceSpec.groovy
index 241d31a..4d04eee 100644
--- a/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/DataJobResultServiceSpec.groovy
+++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/DataJobResultServiceSpec.groovy
@@ -39,7 +39,6 @@
         when: 'the data job status checked'
             def result = dataJobResultService.getDataJobResult(authorization, dmiServiceName, dataProducerId, dataProducerJobId, destination)
         then: 'the status is that defined in the mock service.'
-            assert result != null
             assert result == '{ "result": "some result"}'
     }
 }
diff --git a/k6-tests/install-deps.sh b/k6-tests/install-deps.sh
new file mode 100755
index 0000000..bb5deb9
--- /dev/null
+++ b/k6-tests/install-deps.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+#
+# Copyright 2024 Nordix Foundation.
+#
+# 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.
+#
+
+echo "---> install-deps.sh"
+echo "Installing dependencies"
+
+# Create directory for downloaded binaries.
+mkdir -p bin
+touch bin/.gitignore
+
+# Add it to the PATH, so downloaded versions will be used.
+export PATH="$(pwd)/bin:$PATH"
+
+# Download docker-compose.
+if [ ! -x bin/docker-compose ]; then
+  echo " Downloading docker-compose"
+  curl -s -L https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-linux-x86_64 > bin/docker-compose
+  chmod +x bin/docker-compose
+else
+  echo " docker-compose already installed"
+fi
+docker-compose version
+
+# Download k6 with kafka extension.
+if [ ! -x bin/k6 ]; then
+  echo " Downloading k6 with kafka extension"
+  curl -s -L https://github.com/mostafa/xk6-kafka/releases/download/v0.26.0/xk6-kafka_v0.26.0_linux_amd64.tar.gz | tar -xz
+  mv dist/xk6-kafka_v0.26.0_linux_amd64 bin/k6 && rmdir dist
+  chmod +x bin/k6
+else
+  echo " k6 already installed"
+fi
+k6 --version
diff --git a/k6-tests/run-k6-tests.sh b/k6-tests/run-k6-tests.sh
index 9b8747b..b1ad389 100755
--- a/k6-tests/run-k6-tests.sh
+++ b/k6-tests/run-k6-tests.sh
@@ -31,6 +31,10 @@
 
 pushd "$(dirname "$0")" || exit 1
 
+# Install needed dependencies.
+source install-deps.sh
+
+# Run k6 test suite.
 ./setup.sh
 ./ncmp/run-all-tests.sh
 NCMP_RESULT=$?
diff --git a/k6-tests/teardown.sh b/k6-tests/teardown.sh
index 1b4d721..7693dc0 100755
--- a/k6-tests/teardown.sh
+++ b/k6-tests/teardown.sh
@@ -19,4 +19,10 @@
 docker ps -a
 
 echo 'Stopping, Removing containers and volumes...'
-docker-compose -f ../docker-compose/docker-compose.yml --profile dmi-stub down --volumes
+docker_compose_cmd="docker-compose -f ../docker-compose/docker-compose.yml --profile dmi-stub down --volumes"
+# Set an environment variable CLEAN_DOCKER_IMAGES=1 to also remove docker images when done (used on jenkins job)
+if [ "${CLEAN_DOCKER_IMAGES:-0}" -eq 1 ]; then
+  $docker_compose_cmd --rmi all
+else
+  $docker_compose_cmd
+fi