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..8be57fe 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,6 +41,7 @@
 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;
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/dmi/DmiWebClientsConfiguration.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiWebClientsConfiguration.java
new file mode 100644
index 0000000..265d284
--- /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.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/policyexecutor/PolicyExecutorWebClientConfiguration.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/policyexecutor/PolicyExecutorWebClientConfiguration.java
new file mode 100644
index 0000000..a927764
--- /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.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/DmiWebClientConfiguration.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/utils/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/WebClientConfiguration.java
index c176e40..967f74e 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/WebClientConfiguration.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.ncmp.impl.dmi;
+package org.onap.cps.ncmp.impl.utils;
 
 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..2324d48 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,6 +28,7 @@
 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
@@ -37,7 +38,6 @@
 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/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/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/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:
