diff --git a/build.gradle b/build.gradle
index 34f0707183e6c6741a090eca85db187bd1d2d0cc..01fcd2bd5d732f7799c463021bad7883a366397c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,7 +34,7 @@ protobuf {
     }
     plugins {
         grpc {
-            artifact = 'io.grpc:protoc-gen-grpc-java:1.72.0'
+            artifact = 'io.grpc:protoc-gen-grpc-java:1.73.0'
         }
     }
     generateProtoTasks {
@@ -132,9 +132,9 @@ dependencies {
 
     // GRPC communication with Janitor
     implementation('com.google.protobuf:protobuf-java:4.31.0')
-    implementation('io.grpc:grpc-netty-shaded:1.72.0')
-    implementation('io.grpc:grpc-protobuf:1.72.0')
-    implementation('io.grpc:grpc-stub:1.72.0')
+    implementation('io.grpc:grpc-netty-shaded:1.73.0')
+    implementation('io.grpc:grpc-protobuf:1.73.0')
+    implementation('io.grpc:grpc-stub:1.73.0')
 
     // CSV processing
     implementation('com.opencsv:opencsv:5.11')
@@ -247,9 +247,7 @@ jacocoTestCoverageVerification {
             ]
             excludes = [
                     '**.model*',
-                    '**.exceptions**',
-                    '**.exception**',
-                    'net.geant.nmaas.portal.api.bulk'
+                    '**.exceptions**'
             ]
             limit {
                 counter = 'INSTRUCTION'
@@ -260,8 +258,7 @@ jacocoTestCoverageVerification {
         rule {
             element = 'PACKAGE'
             includes = [
-                    'net.geant.nmaas.orchestration.**',
-                    'net.geant.nmaas.portal.api.bulk'
+                    'net.geant.nmaas.orchestration.**'
             ]
             excludes = [
                     '**.model*',
diff --git a/docker/logback.xml b/docker/logback.xml
index 92f1b67a8c725b0f334bb7195c7d04dedf87ef3a..18dcc2d30c020a04c0b2a347b414e3e27e9c5653 100644
--- a/docker/logback.xml
+++ b/docker/logback.xml
@@ -84,6 +84,11 @@
         <appender-ref ref="nmaas-console"/>
     </logger>
 
+    <logger name="io.fabric8.kubernetes.client" level="INFO" additivity="false">
+        <appender-ref ref="nmaas-file"/>
+        <appender-ref ref="nmaas-console"/>
+    </logger>
+
     <root level="DEBUG">
         <appender-ref ref="nmaas-file" />
         <appender-ref ref="nmaas-console" />
diff --git a/src/integrationTest/java/net/geant/nmaas/nmservice/deployment/ServiceDeploymentWithKubernetesTest.java b/src/integrationTest/java/net/geant/nmaas/nmservice/deployment/ServiceDeploymentWithKubernetesTest.java
index 12221857a73a159df9d65fb982c435bbf841b09b..25cdb65cc27c6a5cf4f98c5fdc9bf95e8a570944 100644
--- a/src/integrationTest/java/net/geant/nmaas/nmservice/deployment/ServiceDeploymentWithKubernetesTest.java
+++ b/src/integrationTest/java/net/geant/nmaas/nmservice/deployment/ServiceDeploymentWithKubernetesTest.java
@@ -1,5 +1,6 @@
 package net.geant.nmaas.nmservice.deployment;
 
+import net.geant.nmaas.externalservices.kubernetes.RemoteClusterManager;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KubernetesRepositoryManager;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.*;
 import net.geant.nmaas.nmservice.deployment.exceptions.NmServiceRequestVerificationException;
@@ -24,6 +25,8 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
 
 @ExtendWith(SpringExtension.class)
 @SpringBootTest
@@ -35,6 +38,9 @@ class ServiceDeploymentWithKubernetesTest {
 	@Autowired
 	private KubernetesRepositoryManager repositoryManager;
 
+	@Autowired
+	private RemoteClusterManager remoteClusterManager;
+
 	private static final Identifier deploymentId = Identifier.newInstance(1L);
 
 	@AfterEach
@@ -93,6 +99,7 @@ class ServiceDeploymentWithKubernetesTest {
 				.applicationId(Identifier.newInstance("appId"))
 				.deploymentName("deploy")
 				.configFileRepositoryRequired(false)
+				.remoteClusterId(1L)
 				.appName("AppName").build();
 	}
 
diff --git a/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java b/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java
index d9dc7e03f7f7996863c85f78aacdb0e984ac3a25..d3ac198289fbdb5b1124718312dfaad70a3dcc39 100644
--- a/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java
+++ b/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java
@@ -2,6 +2,7 @@ package net.geant.nmaas.portal.api.configuration;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import net.geant.nmaas.portal.api.BaseControllerTestSetup;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.api.i18n.api.InternationalizationView;
 import net.geant.nmaas.portal.persistent.entity.User;
 import net.geant.nmaas.portal.persistent.entity.UsersHelper;
diff --git a/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java b/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java
index c4921e7bf0a844a2e0f32febb65c898b1033fc33..92c482a89f9902dbed4712118172894120d32300 100644
--- a/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java
+++ b/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java
@@ -10,8 +10,8 @@ import net.geant.nmaas.portal.api.domain.PasswordReset;
 import net.geant.nmaas.portal.api.domain.UserRequest;
 import net.geant.nmaas.portal.api.domain.UserRoleView;
 import net.geant.nmaas.portal.api.domain.UserView;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.api.security.JWTTokenService;
 import net.geant.nmaas.portal.persistent.entity.Domain;
 import net.geant.nmaas.portal.persistent.entity.User;
diff --git a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java
index 99f48216d8a201f94a4ec36277bb1d4ac90d7dd6..c218c1adea52a5780b3c4b33d1089d6da8c28e89 100644
--- a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java
+++ b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java
@@ -2,10 +2,10 @@ package net.geant.nmaas.portal.service.impl;
 
 import jakarta.transaction.Transactional;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.components.janitor.JanitorService;
-import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS;
 import net.geant.nmaas.portal.api.bulk.BulkType;
 import net.geant.nmaas.portal.api.bulk.CsvDomain;
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
 import net.geant.nmaas.portal.persistent.entity.BulkDeployment;
 import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState;
diff --git a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/DomainServiceIntTest.java b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/DomainServiceIntTest.java
index 0fcdcdb8879f8e04a24329e0ddb01754f2834382..d0a09110d915da06f1b5e5094c82ef03b7ab576d 100644
--- a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/DomainServiceIntTest.java
+++ b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/DomainServiceIntTest.java
@@ -16,7 +16,6 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.util.ArrayList;
-import java.util.stream.Collectors;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
@@ -52,7 +51,7 @@ public class DomainServiceIntTest {
 
         domainService.createDomain(domainRequest1);
 
-        assertThat(domainService.getDomains().stream().map(Domain::getName).collect(Collectors.toList())).contains("GLOBAL", "domainName");
+        assertThat(domainService.getDomains().stream().map(Domain::getName).toList()).contains("GLOBAL", "domainName");
 
         Long domainId = domainService.findDomain("domainName").orElseThrow().getId();
         domainService.softRemoveDomain(domainId);
diff --git a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/LocalFileStorageServiceTest.java b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/LocalFileStorageServiceTest.java
index 3b01ff02670b783969f93724c56398aa27429fa1..110262496529de0191f98467ded48606ef4bda46 100644
--- a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/LocalFileStorageServiceTest.java
+++ b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/LocalFileStorageServiceTest.java
@@ -1,7 +1,7 @@
 package net.geant.nmaas.portal.service.impl;
 
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.StorageException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.StorageException;
 import net.geant.nmaas.portal.persistent.entity.FileInfo;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/src/main/java/net/geant/nmaas/dcn/deployment/api/DcnAdminController.java b/src/main/java/net/geant/nmaas/dcn/deployment/api/DcnAdminController.java
index e7c0d3d8b13dae0d17522b2b75301a91c2e22fa8..373d58e4d55a9c9d790066d1a627167eb3b8326c 100644
--- a/src/main/java/net/geant/nmaas/dcn/deployment/api/DcnAdminController.java
+++ b/src/main/java/net/geant/nmaas/dcn/deployment/api/DcnAdminController.java
@@ -31,7 +31,7 @@ public class DcnAdminController {
     public List<DcnView> listAllDcns() {
         return dcnRepositoryManager.loadAllNetworks().stream()
                 .map(DcnView::new)
-                .collect(Collectors.toList());
+                .toList();
     }
 
 }
diff --git a/src/main/java/net/geant/nmaas/externalservices/kubernetes/RemoteClusterManager.java b/src/main/java/net/geant/nmaas/externalservices/kubernetes/RemoteClusterManager.java
index 36ae7abb54274fa717b06109e22bd0bbf82b5a44..bf8c9f6a1db8dc3a6c1a2c250a9c070c78b3402e 100644
--- a/src/main/java/net/geant/nmaas/externalservices/kubernetes/RemoteClusterManager.java
+++ b/src/main/java/net/geant/nmaas/externalservices/kubernetes/RemoteClusterManager.java
@@ -151,11 +151,7 @@ public class RemoteClusterManager implements ClusterMonitoringService {
                                 .state(KClusterState.UNKNOWN)
                                 .contactEmail(view.getContactEmail())
                                 .currentStateSince(OffsetDateTime.now())
-                                .domains(!view.getDomainNames().isEmpty() ? view.getDomainNames().stream().map(d -> {
-                                            Optional<Domain> dom = domainService.findDomain(d);
-                                            return dom.orElse(null);
-                                        }
-                                ).toList() : Collections.emptyList())
+                                .domains(prepareList(view))
                                 .build(),
                         file);
 
@@ -170,6 +166,17 @@ public class RemoteClusterManager implements ClusterMonitoringService {
         return null;
     }
 
+    private List<Domain> prepareList(RemoteClusterView view) {
+        if (view == null || view.getDomainNames() == null) {
+            return Collections.emptyList();
+        }
+        return view.getDomainNames().stream().map(d -> {
+                    Optional<Domain> dom = domainService.findDomain(d);
+                    return dom.orElse(null);
+                }
+        ).toList();
+    }
+
     public RemoteClusterView updateCluster(RemoteClusterView cluster, Long id) {
         Optional<KCluster> entity = clusterRepository.findById(id);
 
@@ -236,9 +243,11 @@ public class RemoteClusterManager implements ClusterMonitoringService {
         }
     }
 
-    private RemoteClusterView toView(KCluster KCluster) {
-        RemoteClusterView view = modelMapper.map(KCluster, RemoteClusterView.class);
-        view.setDomainNames(KCluster.getDomains().stream().map(Domain::getName).toList());
+    private RemoteClusterView toView(KCluster kCluster) {
+        RemoteClusterView view = modelMapper.map(kCluster, RemoteClusterView.class);
+        if (Objects.nonNull(kCluster.getDomains())) {
+            view.setDomainNames(kCluster.getDomains().stream().map(Domain::getName).toList());
+        }
         return view;
     }
 
@@ -332,7 +341,7 @@ public class RemoteClusterManager implements ClusterMonitoringService {
 
     public void removeCluster(Long id) {
         try {
-            if(clusterRepository.existsById(id)) {
+            if (clusterRepository.existsById(id)) {
                 this.clusterRepository.deleteById(id);
             }
         } catch (RuntimeException ex) {
@@ -342,4 +351,8 @@ public class RemoteClusterManager implements ClusterMonitoringService {
 
     }
 
+    public boolean clusterExists(Long id) {
+        return clusterRepository.existsById(id);
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/java/net/geant/nmaas/kubernetes/KubernetesConnectorHelper.java b/src/main/java/net/geant/nmaas/kubernetes/KubernetesConnectorHelper.java
index fb1391f8a1be91e1d2a13ee7bb755596cb89d523..ab2d4000520db7f7ab25f3a8bd1a472ea5fa1f4b 100644
--- a/src/main/java/net/geant/nmaas/kubernetes/KubernetesConnectorHelper.java
+++ b/src/main/java/net/geant/nmaas/kubernetes/KubernetesConnectorHelper.java
@@ -5,7 +5,7 @@ import io.fabric8.kubernetes.client.KubernetesClient;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.orchestration.AppDeploymentRepositoryManager;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.AppInstance;
 import net.geant.nmaas.portal.service.ApplicationInstanceService;
 import org.springframework.stereotype.Component;
diff --git a/src/main/java/net/geant/nmaas/monitor/MonitorManager.java b/src/main/java/net/geant/nmaas/monitor/MonitorManager.java
index 71f5d2895280a379110db9d0e23b4d3bcda23eaf..8dcb17fb1d591b5de80770e02352f0dbed9139ef 100644
--- a/src/main/java/net/geant/nmaas/monitor/MonitorManager.java
+++ b/src/main/java/net/geant/nmaas/monitor/MonitorManager.java
@@ -18,7 +18,6 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 @Component
 @RequiredArgsConstructor
@@ -31,19 +30,19 @@ public class MonitorManager {
 
     public void createMonitorEntry(MonitorEntryView monitorEntryView) {
         validateMonitorEntryCreation(monitorEntryView);
-        this.repository.save(modelMapper.map(monitorEntryView, MonitorEntry.class));
+        repository.save(modelMapper.map(monitorEntryView, MonitorEntry.class));
     }
 
     public void updateMonitorEntry(MonitorEntryView monitorEntryView) {
-        MonitorEntry monitorEntry = this.repository.findByServiceName(monitorEntryView.getServiceName())
+        MonitorEntry monitorEntry = repository.findByServiceName(monitorEntryView.getServiceName())
                 .orElseThrow(() -> new MonitorEntryNotFound(monitorEntryNotFoundMessage(monitorEntryView.getServiceName().getName())));
         validateMonitorEntryUpdate(monitorEntryView);
         monitorEntryView.setId(monitorEntry.getId());
-        this.repository.save(modelMapper.map(monitorEntryView, MonitorEntry.class));
+        repository.save(modelMapper.map(monitorEntryView, MonitorEntry.class));
     }
 
     public void updateMonitorEntry(Date lastCheck, ServiceType serviceType, MonitorStatus status) {
-        MonitorEntry monitorEntry = this.repository.findByServiceName(serviceType)
+        MonitorEntry monitorEntry = repository.findByServiceName(serviceType)
                 .orElseThrow(() -> new MonitorEntryNotFound(monitorEntryNotFoundMessage(serviceType.getName())));
         validateMonitorEntryUpdate(lastCheck, status);
         monitorEntry.setStatus(status);
@@ -54,33 +53,33 @@ public class MonitorManager {
         } else if (status.equals(MonitorStatus.FAILURE)) {
             eventPublisher.publishEvent(new NotificationEvent(this, getMailAttributes(serviceType.getName())));
         }
-        this.repository.save(monitorEntry);
+        repository.save(monitorEntry);
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public void deleteMonitorEntry(String serviceName) {
-        if (this.repository.existsByServiceName(ServiceType.valueOf(serviceName.toUpperCase()))) {
-            this.repository.deleteByServiceName(ServiceType.valueOf(serviceName.toUpperCase()));
+        if (repository.existsByServiceName(ServiceType.valueOf(serviceName.toUpperCase()))) {
+            repository.deleteByServiceName(ServiceType.valueOf(serviceName.toUpperCase()));
         }
     }
 
     public List<MonitorEntryView> getAllMonitorEntries() {
-        return this.repository.findAll().stream()
-                .map(entity -> this.modelMapper.map(entity, MonitorEntryView.class))
-                .collect(Collectors.toList());
+        return repository.findAll().stream()
+                .map(entity -> modelMapper.map(entity, MonitorEntryView.class))
+                .toList();
     }
 
     public MonitorEntryView getMonitorEntries(String serviceName) {
-        return this.repository.findByServiceName(ServiceType.valueOf(serviceName.toUpperCase()))
-                .map(entity -> this.modelMapper.map(entity, MonitorEntryView.class))
+        return repository.findByServiceName(ServiceType.valueOf(serviceName.toUpperCase()))
+                .map(entity -> modelMapper.map(entity, MonitorEntryView.class))
                 .orElseThrow(() -> new MonitorEntryNotFound(monitorEntryNotFoundMessage(serviceName)));
     }
 
     public void changeJobState(String serviceName, boolean active) {
-        MonitorEntry monitorEntry = this.repository.findByServiceName(ServiceType.valueOf(serviceName.toUpperCase()))
+        MonitorEntry monitorEntry = repository.findByServiceName(ServiceType.valueOf(serviceName.toUpperCase()))
                 .orElseThrow(() -> new MonitorEntryNotFound(monitorEntryNotFoundMessage(serviceName.toUpperCase())));
         monitorEntry.setActive(active);
-        this.repository.save(monitorEntry);
+        repository.save(monitorEntry);
     }
 
     public boolean existsByServiceName(ServiceType serviceName) {
diff --git a/src/main/java/net/geant/nmaas/nmservice/configuration/ConfigFilePreparer.java b/src/main/java/net/geant/nmaas/nmservice/configuration/ConfigFilePreparer.java
index e7c1fff025a06360cc275dfa07c5e787aa6e6bfd..fb744fd443c03bd0746b7840ee693bdb9792e6ad 100644
--- a/src/main/java/net/geant/nmaas/nmservice/configuration/ConfigFilePreparer.java
+++ b/src/main/java/net/geant/nmaas/nmservice/configuration/ConfigFilePreparer.java
@@ -23,7 +23,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.stream.Collectors;
 
 import static net.geant.nmaas.nmservice.configuration.ConfigFilePreparerHelper.convertToFreemarkerTemplate;
 import static net.geant.nmaas.nmservice.configuration.ConfigFilePreparerHelper.createModelEntriesFromUserInput;
@@ -94,7 +93,7 @@ class ConfigFilePreparer {
         }
         List<String> ipAddresses = devices.stream()
                 .map(device -> (String) ((Map) device).get(DEFAULT_MANAGED_DEVICE_IP_ADDRESS_KEY))
-                .collect(Collectors.toList());
+                .toList();
         nmServiceRepositoryManager.updateManagedDevices(deploymentId, ipAddresses);
     }
 
diff --git a/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabEventsListener.java b/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabEventsListener.java
index 34e4ce562525fbe35f3e7a931fed75cd80c1c12b..bbc39b7783117c54c3070ef0ec7a1cb5af8cb9af 100644
--- a/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabEventsListener.java
+++ b/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabEventsListener.java
@@ -9,7 +9,7 @@ import net.geant.nmaas.nmservice.configuration.gitlab.events.RemoveUserFromRepos
 import net.geant.nmaas.nmservice.configuration.gitlab.events.UserSshKeysUpdatedGitlabEvent;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KubernetesRepositoryManager;
 import net.geant.nmaas.orchestration.Identifier;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 
diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java
index 1cb6ce71487bd05b78fbade29f70dae91319b9af..d3fe9e1e81b0bc3140053a1c0bf6771d36569524 100644
--- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java
+++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java
@@ -4,6 +4,7 @@ import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManager;
+import net.geant.nmaas.externalservices.kubernetes.RemoteClusterManager;
 import net.geant.nmaas.externalservices.kubernetes.entities.IngressControllerConfigOption;
 import net.geant.nmaas.gitlab.GitLabManager;
 import net.geant.nmaas.gitlab.exceptions.GitLabInvalidConfigurationException;
@@ -39,7 +40,7 @@ import net.geant.nmaas.orchestration.entities.AppDeploymentSpec;
 import net.geant.nmaas.orchestration.entities.AppStorageVolume;
 import net.geant.nmaas.orchestration.exceptions.InvalidConfigurationException;
 import net.geant.nmaas.orchestration.exceptions.InvalidDeploymentIdException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.utils.logging.LogLevel;
 import net.geant.nmaas.utils.logging.Loggable;
 import org.apache.commons.lang3.StringUtils;
@@ -81,6 +82,7 @@ public class KubernetesManager implements ContainerOrchestrator {
     private final KubernetesClusterIngressManager ingressManager;
     private final GitLabManager gitLabManager;
     private final JanitorService janitorService;
+    private final RemoteClusterManager remoteClusterManager;
 
     @Override
     @Loggable(LogLevel.INFO)
@@ -96,6 +98,7 @@ public class KubernetesManager implements ContainerOrchestrator {
         } catch (IllegalArgumentException iae) {
             throw new NmServiceRequestVerificationException(iae.getMessage());
         }
+        //todo
 
         KubernetesNmServiceInfo serviceInfo = new KubernetesNmServiceInfo(
                 deploymentId,
@@ -103,6 +106,11 @@ public class KubernetesManager implements ContainerOrchestrator {
                 appDeployment.getDomain(),
                 appDeployment.getDescriptiveDeploymentId()
         );
+        //verify cluster
+        if(remoteClusterManager.clusterExists(appDeployment.getRemoteClusterId())) {
+           serviceInfo.setRemoteCluster(remoteClusterManager.getCluster(appDeployment.getRemoteClusterId()));
+        }
+
         serviceInfo.setKubernetesTemplate(KubernetesTemplate.copy(appDeploymentSpec.getKubernetesTemplate()));
         serviceInfo.setStorageVolumes(generateTemplateStorageVolumes(appDeploymentSpec.getStorageVolumes()));
         serviceInfo.setAccessMethods(generateTemplateAccessMethods(appDeploymentSpec.getAccessMethods()));
diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommand.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommand.java
index f4ba07022f7d0a78e95fe8f4dcf31ab0dec71644..0aaf87e860233474089ba70039fbce2394495cdd 100644
--- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommand.java
+++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommand.java
@@ -16,6 +16,8 @@ public abstract class HelmCommand implements Command {
     protected static final String HELM_VERSION_2 = "v2";
     protected static final String HELM_VERSION_3 = "v3";
 
+    protected static final String OPTION_KUBECONFIG = "--kubeconfig";
+
     protected String command;
 
     @Override
diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandExecutor.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandExecutor.java
index 01a3fd9b4307cc5eea008c719b76d0442d1d6b4c..dfc719d8abda50051c29c5f4b2ed08aba522ece6 100644
--- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandExecutor.java
+++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandExecutor.java
@@ -46,11 +46,11 @@ public class HelmCommandExecutor {
         this.enableTls = enableTls;
     }
 
-    void executeHelmInstallCommand(String namespace, String releaseName, KubernetesTemplate template, Map<String, String> arguments) {
-        executeInstall(namespace, releaseName, template, arguments);
+    void executeHelmInstallCommand(String namespace, String releaseName, KubernetesTemplate template, Map<String, String> arguments, String kubeConfigPath) {
+        executeInstall(namespace, releaseName, template, arguments, kubeConfigPath);
     }
 
-    private void executeInstall(String namespace, String releaseName, KubernetesTemplate template, Map<String, String> arguments) {
+    private void executeInstall(String namespace, String releaseName, KubernetesTemplate template, Map<String, String> arguments, String kubeConfigPath) {
         try {
             HelmInstallCommand command = HelmInstallCommand.commandWithRepo(
                     helmVersion,
@@ -59,7 +59,8 @@ public class HelmCommandExecutor {
                     arguments,
                     constructChartNameWithRepo(template.getChart().getName()),
                     template.getChart().getVersion(),
-                    enableTls
+                    enableTls,
+                    kubeConfigPath
             );
             commandExecutor.execute(command);
         } catch (CommandExecutionException e) {
diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManager.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManager.java
index 54f10b9f4871be7484741667bb567482f10e0476..f8b3e1aa50039a106cfb4eb9ee31e4646b46f4f4 100644
--- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManager.java
+++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManager.java
@@ -7,6 +7,7 @@ import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManag
 import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterNamespaceService;
 import net.geant.nmaas.externalservices.kubernetes.entities.IngressCertificateConfigOption;
 import net.geant.nmaas.externalservices.kubernetes.entities.IngressResourceConfigOption;
+import net.geant.nmaas.externalservices.kubernetes.entities.KCluster;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KServiceLifecycleManager;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KubernetesRepositoryManager;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.KubernetesNmServiceInfo;
@@ -76,26 +77,41 @@ public class HelmKServiceManager implements KServiceLifecycleManager {
                 namespaceService.namespace(serviceInfo.getDomain()),
                 serviceInfo.getDescriptiveDeploymentId().getValue(),
                 serviceInfo.getKubernetesTemplate(),
-                createArgumentsMap(serviceInfo)
+                createArgumentsMap(serviceInfo),
+                serviceInfo.getRemoteCluster() != null ? serviceInfo.getRemoteCluster().getPathConfigFile() : null
         );
     }
 
     private Map<String, String> createArgumentsMap(KubernetesNmServiceInfo serviceInfo) {
         Map<String, String> arguments = new HashMap<>();
-        if (deploymentManager.getForceDedicatedWorkers()) {
-            arguments.put(HELM_INSTALL_OPTION_DEDICATED_WORKERS, serviceInfo.getDomain());
-        }
+
         Set<ServiceStorageVolume> serviceStorageVolumes = serviceInfo.getStorageVolumes();
         if (!serviceStorageVolumes.isEmpty()) {
             arguments.putAll(getPersistenceVariables(serviceStorageVolumes, deploymentManager.getStorageClass(serviceInfo.getDomain()), serviceInfo.getDescriptiveDeploymentId().getValue()));
         }
-        Set<ServiceAccessMethod> externalAccessMethods = serviceExternalAccessMethods(serviceInfo.getAccessMethods());
-        if (!externalAccessMethods.isEmpty()) {
-            arguments.putAll(getIngressVariables(ingressManager.getResourceConfigOption(), externalAccessMethods, serviceInfo.getDomain()));
+
+        if(serviceInfo.getRemoteCluster() == null) {
+            if (deploymentManager.getForceDedicatedWorkers()) {
+                arguments.put(HELM_INSTALL_OPTION_DEDICATED_WORKERS, serviceInfo.getDomain());
+            }
+            Set<ServiceAccessMethod> externalAccessMethods = serviceExternalAccessMethods(serviceInfo.getAccessMethods());
+            if (!externalAccessMethods.isEmpty()) {
+                arguments.putAll(getIngressVariables(ingressManager.getResourceConfigOption(), externalAccessMethods, serviceInfo.getDomain()));
+            }
+        } else {
+            if (serviceInfo.getRemoteCluster().getDeployment().getForceDedicatedWorkers()) {
+                arguments.put(HELM_INSTALL_OPTION_DEDICATED_WORKERS, serviceInfo.getDomain());
+            }
+            Set<ServiceAccessMethod> externalAccessMethods = serviceExternalAccessMethods(serviceInfo.getAccessMethods());
+            if (!externalAccessMethods.isEmpty()) {
+                arguments.putAll(getIngressVariables(serviceInfo.getRemoteCluster().getIngress().getResourceConfigOption(), externalAccessMethods, serviceInfo.getDomain()));
+            }
         }
+
         if (serviceInfo.getAdditionalParameters() != null && !serviceInfo.getAdditionalParameters().isEmpty()) {
             arguments.putAll(removeRedundantParameters(serviceInfo.getAdditionalParameters()));
         }
+
         return arguments;
     }
 
diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/commands/HelmInstallCommand.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/commands/HelmInstallCommand.java
index 940c89fa9b85beac192549668b1df98f86943d54..692e26b541fe15dc01aef97825bdc636b1dcdd7b 100644
--- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/commands/HelmInstallCommand.java
+++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/commands/HelmInstallCommand.java
@@ -25,8 +25,12 @@ public class HelmInstallCommand extends HelmCommand {
      * @param enableTls    flag indicating if tls option should be added
      * @return complete command object
      */
-    public static HelmInstallCommand commandWithRepo(String helmVersion, String namespace, String releaseName, Map<String, String> values, String chartName, String chartVersion, boolean enableTls) {
+    public static HelmInstallCommand commandWithRepo(String helmVersion, String namespace, String releaseName, Map<String, String> values, String chartName, String chartVersion, boolean enableTls, String kubeConfigPath) {
         StringBuilder sb = buildBaseInstallCommand(helmVersion, namespace, releaseName, values);
+
+        if(kubeConfigPath != null && !kubeConfigPath.isEmpty()) {
+            sb.append(SPACE).append(OPTION_KUBECONFIG).append(SPACE).append(kubeConfigPath);
+        }
         if (chartName == null || chartName.isEmpty()) {
             throw new IllegalArgumentException("Chart name can't be null or empty");
         }
@@ -35,6 +39,7 @@ public class HelmInstallCommand extends HelmCommand {
             sb.append(SPACE).append(OPTION_VERSION).append(SPACE).append(chartVersion);
         }
         addTlsOptionIfRequired(helmVersion, enableTls, sb);
+
         return new HelmInstallCommand(sb.toString());
     }
 
diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/KubernetesNmServiceInfo.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/KubernetesNmServiceInfo.java
index e2f56ccb6d5a2c1c28894c21616ad0fec369d6bf..886ff994df77a43af404f210d40da1c9fbb70b62 100644
--- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/KubernetesNmServiceInfo.java
+++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/KubernetesNmServiceInfo.java
@@ -1,7 +1,10 @@
 package net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities;
 
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
 import lombok.Getter;
 import lombok.Setter;
+import net.geant.nmaas.externalservices.kubernetes.entities.KCluster;
 import net.geant.nmaas.nmservice.deployment.entities.NmServiceInfo;
 import net.geant.nmaas.orchestration.Identifier;
 
@@ -38,6 +41,10 @@ public class KubernetesNmServiceInfo extends NmServiceInfo {
     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
     private Set<ServiceAccessMethod> accessMethods;
 
+    @ManyToOne
+    @JoinColumn(name = "k_cluster_id", referencedColumnName = "id")
+    private KCluster remoteCluster;
+
     public KubernetesNmServiceInfo () {
         super();
     }
@@ -46,4 +53,9 @@ public class KubernetesNmServiceInfo extends NmServiceInfo {
         super(deploymentId, deploymentName, domain, descriptiveDeploymentId);
     }
 
+    public KubernetesNmServiceInfo(Identifier deploymentId, String deploymentName, String domain, Identifier descriptiveDeploymentId, KCluster kCluster) {
+        super(deploymentId, deploymentName, domain, descriptiveDeploymentId);
+        this.remoteCluster = kCluster;
+    }
+
 }
diff --git a/src/main/java/net/geant/nmaas/notifications/NotificationController.java b/src/main/java/net/geant/nmaas/notifications/NotificationController.java
index d3e7619a84e71894702b3e76285ab523e8d18377..964b5f1647e54bbdbc0513a95bda937b55055f7e 100644
--- a/src/main/java/net/geant/nmaas/notifications/NotificationController.java
+++ b/src/main/java/net/geant/nmaas/notifications/NotificationController.java
@@ -1,7 +1,7 @@
 package net.geant.nmaas.notifications;
 
 import net.geant.nmaas.notifications.templates.MailType;
-import net.geant.nmaas.portal.api.exception.AuthenticationException;
+import net.geant.nmaas.portal.api.exceptions.AuthenticationException;
 import net.geant.nmaas.utils.captcha.ValidateCaptcha;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
diff --git a/src/main/java/net/geant/nmaas/notifications/NotificationManager.java b/src/main/java/net/geant/nmaas/notifications/NotificationManager.java
index 575d94cab5e409f9491cde4dc5e6b49381e6bacb..8686a47eb584cdbcbacbf409ad4bdfd49b8a5403 100644
--- a/src/main/java/net/geant/nmaas/notifications/NotificationManager.java
+++ b/src/main/java/net/geant/nmaas/notifications/NotificationManager.java
@@ -16,11 +16,11 @@ import net.geant.nmaas.notifications.templates.api.LanguageMailContentView;
 import net.geant.nmaas.notifications.templates.api.MailTemplateView;
 import net.geant.nmaas.notifications.types.persistence.entity.FormType;
 import net.geant.nmaas.notifications.types.service.FormTypeService;
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.api.domain.UserView;
 import net.geant.nmaas.portal.api.domain.GroupAppListElement;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.Role;
 import net.geant.nmaas.portal.persistent.entity.User;
 import net.geant.nmaas.portal.service.ConfigurationManager;
diff --git a/src/main/java/net/geant/nmaas/notifications/types/service/FormTypeService.java b/src/main/java/net/geant/nmaas/notifications/types/service/FormTypeService.java
index 21426f5f5f09d240b3fe1b6ac0bc6d37589663fe..6b7d6fce5416bd8624b2705f6cf7b6d79c00ab61 100644
--- a/src/main/java/net/geant/nmaas/notifications/types/service/FormTypeService.java
+++ b/src/main/java/net/geant/nmaas/notifications/types/service/FormTypeService.java
@@ -5,7 +5,6 @@ import net.geant.nmaas.notifications.types.model.FormTypeRequest;
 import net.geant.nmaas.notifications.types.model.FormTypeView;
 import net.geant.nmaas.notifications.types.persistence.entity.FormType;
 import net.geant.nmaas.notifications.types.persistence.repository.FormTypeRepository;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
 import net.geant.nmaas.portal.exceptions.DataConflictException;
 import org.springframework.stereotype.Service;
 
diff --git a/src/main/java/net/geant/nmaas/orchestration/DefaultAppLifecycleManager.java b/src/main/java/net/geant/nmaas/orchestration/DefaultAppLifecycleManager.java
index e7393519814c88b5b1b4cae451ce300cc56c9d7e..289409f9a5bd512c24d4f1d48464602ef5698bb6 100644
--- a/src/main/java/net/geant/nmaas/orchestration/DefaultAppLifecycleManager.java
+++ b/src/main/java/net/geant/nmaas/orchestration/DefaultAppLifecycleManager.java
@@ -22,7 +22,7 @@ import net.geant.nmaas.orchestration.events.app.AppUpgradeActionEvent;
 import net.geant.nmaas.orchestration.events.app.AppVerifyRequestActionEvent;
 import net.geant.nmaas.orchestration.events.app.AppVerifyServiceActionEvent;
 import net.geant.nmaas.orchestration.exceptions.InvalidDeploymentIdException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.service.ConfigurationManager;
 import net.geant.nmaas.utils.logging.LogLevel;
 import net.geant.nmaas.utils.logging.Loggable;
diff --git a/src/main/java/net/geant/nmaas/orchestration/entities/AppDeployment.java b/src/main/java/net/geant/nmaas/orchestration/entities/AppDeployment.java
index 73173f116825dda60fe71b772bb9897e0b37927f..6593de17059fffb3ba403dc82acdda17ed701325 100644
--- a/src/main/java/net/geant/nmaas/orchestration/entities/AppDeployment.java
+++ b/src/main/java/net/geant/nmaas/orchestration/entities/AppDeployment.java
@@ -127,6 +127,8 @@ public class AppDeployment {
 
     private Long instanceId;
 
+    private Long remoteClusterId;
+
     /**
      * Globally unique descriptive application deployment identifier
      */
diff --git a/src/main/java/net/geant/nmaas/orchestration/jobs/DomainCreationJob.java b/src/main/java/net/geant/nmaas/orchestration/jobs/DomainCreationJob.java
index a83c3537689faee10cfd2b22ed82cd1fe353b7bd..3d5d751dc1c2fdf6e29f30d5c7f278305e43e37a 100644
--- a/src/main/java/net/geant/nmaas/orchestration/jobs/DomainCreationJob.java
+++ b/src/main/java/net/geant/nmaas/orchestration/jobs/DomainCreationJob.java
@@ -4,7 +4,7 @@ import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.orchestration.exceptions.WebServiceCommunicationException;
 import net.geant.nmaas.portal.api.domain.DomainView;
 import net.geant.nmaas.portal.api.domain.WebhookEventDto;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.Domain;
 import net.geant.nmaas.portal.persistent.entity.WebhookEventType;
 import net.geant.nmaas.portal.service.DomainService;
diff --git a/src/main/java/net/geant/nmaas/orchestration/jobs/DomainGroupJob.java b/src/main/java/net/geant/nmaas/orchestration/jobs/DomainGroupJob.java
index 7fe42451ebba65a1061e0981e789e9c0d823826a..0c4d59056de9625701219e18528b6407b18ae5ba 100644
--- a/src/main/java/net/geant/nmaas/orchestration/jobs/DomainGroupJob.java
+++ b/src/main/java/net/geant/nmaas/orchestration/jobs/DomainGroupJob.java
@@ -5,7 +5,7 @@ import net.geant.nmaas.orchestration.exceptions.WebServiceCommunicationException
 import net.geant.nmaas.portal.api.domain.DomainGroupView;
 import net.geant.nmaas.portal.api.domain.DomainGroupWebhookDto;
 import net.geant.nmaas.portal.api.domain.WebhookEventDto;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.WebhookEventType;
 import net.geant.nmaas.portal.service.WebhookEventService;
 import org.modelmapper.ModelMapper;
diff --git a/src/main/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTask.java b/src/main/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTask.java
index 3810ab4bbcf8f45dd015521e01b508f0d0dbd047..1da23840cb3c47d9147ad889a0c93a4cab44f3ee 100644
--- a/src/main/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTask.java
+++ b/src/main/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTask.java
@@ -2,6 +2,7 @@ package net.geant.nmaas.orchestration.tasks.app;
 
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import net.geant.nmaas.externalservices.kubernetes.RemoteClusterManager;
 import net.geant.nmaas.nmservice.deployment.NmServiceDeploymentProvider;
 import net.geant.nmaas.orchestration.Identifier;
 import net.geant.nmaas.orchestration.entities.AppDeployment;
@@ -18,6 +19,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.naming.directory.InvalidAttributesException;
 import java.time.LocalDateTime;
 
 @Component
@@ -29,6 +31,8 @@ public class AppRequestVerificationTask {
     private AppDeploymentRepository repository;
     private ApplicationRepository appRepository;
 
+    private RemoteClusterManager remoteClusterManager;
+
     @EventListener
     @Loggable(LogLevel.INFO)
     @Transactional(propagation = Propagation.REQUIRES_NEW)
@@ -39,6 +43,9 @@ public class AppRequestVerificationTask {
             final AppDeployment appDeployment = repository.findByDeploymentId(deploymentId).orElseThrow(() -> new InvalidDeploymentIdException(deploymentId));
             final Application application = appRepository.findById(Long.valueOf(appDeployment.getApplicationId().getValue())).orElseThrow(() ->
                     new InvalidApplicationIdException("Application for deployment " + deploymentId + " does not exist in repository"));
+            if(!remoteClusterManager.clusterExists(appDeployment.getRemoteClusterId())) {
+                throw new InvalidAttributesException("Wrong remote cluster Id");
+            }
             serviceDeployment.verifyRequest(
                     deploymentId,
                     appDeployment,
diff --git a/src/main/java/net/geant/nmaas/portal/PortalConfig.java b/src/main/java/net/geant/nmaas/portal/PortalConfig.java
index 7ef5f2a31d94faafd298504562a4e0b487642d2a..ead54e07bbc8701edd2676988e175bf0aa466ccf 100644
--- a/src/main/java/net/geant/nmaas/portal/PortalConfig.java
+++ b/src/main/java/net/geant/nmaas/portal/PortalConfig.java
@@ -2,8 +2,8 @@ package net.geant.nmaas.portal;
 
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.exceptions.OnlyOneConfigurationSupportedException;
 import net.geant.nmaas.portal.persistent.entity.Content;
 import net.geant.nmaas.portal.persistent.entity.Domain;
diff --git a/src/main/java/net/geant/nmaas/portal/api/auth/BasicAuthController.java b/src/main/java/net/geant/nmaas/portal/api/auth/BasicAuthController.java
index 4ad5fb8d28e7fe3fdb487374e803524e1cd0a95e..6cf9f0112655cd791eeb4497ed03f6e925661a0c 100644
--- a/src/main/java/net/geant/nmaas/portal/api/auth/BasicAuthController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/auth/BasicAuthController.java
@@ -6,8 +6,8 @@ import jakarta.servlet.http.HttpServletRequest;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.portal.api.domain.Pong;
-import net.geant.nmaas.portal.api.exception.AuthenticationException;
-import net.geant.nmaas.portal.api.exception.SignupException;
+import net.geant.nmaas.portal.api.exceptions.AuthenticationException;
+import net.geant.nmaas.portal.api.exceptions.SignupException;
 import net.geant.nmaas.portal.api.security.JWTTokenService;
 import net.geant.nmaas.portal.exceptions.UndergoingMaintenanceException;
 import net.geant.nmaas.portal.persistent.entity.Role;
diff --git a/src/main/java/net/geant/nmaas/portal/api/auth/OIDCAuthController.java b/src/main/java/net/geant/nmaas/portal/api/auth/OIDCAuthController.java
index 28424e79ce9d9a405bba5e4ffb2c85385ed00996..d06efefc8e71a09f3e8cc212ee97f8160f630179 100644
--- a/src/main/java/net/geant/nmaas/portal/api/auth/OIDCAuthController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/auth/OIDCAuthController.java
@@ -4,10 +4,10 @@ import com.google.common.collect.ImmutableSet;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
-import net.geant.nmaas.portal.api.exception.AuthenticationException;
-import net.geant.nmaas.portal.api.exception.ExternalUserCanNotBeLinked;
-import net.geant.nmaas.portal.api.exception.ExternalUserMatchException;
-import net.geant.nmaas.portal.api.exception.SignupException;
+import net.geant.nmaas.portal.api.exceptions.AuthenticationException;
+import net.geant.nmaas.portal.api.exceptions.ExternalUserCanNotBeLinked;
+import net.geant.nmaas.portal.api.exceptions.ExternalUserMatchException;
+import net.geant.nmaas.portal.api.exceptions.SignupException;
 import net.geant.nmaas.portal.api.security.JWTTokenService;
 import net.geant.nmaas.portal.exceptions.UndergoingMaintenanceException;
 import net.geant.nmaas.portal.persistent.entity.Role;
diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java b/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java
index 5be222d8793b4c4e4729ee6bd36b488eb9cf4e4f..15fa7148f830547d4962c024ddd3a9b61fccf329 100644
--- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java
@@ -3,8 +3,13 @@ package net.geant.nmaas.portal.api.bulk;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import net.geant.nmaas.portal.api.bulk.model.BulkAppDetails;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentView;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS;
+import net.geant.nmaas.portal.api.bulk.model.BulkQueueDetails;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.BulkDeployment;
 import net.geant.nmaas.portal.persistent.entity.BulkDeploymentEntry;
 import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState;
@@ -151,7 +156,7 @@ public class BulkController {
 
         return ResponseEntity.ok(mapToViewList(filter(false, bulkDeploymentRepository.findByType(BulkType.DOMAIN))).stream()
                 .filter(bulk -> bulk.getCreator().getId().equals(user.getId()))
-                .collect(Collectors.toList()));
+                .toList());
     }
 
     @GetMapping("/apps")
@@ -168,7 +173,7 @@ public class BulkController {
 
         return ResponseEntity.ok(mapToViewList(filter(false, bulkDeploymentRepository.findByType(BulkType.APPLICATION))).stream()
                 .filter(bulk -> bulk.getCreator().getId().equals(user.getId()))
-                .collect(Collectors.toList()));
+                .toList());
     }
 
     @DeleteMapping("/{id}")
@@ -192,7 +197,6 @@ public class BulkController {
         if (removeApps) {
             bulkApplicationService.deleteAppInstancesFromBulk(bulk.get());
         }
-//        bulkDeploymentRepository.delete(bulk.get());
         bulk.get().setDeleted(true);
         bulk.get().setState(BulkDeploymentState.REMOVED);
         bulkDeploymentRepository.save(bulk.get());
@@ -202,13 +206,13 @@ public class BulkController {
     private List<BulkDeploymentViewS> mapToViewList(List<BulkDeployment> deployments) {
         return deployments.stream()
                 .map(bulk -> mapToView(bulk, BulkDeploymentViewS.class))
-                .collect(Collectors.toList());
+                .toList();
     }
 
     @GetMapping("/refresh/{id}")
     @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN') || hasRole('ROLE_GROUP_MANAGER')")
     public ResponseEntity<BulkDeploymentViewS> getRefreshedState(@PathVariable Long id) {
-        return ResponseEntity.ok(mapToView(this.bulkApplicationService.updateState(id)));
+        return ResponseEntity.ok(mapToView(bulkApplicationService.updateState(id)));
     }
 
     @GetMapping("/queue/{id}")
@@ -220,7 +224,7 @@ public class BulkController {
     private List<BulkDeploymentViewS> mapToView(List<BulkDeployment> deployments) {
         return deployments.stream()
                 .map(bulk -> mapToView(bulk, BulkDeploymentViewS.class))
-                .collect(Collectors.toList());
+                .toList();
     }
 
     private <T extends BulkDeploymentViewS> T mapToView(BulkDeployment bulk, Class<T> viewType) {
diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkAppDetails.java b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkAppDetails.java
similarity index 92%
rename from src/main/java/net/geant/nmaas/portal/api/bulk/BulkAppDetails.java
rename to src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkAppDetails.java
index 7873d255a029b736564169d8ee0fd7fd03a0e974..043962b16e16c08cd02a1f44b7dd41d13fe49741 100644
--- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkAppDetails.java
+++ b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkAppDetails.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.bulk;
+package net.geant.nmaas.portal.api.bulk.model;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentEntryView.java b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentEntryView.java
similarity index 94%
rename from src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentEntryView.java
rename to src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentEntryView.java
index 872e641c7580100976e3042be08764f9ae92d2d0..134e21d81bd3245c653e590bdfd66781cb19efe4 100644
--- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentEntryView.java
+++ b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentEntryView.java
@@ -1,10 +1,11 @@
-package net.geant.nmaas.portal.api.bulk;
+package net.geant.nmaas.portal.api.bulk.model;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import net.geant.nmaas.portal.api.bulk.BulkType;
 import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState;
 
 import java.util.Map;
diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentView.java b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentView.java
similarity index 86%
rename from src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentView.java
rename to src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentView.java
index 330b56895a48221d55a5c3c15d924038753f6b3b..a114625276dd05c064c8f746a85e6e0c684a146f 100644
--- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentView.java
+++ b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentView.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.bulk;
+package net.geant.nmaas.portal.api.bulk.model;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentViewS.java b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentViewS.java
similarity index 90%
rename from src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentViewS.java
rename to src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentViewS.java
index 78f4f6b944ff82c04a64f9cc66954cb7165c31b6..11e02e25c192f587fb63da591ec9e2aee6dcfd62 100644
--- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentViewS.java
+++ b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentViewS.java
@@ -1,9 +1,10 @@
-package net.geant.nmaas.portal.api.bulk;
+package net.geant.nmaas.portal.api.bulk.model;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import net.geant.nmaas.portal.api.bulk.BulkType;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
 import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState;
 
diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkQueueDetails.java b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkQueueDetails.java
similarity index 89%
rename from src/main/java/net/geant/nmaas/portal/api/bulk/BulkQueueDetails.java
rename to src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkQueueDetails.java
index 818dfdc3f5824f4cee8446783ed9f55862da374f..16b3cab1a5174ff3259fd2add702f8debfacaa6e 100644
--- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkQueueDetails.java
+++ b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkQueueDetails.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.bulk;
+package net.geant.nmaas.portal.api.bulk.model;
 
 
 import lombok.AllArgsConstructor;
diff --git a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationController.java b/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationController.java
index 0b18e8e646d7d548690b4985293e4ecc3afb0edd..8595ef2fc33539125c4c8dafd02689d4b943bda7 100644
--- a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationController.java
@@ -1,28 +1,32 @@
 package net.geant.nmaas.portal.api.configuration;
 
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.exceptions.ConfigurationNotFoundException;
 import net.geant.nmaas.portal.exceptions.OnlyOneConfigurationSupportedException;
 import net.geant.nmaas.portal.service.ConfigurationManager;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import jakarta.validation.Valid;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 @RequestMapping(value = "/api/configuration")
+@RequiredArgsConstructor
 public class ConfigurationController {
 
-    private ConfigurationManager configurationManager;
-
-    @Autowired
-    public ConfigurationController(ConfigurationManager configurationManager) {
-        this.configurationManager = configurationManager;
-    }
+    private final ConfigurationManager configurationManager;
 
     @GetMapping
-    public ConfigurationView getConfiguration(){
+    public ConfigurationView getConfiguration() {
         return this.configurationManager.getConfiguration();
     }
 
@@ -33,7 +37,7 @@ public class ConfigurationController {
         return this.configurationManager.setConfiguration(configuration);
     }
 
-    @PutMapping(value="/{id}")
+    @PutMapping(value = "/{id}")
     @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')")
     @ResponseStatus(code = HttpStatus.NO_CONTENT)
     public void updateConfiguration(@PathVariable("id") Long id, @RequestBody @Valid ConfigurationView configuration) {
@@ -42,13 +46,13 @@ public class ConfigurationController {
 
     @ExceptionHandler(OnlyOneConfigurationSupportedException.class)
     @ResponseStatus(code = HttpStatus.NOT_FOUND)
-    public String handleOnlyOneConfigurationSupportedException(OnlyOneConfigurationSupportedException e){
+    public String handleOnlyOneConfigurationSupportedException(OnlyOneConfigurationSupportedException e) {
         return e.getMessage();
     }
 
     @ExceptionHandler(ConfigurationNotFoundException.class)
     @ResponseStatus(code = HttpStatus.NOT_ACCEPTABLE)
-    public String handleConfigurationNotFoundException(ConfigurationNotFoundException e){
+    public String handleConfigurationNotFoundException(ConfigurationNotFoundException e) {
         return e.getMessage();
     }
 }
diff --git a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java b/src/main/java/net/geant/nmaas/portal/api/configuration/model/ConfigurationView.java
similarity index 95%
rename from src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java
rename to src/main/java/net/geant/nmaas/portal/api/configuration/model/ConfigurationView.java
index 893e6cd951067972adc76bb661d3dbbf62d3bc80..f2f4b13f606699a754406b1c76f1cffe30ccc5d7 100644
--- a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java
+++ b/src/main/java/net/geant/nmaas/portal/api/configuration/model/ConfigurationView.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.configuration;
+package net.geant.nmaas.portal.api.configuration.model;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -57,5 +57,4 @@ public class ConfigurationView {
 
     private String healthCheckJobCron;
 
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/AuthenticationException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/AuthenticationException.java
similarity index 92%
rename from src/main/java/net/geant/nmaas/portal/api/exception/AuthenticationException.java
rename to src/main/java/net/geant/nmaas/portal/api/exceptions/AuthenticationException.java
index 7677611239f09541409c060b0d1c5093a207e5ca..36bdf79759f532e20c495ffe0008446ffcc85b2f 100644
--- a/src/main/java/net/geant/nmaas/portal/api/exception/AuthenticationException.java
+++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/AuthenticationException.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.exception;
+package net.geant.nmaas.portal.api.exceptions;
 
 public class AuthenticationException extends MarketException {
 
diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserCanNotBeLinked.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserCanNotBeLinked.java
similarity index 76%
rename from src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserCanNotBeLinked.java
rename to src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserCanNotBeLinked.java
index 134b925a49acd3f65b0d90b00478c1d0442514fa..21b3c2b80f04e348aa872b1607009e94813c85ea 100644
--- a/src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserCanNotBeLinked.java
+++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserCanNotBeLinked.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.exception;
+package net.geant.nmaas.portal.api.exceptions;
 
 public class ExternalUserCanNotBeLinked extends RuntimeException {
     public ExternalUserCanNotBeLinked(String message) {
diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserMatchException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserMatchException.java
similarity index 77%
rename from src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserMatchException.java
rename to src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserMatchException.java
index e17674047e9ea612ba68391c3cc3fa64d3b3dd7c..b498b95d77dc4c0d14cfb7037b684953e9d552b4 100644
--- a/src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserMatchException.java
+++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserMatchException.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.exception;
+package net.geant.nmaas.portal.api.exceptions;
 
 public class ExternalUserMatchException extends RuntimeException {
 
diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/MarketException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/MarketException.java
similarity index 91%
rename from src/main/java/net/geant/nmaas/portal/api/exception/MarketException.java
rename to src/main/java/net/geant/nmaas/portal/api/exceptions/MarketException.java
index 1dba432b59ce1ba6cbf7edcf0ea3aaf64eea3c97..9360530776d483550e086898a044c2dc45525c2b 100644
--- a/src/main/java/net/geant/nmaas/portal/api/exception/MarketException.java
+++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/MarketException.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.exception;
+package net.geant.nmaas.portal.api.exceptions;
 
 public class MarketException extends RuntimeException {
 
diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/MissingElementException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/MissingElementException.java
similarity index 92%
rename from src/main/java/net/geant/nmaas/portal/api/exception/MissingElementException.java
rename to src/main/java/net/geant/nmaas/portal/api/exceptions/MissingElementException.java
index 391a0513750d39688ea98a96f27f209cbf80e598..d79ea86fd69f86173bd5ad8b4c2b268ca7c12f4f 100644
--- a/src/main/java/net/geant/nmaas/portal/api/exception/MissingElementException.java
+++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/MissingElementException.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.exception;
+package net.geant.nmaas.portal.api.exceptions;
 
 public class MissingElementException extends MarketException {
 
diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/ProcessingException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/ProcessingException.java
similarity index 91%
rename from src/main/java/net/geant/nmaas/portal/api/exception/ProcessingException.java
rename to src/main/java/net/geant/nmaas/portal/api/exceptions/ProcessingException.java
index d63d2952174ca29fa201c18a0b33920b0e4ae5a8..4a95de29f9eae97045162a7d93b991320daea94d 100644
--- a/src/main/java/net/geant/nmaas/portal/api/exception/ProcessingException.java
+++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/ProcessingException.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.exception;
+package net.geant.nmaas.portal.api.exceptions;
 
 public class ProcessingException extends MarketException {
 
diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/SignupException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/SignupException.java
similarity index 91%
rename from src/main/java/net/geant/nmaas/portal/api/exception/SignupException.java
rename to src/main/java/net/geant/nmaas/portal/api/exceptions/SignupException.java
index 3cb3ae8b6f5c7ba352738ef2c6cab2842653f2c6..f479d904660b924297795e7f5efeac008d00bc6a 100644
--- a/src/main/java/net/geant/nmaas/portal/api/exception/SignupException.java
+++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/SignupException.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.exception;
+package net.geant.nmaas.portal.api.exceptions;
 
 public class SignupException extends MarketException {
 
diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/StorageException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/StorageException.java
similarity index 91%
rename from src/main/java/net/geant/nmaas/portal/api/exception/StorageException.java
rename to src/main/java/net/geant/nmaas/portal/api/exceptions/StorageException.java
index ab19c1f76a3d34c61469772fa55b5ffd186d5643..0476bfda3ca4ef85224deee26ba0a62ce6ccb3f2 100644
--- a/src/main/java/net/geant/nmaas/portal/api/exception/StorageException.java
+++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/StorageException.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.exception;
+package net.geant.nmaas.portal.api.exceptions;
 
 public class StorageException extends MarketException {
 
diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/ValidationError.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationError.java
similarity index 92%
rename from src/main/java/net/geant/nmaas/portal/api/exception/ValidationError.java
rename to src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationError.java
index 2a7d02b2101b6cd8c7896cd752eab06b677a50ce..ab23528c1f3a706888cc625d844cb847c19ce015 100644
--- a/src/main/java/net/geant/nmaas/portal/api/exception/ValidationError.java
+++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationError.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.exception;
+package net.geant.nmaas.portal.api.exceptions;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 
diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/ValidationErrorBuilder.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationErrorBuilder.java
similarity index 91%
rename from src/main/java/net/geant/nmaas/portal/api/exception/ValidationErrorBuilder.java
rename to src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationErrorBuilder.java
index 7b04d3dc4efa60bf503b90ed81701d78bfd54763..ad553cc40d3600ef6f509baec694496761040574 100644
--- a/src/main/java/net/geant/nmaas/portal/api/exception/ValidationErrorBuilder.java
+++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationErrorBuilder.java
@@ -1,4 +1,4 @@
-package net.geant.nmaas.portal.api.exception;
+package net.geant.nmaas.portal.api.exceptions;
 
 import org.springframework.validation.Errors;
 import org.springframework.validation.ObjectError;
diff --git a/src/main/java/net/geant/nmaas/portal/api/info/ContentController.java b/src/main/java/net/geant/nmaas/portal/api/info/ContentController.java
index aa4101ae8435d3fd8cee245d9950c34691dadf78..92ea95bfb782dbeb241e3d610f4285362301c41c 100644
--- a/src/main/java/net/geant/nmaas/portal/api/info/ContentController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/info/ContentController.java
@@ -2,7 +2,7 @@ package net.geant.nmaas.portal.api.info;
 
 import lombok.AllArgsConstructor;
 import net.geant.nmaas.portal.api.domain.ContentView;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.Content;
 import net.geant.nmaas.portal.persistent.repositories.ContentRepository;
 import org.modelmapper.ModelMapper;
diff --git a/src/main/java/net/geant/nmaas/portal/api/info/DashboardController.java b/src/main/java/net/geant/nmaas/portal/api/info/DashboardController.java
index 2e423bde14dc0e2a9d60d0b7f6007ab906bbd3a4..540733ce0baa7c853cbeeac352c79303a3db9b8b 100644
--- a/src/main/java/net/geant/nmaas/portal/api/info/DashboardController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/info/DashboardController.java
@@ -1,9 +1,7 @@
 package net.geant.nmaas.portal.api.info;
 
-import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import net.geant.nmaas.portal.api.domain.ContentView;
-import net.geant.nmaas.portal.persistent.entity.Content;
 import net.geant.nmaas.portal.service.DashboardService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -15,38 +13,35 @@ import org.springframework.web.bind.annotation.RestController;
 import java.time.OffsetDateTime;
 
 @RestController
-@AllArgsConstructor
 @RequestMapping("/api/dashboard")
+@RequiredArgsConstructor
 @Slf4j
 public class DashboardController {
 
-    private DashboardService dashboardService;
+    private final DashboardService dashboardService;
 
     @GetMapping("/admin")
     @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')")
-    public DashboardView getDashboardAdmin( @RequestParam("startDate") OffsetDateTime startDate,
-                                            @RequestParam("end") OffsetDateTime endDate) {
-        checkDate(startDate,endDate);
-        DashboardView view = dashboardService.getSystemDashboard(startDate,endDate);
-        log.error("View : {}", view.toString());
-
-        return view;
+    public DashboardView getDashboardAdmin(@RequestParam("startDate") OffsetDateTime startDate,
+                                           @RequestParam("end") OffsetDateTime endDate) {
+        validateRequestedPeriod(startDate, endDate);
+        return dashboardService.getSystemDashboard(startDate, endDate);
     }
 
     @GetMapping("/domain/{id}")
     public DomainDashboardView getDashboardDomain(@PathVariable Long id) {
-        DomainDashboardView view = dashboardService.getSystemDomainDashboard(id);
-        log.error("View : {}", view.toString());
-        return view;
+        return dashboardService.getDomainDashboard(id);
     }
 
-    private void checkDate(OffsetDateTime startDate, OffsetDateTime endDate) {
-        if(startDate == null || endDate == null) {
+    private void validateRequestedPeriod(OffsetDateTime startDate, OffsetDateTime endDate) {
+        if (startDate == null) {
             throw new IllegalArgumentException("Start date can not be null");
         }
-
-        if(startDate.isAfter(endDate)) {
+        if (endDate == null) {
+            throw new IllegalArgumentException("End date can not be null");
+        }
+        if (startDate.isAfter(endDate)) {
             throw new IllegalArgumentException("Start date is after end date.");
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/net/geant/nmaas/portal/api/info/GeneralInformationController.java b/src/main/java/net/geant/nmaas/portal/api/info/GeneralInformationController.java
index cd5c594332442a04c1f2c03da621c95653d4a154..c133e7f0f37ae08079b851200af39bb4951fe968 100644
--- a/src/main/java/net/geant/nmaas/portal/api/info/GeneralInformationController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/info/GeneralInformationController.java
@@ -26,8 +26,8 @@ public class GeneralInformationController {
 
     @GetMapping(value = "/changelog", produces = "application/json")
     public FileSystemResource getChangelog() throws IOException {
-        Path tempJsonFile = Files.createTempFile("changelog",".json");
-        try(InputStream inputStream = changelogPath.getInputStream()) {
+        Path tempJsonFile = Files.createTempFile("changelog", ".json");
+        try (InputStream inputStream = changelogPath.getInputStream()) {
             Files.copy(inputStream, tempJsonFile, StandardCopyOption.REPLACE_EXISTING);
         }
         return new FileSystemResource(tempJsonFile);
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/ApiExceptionHandler.java b/src/main/java/net/geant/nmaas/portal/api/market/ApiExceptionHandler.java
index c9600e4aa1f053eaa6e10a1b18e34d7202da081b..3f4d3f7df641854c2ea110a194d911b9f3c04caa 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/ApiExceptionHandler.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/ApiExceptionHandler.java
@@ -5,12 +5,12 @@ import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.nmservice.configuration.exceptions.InvalidWebhookException;
 import net.geant.nmaas.portal.api.domain.ApiError;
-import net.geant.nmaas.portal.api.exception.AuthenticationException;
-import net.geant.nmaas.portal.api.exception.MarketException;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
-import net.geant.nmaas.portal.api.exception.SignupException;
-import net.geant.nmaas.portal.api.exception.StorageException;
+import net.geant.nmaas.portal.api.exceptions.AuthenticationException;
+import net.geant.nmaas.portal.api.exceptions.MarketException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.SignupException;
+import net.geant.nmaas.portal.api.exceptions.StorageException;
 import net.geant.nmaas.portal.api.security.exceptions.AuthenticationMethodNotSupportedException;
 import net.geant.nmaas.portal.api.security.exceptions.BasicAuthenticationException;
 import net.geant.nmaas.portal.api.security.exceptions.MissingTokenException;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/AppBaseController.java b/src/main/java/net/geant/nmaas/portal/api/market/AppBaseController.java
index 6cebf6377def0c77e20fe0d050d729a5842cd600..5a3a690c0de93a89deda7f16ded84b9e3948ddd9 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/AppBaseController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/AppBaseController.java
@@ -1,6 +1,6 @@
 package net.geant.nmaas.portal.api.market;
 
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.Application;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
 import net.geant.nmaas.portal.persistent.entity.ApplicationVersion;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/AppCommentsController.java b/src/main/java/net/geant/nmaas/portal/api/market/AppCommentsController.java
index 522266fd026475c66e82baf45582e0c7feed2ee3..6dc27adeab260b35500e0b984b5f90b727565d34 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/AppCommentsController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/AppCommentsController.java
@@ -3,8 +3,8 @@ package net.geant.nmaas.portal.api.market;
 import net.geant.nmaas.portal.api.domain.CommentRequest;
 import net.geant.nmaas.portal.api.domain.CommentView;
 import net.geant.nmaas.portal.api.domain.Id;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
 import net.geant.nmaas.portal.persistent.entity.Comment;
 import net.geant.nmaas.portal.persistent.entity.User;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/AppConfigurationController.java b/src/main/java/net/geant/nmaas/portal/api/market/AppConfigurationController.java
index 6d57e463bc461a1d4b94e9e727041187f29ccf92..0864786a6cd058739788b97a3876d1e8cea1915b 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/AppConfigurationController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/AppConfigurationController.java
@@ -7,8 +7,8 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.orchestration.AppLifecycleManager;
 import net.geant.nmaas.orchestration.api.model.AppConfigurationView;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.AppInstance;
 import net.geant.nmaas.portal.service.ApplicationInstanceService;
 import org.springframework.security.access.prepost.PreAuthorize;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/AppInstanceController.java b/src/main/java/net/geant/nmaas/portal/api/market/AppInstanceController.java
index 735f43a87ef0fc8349ca0b2bf282487673ff621a..baf2bd768482b747cb5324077908a316321ae248 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/AppInstanceController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/AppInstanceController.java
@@ -15,6 +15,18 @@ import net.geant.nmaas.orchestration.exceptions.InvalidDomainException;
 import net.geant.nmaas.portal.api.domain.*;
 import net.geant.nmaas.portal.api.exception.MissingElementException;
 import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.domain.AppInstanceBase;
+import net.geant.nmaas.portal.api.domain.AppInstanceRequest;
+import net.geant.nmaas.portal.api.domain.AppInstanceState;
+import net.geant.nmaas.portal.api.domain.AppInstanceStatus;
+import net.geant.nmaas.portal.api.domain.AppInstanceView;
+import net.geant.nmaas.portal.api.domain.AppInstanceViewExtended;
+import net.geant.nmaas.portal.api.domain.ApplicationBaseView;
+import net.geant.nmaas.portal.api.domain.ConfigWizardTemplateView;
+import net.geant.nmaas.portal.api.domain.Id;
+import net.geant.nmaas.portal.api.domain.UserBase;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.exceptions.ApplicationSubscriptionNotActiveException;
 import net.geant.nmaas.portal.persistent.entity.*;
 import net.geant.nmaas.portal.service.*;
@@ -263,6 +275,7 @@ public class AppInstanceController extends AppBaseController {
                 .owner(principal.getName())
                 .appName(app.getName())
                 .descriptiveDeploymentId(createDescriptiveDeploymentId(domain.getCodename(), app.getName(), appInstance.getId()))
+                .remoteClusterId(clusterId)
                 .build();
 
         Identifier internalId = appLifecycleManager.deployApplication(appDeployment);
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/AppScreenshotsController.java b/src/main/java/net/geant/nmaas/portal/api/market/AppScreenshotsController.java
index 91350476be89d25eff531c3b3c5fdc97556a11cd..9ce335b81b2990f902c10cb0df08c8377d39093a 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/AppScreenshotsController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/AppScreenshotsController.java
@@ -3,7 +3,7 @@ package net.geant.nmaas.portal.api.market;
 import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.portal.api.domain.FileInfoView;
 import net.geant.nmaas.portal.api.domain.UserFile;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
 import net.geant.nmaas.portal.persistent.entity.FileInfo;
 import net.geant.nmaas.portal.service.ApplicationBaseService;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java b/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java
index 36fd2187b5d173a4031e1108d6b33c2146ecb57c..5c769ca247a2411e3ffe6947243252285cb900eb 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java
@@ -18,9 +18,9 @@ import net.geant.nmaas.portal.api.domain.ApplicationStateChangeRequest;
 import net.geant.nmaas.portal.api.domain.ApplicationView;
 import net.geant.nmaas.portal.api.domain.Id;
 import net.geant.nmaas.portal.api.domain.UserView;
-import net.geant.nmaas.portal.api.exception.MarketException;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MarketException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.exceptions.ObjectAlreadyExistsException;
 import net.geant.nmaas.portal.persistent.entity.Application;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/BaseController.java b/src/main/java/net/geant/nmaas/portal/api/market/BaseController.java
index 7d7e1107768ae008bb8d2dd0733a26275d78d4ba..c15fa53e9599f3216129c5adc652b26e4cb355a9 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/BaseController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/BaseController.java
@@ -1,7 +1,7 @@
 package net.geant.nmaas.portal.api.market;
 
 import lombok.RequiredArgsConstructor;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.User;
 import net.geant.nmaas.portal.service.UserService;
 import org.modelmapper.ModelMapper;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/DomainController.java b/src/main/java/net/geant/nmaas/portal/api/market/DomainController.java
index 4e26d642830329e8fc8d5d3e3f84020c21ce04d7..6f30f0453639c31b1193962c287d04758e9134d1 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/DomainController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/DomainController.java
@@ -15,8 +15,8 @@ import net.geant.nmaas.portal.api.domain.DomainRequest;
 import net.geant.nmaas.portal.api.domain.DomainView;
 import net.geant.nmaas.portal.api.domain.Id;
 import net.geant.nmaas.portal.api.domain.KeyValueView;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.exceptions.DataConflictException;
 import net.geant.nmaas.portal.exceptions.ObjectNotFoundException;
 import net.geant.nmaas.portal.persistent.entity.ApplicationStatePerDomain;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/GroupController.java b/src/main/java/net/geant/nmaas/portal/api/market/GroupController.java
index fbee9be5dd4a3a7af684ff1669a8d86019d683fd..44bc969602efcef361308c6371d25fa9257bcfe4 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/GroupController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/GroupController.java
@@ -5,7 +5,7 @@ import net.geant.nmaas.orchestration.exceptions.InvalidDomainException;
 import net.geant.nmaas.portal.api.domain.DomainGroupView;
 import net.geant.nmaas.portal.api.domain.Id;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.exceptions.DataConflictException;
 import net.geant.nmaas.portal.persistent.entity.Role;
 import net.geant.nmaas.portal.persistent.entity.User;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/RatingController.java b/src/main/java/net/geant/nmaas/portal/api/market/RatingController.java
index 306f8aef49faf380768b11240272b1aa09bb7985..6e04c1b64c7894f0300a3cfb6f888fd543ec3a9a 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/RatingController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/RatingController.java
@@ -3,7 +3,7 @@ package net.geant.nmaas.portal.api.market;
 import jakarta.validation.constraints.NotNull;
 import net.geant.nmaas.portal.api.domain.ApiResponse;
 import net.geant.nmaas.portal.api.domain.AppRateView;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.AppRate;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
 import net.geant.nmaas.portal.persistent.entity.User;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/RegistrationController.java b/src/main/java/net/geant/nmaas/portal/api/market/RegistrationController.java
index feeb3dde9abcfb3dd97ce7c399bbd51bed025800..e7b4f533083495b916685cffa550e84a2c1cd9f0 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/RegistrationController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/RegistrationController.java
@@ -8,8 +8,8 @@ import net.geant.nmaas.notifications.NotificationEvent;
 import net.geant.nmaas.notifications.templates.MailType;
 import net.geant.nmaas.portal.api.auth.Registration;
 import net.geant.nmaas.portal.api.domain.DomainBase;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.SignupException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.SignupException;
 import net.geant.nmaas.portal.exceptions.ObjectAlreadyExistsException;
 import net.geant.nmaas.portal.persistent.entity.Domain;
 import net.geant.nmaas.portal.persistent.entity.Role;
diff --git a/src/main/java/net/geant/nmaas/portal/api/market/WebhookEventController.java b/src/main/java/net/geant/nmaas/portal/api/market/WebhookEventController.java
index 455af4018f383d63141969a0f29d191f5134c493..d816cf2479a841d7d1001dbd553e5f0a426aa666 100644
--- a/src/main/java/net/geant/nmaas/portal/api/market/WebhookEventController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/market/WebhookEventController.java
@@ -5,7 +5,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.portal.api.domain.Id;
 import net.geant.nmaas.portal.api.domain.WebhookEventDto;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.WebhookEvent;
 import net.geant.nmaas.portal.service.WebhookEventService;
 import org.springframework.http.ResponseEntity;
@@ -49,13 +49,13 @@ public class WebhookEventController {
     @PutMapping("/{id}")
     @Transactional
     @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')")
-    public void updateWebhook(@PathVariable Long id, @RequestBody @Valid WebhookEventDto webhook) {
+    public ResponseEntity<WebhookEventDto> updateWebhook(@PathVariable Long id, @RequestBody @Valid WebhookEventDto webhook) {
         if (!id.equals(webhook.getId())) {
             throw new ProcessingException(UNABLE_TO_CHANGE_WEBHOOK_EVENT);
         }
 
         try {
-            webhookEventService.update(webhook);
+            return ResponseEntity.ok(webhookEventService.update(webhook));
         } catch (GeneralSecurityException e) {
             throw new RuntimeException(e);
         }
diff --git a/src/main/java/net/geant/nmaas/portal/api/user/ProfileController.java b/src/main/java/net/geant/nmaas/portal/api/user/ProfileController.java
index 64d8c5781c39e83b3e2a9788f713bb8e555e3352..842af0c334eedb751da1ccdca071a4104e0c4848 100644
--- a/src/main/java/net/geant/nmaas/portal/api/user/ProfileController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/user/ProfileController.java
@@ -4,7 +4,7 @@ import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
 import net.geant.nmaas.portal.api.domain.UserRoleView;
 import net.geant.nmaas.portal.api.domain.UserView;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.User;
 import net.geant.nmaas.portal.service.UserService;
 import org.modelmapper.ModelMapper;
diff --git a/src/main/java/net/geant/nmaas/portal/api/user/SSHKeysControllerAdvice.java b/src/main/java/net/geant/nmaas/portal/api/user/SSHKeysControllerAdvice.java
index 022a3f6e8b225b394cb97d9f14b32a325c18ff8d..54973e59c62544a05b80caa8707728bc936039bb 100644
--- a/src/main/java/net/geant/nmaas/portal/api/user/SSHKeysControllerAdvice.java
+++ b/src/main/java/net/geant/nmaas/portal/api/user/SSHKeysControllerAdvice.java
@@ -1,7 +1,7 @@
 package net.geant.nmaas.portal.api.user;
 
-import net.geant.nmaas.portal.api.exception.ValidationError;
-import net.geant.nmaas.portal.api.exception.ValidationErrorBuilder;
+import net.geant.nmaas.portal.api.exceptions.ValidationError;
+import net.geant.nmaas.portal.api.exceptions.ValidationErrorBuilder;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatusCode;
 import org.springframework.http.ResponseEntity;
diff --git a/src/main/java/net/geant/nmaas/portal/api/user/UsersController.java b/src/main/java/net/geant/nmaas/portal/api/user/UsersController.java
index 350beec6ce096d2f71e9db2030bbbcd17a2876cf..f2a6103f6e605ee2732e5afebaa42348d8e0a919 100644
--- a/src/main/java/net/geant/nmaas/portal/api/user/UsersController.java
+++ b/src/main/java/net/geant/nmaas/portal/api/user/UsersController.java
@@ -14,8 +14,8 @@ import net.geant.nmaas.portal.api.domain.UserRequest;
 import net.geant.nmaas.portal.api.domain.UserRoleView;
 import net.geant.nmaas.portal.api.domain.UserView;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.api.security.JWTTokenService;
 import net.geant.nmaas.portal.exceptions.ObjectNotFoundException;
 import net.geant.nmaas.portal.persistent.entity.Domain;
diff --git a/src/main/java/net/geant/nmaas/portal/exceptions/UndergoingMaintenanceException.java b/src/main/java/net/geant/nmaas/portal/exceptions/UndergoingMaintenanceException.java
index b8ae9d26dc9d5a6ca9999da7d707f511f66a7772..9735e9ebcd9528aaffecbd28752f42eb5be023d8 100644
--- a/src/main/java/net/geant/nmaas/portal/exceptions/UndergoingMaintenanceException.java
+++ b/src/main/java/net/geant/nmaas/portal/exceptions/UndergoingMaintenanceException.java
@@ -1,6 +1,6 @@
 package net.geant.nmaas.portal.exceptions;
 
-import net.geant.nmaas.portal.api.exception.MarketException;
+import net.geant.nmaas.portal.api.exceptions.MarketException;
 
 public class UndergoingMaintenanceException extends MarketException {
     public UndergoingMaintenanceException() {
diff --git a/src/main/java/net/geant/nmaas/portal/persistent/entity/AppInstance.java b/src/main/java/net/geant/nmaas/portal/persistent/entity/AppInstance.java
index 2bfe5aedce3c7bd727032af4ccec95e5e421247c..2aa48cf5cf5e8f4b937c5e2e0d9040f73bacec0d 100644
--- a/src/main/java/net/geant/nmaas/portal/persistent/entity/AppInstance.java
+++ b/src/main/java/net/geant/nmaas/portal/persistent/entity/AppInstance.java
@@ -1,17 +1,5 @@
 package net.geant.nmaas.portal.persistent.entity;
 
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import net.geant.nmaas.orchestration.Identifier;
-import org.hibernate.annotations.JdbcType;
-import org.hibernate.annotations.Type;
-import org.hibernate.type.descriptor.jdbc.VarcharJdbcType;
-import org.springframework.data.annotation.CreatedBy;
-import org.springframework.data.annotation.CreatedDate;
-import org.springframework.data.jpa.domain.support.AuditingEntityListener;
-
 import jakarta.persistence.Basic;
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
@@ -23,6 +11,17 @@ import jakarta.persistence.Id;
 import jakarta.persistence.Lob;
 import jakarta.persistence.ManyToMany;
 import jakarta.persistence.ManyToOne;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import net.geant.nmaas.orchestration.Identifier;
+import org.hibernate.annotations.JdbcType;
+import org.hibernate.type.descriptor.jdbc.VarcharJdbcType;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
 import java.io.Serializable;
 import java.util.HashSet;
 import java.util.Set;
@@ -34,74 +33,66 @@ import java.util.Set;
 @Setter
 public class AppInstance extends DomainAware implements Serializable {
 
-	@Id
-	@GeneratedValue(strategy = GenerationType.IDENTITY)
-	Long id;
-	
-	String name;
-	
-	@ManyToOne(fetch = FetchType.LAZY, optional = false)
-	Application application;
-	
-	@Basic(fetch = FetchType.LAZY)
-	@Lob
-	@JdbcType(VarcharJdbcType.class)
-	@Column(columnDefinition = "TEXT")
-	String configuration;
-
-	@CreatedDate
-	@Column(name = "created_at", nullable = false, updatable = false)
-	Long createdAt;
-	
-	@CreatedBy
-	@ManyToOne(fetch = FetchType.LAZY)
-	private User owner;
-	
-	@Basic
-	Identifier internalId;
-
-	@Basic
-	private boolean autoUpgradesEnabled;
-
-	@Column(name = "previous_application_id")
-	private Long previousApplicationId;
-
-	@ManyToMany(fetch = FetchType.LAZY)
-	private Set<User> members = new HashSet<>();
-	
-	public AppInstance(Application application, Domain domain, String name, boolean autoUpgradesEnabled) {
-		this.application = application;
-		this.domain = domain;
-		this.name = name;
-		this.autoUpgradesEnabled = autoUpgradesEnabled;
-	}
-	
-	public AppInstance(Long id, Application application, Domain domain, String name, boolean autoUpgradesEnabled) {
-		this(application, domain, name, autoUpgradesEnabled);
-		this.id = id;
-	}
-	
-	public AppInstance(Application application, String name, Domain domain, User owner, boolean autoUpgradesEnabled) {
-		this(application, domain, name, autoUpgradesEnabled);
-		this.owner = owner;
-	}
-	
-	protected AppInstance(Long id, Application application, String name, Domain domain, boolean autoUpgradesEnabled, User owner) {
-		this(application, name, domain, owner, autoUpgradesEnabled);
-		this.id = id;
-	}
-
-	public void addMember(User user) {
-		members.add(user);
-	}
-
-	public void removeMember(User user) {
-		members.remove(user);
-	}
-
-	@Override
-	public String toString() {
-		return "AppInstance{id=" + id  + "}";
-	}
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    Long id;
+
+    String name;
+
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    Application application;
+
+    @Basic(fetch = FetchType.LAZY)
+    @Lob
+    @JdbcType(VarcharJdbcType.class)
+    @Column(columnDefinition = "TEXT")
+    String configuration;
+
+    @CreatedDate
+    @Column(name = "created_at", nullable = false, updatable = false)
+    Long createdAt;
+
+    @CreatedBy
+    @ManyToOne(fetch = FetchType.LAZY)
+    private User owner;
+
+    @Basic
+    Identifier internalId;
+
+    @Basic
+    private boolean autoUpgradesEnabled;
+
+    @Column(name = "previous_application_id")
+    private Long previousApplicationId;
+
+    @ManyToMany(fetch = FetchType.LAZY)
+    private Set<User> members = new HashSet<>();
+
+    public AppInstance(Application application, Domain domain, String name, boolean autoUpgradesEnabled) {
+        this.application = application;
+        this.domain = domain;
+        this.name = name;
+        this.autoUpgradesEnabled = autoUpgradesEnabled;
+    }
+
+    public AppInstance(Long id, Application application, Domain domain, String name, boolean autoUpgradesEnabled) {
+        this(application, domain, name, autoUpgradesEnabled);
+        this.id = id;
+    }
+
+    public AppInstance(Application application, String name, Domain domain, User owner, boolean autoUpgradesEnabled) {
+        this(application, domain, name, autoUpgradesEnabled);
+        this.owner = owner;
+    }
+
+    protected AppInstance(Long id, Application application, String name, Domain domain, boolean autoUpgradesEnabled, User owner) {
+        this(application, name, domain, owner, autoUpgradesEnabled);
+        this.id = id;
+    }
+
+    @Override
+    public String toString() {
+        return "AppInstance{id=" + id + "}";
+    }
 
 }
diff --git a/src/main/java/net/geant/nmaas/portal/persistent/repositories/AppInstanceRepository.java b/src/main/java/net/geant/nmaas/portal/persistent/repositories/AppInstanceRepository.java
index a502ee89db7b1e874753ce4fd667b1f2904ebce2..b6e1ef10ef7bfd9523f94d8f3295d00282b0caa9 100644
--- a/src/main/java/net/geant/nmaas/portal/persistent/repositories/AppInstanceRepository.java
+++ b/src/main/java/net/geant/nmaas/portal/persistent/repositories/AppInstanceRepository.java
@@ -17,47 +17,48 @@ import java.util.Optional;
 
 public interface AppInstanceRepository extends JpaRepository<AppInstance, Long> {
 
-	Optional<AppInstance> findByInternalId(Identifier internalId);
+    Optional<AppInstance> findByInternalId(Identifier internalId);
 
-	List<AppInstance> findAllByOwner(User user);
-	List<AppInstance> findAllByDomain(Domain domain);
-	List<AppInstance> findAllByOwnerAndDomain(User owner, Domain domain);
+    List<AppInstance> findAllByOwner(User user);
 
-	Page<AppInstance> findAllByDomain(Domain domain, Pageable pageable);
-	Page<AppInstance> findAllByOwner(User owner, Pageable pageable);
-	Page<AppInstance> findAllByOwnerAndDomain(User owner, Domain domain, Pageable pageable);
+    List<AppInstance> findAllByDomain(Domain domain);
 
-	List<AppInstance> findAllByApplication(Application application);
+    List<AppInstance> findAllByOwnerAndDomain(User owner, Domain domain);
 
-	@Query("select count(ai.id) FROM AppInstance ai JOIN AppDeployment ad on ad.deploymentId = ai.internalId where ad.state = 'APPLICATION_DEPLOYMENT_VERIFIED'")
-	int countAllRunning();
+    Page<AppInstance> findAllByDomain(Domain domain, Pageable pageable);
 
-	@Query("select count(ai.id) FROM AppInstance ai JOIN AppDeployment ad on ad.deploymentId = ai.internalId where ad.state = 'APPLICATION_DEPLOYMENT_VERIFIED' and ai.application.name = ?1")
-	int countRunningByName(String name);
+    Page<AppInstance> findAllByOwner(User owner, Pageable pageable);
 
-	@Modifying
-	@Query("update AppInstance ai set ai.application = :application, ai.previousApplicationId = :previousApplicationId where ai.id = :id")
-	void updateApplication(@Param(value = "id") long id, @Param(value = "previousApplicationId") long previousApplicationId, @Param(value = "application") Application application);
+    Page<AppInstance> findAllByOwnerAndDomain(User owner, Domain domain, Pageable pageable);
 
-	@Query("SELECT COUNT(ai.id) FROM AppInstance ai JOIN AppDeployment ad ON ad.deploymentId = ai.internalId WHERE ai.name = :name AND ai.domain.codename = :domain AND ad.state NOT IN" +
-			"('APPLICATION_REMOVED'," +
-			"'APPLICATION_CONFIGURATION_REMOVAL_IN_PROGRESS'," +
-			"'APPLICATION_CONFIGURATION_REMOVED'," +
-			"'FAILED_APPLICATION_REMOVED')" )
-	int isNameAvailableInDomain(@Param(value = "name") String name, @Param(value = "domain") String domain);
+    List<AppInstance> findAllByApplication(Application application);
 
-	@Query("select count(ai.id) FROM AppInstance ai  where ai.createdAt >= :sinceTime")
-	int countAllDeployedSinceTime(@Param("sinceTime") long sinceTime);
+    @Query("select count(ai.id) FROM AppInstance ai JOIN AppDeployment ad on ad.deploymentId = ai.internalId where ad.state = 'APPLICATION_DEPLOYMENT_VERIFIED'")
+    int countAllRunning();
 
-	@Query("select count(ai.id) FROM AppInstance ai  where ai.createdAt >= :sinceTime AND ai.createdAt < :endTime")
-	int countAllDeployedSinceTime(@Param("sinceTime") long sinceTime, @Param("endTime") long endTime);
+    @Query("select count(ai.id) FROM AppInstance ai JOIN AppDeployment ad on ad.deploymentId = ai.internalId where ad.state = 'APPLICATION_DEPLOYMENT_VERIFIED' and ai.application.name = ?1")
+    int countRunningByName(String name);
 
-	@Query("select count(ai.id) FROM AppInstance ai JOIN AppDeployment ad on ad.deploymentId = ai.internalId where ai.application.name = ?1")
-	int countByName(String name);
+    @Modifying
+    @Query("update AppInstance ai set ai.application = :application, ai.previousApplicationId = :previousApplicationId where ai.id = :id")
+    void updateApplication(@Param(value = "id") Long id, @Param(value = "previousApplicationId") Long previousApplicationId, @Param(value = "application") Application application);
 
-	@Query("select ai FROM AppInstance ai where ai.createdAt >= :sinceTime AND ai.createdAt <= :endTime")
-	List<AppInstance> findAllInTimePeriod(@Param("sinceTime") long start, @Param("endTime") long endTime);
+    @Query("SELECT COUNT(ai.id) FROM AppInstance ai JOIN AppDeployment ad ON ad.deploymentId = ai.internalId WHERE ai.name = :name AND ai.domain.codename = :domain AND ad.state NOT IN" +
+            "('APPLICATION_REMOVED'," +
+            "'APPLICATION_CONFIGURATION_REMOVAL_IN_PROGRESS'," +
+            "'APPLICATION_CONFIGURATION_REMOVED'," +
+            "'FAILED_APPLICATION_REMOVED')")
+    int isNameAvailableInDomain(@Param(value = "name") String name, @Param(value = "domain") String domain);
 
-	int countAllByOwner(User user);
+    @Query(value = "SELECT COUNT(ai.id) FROM app_instance ai WHERE ai.created_at >= :sinceTime AND ai.created_at < :endTime", nativeQuery = true)
+    int countAllDeployedInTimePeriod(@Param("sinceTime") Long sinceTime, @Param("endTime") Long endTime);
+
+    @Query("SELECT COUNT(ai.id) FROM AppInstance ai JOIN AppDeployment ad ON ad.deploymentId = ai.internalId WHERE ai.application.name = ?1")
+    int countByName(String name);
+
+    @Query(value = "SELECT * FROM app_instance ai WHERE ai.created_at >= :sinceTime AND ai.created_at <= :endTime", nativeQuery = true)
+    List<AppInstance> findAllInTimePeriod(@Param("sinceTime") Long sinceTime, @Param("endTime") Long endTime);
+
+    int countAllByOwner(User user);
 
 }
diff --git a/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java b/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java
index c5e01a24bfec1bcaa281a7700fc5cb1aa4264f13..588ee47f006cfc3609713b63e1b3bde59d64a3b3 100644
--- a/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java
+++ b/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java
@@ -3,10 +3,10 @@ package net.geant.nmaas.portal.service;
 import net.geant.nmaas.nmservice.deployment.bulks.BulkDeploymentQueueEntry;
 import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentReviewEvent;
 import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentStatusUpdateEvent;
-import net.geant.nmaas.portal.api.bulk.BulkAppDetails;
-import net.geant.nmaas.portal.api.bulk.BulkDeploymentView;
-import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS;
-import net.geant.nmaas.portal.api.bulk.BulkQueueDetails;
+import net.geant.nmaas.portal.api.bulk.model.BulkAppDetails;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentView;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS;
+import net.geant.nmaas.portal.api.bulk.model.BulkQueueDetails;
 import net.geant.nmaas.portal.api.bulk.CsvApplication;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
 import net.geant.nmaas.portal.persistent.entity.BulkDeployment;
diff --git a/src/main/java/net/geant/nmaas/portal/service/BulkDomainService.java b/src/main/java/net/geant/nmaas/portal/service/BulkDomainService.java
index 93193b2aec45f57d764e6285c4acf3e082d8b9f5..e8907ae74c055cc888b03c776c8cace6745989a2 100644
--- a/src/main/java/net/geant/nmaas/portal/service/BulkDomainService.java
+++ b/src/main/java/net/geant/nmaas/portal/service/BulkDomainService.java
@@ -1,7 +1,7 @@
 package net.geant.nmaas.portal.service;
 
 import net.geant.nmaas.portal.api.bulk.CsvDomain;
-import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
 
 import java.util.List;
diff --git a/src/main/java/net/geant/nmaas/portal/service/ConfigurationManager.java b/src/main/java/net/geant/nmaas/portal/service/ConfigurationManager.java
index dc6c779c14773d91f9d9440e4183e28c68d91d2c..8355f3786669131b5e1b7a89a7368a0d625fd8ca 100644
--- a/src/main/java/net/geant/nmaas/portal/service/ConfigurationManager.java
+++ b/src/main/java/net/geant/nmaas/portal/service/ConfigurationManager.java
@@ -1,6 +1,6 @@
 package net.geant.nmaas.portal.service;
 
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 
 public interface ConfigurationManager {
 
diff --git a/src/main/java/net/geant/nmaas/portal/service/DashboardService.java b/src/main/java/net/geant/nmaas/portal/service/DashboardService.java
index 2c172aacac41010fb4b3e072ec1eb70b6afde746..16cc232b9d1956fa0c6c32e3401b005b9a840fd2 100644
--- a/src/main/java/net/geant/nmaas/portal/service/DashboardService.java
+++ b/src/main/java/net/geant/nmaas/portal/service/DashboardService.java
@@ -7,7 +7,8 @@ import java.time.OffsetDateTime;
 
 public interface DashboardService {
 
-    public DashboardView getSystemDashboard(OffsetDateTime startDate, OffsetDateTime endDate);
+    DashboardView getSystemDashboard(OffsetDateTime startDate, OffsetDateTime endDate);
+
+    DomainDashboardView getDomainDashboard(Long domainId);
 
-    public DomainDashboardView getSystemDomainDashboard(Long domainId);
 }
diff --git a/src/main/java/net/geant/nmaas/portal/service/WebhookEventService.java b/src/main/java/net/geant/nmaas/portal/service/WebhookEventService.java
index 7d698b738b5f9b55340ceb6d5644366b918edda5..2a0be60f59facbd0d9040c6b0ca87779ab648c2f 100644
--- a/src/main/java/net/geant/nmaas/portal/service/WebhookEventService.java
+++ b/src/main/java/net/geant/nmaas/portal/service/WebhookEventService.java
@@ -1,7 +1,7 @@
 package net.geant.nmaas.portal.service;
 
 import net.geant.nmaas.portal.api.domain.WebhookEventDto;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.api.security.EncryptionService;
 import net.geant.nmaas.portal.persistent.entity.WebhookEvent;
 import net.geant.nmaas.portal.persistent.entity.WebhookEventType;
@@ -23,7 +23,7 @@ public class WebhookEventService {
     private static final String WEBHOOK_EVENT_NOT_FOUND = "WebhookEvent not found.";
 
     @Autowired
-    public WebhookEventService(WebhookEventRepository webhookRepository, EncryptionService encryptionService, ModelMapper modelMapper){
+    public WebhookEventService(WebhookEventRepository webhookRepository, EncryptionService encryptionService, ModelMapper modelMapper) {
         this.webhookRepository = webhookRepository;
         this.encryptionService = encryptionService;
         this.modelMapper = modelMapper;
@@ -35,10 +35,14 @@ public class WebhookEventService {
         return webhookRepository.save(webhookEvent);
     }
 
-    public void update(WebhookEventDto webhookEventDto) throws GeneralSecurityException {
-        WebhookEvent webhookEvent = webhookRepository.findById(webhookEventDto.getId()).orElseThrow(() -> new MissingElementException(WEBHOOK_EVENT_NOT_FOUND));
+    public WebhookEventDto update(WebhookEventDto webhookEventDto) throws GeneralSecurityException {
+        WebhookEvent webhookEvent = webhookRepository.findById(webhookEventDto.getId())
+                .orElseThrow(() -> new MissingElementException(WEBHOOK_EVENT_NOT_FOUND));
         setWebhookEvent(webhookEvent, webhookEventDto);
-        webhookRepository.save(webhookEvent);
+        webhookEvent = webhookRepository.save(webhookEvent);
+        WebhookEventDto dto = modelMapper.map(webhookEvent, WebhookEventDto.class);
+        dto.setTokenValue(webhookEvent.getTokenValue() == null ? null : encryptionService.decrypt(webhookEvent.getTokenValue()));
+        return dto;
     }
 
     private void setWebhookEvent(WebhookEvent webhookEvent, WebhookEventDto webhookEventDto) throws GeneralSecurityException {
@@ -49,20 +53,22 @@ public class WebhookEventService {
         webhookEvent.setAuthorizationHeader(webhookEventDto.getAuthorizationHeader());
     }
 
-    public void remove(Long id){
-        WebhookEvent webhookEvent = webhookRepository.findById(id).orElseThrow(() -> new MissingElementException(WEBHOOK_EVENT_NOT_FOUND));
+    public void remove(Long id) {
+        WebhookEvent webhookEvent = webhookRepository.findById(id)
+                .orElseThrow(() -> new MissingElementException(WEBHOOK_EVENT_NOT_FOUND));
         webhookRepository.delete(webhookEvent);
     }
 
     public List<WebhookEventDto> getAllWebhooks() {
-        return webhookRepository.findAll().stream().map(x ->
-                {
+        return webhookRepository.findAll().stream()
+                .map(x -> {
                     try {
-                        x.setTokenValue(x.getTokenValue() == null ? null : encryptionService.decrypt(x.getTokenValue()));
+                        WebhookEventDto dto = modelMapper.map(x, WebhookEventDto.class);
+                        dto.setTokenValue(x.getTokenValue() == null ? null : encryptionService.decrypt(x.getTokenValue()));
+                        return dto;
                     } catch (GeneralSecurityException e) {
                         throw new RuntimeException(e);
                     }
-                    return modelMapper.map(x, WebhookEventDto.class);
                 }).toList();
     }
 
@@ -73,7 +79,8 @@ public class WebhookEventService {
     public WebhookEventDto getById(Long id) throws GeneralSecurityException {
         WebhookEvent event = webhookRepository.findById(id)
                 .orElseThrow(() -> new MissingElementException(String.format("WebhookEventType with id: %d cannot be found", id)));
-        event.setTokenValue(event.getTokenValue() == null ? null : encryptionService.decrypt(event.getTokenValue()));
-        return modelMapper.map(event, WebhookEventDto.class);
+        WebhookEventDto dto = modelMapper.map(event, WebhookEventDto.class);
+        dto.setTokenValue(event.getTokenValue() == null ? null : encryptionService.decrypt(event.getTokenValue()));
+        return dto;
     }
 }
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java
index 5e77ddf1b9091ef1bf47c1e68634d9a8731267d5..966845551e30da0be562bcd652cd8e13bfb0f7a0 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java
@@ -5,8 +5,8 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.portal.api.domain.ApplicationBaseS;
 import net.geant.nmaas.portal.api.domain.ApplicationBaseViewS;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.events.ApplicationActivatedEvent;
 import net.geant.nmaas.portal.persistent.entity.AppDescription;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationServiceImpl.java
index 63e7f6a666f5a21786a109824337d4f2bcfb27cb..db287957b3fa7e8164cb6b6c31b5e7e77dd008bd 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationServiceImpl.java
@@ -3,11 +3,10 @@ package net.geant.nmaas.portal.service.impl;
 import freemarker.template.Configuration;
 import freemarker.template.Template;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
 import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.nmservice.configuration.entities.ConfigFileTemplate;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.events.ApplicationListUpdatedEvent;
 import net.geant.nmaas.portal.events.ApplicationListUpdatedEvent.ApplicationAction;
 import net.geant.nmaas.portal.persistent.entity.Application;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java
index f7bd7b01231603ccc5750c1c855ad5379f98d57e..df81d1d38d459b83f775c712199f8b2ecdd1a1f0 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java
@@ -1,7 +1,7 @@
 package net.geant.nmaas.portal.service.impl;
 
 import lombok.RequiredArgsConstructor;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.exceptions.ObjectNotFoundException;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
 import net.geant.nmaas.portal.persistent.entity.ApplicationSubscription;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java
index fd28df8e20ce7f89e4866e94897c87a5a50d392c..32f03e8d3d6cc1249f5b6b586c95b991e8d10126 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java
@@ -18,15 +18,15 @@ import net.geant.nmaas.orchestration.entities.AppDeployment;
 import net.geant.nmaas.orchestration.entities.AppDeploymentState;
 import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentReviewEvent;
 import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentStatusUpdateEvent;
-import net.geant.nmaas.portal.api.bulk.BulkAppDetails;
-import net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView;
-import net.geant.nmaas.portal.api.bulk.BulkDeploymentView;
-import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS;
-import net.geant.nmaas.portal.api.bulk.BulkQueueDetails;
+import net.geant.nmaas.portal.api.bulk.model.BulkAppDetails;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentView;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS;
+import net.geant.nmaas.portal.api.bulk.model.BulkQueueDetails;
 import net.geant.nmaas.portal.api.bulk.BulkType;
 import net.geant.nmaas.portal.api.bulk.CsvApplication;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.exceptions.ObjectNotFoundException;
 import net.geant.nmaas.portal.persistent.entity.AppInstance;
 import net.geant.nmaas.portal.persistent.entity.Application;
@@ -65,13 +65,13 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_ID;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_INSTANCE_ID;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_INSTANCE_NAME;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_NAME;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_CODENAME;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_NAME;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_ERROR_MESSAGE;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_ID;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_INSTANCE_ID;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_INSTANCE_NAME;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_NAME;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_CODENAME;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_NAME;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_ERROR_MESSAGE;
 
 @Service
 @RequiredArgsConstructor
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java
index d0717b5d7748ed73176a531b84274fb579adaa83..b097dbd1c113107f8f5b072b7c8c1a718f7b0e8c 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java
@@ -7,7 +7,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import net.geant.nmaas.portal.api.bulk.CsvApplication;
 import net.geant.nmaas.portal.api.bulk.CsvDomain;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.service.BulkCsvProcessor;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java
index a2b66cdbabbc4e9c52ef203fa341feb205f3033e..98a472bf0d2239643eff38ca5d5f12cf3ad95bfa 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java
@@ -6,7 +6,7 @@ import net.geant.nmaas.dcn.deployment.DcnDeploymentType;
 import net.geant.nmaas.dcn.deployment.entities.DcnDeploymentState;
 import net.geant.nmaas.dcn.deployment.entities.DcnInfo;
 import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManager;
-import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS;
 import net.geant.nmaas.portal.api.bulk.CsvDomain;
 import net.geant.nmaas.portal.api.domain.DomainDcnDetailsView;
 import net.geant.nmaas.portal.api.domain.DomainGroupView;
@@ -14,7 +14,7 @@ import net.geant.nmaas.portal.api.domain.DomainRequest;
 import net.geant.nmaas.portal.api.domain.DomainTechDetailsView;
 import net.geant.nmaas.portal.api.domain.KeyValueView;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.BulkDeployment;
 import net.geant.nmaas.portal.persistent.entity.BulkDeploymentEntry;
 import net.geant.nmaas.portal.persistent.entity.Domain;
@@ -41,12 +41,12 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_CODENAME;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_ID;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_NAME;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_EMAIL;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_ID;
-import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_NAME;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_CODENAME;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_ID;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_NAME;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_EMAIL;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_ID;
+import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_NAME;
 import static net.geant.nmaas.portal.api.bulk.BulkType.DOMAIN;
 import static net.geant.nmaas.portal.api.bulk.BulkType.USER;
 import static net.geant.nmaas.portal.persistent.entity.BulkDeploymentState.COMPLETED;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerImpl.java
index 2c7c5427605a31c98b52b510ae0989c577862936..c5a2b7d997960b45168496c8f25dae7eb66fe02f 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerImpl.java
@@ -2,7 +2,7 @@ package net.geant.nmaas.portal.service.impl;
 
 import lombok.RequiredArgsConstructor;
 import net.geant.nmaas.nmservice.deployment.bulks.BulkDeploymentJob;
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.exceptions.ConfigurationNotFoundException;
 import net.geant.nmaas.portal.exceptions.OnlyOneConfigurationSupportedException;
 import net.geant.nmaas.portal.persistent.entity.Configuration;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ContentServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ContentServiceImpl.java
index 3f6aca341954a57cc0fdbf29fb1811eca0a6d35b..bb428308f16c808a5ca2603232edace47af0267b 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/ContentServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/ContentServiceImpl.java
@@ -1,6 +1,6 @@
 package net.geant.nmaas.portal.service.impl;
 
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.exceptions.ObjectAlreadyExistsException;
 import net.geant.nmaas.portal.persistent.entity.Content;
 import net.geant.nmaas.portal.persistent.repositories.ContentRepository;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/CustomAccessTokenServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/CustomAccessTokenServiceImpl.java
index ca7956860b059ca6ebd219563ad42581b23237c7..57b4b20b8b995266d02d0688b57060fa9d0be98d 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/CustomAccessTokenServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/CustomAccessTokenServiceImpl.java
@@ -66,7 +66,7 @@ public class CustomAccessTokenServiceImpl implements CustomAccessTokenService {
         return userApiTokenRepository.findAllByUserId(userId).stream()
                 .filter(userApiToken -> !userApiToken.isDeleted())
                 .map(this::mapToView)
-                .collect(Collectors.toList());
+                .toList();
     }
 
     private UserApiToken createNewToken(User user, String name) {
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/DashboardServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/DashboardServiceImpl.java
index 28fbdaf017c9710e0be7153591416501c59ce9aa..a7ff9e208d249c6fae0d5004b0f490acae8a18da 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/DashboardServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/DashboardServiceImpl.java
@@ -17,124 +17,119 @@ import net.geant.nmaas.portal.service.ApplicationInstanceService;
 import net.geant.nmaas.portal.service.DashboardService;
 import net.geant.nmaas.portal.service.DomainService;
 import net.geant.nmaas.portal.service.UserLoginRegisterService;
-import net.geant.nmaas.portal.service.UserService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
-import java.time.Duration;
 import java.time.OffsetDateTime;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.stream.Collectors;
-
 
 @Service
 @RequiredArgsConstructor
 @Slf4j
 public class DashboardServiceImpl implements DashboardService {
 
-    private final UserService userService;
     private final UserRepository userRepository;
     private final DomainService domainService;
     private final DomainRepository domainRepository;
     private final ApplicationInstanceService applicationInstanceService;
-    private final AppInstanceRepository appInstanceRepo;
+    private final AppInstanceRepository appInstanceRepository;
     private final ApplicationBaseRepository applicationBaseRepository;
     private final UserLoginRegisterService userLoginRegisterService;
 
-
     @Override
     public DashboardView getSystemDashboard(OffsetDateTime startDate, OffsetDateTime endDate) {
+        log.info("Processing dashboard data request for period {} - {}", startDate, endDate);
 
-        log.warn("Start date {} / end date {}", startDate, endDate);
-
-        long startTimeStamp = startDate.toEpochSecond();
-        long endTimeStamp = endDate.toEpochSecond();
-
+        long startTimeStamp = startDate.toEpochSecond() * 1000;
+        long endTimeStamp = endDate.toEpochSecond() * 1000;
+        log.info("Period in timestamps: {} - {}", startTimeStamp, endTimeStamp);
 
         List<String> baseNames = applicationBaseRepository.findAllNames();
         Map<String, Integer> applicationDeploymentCountPerName = new HashMap<>();
 
-        List<DashboardDeploymentsView> deploymentsViews = appInstanceRepo.findAllInTimePeriod(startTimeStamp, endTimeStamp)
-                .stream().map(entry -> DashboardDeploymentsView.builder().user(entry.getOwner().getUsername())
+        List<DashboardDeploymentsView> deploymentsViews = appInstanceRepository.findAllInTimePeriod(startTimeStamp, endTimeStamp).stream()
+                .map(entry -> DashboardDeploymentsView.builder().user(entry.getOwner().getUsername())
                         .domainName(entry.getDomain().getName())
                         .applicationName(entry.getApplication().getName())
-                        .applicationVersion(entry.getApplication().getVersion()).build()).toList();
+                        .applicationVersion(entry.getApplication().getVersion())
+                        .build())
+                .toList();
 
         baseNames.forEach(name -> {
-            applicationDeploymentCountPerName.put(name, appInstanceRepo.countByName(name));
+            applicationDeploymentCountPerName.put(name, appInstanceRepository.countByName(name));
         });
 
-        //filter not deployed application
+        // filter not deployed application
         applicationDeploymentCountPerName.entrySet().removeIf(app -> app.getValue() == 0);
-        log.info("Start stamp {} / end stamp {}", startTimeStamp, endTimeStamp);
 
-        return DashboardView.builder()
+        DashboardView systemView = DashboardView.builder()
                 .domainsCount(domainRepository.count())
                 .userCount(userRepository.count())
-                .instanceCount(appInstanceRepo.count())
-                .instanceCountInPeriod(appInstanceRepo.countAllDeployedSinceTime(startTimeStamp, endTimeStamp))
+                .instanceCount(appInstanceRepository.count())
+                .instanceCountInPeriod(appInstanceRepository.countAllDeployedInTimePeriod(startTimeStamp, endTimeStamp))
                 .instanceCountInPeriodDetails(deploymentsViews)
                 .popularApps(applicationDeploymentCountPerName).build();
+        log.debug("Response: {}", systemView.toString());
+        return systemView;
     }
 
     //TODO: Change username to pre
     @Override
-    public DomainDashboardView getSystemDomainDashboard(Long domainId) {
+    public DomainDashboardView getDomainDashboard(Long domainId) {
+        log.info("Processing dashboard data request for domain {}", domainId);
         Optional<Domain> domain = domainService.findDomain(domainId);
         Map<String, OffsetDateTime> userLogins = new HashMap<>();
         Map<String, Integer> appsDeployed = new HashMap<>();
         List<DomainDashboardView.DomainAppInstanceView> upgradePossible = new ArrayList<>();
 
-        if(domain.isPresent()) {
+        if (domain.isPresent()) {
             Domain dom = domain.get();
 
             List<User> domainUsers = domainService.getMembers(domainId);
-            List<AppInstance> apps = appInstanceRepo.findAllByDomain(dom);
+            List<AppInstance> apps = appInstanceRepository.findAllByDomain(dom);
 
             domainUsers.forEach(user -> {
                 Optional<UserLoginRegister> register = userLoginRegisterService.getLastLogin(user);
-                if(register.isPresent()) {
+                if (register.isPresent()) {
                     userLogins.put(this.getUserPreferredUsername(user), register.get().getDate());
-                    appsDeployed.put(this.getUserPreferredUsername(user), appInstanceRepo.countAllByOwner(user));
+                    appsDeployed.put(this.getUserPreferredUsername(user), appInstanceRepository.countAllByOwner(user));
                 }
             });
 
             apps.forEach(app -> {
-                upgradePossible.add( DomainDashboardView.DomainAppInstanceView.builder()
-                                .appId(app.getId())
-                                .appName(app.getApplication().getName())
-                                .instanceName(app.getName())
-                                .appVersion(app.getApplication().getVersion())
-                                .upgradePossible(applicationInstanceService.checkUpgradePossible(app.getId())).build());
+                upgradePossible.add(DomainDashboardView.DomainAppInstanceView.builder()
+                        .appId(app.getId())
+                        .appName(app.getApplication().getName())
+                        .instanceName(app.getName())
+                        .appVersion(app.getApplication().getVersion())
+                        .upgradePossible(applicationInstanceService.checkUpgradePossible(app.getId())).build());
             });
 
-
-
-            return DomainDashboardView.builder()
+            DomainDashboardView view = DomainDashboardView.builder()
                     .userLogins(userLogins)
                     .applicationDeployed(appsDeployed)
                     .applicationUpgradeStatus(upgradePossible)
                     .build();
+            log.debug("Response: {}", view.toString());
+            return view;
         } else {
-            log.error("Domain {} not present. Returning empty...", domainId );
+            log.error("Domain {} not present. Returning empty...", domainId);
             return DomainDashboardView.builder().build();
         }
     }
 
-
     private String getUserPreferredUsername(User user) {
         String preferredUsername;
-
-        if (user == null || StringUtils.isEmpty(user.getUsername())) {
+        if (StringUtils.isEmpty(user.getUsername())) {
             throw new IllegalArgumentException("User or username is not set");
         }
-        if(user.getFirstname() != null && !user.getFirstname().isEmpty()) {
+        if (user.getFirstname() != null && !user.getFirstname().isEmpty()) {
             preferredUsername = user.getFirstname() + " " + user.getLastname();
-        }else{
+        } else {
             preferredUsername = user.getUsername();
         }
         return preferredUsername;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceImpl.java
index 2823c728ce858495ce6f708d8968d072848e1503..fec8af2e2b35cd89c5b0a9daeab8a3b643e446bd 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceImpl.java
@@ -2,12 +2,11 @@ package net.geant.nmaas.portal.service.impl;
 
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import net.geant.nmaas.orchestration.jobs.DomainCreationJob;
 import net.geant.nmaas.orchestration.jobs.DomainGroupJob;
 import net.geant.nmaas.portal.api.domain.ApplicationStatePerDomainView;
 import net.geant.nmaas.portal.api.domain.DomainGroupView;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
 import net.geant.nmaas.portal.persistent.entity.ApplicationStatePerDomain;
 import net.geant.nmaas.portal.persistent.entity.Domain;
@@ -29,7 +28,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 @Service
 @RequiredArgsConstructor
@@ -66,15 +64,15 @@ public class DomainGroupServiceImpl implements DomainGroupService {
         domainGroupEntity = domainGroupRepository.save(domainGroupEntity);
 
         //call existing webhooks
-        DomainGroupView domainGroupView = modelMapper.map(domainGroupEntity, DomainGroupView.class);
-        webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroupView.getId()+ "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "create","domainGroup",domainGroupView)));
+        //DomainGroupView domainGroupView = modelMapper.map(domainGroupEntity, DomainGroupView.class);
+        //webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroupView.getId() + "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "create", "domainGroup", domainGroupView)));
         return modelMapper.map(domainGroupEntity, DomainGroupView.class);
     }
 
     @Override
     public DomainGroupView addDomainsToGroup(List<Domain> domains, String groupCodeName) {
         DomainGroup domainGroup = domainGroupRepository.findByCodename(groupCodeName).orElseThrow();
-        domains.forEach( domain -> {
+        domains.forEach(domain -> {
             log.debug("Adding domain {}/{} to group {}", domain.getName(), domain.getCodename(), groupCodeName);
             if (!domainGroup.getDomains().contains(domain)) {
                 domainGroup.addDomain(domain);
@@ -105,7 +103,7 @@ public class DomainGroupServiceImpl implements DomainGroupService {
         }
         domainGroupRepository.deleteById(domainGroupId);
         //call existing webhooks
-        webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroup.getId()+ "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "delete","domainGroup",domainGroupView)));
+        webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroup.getId() + "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "delete", "domainGroup", domainGroupView)));
     }
 
     @Override
@@ -122,7 +120,7 @@ public class DomainGroupServiceImpl implements DomainGroupService {
     public List<DomainGroupView> getAllDomainGroups() {
         return domainGroupRepository.findAll().stream()
                 .map(g -> modelMapper.map(g, DomainGroupView.class))
-                .collect(Collectors.toList());
+                .toList();
     }
 
     @Override
@@ -131,11 +129,14 @@ public class DomainGroupServiceImpl implements DomainGroupService {
             throw new ProcessingException(String.format("Wrong domain group identifier (%s)", domainGroupId));
         }
         DomainGroup domainGroup = this.domainGroupRepository.findById(domainGroupId).orElseThrow();
-//        updateRolesInDomainsByUsers(view);
+        // updateRolesInDomainsByUsers(view);
         domainGroup.setCodename(view.getCodename());
         domainGroup.setName(view.getName());
-        domainGroup.setManagers(view.getManagers().stream().map(user -> modelMapper.map(user, User.class)).collect(Collectors.toList()));
-        for (ApplicationStatePerDomain appState: domainGroup.getApplicationStatePerDomain()) {
+        domainGroup.setManagers(view.getManagers().stream()
+                .map(user -> modelMapper.map(user, User.class))
+                .toList()
+        );
+        for (ApplicationStatePerDomain appState : domainGroup.getApplicationStatePerDomain()) {
             for (ApplicationStatePerDomainView appStateView : view.getApplicationStatePerDomain()) {
                 if (appState.getApplicationBase().getId().equals(appStateView.getApplicationBaseId())) {
                     appState.applyChangedState(appStateView);
@@ -147,7 +148,7 @@ public class DomainGroupServiceImpl implements DomainGroupService {
 
         //call existing webhooks
         DomainGroupView domainGroupView = modelMapper.map(domainGroup, DomainGroupView.class);
-        webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroupView.getId()+ "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "update","domainGroup",domainGroupView)));
+        webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroupView.getId() + "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "update", "domainGroup", domainGroupView)));
         return domainGroupView;
     }
 
@@ -158,15 +159,16 @@ public class DomainGroupServiceImpl implements DomainGroupService {
     }
 
     public void deleteAppBaseFromAllAppState(ApplicationBase base) {
-        domainGroupRepository.findAll().forEach(d -> {
-          d.getApplicationStatePerDomain().removeIf(state -> state.getApplicationBase().equals(base));
-        });
+        domainGroupRepository.findAll().forEach(d ->
+                d.getApplicationStatePerDomain().removeIf(state -> state.getApplicationBase().equals(base))
+        );
     }
 
     @Override
     public void deleteUserFromAllDomainsGroups(User user) {
-        domainGroupRepository.findAll().forEach(d -> {
-            d.getManagers().remove(user);
-        });
+        domainGroupRepository.findAll().forEach(d ->
+                d.getManagers().remove(user)
+        );
     }
+
 }
\ No newline at end of file
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java
index 5af2eeecbe42cc13ec5cc9c2f262f5fa23aa1f98..b5709bdd619bf3e8a37e36533359525a66d95047 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java
@@ -14,8 +14,8 @@ import net.geant.nmaas.portal.api.domain.DomainRequest;
 import net.geant.nmaas.portal.api.domain.KeyValueView;
 import net.geant.nmaas.portal.api.domain.UserView;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.events.DomainCreatedEvent;
 import net.geant.nmaas.portal.exceptions.ObjectNotFoundException;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
@@ -129,7 +129,7 @@ public class DomainServiceImpl implements DomainService {
         return domainRepository.findAll()
                 .stream()
                 .filter(domain -> !domain.isDeleted())
-                .collect(Collectors.toList());
+                .toList();
     }
 
     @Override
@@ -432,7 +432,7 @@ public class DomainServiceImpl implements DomainService {
         return this.userRoleRepository.findDomainMembers(domain).stream()
                 .filter(user -> user.getRoles().stream().anyMatch(role -> role.getRole().name().equalsIgnoreCase(Role.ROLE_DOMAIN_ADMIN.name()) && role.getDomain().getCodename().equals(domain)))
                 .map(user -> modelMapper.map(user, UserView.class))
-                .collect(Collectors.toList());
+                .toList();
     }
 
     @Override
@@ -453,7 +453,7 @@ public class DomainServiceImpl implements DomainService {
                         app.setPvStorageSizeLimit(app.getPvStorageSizeLimit());
                     }
                     return app;
-                }).collect(Collectors.toList())
+                }).toList()
         );
 
         return domain;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceImpl.java
index d621b46b36d88e3525751a410973a507a8985469..f60288bb79ca37270922580b8788f2ff4f95f45c 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceImpl.java
@@ -19,7 +19,6 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 @Service
 @RequiredArgsConstructor
@@ -109,7 +108,7 @@ public class InternationalizationServiceImpl implements InternationalizationServ
         return repository.findAll().stream()
                 .map(InternationalizationSimple::getAsInternationalizationView)
                 .map(lang -> modelMapper.map(lang, InternationalizationBriefView.class))
-                .collect(Collectors.toList());
+                .toList();
     }
 
     @Override
@@ -136,7 +135,7 @@ public class InternationalizationServiceImpl implements InternationalizationServ
         return repository.findAll().stream()
                 .filter(InternationalizationSimple::isEnabled)
                 .map(InternationalizationSimple::getLanguage)
-                .collect(Collectors.toList());
+                .toList();
     }
 
     @Override
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/K8sShellServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/K8sShellServiceImpl.java
index db2fe3a606a21cb33e3be5bb42f2979de14111a1..fc436484ac09762059a56d446c4a8b993fdd8543 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/K8sShellServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/K8sShellServiceImpl.java
@@ -5,7 +5,7 @@ import net.geant.nmaas.kubernetes.shell.PodSessionsStorage;
 import net.geant.nmaas.kubernetes.KubernetesConnectorHelper;
 import net.geant.nmaas.portal.api.domain.K8sPodInfo;
 import net.geant.nmaas.portal.api.domain.K8sShellCommandRequest;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.service.K8sShellService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/LocalFileStorageService.java b/src/main/java/net/geant/nmaas/portal/service/impl/LocalFileStorageService.java
index 5bf5164678369f6559510dfbcabb07da82ece4bd..1b4a448c874c0cc1199e060fb8d0f782ce3cae67 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/LocalFileStorageService.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/LocalFileStorageService.java
@@ -1,8 +1,8 @@
 package net.geant.nmaas.portal.service.impl;
 
 import lombok.extern.slf4j.Slf4j;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.StorageException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.StorageException;
 import net.geant.nmaas.portal.persistent.entity.FileInfo;
 import net.geant.nmaas.portal.persistent.repositories.FileInfoRepository;
 import net.geant.nmaas.portal.service.FileStorageService;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImpl.java
index 4e3ad3a2d9fbfbef011d00afb86eff08870e1496..3f98f4e873e0452e6de22e9dc86a144eb431cd9b 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImpl.java
@@ -2,9 +2,9 @@ package net.geant.nmaas.portal.service.impl;
 
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import net.geant.nmaas.portal.api.exception.ExternalUserMatchException;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.SignupException;
+import net.geant.nmaas.portal.api.exceptions.ExternalUserMatchException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.SignupException;
 import net.geant.nmaas.portal.exceptions.ObjectAlreadyExistsException;
 import net.geant.nmaas.portal.persistent.entity.Domain;
 import net.geant.nmaas.portal.persistent.entity.Role;
diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java
index 96d1e26e2f8021f420288e9175cdef1c499e1aea..1c399f22645b4c6c5bab06c52b4133c342b91145 100644
--- a/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java
+++ b/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java
@@ -11,9 +11,9 @@ import net.geant.nmaas.notifications.templates.MailType;
 import net.geant.nmaas.portal.api.auth.Registration;
 import net.geant.nmaas.portal.api.bulk.CsvDomain;
 import net.geant.nmaas.portal.api.domain.UserView;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
-import net.geant.nmaas.portal.api.exception.SignupException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.SignupException;
 import net.geant.nmaas.portal.api.security.JWTTokenService;
 import net.geant.nmaas.portal.persistent.entity.Domain;
 import net.geant.nmaas.portal.persistent.entity.Role;
@@ -32,14 +32,10 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.security.oauth2.core.oidc.user.OidcUser;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.security.SecureRandom;
-import java.util.Base64;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
diff --git a/src/main/resources/db/migration/common/V1.8.0_20250527_1530__AddConnectionToCluster.sql b/src/main/resources/db/migration/common/V1.8.0_20250527_1530__AddConnectionToCluster.sql
new file mode 100644
index 0000000000000000000000000000000000000000..a43ff1a50ab7bf88301362cd08387965221a17ab
--- /dev/null
+++ b/src/main/resources/db/migration/common/V1.8.0_20250527_1530__AddConnectionToCluster.sql
@@ -0,0 +1,11 @@
+ALTER TABLE kubernetes_nm_service_info
+ADD COLUMN k_cluster_id integer;
+
+ALTER TABLE kubernetes_nm_service_info
+ADD CONSTRAINT fk_kubernetes_nm_service_info_kcluster
+FOREIGN KEY (k_cluster_id)
+REFERENCES k_cluster (id)
+ON DELETE SET NULL;
+
+ALTER TABLE app_deployment
+ADD COLUMN remote_cluster_id integer;
\ No newline at end of file
diff --git a/src/test/java/net/geant/nmaas/nmservice/bulk/BulkDeploymentJobServiceTest.java b/src/test/java/net/geant/nmaas/nmservice/bulk/BulkDeploymentJobServiceTest.java
index d3534c007d62b1181c788de314623066c9b5aad5..320d0c717818391a9c5c9682881bb6ad1d284704 100644
--- a/src/test/java/net/geant/nmaas/nmservice/bulk/BulkDeploymentJobServiceTest.java
+++ b/src/test/java/net/geant/nmaas/nmservice/bulk/BulkDeploymentJobServiceTest.java
@@ -9,7 +9,7 @@ import net.geant.nmaas.orchestration.AppLifecycleManager;
 import net.geant.nmaas.orchestration.AppLifecycleState;
 import net.geant.nmaas.orchestration.Identifier;
 import net.geant.nmaas.orchestration.entities.AppDeploymentState;
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.persistent.repositories.BulkDeploymentRepository;
 import net.geant.nmaas.portal.service.BulkApplicationService;
 import net.geant.nmaas.portal.service.ConfigurationManager;
diff --git a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java
index e731123936fbfa7898f805c50e70e49dbe1d8ce1..71dfd8bbe46d70db352e86aa141dea8486767566 100644
--- a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java
+++ b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java
@@ -2,6 +2,7 @@ package net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes;
 
 import com.google.common.collect.Sets;
 import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManager;
+import net.geant.nmaas.externalservices.kubernetes.RemoteClusterManager;
 import net.geant.nmaas.externalservices.kubernetes.entities.IngressControllerConfigOption;
 import net.geant.nmaas.gitlab.GitLabManager;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.components.cluster.DefaultKClusterValidator;
@@ -69,6 +70,7 @@ public class KubernetesManagerTest {
     private final KubernetesClusterIngressManager ingressManager = mock(KubernetesClusterIngressManager.class);
     private final GitLabManager gitLabManager = mock(GitLabManager.class);
     private final JanitorService janitorService = mock(JanitorService.class);
+    private final RemoteClusterManager remoteClusterManager = mock(RemoteClusterManager.class);
 
     private static final Identifier DEPLOYMENT_ID = Identifier.newInstance("deploymentId");
 
@@ -82,7 +84,8 @@ public class KubernetesManagerTest {
             ingressResourceManager,
             ingressManager,
             gitLabManager,
-            janitorService
+            janitorService,
+            remoteClusterManager
     );
 
     @BeforeEach
diff --git a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandPreparationTest.java b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandPreparationTest.java
index 74b90525221a703be60760041acfa9ccb517c425..9bd0e19eb80a4419e723e216700fddcc7187bc41 100644
--- a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandPreparationTest.java
+++ b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandPreparationTest.java
@@ -57,7 +57,7 @@ public class HelmCommandPreparationTest {
                         RELEASE_NAME,
                         null,
                         CHART_NAME_WITH_REPO,
-                        null, false).asString(),
+                        null, false, null).asString(),
                 equalTo(CORRECT_HELM_INSTALL_COMMAND_USING_CHART_FROM_REPO));
         assertThat(
                 HelmInstallCommand.commandWithRepo(
@@ -66,7 +66,7 @@ public class HelmCommandPreparationTest {
                         RELEASE_NAME,
                         null,
                         CHART_NAME_WITH_REPO,
-                        CHART_VERSION, false).asString(),
+                        CHART_VERSION, false, null).asString(),
                 equalTo(CORRECT_HELM_INSTALL_COMMAND_USING_CHART_FROM_REPO_WITH_VERSION));
     }
 
@@ -79,7 +79,7 @@ public class HelmCommandPreparationTest {
                         RELEASE_NAME,
                         null,
                         CHART_NAME_WITH_REPO,
-                        null, false).asString(),
+                        null, false, null).asString(),
                 equalTo(CORRECT_HELM_INSTALL_COMMAND_FOR_v3_USING_CHART_FROM_REPO));
         assertThat(
                 HelmInstallCommand.commandWithRepo(
@@ -88,7 +88,7 @@ public class HelmCommandPreparationTest {
                         RELEASE_NAME,
                         null,
                         CHART_NAME_WITH_REPO,
-                        CHART_VERSION, false).asString(),
+                        CHART_VERSION, false, null).asString(),
                 equalTo(CORRECT_HELM_INSTALL_COMMAND_FOR_V3_USING_CHART_FROM_REPO_WITH_VERSION));
     }
 
@@ -101,7 +101,7 @@ public class HelmCommandPreparationTest {
                         RELEASE_NAME,
                         null,
                         CHART_NAME_WITH_REPO,
-                        null, true).asString(),
+                        null, true, null).asString(),
                 equalTo(CORRECT_HELM_INSTALL_COMMAND_USING_CHART_FROM_REPO + TLS));
         assertThat(
                 HelmInstallCommand.commandWithRepo(
@@ -110,7 +110,7 @@ public class HelmCommandPreparationTest {
                         RELEASE_NAME,
                         null,
                         CHART_NAME_WITH_REPO,
-                        CHART_VERSION, true).asString(),
+                        CHART_VERSION, true, null).asString(),
                 equalTo(CORRECT_HELM_INSTALL_COMMAND_USING_CHART_FROM_REPO_WITH_VERSION + TLS));
     }
 
@@ -127,7 +127,7 @@ public class HelmCommandPreparationTest {
                         arguments,
                         CHART_NAME_WITH_REPO,
                         CHART_VERSION,
-                        false).asString(),
+                        false, null).asString(),
                 allOf(containsString(CORRECT_HELM_INSTALL_COMMAND_FIRST_PART),
                         containsString("testPersistenceName"),
                         containsString("testStorageClass"))
@@ -147,7 +147,7 @@ public class HelmCommandPreparationTest {
                         arguments,
                         CHART_NAME_WITH_REPO,
                         CHART_VERSION,
-                        true).asString(),
+                        true, null).asString(),
                 allOf(containsString(CORRECT_HELM_INSTALL_COMMAND_FIRST_PART),
                         containsString("testPersistenceName"),
                         containsString("testStorageClass"),
diff --git a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManagerTest.java b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManagerTest.java
index 0ebf9adc9ddcfcaceebc693ebe1c5dfec3b704c1..f743955611888d0dc852135850bdb170cf8e77df 100644
--- a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManagerTest.java
+++ b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManagerTest.java
@@ -5,6 +5,11 @@ import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManag
 import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterNamespaceService;
 import net.geant.nmaas.externalservices.kubernetes.entities.IngressCertificateConfigOption;
 import net.geant.nmaas.externalservices.kubernetes.entities.IngressResourceConfigOption;
+import net.geant.nmaas.externalservices.kubernetes.entities.KCluster;
+import net.geant.nmaas.externalservices.kubernetes.entities.KClusterDeployment;
+import net.geant.nmaas.externalservices.kubernetes.entities.KClusterIngress;
+import net.geant.nmaas.externalservices.kubernetes.entities.KClusterState;
+import net.geant.nmaas.externalservices.kubernetes.entities.NamespaceConfigOption;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KubernetesRepositoryManager;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.KubernetesNmServiceInfo;
 import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.KubernetesTemplate;
@@ -18,6 +23,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 
+import java.time.OffsetDateTime;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -119,7 +125,8 @@ public class HelmKServiceManagerTest {
                 eq("namespace"),
                 eq("descriptiveDeploymentId"),
                 k8sTemplateArg.capture(),
-                argumentsArg.capture()
+                argumentsArg.capture(),
+                eq(null)
         );
         assertThat(argumentsArg.getValue()).isNotEmpty();
         assertThat(argumentsArg.getValue().size()).isEqualTo(11);
@@ -142,8 +149,9 @@ public class HelmKServiceManagerTest {
         verify(helmCommandExecutor, times(1)).executeHelmInstallCommand(
                 eq("namespace"),
                 eq("descriptiveDeploymentId"),
-                any(),
-                any()
+                any(KubernetesTemplate.class),
+                any(Map.class),
+                eq(null)
         );
     }
 
@@ -228,4 +236,63 @@ public class HelmKServiceManagerTest {
         );
     }
 
+    @Test
+    void shouldDeployServiceWithKubeconfigPath() {
+        when(namespaceService.namespace("domain")).thenReturn("namespace");
+        when(ingressManager.getResourceConfigOption()).thenReturn(IngressResourceConfigOption.DEPLOY_FROM_CHART);
+        when(ingressManager.getIngressPerDomain()).thenReturn(false);
+        when(ingressManager.getSupportedIngressClass()).thenReturn("testIngressClass");
+        when(ingressManager.getTlsSupported()).thenReturn(true);
+        when(ingressManager.getIssuerOrWildcardName()).thenReturn("testIssuerName");
+        when(ingressManager.getCertificateConfigOption()).thenReturn(IngressCertificateConfigOption.USE_LETSENCRYPT);
+
+
+        KClusterDeployment mockDeployment = KClusterDeployment.builder()
+                .namespaceConfigOption(NamespaceConfigOption.CREATE_NAMESPACE)
+                .defaultNamespace("default-namespace")
+                .defaultStorageClass("default-storage-class")
+                .smtpServerHostname("smtp.example.com")
+                .smtpServerPort(587)
+                .smtpServerUsername("user@example.com")
+                .smtpServerPassword("password")
+                .smtpFromDefaultDomain("example.com")
+                .forceDedicatedWorkers(true)
+                .build();
+
+        KClusterIngress mockIngress = KClusterIngress.builder().resourceConfigOption(IngressResourceConfigOption.NOT_USED).build();
+
+
+        KCluster mockCluster = KCluster.builder()
+                .id(1L)
+                .name("TestCluster")
+                .codename("test-cluster")
+                .description("Mocked Kubernetes Cluster")
+                .creationDate(OffsetDateTime.now())
+                .modificationDate(OffsetDateTime.now())
+                .clusterConfigFile("mock-cluster-config")
+                .pathConfigFile("mock/path/to/kubeconfig")
+                .state(KClusterState.UNKNOWN)
+                .currentStateSince(OffsetDateTime.now())
+                .contactEmail("test@example.com")
+                .deployment(mockDeployment)
+                .ingress(mockIngress)
+                .build();
+
+        KubernetesNmServiceInfo service = repositoryManager.loadService(deploymentId);
+        service.setRemoteCluster(mockCluster);
+        when(repositoryManager.loadService(deploymentId)).thenReturn(service);
+
+        manager.deployService(deploymentId);
+
+        ArgumentCaptor<String> kubeconfigPathArg = ArgumentCaptor.forClass(String.class);
+        verify(helmCommandExecutor, times(1)).executeHelmInstallCommand(
+                eq("namespace"),
+                eq("descriptiveDeploymentId"),
+                any(KubernetesTemplate.class),
+                any(Map.class),
+                kubeconfigPathArg.capture()
+        );
+        assertThat(kubeconfigPathArg.getValue()).isEqualTo("mock/path/to/kubeconfig");
+    }
+
 }
diff --git a/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java b/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java
index fbcc4be5095906aa4a4b1a2ea81c88cf83234155..3d56deaea7c9ef53af4d3bef50d0ece400655a76 100644
--- a/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java
+++ b/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java
@@ -7,9 +7,9 @@ import net.geant.nmaas.notifications.templates.api.LanguageMailContentView;
 import net.geant.nmaas.notifications.templates.api.MailTemplateView;
 import net.geant.nmaas.notifications.types.persistence.entity.FormType;
 import net.geant.nmaas.notifications.types.service.FormTypeService;
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.api.domain.UserView;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.Domain;
 import net.geant.nmaas.portal.persistent.entity.Role;
 import net.geant.nmaas.portal.persistent.entity.User;
diff --git a/src/test/java/net/geant/nmaas/notifications/types/service/FormTypeServiceTest.java b/src/test/java/net/geant/nmaas/notifications/types/service/FormTypeServiceTest.java
index 550c228e702f2e0124e3efc5f6276a9a5c33237a..a26ad8a7cffa5ad4b9a0cad3e3b0082e80e335b4 100644
--- a/src/test/java/net/geant/nmaas/notifications/types/service/FormTypeServiceTest.java
+++ b/src/test/java/net/geant/nmaas/notifications/types/service/FormTypeServiceTest.java
@@ -3,7 +3,6 @@ package net.geant.nmaas.notifications.types.service;
 import net.geant.nmaas.notifications.types.model.FormTypeRequest;
 import net.geant.nmaas.notifications.types.persistence.entity.FormType;
 import net.geant.nmaas.notifications.types.persistence.repository.FormTypeRepository;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
 import net.geant.nmaas.portal.exceptions.DataConflictException;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/src/test/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTaskTest.java b/src/test/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTaskTest.java
index 6171c102318ac1bf8e99820409db14223e7b90f9..622f4cd25704c5a4af63235d9bd1389790545c55 100644
--- a/src/test/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTaskTest.java
+++ b/src/test/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTaskTest.java
@@ -1,5 +1,6 @@
 package net.geant.nmaas.orchestration.tasks.app;
 
+import net.geant.nmaas.externalservices.kubernetes.RemoteClusterManager;
 import net.geant.nmaas.nmservice.deployment.NmServiceDeploymentProvider;
 import net.geant.nmaas.orchestration.Identifier;
 import net.geant.nmaas.orchestration.entities.AppDeployment;
@@ -25,6 +26,7 @@ public class AppRequestVerificationTaskTest {
     private NmServiceDeploymentProvider deploy = mock(NmServiceDeploymentProvider.class);
     private AppDeploymentRepository deployments = mock(AppDeploymentRepository.class);
     private ApplicationRepository applications = mock(ApplicationRepository.class);
+    private RemoteClusterManager remoteClusterManager = mock(RemoteClusterManager.class);
 
     private AppRequestVerificationTask task;
 
@@ -33,13 +35,14 @@ public class AppRequestVerificationTaskTest {
 
     @BeforeEach
     public void setup() {
-        task = new AppRequestVerificationTask(deploy, deployments, applications);
+        task = new AppRequestVerificationTask(deploy, deployments, applications, remoteClusterManager);
     }
 
     @Test
     public void shouldTriggerRequestVerify() throws InterruptedException {
         when(deployments.findByDeploymentId(deploymentId)).thenReturn(Optional.of(AppDeployment.builder().applicationId(Identifier.newInstance(10L)).build()));
         when(applications.findById(any(Long.class))).thenReturn(Optional.of(new Application()));
+        when(remoteClusterManager.clusterExists(any())).thenReturn(true);
         task.trigger(new AppVerifyRequestActionEvent(this, deploymentId));
         verify(deploy, times(1)).verifyRequest(any(Identifier.class), any(AppDeployment.class), isNull());
     }
diff --git a/src/test/java/net/geant/nmaas/portal/api/auth/BasicAuthControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/auth/BasicAuthControllerTest.java
index bc1865721203c6455ec2781927f82781c2bc4c47..0ed54f97e8d22f1a5be6bf4c56a1e9570157e024 100644
--- a/src/test/java/net/geant/nmaas/portal/api/auth/BasicAuthControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/auth/BasicAuthControllerTest.java
@@ -1,6 +1,6 @@
 package net.geant.nmaas.portal.api.auth;
 
-import net.geant.nmaas.portal.api.exception.AuthenticationException;
+import net.geant.nmaas.portal.api.exceptions.AuthenticationException;
 import net.geant.nmaas.portal.persistent.entity.Domain;
 import net.geant.nmaas.portal.persistent.entity.Role;
 import net.geant.nmaas.portal.persistent.entity.User;
diff --git a/src/test/java/net/geant/nmaas/portal/api/auth/OIDCAuthControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/auth/OIDCAuthControllerTest.java
index 091f1e1382c97e674a1d826c41ecc3242a5d9d26..271094369aae1404d65edd5b73f827095c4196cb 100644
--- a/src/test/java/net/geant/nmaas/portal/api/auth/OIDCAuthControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/auth/OIDCAuthControllerTest.java
@@ -2,7 +2,7 @@ package net.geant.nmaas.portal.api.auth;
 
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.ws.rs.core.HttpHeaders;
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.api.security.JWTTokenService;
 import net.geant.nmaas.portal.persistent.entity.Domain;
 import net.geant.nmaas.portal.persistent.entity.Role;
diff --git a/src/test/java/net/geant/nmaas/portal/api/bulk/BulkControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/bulk/BulkControllerTest.java
index e34930b02f397b04252875ed8dfc5ed78f76b114..acba6d77ed335a7c4dc7f71a8e68d8c99d215d71 100644
--- a/src/test/java/net/geant/nmaas/portal/api/bulk/BulkControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/bulk/BulkControllerTest.java
@@ -1,6 +1,7 @@
 package net.geant.nmaas.portal.api.bulk;
 
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.BulkDeployment;
 import net.geant.nmaas.portal.persistent.entity.User;
 import net.geant.nmaas.portal.persistent.repositories.BulkDeploymentRepository;
@@ -10,6 +11,7 @@ import net.geant.nmaas.portal.service.BulkDomainService;
 import net.geant.nmaas.portal.service.UserService;
 import org.junit.jupiter.api.Test;
 import org.modelmapper.ModelMapper;
+import org.springframework.dao.PermissionDeniedDataAccessException;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.mock.web.MockMultipartFile;
@@ -22,10 +24,12 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoInteractions;
 import static org.mockito.Mockito.when;
@@ -90,22 +94,19 @@ public class BulkControllerTest {
             when(principalMock.getName()).thenReturn("user");
             when(userService.findByUsername("user")).thenReturn(Optional.of(new User("user")));
 
-            ResponseEntity<BulkDeploymentViewS> response = bulkController.uploadApplications(principalMock, "applicationName", 2, file);
+            bulkController.uploadApplications(principalMock, "applicationName", 2, file);
         });
     }
 
     @Test
     void shouldGetDomainBulksAsGroupManager() {
         when(principalMock.getName()).thenReturn("user");
-        User user = new User("user");
-        user.setId(10L);
-        when(userService.findByUsername("user")).thenReturn(Optional.of(user));
-        when(userService.findById(10L)).thenReturn(Optional.of(user));
         BulkDeployment viewS = new BulkDeployment();
         viewS.setType(BulkType.DOMAIN);
-        viewS.setCreator(user);
+        viewS.setCreator(setUpMockUser("user", 10L));
         viewS.setDeleted(false);
         when(bulkDeploymentRepository.findByType(BulkType.DOMAIN)).thenReturn(List.of(viewS));
+
         assertEquals(1, Objects.requireNonNull(bulkController.getDomainDeploymentRecordsRestrictedToOwner(principalMock).getBody()).size());
     }
 
@@ -135,4 +136,91 @@ public class BulkControllerTest {
         assertEquals(1, Objects.requireNonNull(bulkController.getAppDeploymentRecordsRestrictedToOwner(principalMock).getBody()).size());
     }
 
+    @Test
+    void shouldNotRemoveNotFoundBulkDeployment() {
+        when(principalMock.getName()).thenReturn("user");
+        setUpMockUser("user", 10L);
+        when(bulkDeploymentRepository.findById(5L)).thenReturn(Optional.empty());
+
+        ResponseEntity<Void> response = bulkController.removeBulkDeployment(5L, false, principalMock);
+        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
+    }
+
+    @Test
+    void shouldRemoveBulkDeployment() {
+        when(principalMock.getName()).thenReturn("user");
+
+        BulkDeployment bulk = new BulkDeployment();
+        bulk.setId(5L);
+        bulk.setType(BulkType.APPLICATION);
+        bulk.setCreator(setUpMockUser("user", 10L));
+        bulk.setDeleted(false);
+        when(bulkDeploymentRepository.findById(5L)).thenReturn(Optional.of(bulk));
+
+        ResponseEntity<Void> response = bulkController.removeBulkDeployment(5L, false, principalMock);
+
+        verifyNoInteractions(bulkApplicationService);
+        verify(bulkDeploymentRepository).save(any());
+        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+    }
+
+    @Test
+    void shouldRemoveBulkDeploymentWithApplications() {
+        when(principalMock.getName()).thenReturn("user");
+
+        BulkDeployment bulk = new BulkDeployment();
+        bulk.setId(5L);
+        bulk.setType(BulkType.APPLICATION);
+        bulk.setCreator(setUpMockUser("user", 10L));
+        bulk.setDeleted(false);
+        when(bulkDeploymentRepository.findById(5L)).thenReturn(Optional.of(bulk));
+
+        ResponseEntity<Void> response = bulkController.removeBulkDeployment(5L, true, principalMock);
+
+        verify(bulkApplicationService).deleteAppInstancesFromBulk(bulk);
+        verify(bulkDeploymentRepository).save(any());
+        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+    }
+
+    @Test
+    void shouldForbidRemovalOfBulkDeploymentForNonCreator() {
+        when(principalMock.getName()).thenReturn("user");
+        setUpMockUser("user", 10L);
+
+        BulkDeployment bulk = new BulkDeployment();
+        bulk.setId(5L);
+        bulk.setType(BulkType.APPLICATION);
+        bulk.setCreator(setUpMockUser("creator", 11L));
+        bulk.setDeleted(false);
+        when(bulkDeploymentRepository.findById(5L)).thenReturn(Optional.of(bulk));
+
+        assertThrows(PermissionDeniedDataAccessException.class, () ->
+            bulkController.removeBulkDeployment(5L, true, principalMock)
+        );
+
+        verifyNoInteractions(bulkApplicationService);
+        verify(bulkDeploymentRepository, times(0)).save(any());
+    }
+
+    @Test
+    void shouldGetBulkDeploymentRefreshedState() {
+        BulkDeployment bulk = new BulkDeployment();
+        bulk.setId(5L);
+        bulk.setType(BulkType.APPLICATION);
+        bulk.setCreator(setUpMockUser("creator", 11L));
+        bulk.setDeleted(false);
+        when(bulkApplicationService.updateState(5L)).thenReturn(bulk);
+
+        ResponseEntity<BulkDeploymentViewS> response = bulkController.getRefreshedState(5L);
+        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+    }
+
+    private User setUpMockUser(String username, long id) {
+        User user = new User(username);
+        user.setId(id);
+        when(userService.findByUsername(username)).thenReturn(Optional.of(user));
+        when(userService.findById(id)).thenReturn(Optional.of(user));
+        return user;
+    }
+
 }
\ No newline at end of file
diff --git a/src/test/java/net/geant/nmaas/portal/api/configuration/InitScriptsControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/configuration/InitScriptsControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..870572a8fffa1f2940bfdd81219759c903a1a22a
--- /dev/null
+++ b/src/test/java/net/geant/nmaas/portal/api/configuration/InitScriptsControllerTest.java
@@ -0,0 +1,32 @@
+package net.geant.nmaas.portal.api.configuration;
+
+import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.components.helm.InitScriptsStateService;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+public class InitScriptsControllerTest {
+
+    private final InitScriptsStateService service = mock(InitScriptsStateService.class);
+
+    private final InitScriptsController controller = new InitScriptsController(service);
+
+    @Test
+    void shouldEnableFlagOnStart() {
+        assertThat(controller.isInitInProgress()).isFalse();
+        controller.startInitScripts();
+        assertThat(controller.isInitInProgress()).isTrue();
+    }
+
+    @Test
+    void shouldDisableFlagOnEnd() {
+        assertThat(controller.isInitInProgress()).isFalse();
+        controller.endInitScripts();
+        assertThat(controller.isInitInProgress()).isFalse();
+        verify(service, times(1)).executeHelmRepoUpdate();
+    }
+
+}
diff --git a/src/test/java/net/geant/nmaas/portal/api/info/ContentControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/info/ContentControllerTest.java
index ba5bc93d64aed5d8b77a4a1024ef097dc1a14c38..d9ed38be7b7ef7d8fbea0ab54090840fd117446e 100644
--- a/src/test/java/net/geant/nmaas/portal/api/info/ContentControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/info/ContentControllerTest.java
@@ -1,7 +1,7 @@
 package net.geant.nmaas.portal.api.info;
 
 import net.geant.nmaas.portal.api.domain.ContentView;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.Content;
 import net.geant.nmaas.portal.persistent.repositories.ContentRepository;
 import org.junit.jupiter.api.Test;
diff --git a/src/test/java/net/geant/nmaas/portal/api/info/DashboardControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/info/DashboardControllerTest.java
index bc11435c61a1723aa7a7f9cb4b467e0d1e33bfa6..7a2983bdef38a223b4654c9998ae9b0a4626e8e8 100644
--- a/src/test/java/net/geant/nmaas/portal/api/info/DashboardControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/info/DashboardControllerTest.java
@@ -1,7 +1,5 @@
 package net.geant.nmaas.portal.api.info;
 
-import net.geant.nmaas.portal.api.info.DashboardView;
-import net.geant.nmaas.portal.api.info.DomainDashboardView;
 import net.geant.nmaas.portal.service.DashboardService;
 import org.junit.jupiter.api.Test;
 
@@ -34,7 +32,7 @@ public class DashboardControllerTest {
         Long domainId = 1L;
         DomainDashboardView domainDashboardView = DomainDashboardView.builder().build();
 
-        when(dashboardService.getSystemDomainDashboard(domainId)).thenReturn(domainDashboardView);
+        when(dashboardService.getDomainDashboard(domainId)).thenReturn(domainDashboardView);
 
         DomainDashboardView result = dashboardController.getDashboardDomain(domainId);
 
diff --git a/src/test/java/net/geant/nmaas/portal/api/market/AppBaseControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/AppBaseControllerTest.java
index a5051424e55b79186dfd296fc1191f634441a8f7..2e83d830daecbedad90864df009b5d6630ed16a7 100644
--- a/src/test/java/net/geant/nmaas/portal/api/market/AppBaseControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/market/AppBaseControllerTest.java
@@ -1,6 +1,6 @@
 package net.geant.nmaas.portal.api.market;
 
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.Application;
 import net.geant.nmaas.portal.persistent.entity.User;
 import net.geant.nmaas.portal.service.ApplicationBaseService;
diff --git a/src/test/java/net/geant/nmaas/portal/api/market/AppCommentsControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/AppCommentsControllerTest.java
index 3fb9e121108dbb5328f1d6ec871b3260dfc5ca8a..a7aa16d2307fb1ce6769bdd513f08687aa369293 100644
--- a/src/test/java/net/geant/nmaas/portal/api/market/AppCommentsControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/market/AppCommentsControllerTest.java
@@ -2,8 +2,8 @@ package net.geant.nmaas.portal.api.market;
 
 import net.geant.nmaas.portal.api.domain.CommentRequest;
 import net.geant.nmaas.portal.api.domain.CommentView;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
 import net.geant.nmaas.portal.persistent.entity.Comment;
 import net.geant.nmaas.portal.persistent.entity.User;
diff --git a/src/test/java/net/geant/nmaas/portal/api/market/AppInstanceControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/AppInstanceControllerTest.java
index 6cd0015acc4573aa191cb1c4aeb38e6971c9d33a..d49c0f32989bff4da8e590212dbe9f51250da45f 100644
--- a/src/test/java/net/geant/nmaas/portal/api/market/AppInstanceControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/market/AppInstanceControllerTest.java
@@ -16,9 +16,8 @@ import net.geant.nmaas.portal.api.domain.AppInstanceView;
 import net.geant.nmaas.portal.api.domain.AppInstanceViewExtended;
 import net.geant.nmaas.portal.api.domain.ApplicationDTO;
 import net.geant.nmaas.portal.api.domain.DomainBase;
-import net.geant.nmaas.portal.api.domain.Id;
 import net.geant.nmaas.portal.api.domain.UserBase;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.AppInstance;
 import net.geant.nmaas.portal.persistent.entity.Application;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
diff --git a/src/test/java/net/geant/nmaas/portal/api/market/AppScreenshotsControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/AppScreenshotsControllerTest.java
index 97a8e8c4c603765e38472bb4d5f1397456b85240..e98bd899481f6e72701f5577e19522a29906039f 100644
--- a/src/test/java/net/geant/nmaas/portal/api/market/AppScreenshotsControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/market/AppScreenshotsControllerTest.java
@@ -2,7 +2,7 @@ package net.geant.nmaas.portal.api.market;
 
 import net.geant.nmaas.portal.api.domain.FileInfoView;
 import net.geant.nmaas.portal.api.domain.UserFile;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
 import net.geant.nmaas.portal.persistent.entity.FileInfo;
 import net.geant.nmaas.portal.service.ApplicationBaseService;
diff --git a/src/test/java/net/geant/nmaas/portal/api/market/RegistrationControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/RegistrationControllerTest.java
index 36ccd7582a8edaed4ca224a9be0dfb7a7b3e00ca..cf4ca68fbaf3cd2d199656364a513955cf0ca1ae 100644
--- a/src/test/java/net/geant/nmaas/portal/api/market/RegistrationControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/market/RegistrationControllerTest.java
@@ -2,8 +2,8 @@ package net.geant.nmaas.portal.api.market;
 
 import net.geant.nmaas.portal.api.auth.Registration;
 import net.geant.nmaas.portal.api.domain.DomainBase;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.SignupException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.SignupException;
 import net.geant.nmaas.portal.persistent.entity.Domain;
 import net.geant.nmaas.portal.persistent.entity.User;
 import net.geant.nmaas.portal.service.DomainService;
diff --git a/src/test/java/net/geant/nmaas/portal/api/market/UsersControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/UsersControllerTest.java
index 9d2422f6fb347f4eb9833f5e6a13fb0e5b6573e3..4b70031a859db6b376533e8fc2289470f652365d 100644
--- a/src/test/java/net/geant/nmaas/portal/api/market/UsersControllerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/api/market/UsersControllerTest.java
@@ -6,8 +6,8 @@ import net.geant.nmaas.portal.api.domain.UserRequest;
 import net.geant.nmaas.portal.api.domain.UserRoleView;
 import net.geant.nmaas.portal.api.domain.UserView;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.api.security.JWTTokenService;
 import net.geant.nmaas.portal.api.user.UsersController;
 import net.geant.nmaas.portal.exceptions.ObjectNotFoundException;
diff --git a/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java b/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java
index 8df5075e776a6f36868a1bcc1e90eb7b39222255..20c1a9c5c5b19e74e202f5e23d3241745d5ba877 100644
--- a/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java
+++ b/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java
@@ -1,6 +1,6 @@
 package net.geant.nmaas.portal.persistent.entity;
 
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import org.assertj.core.util.Lists;
 import org.junit.jupiter.api.Test;
 import org.modelmapper.ModelMapper;
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java
index e62ab15033e142a87c38d3f8e1096ebe482a4ac0..e98ec9f4692ff0ec750b09b2c1bbacfbf1e70032 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java
@@ -1,7 +1,7 @@
 package net.geant.nmaas.portal.service.impl;
 
 import com.google.common.collect.Sets;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
 import net.geant.nmaas.portal.events.ApplicationActivatedEvent;
 import net.geant.nmaas.portal.persistent.entity.AppDescription;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceTest.java
index 7c4334a548f8fa4bd6590cba73752bc04a77ca3f..a16c680de53d16ef3174c1de70d346599d665d86 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceTest.java
@@ -1,8 +1,8 @@
 package net.geant.nmaas.portal.service.impl;
 
 import com.google.common.collect.ImmutableSet;
-import net.geant.nmaas.portal.api.exception.MissingElementException;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.MissingElementException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.exceptions.ObjectNotFoundException;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
 import net.geant.nmaas.portal.persistent.entity.ApplicationState;
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImplTest.java
index abbd3c311f4db04779cafa20347af1a39d94f149..cf03b5045b55c06772cd7be5143a522ccad875cb 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImplTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImplTest.java
@@ -14,8 +14,7 @@ import net.geant.nmaas.orchestration.AppLifecycleState;
 import net.geant.nmaas.orchestration.Identifier;
 import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentReviewEvent;
 import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentStatusUpdateEvent;
-import net.geant.nmaas.portal.api.bulk.BulkQueueDetails;
-import net.geant.nmaas.portal.api.bulk.BulkType;
+import net.geant.nmaas.portal.api.bulk.model.BulkQueueDetails;
 import net.geant.nmaas.portal.api.bulk.CsvApplication;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
 import net.geant.nmaas.portal.persistent.entity.AppInstance;
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java
index fc458ce116dad04352c83a9634841a070001ba02..827f0f40a1dc23835fc709bcf47b4416797e3d5d 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java
@@ -5,7 +5,7 @@ import net.geant.nmaas.dcn.deployment.entities.DomainDcnDetails;
 import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManager;
 import net.geant.nmaas.portal.api.bulk.BulkType;
 import net.geant.nmaas.portal.api.bulk.CsvDomain;
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
 import net.geant.nmaas.portal.persistent.entity.BulkDeployment;
 import net.geant.nmaas.portal.persistent.entity.BulkDeploymentEntry;
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java
index c0e41cd98b7cd093b04ef4389bdbf152a94110db..a160941b79b885ed18180ec921d0719dfe288535 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java
@@ -1,7 +1,7 @@
 package net.geant.nmaas.portal.service.impl;
 
 import net.geant.nmaas.nmservice.deployment.bulks.BulkDeploymentJob;
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.api.i18n.api.InternationalizationView;
 import net.geant.nmaas.portal.exceptions.ConfigurationNotFoundException;
 import net.geant.nmaas.portal.exceptions.OnlyOneConfigurationSupportedException;
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/ContentServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/ContentServiceImplTest.java
index 72ff1bdaa33f8572043d8b0971333b84a9e310bd..ef34ce3f662037da153660b66fd657d5d5c39e8d 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/ContentServiceImplTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/ContentServiceImplTest.java
@@ -1,6 +1,6 @@
 package net.geant.nmaas.portal.service.impl;
 
-import net.geant.nmaas.portal.api.exception.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.exceptions.ObjectAlreadyExistsException;
 import net.geant.nmaas.portal.persistent.entity.Content;
 import net.geant.nmaas.portal.persistent.repositories.ContentRepository;
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/DashboardServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/DashboardServiceImplTest.java
index f35951e6cfdf5e61ca16780fabfdf728afd51910..bd43f5975e33642dbb284d918ed93c0501783053 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/DashboardServiceImplTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/DashboardServiceImplTest.java
@@ -13,7 +13,6 @@ import net.geant.nmaas.portal.persistent.repositories.UserRepository;
 import net.geant.nmaas.portal.service.ApplicationInstanceService;
 import net.geant.nmaas.portal.service.DomainService;
 import net.geant.nmaas.portal.service.UserLoginRegisterService;
-import net.geant.nmaas.portal.service.UserService;
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 
@@ -25,43 +24,41 @@ import java.util.Optional;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-
 public class DashboardServiceImplTest {
 
-    private final UserService userService = mock(UserService.class);
     private final UserRepository userRepository = mock(UserRepository.class);
     private final DomainService domainService = mock(DomainService.class);
     private final DomainRepository domainRepository = mock(DomainRepository.class);
     private final ApplicationInstanceService applicationInstanceService = mock(ApplicationInstanceService.class);
-    private final AppInstanceRepository appInstanceRepo = mock(AppInstanceRepository.class);
+    private final AppInstanceRepository appInstanceRepository = mock(AppInstanceRepository.class);
     private final ApplicationBaseRepository applicationBaseRepository = mock(ApplicationBaseRepository.class);
     private final UserLoginRegisterService userLoginRegisterService = mock(UserLoginRegisterService.class);
 
     private final DashboardServiceImpl dashboardService = new DashboardServiceImpl(
-            userService,
             userRepository,
             domainService,
             domainRepository,
             applicationInstanceService,
-            appInstanceRepo,
+            appInstanceRepository,
             applicationBaseRepository,
             userLoginRegisterService
     );
 
-      @Test
+    @Test
     void getSystemDashboardShouldThrowExceptionWhenRepositoryFails() {
         when(domainRepository.count()).thenThrow(new RuntimeException("Database error"));
 
-        assertThrows(RuntimeException.class, () -> 
-            dashboardService.getSystemDashboard(OffsetDateTime.now().minusDays(1), OffsetDateTime.now())
+        assertThrows(RuntimeException.class, () ->
+                dashboardService.getSystemDashboard(OffsetDateTime.now().minusDays(1), OffsetDateTime.now())
         );
     }
 
     @Test
-    void getSystemDomainDashboardShouldReturnEmptyObjectWhenDomainIdIsNull() {
-        DomainDashboardView result = dashboardService.getSystemDomainDashboard(null);
+    void getDomainDashboardShouldReturnEmptyObjectWhenDomainIdIsNull() {
+        DomainDashboardView result = dashboardService.getDomainDashboard(null);
 
         assert result != null;
         assert result.getUserLogins() == null;
@@ -70,15 +67,15 @@ public class DashboardServiceImplTest {
     }
 
     @Test
-    void getSystemDomainDashboardShouldHandleEmptyDomainUsers() {
+    void getDomainDashboardShouldHandleEmptyDomainUsers() {
         Long domainId = 1L;
         Domain domain = new Domain(domainId, "Test Domain", "test-domain");
 
         when(domainService.findDomain(domainId)).thenReturn(Optional.of(domain));
         when(domainService.getMembers(domainId)).thenReturn(Collections.emptyList());
-        when(appInstanceRepo.findAllByDomain(domain)).thenReturn(Collections.emptyList());
+        when(appInstanceRepository.findAllByDomain(domain)).thenReturn(Collections.emptyList());
 
-        DomainDashboardView result = dashboardService.getSystemDomainDashboard(domainId);
+        DomainDashboardView result = dashboardService.getDomainDashboard(domainId);
 
         assert result != null;
         assert result.getUserLogins().isEmpty();
@@ -87,7 +84,7 @@ public class DashboardServiceImplTest {
     }
 
     @Test
-    void getSystemDomainDashboardShouldHandleEmptyAppInstances() {
+    void getDomainDashboardShouldHandleEmptyAppInstances() {
         Long domainId = 1L;
         Domain domain = new Domain(domainId, "Test Domain", "test-domain");
         User user = new User("testUser", true);
@@ -95,18 +92,18 @@ public class DashboardServiceImplTest {
         UserLoginRegister userLoginRegister = new UserLoginRegister(
                 loginTime,
                 user,
-                UserLoginRegisterType.SUCCESS, // Typ logowania
-                "127.0.0.1", // Adres IP
+                UserLoginRegisterType.SUCCESS, // login type
+                "127.0.0.1", // IP address
                 "localhost", // Host
                 "Mozilla/5.0" // User-Agent
         );
 
         when(domainService.findDomain(domainId)).thenReturn(Optional.of(domain));
         when(domainService.getMembers(domainId)).thenReturn(List.of(user));
-        when(appInstanceRepo.findAllByDomain(domain)).thenReturn(Collections.emptyList());
+        when(appInstanceRepository.findAllByDomain(domain)).thenReturn(Collections.emptyList());
         when(userLoginRegisterService.getLastLogin(user)).thenReturn(Optional.of(userLoginRegister));
 
-        DomainDashboardView result = dashboardService.getSystemDomainDashboard(domainId);
+        DomainDashboardView result = dashboardService.getDomainDashboard(domainId);
 
         assert result != null;
         assert !result.getUserLogins().isEmpty();
@@ -117,8 +114,8 @@ public class DashboardServiceImplTest {
     void getSystemDashboardShouldHandleEmptyBaseNames() {
         when(domainRepository.count()).thenReturn(5L);
         when(userRepository.count()).thenReturn(10L);
-        when(appInstanceRepo.count()).thenReturn(15L);
-        when(appInstanceRepo.countAllDeployedSinceTime(anyLong())).thenReturn((int) 3L);
+        when(appInstanceRepository.count()).thenReturn(15L);
+        when(appInstanceRepository.countAllDeployedInTimePeriod(anyLong(), anyLong())).thenReturn((int) 3L);
         when(applicationBaseRepository.findAllNames()).thenReturn(Collections.emptyList());
 
         DashboardView result = dashboardService.getSystemDashboard(OffsetDateTime.now().minusDays(1), OffsetDateTime.now());
@@ -135,10 +132,10 @@ public class DashboardServiceImplTest {
         // Mock required repository methods
         when(domainRepository.count()).thenReturn(1L);
         when(userRepository.count()).thenReturn(1L);
-        when(appInstanceRepo.count()).thenReturn(1L);
-        when(appInstanceRepo.countAllDeployedSinceTime(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(1);
+        when(appInstanceRepository.count()).thenReturn(1L);
+        when(appInstanceRepository.countAllDeployedInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(1);
         when(applicationBaseRepository.findAllNames()).thenReturn(Collections.emptyList());
-        when(appInstanceRepo.findAllInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(Collections.emptyList());
+        when(appInstanceRepository.findAllInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(Collections.emptyList());
 
         // Call the method
         dashboardService.getSystemDashboard(startDate, endDate);
@@ -147,7 +144,7 @@ public class DashboardServiceImplTest {
         ArgumentCaptor<Long> startCaptor = ArgumentCaptor.forClass(Long.class);
         ArgumentCaptor<Long> endCaptor = ArgumentCaptor.forClass(Long.class);
 
-        org.mockito.Mockito.verify(appInstanceRepo).countAllDeployedSinceTime(startCaptor.capture(), endCaptor.capture());
+        verify(appInstanceRepository).countAllDeployedInTimePeriod(startCaptor.capture(), endCaptor.capture());
 
         long startTimestamp = startCaptor.getValue();
         long endTimestamp = endCaptor.getValue();
@@ -164,12 +161,12 @@ public class DashboardServiceImplTest {
         long toTime = 2000L;
         int expectedCount = 7;
 
-        when(appInstanceRepo.countAllDeployedSinceTime(sinceTime, toTime)).thenReturn(expectedCount);
+        when(appInstanceRepository.countAllDeployedInTimePeriod(sinceTime, toTime)).thenReturn(expectedCount);
 
-        int actualCount = appInstanceRepo.countAllDeployedSinceTime(sinceTime, toTime);
+        int actualCount = appInstanceRepository.countAllDeployedInTimePeriod(sinceTime, toTime);
 
         assert actualCount == expectedCount;
-        org.mockito.Mockito.verify(appInstanceRepo).countAllDeployedSinceTime(sinceTime, toTime);
+        verify(appInstanceRepository).countAllDeployedInTimePeriod(sinceTime, toTime);
     }
 
     @Test
@@ -179,17 +176,17 @@ public class DashboardServiceImplTest {
 
         when(domainRepository.count()).thenReturn(1L);
         when(userRepository.count()).thenReturn(1L);
-        when(appInstanceRepo.count()).thenReturn(1L);
-        when(appInstanceRepo.countAllDeployedSinceTime(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(5);
+        when(appInstanceRepository.count()).thenReturn(1L);
+        when(appInstanceRepository.countAllDeployedInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(5);
         when(applicationBaseRepository.findAllNames()).thenReturn(Collections.emptyList());
-        when(appInstanceRepo.findAllInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(Collections.emptyList());
+        when(appInstanceRepository.findAllInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(Collections.emptyList());
 
         dashboardService.getSystemDashboard(startDate, endDate);
 
         ArgumentCaptor<Long> sinceCaptor = ArgumentCaptor.forClass(Long.class);
         ArgumentCaptor<Long> toCaptor = ArgumentCaptor.forClass(Long.class);
 
-        org.mockito.Mockito.verify(appInstanceRepo).countAllDeployedSinceTime(sinceCaptor.capture(), toCaptor.capture());
+        verify(appInstanceRepository).countAllDeployedInTimePeriod(sinceCaptor.capture(), toCaptor.capture());
 
         long sinceTime = sinceCaptor.getValue();
         long toTime = toCaptor.getValue();
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java
index 5fb8cb4c800f2519d943b89133014c20531a2147..6474a6f25bf394164ef732ce66d217ed2612ad59 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java
@@ -15,8 +15,7 @@ import net.geant.nmaas.portal.api.domain.DomainRequest;
 import net.geant.nmaas.portal.api.domain.DomainTechDetailsView;
 import net.geant.nmaas.portal.api.domain.UserView;
 import net.geant.nmaas.portal.api.domain.UserViewMinimal;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
-import net.geant.nmaas.portal.api.security.EncryptionService;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
 import net.geant.nmaas.portal.events.DomainCreatedEvent;
 import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
 import net.geant.nmaas.portal.persistent.entity.ApplicationStatePerDomain;
@@ -36,7 +35,6 @@ import net.geant.nmaas.portal.service.ApplicationStatePerDomainService;
 import net.geant.nmaas.portal.service.DomainGroupService;
 import net.geant.nmaas.portal.service.DomainService;
 import net.geant.nmaas.portal.service.UserService;
-import net.geant.nmaas.portal.service.WebhookEventService;
 import net.geant.nmaas.portal.service.impl.domains.DefaultCodenameValidator;
 import net.geant.nmaas.scheduling.ScheduleManager;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java
index 2eeed20b72c80a81a8d2fb390502ffe7d48a1037..1600b477f213e6be82731958bc869a0313a1f25d 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java
@@ -1,6 +1,6 @@
 package net.geant.nmaas.portal.service.impl;
 
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
 import net.geant.nmaas.portal.api.i18n.api.InternationalizationBriefView;
 import net.geant.nmaas.portal.api.i18n.api.InternationalizationView;
 import net.geant.nmaas.portal.persistent.repositories.InternationalizationSimpleRepository;
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImplTest.java
index 44860c31d125ed4f211c28dc578e5e9e0727c0ee..60341bc08364c7c97a9ea50ff8d815436a1e70c1 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImplTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImplTest.java
@@ -1,7 +1,5 @@
 package net.geant.nmaas.portal.service.impl;
 
-import net.geant.nmaas.portal.api.exception.ExternalUserCanNotBeLinked;
-import net.geant.nmaas.portal.api.exception.ExternalUserMatchException;
 import net.geant.nmaas.portal.persistent.entity.User;
 import net.geant.nmaas.portal.persistent.repositories.UserRepository;
 import net.geant.nmaas.portal.service.ConfigurationManager;
diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java
index 8219596559d4876dec1fa3d4a773c5fa838b93e1..19c57a42ed6a32c55dca8339e06928279dc89f76 100644
--- a/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java
+++ b/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java
@@ -2,9 +2,9 @@ package net.geant.nmaas.portal.service.impl;
 
 import net.geant.nmaas.portal.api.auth.Registration;
 import net.geant.nmaas.portal.api.bulk.CsvDomain;
-import net.geant.nmaas.portal.api.configuration.ConfigurationView;
-import net.geant.nmaas.portal.api.exception.ProcessingException;
-import net.geant.nmaas.portal.api.exception.SignupException;
+import net.geant.nmaas.portal.api.configuration.model.ConfigurationView;
+import net.geant.nmaas.portal.api.exceptions.ProcessingException;
+import net.geant.nmaas.portal.api.exceptions.SignupException;
 import net.geant.nmaas.portal.api.security.JWTTokenService;
 import net.geant.nmaas.portal.persistent.entity.Domain;
 import net.geant.nmaas.portal.persistent.entity.Role;
diff --git a/src/test/shell/data/i18n/de.json b/src/test/shell/data/i18n/de.json
index ba1a92fa2ba7406eeef03e7564fde57ce33c1d38..da39ebf6f21962821bd320953016ce9481aa4939 100644
--- a/src/test/shell/data/i18n/de.json
+++ b/src/test/shell/data/i18n/de.json
@@ -1329,6 +1329,7 @@
     "DOMAIN_GROUP_CHANGE" : "Domain group change",
     "NEW" : "Add webhook",
     "DETAILS" : "Webhooks details",
-    "SAVE" : "Save webhook"
+    "SAVE" : "Save",
+    "REMOVE" : "Remove"
   }
 }
diff --git a/src/test/shell/data/i18n/en.json b/src/test/shell/data/i18n/en.json
index ad5555bd15fa459359c3aacea8fa8ed12b24d46c..7e72dc93321aa42f566df167d0a7899a4cf16403 100644
--- a/src/test/shell/data/i18n/en.json
+++ b/src/test/shell/data/i18n/en.json
@@ -1324,7 +1324,7 @@
     "TITLE_SHORT" : "Webhooks",
     "ID" : "Id",
     "NAME" : "Name",
-    "TARGET_URL" : "Target Url",
+    "TARGET_URL" : "Target url",
     "TYPE" : "Webhook type",
     "TOKEN" : "Token value",
     "AUTH" : "Authorization header",
@@ -1334,6 +1334,7 @@
     "DOMAIN_GROUP_CHANGE" : "Domain group change",
     "NEW" : "Add webhook",
     "DETAILS" : "Webhooks details",
-    "SAVE" : "Save webhook"
+    "SAVE" : "Save",
+    "REMOVE" : "Remove"
   }
 }
diff --git a/src/test/shell/data/i18n/fr.json b/src/test/shell/data/i18n/fr.json
index 49995a806b69f58e9bde6bb96fa918b483f93917..798c4dd6756eff885a9eee4173f511d8f7a15db5 100644
--- a/src/test/shell/data/i18n/fr.json
+++ b/src/test/shell/data/i18n/fr.json
@@ -1333,6 +1333,7 @@
     "DOMAIN_GROUP_CHANGE" : "Domain group change",
     "NEW" : "Add webhook",
     "DETAILS" : "Webhooks details",
-    "SAVE" : "Save webhook"
+    "SAVE" : "Save",
+    "REMOVE" : "Remove"
   }
 }
diff --git a/src/test/shell/data/i18n/pl.json b/src/test/shell/data/i18n/pl.json
index 76d6f8a0133064520e1181739c7f5e976fd8fe02..c666060a7c33958662a64d5620f23ffa2e23cbf5 100644
--- a/src/test/shell/data/i18n/pl.json
+++ b/src/test/shell/data/i18n/pl.json
@@ -1333,7 +1333,7 @@
     "DOMAIN_GROUP_CHANGE" : "Domain group change",
     "NEW" : "Add webhook",
     "DETAILS" : "Webhooks details",
-    "SAVE" : "Save webhook"
-
+    "SAVE" : "Save",
+    "REMOVE" : "Remove"
   }
 }