diff --git a/README.md b/README.md
index 70263b2550f704d4fee99d637c9f3647161d2825..b8b53f76b72b0ac713b117b68241ddc0af3dd6ef 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,11 @@ If this is your first contact with the eDelivery SMP, it is highly recommended t
 
 ## Build
 
-In order to build eDelivery SMP :
+In order to build eDelivery SMP, you need to have the following installed: 
+*  Java JDK 8 or JDK 11
+*  Maven 3.6+   
+
+To build eDelivery SMP, run the following command in the root directory of the project:
 
     mvn clean install 
 
@@ -64,4 +68,4 @@ Have questions? Consult our [Q&A section](https://ec.europa.eu/digital-building-
 Still have questions? Contact [eDelivery support](https://ec.europa.eu/digital-building-blocks/tracker/plugins/servlet/desk/portal/6).
 
 
-[Top](#top)
\ No newline at end of file
+[Top](#top)
diff --git a/owasp-false-positive-warnings.xml b/owasp-false-positive-warnings.xml
index e11f9b093729105cde65cbcdd33eb1d5fe6e78a9..cc7b1528c2cd0f1a589460b9b64526f1be3a2013 100644
--- a/owasp-false-positive-warnings.xml
+++ b/owasp-false-positive-warnings.xml
@@ -18,8 +18,9 @@
     </suppress>
     <suppress>
         <notes><![CDATA[
-   file name: smp.war: spring-core-5.3.*.jar
+   file name: smp.war: spring-core-5.3.29.jar
    ]]></notes>
+        <sha1>528eafe4cef7bccf3df290dd99ac5833a9756183</sha1>
         <cve>CVE-2016-1000027</cve>
     </suppress>
     <suppress>
@@ -30,27 +31,6 @@
     </suppress>
     <suppress>
         <notes><![CDATA[
-   file name: spring-aop-5.3.25.jar spring-expression-5.3.25.jar
-   ]]></notes>
-        <packageUrl regex="true">^pkg:maven/org\.springframework/spring\-(aop|expression)@.*$</packageUrl>
-        <cve>CVE-2023-20861</cve>
-    </suppress>
-    <suppress>
-        <notes><![CDATA[
-   file name: cxf-xjc-runtime-3.3.2.jar
-   ]]></notes>
-        <packageUrl regex="true">^pkg:maven/org\.apache\.cxf\.xjc\-utils/cxf\-xjc\-runtime@.*$</packageUrl>
-        <cve>CVE-2021-4277</cve>
-    </suppress>
-    <suppress>
-        <notes><![CDATA[
-   file name: cxf-rt-bindings-soap-3.5.5.jar
-   ]]></notes>
-        <packageUrl regex="true">^pkg:maven/org\.apache\.cxf/cxf\-rt\-bindings\-soap@.*$</packageUrl>
-        <cve>CVE-2022-40705</cve>
-    </suppress>
-    <suppress>
-        <notes><![CDATA[
    file name: guava-30.1-jre.jar
    ]]></notes>
         <packageUrl regex="true">^pkg:maven/com\.google\.guava/guava@.*$</packageUrl>
@@ -72,13 +52,6 @@
     </suppress>
     <suppress>
         <notes><![CDATA[
-   file name: bcprov-jdk15on-1.70.jar
-   ]]></notes>
-        <packageUrl regex="true">^pkg:maven/org\.bouncycastle/bcprov\-jdk15on@.*$</packageUrl>
-        <vulnerabilityName>CVE-2023-33201</vulnerabilityName>
-    </suppress>
-    <suppress>
-        <notes><![CDATA[
    file name: jackson-databind-2.15.2.jar
    ]]></notes>
         <packageUrl regex="true">^pkg:maven/com\.fasterxml\.jackson\.core/jackson\-databind@.*$</packageUrl>
diff --git a/pom.xml b/pom.xml
index fc3a1f360ca1045cfc40837bf5da9dfaddbf6914..cd4629a8a4d1c60b757ac3b5a821a05f22b37049 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,7 +12,8 @@
   ~ See the Licence for the specific language governing permissions and limitations under the Licence.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>eu.europa.ec.edelivery</groupId>
     <artifactId>smp-modules</artifactId>
@@ -37,12 +38,13 @@
         <maven.compiler.source>1.8</maven.compiler.source>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <edelivery.ssl-auth.version>1.14-SNAPSHOT</edelivery.ssl-auth.version>
-        <edelivery.dynamic-discovery-client.version>2.0</edelivery.dynamic-discovery-client.version>
+        <edelivery.dynamic-discovery-client.version>2.1-SNAPSHOT</edelivery.dynamic-discovery-client.version>
+        <bdmsl-api.version>4.3-SNAPSHOT</bdmsl-api.version>
 
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <ant-commons-net.version>1.6.5</ant-commons-net.version>
         <aspectj.version>1.9.9.1</aspectj.version>
-        <bdmsl.api.version>4.1.1</bdmsl.api.version>
+
         <build.helper.maven.version>1.9.1</build.helper.maven.version>
         <commons-beanutils.version>1.9.4</commons-beanutils.version>
         <commons-collections.version>3.2.2</commons-collections.version>
@@ -55,7 +57,7 @@
         <cxf.version>3.5.6</cxf.version>
         <ehcache.version>2.10.9.2</ehcache.version>
         <freemarker.version>2.3.32</freemarker.version>
-        <h2.version>2.1.214</h2.version>
+        <h2.version>2.2.220</h2.version>
         <hamcrest-junit.version>2.0.0.0</hamcrest-junit.version>
         <hamcrest.version>2.2</hamcrest.version>
         <hibernate-jpa.version>1.0.2.Final</hibernate-jpa.version>
@@ -72,40 +74,43 @@
         <jakarta.xml.bind-api.version>2.3.3</jakarta.xml.bind-api.version>
         <jstl.version>1.2</jstl.version>
         <junit.version>4.13.2</junit.version>
-        <junit-jupiter.version>5.10.0-RC1</junit-jupiter.version>
+        <junit-jupiter.version>5.10.0</junit-jupiter.version>
         <junit-platform-surefire-provider.version>1.3.2</junit-platform-surefire-provider.version>
         <junitparams.version>1.1.1</junitparams.version>
-        <logback.version>1.2.11</logback.version>
-        <mysql.jdbc.version>8.0.33</mysql.jdbc.version>
+        <logback.version>1.3.8</logback.version>
+        <mysql.jdbc.version>8.1.0</mysql.jdbc.version>
         <metro.version>2.2.1-1</metro.version>
-        <mockito.version>4.10.0</mockito.version>
+        <mockito.version>4.11.0</mockito.version>
         <org.apache.santuario.xmlsec.version>2.3.3</org.apache.santuario.xmlsec.version>
         <orika.version>1.5.4</orika.version>
         <servlet-api.version>3.0.1</servlet-api.version>
-        <slf4j.version>1.7.36</slf4j.version>
+        <slf4j.version>2.0.7</slf4j.version>
         <spring-modules-jakarta-commons.version>0.8</spring-modules-jakarta-commons.version>
-        <spring-boot.version>2.7.12</spring-boot.version>
-        <spring-boot.tomcat.version>9.0.75</spring-boot.tomcat.version>
-        <spring.security.version>5.8.4</spring.security.version>
-        <spring.version>5.3.28</spring.version>
-        <xmlunit.version>2.9.0</xmlunit.version>
+        <spring-boot.version>2.7.14</spring-boot.version>
+        <spring-boot.tomcat.version>9.0.78</spring-boot.tomcat.version>
+        <spring.security.version>5.8.5</spring.security.version>
+        <spring.version>5.3.29</spring.version>
+        <xmlunit.version>2.9.1</xmlunit.version>
 
         <!-- plugins -->
         <frontend-maven-plugin.version>1.9.1</frontend-maven-plugin.version>
         <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
+        <surefire.jvm.args></surefire.jvm.args>
+        <failsafe.jvm.args></failsafe.jvm.args>
 
         <sonar.jacoco.remotePort>${jacocoRemotePort}</sonar.jacoco.remotePort>
         <sonar.jacoco.remoteAddress>${jacocoRemoteAddress}</sonar.jacoco.remoteAddress>
 
         <sonar.host.url>http://localhost:9000/sonar/</sonar.host.url>
         <sonar.language>java</sonar.language>
-
+        <jacoco.append>true</jacoco.append>
         <sonar.binaries>target/classes</sonar.binaries>
-        <sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco/jacoco.xml
-        </sonar.coverage.jacoco.xmlReportPaths>
-        <jacoco.maven.plugin.version>0.8.6</jacoco.maven.plugin.version>
+        <sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
+        <sonar.jacoco.itReportPath>${project.basedir}/../target/jacoco-it.exec</sonar.jacoco.itReportPath>
+
+        <jacoco.maven.plugin.version>0.8.9</jacoco.maven.plugin.version>
         <maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
-        <maven-failsafe-plugin.version>2.19.1</maven-failsafe-plugin.version>
+        <maven-failsafe-plugin.version>3.1.2</maven-failsafe-plugin.version>
         <sonar.exclusions>
             **/target/**,
             **/smp-angular/node_modules/**,
@@ -122,7 +127,8 @@
         </sonar.coverage.exclusions>
         <!-- latest version compatible with SonarQube 5.6 is: 3.3.0.603-->
         <sonar.maven.plugin.version>3.5.0.1254</sonar.maven.plugin.version>
-        <release.arguments>-Dmaven.javadoc.skip=true -Dmaven.test.skipTests=true -Dmaven.test.skip=true</release.arguments>
+        <release.arguments>-Dmaven.javadoc.skip=true -Dmaven.test.skipTests=true -Dmaven.test.skip=true
+        </release.arguments>
         <project.scm.id>edelivery-scm</project.scm.id>
     </properties>
 
@@ -186,7 +192,7 @@
             <dependency>
                 <groupId>eu.europa.ec.bdmsl</groupId>
                 <artifactId>bdmsl-api</artifactId>
-                <version>${bdmsl.api.version}</version>
+                <version>${bdmsl-api.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.cxf</groupId>
@@ -337,6 +343,14 @@
                 <groupId>org.springframework.security</groupId>
                 <artifactId>spring-security-cas</artifactId>
                 <version>${spring.security.version}</version>
+                <exclusions>
+                    <!-- exclude old org.bouncycastle:bcprov-jdk15on:jar:1.64 to use bcprov-jdk18on
+                     Check if this is needed when upgrading the library! -->
+                    <exclusion>
+                        <groupId>org.bouncycastle</groupId>
+                        <artifactId>bcprov-jdk15on</artifactId>
+                    </exclusion>
+                </exclusions>
             </dependency>
             <dependency>
                 <groupId>org.springframework.boot</groupId>
@@ -743,9 +757,36 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
+                    <!-- make sure methods are  always run in same order -->
                     <runOrder>alphabetical</runOrder>
+                    <argLine>-ea ${argLine}</argLine>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <configuration>
+                    <!-- ... fool Sonar to show test success for both unit and integration tests together by
+                    instructing Failsafe to store its test reports to the same directory as Surefire instead of
+                    the default failsafe-reports.
+
+                    See https://jira.sonarsource.com/browse/SONAR-7526 -->
+
+                    <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
+                    <includes>
+                        <include>**/*IT.java</include>
+                    </includes>
+                    <runOrder>alphabetical</runOrder>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>integration-test</goal>
+                            <goal>verify</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
             <!-- jacoco start -->
             <plugin>
                 <groupId>org.jacoco</groupId>
@@ -764,6 +805,16 @@
                             <goal>report</goal>
                         </goals>
                     </execution>
+                    <execution>
+                        <id>jacoco-agent-it</id>
+                        <goals>
+                            <goal>prepare-agent-integration</goal>
+                        </goals>
+                        <configuration>
+                            <destFile>${jacoco.report.it}</destFile>
+                            <propertyName>failsafeArgLine</propertyName>
+                        </configuration>
+                    </execution>
                 </executions>
             </plugin>
             <plugin>
@@ -795,7 +846,7 @@
                     <plugin>
                         <groupId>org.owasp</groupId>
                         <artifactId>dependency-check-maven</artifactId>
-                        <version>8.2.1</version>
+                        <version>8.3.1</version>
                         <inherited>false</inherited>
                         <configuration>
                             <skipProvidedScope>true</skipProvidedScope>
diff --git a/smp-angular/src/app/common/dialogs/member-dialog/member-dialog.component.html b/smp-angular/src/app/common/dialogs/member-dialog/member-dialog.component.html
index 89389b8dad06e910edfd95aae8b7b16cdd11cdce..abfac08be1f1afa53b28d472a9a48a135ad573f8 100644
--- a/smp-angular/src/app/common/dialogs/member-dialog/member-dialog.component.html
+++ b/smp-angular/src/app/common/dialogs/member-dialog/member-dialog.component.html
@@ -18,16 +18,16 @@
 
     <mat-form-field style="width:100%">
       <mat-label>Select role for the user</mat-label>
-      <mat-select placeholder="Role for the member"
+      <select matNativeControl placeholder="Role for the member"
                   formControlName="member-roleType"
                   name="Role type"
                   matTooltip="Role type for the member."
                   id="member-user_id" required>
-        <mat-option *ngFor="let role of memberRoles"
+        <option *ngFor="let role of memberRoles"
                     [value]="role.value">
           {{role.key}}
-        </mat-option>
-      </mat-select>
+        </option>
+      </select>
       <mat-hint> Choose member role</mat-hint>
     </mat-form-field>
   </form>
diff --git a/smp-angular/src/app/common/panels/user-settings-panel/user-profile-panel.component.html b/smp-angular/src/app/common/panels/user-settings-panel/user-profile-panel.component.html
index f80dcdb03338432afe21362ed8aa5bc749a568ee..8b0a8551776ece4c66d50284d307f50c445807e2 100644
--- a/smp-angular/src/app/common/panels/user-settings-panel/user-profile-panel.component.html
+++ b/smp-angular/src/app/common/panels/user-settings-panel/user-profile-panel.component.html
@@ -13,14 +13,14 @@
       <div style="display:flex; flex-direction: row;align-items: center">
         <mat-form-field style="width:100%" class="user-profile-pane-field">
           <mat-label>Application role</mat-label>
-          <mat-select formControlName="role"
+          <select matNativeControl formControlName="role"
                       matTooltip="application role for the user."
                       id="role_id" required>
-            <mat-option *ngFor="let role of applicationRoles"
+            <option *ngFor="let role of applicationRoles"
                         [value]="role.value">
               {{role.key}}
-            </mat-option>
-          </mat-select>
+            </option>
+          </select>
           <mat-hint *ngIf="!isUserDataLoggedInUserData"> Choose member role</mat-hint>
         </mat-form-field>
 
@@ -51,7 +51,7 @@
 
       <mat-form-field class="user-profile-pane-field">
         <mat-label>Theme</mat-label>
-        <select id="smpTheme_id" matNativeControl
+        <select matNativeControl id="smpTheme_id"
                 (change)="onThemeSelect($event.target.value)"
                 formControlName="smpTheme">
           <option *ngFor="let item of themeItems" [value]="item.className">{{item.name}}</option>
@@ -60,7 +60,7 @@
       <div class="user-profile-pane-field" style="display:flex;flex-direction: row">
         <mat-form-field style="flex-grow: 1">
           <mat-label>Locale (Date/time formatting)</mat-label>
-          <select id="smpLocale_id" matNativeControl id="moment-locale"
+          <select matNativeControl id="smpLocale_id"
                   (change)="onLocaleSelect($event.target.value)"
                   formControlName="smpLocale"
           >
diff --git a/smp-angular/src/app/common/row-limiter/row-limiter.component.html b/smp-angular/src/app/common/row-limiter/row-limiter.component.html
index 2374ef2dcfad2f4815a128f681236b8d9fe45309..2c1311f820592ee5b557b30b5ef17a04090f52db 100644
--- a/smp-angular/src/app/common/row-limiter/row-limiter.component.html
+++ b/smp-angular/src/app/common/row-limiter/row-limiter.component.html
@@ -1,10 +1,10 @@
 <div class="search-table-row-limiter">
-
-  <mat-select placeholder="Rows" [(ngModel)]="pageSize" name="pageSize" (selectionChange)="changePageSize($event)"
+  <select matNativeControl placeholder="Rows" [(ngModel)]="pageSize" name="pageSize"
+          (change)="changePageSize($event.target)"
              id="pagesize_id">
-    <mat-option class="row-limiter-item" *ngFor="let rowLimit of pageSizes" [value]="rowLimit.value">
-      {{rowLimit.key}}
-    </mat-option>
-  </mat-select>
+    <option class="row-limiter-item" *ngFor="let rowLimit of pageSizes" [value]="rowLimit.value">
+      {{rowLimit.value}}
+    </option>
+  </select>
 </div>
 
diff --git a/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html b/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html
index 30bbba10d5650eaa7123cc7e09b56534c8570656..b165b600d0eff4f60505b697f061bb51fc67781d 100644
--- a/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html
+++ b/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html
@@ -19,15 +19,15 @@
 
     <mat-form-field style="width:100%">
       <mat-label>Group visibility</mat-label>
-      <mat-select placeholder="Group visibility"
+      <select matNativeControl placeholder="Group visibility"
                   formControlName="visibility"
                   matTooltip="Group visibility."
                   id="group_id" required>
-        <mat-option *ngFor="let visibility of groupVisibilityOptions"
+        <option *ngFor="let visibility of groupVisibilityOptions"
                     [value]="visibility.value">
           {{visibility.key}}
-        </mat-option>
-      </mat-select>
+        </option>
+      </select>
       <mat-hint>Choose group visibility</mat-hint>
     </mat-form-field>
   </form>
diff --git a/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html b/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html
index eccb64d2615036ef2e927c667e3d2db4bb08e390..0d03841c53b65d52de768ed10e7bcbce96e8c517 100644
--- a/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html
+++ b/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html
@@ -4,17 +4,16 @@
     <b *ngIf="newMode">To create a new resource enter unique identifier and scheme and click save.</b>
     <mat-form-field style="width:100%">
       <mat-label>Selected resource type</mat-label>
-      <mat-select placeholder="Select resource type for the resource"
+      <select matNativeControl placeholder="Select resource type for the resource"
                   matTooltip="Select type for the resource."
                   id="resourceTypeIdentifier"
                   formControlName="resourceTypeIdentifier"
                   required>
-        <mat-option *ngFor="let resDef of domainResourceDefs"
+        <option *ngFor="let resDef of domainResourceDefs"
                     [value]="resDef.identifier">
           {{resDef.name}} ({{resDef.identifier}})
-        </mat-option>
-
-      </mat-select>
+        </option>
+      </select>
     </mat-form-field>
     <mat-form-field  style="width: 100%">
       <mat-label>Resource identifier</mat-label>
@@ -56,15 +55,15 @@
 
     <mat-form-field style="width:100%">
       <mat-label>Resource visibility</mat-label>
-      <mat-select placeholder="Resource visibility"
+      <select matNativeControl placeholder="Resource visibility"
                   formControlName="visibility"
                   matTooltip="Resource visibility."
                   id="visibility_id" required>
-        <mat-option *ngFor="let visibility of groupVisibilityOptions"
+        <option *ngFor="let visibility of groupVisibilityOptions"
                     [value]="visibility.value">
           {{visibility.key}}
-        </mat-option>
-      </mat-select>
+        </option>
+      </select>
     </mat-form-field>
   </form>
 </mat-dialog-content>
diff --git a/smp-angular/src/app/edit/edit-resources/resource-details-panel/resource-details-panel.component.html b/smp-angular/src/app/edit/edit-resources/resource-details-panel/resource-details-panel.component.html
index a1e73e281708448d8ee5caafec4906adbd797ecd..b6101555685908dc6482b6974a5b96a97ccb2e34 100644
--- a/smp-angular/src/app/edit/edit-resources/resource-details-panel/resource-details-panel.component.html
+++ b/smp-angular/src/app/edit/edit-resources/resource-details-panel/resource-details-panel.component.html
@@ -16,16 +16,16 @@
   <form [formGroup]="resourceForm">
     <mat-form-field style="width:100%">
       <mat-label>Resource type</mat-label>
-      <mat-select placeholder="Resource type for the resource"
+      <select matNativeControl placeholder="Resource type for the resource"
                   matTooltip="Select type for the resource."
                   id="resourceTypeIdentifier"
                   formControlName="resourceTypeIdentifier"
                   required>
-        <mat-option *ngFor="let resDef of domainResourceDefs"
+        <option *ngFor="let resDef of domainResourceDefs"
                     [value]="resDef.identifier">
           {{resDef.name}} ({{resDef.identifier}})
-        </mat-option>
-      </mat-select>
+        </option>
+      </select>
     </mat-form-field>
     <mat-form-field  style="width: 100%">
       <mat-label>Resource identifier</mat-label>
@@ -42,14 +42,14 @@
     </mat-form-field>
     <mat-form-field style="width:100%">
       <mat-label>Resource visibility</mat-label>
-      <mat-select formControlName="visibility"
+      <select matNativeControl formControlName="visibility"
                   matTooltip="Resource visibility."
                   id="visibility_id" required>
-        <mat-option *ngFor="let visibility of groupVisibilityOptions"
+        <option *ngFor="let visibility of groupVisibilityOptions"
                     [value]="visibility.value">
           {{visibility.key}}
-        </mat-option>
-      </mat-select>
+        </option>
+      </select>
     </mat-form-field>
 
     <smp-warning-panel
diff --git a/smp-angular/src/app/edit/edit-resources/resource-document-panel/resource-document-panel.component.html b/smp-angular/src/app/edit/edit-resources/resource-document-panel/resource-document-panel.component.html
index ee73c632a612d3677e863b6d0fef638af909311f..5f6392935919d1d0857ecd85d0db287b29f92635 100644
--- a/smp-angular/src/app/edit/edit-resources/resource-document-panel/resource-document-panel.component.html
+++ b/smp-angular/src/app/edit/edit-resources/resource-document-panel/resource-document-panel.component.html
@@ -35,20 +35,20 @@
       <div [formGroup]="documentForm"
            style="float: right;  vertical-align:middle;display: flex;align-items: center;justify-content: center; gap:0.4em;padding-right: 10px">
         <span style="font-size: 0.8em">Show version:</span>
-        <mat-select style="width: 100px; border-bottom: gray solid 1px"
+        <select matNativeControl style="width: 100px; border-bottom: gray solid 1px"
                     placeholder="All document version"
                     matTooltip="Select version to display."
                     formControlName="payloadVersion"
                     id="document version_id"
-                    (selectionChange)="onSelectionDocumentVersionChanged()"
+                    (change)="onSelectionDocumentVersionChanged()"
         >
-          <mat-option *ngFor="let version of getDocumentVersions"
+          <option *ngFor="let version of getDocumentVersions"
                       [value]="version"
           >
             {{version}}
-          </mat-option>
+          </option>
 
-        </mat-select>
+        </select>
       </div>
     </mat-toolbar-row>
   </mat-toolbar>
diff --git a/smp-angular/src/app/edit/edit-resources/subresource-document-panel/subresource-document-panel.component.html b/smp-angular/src/app/edit/edit-resources/subresource-document-panel/subresource-document-panel.component.html
index 47d0638fdb776cebbf18f2fc90e0096042673889..58b1b31df7897c741fe4991843e6c8c03fd64d9b 100644
--- a/smp-angular/src/app/edit/edit-resources/subresource-document-panel/subresource-document-panel.component.html
+++ b/smp-angular/src/app/edit/edit-resources/subresource-document-panel/subresource-document-panel.component.html
@@ -33,20 +33,20 @@
       <div [formGroup]="documentForm"
            style="float: right;  vertical-align:middle;display: flex;align-items: center;justify-content: center; gap:0.4em;padding-right: 10px">
         <span style="font-size: 0.8em">Show version:</span>
-        <mat-select style="width: 100px; border-bottom: gray solid 1px"
+        <select matNativeControl style="width: 100px; border-bottom: gray solid 1px"
                     placeholder="All document version"
                     matTooltip="Select version to display."
                     formControlName="payloadVersion"
                     id="document version_id"
-                    (selectionChange)="onSelectionDocumentVersionChanged()"
+                    (change)="onSelectionDocumentVersionChanged()"
         >
-          <mat-option *ngFor="let version of getDocumentVersions"
+          <option *ngFor="let version of getDocumentVersions"
                       [value]="version"
           >
             {{version}}
-          </mat-option>
+          </option>
 
-        </mat-select>
+        </select>
       </div>
     </mat-toolbar-row>
   </mat-toolbar>
diff --git a/smp-angular/src/app/edit/edit-resources/subresource-panel/resource-dialog/subresource-dialog.component.html b/smp-angular/src/app/edit/edit-resources/subresource-panel/resource-dialog/subresource-dialog.component.html
index 455ed360eb31de00b8701768b4181663e8543f85..549e92b9b9d0939262eab12c56e27fa8713ffcc0 100644
--- a/smp-angular/src/app/edit/edit-resources/subresource-panel/resource-dialog/subresource-dialog.component.html
+++ b/smp-angular/src/app/edit/edit-resources/subresource-panel/resource-dialog/subresource-dialog.component.html
@@ -4,17 +4,17 @@
     <b *ngIf="newMode">To create a new subresource enter unique identifier and scheme and click save.</b>
     <mat-form-field style="width:100%">
       <mat-label>Selected resource type</mat-label>
-      <mat-select placeholder="Select type for the subresource"
+      <select matNativeControl placeholder="Select type for the subresource"
                   matTooltip="Select type for the subresource."
                   id="subresourceTypeIdentifier"
                   formControlName="subresourceTypeIdentifier"
                   required>
-        <mat-option *ngFor="let resDef of subresourceDefs"
+        <option *ngFor="let resDef of subresourceDefs"
                     [value]="resDef.identifier">
           {{resDef.name}} ({{resDef.identifier}})
-        </mat-option>
+        </option>
 
-      </mat-select>
+      </select>
     </mat-form-field>
     <mat-form-field  style="width: 100%">
       <mat-label>Subresource identifier</mat-label>
diff --git a/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html b/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html
index a8c3e301d0020f20b58719aed23a0f5e398cbee8..a3ef8b7c4573a196bd5646f74a119ff1bd34ab58 100644
--- a/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html
+++ b/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html
@@ -34,29 +34,29 @@
     </mat-form-field>
     <mat-form-field style="width:100%">
       <mat-label>Response signature Certificate (Signature CertAlias)</mat-label>
-      <mat-select formControlName="signatureKeyAlias"
+      <select matNativeControl matInput formControlName="signatureKeyAlias"
                   matTooltip="Certificate is used for signing REST responses for the domain."
                   id="signatureKeyAlias_id">
-        <mat-option [value]="''" ></mat-option>
-        <mat-option *ngFor="let cert of keystoreCertificates" [value]="cert.alias">
+        <option [value]="''" ></option>
+        <option *ngFor="let cert of keystoreCertificates" [value]="cert.alias">
           {{cert.alias}} ({{cert.certificateId}})
-        </mat-option>
-      </mat-select>
+        </option>
+      </select>
       <mat-hint align="end">Empty value will cause that Resource responses will not be signed by SMP!
       </mat-hint>
     </mat-form-field>
 
     <mat-form-field style="width:100%">
       <mat-label>Visibility of the domain</mat-label>
-      <mat-select  formControlName="visibility"
+      <select matNativeControl formControlName="visibility"
                   name="visibility"
                   matTooltip="Visibility of the domain."
                   id="domainVisibility_id">
-        <mat-option *ngFor="let visibility of domainVisibilityOptions"
+        <option *ngFor="let visibility of domainVisibilityOptions"
                     [value]="visibility.value">
           {{visibility.key}}
-        </mat-option>
-      </mat-select>
+        </option>
+      </select>
       <mat-hint align="end">Domain visibility. In case of Internal user must be authenticated
         to get read the domain resources
       </mat-hint>
@@ -64,15 +64,15 @@
 
   <mat-form-field *ngIf="domainResourceTypes?.length" style="width:100%">
     <mat-label>Default resource type for the domain</mat-label>
-    <mat-select formControlName="defaultResourceTypeIdentifier"
+    <select matNativeControl formControlName="defaultResourceTypeIdentifier"
                 matTooltip="Default resource type for the domain."
                 id="domainDefaultResourceType_id">
-      <mat-option [value]="''" disabled></mat-option>
-      <mat-option *ngFor="let resDef of domainResourceTypes"
+      <option [value]="''" disabled></option>
+      <option *ngFor="let resDef of domainResourceTypes"
                   [value]="resDef.identifier">
         {{resDef.name}} ({{resDef.identifier}})
-      </mat-option>
-    </mat-select>
+      </option>
+    </select>
     <mat-hint align="end">Domain visibility. In case of Internal user must be authenticated
       to get read the domain resources
     </mat-hint>
diff --git a/smp-resource-extensions/oasis-cppa3-spi/src/test/java/eu/europa/ec/smp/spi/utils/DatatypeConverterTest.java b/smp-resource-extensions/oasis-cppa3-spi/src/test/java/eu/europa/ec/smp/spi/utils/DatatypeConverterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..476d3f9c9e35b26bfddeb3b4f1930ccf35f968d5
--- /dev/null
+++ b/smp-resource-extensions/oasis-cppa3-spi/src/test/java/eu/europa/ec/smp/spi/utils/DatatypeConverterTest.java
@@ -0,0 +1,47 @@
+package eu.europa.ec.smp.spi.utils;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+
+import java.time.OffsetDateTime;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class DatatypeConverterTest {
+
+    @ParameterizedTest
+    @CsvSource({"2020,1,1,10,0,1, 2020-01-01T10:00:00.000+01:00",
+            "2020,1,1,10,0,-1, 2020-01-01T10:00:00.000-01:00",
+            "2020,2,1,10,0,1, 2020-02-01T10:00:00.000+01:00",
+            "2020,1,2,10,0,1, 2020-01-02T10:00:00.000+01:00",
+            "2020,1,1,12,0,1, 2020-01-01T12:00:00.000+01:00",
+            "2020,1,1,10,1,1, 2020-01-01T10:01:00.000+01:00",
+            "2020,1,1,10,1,1, 2020-01-01T10:01:00+01:00",
+            "2020,1,1,10,1,1, 2020-01-01T10:01+01:00",
+            "2020,1,1,10,0,0, 2020-01-01T10:00:00Z"})
+    void parseDateTime(int year, int mont, int day, int hour, int minutes, int offset, String value) {
+        OffsetDateTime dateTime = DatatypeConverter.parseDateTime(value);
+        assertNotNull(dateTime);
+        assertEquals(year, dateTime.getYear());
+        assertEquals(mont, dateTime.getMonthValue());
+        assertEquals(day, dateTime.getDayOfMonth());
+        assertEquals(hour, dateTime.getHour());
+        assertEquals(minutes, dateTime.getMinute());
+        assertEquals(offset, dateTime.getOffset().getTotalSeconds() / 3600);
+    }
+
+    @Test
+    void printDateTime() {
+
+        String value = DatatypeConverter.printDateTime(OffsetDateTime.now());
+        assertNotNull(value);
+    }
+
+    @Test
+    void printDate() {
+        String value = DatatypeConverter.printDate(OffsetDateTime.now());
+        assertNotNull(value);
+    }
+}
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java
index fbf31f7af0d7fc4fb1509751bae0a6a99a81d8c6..43ce5a29d5a63ce5e6409243cb832cc75b6fcb60 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java
@@ -1,6 +1,5 @@
 package eu.europa.ec.edelivery.smp.auth;
 
-import eu.europa.ec.edelivery.security.utils.SecurityUtils;
 import eu.europa.ec.edelivery.smp.logging.SMPLogger;
 import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory;
 import org.springframework.security.authentication.AbstractAuthenticationToken;
@@ -17,7 +16,6 @@ import java.util.Objects;
  * @since 4.2
  */
 public class UILoginAuthenticationToken extends UsernamePasswordAuthenticationToken {
-    private static final SMPLogger LOG = SMPLoggerFactory.getLogger(UILoginAuthenticationToken.class);
     SMPUserDetails userDetails;
 
     public UILoginAuthenticationToken(Object principal, Object credentials, SMPUserDetails userDetails) {
@@ -26,15 +24,6 @@ public class UILoginAuthenticationToken extends UsernamePasswordAuthenticationTo
         this.userDetails = userDetails;
     }
 
-    public SecurityUtils.Secret getSecret() {
-
-        if (userDetails == null) {
-            LOG.warn("Can not retrieve security token for session. User details is null!");
-            return null;
-        }
-        return userDetails.getSessionSecret();
-    }
-
     public SMPUserDetails getUserDetails() {
         return userDetails;
     }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializer.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializer.java
index 90dbf3ee8811968457013074221767e55f5a237c..d47627c51d59f2c70b928effc6876d42ca15590d 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializer.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializer.java
@@ -102,10 +102,10 @@ public class SMPExtensionInitializer implements InitializingBean {
         Optional<DBResourceDef> resourceDef = resourceDefDao.getResourceDefByIdentifier(resourceDefinitionSpi.identifier());
         if (resourceDef.isPresent()) {
             DBResourceDef dbResourceDef = resourceDef.get();
-            if (StringUtils.equals(extension.getIdentifier(),dbResourceDef.getExtension().getIdentifier() )) {
+            if (dbResourceDef.getExtension()!=null && StringUtils.equals(extension.getIdentifier(),dbResourceDef.getExtension().getIdentifier() )) {
                 updateResourceSPI(resourceDefinitionSpi, dbResourceDef);
             } else {
-                LOG.error("Skip resource definition update due to extension missmatch! ResourceDefinition [{}] is already registered for extension [{}]. The current resource extension identifier is [{}]!",
+                LOG.error("Skip resource definition update due to extension mismatch! ResourceDefinition [{}] is already registered for extension [{}]. The current resource extension identifier is [{}]!",
                         resourceDefinitionSpi,
                         extension,
                         dbResourceDef.getExtension());
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CredentialROToDBCredentialConverter.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CredentialROToDBCredentialConverter.java
index 2774ac1d8c8e62c80625c73c0c33e831152651df..a9cf0e51dde8aed25bbaefd3e78730a83c913c95 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CredentialROToDBCredentialConverter.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CredentialROToDBCredentialConverter.java
@@ -22,6 +22,7 @@ public class CredentialROToDBCredentialConverter implements Converter<Credential
             target.setId(SessionSecurityUtils.decryptEntityId(source.getCredentialId()));
         }
         target.setName(source.getName());
+        target.setCredentialType(source.getCredentialType());
         target.setActive(source.isActive());
         target.setDescription(source.getDescription());
         target.setSequentialLoginFailureCount(source.getSequentialLoginFailureCount());
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/DBCredentialToCredentialROConverter.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/DBCredentialToCredentialROConverter.java
index 2786afad971f887bfff77857e8893d1331066fb0..aab6577eb020ce9206653b91ce563ad9fa4b9243 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/DBCredentialToCredentialROConverter.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/DBCredentialToCredentialROConverter.java
@@ -31,6 +31,7 @@ public class DBCredentialToCredentialROConverter implements Converter<DBCredenti
         target.setCredentialId(SessionSecurityUtils.encryptedEntityId(source.getId()));
         target.setName(source.getName());
         target.setActive(source.isActive());
+        target.setCredentialType(source.getCredentialType());
         target.setDescription(source.getDescription());
         target.setSequentialLoginFailureCount(source.getSequentialLoginFailureCount());
         target.setLastFailedLoginAttempt(source.getLastFailedLoginAttempt());
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java
index 6294be956a4fc57d1f98dc5555d51c8e162ac030..2d78534424af3f65476356ccde2b7e50e9a3a3b3 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java
@@ -16,13 +16,12 @@ package eu.europa.ec.edelivery.smp.data.dao;
 import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType;
 import eu.europa.ec.edelivery.smp.data.model.DBDomain;
 import eu.europa.ec.edelivery.smp.data.model.DBGroup;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.persistence.NoResultException;
 import javax.persistence.NonUniqueResultException;
 import javax.persistence.TypedQuery;
-import org.springframework.transaction.annotation.Transactional;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
@@ -30,8 +29,8 @@ import java.util.Optional;
 import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*;
 import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.ILLEGAL_STATE_DOMAIN_GROUP_MULTIPLE_ENTRY;
 import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.ILLEGAL_STATE_DOMAIN_MULTIPLE_ENTRY;
-import static org.apache.commons.lang3.StringUtils.*;
 import static org.apache.commons.lang3.StringUtils.lowerCase;
+import static org.apache.commons.lang3.StringUtils.trim;
 
 /**
  * The group of resources with shared resource management rights. The user with group admin has rights to create/delete
@@ -74,9 +73,8 @@ public class GroupDao extends BaseDao<DBGroup> {
     /**
      * Returns the group or Optional.empty() if there is no group for name and domain.
      *
-     * @param name is the group name
+     * @param name   is the group name
      * @param domain where the group is registered
-     *
      * @return the only single record for name  from smp_group table or empty value
      * @throws IllegalStateException if no group is not configured
      */
@@ -87,9 +85,8 @@ public class GroupDao extends BaseDao<DBGroup> {
     /**
      * Returns the group or Optional.empty() if there is no group for name and domain.
      *
-     * @param name is the group name
+     * @param name     is the group name
      * @param domainId where the group is registered
-     *
      * @return the only single record for name  from smp_group table or empty value
      * @throws IllegalStateException if no group is not configured
      */
@@ -102,7 +99,7 @@ public class GroupDao extends BaseDao<DBGroup> {
         } catch (NoResultException e) {
             return Optional.empty();
         } catch (NonUniqueResultException e) {
-            throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_GROUP_MULTIPLE_ENTRY.getMessage(name,domainId));
+            throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_GROUP_MULTIPLE_ENTRY.getMessage(name, domainId));
         }
     }
 
@@ -110,9 +107,8 @@ public class GroupDao extends BaseDao<DBGroup> {
     /**
      * Returns the group or Optional.empty() if there is no group for name and domain code
      *
-     * @param name is the group name
+     * @param name       is the group name
      * @param domainCode where the group is registered
-     *
      * @return the only single record for name  from smp_group table or empty value
      * @throws IllegalStateException if no group is not configured
      */
@@ -125,7 +121,7 @@ public class GroupDao extends BaseDao<DBGroup> {
         } catch (NoResultException e) {
             return Optional.empty();
         } catch (NonUniqueResultException e) {
-            throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_MULTIPLE_ENTRY.getMessage(name,domainCode));
+            throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_MULTIPLE_ENTRY.getMessage(name, domainCode));
         }
     }
 
@@ -178,8 +174,8 @@ public class GroupDao extends BaseDao<DBGroup> {
         return false;
     }
 
-    public List<MembershipRoleType> toList(MembershipRoleType ... roleTypes){
-        return Arrays.asList(roleTypes ==null || roleTypes.length==0 ?MembershipRoleType.values(): roleTypes);
+    public List<MembershipRoleType> toList(MembershipRoleType... roleTypes) {
+        return Arrays.asList(roleTypes == null || roleTypes.length == 0 || roleTypes[0] == null ? MembershipRoleType.values() : roleTypes);
     }
 
 }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java
index fb01b3807a150a33f458b1f4164a2d2646aa4d41..bb508d13412924f8d43c56f08460ef8a262b532e 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java
@@ -180,88 +180,4 @@ public class ResourceDao extends BaseDao<DBResource> {
     public void remove(DBResource resource) {
         removeById(resource.getId());
     }
-
-
-    public long getServiceGroupCount(ResourceFilter filters) {
-
-        CriteriaQuery<Long> cqCount = createSearchCriteria(filters, true,
-                null,
-                null);
-        return memEManager.createQuery(cqCount).getSingleResult();
-    }
-
-    public List<DBResource> getServiceGroupList(int startingAt, int maxResultCnt,
-                                                String sortField,
-                                                String sortOrder, ResourceFilter filters) {
-
-        List<DBResource> lstResult;
-        try {
-            CriteriaQuery<DBResource> cq = createSearchCriteria(filters,
-                    false, sortField,
-                    sortOrder);
-            TypedQuery<DBResource> q = memEManager.createQuery(cq);
-            if (maxResultCnt > 0) {
-                q.setMaxResults(maxResultCnt);
-            }
-            if (startingAt > 0) {
-                q.setFirstResult(startingAt);
-            }
-            lstResult = q.getResultList();
-        } catch (NoResultException ex) {
-            lstResult = new ArrayList<>();
-        }
-        return lstResult;
-    }
-
-    protected CriteriaQuery createSearchCriteria(ResourceFilter searchParams,
-                                                 boolean forCount, String sortField, String sortOrder) {
-        CriteriaBuilder cb = memEManager.getCriteriaBuilder();
-        CriteriaQuery cq = forCount ? cb.createQuery(Long.class) : cb.createQuery(DBResource.class);
-        Root<DBResource> serviceGroup = cq.from(DBResource.class);
-        if (forCount) {
-            cq.select(cb.count(serviceGroup));
-        } else if (sortField != null) {
-            if (sortOrder != null && sortOrder.equalsIgnoreCase("desc")) {
-                cq.orderBy(cb.asc(serviceGroup.get(sortField)));
-            } else {
-                cq.orderBy(cb.desc(serviceGroup.get(sortField)));
-            }
-        } else {
-            if (!StringUtils.isBlank(defaultSortMethod)) {
-                cq.orderBy(cb.desc(serviceGroup.get(defaultSortMethod)));
-            }
-        }
-
-        Join<DBResource, DBDomainResourceDef> serviceGroupJoinServiceGroupDomain = null;
-        Predicate ownerPredicate = null;
-        if (searchParams != null) {
-
-            if (searchParams.getDomain() != null) {
-                serviceGroupJoinServiceGroupDomain = serviceGroup.join("serviceGroupDomains", JoinType.INNER);
-                serviceGroupJoinServiceGroupDomain = serviceGroupJoinServiceGroupDomain.on(cb.equal(serviceGroupJoinServiceGroupDomain.get("domain"), searchParams.getDomain()));
-            }
-            // limit for owner
-            if (searchParams.getOwner() != null) {
-                ownerPredicate = cb.equal(serviceGroup.join("users"), searchParams.getOwner());
-            }
-        }
-
-        // set order by
-        if (searchParams != null) {
-            List<Predicate> lstPredicate = createPredicates(searchParams, serviceGroup, cb);
-
-            if (serviceGroupJoinServiceGroupDomain != null) {
-                lstPredicate.add(serviceGroupJoinServiceGroupDomain.getOn());
-            }
-            if (ownerPredicate != null) {
-                lstPredicate.add(ownerPredicate);
-            }
-
-            if (!lstPredicate.isEmpty()) {
-                Predicate[] tblPredicate = lstPredicate.stream().toArray(Predicate[]::new);
-                cq.where(cb.and(tblPredicate));
-            }
-        }
-        return cq;
-    }
 }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ErrorRO.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ErrorRO.java
deleted file mode 100644
index 52c96ce9d501a153b5bf8a34560e05873a0274ea..0000000000000000000000000000000000000000
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ErrorRO.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package eu.europa.ec.edelivery.smp.data.ui;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.json.JsonMapper;
-
-import java.io.Serializable;
-
-/**
- * @author Sebastian-Ion TINCU
- * @since 4.0.1
- */
-public class ErrorRO implements Serializable {
-
-    protected String message;
-
-    public ErrorRO(String message) {
-        this.message = message;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    @JsonIgnore
-    public int getContentLength() {
-        try {
-            return JsonMapper.builder()
-                    .findAndAddModules()
-                    .build().writeValueAsString(this).length();
-        } catch (JsonProcessingException e) {
-            return -1;
-        }
-    }
-}
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java
index 08eff34c92e50ca8f2631973abc2ce7ccf8eed73..2e903b54c161f15ef425e7ee79913216489d708e 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java
@@ -58,13 +58,16 @@ public class DomainGuard {
      * Purpose of the method is to guard domain resources. It validates if users has any "rights to" execute the action
      * on the domain resources and subresources
      *
-     * @param user
-     * @param action
-     * @param domain
-     * @return
+     * @param user  user to be authorized
+     * @param action action to be executed
+     * @param domain domain to be authorized
+     * @return true if user is authorized to execute the action on the domain
      */
     public boolean isUserIsAuthorizedForDomainResourceAction(DBDomain domain, SMPUserDetails user, ResourceAction action) {
         LOG.debug("Authorize check for user [{}], domain [{}] and action [{}]", user, domain, action);
+        if (action == null) {
+            throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Null http action", "Action cannot be null!");
+        }
         switch (action) {
             case READ:
                 return canRead(user, domain);
@@ -109,10 +112,9 @@ public class DomainGuard {
      * Method validates of the user can delete resources on the domain! Only users with group admin role can delete
      * domain resources
      *
-     *
-     * @param user
-     * @param domain
-     * @return
+     * @param user    user to be authorized
+     * @param domain domain to be authorized
+     * @return true if user is authorized to execute the action on the domain
      */
     public boolean canDelete(SMPUserDetails user, DBDomain domain) {
         LOG.info(SMPLogger.SECURITY_MARKER, "User: [{}] is trying to delete resource from domain: [{}]", user, domain);
@@ -131,9 +133,9 @@ public class DomainGuard {
      * Method validates of the user can create/update resources on the domain! Only users with group admin role can create and users with admin resource role
      * can update
      *
-     * @param user
-     * @param domain
-     * @return
+     * @param user   user to be authorized
+     * @param domain domain to be authorized
+     * @return  true if user is authorized to execute the action on the domain
      */
     public boolean canCreateUpdate(SMPUserDetails user, DBDomain domain) {
         LOG.info(SMPLogger.SECURITY_MARKER, "User: [{}] is trying to create/update resource from domain: [{}]", user, domain);
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java
index d2380cebac02249cf4b3919b611e40e8f00c0d6b..ec76779bf0db9252cd136eee26275f4f67264f53 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java
@@ -14,7 +14,6 @@ import eu.europa.ec.edelivery.smp.data.model.doc.DBSubresource;
 import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
 import eu.europa.ec.edelivery.smp.exceptions.ErrorCode;
 import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
-import eu.europa.ec.edelivery.smp.identifiers.Identifier;
 import eu.europa.ec.edelivery.smp.logging.SMPLogger;
 import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory;
 import eu.europa.ec.edelivery.smp.servlet.ResourceAction;
@@ -41,7 +40,6 @@ public class ResourceGuard {
         this.identifierService = identifierService;
     }
 
-
     /**
      * Method validates if the user is authorized for action on the resource
      *
@@ -118,16 +116,6 @@ public class ResourceGuard {
             LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] authorized: [{}] to read private resource [{}]", user, isResourceMember, resource);
             return isResourceMember;
         }
-        /*
-        // if resource is internal the domain, group members and resource member can see it
-        if (resource.getVisibility() == VisibilityType.INTERNAL) {
-
-            boolean isAuthorized = domainMemberDao.isUserDomainMember(dbuser, resource.getDomainResourceDef().getDomain())
-                    || groupMemberDao.isUserGroupMember(dbuser, Collections.singletonList(resource.getGroup()));
-            LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] authorized: [{}] to read internal resource [{}]", user, isAuthorized, resource);
-            return isAuthorized;
-        }
-*/
         LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] is not authorized to read resource [{}]", user, resource);
         return false;
     }
@@ -192,19 +180,4 @@ public class ResourceGuard {
         // Subresource can be created by the resource admin, the same as for update
         return canUpdate(user, subresource);
     }
-
-    /**
-     * Method validates if any of the service group users contains userID
-     *
-     * @param userId
-     * @param dbServiceGroup
-     * @return
-     */
-    public boolean isResourceAdmin(Long userId, DBResource dbServiceGroup) {
-       /* return dbServiceGroup != null &&
-                dbServiceGroup.getUsers().stream().filter(user -> user.getId().equals(userId)).findAny().isPresent();
-
-        */
-        return false;
-    }
 }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CRLVerifierService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CRLVerifierService.java
index 0aec603989ff87b1d94ba897510ca51323dba40d..0fcdc3558951529d82eade5bb82245bbf2c5ee1e 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CRLVerifierService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CRLVerifierService.java
@@ -39,7 +39,6 @@ import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.BasicCredentialsProvider;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.security.auth.x500.X500Principal;
@@ -66,9 +65,12 @@ public class CRLVerifierService implements ICRLVerifierService {
     private static final X500Principal NULL_ISSUER = new X500Principal("");
     private static final CRLReason NULL_CRL_REASON = CRLReason.UNSPECIFIED;
 
-    @Autowired
-    ConfigurationService configurationService;
 
+    protected final ConfigurationService configurationService;
+
+    public CRLVerifierService(ConfigurationService configurationService) {
+        this.configurationService = configurationService;
+    }
 
     @Override
     public void verifyCertificateCRLs(X509Certificate cert) throws CertificateRevokedException, CertificateParsingException {
@@ -156,13 +158,13 @@ public class CRLVerifierService implements ICRLVerifierService {
                 crl = (X509CRL) cf.generateCRL(crlStream);
             }
         } catch (IOException e) {
-            exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Can not download CRL '" + crlURL+"'"
+            exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Can not download CRL '" + crlURL + "'"
                     , ExceptionUtils.getRootCauseMessage(e), e);
         } catch (CertificateException e) {
-            exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "CRL list is not supported '" + crlURL+"'"
+            exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "CRL list is not supported '" + crlURL + "'"
                     , ExceptionUtils.getRootCauseMessage(e), e);
         } catch (CRLException e) {
-            exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "CRL can not be read: '" + crlURL+"'"
+            exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "CRL can not be read: '" + crlURL + "'"
                     , ExceptionUtils.getRootCauseMessage(e), e);
         } catch (SMPRuntimeException exc) {
             exception = exc;
@@ -201,7 +203,7 @@ public class CRLVerifierService implements ICRLVerifierService {
             }
             return inputStream;
         } catch (Exception exc) {
-            throw new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Error occurred while downloading CRL:'" + crlURL+"'", ExceptionUtils.getRootCauseMessage(exc) );
+            throw new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Error occurred while downloading CRL:'" + crlURL + "'", ExceptionUtils.getRootCauseMessage(exc));
         }
     }
 
@@ -235,7 +237,7 @@ public class CRLVerifierService implements ICRLVerifierService {
         return execute(HttpClients.createDefault(), new HttpGet(url));
     }
 
-    private InputStream execute(CloseableHttpClient httpclient, HttpGet httpget) throws IOException {
+    protected InputStream execute(CloseableHttpClient httpclient, HttpGet httpget) throws IOException {
         try (CloseableHttpResponse response = httpclient.execute(httpget)) {
             return IOUtils.loadIntoBAIS(response.getEntity().getContent());
         }
@@ -250,14 +252,14 @@ public class CRLVerifierService implements ICRLVerifierService {
         return true;
     }
 
-    private boolean isValidParameter(String... parameters) {
+    protected boolean isValidParameter(String... parameters) {
         if (parameters == null || parameters.length == 0) {
             return false;
         }
 
         for (String parameter : Arrays.asList(parameters)) {
 
-            if (StringUtils.isEmpty(parameter)) {
+            if (StringUtils.isBlank(parameter)) {
                 return false;
             }
         }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java
index 37147ec79a9fce9706173e4e102a56865cb8e57d..88b802f49108dd9f4dec0c9964ad6a655f50b3a4 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java
@@ -134,7 +134,7 @@ public class ResourceHandlerService extends AbstractResourceHandler {
             }
         }
         // set headers to response
-        responseData.getHttpHeaders().entrySet().stream()
+        responseData.getHttpHeaders().entrySet()
                 .forEach(entry -> resourceResponse.setHttpHeader(entry.getKey(), entry.getValue()));
         // determinate status before resource is stored to database!
         resourceResponse.setHttpStatus(getHttpStatusForCreateUpdate(isNewResource, responseData));
@@ -232,7 +232,7 @@ public class ResourceHandlerService extends AbstractResourceHandler {
         // locate the resource handler
         ResolvedData resolvedData = resourceRequest.getResolvedData();
         DBResource resource = resolvedData.getResource();
-        integrationService.unregisterParticipant(resource, resolvedData.domain);
+        integrationService.unregisterParticipant(resource, resolvedData.getDomain());
         resourceStorage.deleteResource(resource);
     }
 
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java
index 9a01a2a4de7cc51fd84fba071fc8ee84e17bf178..6e1f671dbfd889216d01b26b16468b2e4fe39109 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java
@@ -23,6 +23,7 @@ import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.INVALID_OWNER;
 import static org.apache.commons.lang3.StringUtils.isNotBlank;
 
 /**
+ *
  * @author Joze Rihtarsic
  * @since 5.0
  */
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentService.java
index 4c065b953ce214dd5b74772c525d9277bee450b4..6cac6bc4792ff4d925bd8a71c6aaaade81de1c1b 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentService.java
@@ -134,28 +134,19 @@ public class UIDocumentService {
         }
 
         DBDocument document = resource.getDocument();
-        int version = document.getDocumentVersions().stream().mapToInt(dv -> dv.getVersion())
-                .max().orElse(0);
-
-        DBDocumentVersion documentVersion = new DBDocumentVersion();
-        documentVersion.setVersion(version + 1);
-        documentVersion.setDocument(document);
-        documentVersion.setContent(bos.toByteArray());
-        document.getDocumentVersions().add(documentVersion);
-        document.setCurrentVersion(documentVersion.getVersion());
-        return convert(document, documentVersion);
+        return createNewVersionAndConvert(document, bos);
     }
 
     @Transactional
     public DocumentRo saveSubresourceDocumentForResource(Long subresource, Long resourceId, DocumentRo documentRo) {
 
         DBResource parentResource = resourceDao.find(resourceId);
-        DBSubresource enitity = subresourceDao.find(subresource);
-        DBSubresourceDef subresourceDef = enitity.getSubresourceDef();
+        DBSubresource entity = subresourceDao.find(subresource);
+        DBSubresourceDef subresourceDef = entity.getSubresourceDef();
         ResourceHandlerSpi resourceHandler = resourceHandlerService.getSubresourceHandler(subresourceDef, subresourceDef.getResourceDef());
         RequestData data = resourceHandlerService.buildRequestDataForSubResource(
                 parentResource.getDomainResourceDef().getDomain(), parentResource,
-                enitity, new ByteArrayInputStream(documentRo.getPayload().getBytes()));
+                entity, new ByteArrayInputStream(documentRo.getPayload().getBytes()));
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ResponseData responseData = new SpiResponseData(bos);
         try {
@@ -164,18 +155,8 @@ public class UIDocumentService {
             throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "StoreSubresourceValidation", ExceptionUtils.getRootCauseMessage(e));
         }
 
-        DBDocument document = enitity.getDocument();
-        ;
-        int version = document.getDocumentVersions().stream().mapToInt(dv -> dv.getVersion())
-                .max().orElse(0);
-
-        DBDocumentVersion documentVersion = new DBDocumentVersion();
-        documentVersion.setVersion(version + 1);
-        documentVersion.setDocument(document);
-        documentVersion.setContent(bos.toByteArray());
-        document.getDocumentVersions().add(documentVersion);
-        document.setCurrentVersion(documentVersion.getVersion());
-        return convert(document, documentVersion);
+        DBDocument document = entity.getDocument();
+        return createNewVersionAndConvert(document, bos);
     }
 
     /**
@@ -190,33 +171,41 @@ public class UIDocumentService {
     public DocumentRo getDocumentForResource(Long resourceId, int version) {
         DBResource resource = resourceDao.find(resourceId);
         DBDocument document = resource.getDocument();
-        DBDocumentVersion documentVersion = null;
-        DBDocumentVersion currentVersion = null;
-
-
-        for (DBDocumentVersion dv : document.getDocumentVersions()) {
-            if (dv.getVersion() == version) {
-                documentVersion = dv;
-            }
-            if (dv.getVersion() == document.getCurrentVersion()) {
-                currentVersion = dv;
-            }
-        }
-        documentVersion = documentVersion == null ? currentVersion : documentVersion;
-        if (documentVersion == null && !document.getDocumentVersions().isEmpty()) {
-            documentVersion = document.getDocumentVersions().get(document.getDocumentVersions().size() - 1);
-        }
-        return convert(document, documentVersion);
+        return convertWithVersion(document, version);
     }
 
     @Transactional
     public DocumentRo getDocumentForSubResource(Long subresourceId, Long resourceId, int version) {
         DBSubresource subresource = subresourceDao.find(subresourceId);
         DBDocument document = subresource.getDocument();
-        DBDocumentVersion documentVersion = null;
-        DBDocumentVersion currentVersion = null;
+        return convertWithVersion(document, version);
+    }
 
+    /**
+     * return Create new Document version and convert DBDocument  to DocumentRo
+     *
+     * @param document to convert to DocumentRo
+     * @param baos     to write document content
+     * @return DocumentRo
+     */
+    private DocumentRo createNewVersionAndConvert(DBDocument document, ByteArrayOutputStream baos) {
 
+        // get max version
+        int version = document.getDocumentVersions().stream().mapToInt(dv -> dv.getVersion())
+                .max().orElse(0);
+
+        DBDocumentVersion documentVersion = new DBDocumentVersion();
+        documentVersion.setVersion(version + 1);
+        documentVersion.setDocument(document);
+        documentVersion.setContent(baos.toByteArray());
+        document.getDocumentVersions().add(documentVersion);
+        document.setCurrentVersion(documentVersion.getVersion());
+        return convert(document, documentVersion);
+    }
+
+    public DocumentRo convertWithVersion(DBDocument document,  int version) {
+        DBDocumentVersion currentVersion = null;
+        DBDocumentVersion documentVersion = null;
         for (DBDocumentVersion dv : document.getDocumentVersions()) {
             if (dv.getVersion() == version) {
                 documentVersion = dv;
@@ -234,6 +223,7 @@ public class UIDocumentService {
 
     public DocumentRo convert(DBDocument document, DBDocumentVersion version) {
         DocumentRo documentRo = new DocumentRo();
+        // set list of versions
         document.getDocumentVersions().forEach(dv ->
                 documentRo.getAllVersions().add(dv.getVersion()));
 
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java
index ad78a9ac6498de4891aa38f38bd820454b5f4715..2141a2025881b57840c29e41f19757408b8c0ef4 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java
@@ -41,7 +41,7 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
     private final ConversionService conversionService;
 
 
-    public UIDomainPublicService(DomainDao domainDao, DomainMemberDao domainMemberDao,ConversionService conversionService, UserDao userDao) {
+    public UIDomainPublicService(DomainDao domainDao, DomainMemberDao domainMemberDao, ConversionService conversionService, UserDao userDao) {
         this.domainDao = domainDao;
         this.domainMemberDao = domainMemberDao;
         this.conversionService = conversionService;
@@ -56,12 +56,12 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
     /**
      * Method returns Domain resource object list for page.
      *
-     * @param page
-     * @param pageSize
-     * @param sortField
-     * @param sortOrder
-     * @param filter
-     * @return
+     * @param page     - page number
+     * @param pageSize - page size
+     * @param sortField - sort field
+     * @param sortOrder - sort order
+     * @param filter  - filter
+     * @return ServiceResult<DomainPublicRO> - list of domain resource objects
      */
     @Override
     public ServiceResult<DomainPublicRO> getTableList(int page, int pageSize,
@@ -94,18 +94,18 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
 
     @Transactional
     public ServiceResult<MemberRO> getDomainMembers(Long domainId, int page, int pageSize,
-                                                   String filter) {
+                                                    String filter) {
         Long count = domainMemberDao.getDomainMemberCount(domainId, filter);
-        ServiceResult<MemberRO> result =  new ServiceResult<>();
+        ServiceResult<MemberRO> result = new ServiceResult<>();
         result.setPage(page);
         result.setPageSize(pageSize);
-        if (count<1) {
+        if (count < 1) {
             result.setCount(0L);
             return result;
         }
         result.setCount(count);
         List<DBDomainMember> memberROS = domainMemberDao.getDomainMembers(domainId, page, pageSize, filter);
-        List<MemberRO> memberList = memberROS.stream().map(member-> conversionService.convert(member, MemberRO.class)).collect(Collectors.toList());
+        List<MemberRO> memberList = memberROS.stream().map(member -> conversionService.convert(member, MemberRO.class)).collect(Collectors.toList());
 
         result.getServiceEntities().addAll(memberList);
         return result;
@@ -115,18 +115,18 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
     public MemberRO addMemberToDomain(Long domainId, MemberRO memberRO, Long memberId) {
         LOG.info("Add member [{}] to domain [{}]", memberRO.getUsername(), domainId);
         DBUser user = userDao.findUserByUsername(memberRO.getUsername())
-                .orElseThrow(() -> new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add/edit membership", "User ["+memberRO.getUsername()+"] does not exists!"));
+                .orElseThrow(() -> new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add/edit membership", "User [" + memberRO.getUsername() + "] does not exists!"));
 
         DBDomainMember domainMember;
-        if (memberId !=null) {
+        if (memberId != null) {
             domainMember = domainMemberDao.find(memberId);
             domainMember.setRole(memberRO.getRoleType());
         } else {
             DBDomain domain = domainDao.find(domainId);
             if (domainMemberDao.isUserDomainMember(user, domain)) {
-                throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add membership", "User ["+memberRO.getUsername()+"] is already a member!");
+                throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add membership", "User [" + memberRO.getUsername() + "] is already a member!");
             }
-            domainMember = domainMemberDao.addMemberToDomain(domain, user,memberRO.getRoleType() );
+            domainMember = domainMemberDao.addMemberToDomain(domain, user, memberRO.getRoleType());
         }
         return conversionService.convert(domainMember, MemberRO.class);
     }
@@ -138,7 +138,7 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
         if (domainMember == null) {
             throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Membership", "Membership does not exists!");
         }
-        if (!Objects.equals(domainMember.getDomain().getId(),domainId  )){
+        if (!Objects.equals(domainMember.getDomain().getId(), domainId)) {
             throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Membership", "Membership does not belong to domain!");
         }
 
@@ -156,7 +156,7 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
 
         //filter and validate resources to be removed
         List<DBDomainResourceDef> domainResourceDefs = domain.getDomainResourceDefs();
-        return domainResourceDefs.stream().map(domRef -> domRef.getResourceDef()).map(resourceDef ->
+        return domainResourceDefs.stream().map(DBDomainResourceDef::getResourceDef).map(resourceDef ->
                 conversionService.convert(resourceDef, ResourceDefinitionRO.class)).collect(Collectors.toList());
     }
 }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java
index 1ffceef42929acde004e4714f735a533b2ef82e7..a64af55725d027271146489f2fb2ded8de5a6235 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java
@@ -100,6 +100,9 @@ public class UIDomainService extends UIServiceBase<DBDomain, DomainRO> {
 
     @Transactional
     public void createDomainData(DomainRO data) {
+        if (StringUtils.isBlank(data.getDomainCode())){
+            throw new SMPRuntimeException(ErrorCode.INVALID_DOMAIN_DATA, "Domain code must not be empty!");
+        };
 
         if (domainDao.getDomainByCode(data.getDomainCode()).isPresent()){
             throw new SMPRuntimeException(ErrorCode.INVALID_DOMAIN_DATA, "Domain with code ["+data.getDomainCode()+"] already exists!");
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceService.java
index 5f2a03cf70781b053a3e0bfba733a3717ce783f4..b2c4e3e1ddb6ba501ecb234da308e04c78b29d3a 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceService.java
@@ -191,7 +191,7 @@ public class UIResourceService {
 
         Optional<DBResource> existResource = resourceDao.getResource(resourceIdentifier.getValue(),resourceIdentifier.getScheme(), optRedef.get(), group.getDomain());
         if (existResource.isPresent()) {
-            throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, ACTION_RESOURCE_CREATE, "Resource definition [val:" + resourceRO.getIdentifierValue() + " scheme:" + resourceRO.getIdentifierScheme() + "] already exists for domain!");
+            throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, ACTION_RESOURCE_CREATE, "Resource [val:" + resourceRO.getIdentifierValue() + " scheme:" + resourceRO.getIdentifierScheme() + "] already exists for domain!");
         }
 
 
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceService.java
index 4aaa108528a9be229d2a5511934ab00aaaae3171..5e6844e99e4ce7da522cf75a4fef188697abdd41 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceService.java
@@ -75,14 +75,11 @@ public class UISubresourceService {
         }
         resource.getSubresources().remove(subresource);
         subresourceDao.remove(subresource);
-
-
-
         return conversionService.convert(subresource, SubresourceRO.class);
     }
 
     @Transactional
-    public SubresourceRO createResourceForGroup(SubresourceRO subResourceRO, Long resourceId) {
+    public SubresourceRO createSubresourceForResource(SubresourceRO subResourceRO, Long resourceId) {
 
         DBResource resParent= resourceDao.find(resourceId);
         if (resParent == null) {
@@ -112,7 +109,6 @@ public class UISubresourceService {
         return conversionService.convert(subresource, SubresourceRO.class);
     }
 
-
     public DBDocument createDocumentForSubresourceDef(DBSubresourceDef subresourceDef) {
         DBDocument document = new DBDocument();
         document.setCurrentVersion(1);
@@ -120,5 +116,4 @@ public class UISubresourceService {
         document.setName(subresourceDef.getName());
         return document;
     }
-
 }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java
index 480ad87e82906406c724bbba0cda930982abc50b..0ce0c73c7bd53c0ee9029a6105bdf8b099ed644a 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java
@@ -189,6 +189,14 @@ public class UITruststoreService extends BasicKeystoreService {
     public CertificateRO getCertificateData(byte[] buff, boolean validate, boolean validateDuplicate) {
         X509Certificate cert;
         CertificateRO cro;
+
+        if (buff ==null || buff.length ==0){
+            cro = new CertificateRO();
+            cro.setError(true);
+            cro.setInvalid(true);
+            cro.setInvalidReason("Can not read [null/empty] certificate!");
+            return cro;
+        }
         try {
             cert = X509CertificateUtils.getX509Certificate(buff);
         } catch (CertificateException e) {
@@ -345,7 +353,7 @@ public class UITruststoreService extends BasicKeystoreService {
      *
      * @param cert
      * @throws CertificateException
-     */
+     *
     public void checkFullCertificateValidityLegacy(CertificateRO cert) throws CertificateException {
         // trust data in database
         if (cert.getValidFrom() != null && OffsetDateTime.now().isBefore(cert.getValidFrom())) {
@@ -383,7 +391,7 @@ public class UITruststoreService extends BasicKeystoreService {
             }
         }
     }
-
+*/
     boolean isTruststoreChanged() {
         File file = getTruststoreFile();
         return !Objects.equals(lastUpdateTrustStoreFile, file) ||
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java
index 9eff4c771001f60e6cd06bfd1350939288a92a61..2ec17d2b745cb7d66fc575d8c1c09c475b92b622 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java
@@ -368,7 +368,6 @@ public class UIUserService extends UIServiceBase<DBUser, UserRO> {
         UserRO result = convertToRo(user);
 
         return result;
-
     }
 
     public List<CredentialRO> getUserCredentials(Long userId,
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/auth/SMPCertificateAuthenticationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/auth/SMPCertificateAuthenticationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec4bd1f72b47497a9dbbf854fb895a8bbea3671d
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/auth/SMPCertificateAuthenticationTest.java
@@ -0,0 +1,92 @@
+package eu.europa.ec.edelivery.smp.auth;
+
+import eu.europa.ec.edelivery.security.PreAuthenticatedCertificatePrincipal;
+import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.springframework.security.core.GrantedAuthority;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class SMPCertificateAuthenticationTest {
+
+    PreAuthenticatedCertificatePrincipal mockPrincipal = Mockito.mock(PreAuthenticatedCertificatePrincipal.class);
+    List<GrantedAuthority> mockListAuthorities = Collections.singletonList(Mockito.mock(GrantedAuthority.class));
+    DBUser mockUser = Mockito.mock(DBUser.class);
+    SMPCertificateAuthentication testInstance = new SMPCertificateAuthentication(mockPrincipal, mockListAuthorities, mockUser);
+    @Test
+    void testGetAuthorities() {
+
+        Collection<? extends GrantedAuthority> result = testInstance.getAuthorities();
+
+        assertNotNull(result);
+        assertEquals(mockListAuthorities, result);
+
+    }
+
+    @Test
+    void testGetCredentials() {
+        String credential = "mockCredentials";
+        Mockito.when(mockPrincipal.getCredentials()).thenReturn(credential);
+        Object result = testInstance.getCredentials();
+
+        assertNotNull(result);
+        assertEquals(credential, result);
+    }
+
+    @Test
+    void testGetDetails() {
+        Object result = testInstance.getDetails();
+
+        assertNotNull(result);
+        assertEquals(mockPrincipal, result);
+    }
+
+    @Test
+    void testGetPrincipal() {
+        Object result = testInstance.getPrincipal();
+
+        assertNotNull(result);
+        assertEquals(mockPrincipal, result);
+    }
+
+    @Test
+    void isAuthenticated() {
+        boolean result = testInstance.isAuthenticated();
+
+        assertFalse(result);
+    }
+
+    @Test
+    void testSetAuthenticated() {
+        boolean b = true;
+        testInstance.setAuthenticated(b);
+
+        assertTrue(testInstance.isAuthenticated());
+    }
+
+    @Test
+    void testGetName() {
+        String mockname = "mockName";
+        Mockito.when(mockPrincipal.getName(Mockito.anyInt())).thenReturn(mockname);
+
+        String result = testInstance.getName();
+
+        assertNotNull(result);
+        assertEquals(mockname, result);
+    }
+
+    @Test
+    void testToString() {
+        String mockname = "mockName";
+        Mockito.when(mockPrincipal.getName(Mockito.anyInt())).thenReturn(mockname);
+        String result = testInstance.toString();
+
+        assertNotNull(result);
+        assertEquals(mockname, result);
+    }
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializerTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0223d2052351249cb825e4531c72f4af5e54ff20
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializerTest.java
@@ -0,0 +1,42 @@
+package eu.europa.ec.edelivery.smp.config.init;
+
+import eu.europa.ec.edelivery.smp.config.SMPDatabaseConfig;
+import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao;
+import eu.europa.ec.edelivery.smp.data.dao.ExtensionDao;
+import eu.europa.ec.edelivery.smp.services.AbstractServiceTest;
+import eu.europa.ec.smp.spi.OasisSMPExtension;
+import eu.europa.ec.smp.spi.def.OasisSMPServiceGroup10;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+
+@ContextConfiguration( classes = {SMPExtensionInitializerTest.OasisSMPExtensionConfig.class}
+)
+public class SMPExtensionInitializerTest extends AbstractJunit5BaseDao {
+    @Configuration
+    @ComponentScan({"eu.europa.ec.smp.spi"})
+    public static class OasisSMPExtensionConfig {
+
+    }
+
+    @Autowired
+    SMPExtensionInitializer testInstance;
+
+    @Autowired
+    ExtensionDao extensionDao;
+
+    @Test
+    @Transactional
+    public void testValidateExtensionData() {
+        int extensionCount = extensionDao.getAllExtensions().size();
+        testInstance.validateExtensionData();
+        // added OasisSMP extension
+        assertEquals(extensionCount + 1, extensionDao.getAllExtensions().size());
+    }
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPKeystoreConfBuilderTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPKeystoreConfBuilderTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..60fe605941c37d6fd327bad3a7d69ac6e4bbb54c
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPKeystoreConfBuilderTest.java
@@ -0,0 +1,40 @@
+package eu.europa.ec.edelivery.smp.config.init;
+
+
+
+import eu.europa.ec.edelivery.security.utils.SecurityUtils;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.KeyStore;
+
+import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.*;
+import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.TRUSTSTORE_FILENAME;
+import static org.junit.jupiter.api.Assertions.*;
+
+public class SMPKeystoreConfBuilderTest {
+
+    @Test
+    public void testBuild(){
+        File outputFolder = Paths.get("target").toFile();
+
+        SecurityUtils.Secret secret = SecurityUtils.generatePrivateSymmetricKey(true);
+        SMPConfigurationInitializer initPropertyService = Mockito.mock(SMPConfigurationInitializer.class);
+
+        KeyStore keystore  = SMPKeystoreConfBuilder.create()
+                .propertySecurityToken(TRUSTSTORE_PASSWORD)
+                .propertyTruststoreDecToken(TRUSTSTORE_PASSWORD_DECRYPTED)
+                .propertyType(TRUSTSTORE_TYPE)
+                .propertyFilename(TRUSTSTORE_FILENAME)
+                .outputFolder(outputFolder)
+                .testMode(true)
+                .secret(secret)
+                .initPropertyService(initPropertyService)
+                .build();
+
+        assertNotNull(keystore);
+    }
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoMetadataIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoMetadataIntegrationTest.java
deleted file mode 100644
index 9e94e4c1ab65de74c96e8ad8814f798e7e961555..0000000000000000000000000000000000000000
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoMetadataIntegrationTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package eu.europa.ec.edelivery.smp.data.dao;
-
-import org.junit.Ignore;
-
-
-/**
- *  Purpose of class is to test all resource methods with database.
- *
- * @author Joze Rihtarsic
- * @since 4.1
- */
-@Ignore
-public class ServiceGroupDaoMetadataIntegrationTest extends AbstractResourceDaoTest {
-
-/*
-    @Test
-    @Transactional
-
-    public void persistNewServiceGroupWithMetadata() {
-        //  given
-        DBDomain d= domainDao.getDomainByCode(TEST_DOMAIN_CODE_1).get();
-
-        DBResource sg = new DBResource();
-        sg.setIdentifierValue(TEST_SG_ID_1);
-        sg.setIdentifierScheme(TEST_SG_SCHEMA_1);
-        sg.addDomain(d);
-
-        DBSubresource md = TestDBUtils.createDBSubresource(TEST_DOC_ID_1, TEST_DOC_SCHEMA_1);
-        sg.getResourceDomains().get(0).addServiceMetadata(md);
-
-        // when
-        testInstance.persistFlushDetach(sg);
-
-
-        // then
-        DBResource res = testInstance.findServiceGroup(TEST_SG_ID_1, TEST_SG_SCHEMA_1 ).get();
-        assertTrue(sg!=res); // test different object instance
-        assertNotNull(res.getId());
-        assertEquals(TEST_SG_ID_1, res.getIdentifierValue()); // test equal method - same entity
-        assertEquals(TEST_SG_SCHEMA_1, res.getIdentifierScheme()); // test equal method - same entity
-        assertEquals(1, res.getResourceDomains().size()); // domain must be loaded
-        assertEquals(d.getDomainCode(), res.getResourceDomains().get(0).getDomain().getDomainCode()); // test loaded Domain
-
-    }
-
-    @Test
-    @Transactional
-    public void addMetadataToServiceGroup() {
-        // given
-        DBResource sg = createAndSaveNewServiceGroup();
-        DBResource res = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get();
-        DBSubresource md = TestDBUtils.createDBSubresource(TEST_DOC_ID_1, TEST_DOC_SCHEMA_1);
-        //when
-        res.getResourceDomains().get(0).addServiceMetadata(md);
-        assertNotNull(md.getXmlContent());
-        update(res);
-        testInstance.clearPersistenceContext();
-        // then
-        DBResource res2 = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get();
-        assertNotNull(res2);
-        assertEquals(1, res2.getResourceDomains().get(0).getSubresourcesList().size());
-        assertTrue(Arrays.equals(md.getXmlContent(), res2.getResourceDomains().get(0).getSubresourcesList().get(0).getXmlContent()));
-    }
-
-    @Test
-    @Transactional
-    public void updateServiceMetadataXML() {
-        // given
-        DBResource sg = createAndSaveNewServiceGroupWithMetadata();
-        DBResource res = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get();
-        DBSubresource md = res.getResourceDomains().get(0).getSubresource(0);
-
-        byte[]  str = TestDBUtils.generateDocumentSample(sg.getIdentifierValue(),sg.getIdentifierScheme(),
-                md.getDocumentIdentifier(),md.getDocumentIdentifierScheme(),UUID.randomUUID().toString());
-        assertNotEquals (str, md.getXmlContent());
-        //when
-        res.getResourceDomains().get(0).getSubresource(0).setXmlContent(str);
-        update(res);
-
-        testInstance.clearPersistenceContext();
-        // then
-        DBResource res2 = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get();
-        assertNotNull(res2);
-        assertEquals(1, res2.getResourceDomains().get(0).getSubresourcesList().size());
-        assertTrue(Arrays.equals(str, res2.getResourceDomains().get(0).getSubresourcesList().get(0).getXmlContent()));
-
-    }
-
-    @Test
-    @Transactional
-    public void removeServiceMetadata() {
-        // given
-        DBResource sg = createAndSaveNewServiceGroupWithMetadata();
-        DBResource res = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get();
-
-        assertEquals(1, res.getResourceDomains().get(0).getSubresourcesList().size());
-        DBSubresource dsmd = res.getResourceDomains().get(0).getSubresourcesList().get(0);
-
-        // when
-        res.getResourceDomains().get(0).removeServiceMetadata(dsmd);
-        testInstance.update(res);
-        testInstance.clearPersistenceContext();
-        DBResource res2 = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get();
-
-        // then
-        assertEquals(0, res.getResourceDomains().get(0).getSubresourcesList().size());
-    }
-
-    @Test
-    public void removeDBServiceGroupWithServiceMetadata() {
-      // given
-        DBResource sg = createAndSaveNewServiceGroupWithMetadata();
-        Optional<DBResource> resOpt1 = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme());
-        assertTrue(resOpt1.isPresent());
-
-        // when
-        testInstance.removeServiceGroup(resOpt1.get());
-        testInstance.clearPersistenceContext();
-
-        // then
-        Optional<DBResource> resOptDS = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme());
-        assertFalse(resOptDS.isPresent());
-    }
-
- */
-}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceMetadataDaoIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceMetadataDaoIntegrationTest.java
deleted file mode 100644
index bc18cdf32a178dab35c5fbd220b3b746cbf3db35..0000000000000000000000000000000000000000
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceMetadataDaoIntegrationTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package eu.europa.ec.edelivery.smp.data.dao;
-
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-/**
- *  Purpose of class is to test all resource methods with database.
- *
- * @author Joze Rihtarsic
- * @since 4.1
- */
-@Ignore
-public class ServiceMetadataDaoIntegrationTest extends AbstractBaseDao {
-
-    @Autowired
-    SubresourceDao testInstance;
-
-    @Autowired
-    DomainDao domainDao;
-
-    @Autowired
-    UserDao userDao;
-
-    @Autowired
-    ResourceDao serviceGroupDao;
-
-    @Rule
-    public ExpectedException expectedEx = ExpectedException.none();
-    @Test
-    public void mockTest(){
-
-    }
-/*
-    @Before
-    @Transactional
-    public void prepareDatabase() {
-        DBDomain testDomain01 =TestDBUtils.createDBDomain(TestConstants.TEST_DOMAIN_CODE_1);
-        DBDomain testDomain02 =TestDBUtils.createDBDomain(TestConstants.TEST_DOMAIN_CODE_2);
-        domainDao.persistFlushDetach(testDomain01);
-        domainDao.persistFlushDetach(testDomain02);
-
-        DBUser u1 = TestDBUtils.createDBUserByUsername(TestConstants.USERNAME_1);
-        DBUser u2 = TestDBUtils.createDBUserByCertificate(TestConstants.USER_CERT_2);
-        userDao.persistFlushDetach(u1);
-        userDao.persistFlushDetach(u2);
-
-        // create service group with two documents in one domains
-        DBResource sg1d1 = TestDBUtils.createDBServiceGroup(TEST_SG_ID_1, TEST_SG_SCHEMA_1);
-        DBSubresource sg1md1 = TestDBUtils.createDBSubresource(TEST_SG_ID_1, TEST_SG_SCHEMA_1,
-                TEST_DOC_ID_1, TEST_DOC_SCHEMA_1);
-        DBSubresource sg1md2 = TestDBUtils.createDBSubresource(TEST_SG_ID_1, TEST_SG_SCHEMA_1,
-                TEST_DOC_ID_2, TEST_DOC_SCHEMA_2);
-        sg1d1.addDomain(testDomain01);
-        sg1d1.getServiceGroupDomains().get(0).addServiceMetadata(sg1md1);
-        sg1d1.getServiceGroupDomains().get(0).addServiceMetadata(sg1md2);
-        sg1d1.getUsers().add(u1);
-        sg1d1.getUsers().add(u2);
-        serviceGroupDao.update(sg1d1);
-        // create service group one document in two domains
-        DBResource sg2 = TestDBUtils.createDBServiceGroup(TEST_SG_ID_2, TEST_SG_SCHEMA_2);
-        DBSubresource sg2md1 = TestDBUtils.createDBSubresource(TEST_SG_ID_2, TEST_SG_SCHEMA_2,
-                TEST_DOC_ID_1, TEST_DOC_SCHEMA_1);
-        DBSubresource sg2md2 = TestDBUtils.createDBSubresource(TEST_SG_ID_2, TEST_SG_SCHEMA_2,
-                TEST_DOC_ID_2, TEST_DOC_SCHEMA_2);
-        sg2.addDomain(testDomain01);
-        sg2.addDomain(testDomain02);
-        sg2.getServiceGroupDomains().get(0).addServiceMetadata(sg2md1);
-        sg2.getServiceGroupDomains().get(1).addServiceMetadata(sg2md2);
-        sg2.getUsers().add(u1);
-        sg2.getUsers().add(u2);
-        serviceGroupDao.update(sg2);
-    }
-
-    @Test
-    @Transactional
-    public void testFindServiceMetadata() {
-        // given
-        // when
-        Optional<DBSubresource> osmd1 = testInstance.findServiceMetadata(TEST_SG_ID_1, TEST_SG_SCHEMA_1,
-                TEST_DOC_ID_1, TEST_DOC_SCHEMA_1);
-        Optional<DBSubresource> osmd2 = testInstance.findServiceMetadata(TEST_SG_ID_2, TEST_SG_SCHEMA_2,
-                TEST_DOC_ID_1, TEST_DOC_SCHEMA_1);
-
-        // test
-        assertTrue(osmd1.isPresent());
-        assertTrue(osmd2.isPresent());
-    }
-
-    @Test
-    @Transactional
-    public void testFindServiceMetadataList() {
-        // given
-        // when
-        List<DBSubresource> lst1 = testInstance.getAllMetadataForServiceGroup(TEST_SG_ID_1, TEST_SG_SCHEMA_1);
-        List<DBSubresource> lst2 = testInstance.getAllMetadataForServiceGroup(TEST_SG_ID_2, TEST_SG_SCHEMA_2);
-        // test
-        assertEquals(2, lst1.size());
-        assertEquals(2, lst2.size());
-    }*/
-
-}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/ui/databind/SMPAuthorityDeserializerTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/ui/databind/SMPAuthorityDeserializerTest.java
index d9232752cc2a86f76fa345417eb93ce662ae60d7..70f337365e29adc663459518fff7c1327b134fc5 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/ui/databind/SMPAuthorityDeserializerTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/ui/databind/SMPAuthorityDeserializerTest.java
@@ -21,9 +21,8 @@ import static org.junit.Assert.assertNotNull;
 public class SMPAuthorityDeserializerTest {
 
     @Test
-    @Ignore
     public void deserialize() throws IOException {
-        String value = "{\"username\":\"smp\",\"password\":null,\"emailAddress\":null,\"authorities\":[\"ROLE_USER\"],\"active\":true,\"role\":\"ROLE_USER\",\"certificate\":null,\"statusPassword\":0,\"passwordExpired\":true}";
+        String value = "{\"status\":0,\"index\":0,\"actionMessage\":null,\"userId\":\"hsAkhiqJp1o89VZ4iBtmLnEM2vkb5FJTt0vWEUIxOw\",\"username\":\"user\",\"active\":true,\"role\":\"USER\",\"emailAddress\":\"user@mail-example.local\",\"fullName\":null,\"smpTheme\":null,\"smpLocale\":null,\"casAuthenticated\":false,\"casUserDataUrl\":null,\"passwordExpireOn\":null,\"sequentialLoginFailureCount\":0,\"lastFailedLoginAttempt\":null,\"suspendedUtil\":null,\"passwordUpdatedOn\":null,\"authorities\":[\"ROLE_USER\"],\"statusPassword\":0,\"passwordExpired\":true,\"showPasswordExpirationWarning\":false,\"forceChangeExpiredPassword\":false}";
         ObjectMapper mapper = new ObjectMapper();
         UserRO userRO = mapper.readValue(value, UserRO.class);
 
@@ -31,6 +30,5 @@ public class SMPAuthorityDeserializerTest {
         assertNotNull(userRO.getAuthorities());
         assertEquals(1, userRO.getAuthorities().size());
         assertEquals(SMPAuthority.S_AUTHORITY_USER.getAuthority(), userRO.getAuthorities().toArray(new SMPAuthority[]{})[0].getAuthority());
-
     }
 }
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/DomainGuardTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/DomainGuardTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..13ea2e83cf4064e78b4adea6da2fa9f3f39949bb
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/DomainGuardTest.java
@@ -0,0 +1,114 @@
+package eu.europa.ec.edelivery.smp.security;
+
+import eu.europa.ec.edelivery.smp.auth.SMPUserDetails;
+import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao;
+import eu.europa.ec.edelivery.smp.data.model.DBDomain;
+import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
+import eu.europa.ec.edelivery.smp.servlet.ResourceAction;
+import eu.europa.ec.edelivery.smp.servlet.ResourceRequest;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationServiceException;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.when;
+
+class DomainGuardTest extends AbstractJunit5BaseDao {
+
+    @Autowired
+    DomainGuard testInstance;
+
+    ResourceRequest resourceRequest = Mockito.mock(ResourceRequest.class);
+    SMPUserDetails user = Mockito.mock(SMPUserDetails.class);
+
+    @BeforeEach
+    public void prepareDatabase() {
+        testUtilsDao.clearData();
+        testUtilsDao.creatDomainMemberships();
+        testUtilsDao.createGroupMemberships();
+        testUtilsDao.createResourceMemberships();
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainInvalidRequestMissingAction() {
+
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user));
+
+        assertThat(result.getMessage(), containsString("Invalid request"));
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainDeleteInvalidRequestNotUser() {
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE);
+        AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class,
+                () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user));
+
+        assertThat(result.getMessage(), containsString("User is not authorized for the domain!"));
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainDeleteInvalidRequestUserNotAuthorized() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser3());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE);
+        AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class,
+                () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user));
+
+        assertThat(result.getMessage(), containsString("User is not authorized for the domain!"));
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainCreateInvalidRequestUserNotAuthorized() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser3());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE);
+        AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class,
+                () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user));
+
+        assertThat(result.getMessage(), containsString("User is not authorized for the domain!"));
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainDeleteUserAuthorized() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE);
+        DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user);
+        assertNotNull(domain);
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainDeleteCreateAuthorized() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE);
+        DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user);
+        assertNotNull(domain);
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainCreateInvalidRequestNotUser() {
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE);
+        AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class,
+                () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user));
+
+        assertThat(result.getMessage(), containsString("User is not authorized for the domain!"));
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainNoUserOK() {
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.READ);
+        DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user);
+        assertNotNull(domain);
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomain() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.READ);
+        DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user);
+        assertNotNull(domain);
+    }
+
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CRLVerifierServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CRLVerifierServiceTest.java
index c4df3e45dc75fcd86ee48e04d3df99187c3f63e7..b9d4cd886adfac062d282bbb6326905bd314e5a5 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CRLVerifierServiceTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CRLVerifierServiceTest.java
@@ -2,46 +2,36 @@ package eu.europa.ec.edelivery.smp.services;
 
 import eu.europa.ec.edelivery.smp.exceptions.ErrorCode;
 import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
-import org.junit.*;
-import org.junit.rules.ExpectedException;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
 import org.mockito.Mockito;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
 
 import java.io.IOException;
-import java.security.Security;
+import java.io.InputStream;
 import java.security.cert.*;
 
-import static org.hamcrest.CoreMatchers.startsWith;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThrows;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
 
 
-public class CRLVerifierServiceTest extends AbstractServiceIntegrationTest {
+public class CRLVerifierServiceTest {
 
-    @Rule
-    public ExpectedException expectedEx = ExpectedException.none();
+    ConfigurationService mockConfigurationService = Mockito.mock(ConfigurationService.class);
 
-    @Autowired
-    private CRLVerifierService crlVerifierServiceInstance;
+    private CRLVerifierService testInstance = new CRLVerifierService(mockConfigurationService);
 
-    @Autowired
-    private ConfigurationService configurationService;
-
-
-    @BeforeClass
-    public static void beforeClass() throws Exception {
-        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
-    }
-
-    @Before
+    @BeforeEach
     public void beforeMethods() {
-        crlVerifierServiceInstance = Mockito.spy(crlVerifierServiceInstance);
-        configurationService = Mockito.spy(configurationService);
-        ReflectionTestUtils.setField(crlVerifierServiceInstance, "configurationService", configurationService);
+        doReturn(true).when(mockConfigurationService).forceCRLValidation();
         // force verification
-        Mockito.doReturn(true).when(configurationService).forceCRLValidation();
+        testInstance = Mockito.spy(testInstance);
     }
 
 
@@ -53,25 +43,25 @@ public class CRLVerifierServiceTest extends AbstractServiceIntegrationTest {
         CertificateFactory cf = CertificateFactory.getInstance("X.509");
         X509CRL crl = (X509CRL) cf.generateCRL(getClass().getResourceAsStream("/certificates/smp-crl-test.crl"));
 
-        Mockito.doReturn(crl).when(crlVerifierServiceInstance).getCRLByURL("https://localhost/clr");
+        doReturn(crl).when(testInstance).getCRLByURL("https://localhost/clr");
 
         // when-then
-        crlVerifierServiceInstance.verifyCertificateCRLs(certificate);
+        testInstance.verifyCertificateCRLs(certificate);
         // must not throw exception
     }
 
     @Test
-    public void verifyCertificateCRLRevokedTest() throws CertificateException, CRLException, IOException {
+    public void verifyCertificateCRLRevokedTest() throws CertificateException, CRLException {
         // given
         X509Certificate certificate = loadCertificate("smp-crl-revoked.pem");
 
-
         CertificateFactory cf = CertificateFactory.getInstance("X.509");
         X509CRL crl = (X509CRL) cf.generateCRL(getClass().getResourceAsStream("/certificates/smp-crl-test.crl"));
 
-        Mockito.doReturn(crl).when(crlVerifierServiceInstance).getCRLByURL("https://localhost/crl");
+        doReturn(crl).when(testInstance).getCRLByURL("https://localhost/crl");
 
-        CertificateRevokedException result = assertThrows(CertificateRevokedException.class, () -> crlVerifierServiceInstance.verifyCertificateCRLs(certificate));
+        CertificateRevokedException result = assertThrows(CertificateRevokedException.class,
+                () -> testInstance.verifyCertificateCRLs(certificate));
         assertThat(result.getMessage(), startsWith("Certificate has been revoked, reason: UNSPECIFIED"));
     }
 
@@ -79,59 +69,91 @@ public class CRLVerifierServiceTest extends AbstractServiceIntegrationTest {
     public void verifyCertificateCRLsX509FailsToConnectTest() throws CertificateException {
         // given
         X509Certificate certificate = loadCertificate("smp-crl-test-all.pem");
-
-        expectedEx.expect(SMPRuntimeException.class);
-        expectedEx.expectMessage("Certificate error [Error occurred while downloading CRL:'https://localhost/clr']. Error: ConnectException: Connection refused (Connection refused)!");
-
-        // when-then
-        crlVerifierServiceInstance.verifyCertificateCRLs(certificate);
+        // when
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class, () ->
+                testInstance.verifyCertificateCRLs(certificate));
+        // then
+        assertThat(result.getMessage(),
+                startsWith("Certificate error [Error occurred while downloading CRL:'https://localhost/clr']. Error: ConnectException: Connection refused (Connection refused)!"));
     }
 
     @Test
-    public void downloadCRLWrongUrlSchemeTest() throws CertificateException, CRLException, IOException {
+    public void downloadCRLWrongUrlSchemeTest()  {
 
-        X509CRL crl = crlVerifierServiceInstance.downloadCRL("wrong://localhost/crl", true);
+        X509CRL crl = testInstance.downloadCRL("wrong://localhost/crl", true);
 
         assertNull(crl);
     }
 
     @Test
-    public void downloadCRLUrlSchemeLdapTest() throws CertificateException, CRLException, IOException {
+    public void downloadCRLUrlSchemeLdapTest()  {
 
-        X509CRL crl = crlVerifierServiceInstance.downloadCRL("ldap://localhost/crl", true);
+        X509CRL crl = testInstance.downloadCRL("ldap://localhost/crl", true);
 
         assertNull(crl);
     }
 
     @Test
-    public void verifyCertificateCRLsRevokedSerialTest() throws CertificateException, CRLException, IOException {
+    public void verifyCertificateCRLsRevokedSerialTest() throws CertificateException, CRLException {
 
         CertificateFactory cf = CertificateFactory.getInstance("X.509");
         X509CRL crl = (X509CRL) cf.generateCRL(getClass().getResourceAsStream("/certificates/smp-crl-test.crl"));
 
-        Mockito.doReturn(crl).when(crlVerifierServiceInstance).downloadCRL("https://localhost/crl", true);
+        doReturn(crl).when(testInstance).getCRLByURL("https://localhost/crl");
 
-        CertificateRevokedException result = assertThrows(CertificateRevokedException.class, () ->crlVerifierServiceInstance.verifyCertificateCRLs("11", "https://localhost/crl"));
+        CertificateRevokedException result = assertThrows(CertificateRevokedException.class, () -> testInstance.verifyCertificateCRLs("11", "https://localhost/crl"));
         assertThat(result.getMessage(), startsWith("Certificate has been revoked, reason: UNSPECIFIED"));
     }
 
     @Test
-    public void verifyCertificateCRLsRevokedSerialTestThrowIOExceptionHttps() throws CertificateException, IOException, CRLException {
+    public void verifyCertificateCRLsRevokedSerialTestThrowIOExceptionHttps() {
         String crlURL = "https://localhost/crl";
 
-        Mockito.doThrow(new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Can not download CRL '" + crlURL + "'", "IOException: Can not access URL")).when(crlVerifierServiceInstance).downloadCRL("https://localhost/crl", true);
+        doThrow(new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Can not download CRL '" + crlURL + "'", "IOException: Can not access URL"))
+                .when(testInstance).getCRLByURL("https://localhost/crl");
+        // when
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class, () -> testInstance.verifyCertificateCRLs("11", "https://localhost/crl"));
+        // then
+        assertThat(result.getMessage(), startsWith("Certificate error [Can not download CRL 'https://localhost/crl']. Error: IOException: Can not access URL"));
+    }
 
-        expectedEx.expect(SMPRuntimeException.class);
-        expectedEx.expectMessage("Certificate error [Can not download CRL 'https://localhost/crl']. Error: IOException: Can not access URL!");
+    @ParameterizedTest
+    @CsvSource({
+            "param1, true",
+            "param1|param2, true",
+            ", false",
+            "'', false",
+            "' |test', false",
+            "test| |test, false",
+    })
+    public void testIsValidParameter(String values, boolean expectedResult) {
+        //given
+        String[] parameters = StringUtils.split(values, '|');
+        //when
+        boolean result = testInstance.isValidParameter(parameters);
+        //then
+        assertEquals(expectedResult, result);
+    }
 
-        // when-then
-        crlVerifierServiceInstance.verifyCertificateCRLs("11", "https://localhost/crl");
+    @Test
+    public void testDownloadURLViaProxy() throws IOException {
+        //given
+        String url = "https://localhost/crl";
+        String proxy = "localhost";
+        int proxyPort = 8080;
+        String proxyUser = "user";
+        String proxyPassword = "password";
+        InputStream inputStream = Mockito.mock(InputStream.class);
+        doReturn(inputStream).when(testInstance).execute(any(), any());
+        //when
+        InputStream result = testInstance.downloadURLViaProxy(url, proxy, proxyPort, proxyUser, proxyPassword);
+        //then
+        assertEquals(inputStream, result);
     }
 
     private X509Certificate loadCertificate(String filename) throws CertificateException {
         CertificateFactory fact = CertificateFactory.getInstance("X.509");
-        X509Certificate cer = (X509Certificate)
+        return (X509Certificate)
                 fact.generateCertificate(getClass().getResourceAsStream("/certificates/" + filename));
-        return cer;
     }
 }
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ConfigurationServiceAllGetMethodsTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ConfigurationServiceAllGetMethodsTest.java
index 69e363642d310d8c902cfe3377c06e45ed2e4733..fd918d2874e3885ec1e9d3ac9b8d37010378afba 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ConfigurationServiceAllGetMethodsTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ConfigurationServiceAllGetMethodsTest.java
@@ -2,6 +2,7 @@ package eu.europa.ec.edelivery.smp.services;
 
 import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao;
 import eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum;
+import eu.europa.ec.edelivery.smp.data.ui.enums.AlertLevelEnum;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.commons.lang3.reflect.MethodUtils;
 import org.junit.Test;
@@ -20,15 +21,16 @@ import static org.mockito.Mockito.*;
 
 @RunWith(Parameterized.class)
 public class ConfigurationServiceAllGetMethodsTest {
-    private static String TEST_STRING = "TestString";
-    private static List<String> TEST_STRING_LIST = Arrays.asList("TestString1","TestString2","TestString3");
-    private static Map<String, String> TEST_MAP = new HashMap<>();
-    private static Pattern TEST_REXEXP= Pattern.compile(".*");
-    private static File TEST_FILE= new File("/tmp/file");
+    private static final String TEST_STRING = "TestString";
+    private static final List<String> TEST_STRING_LIST = Arrays.asList("TestString1", "TestString2", "TestString3");
+    private static final Map<String, String> TEST_MAP = new HashMap<>();
+    private static final Pattern TEST_REXEXP = Pattern.compile(".*");
+    private static final File TEST_FILE = new File("/tmp/file");
     private static URL TEST_URL;
+
     static {
         try {
-        TEST_URL=  new URL("http://test:123/path");
+            TEST_URL = new URL("http://test:123/path");
         } catch (Exception e) {
             fail("Fail to generated test data" + ExceptionUtils.getRootCauseMessage(e));
         }
@@ -40,19 +42,19 @@ public class ConfigurationServiceAllGetMethodsTest {
     @Parameterized.Parameters(name = "{index}: {0}")
     public static Collection<Object[]> data() {
         // set property values for property, set value, method name, value or property, value (true) or property (false)
-        return Arrays.asList(new Object[][] {
+        return Arrays.asList(new Object[][]{
                 {EXTERNAL_TLS_AUTHENTICATION_CLIENT_CERT_HEADER_ENABLED, Boolean.TRUE, "isExternalTLSAuthenticationWithClientCertHeaderEnabled", true},
                 {EXTERNAL_TLS_AUTHENTICATION_CERTIFICATE_HEADER_ENABLED, Boolean.TRUE, "isExternalTLSAuthenticationWithSSLClientCertHeaderEnabled", true},
                 {OUTPUT_CONTEXT_PATH, Boolean.FALSE, "isUrlContextEnabled", true},
                 //{HTTP_FORWARDED_HEADERS_ENABLED, Boolean.TRUE, "", true},
                 {HTTP_HSTS_MAX_AGE, 1234, "getHttpHeaderHstsMaxAge", true},
                 {HTTP_HEADER_SEC_POLICY, TEST_STRING, "getHttpHeaderContentSecurityPolicy", true},
-                {HTTP_NO_PROXY_HOSTS,TEST_STRING, "getHttpNoProxyHosts", false},
+                {HTTP_NO_PROXY_HOSTS, TEST_STRING, "getHttpNoProxyHosts", false},
                 {HTTP_PROXY_HOST, TEST_STRING, "getHttpProxyHost", false},
                 {HTTP_PROXY_PASSWORD, TEST_STRING, "getProxyCredentialToken", true},
                 {HTTP_PROXY_PORT, 8800, "getHttpProxyPort", true},
                 {HTTP_PROXY_USER, TEST_STRING, "getProxyUsername", true},
-                {PARTC_SCH_VALIDATION_REGEXP, TEST_REXEXP,"getParticipantIdentifierSchemeRexExp", true},
+                {PARTC_SCH_VALIDATION_REGEXP, TEST_REXEXP, "getParticipantIdentifierSchemeRexExp", true},
                 {PARTC_SCH_VALIDATION_REGEXP, TEST_STRING, "getParticipantIdentifierSchemeRexExpPattern", false},
                 {PARTC_SCH_REGEXP_MSG, TEST_STRING, "getParticipantIdentifierSchemeRexExpMessage", true},
                 //{PARTC_EBCOREPARTYID_CONCATENATE, Boolean.FALSE, "getForceConcatenateEBCorePartyId", true},
@@ -60,10 +62,10 @@ public class ConfigurationServiceAllGetMethodsTest {
                 {CS_PARTICIPANTS, TEST_STRING_LIST, "getCaseSensitiveParticipantScheme", true},
                 {CS_DOCUMENTS, TEST_STRING_LIST, "getCaseSensitiveDocumentScheme", true},
                 {SML_ENABLED, Boolean.FALSE, "isSMLIntegrationEnabled", true},
-                {SML_URL,TEST_URL, "getSMLIntegrationUrl", true},
+                {SML_URL, TEST_URL, "getSMLIntegrationUrl", true},
                 {SML_TLS_DISABLE_CN_CHECK, Boolean.FALSE, "smlDisableCNCheck", true},
                 {SML_TLS_SERVER_CERT_SUBJECT_REGEXP, TEST_REXEXP, "getSMLIntegrationServerCertSubjectRegExp", true},
-                {SML_LOGICAL_ADDRESS, TEST_STRING,"getSMLIntegrationSMPLogicalAddress", false},
+                {SML_LOGICAL_ADDRESS, TEST_STRING, "getSMLIntegrationSMPLogicalAddress", false},
                 {SML_PHYSICAL_ADDRESS, TEST_STRING, "getSMLIntegrationSMPPhysicalAddress", false},
                 {KEYSTORE_PASSWORD, TEST_STRING, "getKeystoreCredentialToken", true},
                 {KEYSTORE_FILENAME, TEST_FILE, "getKeystoreFile", true},
@@ -76,7 +78,7 @@ public class ConfigurationServiceAllGetMethodsTest {
                 {CERTIFICATE_ALLOWED_CERTIFICATEPOLICY_OIDS, TEST_STRING_LIST, "getAllowedCertificatePolicies", true},
                 {CERTIFICATE_SUBJECT_REGULAR_EXPRESSION, TEST_REXEXP, "getCertificateSubjectRegularExpression", true},
                 //{SMP_PROPERTY_REFRESH_CRON, TEST_STRING, "", true},
-                {UI_COOKIE_SESSION_SECURE, Boolean.FALSE,  "getSessionCookieSecure", true},
+                {UI_COOKIE_SESSION_SECURE, Boolean.FALSE, "getSessionCookieSecure", true},
                 {UI_COOKIE_SESSION_MAX_AGE, 1111, "getSessionCookieMaxAge", true},
                 {UI_COOKIE_SESSION_SITE, TEST_STRING, "getSessionCookieSameSite", true},
                 {UI_COOKIE_SESSION_PATH, TEST_STRING, "getSessionCookiePath", true},
@@ -88,8 +90,8 @@ public class ConfigurationServiceAllGetMethodsTest {
                 {PASSWORD_POLICY_REGULAR_EXPRESSION, TEST_STRING, "getPasswordPolicyRexExpPattern", false},
                 {PASSWORD_POLICY_WARNING_DAYS_BEFORE_EXPIRE, 10, "getPasswordPolicyUIWarningDaysBeforeExpire", true},
                 {PASSWORD_POLICY_FORCE_CHANGE_EXPIRED, Boolean.TRUE, "getPasswordPolicyForceChangeIfExpired", true},
-                {USER_LOGIN_FAIL_DELAY,1000, "getLoginFailDelayInMilliSeconds", true},
-                {ACCESS_TOKEN_FAIL_DELAY,1000, "getAccessTokenLoginFailDelayInMilliSeconds", true},
+                {USER_LOGIN_FAIL_DELAY, 1000, "getLoginFailDelayInMilliSeconds", true},
+                {ACCESS_TOKEN_FAIL_DELAY, 1000, "getAccessTokenLoginFailDelayInMilliSeconds", true},
                 {USER_MAX_FAILED_ATTEMPTS, 55, "getLoginMaxAttempts", true},
                 {USER_SUSPENSION_TIME, 3600, "getLoginSuspensionTimeInSeconds", true},
                 {ACCESS_TOKEN_POLICY_VALID_DAYS, 1212, "getAccessTokenPolicyValidDays", true},
@@ -108,48 +110,58 @@ public class ConfigurationServiceAllGetMethodsTest {
                 {ENCODED_SLASHES_ALLOWED_IN_URL, Boolean.FALSE, "encodedSlashesAllowedInUrl", true},
                 {SMP_ALERT_CREDENTIALS_SERVER, TEST_STRING, "getTargetServerForCredentialValidation", true},
                 {SML_TLS_SERVER_CERT_SUBJECT_REGEXP, TEST_STRING, "getSMLIntegrationServerCertSubjectRegExpPattern", false},
-                {SML_TLS_TRUSTSTORE_USE_SYSTEM_DEFAULT, Boolean.FALSE , "useSystemTruststoreForTLS", true},
+                {SML_TLS_TRUSTSTORE_USE_SYSTEM_DEFAULT, Boolean.FALSE, "useSystemTruststoreForTLS", true},
                 {SSO_CAS_SMP_LOGIN_URI, TEST_STRING, "getCasSMPLoginRelativePath", true},
                 {ALERT_USER_LOGIN_FAILURE_ENABLED, Boolean.FALSE, "getAlertUserLoginFailureEnabled", true},
-                {ALERT_USER_SUSPENDED_ENABLED,  Boolean.FALSE, "getAlertUserSuspendedEnabled", true},
+                {ALERT_USER_SUSPENDED_ENABLED, Boolean.FALSE, "getAlertUserSuspendedEnabled", true},
                 {ALERT_USER_SUSPENDED_MAIL_SUBJECT, TEST_STRING, "getAlertUserSuspendedSubject", true},
-                {ALERT_PASSWORD_BEFORE_EXPIRATION_ENABLED,  Boolean.FALSE, "getAlertBeforeExpirePasswordEnabled", true},
+                {ALERT_PASSWORD_BEFORE_EXPIRATION_ENABLED, Boolean.FALSE, "getAlertBeforeExpirePasswordEnabled", true},
                 {ALERT_PASSWORD_BEFORE_EXPIRATION_PERIOD, 10, "getAlertBeforeExpirePasswordPeriod", true},
                 {ALERT_PASSWORD_BEFORE_EXPIRATION_INTERVAL, 10, "getAlertBeforeExpirePasswordInterval", true},
                 {ALERT_PASSWORD_BEFORE_EXPIRATION_MAIL_SUBJECT, TEST_STRING, "getAlertBeforeExpirePasswordMailSubject", true},
-                {ALERT_PASSWORD_EXPIRED_ENABLED,  Boolean.FALSE, "getAlertExpiredPasswordEnabled", true},
+                {ALERT_PASSWORD_EXPIRED_ENABLED, Boolean.FALSE, "getAlertExpiredPasswordEnabled", true},
                 {ALERT_PASSWORD_EXPIRED_PERIOD, 10, "getAlertExpiredPasswordPeriod", true},
                 {ALERT_PASSWORD_EXPIRED_INTERVAL, 10, "getAlertExpiredPasswordInterval", true},
                 {ALERT_PASSWORD_EXPIRED_MAIL_SUBJECT, TEST_STRING, "getAlertExpiredPasswordMailSubject", true},
-                {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_ENABLED,  Boolean.FALSE, "getAlertBeforeExpireAccessTokenEnabled", true},
+                {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_ENABLED, Boolean.FALSE, "getAlertBeforeExpireAccessTokenEnabled", true},
                 {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_PERIOD, 10, "getAlertBeforeExpireAccessTokenPeriod", true},
                 {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_INTERVAL, 10, "getAlertBeforeExpireAccessTokenInterval", true},
                 {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_MAIL_SUBJECT, TEST_STRING, "getAlertBeforeExpireAccessTokenMailSubject", true},
-                {ALERT_ACCESS_TOKEN_EXPIRED_ENABLED,  Boolean.FALSE, "getAlertExpiredAccessTokenEnabled", true},
+                {ALERT_ACCESS_TOKEN_EXPIRED_ENABLED, Boolean.FALSE, "getAlertExpiredAccessTokenEnabled", true},
                 {ALERT_ACCESS_TOKEN_EXPIRED_PERIOD, 10, "getAlertExpiredAccessTokenPeriod", true},
                 {ALERT_ACCESS_TOKEN_EXPIRED_INTERVAL, 10, "getAlertExpiredAccessTokenInterval", true},
                 {ALERT_ACCESS_TOKEN_EXPIRED_MAIL_SUBJECT, TEST_STRING, "getAlertExpiredAccessTokenMailSubject", true},
 
-                {ALERT_CERTIFICATE_BEFORE_EXPIRATION_ENABLED,  Boolean.FALSE, "getAlertBeforeExpireCertificateEnabled", true},
+                {ALERT_CERTIFICATE_BEFORE_EXPIRATION_ENABLED, Boolean.FALSE, "getAlertBeforeExpireCertificateEnabled", true},
                 {ALERT_CERTIFICATE_BEFORE_EXPIRATION_PERIOD, 10, "getAlertBeforeExpireCertificatePeriod", true},
                 {ALERT_CERTIFICATE_BEFORE_EXPIRATION_INTERVAL, 10, "getAlertBeforeExpireCertificateInterval", true},
                 {ALERT_CERTIFICATE_BEFORE_EXPIRATION_MAIL_SUBJECT, TEST_STRING, "getAlertBeforeExpireCertificateMailSubject", true},
 
-                {ALERT_CERTIFICATE_EXPIRED_ENABLED,  Boolean.FALSE, "getAlertExpiredCertificateEnabled", true},
+                {ALERT_CERTIFICATE_EXPIRED_ENABLED, Boolean.FALSE, "getAlertExpiredCertificateEnabled", true},
                 {ALERT_CERTIFICATE_EXPIRED_PERIOD, 10, "getAlertExpiredCertificatePeriod", true},
                 {ALERT_CERTIFICATE_EXPIRED_INTERVAL, 10, "getAlertExpiredCertificateInterval", true},
                 {ALERT_CERTIFICATE_EXPIRED_MAIL_SUBJECT, TEST_STRING, "getAlertExpiredCertificateMailSubject", true},
                 {SMP_ALERT_BATCH_SIZE, 10, "getAlertCredentialsBatchSize", true},
                 {SMP_ALERT_MAIL_FROM, TEST_STRING, "getAlertEmailFrom", true},
 
+                {ALERT_USER_SUSPENDED_LEVEL, AlertLevelEnum.HIGH, "getAlertUserSuspendedLevel", true},
+                {ALERT_USER_LOGIN_FAILURE_LEVEL, AlertLevelEnum.HIGH, "getAlertUserLoginFailureLevel", true},
+                {ALERT_PASSWORD_BEFORE_EXPIRATION_LEVEL, AlertLevelEnum.HIGH, "getAlertBeforeExpirePasswordLevel", true},
+                {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_LEVEL, AlertLevelEnum.HIGH, "getAlertBeforeExpireAccessTokenLevel", true},
+                {ALERT_ACCESS_TOKEN_EXPIRED_LEVEL, AlertLevelEnum.HIGH, "getAlertExpiredAccessTokenLevel", true},
+                {ALERT_CERTIFICATE_BEFORE_EXPIRATION_LEVEL, AlertLevelEnum.HIGH, "getAlertBeforeExpireCertificateLevel", true},
+                {ALERT_CERTIFICATE_EXPIRED_LEVEL, AlertLevelEnum.HIGH, "getAlertExpiredCertificateLevel", true},
+
+
         });
     }
+
     private final SMPPropertyEnum property;
     private final Object value;
     private final String methodName;
     private final boolean fromValue;
 
-    public ConfigurationServiceAllGetMethodsTest(SMPPropertyEnum property, Object value, String methodName,boolean fromValue) {
+    public ConfigurationServiceAllGetMethodsTest(SMPPropertyEnum property, Object value, String methodName, boolean fromValue) {
         this.property = property;
         this.value = value;
         this.methodName = methodName;
@@ -160,14 +172,14 @@ public class ConfigurationServiceAllGetMethodsTest {
     public void testProperty() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
 
         if (fromValue) {
-            doReturn(value).when(configurationDaoMock).getCachedPropertyValue(property);
+            doReturn(value instanceof AlertLevelEnum ? value.toString() : value).when(configurationDaoMock).getCachedPropertyValue(property);
         } else {
             doReturn(value).when(configurationDaoMock).getCachedProperty(property);
         }
         Object result = MethodUtils.invokeExactMethod(testInstance, methodName);
-        if (result instanceof  Optional){
+        if (result instanceof Optional) {
             assertEquals(value, ((Optional<?>) result).get());
-        }else {
+        } else {
             assertEquals(value, result);
         }
     }
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java
index 0a8c56ab6ff52664c6b24db6e7944fa7e4862b81..e1f7492c1e19dd826eefdafd7077943de11d9bd5 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java
@@ -55,7 +55,6 @@ import static org.mockito.Mockito.verify;
         SMLIntegrationService.class})
 public class SMLIntegrationServiceTest extends AbstractServiceIntegrationTest {
 
-
     @Autowired
     IdentifierService identifierService;
     @Autowired
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/resource/ResourceServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/resource/ResourceServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..cdb8ae53c293100016d60e0c44a56ad167cae266
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/resource/ResourceServiceTest.java
@@ -0,0 +1,168 @@
+package eu.europa.ec.edelivery.smp.services.resource;
+
+import eu.europa.ec.edelivery.smp.auth.SMPUserDetails;
+import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao;
+import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
+import eu.europa.ec.edelivery.smp.exceptions.MalformedIdentifierException;
+import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
+import eu.europa.ec.edelivery.smp.servlet.ResourceAction;
+import eu.europa.ec.edelivery.smp.servlet.ResourceRequest;
+import eu.europa.ec.edelivery.smp.servlet.ResourceResponse;
+import eu.europa.ec.edelivery.smp.testutil.TestConstants;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Arrays;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.when;
+
+class ResourceServiceTest extends AbstractJunit5BaseDao {
+    @Autowired
+    ResourceService testInstance;
+
+    ResourceRequest resourceRequest = Mockito.mock(ResourceRequest.class);
+    ResolvedData resolvedData = Mockito.mock(ResolvedData.class);
+    ResourceResponse resourceResponse = Mockito.mock(ResourceResponse.class);
+    SMPUserDetails user = Mockito.mock(SMPUserDetails.class);
+
+
+    @BeforeEach
+    public void prepareDatabase() {
+        testUtilsDao.clearData();
+        testUtilsDao.creatDomainMemberships();
+        testUtilsDao.createGroupMemberships();
+        testUtilsDao.createResourceMemberships();
+    }
+
+    @Test
+    void handleRequestFail() {
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.handleRequest(user, resourceRequest, resourceResponse));
+
+        assertThat(result.getMessage(), containsString("Invalid request"));
+    }
+
+    @ParameterizedTest
+    @CsvSource({
+            ", 'Location vector coordinates must not be null!'",
+            "1/2/3/4/5/6/7, 'More than max. count (5) of Resource Location vector coordinates!'",
+            TestConstants.TEST_DOMAIN_CODE_1 + ", 'Not enough path parameters to locate resource'",
+            TestConstants.TEST_DOMAIN_CODE_1 + "/" + TestConstants.TEST_RESOURCE_DEF_CPP + ", 'Not enough path parameters to locate resource'",
+            "badIdentifier, 'Malformed identifier, scheme and id should be delimited by double colon: badidentifier'",
+            "doc-type/badIdentifier, 'Malformed identifier, scheme and id should be delimited by double colon: doc-type'",
+            "domain/doc-type/badIdentifier, 'Malformed identifier, scheme and id should be delimited by double colon: domain'",
+    })
+    void handleRequestFailBadPath(String path, String errorMessage) {
+        when(resourceRequest.getUrlPathParameters()).thenReturn(path == null ? null : Arrays.asList(path.split("/")));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.handleRequest(user, resourceRequest, resourceResponse));
+
+        assertThat(result.getMessage(), containsString(errorMessage));
+    }
+
+    @ParameterizedTest
+    @CsvSource({
+            "'', 'Can not parse empty identifier value!'"
+    }
+    )
+    void handleRequestFailBadIdentifier(String path, String errorMessage) {
+        when(resourceRequest.getUrlPathParameters()).thenReturn(path == null ? null : Arrays.asList(path.split("/")));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+
+        MalformedIdentifierException result = assertThrows(MalformedIdentifierException.class,
+                () -> testInstance.handleRequest(user, resourceRequest, resourceResponse));
+
+        assertThat(result.getMessage(), containsString(errorMessage));
+    }
+
+    @Test
+    void handleRequestReadOK() {
+        when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::" + TestConstants.TEST_SG_ID_1));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.READ);
+        when(resourceRequest.getResolvedData()).thenReturn(resolvedData);
+        when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp());
+        when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1());
+        when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1());
+        testInstance.handleRequest(user, resourceRequest, resourceResponse);
+    }
+
+    @Test
+    void handleRequestCreateOK() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser1());
+        when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::0007:001:utest"));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE);
+        when(resourceRequest.getResolvedData()).thenReturn(resolvedData);
+        when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp());
+        when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1());
+        when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getInputStream()).thenReturn(ResourceResolverServiceTest.class.getResourceAsStream("/examples/oasis-smp-1.0/ServiceGroupOK.xml"));
+        testInstance.handleRequest(user, resourceRequest, resourceResponse);
+    }
+
+    @Test
+    void handleRequestDeleteOK() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser1());
+        when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::" + TestConstants.TEST_SG_ID_1));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE);
+        when(resourceRequest.getResolvedData()).thenReturn(resolvedData);
+        when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp());
+        when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1());
+        when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1());
+
+        testInstance.handleRequest(user, resourceRequest, resourceResponse);
+    }
+
+    @Test
+    void handleRequestCreateNotAuthorized() {
+
+        when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::0007:001:utest"));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE);
+        when(resourceRequest.getResolvedData()).thenReturn(resolvedData);
+        when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp());
+        when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1());
+        when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getInputStream()).thenReturn(ResourceResolverServiceTest.class.getResourceAsStream("/examples/oasis-smp-1.0/ServiceGroupOK.xml"));
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.handleRequest(user, resourceRequest, resourceResponse));
+
+        assertThat(result.getMessage(), containsString("User not authorized"));
+    }
+
+
+    @Test
+    void testFindOwnerOK() {
+        DBUser user = testInstance.findOwner(testUtilsDao.getUser1().getUsername());
+        assertNotNull(user);
+        assertEquals(testUtilsDao.getUser1().getUsername(), user.getUsername());
+    }
+
+    @Test
+    void testFindOwnerNotExists() {
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class, () -> testInstance.findOwner("CN=User not exists,OU=Test Users,O=Test Domain,C=BE:1234567890"));
+        assertThat(result.getMessage(), containsString("Invalid owner id"));
+    }
+
+
+    @Test
+    void testSplitSerialFromSubject() {
+        String[] values =
+                ResourceService.splitSerialFromSubject("CN=Test User 1,OU=Test Users,O=Test Domain,C=BE:1234567890");
+        assertEquals(2, values.length);
+        assertEquals("CN=Test User 1,OU=Test Users,O=Test Domain,C=BE", values[0]);
+        assertEquals("1234567890", values[1]);
+    }
+
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIAlertServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIAlertServiceIntegrationTest.java
index f1a327d75aea0ff3258ac9fc39558dc79ce41a2d..6ec81a26f65182eb0696a52f95b32ebd0c13bf81 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIAlertServiceIntegrationTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIAlertServiceIntegrationTest.java
@@ -13,7 +13,7 @@ import org.springframework.test.context.ContextConfiguration;
 
 import static org.junit.Assert.assertEquals;
 
-@Ignore
+
 @ContextConfiguration(classes = UIAlertService.class)
 public class UIAlertServiceIntegrationTest extends AbstractServiceIntegrationTest {
 
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentServiceTest.java
index bd2dbe93003611648a8cdc8145c4eac80c57b9a3..a4d2df8e4e68b11d6dcb352506c22aaf9a6d47a0 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentServiceTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentServiceTest.java
@@ -105,4 +105,42 @@ public class UIDocumentServiceTest extends AbstractServiceIntegrationTest {
 
         MatcherAssert.assertThat(result.getMessage(), CoreMatchers.containsString("Invalid request [ResourceValidation]"));
     }
+
+    @Test
+    public void testGetDocumentForResource(){
+        DBResource resource = testUtilsDao.getResourceD1G1RD1();
+        DocumentRo testDoc = testInstance.getDocumentForResource(resource.getId(), 1);
+        assertNotNull(testDoc.getPayload());
+    }
+
+    @Test
+    public void testGetDocumentForSubResource(){
+        DBSubresource subresource = testUtilsDao.getSubresourceD1G1RD1_S1();
+        DocumentRo testDoc = testInstance.getDocumentForSubResource(subresource.getId(), subresource.getResource().getId(), 1);
+        assertNotNull(testDoc.getPayload());
+    }
+
+    @Test
+    public void testSaveDocumentForResource(){
+        DBResource resource = testUtilsDao.getResourceD1G1RD1();
+        DocumentRo testDoc = testInstance.generateDocumentForResource(resource.getId(), null);
+        assertNotNull(testDoc.getPayload());
+        //when
+        DocumentRo result = testInstance.saveDocumentForResource(resource.getId(), testDoc);
+        // then
+        assertNotNull(result);
+    }
+
+    @Test
+    public void testSaveSubresourceDocumentForResource(){
+        DBSubresource subresource = testUtilsDao.getSubresourceD1G1RD1_S1();
+        DocumentRo testDoc = testInstance.generateDocumentForSubresource(subresource.getId(),
+                subresource.getResource().getId(),
+                null);
+        assertNotNull(testDoc.getPayload());
+        //when
+        DocumentRo result = testInstance.saveSubresourceDocumentForResource(subresource.getId(), subresource.getResource().getId(), testDoc);
+        // then
+        assertNotNull(result);
+    }
 }
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0785254230a7bc788b4010ea0ccc3c29dbcfed7
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicServiceTest.java
@@ -0,0 +1,95 @@
+package eu.europa.ec.edelivery.smp.services.ui;
+
+import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao;
+import eu.europa.ec.edelivery.smp.data.ui.*;
+import eu.europa.ec.edelivery.smp.exceptions.BadRequestException;
+import org.hamcrest.MatcherAssert;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@ContextConfiguration(classes = UIDomainPublicService.class)
+class UIDomainPublicServiceTest   extends AbstractJunit5BaseDao {
+
+    @Autowired
+    UIDomainPublicService testInstance;
+
+    @BeforeEach
+    public void prepareDatabase() {
+        testUtilsDao.clearData();
+        testUtilsDao.creatDomainMemberships();
+        testUtilsDao.createGroupMemberships();
+        testUtilsDao.createResourceMemberships();
+
+    }
+
+    @Test
+    public void testGetTableList() {
+        ServiceResult<DomainPublicRO>  result = testInstance.getTableList(-1, -1, null, null, null);
+        assertEquals(2, result.getCount().intValue());
+    }
+
+    @Test
+    public void testGetAllDomainsForDomainAdminUser() {
+        List<DomainRO> result = testInstance.getAllDomainsForDomainAdminUser(testUtilsDao.getUser1().getId());
+        assertEquals(1, result.size());
+    }
+
+    @Test
+    public void testGetAllDomainsForDomainAdminUser3() {
+        List<DomainRO> result = testInstance.getAllDomainsForDomainAdminUser(testUtilsDao.getUser3().getId());
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetAllDomainsForGroupAdminUser() {
+        List<DomainRO> result = testInstance.getAllDomainsForGroupAdminUser(testUtilsDao.getUser1().getId());
+        assertEquals(1, result.size());
+    }
+
+    @Test
+    public void testGetAllDomainsForGroupAdminUser3() {
+        List<DomainRO> result = testInstance.getAllDomainsForGroupAdminUser(testUtilsDao.getUser3().getId());
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetAllDomainsForResourceAdminUser() {
+        List<DomainRO> result = testInstance.getAllDomainsForResourceAdminUser(testUtilsDao.getUser1().getId());
+        assertEquals(1, result.size());
+    }
+
+    @Test
+    public void testGetAllDomainsForResourceAdminUser3() {
+        List<DomainRO> result = testInstance.getAllDomainsForResourceAdminUser(testUtilsDao.getUser3().getId());
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetDomainMembers() {
+        ServiceResult<MemberRO>  result = testInstance.getDomainMembers(testUtilsDao.getD1().getId(), -1, -1, null);
+        assertEquals(1, result.getCount().intValue());
+        assertEquals(1, result.getServiceEntities().size());
+    }
+
+    @Test
+    public void testGetResourceDefDomainList() {
+        List<ResourceDefinitionRO>  result = testInstance.getResourceDefDomainList(testUtilsDao.getD1().getId());
+        assertEquals(2, result.size());
+    }
+
+    @Test
+    public void testGetResourceDefDomainListFal() {
+        BadRequestException result = assertThrows(BadRequestException.class, () ->
+            testInstance.getResourceDefDomainList(-100L));
+
+        MatcherAssert.assertThat(result.getMessage(), org.hamcrest.Matchers.containsString("Domain does not exist in database"));
+
+    }
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java
index d9c36484fc49f9a3d77e0355f01e277f41112a9c..548ba4128bfd699a8c1cf0c6e61e2ed0bbcc5bef 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java
@@ -2,13 +2,10 @@ package eu.europa.ec.edelivery.smp.services.ui;
 
 
 import eu.europa.ec.edelivery.smp.data.model.DBDomain;
-import eu.europa.ec.edelivery.smp.data.model.doc.DBResource;
-import eu.europa.ec.edelivery.smp.data.ui.DeleteEntityValidation;
 import eu.europa.ec.edelivery.smp.data.ui.DomainRO;
 import eu.europa.ec.edelivery.smp.data.ui.ServiceResult;
 import eu.europa.ec.edelivery.smp.services.AbstractServiceIntegrationTest;
 import eu.europa.ec.edelivery.smp.testutil.TestDBUtils;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -19,34 +16,28 @@ import static org.junit.Assert.*;
 
 
 /**
- *  Purpose of class is to test UIDomainService base methods
+ * Purpose of class is to test UIDomainService base methods
  *
  * @author Joze Rihtarsic
  * @since 4.1
  */
-@Ignore
-@ContextConfiguration(classes= UIDomainService.class)
+@ContextConfiguration(classes = UIDomainService.class)
 public class UIDomainServiceIntegrationTest extends AbstractServiceIntegrationTest {
-    @Rule
-    public ExpectedException expectedExeption = ExpectedException.none();
 
     @Autowired
     protected UIDomainService testInstance;
 
-    protected void insertDataObjects(int size){
-        for (int i=0; i < size; i++){
-            DBDomain d = TestDBUtils.createDBDomain("domain"+i);
+    protected void insertDataObjects(int size) {
+        for (int i = 0; i < size; i++) {
+            DBDomain d = TestDBUtils.createDBDomain("domain" + i);
             domainDao.persistFlushDetach(d);
         }
     }
 
     @Test
-    public void testGetTableListEmpty(){
-
-        // given
-
-        //when
-        ServiceResult<DomainRO> res = testInstance.getTableList(-1,-1,null, null, null);
+    public void testGetTableListEmpty() {
+        // given when
+        ServiceResult<DomainRO> res = testInstance.getTableList(-1, -1, null, null, null);
         // then
         assertNotNull(res);
         assertEquals(0, res.getCount().intValue());
@@ -57,12 +48,12 @@ public class UIDomainServiceIntegrationTest extends AbstractServiceIntegrationTe
     }
 
     @Test
-    public void testGetTableList15(){
+    public void testGetTableList15() {
 
         // given
         insertDataObjects(15);
         //when
-        ServiceResult<DomainRO> res = testInstance.getTableList(-1,-1,null, null,null);
+        ServiceResult<DomainRO> res = testInstance.getTableList(-1, -1, null, null, null);
 
 
         // then
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIPropertyServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIPropertyServiceIntegrationTest.java
index 8a691e1754ec2d2240c98cfe4596690308444e22..210c5ee1fb0e2da12e1f315098933c36993aa826 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIPropertyServiceIntegrationTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIPropertyServiceIntegrationTest.java
@@ -24,11 +24,10 @@ import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.SMP_CLUSTE
 import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.SMP_PROPERTY_REFRESH_CRON;
 import static org.junit.Assert.*;
 
-@Ignore
+
 @ContextConfiguration(classes = {UIPropertyService.class})
 public class UIPropertyServiceIntegrationTest extends AbstractServiceIntegrationTest {
 
-
     @Autowired
     protected UIPropertyService testInstance;
     @Autowired
@@ -130,7 +129,7 @@ public class UIPropertyServiceIntegrationTest extends AbstractServiceIntegration
         assertEquals(propertyName, result.getProperty());
         assertEquals(propertyValue, result.getValue());
         assertFalse(result.isPropertyValid());
-        MatcherAssert.assertThat(result.getErrorMessage(), CoreMatchers.containsString("Invalid integer: [" + propertyValue + "]. Error:NumberFormatException: For input string: \"" + propertyValue + "\"!"));
+        MatcherAssert.assertThat(result.getErrorMessage(), CoreMatchers.containsString("Invalid integer: [" + propertyValue + "]. Error:NumberFormatException"));
     }
 
     @Test
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java
index e60d188ac77d584a79c2256e16cd534d16346514..bac7784cce12a1ca7dec89c7b8fd54627a88e12b 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java
@@ -1,6 +1,7 @@
 package eu.europa.ec.edelivery.smp.services.ui;
 
 import eu.europa.ec.edelivery.smp.config.ConversionTestConfig;
+import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao;
 import eu.europa.ec.edelivery.smp.data.dao.ResourceDao;
 import eu.europa.ec.edelivery.smp.data.dao.ResourceMemberDao;
 import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType;
@@ -10,10 +11,11 @@ import eu.europa.ec.edelivery.smp.data.model.user.DBResourceMember;
 import eu.europa.ec.edelivery.smp.data.ui.MemberRO;
 import eu.europa.ec.edelivery.smp.data.ui.ResourceRO;
 import eu.europa.ec.edelivery.smp.data.ui.ServiceResult;
-import eu.europa.ec.edelivery.smp.services.AbstractServiceIntegrationTest;
+import eu.europa.ec.edelivery.smp.exceptions.ErrorCode;
+import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
 import eu.europa.ec.edelivery.smp.testutil.TestROUtils;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.convert.ConversionService;
 import org.springframework.test.context.ContextConfiguration;
@@ -21,10 +23,12 @@ import org.springframework.test.context.ContextConfiguration;
 import java.util.UUID;
 
 import static eu.europa.ec.edelivery.smp.testutil.TestConstants.TEST_SG_SCHEMA_1;
-import static org.junit.Assert.*;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.*;
 
 @ContextConfiguration(classes = {UIResourceService.class, ConversionTestConfig.class})
-public class UIResourceServiceTest extends AbstractServiceIntegrationTest {
+public class UIResourceServiceTest extends AbstractJunit5BaseDao {
     @Autowired
     protected UIResourceService testInstance;
 
@@ -35,7 +39,7 @@ public class UIResourceServiceTest extends AbstractServiceIntegrationTest {
     @Autowired
     ConversionService conversionService;
 
-    @Before
+    @BeforeEach
     public void prepareDatabase() {
         // setup initial data!
         testUtilsDao.clearData();
@@ -77,6 +81,71 @@ public class UIResourceServiceTest extends AbstractServiceIntegrationTest {
         assertEquals(testResource.getIdentifierScheme(), result.getIdentifierScheme());
     }
 
+    @Test
+    public void testCreateResourceForGroupFailsGroupNotExists() {
+        // given
+        ResourceRO testResource = TestROUtils.createResource(UUID.randomUUID().toString(), TEST_SG_SCHEMA_1,
+                testUtilsDao.getDomainResourceDefD1R1().getResourceDef().getIdentifier());
+
+        // when
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.createResourceForGroup(testResource, -100L,
+                        testUtilsDao.getD1().getId(), testUtilsDao.getUser1().getId()));
+        // then
+        assertNotNull(result);
+        assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode());
+        assertThat(result.getMessage(), containsString("Group does not exist"));
+    }
+
+    @Test
+    public void testCreateResourceForGroupFailsGroupNotForDomain() {
+        // given
+        ResourceRO testResource = TestROUtils.createResource(UUID.randomUUID().toString(), TEST_SG_SCHEMA_1,
+                testUtilsDao.getDomainResourceDefD1R1().getResourceDef().getIdentifier());
+
+        // when
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.createResourceForGroup(testResource, testUtilsDao.getGroupD1G1().getId(), -100L,
+                        testUtilsDao.getUser1().getId()));
+        // then
+        assertNotNull(result);
+        assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode());
+        assertThat(result.getMessage(), containsString("Group does not belong to the given domain"));
+    }
+
+    @Test
+    public void testCreateResourceForGroupFailInvalidResourceDef() {
+        // given
+        ResourceRO testResource = TestROUtils.createResource(UUID.randomUUID().toString(), TEST_SG_SCHEMA_1,
+                UUID.randomUUID().toString());
+
+        // when
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.createResourceForGroup(testResource, testUtilsDao.getGroupD1G1().getId(), testUtilsDao.getD1().getId(),
+                        testUtilsDao.getUser1().getId()));
+        // then
+        assertNotNull(result);
+        assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode());
+        assertThat(result.getMessage(), containsString("Resource definition [" + testResource.getResourceTypeIdentifier() + "] does not exist!"));
+    }
+
+    @Test
+    public void testCreateResourceForGroupFailAlreadyExists() {
+        // given
+        DBResource dbResource = testUtilsDao.getResourceD1G1RD1();
+        ResourceRO testResource = TestROUtils.createResource(dbResource.getIdentifierValue(), dbResource.getIdentifierScheme(),
+                testUtilsDao.getDomainResourceDefD1R1().getResourceDef().getIdentifier());
+
+        // when
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.createResourceForGroup(testResource, testUtilsDao.getGroupD1G1().getId(), testUtilsDao.getD1().getId(),
+                        testUtilsDao.getUser1().getId()));
+        // then
+        assertNotNull(result);
+        assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode());
+        assertThat(result.getMessage(), containsString("Resource [val:" + testResource.getIdentifierValue() + " scheme:" + testResource.getIdentifierScheme() + "] already exists for domain!"));
+    }
+
     @Test
     public void testUpdateResourceForGroup() {
         // given
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..7863821bf856a5fba4959254feaa6538091dab76
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceServiceTest.java
@@ -0,0 +1,141 @@
+package eu.europa.ec.edelivery.smp.services.ui;
+
+import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao;
+import eu.europa.ec.edelivery.smp.data.ui.SubresourceRO;
+import eu.europa.ec.edelivery.smp.exceptions.BadRequestException;
+import eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode;
+import eu.europa.ec.edelivery.smp.exceptions.ErrorCode;
+import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
+import org.hamcrest.MatcherAssert;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+
+import java.util.List;
+import java.util.UUID;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.jupiter.api.Assertions.*;
+
+@ContextConfiguration(classes = UIDomainPublicService.class)
+class UISubresourceServiceTest extends AbstractJunit5BaseDao {
+
+    @Autowired
+    UISubresourceService testInstance;
+
+    @BeforeEach
+    public void prepareDatabase() {
+        testUtilsDao.clearData();
+        testUtilsDao.createSubresources();
+        testUtilsDao.creatDomainMemberships();
+        testUtilsDao.createGroupMemberships();
+        testUtilsDao.createResourceMemberships();
+    }
+
+    @Test
+    void testGetSubResourcesForResourceOK() {
+        List<SubresourceRO> result = testInstance.getSubResourcesForResource(testUtilsDao.getResourceD1G1RD1().getId());
+        assertNotNull(result);
+        assertEquals(1, result.size());
+        assertEquals(testUtilsDao.getSubresourceD1G1RD1_S1().getIdentifierValue(), result.get(0).getIdentifierValue());
+        assertEquals(testUtilsDao.getSubresourceD1G1RD1_S1().getIdentifierScheme(), result.get(0).getIdentifierScheme());
+    }
+
+    @Test
+    void testGetSubResourcesForResourceEmpty() {
+        List<SubresourceRO> result = testInstance.getSubResourcesForResource(-1000L);
+        assertNotNull(result);
+        assertEquals(0, result.size());
+    }
+/*
+    @ParameterizedTest
+    @CsvSource({
+            "1, -1, 'Resource does not exist'",
+            "-1, 1, 'Subresource does not exist!'",
+            "-1, 1, 'Subresource does not belong to the resource!",
+            })*/
+    @Test
+    void testDeleteSubresourceFromResourceFailedResourceNotExists() {
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.deleteSubresourceFromResource(testUtilsDao.getSubresourceD1G1RD1_S1().getId(), -1L));
+
+        assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode());
+        assertThat(result.getMessage(), containsString("Resource does not exist"));
+    }
+
+    @Test
+    void testDeleteSubresourceFromResourceFailedSubResourceNotExists() {
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.deleteSubresourceFromResource(-1L, testUtilsDao.getResourceD1G1RD1().getId()));
+
+        assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode());
+        assertThat(result.getMessage(), containsString("Subresource does not exist!"));
+    }
+
+    @Test
+    void testDeleteSubresourceFromResourceFailedSubResourceNotBelong() {
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.deleteSubresourceFromResource(testUtilsDao.getSubresourceD2G1RD1_S1().getId(),
+                        testUtilsDao.getResourceD1G1RD1().getId()));
+
+        assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode());
+        assertThat(result.getMessage(), containsString("Subresource does not belong to the resource!"));
+    }
+
+    @Test
+    void testDeleteSubresourceFromResourceFailedSubResourceOK() {
+
+        SubresourceRO result = testInstance.deleteSubresourceFromResource(
+                    testUtilsDao.getSubresourceD1G1RD1_S1().getId(),
+                      testUtilsDao.getResourceD1G1RD1().getId());
+
+        assertNotNull(result);
+        assertEquals(testUtilsDao.getSubresourceD1G1RD1_S1().getIdentifierValue(), result.getIdentifierValue());
+        assertEquals(testUtilsDao.getSubresourceD1G1RD1_S1().getIdentifierScheme(), result.getIdentifierScheme());
+    }
+
+    @Test
+    void createSubresourceForResource() {
+        SubresourceRO subresourceRO = new SubresourceRO();
+        subresourceRO.setIdentifierScheme("scheme");
+        subresourceRO.setIdentifierValue(UUID.randomUUID().toString());
+        subresourceRO.setSubresourceTypeIdentifier(testUtilsDao.getSubresourceDefSmpMetadata().getIdentifier());
+        int count = testInstance.getSubResourcesForResource(testUtilsDao.getResourceD1G1RD1().getId()).size();
+        SubresourceRO result = testInstance.createSubresourceForResource(subresourceRO,
+                testUtilsDao.getResourceD1G1RD1().getId());
+
+        assertNotNull(result);
+        assertEquals(subresourceRO.getIdentifierValue(), result.getIdentifierValue());
+        assertEquals(subresourceRO.getIdentifierScheme(), result.getIdentifierScheme());
+        assertEquals(count + 1, testInstance.getSubResourcesForResource(testUtilsDao.getResourceD1G1RD1().getId()).size());
+    }
+
+    @Test
+    void createSubresourceForResourceFailResourceNotExists() {
+        SubresourceRO subresourceRO = Mockito.mock(SubresourceRO.class);
+
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.createSubresourceForResource(subresourceRO, -1L));
+
+        assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode());
+        assertThat(result.getMessage(), containsString("Resource does not exist"));
+    }
+
+    @Test
+    void createSubresourceForResourceFailDefinitionNotExists() {
+        String def = UUID.randomUUID().toString();
+        SubresourceRO subresourceRO = Mockito.mock(SubresourceRO.class);
+        Mockito.when(subresourceRO.getSubresourceTypeIdentifier()).thenReturn(def);
+
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.createSubresourceForResource(subresourceRO, testUtilsDao.getResourceD1G1RD1().getId()));
+
+        assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode());
+        assertThat(result.getMessage(), containsString("Subresource definition ["+def+"] does not exist"));
+    }
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceIntegrationTest.java
index aff77d50b918b23e217e4899ea84708d2451e26f..a92b6e9e3393d9d595cc2cffe92d296a840de14f 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceIntegrationTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceIntegrationTest.java
@@ -13,7 +13,6 @@ import org.apache.commons.io.IOUtils;
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.MatcherAssert;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentMatchers;
@@ -167,6 +166,15 @@ public class UITruststoreServiceIntegrationTest extends AbstractServiceIntegrati
         assertFalse(testInstance.isSubjectOnTrustedList(certificateRO.getSubject()));
     }
 
+    @Test
+    public void testDeleteCertificateNotExists() throws Exception {
+        // given
+        // when
+        X509Certificate cert = testInstance.deleteCertificate("alias-not-exists");
+        // then
+        assertNull(cert);
+    }
+
     @Test
     public void testIsTruststoreChanged() throws Exception {
         // given
@@ -203,16 +211,16 @@ public class UITruststoreServiceIntegrationTest extends AbstractServiceIntegrati
     }
 
     @Test
-    public void  validateCertificateWithTruststoreNullCertificate()  {
+    public void validateCertificateWithTruststoreNullCertificate() {
 
         CertificateException result = assertThrows(CertificateException.class,
-                () ->testInstance.validateCertificateWithTruststore(null));
+                () -> testInstance.validateCertificateWithTruststore(null));
 
         assertThat(result.getMessage(), containsString("The X509Certificate is null "));
     }
 
     @Test
-    public void  validateCertificateWithTruststoreNullTruststore() throws Exception {
+    public void validateCertificateWithTruststoreNullTruststore() throws Exception {
         String certSubject = "CN=SMP Test,OU=eDelivery,O=DIGITAL,C=BE";
         X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(certSubject);
         Mockito.doReturn(null).when(testInstance).getTrustStore();
@@ -232,7 +240,7 @@ public class UITruststoreServiceIntegrationTest extends AbstractServiceIntegrati
         CertificateRO cer = testInstance.getCertificateData(buff);
 
         //then
-        assertTrue( cer.isInvalid());
+        assertTrue(cer.isInvalid());
         assertEquals("Can not read the certificate!", cer.getInvalidReason());
     }
 
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceTest.java
index 11c7672d81dd8c86051a21978a0cf23d55bed4ca..9d4c18fbc93f24a0cf5facb02516d9c2c0ac2b62 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceTest.java
@@ -9,9 +9,12 @@ import eu.europa.ec.edelivery.smp.exceptions.CertificateNotTrustedException;
 import eu.europa.ec.edelivery.smp.services.CRLVerifierService;
 import eu.europa.ec.edelivery.smp.services.ConfigurationService;
 import eu.europa.ec.edelivery.smp.testutil.X509CertificateTestUtils;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
+import org.apache.commons.io.FileUtils;
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.ArgumentMatchers;
 import org.mockito.Mockito;
@@ -20,22 +23,26 @@ import org.springframework.core.convert.ConversionService;
 import javax.security.auth.x500.X500Principal;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.math.BigInteger;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.security.KeyStore;
-import java.security.Security;
 import java.security.cert.*;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
+import java.util.*;
 import java.util.regex.Pattern;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
 public class UITruststoreServiceTest {
+    // test data
+    protected Path resourceDirectory = Paths.get("src", "test", "resources", "truststore");
+    protected Path targetDirectory = Paths.get("target", "test-uitruststoreservice");
+    protected Path targetTruststore = targetDirectory.resolve("smp-truststore.jks");
+
+    String truststorePassword = "test123";
+    // mocked services
     ConfigurationService configurationService = Mockito.mock(ConfigurationService.class);
     CRLVerifierService crlVerifierService = Mockito.mock(CRLVerifierService.class);
     ConversionService conversionService = Mockito.mock(ConversionService.class);
@@ -43,9 +50,10 @@ public class UITruststoreServiceTest {
 
     UITruststoreService testInstance = spy(new UITruststoreService(configurationService, crlVerifierService, conversionService, userDao));
 
-    @Before
-    public void setup() {
-        Security.insertProviderAt(new org.bouncycastle.jce.provider.BouncyCastleProvider(), 1);
+    @BeforeEach
+    public void setup() throws IOException {
+        testInstance.init();
+        resetKeystore();
     }
 
     @Test
@@ -160,7 +168,6 @@ public class UITruststoreServiceTest {
         assertEquals(errorMessage, certData.getInvalidReason());
     }
 
-
     @Test
     public void validateCertificateSubjectExpressionLegacyIfNullSkip() throws CertificateException {
         X509Certificate cert = Mockito.mock(X509Certificate.class);
@@ -177,8 +184,8 @@ public class UITruststoreServiceTest {
         CertificateException resultException = assertThrows(CertificateException.class, () -> testInstance.validateCertificateSubjectExpressionLegacy(certificate));
 
         assertEquals("Certificate subject ["
-                +certificate.getSubjectX500Principal().getName(X500Principal.RFC2253)
-                +"] does not match the regular expression configured ["+regularExpression+"]",
+                        + certificate.getSubjectX500Principal().getName(X500Principal.RFC2253)
+                        + "] does not match the regular expression configured [" + regularExpression + "]",
                 resultException.getMessage());
     }
 
@@ -195,7 +202,7 @@ public class UITruststoreServiceTest {
     }
 
     @Test
-    public void loadTruststoreDoNotThrowError(){
+    public void loadTruststoreDoNotThrowError() {
         // test for null file
         KeyStore result = testInstance.loadTruststore(null);
         assertNull(result);
@@ -203,35 +210,225 @@ public class UITruststoreServiceTest {
         result = testInstance.loadTruststore(new File(UUID.randomUUID().toString()));
         assertNull(result);
         // test for file credentials not exist
-        Path resourceDirectory = Paths.get("src", "test", "resources", "truststore","smp-truststore.jks");
-        assertTrue(resourceDirectory.toFile().exists());
+
+        assertTrue(targetTruststore.toFile().exists());
         doReturn(null).when(configurationService).getTruststoreCredentialToken();
-        result = testInstance.loadTruststore(resourceDirectory.toFile());
+        result = testInstance.loadTruststore(targetTruststore.toFile());
         assertNull(result);
     }
 
+    @Test
+    public void testTruststoreNotConfiguredNotConfigured() {
+        doReturn(null).when(configurationService).getTruststoreFile();
+        boolean result = testInstance.truststoreNotConfigured();
+        assertTrue(result);
+    }
+
+    @Test
+    public void testTruststoreNotConfiguredConfigured() {
+
+        doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile();
+        boolean result = testInstance.truststoreNotConfigured();
+        assertFalse(result);
+    }
+
+    @Test
+    public void testRefreshDataNoConfiguration() {
+
+        doReturn(null).when(configurationService).getTruststoreFile();
+        // must not throw error
+        testInstance.refreshData();
+        //then
+        assertNull(testInstance.getTrustStore());
+        assertNull(testInstance.getTrustManagers());
+        assertTrue(testInstance.getNormalizedTrustedList().isEmpty());
+    }
+
+    @Test
+    public void testRefreshDataOk() {
+
+        doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile();
+        doReturn(truststorePassword).when(configurationService).getTruststoreCredentialToken();
+        // must not throw error
+        testInstance.refreshData();
+        //then
+        assertNotNull(testInstance.getTrustStore());
+        assertNotNull(testInstance.getTrustManagers());
+        assertFalse(testInstance.getNormalizedTrustedList().isEmpty());
+    }
+
+    @Test
+    public void getCertificateDataNullEmpty() {
+
+        // must not throw error
+        CertificateRO certificateRO = testInstance.getCertificateData(null);
+        //then
+        assertNotNull(certificateRO);
+        assertTrue(certificateRO.isInvalid());
+        assertTrue(certificateRO.isError());
+        assertEquals("Can not read [null/empty] certificate!", certificateRO.getInvalidReason());
+    }
+
+    @Test
+    public void getCertificateDataInvalidCertificate() {
+
+        // must not throw error
+        CertificateRO certificateRO = testInstance.getCertificateData("notACertificate".getBytes());
+        //then
+        assertNotNull(certificateRO);
+        assertTrue(certificateRO.isInvalid());
+        assertTrue(certificateRO.isError());
+        assertEquals("Can not read the certificate!", certificateRO.getInvalidReason());
+    }
+
+    @Test
+    public void getCertificateDataNoValidationOK() throws Exception {
+        String subject = "CN=Something,O=test,C=EU";
+        X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject);
+        CertificateRO convertedCert = Mockito.mock(CertificateRO.class);
+        doReturn(convertedCert).when(conversionService).convert(certificate, CertificateRO.class);
+        // must not throw error
+        CertificateRO certificateRO = testInstance.getCertificateData(certificate.getEncoded());
+        //then
+        assertNotNull(certificateRO);
+        assertEquals(convertedCert, certificateRO);
+    }
+
+    @Test
+    public void getCertificateDataNoValidationBase64OK() throws Exception {
+        String subject = "CN=Something,O=test,C=EU";
+        X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject);
+        String base64Cert = Base64.getEncoder().encodeToString(certificate.getEncoded());
+        CertificateRO convertedCert = Mockito.mock(CertificateRO.class);
+        doReturn(convertedCert).when(conversionService).convert(certificate, CertificateRO.class);
+
+        // must not throw error
+        CertificateRO certificateRO = testInstance.getCertificateData(base64Cert, false, false);
+        //then
+        assertNotNull(certificateRO);
+        assertEquals(convertedCert, certificateRO);
+    }
+
+    @Test
+    public void getCertificateDataValidateOK() throws Exception {
+        String subject = "CN=Something,O=test,C=EU";
+        X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject);
+        CertificateRO convertedCert = Mockito.mock(CertificateRO.class);
+        doReturn(convertedCert).when(conversionService).convert(certificate, CertificateRO.class);
+        // must not throw error
+        CertificateRO certificateRO = testInstance.getCertificateData(certificate.getEncoded(), true, true);
+        //then
+        assertNotNull(certificateRO);
+        assertEquals(convertedCert, certificateRO);
+    }
+
+    @Test
+    public void testValidateCertificateWithTruststoreNull() {
+        // when
+        CertificateException result = assertThrows(CertificateException.class, () -> testInstance.validateCertificateWithTruststore(null));
+        // then
+        MatcherAssert.assertThat(result.getMessage(), Matchers.containsString("The X509Certificate is null"));
+    }
+
+    @Test
+    public void testValidateCertificateWithTruststoreNoTruststoreConfigured() throws Exception {
+        String subject = "CN=Something,O=test,C=EU";
+        X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject);
+        doReturn(null).when(configurationService).getTruststoreFile();
+        // when
+        testInstance.refreshData();
+        testInstance.validateCertificateWithTruststore(certificate);
+        // then
+        // no error is thrown
+        Mockito.verify(configurationService, Mockito.times(1)).getTruststoreFile();
+    }
+
+    @Test
+    public void testValidateCertificateWithTruststoreNotTrusted() throws Exception {
+        String subject = "CN=Something,O=test,C=EU";
+        X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject);
+        doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile();
+        doReturn(truststorePassword).when(configurationService).getTruststoreCredentialToken();
+        // when
+        testInstance.refreshData();
+        CertificateException result = assertThrows(CertificateException.class,
+                () -> testInstance.validateCertificateWithTruststore(certificate));
+        // then
+        MatcherAssert.assertThat(result.getMessage(), Matchers.containsString("is not trusted!"));
+    }
+
+    @Test
+    public void testValidateAllowedCertificateKeyTypes() throws Exception {
+        String subject = "CN=Something,O=test,C=EU";
+        X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject);
+        doReturn(Collections.singletonList("FutureKeyAlgorithm")).when(configurationService).getAllowedCertificateKeyTypes();
+        //when
+        CertificateException result = assertThrows(CertificateException.class,
+                () -> testInstance.validateAllowedCertificateKeyTypes(certificate));
+        // then
+        MatcherAssert.assertThat(result.getMessage(), Matchers.containsString("Certificate does not have allowed key algorithm type!"));
+    }
+
+
+    @Test
+    public void testAddCertificate() throws Exception  {
+        String subject = "CN=Something,O=test,C=EU";
+        X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject);
+
+        doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile();
+        doReturn(truststorePassword).when(configurationService).getTruststoreCredentialToken();
+        testInstance.refreshData();
+        int count = testInstance.getNormalizedTrustedList().size();
+        // when
+        testInstance.addCertificate(null, certificate);
+
+        assertEquals(count + 1, testInstance.getNormalizedTrustedList().size());
+    }
+
+    @Test
+    public void testDeleteCertificate() throws Exception  {
+        String subject = "CN=Something,O=test,C=EU";
+        X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject);
+        doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile();
+        doReturn(truststorePassword).when(configurationService).getTruststoreCredentialToken();
+        String alias = "testInstanceCertificate";
+        testInstance.addCertificate(alias, certificate);
+        int count = testInstance.getNormalizedTrustedList().size();
+
+        //then
+        X509Certificate result = testInstance.deleteCertificate(alias);
+        //when
+        assertNotNull(result);
+        assertEquals(count - 1, testInstance.getNormalizedTrustedList().size());
+    }
 
     /**
      * This method is not a tests is it done for generating the  tests Soapui certificates
+     *
      * @throws Exception
      */
     @Test
-    @Ignore
+    @Disabled
     public void generateSoapUITestCertificates() throws Exception {
 
-        List <String[]> listCerts = Arrays.asList( new String[]{"f71ee8b11cb3b787","CN=EHEALTH_SMP_EC,O=European Commission,C=BE","ehealth_smp_ec",},
-                new String[]{"E07B6b956330a19a","CN=blue_gw,O=eDelivery,C=BE","blue_gw"},
-                new String[]{"9792ce69BC89F14C","CN=red_gw,O=eDelivery,C=BE","red_gw"}
+        List<String[]> listCerts = Arrays.asList(new String[]{"f71ee8b11cb3b787", "CN=EHEALTH_SMP_EC,O=European Commission,C=BE", "ehealth_smp_ec",},
+                new String[]{"E07B6b956330a19a", "CN=blue_gw,O=eDelivery,C=BE", "blue_gw"},
+                new String[]{"9792ce69BC89F14C", "CN=red_gw,O=eDelivery,C=BE", "red_gw"}
         );
         String token = "test123";
-        File keystoreFile = new File( "./target/smp-test-examples.p12");
+        File keystoreFile = new File("./target/smp-test-examples.p12");
         KeyStore keyStore = KeystoreUtils.createNewKeystore(keystoreFile, token);
-        for (String[] data: listCerts) {
-            BigInteger serial = new BigInteger(data[0],16);
-            X509CertificateUtils.createAndStoreSelfSignedCertificate(serial, data[1],data[2], keyStore, token);
+        for (String[] data : listCerts) {
+            BigInteger serial = new BigInteger(data[0], 16);
+            X509CertificateUtils.createAndStoreSelfSignedCertificate(serial, data[1], data[2], keyStore, token);
         }
         try (FileOutputStream fos = new FileOutputStream(keystoreFile)) {
             keyStore.store(fos, token.toCharArray());
         }
     }
+
+    protected void resetKeystore() throws IOException {
+        FileUtils.deleteDirectory(targetDirectory.toFile());
+        FileUtils.copyDirectory(resourceDirectory.toFile(), targetDirectory.toFile());
+    }
 }
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java
index 93760e4107975bc82ef420384c6463dcf1a0ada4..598ec7fe0d46ac1a25484a3a636c42cd07a5891e 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java
@@ -2,6 +2,9 @@ package eu.europa.ec.edelivery.smp.services.ui;
 
 
 import eu.europa.ec.edelivery.smp.config.ConversionTestConfig;
+import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao;
+import eu.europa.ec.edelivery.smp.data.dao.CredentialDao;
+import eu.europa.ec.edelivery.smp.data.dao.UserDao;
 import eu.europa.ec.edelivery.smp.data.enums.ApplicationRoleType;
 import eu.europa.ec.edelivery.smp.data.enums.CredentialTargetType;
 import eu.europa.ec.edelivery.smp.data.enums.CredentialType;
@@ -9,13 +12,17 @@ import eu.europa.ec.edelivery.smp.data.model.user.DBCredential;
 import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
 import eu.europa.ec.edelivery.smp.data.ui.*;
 import eu.europa.ec.edelivery.smp.data.ui.enums.EntityROStatus;
+import eu.europa.ec.edelivery.smp.exceptions.BadRequestException;
+import eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode;
 import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
-import eu.europa.ec.edelivery.smp.services.AbstractServiceIntegrationTest;
 import eu.europa.ec.edelivery.smp.testutil.TestDBUtils;
 import eu.europa.ec.edelivery.smp.testutil.TestROUtils;
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.MatcherAssert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.mockito.Mockito;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.crypto.bcrypt.BCrypt;
@@ -27,7 +34,8 @@ import java.util.Optional;
 import java.util.UUID;
 
 import static eu.europa.ec.edelivery.smp.testutil.SMPAssert.assertEqualDates;
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.when;
 
 
 /**
@@ -37,11 +45,17 @@ import static org.junit.Assert.*;
  * @since 4.1
  */
 @ContextConfiguration(classes = {UIUserService.class, ConversionTestConfig.class})
-public class UIUserServiceIntegrationTest extends AbstractServiceIntegrationTest {
+public class UIUserServiceIntegrationTest extends AbstractJunit5BaseDao {
 
     @Autowired
     protected UIUserService testInstance;
 
+    @Autowired
+    protected UserDao userDao;
+
+    @Autowired
+    protected CredentialDao credentialDao;
+
 
     protected void insertDataObjects(int size) {
         for (int i = 0; i < size; i++) {
@@ -408,6 +422,26 @@ public class UIUserServiceIntegrationTest extends AbstractServiceIntegrationTest
         assertEquals(count + 2, result.getServiceEntities().size());
         MatcherAssert.assertThat(result.getServiceEntities().get(0).getUsername(), CoreMatchers.containsStringIgnoringCase("test"));
         MatcherAssert.assertThat(result.getServiceEntities().get(1).getUsername(), CoreMatchers.containsStringIgnoringCase("test"));
+    }
+
+    @ParameterizedTest
+    @CsvSource({
+            ", USERNAME_PASSWORD, UI, 1, USERNAME_PASSWORD, UI,  'Credential does not exist!'",
+            "1, USERNAME_PASSWORD, UI, 2, USERNAME_PASSWORD, UI,  'User is not owner of the credential'",
+            "1, USERNAME_PASSWORD, UI, 1, ACCESS_TOKEN, UI,  'Credentials are not expected credential type!'",
+            "1, USERNAME_PASSWORD, UI, 1, USERNAME_PASSWORD, REST_API,  'Credentials are not expected target type!'"})
+    public void testValidateCredentialsFails(Long credentialUserId, CredentialType credentialType, CredentialTargetType credentialTargetType, Long testUserId, CredentialType testCredentialType, CredentialTargetType testCredentialTargetType, String errorMessage){
+        DBCredential credential = credentialUserId == null? null:Mockito.mock(DBCredential.class);
+        if (credential!= null){
+            DBUser user = Mockito.mock(DBUser.class);
+            when(user.getId()).thenReturn(credentialUserId);
+            when(credential.getUser()).thenReturn(user);
+            when(credential.getCredentialType()).thenReturn(credentialType);
+            when(credential.getCredentialTarget()).thenReturn(credentialTargetType);
+        }
 
+        BadRequestException result = assertThrows(BadRequestException.class, () -> testInstance.validateCredentials(credential, testUserId, testCredentialType, testCredentialTargetType));
+        assertEquals(ErrorBusinessCode.UNAUTHORIZED, result.getErrorBusinessCode());
+        assertEquals(errorMessage, result.getMessage());
     }
 }
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/servlet/ResourceResponseTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/servlet/ResourceResponseTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f5ab899f6e76052d101b526f6b2bae31a503bb4a
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/servlet/ResourceResponseTest.java
@@ -0,0 +1,76 @@
+package eu.europa.ec.edelivery.smp.servlet;
+
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import javax.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class ResourceResponseTest {
+
+    HttpServletResponse mockHttpServletResponse = Mockito.mock(HttpServletResponse.class);
+    ResourceResponse testInstance = new ResourceResponse(mockHttpServletResponse);
+
+    @Test
+    void testGetHttpStatus() {
+        int httpStatus = 200;
+        Mockito.when(mockHttpServletResponse.getStatus()).thenReturn(httpStatus);
+        int result = testInstance.getHttpStatus();
+
+        assertEquals(httpStatus, result);
+    }
+
+    @Test
+    void testSetHttpStatus() {
+        int httpStatus = 200;
+        testInstance.setHttpStatus(httpStatus);
+
+        Mockito.verify(mockHttpServletResponse).setStatus(httpStatus);
+    }
+
+    @Test
+    void testGetMimeType() {
+        String mimeType = "mockMimeType";
+        Mockito.when(mockHttpServletResponse.getContentType()).thenReturn(mimeType);
+        String result = testInstance.getMimeType();
+
+        assertEquals(mimeType, result);
+    }
+
+    @Test
+    void testSetContentType() {
+        String mimeType = "mockMimeType";
+        testInstance.setContentType(mimeType);
+
+        Mockito.verify(mockHttpServletResponse).setContentType(mimeType);
+    }
+
+    @Test
+    void testGetHttpHeader() {
+        String name = "mockName";
+        String value = "mockValue";
+        Mockito.when(mockHttpServletResponse.getHeader(name)).thenReturn(value);
+        String result = testInstance.getHttpHeader(name);
+
+        assertEquals(value, result);
+    }
+
+    @Test
+    void testSetHttpHeader() {
+        String name = "mockName";
+        String value = "mockValue";
+        testInstance.setHttpHeader(name, value);
+
+        Mockito.verify(mockHttpServletResponse).setHeader(name, value);
+    }
+
+    @Test
+    void testGetOutputStream() throws IOException {
+        testInstance.getOutputStream();
+
+        Mockito.verify(mockHttpServletResponse).getOutputStream();
+    }
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java
index e0e494ae2a7f64e3950584eba3772e5af4d57fd2..d4b8239f3efdf67fc67cac69e141af25baefc5b7 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java
@@ -2,7 +2,6 @@ package eu.europa.ec.edelivery.smp.testutil;
 
 import eu.europa.ec.edelivery.smp.conversion.X509CertificateToCertificateROConverter;
 import eu.europa.ec.edelivery.smp.data.enums.VisibilityType;
-import eu.europa.ec.edelivery.smp.data.model.DBGroup;
 import eu.europa.ec.edelivery.smp.data.ui.CertificateRO;
 import eu.europa.ec.edelivery.smp.data.ui.GroupRO;
 import eu.europa.ec.edelivery.smp.data.ui.ResourceRO;
@@ -32,7 +31,7 @@ public class TestROUtils {
         return CERT_CONVERTER.convert(cert);
     }
 
-    public static GroupRO createGroup(String groupName, VisibilityType visibility){
+    public static GroupRO createGroup(String groupName, VisibilityType visibility) {
         GroupRO group = new GroupRO();
         group.setGroupName(groupName);
         group.setGroupDescription(anyString());
@@ -41,7 +40,7 @@ public class TestROUtils {
     }
 
 
-    public static String anyString(){
+    public static String anyString() {
         return UUID.randomUUID().toString();
     }
 }
diff --git a/smp-server-library/src/test/resources/cleanup-database.sql b/smp-server-library/src/test/resources/cleanup-database.sql
index db26999a5b8bb568807c9060f426983775183a46..218ac8322c6abe9dcc2bbd1b23846486d6da05dd 100755
--- a/smp-server-library/src/test/resources/cleanup-database.sql
+++ b/smp-server-library/src/test/resources/cleanup-database.sql
@@ -1,7 +1,7 @@
-DELETE FROM SMP_ALERT;
-DELETE FROM SMP_ALERT_AUD;
 DELETE FROM SMP_ALERT_PROPERTY;
 DELETE FROM SMP_ALERT_PROPERTY_AUD;
+DELETE FROM SMP_ALERT;
+DELETE FROM SMP_ALERT_AUD;
 DELETE FROM SMP_CERTIFICATE;
 DELETE FROM SMP_CERTIFICATE_AUD;
 DELETE FROM SMP_CONFIGURATION;
diff --git a/smp-webapp/pom.xml b/smp-webapp/pom.xml
index 7cb23c94b797ea62ac6c705201146760380829c8..02c12664255d1fe55b53c1ff5a114ed8753d082b 100644
--- a/smp-webapp/pom.xml
+++ b/smp-webapp/pom.xml
@@ -105,6 +105,21 @@
             <artifactId>hamcrest-junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.vintage</groupId>
+            <artifactId>junit-vintage-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
+            <scope>test</scope>
+        </dependency>
         <!-- the default JDBC driver -->
         <dependency>
             <groupId>com.mysql</groupId>
@@ -150,18 +165,10 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <runOrder>alphabetical</runOrder>
-                </configuration>
-                <dependencies>
-                    <!-- Force using the latest JUnit 47 provider   Remove this when moving to JUNIT5 -->
-                    <dependency>
-                        <groupId>org.apache.maven.surefire</groupId>
-                        <artifactId>surefire-junit47</artifactId>
-                        <version>${maven-surefire-plugin.version}</version>
-                    </dependency>
-                </dependencies>
-
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-failsafe-plugin</artifactId>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ResourceController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ResourceController.java
index ab940997bc57ba090e1bc2bd9df356ccbf5c3ec9..b649cf1c2781c7f4f05a86e6f1e34bf71808ba09 100644
--- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ResourceController.java
+++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ResourceController.java
@@ -194,6 +194,4 @@ public class ResourceController {
             throw new SMPRuntimeException(INVALID_REQUEST, "Can not read input stream!", e);
         }
     }
-
-
 }
diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/RootController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/RootController.java
index 5c2fc48b25d3a792c711981eab4957f481cd9ae9..3f0b80e768f95a2b112a7f8252a6e9d840ad7f7a 100644
--- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/RootController.java
+++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/RootController.java
@@ -56,19 +56,27 @@ public class RootController {
             "image/ico", "image/x-ico"
     },
             value = {"/index.html", "/favicon.png", "/favicon.ico"})
-    public byte[] getServiceGroup(HttpServletRequest httpReq, HttpServletResponse httpRes) throws IOException {
+    public byte[] getStaticResources(HttpServletRequest httpReq, HttpServletResponse httpRes) throws IOException {
         String host = getRemoteHost(httpReq);
         LOG.businessInfo(SMPMessageCode.BUS_HTTP_GET_END_STATIC_CONTENT, host, httpReq.getPathInfo());
         String value = httpReq.getPathInfo();
+
+        if (StringUtils.isBlank(value)) {
+            httpRes.setContentType(MediaType.TEXT_HTML_VALUE);
+            return IOUtils.readBytesFromStream(RootController.class.getResourceAsStream("/html/index.html"));
+        }
+
         if (value != null && value.endsWith("favicon.png")) {
-            httpRes.setContentType("image/x-ico");
+            httpRes.setContentType(MediaType.IMAGE_PNG_VALUE);
             return IOUtils.readBytesFromStream(RootController.class.getResourceAsStream("/html/favicon.png"));
         } else if (value != null && value.endsWith("favicon.ico")) {
-            httpRes.setContentType(MediaType.IMAGE_PNG_VALUE);
+            httpRes.setContentType("image/x-ico");
             return IOUtils.readBytesFromStream(RootController.class.getResourceAsStream("/html/favicon.ico"));
-        } else {
-            return IOUtils.readBytesFromStream(RootController.class.getResourceAsStream("/html/index.html"));
         }
+
+        httpRes.setContentType(MediaType.TEXT_HTML_VALUE);
+        return IOUtils.readBytesFromStream(RootController.class.getResourceAsStream("/html/index.html"));
+
     }
 
     /**
@@ -88,6 +96,4 @@ public class RootController {
         String host = httpReq.getHeader("X-Forwarded-For");
         return StringUtils.isBlank(host) ? httpReq.getRemoteHost() : host;
     }
-
-
 }
diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorResource.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorController.java
similarity index 73%
rename from smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorResource.java
rename to smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorController.java
index 07046e1b4a20aa3dd224641b6392d02b8b4c1ac7..8d843b8945c12ff8e5ca946e7f74da81ce6a5699 100644
--- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorResource.java
+++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorController.java
@@ -4,7 +4,6 @@ package eu.europa.ec.edelivery.smp.monitor;
 import eu.europa.ec.edelivery.smp.data.dao.DomainDao;
 import eu.europa.ec.edelivery.smp.data.model.DBDomain;
 import eu.europa.ec.edelivery.smp.data.ui.auth.SMPAuthority;
-import eu.europa.ec.edelivery.smp.exceptions.SMPTestIsALiveException;
 import eu.europa.ec.edelivery.smp.logging.SMPLogger;
 import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory;
 import org.apache.commons.lang3.exception.ExceptionUtils;
@@ -17,7 +16,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
-import java.util.Objects;
 
 /**
  * @author Joze Rihtarsic
@@ -26,17 +24,13 @@ import java.util.Objects;
 
 @RestController
 @RequestMapping(value = "/monitor")
-public class MonitorResource {
+public class MonitorController {
 
-    private static final SMPLogger LOG = SMPLoggerFactory.getLogger(MonitorResource.class);
+    private static final SMPLogger LOG = SMPLoggerFactory.getLogger(MonitorController.class);
 
-
-    private static final String TEST_NAME = "urn:test:document:is-alive";
-    private static final String TEST_EXTENSION_XML = "<Extension xmlns=\"http://docs.oasis-open.org/bdxr/ns/SMP/2016/05\"><ex:dummynode xmlns:ex=\"http://test.eu\">Sample not mandatory extension</ex:dummynode></Extension>";
-    private static final String TEST_DB_SUCCESSFUL_ROLLBACK = "TEST_DB_SUCCESSFUL_ROLLBACK MESSAGE";
     private final DomainDao domainDao;
 
-    public MonitorResource(DomainDao domainDao) {
+    public MonitorController(DomainDao domainDao) {
         this.domainDao = domainDao;
     }
 
@@ -49,8 +43,6 @@ public class MonitorResource {
         LOG.debug("Start isAlive function for user: [{}]", user);
         try {
             suc = testDatabase();
-        } catch (SMPTestIsALiveException ex) {
-            suc = Objects.equals(TEST_DB_SUCCESSFUL_ROLLBACK, ex.getMessage());
         } catch (RuntimeException th) {
             LOG.error("Error occurred while testing database connection: Msg: [{}]", ExceptionUtils.getRootCauseMessage(th));
         }
diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java
index 7976b85e28633c0c5333e1eb25dd3ed1758c3f35..9bcc49a90633c0ef6df0d040288427f732365fa9 100644
--- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java
+++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java
@@ -43,6 +43,7 @@ public class DomainEditController {
 
     /**
      * Method returns all domains where user is domain administrator.
+     *
      * @param userEncId encrypted user identifier
      * @return Domain list where user has role domain administrator
      */
@@ -51,7 +52,7 @@ public class DomainEditController {
     public List<DomainRO> getDomainsForUserType(
             @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId,
             @RequestParam(value = PARAM_NAME_TYPE, defaultValue = "domain-admin", required = false) String forRole) {
-        logAdminAccess("getDomainsForUserType ["+forRole+"]");
+        logAdminAccess("getDomainsForUserType [" + forRole + "]");
         Long userId = SessionSecurityUtils.decryptEntityId(userEncId);
 
         if (StringUtils.equals(forRole, "group-admin")) {
@@ -63,7 +64,7 @@ public class DomainEditController {
         if (StringUtils.isBlank(forRole) || StringUtils.equals(forRole, "domain-admin")) {
             return uiDomainService.getAllDomainsForDomainAdminUser(userId);
         }
-        throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "GetDomains", "Unknown parameter type ["+forRole+"]!");
+        throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "GetDomains", "Unknown parameter type [" + forRole + "]!");
     }
 
 
@@ -76,14 +77,14 @@ public class DomainEditController {
             @RequestParam(value = PARAM_PAGINATION_PAGE_SIZE, defaultValue = "10") int pageSize,
             @RequestParam(value = PARAM_PAGINATION_FILTER, defaultValue = "", required = false) String filter) {
         logAdminAccess("getDomainMemberList");
-        LOG.info("Search for domain members with filter  [{}], paging: [{}/{}], user: {}",filter,  page, pageSize, userEncId);
+        LOG.info("Search for domain members with filter  [{}], paging: [{}/{}], user: {}", filter, page, pageSize, userEncId);
         Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId);
-        return uiDomainService.getDomainMembers(domainId, page, pageSize,  filter);
+        return uiDomainService.getDomainMembers(domainId, page, pageSize, filter);
     }
 
     @PutMapping(path = SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, produces = MimeTypeUtils.APPLICATION_JSON_VALUE, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE)
     @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and (@smpAuthorizationService.systemAdministrator or @smpAuthorizationService.isDomainAdministrator(#domainEncId))")
-    public MemberRO  putDomainMember(
+    public MemberRO putDomainMember(
             @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId,
             @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId,
             @RequestBody MemberRO memberRO) {
@@ -91,7 +92,7 @@ public class DomainEditController {
         logAdminAccess("putDomainMember");
         LOG.info("add or update domain member");
         Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId);
-        Long memberId = memberRO.getMemberId() == null?null: SessionSecurityUtils.decryptEntityId(memberRO.getMemberId());
+        Long memberId = memberRO.getMemberId() == null ? null : SessionSecurityUtils.decryptEntityId(memberRO.getMemberId());
         if (memberRO.getRoleType() == null) {
             memberRO.setRoleType(MembershipRoleType.VIEWER);
         }
@@ -101,14 +102,14 @@ public class DomainEditController {
 
     @DeleteMapping(value = SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_DELETE)
     @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and (@smpAuthorizationService.systemAdministrator or @smpAuthorizationService.isDomainAdministrator(#domainEncId))")
-    public MemberRO  deleteDomainMember(
+    public MemberRO deleteDomainMember(
             @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId,
             @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId,
             @PathVariable(PATH_PARAM_ENC_MEMBER_ID) String memberEncId
-            ) {
+    ) {
         logAdminAccess("deleteDomainMember");
         Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId);
-        Long memberId= SessionSecurityUtils.decryptEntityId(memberEncId);
+        Long memberId = SessionSecurityUtils.decryptEntityId(memberEncId);
 
         // is user domain admin or system admin
         return uiDomainService.deleteMemberFromDomain(domainId, memberId);
@@ -120,7 +121,7 @@ public class DomainEditController {
             "(@smpAuthorizationService.systemAdministrator or @smpAuthorizationService.isDomainAdministrator(#domainEncId) " +
             "or @smpAuthorizationService.isAnyDomainGroupAdministrator(#domainEncId)" +
             "or @smpAuthorizationService.isAnyResourceAdministrator)")
-    public List<ResourceDefinitionRO>  getDomainResourceDefinitions(
+    public List<ResourceDefinitionRO> getDomainResourceDefinitions(
             @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId,
             @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId
     ) {
@@ -132,7 +133,6 @@ public class DomainEditController {
     }
 
 
-
     protected void logAdminAccess(String action) {
         LOG.info(SMPLogger.SECURITY_MARKER, "Admin Domain action [{}] by user [{}], ", action, SessionSecurityUtils.getSessionUserDetails());
     }
diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/SubresourceEditController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/SubresourceEditController.java
index 99f98db9e3912d80fc0d1356af0b6167a1561979..e94871d1f3019d7dc5813e537a23e7d7832fb9e4 100644
--- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/SubresourceEditController.java
+++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/SubresourceEditController.java
@@ -68,77 +68,8 @@ public class SubresourceEditController {
                                            @RequestBody SubresourceRO subresourceRO) {
         logAdminAccess("createSubresource");
         Long subresourceId = SessionSecurityUtils.decryptEntityId(resourceEncId);
-        return uiSubresourceService.createResourceForGroup(subresourceRO, subresourceId);
+        return uiSubresourceService.createSubresourceForResource(subresourceRO, subresourceId);
     }
-/*
-    @PostMapping(path = SUB_CONTEXT_PATH_EDIT_RESOURCE_UPDATE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
-    @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and @smpAuthorizationService.isGroupAdministrator(#groupEncId)")
-    public ResourceRO updateResource(@PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId,
-                                     @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId,
-                                     @PathVariable(PATH_PARAM_ENC_GROUP_ID) String groupEncId,
-                                     @PathVariable(PATH_PARAM_ENC_RESOURCE_ID) String resourceEncId,
-                                     @RequestBody ResourceRO resourceRO) {
-        logAdminAccess("createResource");
-        Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId);
-        Long groupId = SessionSecurityUtils.decryptEntityId(groupEncId);
-        Long resourceId = SessionSecurityUtils.decryptEntityId(resourceEncId);
-        return uiResourceService.updateResourceForGroup(resourceRO, resourceId, groupId, domainId);
-    }
-
-
-    @GetMapping(path = SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
-    @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and" +
-            " (@smpAuthorizationService.isGroupAdministrator(#groupEncId) or @smpAuthorizationService.isResourceAdministrator(#resourceEncId))")
-    public ServiceResult<MemberRO> getGroupMemberList(@PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId,
-                                                      @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId,
-                                                      @PathVariable(PATH_PARAM_ENC_GROUP_ID) String groupEncId,
-                                                      @PathVariable(PATH_PARAM_ENC_RESOURCE_ID) String resourceEncId,
-                                                      @RequestParam(value = PARAM_PAGINATION_PAGE, defaultValue = "0") int page,
-                                                      @RequestParam(value = PARAM_PAGINATION_PAGE_SIZE, defaultValue = "10") int pageSize,
-                                                      @RequestParam(value = PARAM_PAGINATION_FILTER, defaultValue = "", required = false) String filter) {
-
-        LOG.info("Search for group members with filter  [{}], paging: [{}/{}], user: {}", filter, page, pageSize, userEncId);
-        Long groupId = SessionSecurityUtils.decryptEntityId(groupEncId);
-        Long resourceId = SessionSecurityUtils.decryptEntityId(resourceEncId);
-        return uiResourceService.getResourceMembers(resourceId, page, pageSize, filter);
-    }
-
-    @PutMapping(path = SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER_PUT, produces = MimeTypeUtils.APPLICATION_JSON_VALUE, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE)
-    @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and @smpAuthorizationService.isGroupAdministrator(#groupEncId)")
-    public MemberRO putGroupMember(@PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId,
-                                   @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId,
-                                   @PathVariable(PATH_PARAM_ENC_GROUP_ID) String groupEncId,
-                                   @PathVariable(PATH_PARAM_ENC_RESOURCE_ID) String resourceEncId,
-                                   @RequestBody MemberRO memberRO) {
-
-        LOG.info("add member to group");
-        Long groupId = SessionSecurityUtils.decryptEntityId(groupEncId);
-        Long resourceId = SessionSecurityUtils.decryptEntityId(resourceEncId);
-        Long memberId = memberRO.getMemberId() == null ? null : SessionSecurityUtils.decryptEntityId(memberRO.getMemberId());
-        if (memberRO.getRoleType() == null) {
-            memberRO.setRoleType(MembershipRoleType.VIEWER);
-        }
-        // is user domain admin or system admin
-        return uiResourceService.addMemberToResource(resourceId, memberRO, memberId);
-    }
-
-    @DeleteMapping(value = SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER_DELETE)
-    @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and @smpAuthorizationService.isGroupAdministrator(#groupEncId)")
-    public MemberRO deleteDomainMember(
-            @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId,
-            @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId,
-            @PathVariable(PATH_PARAM_ENC_GROUP_ID) String groupEncId,
-            @PathVariable(PATH_PARAM_ENC_RESOURCE_ID) String resourceEncId,
-            @PathVariable(PATH_PARAM_ENC_MEMBER_ID) String memberEncId
-    ) {
-        LOG.info("Delete member from group");
-        Long groupId = SessionSecurityUtils.decryptEntityId(groupEncId);
-        Long memberId = SessionSecurityUtils.decryptEntityId(memberEncId);
-        Long resourceId = SessionSecurityUtils.decryptEntityId(resourceEncId);
-
-        // is user domain admin or system admin
-        return uiResourceService.deleteMemberFromResource(resourceId, memberId);
-    }*/
 
     protected void logAdminAccess(String action) {
         LOG.info(SMPLogger.SECURITY_MARKER, "Admin Domain action [{}] by user [{}], ", action, SessionSecurityUtils.getSessionUserDetails());
diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/AlertController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/AlertController.java
index d69b03ba588e6072756db341e1e4be122890e70b..dcb9b2bf31a20a1cd1de216b8d7361acf08fcd5a 100644
--- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/AlertController.java
+++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/AlertController.java
@@ -31,7 +31,7 @@ public class AlertController {
     }
 
     @GetMapping(produces = {MimeTypeUtils.APPLICATION_JSON_VALUE})
-    public ServiceResult<AlertRO> geDomainList(
+    public ServiceResult<AlertRO> getAlertList(
             @RequestParam(value = PARAM_PAGINATION_PAGE, defaultValue = "0") int page,
             @RequestParam(value = PARAM_PAGINATION_PAGE_SIZE, defaultValue = "10") int pageSize,
             @RequestParam(value = PARAM_PAGINATION_ORDER_BY, defaultValue = "id", required = false) String orderBy,
diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ExtensionAdminController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ExtensionAdminController.java
index 13d0ab03e8204aba0fabf4c6243a0e0cb8218c87..f46bf1a688844cd0e44ddbc91a7c2e5dbc085dd2 100644
--- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ExtensionAdminController.java
+++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ExtensionAdminController.java
@@ -41,6 +41,4 @@ public class ExtensionAdminController {
         LOG.info("getExtensionList count: ");
         return uiExtensionService.getExtensions();
     }
-
-
 }
diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminController.java
index 61c57b5ed6521a14679ffc80105353ff439b9595..052d0491845eb376b693889a649ef2137ab9160d 100644
--- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminController.java
+++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminController.java
@@ -63,7 +63,7 @@ public class UserAdminController {
 
     @GetMapping(path = "/{user-enc-id}/search", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
     @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and @smpAuthorizationService.isSystemAdministrator")
-    public ServiceResult<SearchUserRO> getDomainMemberList(
+    public ServiceResult<SearchUserRO> searchUsers(
             @PathVariable("user-enc-id") String userEncId,
             @RequestParam(value = PARAM_PAGINATION_PAGE, defaultValue = "0") int page,
             @RequestParam(value = PARAM_PAGINATION_PAGE_SIZE, defaultValue = "10") int pageSize,
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java
index 4d8b2160efa1846af2774b9fc55aa5989779810d..318bec87f8d8bcd65ca94440aae0c3eaf39e79b7 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java
@@ -12,7 +12,6 @@ import java.util.List;
 
 import static java.util.Arrays.asList;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 
 @RunWith(Parameterized.class)
 public class URLCsrfMatcherTest {
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ResourceControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ResourceControllerTest.java
index 4b7cc6b0185f935207755683b2519a06f4d47696..47157baf061208e6300e00c0bfefbda2b2a8a52e 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ResourceControllerTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ResourceControllerTest.java
@@ -14,31 +14,18 @@
 package eu.europa.ec.edelivery.smp.controllers;
 
 import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao;
-import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig;
-import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.mock.web.MockServletContext;
-import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.jdbc.Sql;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.RequestPostProcessor;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-import org.springframework.web.context.ContextLoaderListener;
-import org.springframework.web.context.WebApplicationContext;
 import org.springframework.web.server.adapter.ForwardedHeaderTransformer;
 
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
 import java.io.IOException;
 import java.net.URLEncoder;
 import java.util.UUID;
@@ -49,7 +36,6 @@ import static java.lang.String.format;
 import static org.hamcrest.Matchers.stringContainsInOrder;
 import static org.springframework.http.MediaType.APPLICATION_XML_VALUE;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic;
-import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -57,17 +43,13 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 /**
  * Created by gutowpa on 02/08/2017.
  */
-@RunWith(SpringRunner.class)
-@WebAppConfiguration
-@ContextConfiguration(classes = {SmpTestWebAppConfig.class})
-@Sql(scripts = {
-        "classpath:/cleanup-database.sql",
-        "classpath:/webapp_integration_test_data.sql"},
-        executionPhase = BEFORE_TEST_METHOD)
-public class ResourceControllerTest {
+
+public class ResourceControllerTest extends AbstractControllerTest {
 
     public static final Logger LOG = LoggerFactory.getLogger(ResourceControllerTest.class);
 
+    private static final String DOCUMENT_TYPE_URL = "smp-1";
+
     private static final String IDENTIFIER_SCHEME = "ehealth-participantid-qns";
     private static final String DOCUMENT_SCHEME = "doctype";
 
@@ -80,32 +62,16 @@ public class ResourceControllerTest {
 
     private static final RequestPostProcessor ADMIN_CREDENTIALS = httpBasic("pat_smp_admin", "123456");
 
-    @Autowired
-    private WebApplicationContext webAppContext;
-
     @Autowired
     ForwardedHeaderTransformer forwardedHeaderTransformer;
 
     @Autowired
     ConfigurationDao configurationDao;
 
-    private MockMvc mvc;
 
-    @Before
+    @BeforeEach
     public void setup() throws IOException {
-        X509CertificateTestUtils.reloadKeystores();
-        mvc = MockMvcBuilders.webAppContextSetup(webAppContext)
-                .apply(SecurityMockMvcConfigurers.springSecurity())
-                .build();
-
-        initServletContext();
-    }
-
-    private void initServletContext() {
-        MockServletContext sc = new MockServletContext("");
-        ServletContextListener listener = new ContextLoaderListener(webAppContext);
-        ServletContextEvent event = new ServletContextEvent(sc);
-        listener.contextInitialized(event);
+        super.setup();
     }
 
     @Test
@@ -121,24 +87,10 @@ public class ResourceControllerTest {
         String urPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
 
         mvc.perform(put(urPath)
-                .with(ADMIN_CREDENTIALS)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(resourceExample))
-                .andExpect(status().isCreated());
-    }
-
-    @Test
-    @Ignore("Setting of the 'identifiersBehaviour.scheme.mandatory' not working")
-    public void adminCanCreateServiceGroupNullScheme() throws Exception {
-        String participantId = UUID.randomUUID().toString();
-        String nullSchemeExample = getSampleServiceGroupBody(null, UUID.randomUUID().toString());
-
-        mvc.perform(put(format("/%s",  participantId))
-                .with(ADMIN_CREDENTIALS)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(nullSchemeExample))
+                        .with(ADMIN_CREDENTIALS)
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(resourceExample))
                 .andExpect(status().isCreated());
     }
 
@@ -150,17 +102,17 @@ public class ResourceControllerTest {
 
 
         mvc.perform(put(urPath)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .with(ADMIN_CREDENTIALS)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(resourceExample))
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .with(ADMIN_CREDENTIALS)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(resourceExample))
                 .andExpect(status().isCreated());
 
         mvc.perform(put(urPath)
-                .with(ADMIN_CREDENTIALS)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(resourceExample))
+                        .with(ADMIN_CREDENTIALS)
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(resourceExample))
                 .andExpect(status().isOk());
     }
 
@@ -171,10 +123,10 @@ public class ResourceControllerTest {
         String urPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
 
         mvc.perform(put(urPath)
-                .with(ADMIN_CREDENTIALS)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(resourceExample))
+                        .with(ADMIN_CREDENTIALS)
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(resourceExample))
                 .andExpect(status().isCreated());
 
         mvc.perform(get(urPath))
@@ -182,30 +134,57 @@ public class ResourceControllerTest {
 
     }
 
-    @Test
-    public void existingServiceMetadataCanBeRetrievedByEverybody() throws Exception {
+    @ParameterizedTest
+    @ValueSource(strings = {"", // use default document and domain values
+            "/" + DOCUMENT_TYPE_URL,  // document type
+            "/" + HTTP_DOMAIN_VALUE,  // as domain value
+            "/" + HTTP_DOMAIN_VALUE + "/" + DOCUMENT_TYPE_URL  // as domain value
+    })
+    public void existingServiceGroupCanBeRetrievedByEverybodyWithSubContext(String context) throws Exception {
+        String participantId = UUID.randomUUID().toString();
+        String resourceExample = getSampleServiceGroupBody(IDENTIFIER_SCHEME, participantId);
+        String urPath = format("%s/%s::%s", context, IDENTIFIER_SCHEME, participantId);
+
+        mvc.perform(put(urPath)
+                        .with(ADMIN_CREDENTIALS)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(resourceExample))
+                .andExpect(status().isCreated());
+
+        mvc.perform(get(urPath))
+                .andExpect(content().xml(resourceExample));
+
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {"", // use default document and domain values
+            "/" + DOCUMENT_TYPE_URL,  // document type
+            "/" + HTTP_DOMAIN_VALUE,  // as domain value
+            "/" + HTTP_DOMAIN_VALUE + "/" + DOCUMENT_TYPE_URL  // as domain value
+    })
+    public void existingServiceMetadataCanBeRetrievedByEverybody(String context) throws Exception {
 
         String participantId = UUID.randomUUID().toString();
         String documentId = UUID.randomUUID().toString();
         String resourceExample = getSampleServiceGroupBody(IDENTIFIER_SCHEME, participantId);
-        String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
+        String urlPath = format("%s/%s::%s", context, IDENTIFIER_SCHEME, participantId);
         String docUrlPath = format("%s/services/%s::%s", urlPath, DOCUMENT_SCHEME, documentId);
 
         String xmlMD = generateServiceMetadata(participantId, IDENTIFIER_SCHEME, documentId, DOCUMENT_SCHEME, "test");
         // crate service group
         mvc.perform(put(urlPath)
-                .with(ADMIN_CREDENTIALS)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(resourceExample))
+                        .with(ADMIN_CREDENTIALS)
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(resourceExample))
                 .andExpect(status().isCreated());
         // add service metadata
         mvc.perform(put(docUrlPath)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .with(ADMIN_CREDENTIALS)
-                .contentType(APPLICATION_XML_VALUE)
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .with(ADMIN_CREDENTIALS)
+                        .contentType(APPLICATION_XML_VALUE)
 
-                .content(xmlMD))
+                        .content(xmlMD))
                 .andExpect(status().isCreated());
 
         mvc.perform(get(urlPath))
@@ -221,14 +200,14 @@ public class ResourceControllerTest {
         String participantId = UUID.randomUUID().toString();
         String documentId = UUID.randomUUID().toString();
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
-        prepareForGet(participantId,documentId);
+        prepareForGet(participantId, documentId);
 
         // when then..
         String expectedUrl = "http://ec.test.eu/";
         mvc.perform(get(urlPath)
-                .header("X-Forwarded-Host", "ec.test.eu")
-                .header("X-Forwarded-Port", "")
-                .header("X-Forwarded-Proto", "http"))
+                        .header("X-Forwarded-Host", "ec.test.eu")
+                        .header("X-Forwarded-Port", "")
+                        .header("X-Forwarded-Proto", "http"))
                 .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId)));
     }
 
@@ -238,14 +217,14 @@ public class ResourceControllerTest {
         String participantId = UUID.randomUUID().toString();
         String documentId = UUID.randomUUID().toString();
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
-        prepareForGet(participantId,documentId);
+        prepareForGet(participantId, documentId);
 
 
         // when then..
         String expectedUrl = "http://localhost/";
         mvc.perform(get(urlPath)
-                .header("X-Forwarded-Port", "")
-                .header("X-Forwarded-Proto", "http"))
+                        .header("X-Forwarded-Port", "")
+                        .header("X-Forwarded-Proto", "http"))
                 .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId)));
     }
 
@@ -255,13 +234,13 @@ public class ResourceControllerTest {
         String participantId = UUID.randomUUID().toString();
         String documentId = UUID.randomUUID().toString();
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
-        prepareForGet(participantId,documentId);
+        prepareForGet(participantId, documentId);
 
         // when then..
         String expectedUrl = "https://ec.test.eu:8443/";
         mvc.perform(get(urlPath)
-                .header("X-Forwarded-Host", "ec.test.eu:8443")
-                .header("X-Forwarded-Proto", "https"))
+                        .header("X-Forwarded-Host", "ec.test.eu:8443")
+                        .header("X-Forwarded-Proto", "https"))
                 .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId)));
     }
 
@@ -271,14 +250,14 @@ public class ResourceControllerTest {
         String participantId = UUID.randomUUID().toString();
         String documentId = UUID.randomUUID().toString();
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
-        prepareForGet(participantId,documentId);
+        prepareForGet(participantId, documentId);
 
         // when then..
         String expectedUrl = "https://ec.test.eu:8443/";
         mvc.perform(get(urlPath)
-                .header("X-Forwarded-Port", "8443")
-                .header("X-Forwarded-Host", "ec.test.eu")
-                .header("X-Forwarded-Proto", "https"))
+                        .header("X-Forwarded-Port", "8443")
+                        .header("X-Forwarded-Host", "ec.test.eu")
+                        .header("X-Forwarded-Proto", "https"))
                 .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId)));
     }
 
@@ -290,14 +269,14 @@ public class ResourceControllerTest {
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
 
         LOG.info("Create service metadata: getExistingServiceMetadataWithReverseProxySkipDefaultPortHttps [{}]", urlPath);
-        prepareForGet(participantId,documentId);
+        prepareForGet(participantId, documentId);
 
         // when then..
         String expectedUrl = "https://ec.test.eu/";
         mvc.perform(get(urlPath)
-                .header("X-Forwarded-Port", "443")
-                .header("X-Forwarded-Host", "ec.test.eu")
-                .header("X-Forwarded-Proto", "https"))
+                        .header("X-Forwarded-Port", "443")
+                        .header("X-Forwarded-Host", "ec.test.eu")
+                        .header("X-Forwarded-Proto", "https"))
                 .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId)));
     }
 
@@ -307,14 +286,14 @@ public class ResourceControllerTest {
         String participantId = UUID.randomUUID().toString();
         String documentId = UUID.randomUUID().toString();
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
-        prepareForGet(participantId,documentId);
+        prepareForGet(participantId, documentId);
 
         // when then..
         String expectedUrl = "http://ec.test.eu/";
         mvc.perform(get(urlPath)
-                .header("X-Forwarded-Port", "80")
-                .header("X-Forwarded-Host", "ec.test.eu")
-                .header("X-Forwarded-Proto", "http"))
+                        .header("X-Forwarded-Port", "80")
+                        .header("X-Forwarded-Host", "ec.test.eu")
+                        .header("X-Forwarded-Proto", "http"))
                 .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId)));
     }
 
@@ -324,27 +303,28 @@ public class ResourceControllerTest {
         String participantId = UUID.randomUUID().toString();
         String documentId = UUID.randomUUID().toString();
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
-        prepareForGet(participantId,documentId);
+        prepareForGet(participantId, documentId);
 
         // when then..
         String expectedUrl = "https://ec.test.eu:8443/";
         mvc.perform(get(urlPath)
-                .header("X-Forwarded-Port", "8443")
-                .header("X-Forwarded-Host", "ec.test.eu:8443")
-                .header("X-Forwarded-Proto", "https"))
+                        .header("X-Forwarded-Port", "8443")
+                        .header("X-Forwarded-Host", "ec.test.eu:8443")
+                        .header("X-Forwarded-Proto", "https"))
                 .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId)));
     }
 
     public String generateExpectedServiceGroup(String expectedUrl, String resourceScheme, String resourceValue, String subresourceScheme, String subresourceValue) {
         return "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
                 "<ServiceGroup xmlns=\"http://docs.oasis-open.org/bdxr/ns/SMP/2016/05\" xmlns:ns2=\"http://www.w3.org/2000/09/xmldsig#\">" +
-                "<ParticipantIdentifier scheme=\""+resourceScheme+"\">"+resourceValue+"</ParticipantIdentifier>" +
+                "<ParticipantIdentifier scheme=\"" + resourceScheme + "\">" + resourceValue + "</ParticipantIdentifier>" +
                 "<ServiceMetadataReferenceCollection>" +
-                "<ServiceMetadataReference href=\"" + generateEncodedURL(expectedUrl, resourceScheme, resourceValue,subresourceScheme,subresourceValue)+  "\"/>" +
+                "<ServiceMetadataReference href=\"" + generateEncodedURL(expectedUrl, resourceScheme, resourceValue, subresourceScheme, subresourceValue) + "\"/>" +
                 "</ServiceMetadataReferenceCollection></ServiceGroup>";
     }
-    public String generateEncodedURL(String expectedUrl, String resourceScheme, String resourceValue,  String subresourceScheme, String subresourceValue){
-        return expectedUrl + URLEncoder.encode(resourceScheme + "::" +  resourceValue) + "/services/"+  URLEncoder.encode(subresourceScheme + "::" +  subresourceValue);
+
+    public String generateEncodedURL(String expectedUrl, String resourceScheme, String resourceValue, String subresourceScheme, String subresourceValue) {
+        return expectedUrl + URLEncoder.encode(resourceScheme + "::" + resourceValue) + "/services/" + URLEncoder.encode(subresourceScheme + "::" + subresourceValue);
     }
 
     @Test
@@ -355,9 +335,9 @@ public class ResourceControllerTest {
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
 
         mvc.perform(put(urlPath)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(resourceExample))
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(resourceExample))
                 .andExpect(status().isUnauthorized());
 
         mvc.perform(get(urlPath))
@@ -371,14 +351,14 @@ public class ResourceControllerTest {
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
 
         mvc.perform(put(urlPath)
-                .with(ADMIN_CREDENTIALS)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(resourceExample))
+                        .with(ADMIN_CREDENTIALS)
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(resourceExample))
                 .andExpect(status().isCreated());
 
         mvc.perform(delete(urlPath)
-                .with(ADMIN_CREDENTIALS))
+                        .with(ADMIN_CREDENTIALS))
                 .andExpect(status().isOk());
         mvc.perform(get(urlPath))
                 .andExpect(status().isNotFound());
@@ -392,10 +372,10 @@ public class ResourceControllerTest {
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
 
         mvc.perform(put(urlPath)
-                .with(ADMIN_CREDENTIALS)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .content("malformed input XML"))
+                        .with(ADMIN_CREDENTIALS)
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content("malformed input XML"))
                 .andExpect(status().isBadRequest());
     }
 
@@ -409,10 +389,10 @@ public class ResourceControllerTest {
 
 
         mvc.perform(put(urlPath)
-                .with(ADMIN_CREDENTIALS)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(resourceExample))
+                        .with(ADMIN_CREDENTIALS)
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(resourceExample))
                 .andExpect(status().isBadRequest());
     }
 
@@ -424,10 +404,10 @@ public class ResourceControllerTest {
 
 
         mvc.perform(put(urlPath)
-                .with(ADMIN_CREDENTIALS)
-                .contentType(APPLICATION_XML_VALUE)
-                .header(HTTP_HEADER_KEY_DOMAIN, "not-existing-domain")
-                .content(resourceExample))
+                        .with(ADMIN_CREDENTIALS)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .header(HTTP_HEADER_KEY_DOMAIN, "not-existing-domain")
+                        .content(resourceExample))
                 .andExpect(status().isBadRequest())
                 .andExpect(content().string(stringContainsInOrder("FORMAT_ERROR")));
     }
@@ -440,10 +420,10 @@ public class ResourceControllerTest {
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
 
         mvc.perform(put(urlPath)
-                .with(ADMIN_CREDENTIALS)
-                .contentType(APPLICATION_XML_VALUE)
-                .header(HTTP_HEADER_KEY_DOMAIN, "notExistingDomain")
-                .content(resourceExample))
+                        .with(ADMIN_CREDENTIALS)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .header(HTTP_HEADER_KEY_DOMAIN, "notExistingDomain")
+                        .content(resourceExample))
                 .andExpect(status().isNotFound())
                 .andExpect(content().string(stringContainsInOrder("NOT_FOUND")));
     }
@@ -456,11 +436,11 @@ public class ResourceControllerTest {
 
 
         mvc.perform(put(urlPath)
-                .with(ADMIN_CREDENTIALS)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .header(HTTP_HEADER_KEY_SERVICE_GROUP_OWNER, OTHER_OWNER_NAME_URL_ENCODED)
-                .content(resourceExample))
+                        .with(ADMIN_CREDENTIALS)
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .header(HTTP_HEADER_KEY_SERVICE_GROUP_OWNER, OTHER_OWNER_NAME_URL_ENCODED)
+                        .content(resourceExample))
                 .andExpect(status().isCreated());
     }
 
@@ -471,11 +451,11 @@ public class ResourceControllerTest {
         String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId);
 
         mvc.perform(put(urlPath)
-                .with(ADMIN_CREDENTIALS)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .contentType(APPLICATION_XML_VALUE)
-                .header(HTTP_HEADER_KEY_SERVICE_GROUP_OWNER, "not-existing-user")
-                .content(resourceExample))
+                        .with(ADMIN_CREDENTIALS)
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .header(HTTP_HEADER_KEY_SERVICE_GROUP_OWNER, "not-existing-user")
+                        .content(resourceExample))
                 .andExpect(status().isBadRequest());
     }
 
@@ -489,18 +469,18 @@ public class ResourceControllerTest {
 
         LOG.info("create service service group: [{}]", docUrlPath);
         mvc.perform(put(urlPath)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .with(ADMIN_CREDENTIALS)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(xmlSG))
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .with(ADMIN_CREDENTIALS)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(xmlSG))
                 .andExpect(status().isCreated());
         // add service metadata
         LOG.info("create service metadata: [{}]", docUrlPath);
         ResultActions actions = mvc.perform(put(docUrlPath)
-                .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
-                .with(ADMIN_CREDENTIALS)
-                .contentType(APPLICATION_XML_VALUE)
-                .content(xmlMD))
+                        .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE)
+                        .with(ADMIN_CREDENTIALS)
+                        .contentType(APPLICATION_XML_VALUE)
+                        .content(xmlMD))
                 .andExpect(status().isCreated());
 
     }
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/RootControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/RootControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..008bb4b702662320702c5fb6abe2501e12a53e32
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/RootControllerTest.java
@@ -0,0 +1,59 @@
+package eu.europa.ec.edelivery.smp.controllers;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.mockito.Mockito;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class RootControllerTest {
+
+    RootController testInstance = new RootController();
+
+    @Test
+    void testRedirectOldIndexPath() {
+        ModelMap mockModel = Mockito.mock(ModelMap.class);
+        ModelAndView result = testInstance.redirectOldIndexPath(mockModel);
+
+        assertNotNull(result);
+        assertEquals("redirect:/index.html", result.getViewName());
+    }
+
+    @ParameterizedTest
+    @CsvSource({
+            ", text/html",
+            "/index.html, text/html",
+            "/favicon.png, image/png",
+            "/favicon.ico, image/x-ico"
+    })
+    void testGetStaticResources(String pathInfo, String contentType) throws IOException {
+        //given
+        HttpServletRequest mockHttpServletRequest = Mockito.mock(HttpServletRequest.class);
+        HttpServletResponse mockHttpServletResponse = Mockito.mock(HttpServletResponse.class);
+        Mockito.when(mockHttpServletRequest.getPathInfo()).thenReturn(pathInfo);
+        //when
+        byte[] result = testInstance.getStaticResources(mockHttpServletRequest, mockHttpServletResponse);
+        //then
+        assertNotNull(result);
+        Mockito.verify(mockHttpServletResponse).setContentType(contentType);
+
+    }
+
+    @Test
+    void testRedirectWithUsingRedirectPrefix() {
+        ModelMap mockModel = Mockito.mock(ModelMap.class);
+        ModelAndView result = testInstance.redirectWithUsingRedirectPrefix(mockModel);
+
+        assertNotNull(result);
+        assertEquals("redirect:/ui/index.html", result.getViewName());
+    }
+
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..709df15c5c3763133c0761fa2048f8cce92eb0bf
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerIT.java
@@ -0,0 +1,56 @@
+package eu.europa.ec.edelivery.smp.monitor;
+
+import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.web.servlet.request.RequestPostProcessor;
+
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+/**
+ * MonitorController integration tests
+ * @author Joze Rihtarsic
+ * @since 4.1
+ */
+public class MonitorControllerIT extends AbstractControllerTest {
+
+    private static final String URL = "/monitor/is-alive";
+    private static final RequestPostProcessor ADMIN_CREDENTIALS = httpBasic("pat_smp_admin", "123456");
+
+    @Autowired
+    private MonitorController testInstance;
+
+    @BeforeEach
+    public void setup() throws IOException {
+        super.setup();
+    }
+
+    @Test
+    public void isAliveNotAuthorized() throws Exception {
+        mvc.perform(get(URL))
+                .andExpect(status().isUnauthorized());
+    }
+
+    @Test
+    public void isAlive() throws Exception {
+        mvc.perform(get(URL)
+                        .with(ADMIN_CREDENTIALS))
+                .andExpect(status()
+                        .isOk());
+    }
+
+    @Test
+    public void testDatabase() {
+        // when
+        boolean result = testInstance.testDatabase();
+
+        assertTrue(result);
+
+    }
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..345989e9407c59260f9907b33e75c9fa743e9f6d
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerTest.java
@@ -0,0 +1,88 @@
+package eu.europa.ec.edelivery.smp.monitor;
+
+import eu.europa.ec.edelivery.smp.data.dao.DomainDao;
+import eu.europa.ec.edelivery.smp.data.model.DBDomain;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+import java.util.Collections;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * MonitorControllerTest unit tests
+ *
+ * @author Joze Rihtarsic
+ * @since 5.0
+ */
+class MonitorControllerTest {
+
+    DomainDao mockDomainDao = Mockito.mock(DomainDao.class);
+    MonitorController testInstance = new MonitorController(mockDomainDao);
+
+    // mock security context and authentication
+    @BeforeAll
+    public static void before() {
+        SecurityContextHolder.setContext(SecurityContextHolder.createEmptyContext());
+        SecurityContextHolder.getContext().setAuthentication(Mockito.mock(Authentication.class));
+    }
+
+    @AfterAll
+    public static void cleanup() {
+        SecurityContextHolder.clearContext();
+    }
+
+    @Test
+    void isAliveOK() {
+        // given
+        Mockito.when(mockDomainDao.getAllDomains()).thenReturn(Collections.singletonList(new DBDomain()));
+        // when
+        ResponseEntity result = testInstance.isAlive();
+        // then
+        assertEquals(HttpStatus.OK, result.getStatusCode());
+    }
+
+    @Test
+    void isAliveNotConfigured() {
+        // given
+        Mockito.when(mockDomainDao.getAllDomains()).thenReturn(Collections.emptyList());
+        // when
+        ResponseEntity result = testInstance.isAlive();
+        // then
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, result.getStatusCode());
+    }
+
+    @Test
+    void isAliveDatabaseRuntimeError() {
+        // given
+        Mockito.when(mockDomainDao.getAllDomains()).thenThrow(Mockito.mock(RuntimeException.class));
+        // when
+        ResponseEntity result = testInstance.isAlive();
+        // then
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, result.getStatusCode());
+    }
+
+    @Test
+    void testDatabaseEmpty() {
+        // when
+        Mockito.when(mockDomainDao.getAllDomains()).thenReturn(Collections.emptyList());
+        boolean result = testInstance.testDatabase();
+
+        assertFalse(result);
+    }
+
+    @Test
+    void testDatabaseNotEmpty() {
+        // when
+        Mockito.when(mockDomainDao.getAllDomains()).thenReturn(Collections.singletonList(new DBDomain()));
+        boolean result = testInstance.testDatabase();
+
+        assertTrue(result);
+    }
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorResourceTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorResourceTest.java
deleted file mode 100644
index 593cec67fde1159d9169a907d7271e97b6c1646a..0000000000000000000000000000000000000000
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorResourceTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package eu.europa.ec.edelivery.smp.monitor;
-
-import eu.europa.ec.edelivery.smp.exceptions.SMPTestIsALiveException;
-import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig;
-import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.mock.web.MockServletContext;
-import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.jdbc.Sql;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.request.RequestPostProcessor;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-import org.springframework.web.context.ContextLoaderListener;
-import org.springframework.web.context.WebApplicationContext;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import java.io.IOException;
-
-import static org.junit.Assert.*;
-import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic;
-import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
-/**
- * @author Joze Rihtarsic
- * @since 4.1
- */
-@RunWith(SpringRunner.class)
-@WebAppConfiguration
-@ContextConfiguration(classes = {SmpTestWebAppConfig.class})
-@Sql(scripts = {
-        "classpath:/cleanup-database.sql",
-        "classpath:/webapp_integration_test_data.sql"},
-        executionPhase = BEFORE_TEST_METHOD)
-public class MonitorResourceTest {
-
-    private static final String URL = "/monitor/is-alive";
-    private static final RequestPostProcessor ADMIN_CREDENTIALS = httpBasic("pat_smp_admin", "123456");
-    @Autowired
-    private WebApplicationContext webAppContext;
-
-    @Autowired
-    private MonitorResource testInstance;
-
-    private MockMvc mvc;
-
-    @Before
-    public void setup() throws IOException {
-        X509CertificateTestUtils.reloadKeystores();
-        mvc = MockMvcBuilders.webAppContextSetup(webAppContext)
-                .apply(SecurityMockMvcConfigurers.springSecurity())
-                .build();
-
-        initServletContext();
-    }
-
-    private void initServletContext() {
-        MockServletContext sc = new MockServletContext("");
-        ServletContextListener listener = new ContextLoaderListener(webAppContext);
-        ServletContextEvent event = new ServletContextEvent(sc);
-        listener.contextInitialized(event);
-    }
-
-    @Test
-    public void isAliveNotAuthorized() throws Exception {
-        mvc.perform(get(URL))
-                .andExpect(status().isUnauthorized());
-    }
-
-    @Test
-    public void isAlive() throws Exception {
-        mvc.perform(get(URL)
-                .with(ADMIN_CREDENTIALS))
-                .andExpect(status().isOk());
-    }
-
-    @Test
-    public void testDatabase() {
-        // when
-        boolean result = testInstance.testDatabase();
-
-        assertTrue(result);
-
-    }
-}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java
index d3e8c655d5e620c30240e465b8b59fd6b63c36e5..a0e47597de5895d887d941e5507cb78c8ebfcdf1 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java
@@ -13,14 +13,13 @@
 
 package eu.europa.ec.edelivery.smp.test;
 
-import eu.europa.ec.edelivery.smp.config.enums.SMPEnvPropertyEnum;
-import eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum;
-import org.springframework.context.annotation.*;
-import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
 
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Properties;
 
 import static eu.europa.ec.edelivery.smp.config.enums.SMPEnvPropertyEnum.*;
 import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.*;
@@ -35,14 +34,14 @@ import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.*;
 })
 @ComponentScan(basePackages = "eu.europa.ec.edelivery.smp")
 public class PropertiesTestConfig {
-    public static final String DATABASE_URL = "jdbc:h2:file:./target/DomiSmpWebDb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE;AUTO_SERVER=TRUE;";
+    public static final String DATABASE_URL = "jdbc:h2:file:./target/DomiSmpWebDb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE;AUTO_SERVER=TRUE;Mode=MySQL";
     public static final String DATABASE_USERNAME = "smp";
     public static final String DATABASE_PASS = "smp";
     public static final String DATABASE_DRIVER = "org.h2.Driver";
     public static final String DATABASE_DIALECT = "org.hibernate.dialect.H2Dialect";
 
     public static final String BUILD_FOLDER = "target";
-    public static final Path SECURITY_PATH= Paths.get(BUILD_FOLDER, "keystores");
+    public static final Path SECURITY_PATH = Paths.get(BUILD_FOLDER, "keystores");
 
     static {
         System.setProperty(JDBC_DRIVER.getProperty(), DATABASE_DRIVER);
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java
index 04b9602d5623b3bbf456a8d7ee8a3318cae5901f..5bbc6af0f956f362d176eed9eb86c62dd350944d 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java
@@ -4,6 +4,9 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.fasterxml.jackson.databind.type.CollectionType;
+import eu.europa.ec.edelivery.smp.data.ui.DomainRO;
+import eu.europa.ec.edelivery.smp.data.ui.GroupRO;
+import eu.europa.ec.edelivery.smp.data.ui.SearchUserRO;
 import eu.europa.ec.edelivery.smp.data.ui.UserRO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -24,8 +27,7 @@ import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.List;
 
-import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY;
-import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY_AUTHENTICATION;
+import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*;
 import static org.junit.Assert.assertNotNull;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic;
@@ -40,11 +42,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
  * @since 4.2
  */
 public class MockMvcUtils {
-    public static Logger LOG  = LoggerFactory.getLogger(MockMvcUtils.class);
+    public static Logger LOG = LoggerFactory.getLogger(MockMvcUtils.class);
     static ObjectMapper mapper = JsonMapper.builder()
             .findAndAddModules()
             .build();
-
+    // The values match the values in the test data in webapp_integration_test_data.sql
     public static final String SYS_ADMIN_USERNAME = "sys_admin";
     public static final String SYS_ADMIN_PASSWD = "test123";
     public static final String SMP_ADMIN_USERNAME = "smp_admin";
@@ -57,6 +59,8 @@ public class MockMvcUtils {
 
     public static final String MOCK_LOGGED_USER = "mock_logged_user";
 
+    public static final String RESOURCE_001_IDENTIFIER_VALUE = "urn:australia:ncpb";
+
     public static RequestPostProcessor getHttpBasicSystemAdminCredentials() {
         return httpBasic(SYS_ADMIN_USERNAME, SYS_ADMIN_PASSWD);
     }
@@ -116,11 +120,11 @@ public class MockMvcUtils {
                 .andReturn();
         // assert successful login
         byte[] asByteArray = result.getResponse().getContentAsByteArray();
-        System.out.println("User logged with data: "+ new String(asByteArray));
+        System.out.println("User logged with data: " + new String(asByteArray));
 
         UserRO userRO = mapper.readValue(asByteArray, UserRO.class);
         assertNotNull(userRO);
-        MockHttpSession session = (MockHttpSession)result.getRequest().getSession();
+        MockHttpSession session = (MockHttpSession) result.getRequest().getSession();
         session.setAttribute(MOCK_LOGGED_USER, userRO);
         return session;
     }
@@ -143,6 +147,39 @@ public class MockMvcUtils {
         return mapper.readValue(asByteArray, UserRO.class);
     }
 
+    public static List<DomainRO> geUserDomainsForRole(MockMvc mvc, MockHttpSession session, UserRO userRO, String forRole) throws Exception {
+
+        MvcResult result = mvc.perform(get(CONTEXT_PATH_EDIT_DOMAIN, userRO.getUserId())
+                        .param(PARAM_NAME_TYPE, forRole)
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        return getArrayFromResponse(result, DomainRO.class);
+    }
+
+    public static List<GroupRO> geUserGroups(MockMvc mvc, MockHttpSession session, UserRO userRO, DomainRO domainRO, String forRole) throws Exception {
+
+        MvcResult result = mvc.perform(get(CONTEXT_PATH_EDIT_GROUP, userRO.getUserId(), domainRO.getDomainId())
+                        .session(session)
+                        .param(PARAM_NAME_TYPE, forRole)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        return getArrayFromResponse(result, GroupRO.class);
+    }
+
+    public static List<SearchUserRO> geUsersByUsernameFilter(MockMvc mvc, MockHttpSession session, UserRO userRO, String username) throws Exception {
+
+        MvcResult result = mvc.perform(get(CONTEXT_PATH_PUBLIC_USER + "/{user-id}/search", userRO.getUserId())
+                        .param(PARAM_PAGINATION_FILTER, username)
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        return getArrayFromResponse(result, SearchUserRO.class);
+    }
+
+
     public static <T> T getObjectFromResponse(MvcResult result, Class<T> clazz)
             throws IOException {
         return mapper.readValue(result.getResponse().getContentAsByteArray(), clazz);
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/TestROUtils.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/TestROUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..99b08b32123c99c7ee72b872b04e363747f01493
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/TestROUtils.java
@@ -0,0 +1,47 @@
+package eu.europa.ec.edelivery.smp.test.testutils;
+
+import eu.europa.ec.edelivery.smp.data.enums.VisibilityType;
+import eu.europa.ec.edelivery.smp.data.ui.DomainRO;
+import eu.europa.ec.edelivery.smp.data.ui.GroupRO;
+
+import java.util.UUID;
+
+public class TestROUtils {
+
+    public static GroupRO createGroup() {
+        return createGroup(anyString());
+    }
+
+
+    public static GroupRO createGroup(String name) {
+        GroupRO groupRO = new GroupRO();
+        groupRO.setGroupName(name);
+        groupRO.setGroupDescription(anyString());
+        groupRO.setVisibility(VisibilityType.PRIVATE);
+        return groupRO;
+    }
+
+    public static DomainRO createDomain() {
+        return createDomain(anyString());
+    }
+
+    public static DomainRO createDomain(String name) {
+        DomainRO domainRO = new DomainRO();
+        domainRO.setDomainCode(name);
+        domainRO.setVisibility(VisibilityType.PRIVATE);
+        return domainRO;
+    }
+
+    public static String anyString() {
+        return UUID.randomUUID().toString();
+    }
+
+
+    public static String createSMP10ServiceGroupPayload(String id, String sch) {
+
+        return "<ServiceGroup xmlns=\"http://docs.oasis-open.org/bdxr/ns/SMP/2016/05\">" +
+                "<ParticipantIdentifier scheme=\"" + sch + "\">" + id + "</ParticipantIdentifier>" +
+                "<ServiceMetadataReferenceCollection />" +
+                "</ServiceGroup>";
+    }
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java
index e2ecfdbf42e18b5f11f199bd2d30b4c8cb3ab608..c18993834ee04da04a55e7a2f1cd7cb284cdf6a2 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java
@@ -3,30 +3,51 @@ package eu.europa.ec.edelivery.smp.ui;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao;
+import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType;
+import eu.europa.ec.edelivery.smp.data.enums.VisibilityType;
+import eu.europa.ec.edelivery.smp.data.ui.*;
 import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig;
 import eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils;
+import eu.europa.ec.edelivery.smp.test.testutils.TestROUtils;
 import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.mock.web.MockHttpSession;
 import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.jdbc.Sql;
-import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.springframework.test.context.web.WebAppConfiguration;
 import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
 import org.springframework.web.context.WebApplicationContext;
 
 import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
 
+import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.getObjectFromResponse;
+import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
+import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
-@RunWith(SpringRunner.class)
-@DirtiesContext
+@ExtendWith(SpringExtension.class)
 @WebAppConfiguration
 @ContextConfiguration(classes = {SmpTestWebAppConfig.class})
+@DirtiesContext
 @Sql(scripts = {
         "classpath:/cleanup-database.sql",
-        "classpath:/webapp_integration_test_data.sql"})
+        "classpath:/webapp_integration_test_data.sql"},
+        executionPhase = BEFORE_TEST_METHOD)
 abstract public class AbstractControllerTest {
+
+    protected ObjectMapper mapper = null;
     protected MockMvc mvc;
     @Autowired
     private WebApplicationContext webAppContext;
@@ -39,9 +60,166 @@ abstract public class AbstractControllerTest {
         configurationDao.reloadPropertiesFromDatabase();
     }
 
+    /**
+     * Helper method for getting the ObjectMapper.
+     *
+     * @return ObjectMapper
+     */
     public ObjectMapper getObjectMapper() {
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.registerModule(new JavaTimeModule());
+        if (mapper == null) {
+            mapper = new ObjectMapper();
+            mapper.registerModule(new JavaTimeModule());
+        }
         return mapper;
     }
+
+    /**
+     * Test helper method for Adding a new member with viewer role to a domain.
+     *
+     * @param session           MockHttpSession of the user that is adding the new member
+     * @param domainRO          Domain to which the new member is added
+     * @param domainAdminUser   User that is adding the new member
+     * @param newMemberUsername Username of the new member
+     * @return MemberRO of the new member
+     * @throws Exception
+     */
+    public MemberRO addDomainMember(MockHttpSession session, DomainRO domainRO, UserRO domainAdminUser, String newMemberUsername) throws Exception {
+        String pathTemplate = CONTEXT_PATH_EDIT_DOMAIN + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT;
+        return addMember(session, newMemberUsername, MembershipRoleType.VIEWER, pathTemplate,
+                domainAdminUser.getUserId(), domainRO.getDomainId());
+    }
+
+    /**
+     * Test helper method for Adding a new member with viewer role to a group.
+     *
+     * @param session           MockHttpSession of the user that is adding the new member
+     * @param domainRO          Domain to which the new member is added
+     * @param groupRO           Group to which the new member is added
+     * @param domainAdminUser   User that is adding the new member
+     * @param newMemberUsername Username of the new member
+     * @return MemberRO of the new member
+     * @throws Exception
+     **/
+    public MemberRO addGroupMember(MockHttpSession session, DomainRO domainRO, GroupRO groupRO, UserRO domainAdminUser, String newMemberUsername) throws Exception {
+        String pathTemplate = CONTEXT_PATH_EDIT_GROUP + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER_PUT;
+        return addMember(session, newMemberUsername, MembershipRoleType.VIEWER, pathTemplate,
+                domainAdminUser.getUserId(), domainRO.getDomainId(), groupRO.getGroupId());
+    }
+
+    /**
+     * Test helper method for Adding a new member with viewer role to a resourse.
+     *
+     * @param session           MockHttpSession of the user that is adding the new member
+     * @param domainRO          Domain to which the new member is added
+     * @param groupRO           Group to which the new member is added
+     * @param resourceRO        Resource to which the new member is added
+     * @param domainAdminUser   User that is adding the new member
+     * @param newMemberUsername Username of the new member
+     * @return MemberRO of the new member
+     * @throws Exception
+     **/
+    public MemberRO addResourceMember(MockHttpSession session, DomainRO domainRO, GroupRO groupRO, ResourceRO resourceRO, UserRO domainAdminUser, String newMemberUsername) throws Exception {
+        String pathTemplate = CONTEXT_PATH_EDIT_RESOURCE + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER_PUT;
+        return addMember(session, newMemberUsername, MembershipRoleType.VIEWER, pathTemplate,
+                domainAdminUser.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), resourceRO.getResourceId());
+    }
+
+    /**
+     * Generic Test helper method for Adding a new member with given role to a resource/group/domain.
+     *
+     * @param session           MockHttpSession of the user that is adding the new member
+     * @param newMemberUsername Username of the new member
+     * @param roleType          Role of the new member
+     * @param urlTemplate       URL template of the resource/group/domain to which the new member is added
+     * @param encPathIds        Encoded path ids of the adminUserID, domain id, group id resource id, ...
+     * @return MemberRO of the new member
+     * @throws Exception
+     */
+    public MemberRO addMember(MockHttpSession session, String newMemberUsername, MembershipRoleType roleType, String urlTemplate, String... encPathIds) throws Exception {
+
+        MemberRO memberToAdd = new MemberRO();
+        memberToAdd.setRoleType(roleType);
+        memberToAdd.setUsername(newMemberUsername);
+
+        // when
+        MvcResult result = mvc.perform(put(urlTemplate, encPathIds)
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(memberToAdd)))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        return getObjectFromResponse(result, MemberRO.class);
+    }
+
+    /**
+     * Test helper method for creating and adding new resource to group.
+     *
+     * @param session         MockHttpSession of the user that is adding the new resource
+     * @param domainRO        Domain to which the new member is added
+     * @param groupRO         Group to which the new member is added
+     * @param domainAdminUser User that is adding the new member
+     * @return ResourceRO return created resource
+     * @throws Exception
+     **/
+    public ResourceRO addResourceToGroup(MockHttpSession session, DomainRO domainRO, GroupRO groupRO, UserRO domainAdminUser) throws Exception {
+        // create resource
+        ResourceRO resource = new ResourceRO();
+        resource.setResourceTypeIdentifier("edelivery-oasis-smp-1.0-servicegroup");
+        resource.setIdentifierValue(UUID.randomUUID().toString());
+        resource.setIdentifierScheme("test-test-test");
+        resource.setVisibility(VisibilityType.PUBLIC);
+        // add it to the group
+        MvcResult result = mvc.perform(put(CONTEXT_PATH_EDIT_RESOURCE + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_CREATE,
+                        domainAdminUser.getUserId(), domainRO.getDomainId(), groupRO.getGroupId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(resource)))
+                .andExpect(status().isOk()).andReturn();
+
+
+        return getObjectFromResponse(result, ResourceRO.class);
+    }
+
+    /**
+     * Test helper method for Adding a new group to a domain.
+     *
+     * @param session
+     * @param domainRO
+     * @param domainAdminUser
+     * @return
+     * @throws Exception
+     */
+    public GroupRO addGroupToDomain(MockHttpSession session, DomainRO domainRO, UserRO domainAdminUser) throws Exception {
+        GroupRO groupRO = TestROUtils.createGroup();
+        MvcResult addGroupResult = mvc.perform(put(CONTEXT_PATH_EDIT_GROUP + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_CREATE,
+                        domainAdminUser.getUserId(), domainRO.getDomainId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(groupRO)))
+                .andExpect(status().isOk()).andReturn();
+        return getObjectFromResponse(addGroupResult, GroupRO.class);
+    }
+
+    public List<ResourceRO> getEditResourcesForGroup(MockHttpSession session, UserRO userRO, DomainRO domainRO, GroupRO groupRO, String filter, String roleType)
+            throws Exception {
+
+        MvcResult result = mvc.perform(get(CONTEXT_PATH_EDIT_RESOURCE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId())
+                        .session(session)
+                        .param(PARAM_PAGINATION_FILTER, filter)
+                        .param(PARAM_NAME_TYPE, roleType)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class);
+        if (serviceResult == null || serviceResult.getServiceEntities().isEmpty()) {
+            return Collections.emptyList();
+        }
+        return (List<ResourceRO>) serviceResult.getServiceEntities().stream().map(o -> getObjectMapper().convertValue(o, ResourceRO.class))
+                .collect(Collectors.toList());
+    }
 }
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIT.java
similarity index 94%
rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIntegrationTest.java
rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIT.java
index 206cc1e7ea0591f8dbfea94f6726fd200c49d866..70c27371e7410841ffcde369ee7d94db7131b73a 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIntegrationTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIT.java
@@ -2,7 +2,6 @@ package eu.europa.ec.edelivery.smp.ui;
 
 import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao;
 import eu.europa.ec.edelivery.smp.data.dao.CredentialDao;
-import eu.europa.ec.edelivery.smp.data.model.user.DBCredential;
 import eu.europa.ec.edelivery.smp.services.ui.UIKeystoreService;
 import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig;
 import eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils;
@@ -22,8 +21,6 @@ import org.springframework.web.context.WebApplicationContext;
 
 import javax.servlet.http.HttpSession;
 import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -39,9 +36,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
         "classpath:/cleanup-database.sql",
         "classpath:/webapp_integration_test_data.sql"},
         executionPhase = BEFORE_TEST_METHOD)
-public class AuthenticationResourceIntegrationTest {
+public class AuthenticationResourceIT {
 
-    private static final Logger LOG = LoggerFactory.getLogger(AuthenticationResourceIntegrationTest.class);
+    private static final Logger LOG = LoggerFactory.getLogger(AuthenticationResourceIT.class);
 
     private static final String PATH = ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY + "/authentication";
 
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DocumentEditControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DocumentEditControllerIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..af9ef4a9076c31f223fbcb7cd8d6b084901a7592
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DocumentEditControllerIT.java
@@ -0,0 +1,192 @@
+package eu.europa.ec.edelivery.smp.ui.edit;
+
+import eu.europa.ec.edelivery.smp.data.ui.*;
+import eu.europa.ec.edelivery.smp.data.ui.exceptions.ErrorResponseRO;
+import eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode;
+import eu.europa.ec.edelivery.smp.services.ui.UIDocumentService;
+import eu.europa.ec.edelivery.smp.test.testutils.TestROUtils;
+import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.mock.web.MockHttpSession;
+import org.springframework.test.web.servlet.MvcResult;
+
+import java.io.IOException;
+import java.util.List;
+
+import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
+import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+class DocumentEditControllerIT extends AbstractControllerTest {
+    private static final String PATH = CONTEXT_PATH_EDIT_DOCUMENT;
+
+    @Autowired
+    protected UIDocumentService documentService;
+
+    @BeforeEach
+    public void setup() throws IOException {
+        super.setup();
+    }
+
+    @Test
+    public void testGetDocumentForNewResource() throws Exception {
+        // given when
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file
+        GroupRO groupRO = groupsForUser.get(0);
+        // add new resource
+        ResourceRO resourceRO = addResourceToGroup(session, domainRO, groupRO, userRO);
+
+        // when
+        MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOCUMENT_GET,
+                        userRO.getUserId(), resourceRO.getResourceId())
+                        .session(session)
+                        .with(csrf())
+                )
+                .andExpect(status().isOk()).andReturn();
+        // then
+        DocumentRo documentRo = getObjectFromResponse(result, DocumentRo.class);
+        assertNotNull(documentRo);
+        assertTrue(documentRo.getAllVersions().isEmpty()); // was just created without document
+    }
+
+    @Test
+    public void testGetDocumentForResource() throws Exception {
+        // given when
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file
+        GroupRO groupRO = groupsForUser.get(0);
+
+        List<ResourceRO> resources = getEditResourcesForGroup(session, userRO, domainRO, groupRO, RESOURCE_001_IDENTIFIER_VALUE, null);
+        assertEquals(1, resources.size());
+        ResourceRO resourceRO = resources.get(0);
+
+        // when
+        MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOCUMENT_GET,
+                        userRO.getUserId(), resourceRO.getResourceId())
+                        .session(session)
+                        .with(csrf())
+                )
+                .andExpect(status().isOk()).andReturn();
+        // then
+        DocumentRo documentRo = getObjectFromResponse(result, DocumentRo.class);
+        assertNotNull(documentRo);
+        assertFalse(documentRo.getAllVersions().isEmpty()); // was just created without document
+        assertNotNull(documentRo.getPayload());
+    }
+
+    @Test
+    public void testValidateDocumentOk() throws Exception {
+        // given when
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file
+        GroupRO groupRO = groupsForUser.get(0);
+
+        List<ResourceRO> resources = getEditResourcesForGroup(session, userRO, domainRO, groupRO, RESOURCE_001_IDENTIFIER_VALUE, null);
+        assertEquals(1, resources.size());
+        ResourceRO resourceRO = resources.get(0);
+
+        // document to validate
+        DocumentRo documentRo = new DocumentRo();
+        documentRo.setPayload(TestROUtils.createSMP10ServiceGroupPayload(resourceRO.getIdentifierValue(), resourceRO.getIdentifierScheme()));
+
+        // when
+        mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOCUMENT_VALIDATE,
+                        userRO.getUserId(), resourceRO.getResourceId())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(documentRo))
+                        .session(session)
+                        .with(csrf())
+                )
+                .andExpect(status().isOk()).andReturn();
+    }
+
+    @Test
+    public void testValidateDocumentInvalid() throws Exception {
+        // given when
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file
+        GroupRO groupRO = groupsForUser.get(0);
+
+        List<ResourceRO> resources = getEditResourcesForGroup(session, userRO, domainRO, groupRO, RESOURCE_001_IDENTIFIER_VALUE, null);
+        assertEquals(1, resources.size());
+        ResourceRO resourceRO = resources.get(0);
+
+        // document to validate
+        DocumentRo documentRo = new DocumentRo();
+        documentRo.setPayload("invalid payload");
+
+        // when
+        MvcResult result = mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOCUMENT_VALIDATE,
+                        userRO.getUserId(), resourceRO.getResourceId())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(documentRo))
+                        .session(session)
+                        .with(csrf())
+                )
+                .andExpect(status().is4xxClientError()).andReturn();
+
+        ErrorResponseRO errorRO = getObjectFromResponse(result, ErrorResponseRO.class);
+        assertNotNull(errorRO);
+        assertEquals(ErrorBusinessCode.TECHNICAL.name(), errorRO.getBusinessCode());
+        MatcherAssert.assertThat(errorRO.getErrorDescription(), Matchers.containsString("Invalid request [ResourceValidation]"));
+    }
+
+    @Test
+    public void testGenerateDocument() throws Exception {
+        // given when
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file
+        GroupRO groupRO = groupsForUser.get(0);
+
+        List<ResourceRO> resources = getEditResourcesForGroup(session, userRO, domainRO, groupRO, RESOURCE_001_IDENTIFIER_VALUE, null);
+        assertEquals(1, resources.size());
+        ResourceRO resourceRO = resources.get(0);
+
+        // when
+        MvcResult response = mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOCUMENT_GENERATE,
+                        userRO.getUserId(), resourceRO.getResourceId())
+                        .session(session)
+                        .with(csrf())
+                )
+                .andExpect(status().isOk()).andReturn();
+
+        DocumentRo result = getObjectFromResponse(response, DocumentRo.class);
+        assertNotNull(result);
+        assertNotNull(result.getPayload());
+    }
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..986ecc67208eae7e5464d0d92025a6cbb3c71bb6
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerIT.java
@@ -0,0 +1,160 @@
+package eu.europa.ec.edelivery.smp.ui.edit;
+
+import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType;
+import eu.europa.ec.edelivery.smp.data.ui.DomainRO;
+import eu.europa.ec.edelivery.smp.data.ui.MemberRO;
+import eu.europa.ec.edelivery.smp.data.ui.ServiceResult;
+import eu.europa.ec.edelivery.smp.data.ui.UserRO;
+import eu.europa.ec.edelivery.smp.services.ui.UIGroupPublicService;
+import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.mock.web.MockHttpSession;
+import org.springframework.test.web.servlet.MvcResult;
+
+import java.io.IOException;
+import java.util.List;
+
+import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
+import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+
+public class DomainEditControllerIT extends AbstractControllerTest {
+    private static final String PATH = CONTEXT_PATH_EDIT_DOMAIN;
+
+    @Autowired
+    protected UIGroupPublicService uiGroupPublicService;
+
+    @BeforeEach
+    public void setup() throws IOException {
+        super.setup();
+    }
+
+    @ParameterizedTest
+    @CsvSource({
+            ", 1",
+            "'', 1",
+            "domain-admin, 1",
+            "group-admin, 1",
+            "resource-admin, 1",
+    })
+    public void testGetDomains(String roleType, int values) throws Exception {
+        // given when
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        // when
+        MvcResult result = mvc.perform(get(PATH, userRO.getUserId(), domainRO.getDomainId())
+                        .session(session)
+                        .param(PARAM_NAME_TYPE, roleType)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        List<DomainRO> listDomains = getArrayFromResponse(result, DomainRO.class);
+        assertNotNull(listDomains);
+        assertEquals(values, listDomains.size());
+    }
+
+
+    @Test
+    public void testGetDomainMembers() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+
+        // when
+        MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER, userRO.getUserId(), domainRO.getDomainId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class);
+        assertNotNull(serviceResult);
+        assertEquals(1, serviceResult.getServiceEntities().size());
+        MemberRO memberRO = getObjectMapper().convertValue(serviceResult.getServiceEntities().get(0), MemberRO.class);
+
+        // the admin user who created group is automatically added as member
+        assertEquals(userRO.getUsername(), memberRO.getUsername());
+    }
+
+    @Test
+    public void testAddDomainMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+
+        //when
+        MemberRO response = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME);
+        // then
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+    }
+
+    @Test
+    public void testDeleteDomainMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+
+        MemberRO member = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME);
+
+        MvcResult deleteGroupMemberResult = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_DELETE, userRO.getUserId(), domainRO.getDomainId(), member.getMemberId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class);
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+    }
+
+    @Test
+    public void testUpdateDomainMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        MemberRO member = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME);
+        assertEquals(MembershipRoleType.VIEWER, member.getRoleType());
+        member.setRoleType(MembershipRoleType.ADMIN);
+
+
+        MvcResult deleteGroupMemberResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, userRO.getUserId(), domainRO.getDomainId(), member.getMemberId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(member)))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class);
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+        assertEquals(member.getRoleType(), response.getRoleType());
+    }
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6e63dcd6c38c65b47ed30aa3f4ba2c7f9a2091b1
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerTest.java
@@ -0,0 +1,180 @@
+package eu.europa.ec.edelivery.smp.ui.edit;
+
+import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType;
+import eu.europa.ec.edelivery.smp.data.ui.DomainRO;
+import eu.europa.ec.edelivery.smp.data.ui.MemberRO;
+import eu.europa.ec.edelivery.smp.data.ui.ServiceResult;
+import eu.europa.ec.edelivery.smp.data.ui.UserRO;
+import eu.europa.ec.edelivery.smp.services.ui.UIGroupPublicService;
+import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.mock.web.MockHttpSession;
+import org.springframework.test.web.servlet.MvcResult;
+
+import java.io.IOException;
+import java.util.List;
+
+import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
+import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+
+public class DomainEditControllerTest extends AbstractControllerTest {
+    private static final String PATH = CONTEXT_PATH_EDIT_DOMAIN;
+
+    @Autowired
+    protected UIGroupPublicService uiGroupPublicService;
+
+    @BeforeEach
+    public void setup() throws IOException {
+        super.setup();
+    }
+
+    @ParameterizedTest
+    @CsvSource({
+            ", 1",
+            "'', 1",
+            "domain-admin, 1",
+            "group-admin, 1",
+            "resource-admin, 1",
+    })
+    public void testGetDomains(String roleType, int values) throws Exception {
+        // given when
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        // when
+        MvcResult result = mvc.perform(get(PATH, userRO.getUserId(), domainRO.getDomainId())
+                        .session(session)
+                        .param(PARAM_NAME_TYPE, roleType)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        List<DomainRO> listDomains = getArrayFromResponse(result, DomainRO.class);
+        assertNotNull(listDomains);
+        assertEquals(values, listDomains.size());
+    }
+
+
+    @Test
+    public void testGetDomainMembers() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+
+        // when
+        MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER, userRO.getUserId(), domainRO.getDomainId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class);
+        assertNotNull(serviceResult);
+        assertEquals(1, serviceResult.getServiceEntities().size());
+        MemberRO memberRO = getObjectMapper().convertValue(serviceResult.getServiceEntities().get(0), MemberRO.class);
+
+        // the admin user who created group is automatically added as member
+        assertEquals(userRO.getUsername(), memberRO.getUsername());
+    }
+
+    @Test
+    public void testAddDomainMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+
+        //when
+        MemberRO response = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME);
+        // then
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+    }
+
+    @Test
+    public void testDeleteDomainMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+
+        MemberRO member = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME);
+
+        MvcResult deleteGroupMemberResult = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_DELETE, userRO.getUserId(), domainRO.getDomainId(), member.getMemberId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class);
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+    }
+
+    @Test
+    public void testUpdateDomainMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        MemberRO member = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME);
+        assertEquals(MembershipRoleType.VIEWER, member.getRoleType());
+        member.setRoleType(MembershipRoleType.ADMIN);
+
+
+        MvcResult deleteGroupMemberResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, userRO.getUserId(), domainRO.getDomainId(), member.getMemberId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(member)))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class);
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+        assertEquals(member.getRoleType(), response.getRoleType());
+    }
+
+
+    public MemberRO addDomainMember(MockHttpSession session, DomainRO domainRO, UserRO domainAdminUser, String newMemberUsername) throws Exception {
+
+        MemberRO memberToAdd = new MemberRO();
+        memberToAdd.setRoleType(MembershipRoleType.VIEWER);
+        memberToAdd.setUsername(newMemberUsername);
+
+        // when
+        MvcResult result = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, domainAdminUser.getUserId(), domainRO.getDomainId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(memberToAdd)))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        return getObjectFromResponse(result, MemberRO.class);
+    }
+
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..03c9372950313eac49fcb7913944ae4a7fced226
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIT.java
@@ -0,0 +1,256 @@
+package eu.europa.ec.edelivery.smp.ui.edit;
+
+import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType;
+import eu.europa.ec.edelivery.smp.data.enums.VisibilityType;
+import eu.europa.ec.edelivery.smp.data.ui.*;
+import eu.europa.ec.edelivery.smp.services.ui.UIGroupPublicService;
+import eu.europa.ec.edelivery.smp.test.testutils.TestROUtils;
+import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.mock.web.MockHttpSession;
+import org.springframework.test.web.servlet.MvcResult;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.UUID;
+
+import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
+import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+/**
+ * For the test configuration see the webapp_integration_test_data.sql file.
+ * The system admin user is admin member of domain '1' and group '1'.
+ */
+public class GroupEditControllerIT extends AbstractControllerTest {
+    private static final String PATH = CONTEXT_PATH_EDIT_GROUP;
+
+    @Autowired
+    protected UIGroupPublicService uiGroupPublicService;
+
+    @BeforeEach
+    public void setup() throws IOException {
+        super.setup();
+    }
+
+    @ParameterizedTest
+    @CsvSource({
+            ", 2",
+            "'', 2",
+            "group-admin, 1",
+            "resource-admin, 1",
+            "group-viewer, 0",
+            "all-roles, 1"
+    })
+    public void testGetGroup(String roleType, int values) throws Exception {
+        // given when
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        // when
+        MvcResult result = mvc.perform(get(PATH, userRO.getUserId(), domainRO.getDomainId())
+                        .session(session)
+                        .param(PARAM_NAME_TYPE, roleType)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        List<GroupRO> listGroups = getArrayFromResponse(result, GroupRO.class);
+        assertNotNull(listGroups);
+        assertEquals(values, listGroups.size());
+    }
+
+    @Test
+    public void testPutGroup() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        GroupRO groupRO = new GroupRO();
+        groupRO.setGroupName(UUID.randomUUID().toString());
+        groupRO.setGroupDescription(UUID.randomUUID().toString());
+        groupRO.setVisibility(VisibilityType.PRIVATE);
+
+        int initialGroupSize = uiGroupPublicService.getAllGroupsForDomain(1L).size();
+        // when
+        MvcResult result = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_CREATE, userRO.getUserId(), domainRO.getDomainId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(groupRO)))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        GroupRO response = getObjectFromResponse(result, GroupRO.class);
+        assertNotNull(response);
+        assertEquals(VisibilityType.PRIVATE, response.getVisibility());
+        assertEquals(groupRO.getGroupName(), response.getGroupName());
+        assertEquals(groupRO.getGroupDescription(), response.getGroupDescription());
+        assertEquals(initialGroupSize + 1, uiGroupPublicService.getAllGroupsForDomain(1L).size());
+    }
+
+    @Test
+    public void testDeleteGroup() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        GroupRO groupRO = addGroupToDomain(session, domainRO, userRO);
+
+        int initialGroupSize = uiGroupPublicService.getAllGroupsForDomain(1L).size();
+
+        // when
+        MvcResult result = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_DELETE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+
+        GroupRO response = getObjectFromResponse(result, GroupRO.class);
+        assertNotNull(response);
+        assertEquals(VisibilityType.PRIVATE, response.getVisibility());
+        assertEquals(groupRO.getGroupName(), response.getGroupName());
+        assertEquals(groupRO.getGroupDescription(), response.getGroupDescription());
+        assertEquals(initialGroupSize - 1, uiGroupPublicService.getAllGroupsForDomain(1L).size());
+    }
+
+    @Test
+    public void testUpdateGroup() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        GroupRO groupRO = addGroupToDomain(session, domainRO, userRO);
+
+        groupRO.setVisibility(VisibilityType.PUBLIC);
+        groupRO.setGroupDescription(TestROUtils.anyString());
+        groupRO.setGroupName(TestROUtils.anyString());
+
+        // when
+        MvcResult result = mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_UPDATE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(groupRO)))
+                .andExpect(status().isOk()).andReturn();
+
+
+        GroupRO response = getObjectFromResponse(result, GroupRO.class);
+        assertNotNull(response);
+        assertEquals(groupRO.getVisibility(), response.getVisibility());
+        assertEquals(groupRO.getGroupName(), response.getGroupName());
+        assertEquals(groupRO.getGroupDescription(), response.getGroupDescription());
+    }
+
+
+    @Test
+    public void testGetGroupMembers() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        GroupRO groupRO = addGroupToDomain(session, domainRO, userRO);
+
+        // when
+        MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class);
+        assertNotNull(serviceResult);
+        assertEquals(1, serviceResult.getServiceEntities().size());
+        MemberRO memberRO = getObjectMapper().convertValue(serviceResult.getServiceEntities().get(0), MemberRO.class);
+
+        // the admin user who created group is automatically added as member
+        assertEquals(userRO.getUsername(), memberRO.getUsername());
+    }
+
+
+    @Test
+    public void testAddGroupMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        GroupRO groupRO = addGroupToDomain(session, domainRO, userRO);
+
+        //when
+        MemberRO response = addGroupMember(session, domainRO, groupRO, userRO, SG_USER_USERNAME);
+        // then
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+    }
+
+    @Test
+    public void testDeleteGroupMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        GroupRO groupRO = addGroupToDomain(session, domainRO, userRO);
+        MemberRO member = addGroupMember(session, domainRO, groupRO, userRO, SG_USER_USERNAME);
+
+        MvcResult deleteGroupMemberResult = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER_DELETE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), member.getMemberId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class);
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+    }
+
+    @Test
+    public void testUpdateGroupMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        GroupRO groupRO = addGroupToDomain(session, domainRO, userRO);
+        MemberRO member = addGroupMember(session, domainRO, groupRO, userRO, SG_USER_USERNAME);
+        assertEquals(MembershipRoleType.VIEWER, member.getRoleType());
+        member.setRoleType(MembershipRoleType.ADMIN);
+
+
+        MvcResult deleteGroupMemberResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER_PUT, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), member.getMemberId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(member)))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class);
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+        assertEquals(member.getRoleType(), response.getRoleType());
+    }
+
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditControllerIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..bce4a5ae2f21d5709bc3df2ecc9d7e04f9fa3f8e
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditControllerIT.java
@@ -0,0 +1,279 @@
+package eu.europa.ec.edelivery.smp.ui.edit;
+
+import eu.europa.ec.edelivery.smp.data.enums.VisibilityType;
+import eu.europa.ec.edelivery.smp.data.ui.*;
+import eu.europa.ec.edelivery.smp.services.ui.UIResourceSearchService;
+import eu.europa.ec.edelivery.smp.services.ui.filters.ResourceFilter;
+import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.mock.web.MockHttpSession;
+import org.springframework.test.web.servlet.MvcResult;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.UUID;
+
+import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
+import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+/**
+ * For the test configuration see the webapp_integration_test_data.sql file.
+ * The system admin user is admin member of domain '1' and group '1'.
+ */
+public class ResourceEditControllerIT extends AbstractControllerTest {
+    private static final String PATH = CONTEXT_PATH_EDIT_RESOURCE;
+
+    @Autowired
+    protected UIResourceSearchService uiResourceSearchService;
+
+    @BeforeEach
+    public void setup() throws IOException {
+        super.setup();
+    }
+
+    // test must match the webapp_integration_test_data.sql file!
+    @ParameterizedTest
+    @CsvSource({
+            ",'', 2",
+            ",'group-admin', 2",
+            ",'resource-admin', 1",
+            "'','', 2",
+            "ehealth-actorid-qns,'', 2", // filter by group match
+            "'No match at all','', 0",
+            "australia,'', 1", // filter by value match
+    })
+    public void testGetResourcesForGroup(String filter, String roleType, int expectedResults) throws Exception {
+        // given when
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file
+        GroupRO groupRO = groupsForUser.get(0);
+        // when
+        MvcResult result = mvc.perform(get(PATH, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId())
+                        .session(session)
+                        .param(PARAM_PAGINATION_FILTER, filter)
+                        .param(PARAM_NAME_TYPE, roleType)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class);
+        assertNotNull(serviceResult);
+        assertEquals(expectedResults, serviceResult.getServiceEntities().size());
+
+    }
+
+    @Test
+    public void testPutResource() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file
+        GroupRO groupRO = groupsForUser.get(0);
+
+
+        ResourceRO resource = new ResourceRO();
+        resource.setResourceTypeIdentifier("edelivery-oasis-smp-1.0-servicegroup");
+        resource.setIdentifierValue(UUID.randomUUID().toString());
+        resource.setIdentifierScheme("test-test-test");
+        resource.setVisibility(VisibilityType.PUBLIC);
+
+        int initialSize = getResourceCount();
+        // when
+        MvcResult result = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_CREATE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(resource)))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        ResourceRO response = getObjectFromResponse(result, ResourceRO.class);
+        assertNotNull(response);
+        assertEquals(VisibilityType.PUBLIC, response.getVisibility());
+        assertEquals(resource.getIdentifierValue(), response.getIdentifierValue());
+        assertEquals(resource.getIdentifierScheme(), response.getIdentifierScheme());
+
+        assertEquals(initialSize + 1, getResourceCount());
+    }
+
+    @Test
+    public void testDeleteResource() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        GroupRO groupRO = groupsForUser.get(0);
+        ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO);
+        int initialSize = getResourceCount();
+
+        // when
+        MvcResult result = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_DELETE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), addedResource.getResourceId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        // then
+        ResourceRO response = getObjectFromResponse(result, ResourceRO.class);
+        assertNotNull(response);
+        assertEquals(addedResource.getIdentifierValue(), response.getIdentifierValue());
+        assertEquals(addedResource.getIdentifierScheme(), response.getIdentifierScheme());
+        assertEquals(initialSize - 1, getResourceCount());
+    }
+
+    @Test
+    public void testUpdateResource() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        GroupRO groupRO = groupsForUser.get(0);
+        ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO);
+        addedResource.setVisibility(VisibilityType.PRIVATE);
+
+        // when
+        MvcResult result = mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_UPDATE, userRO.getUserId(), domainRO.getDomainId(),
+                        groupRO.getGroupId(), addedResource.getResourceId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(addedResource)))
+                .andExpect(status().isOk()).andReturn();
+        // then
+        ResourceRO response = getObjectFromResponse(result, ResourceRO.class);
+        assertNotNull(response);
+        assertEquals(addedResource.getVisibility(), response.getVisibility());
+        assertEquals(addedResource.getIdentifierValue(), response.getIdentifierValue());
+        assertEquals(addedResource.getIdentifierScheme(), response.getIdentifierScheme());
+    }
+
+    @Test
+    public void testGetGroupMembers() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        GroupRO groupRO = groupsForUser.get(0);
+        ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO);
+
+        // when
+        MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(),
+                        addedResource.getResourceId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class);
+        assertNotNull(serviceResult);
+        assertEquals(1, serviceResult.getServiceEntities().size());
+        MemberRO memberRO = getObjectMapper().convertValue(serviceResult.getServiceEntities().get(0), MemberRO.class);
+
+        // the admin user who created group is automatically added as member
+        assertEquals(userRO.getUsername(), memberRO.getUsername());
+    }
+
+
+    @Test
+    public void testAddGroupMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        GroupRO groupRO = groupsForUser.get(0);
+        ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO);
+
+        //when
+        MemberRO response = addResourceMember(session, domainRO, groupRO, addedResource, userRO, SG_USER_USERNAME);
+        // then
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+    }
+
+    @Test
+    public void testDeleteGroupMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        GroupRO groupRO = groupsForUser.get(0);
+        ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO);
+        MemberRO member = addResourceMember(session, domainRO, groupRO, addedResource, userRO, SG_USER_USERNAME);
+        //when
+        MvcResult deleteGroupMemberResult = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER_DELETE,
+                        userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), addedResource.getResourceId(), member.getMemberId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class);
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+    }
+
+    @Test
+    public void testUpdateGroupMember() throws Exception {
+        // given
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null);
+        assertEquals(1, domainsForUser.size());
+        DomainRO domainRO = domainsForUser.get(0);
+        List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null);
+        GroupRO groupRO = groupsForUser.get(0);
+        ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO);
+        MemberRO member = addResourceMember(session, domainRO, groupRO, addedResource, userRO, SG_USER_USERNAME);
+
+
+        MvcResult updateGroupMemberResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER_PUT,
+                        userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), addedResource.getResourceId(), member.getMemberId())
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(getObjectMapper().writeValueAsBytes(member)))
+                .andExpect(status().isOk()).andReturn();
+
+        //then
+        MemberRO response = getObjectFromResponse(updateGroupMemberResult, MemberRO.class);
+        assertNotNull(response);
+        assertEquals(SG_USER_USERNAME, response.getUsername());
+        assertEquals(member.getRoleType(), response.getRoleType());
+    }
+
+
+    public int getResourceCount() {
+        return uiResourceSearchService.getTableList(-1, -1, null, null, new ResourceFilter()).getCount().intValue();
+    }
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIT.java
similarity index 99%
rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIntegrationTest.java
rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIT.java
index e1cd09f676da349af5fe29314ac5ed6531773a18..5bfc52c0081c6ee3e3ae0b9ed9de30fa7a27df12 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIntegrationTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIT.java
@@ -48,7 +48,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
         "smp.artifact.version=TestApplicationVersion",
         "smp.artifact.build.time=2018-11-27 00:00:00",
 })
-public class ApplicationResourceIntegrationTest {
+public class ApplicationResourceIT {
     private static final String PATH = ResourceConstants.CONTEXT_PATH_PUBLIC_APPLICATION;
 
     @Autowired
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIT.java
similarity index 98%
rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIntegrationTest.java
rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIT.java
index ffad2c65ccafb98d3420e3129e63eda50e20fafd..aeb2c25d5d451f7e699909a354d67e86b62a2c71 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIntegrationTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIT.java
@@ -36,7 +36,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 @Sql(scripts = {
         "/cleanup-database.sql",
         "/webapp_integration_test_data.sql"})
-public class DomainResourceIntegrationTest {
+public class DomainResourceIT {
     private static final String PATH = ResourceConstants.CONTEXT_PATH_PUBLIC_DOMAIN;
 
     @Autowired
@@ -66,7 +66,7 @@ public class DomainResourceIntegrationTest {
                         .with(csrf()))
                 .andExpect(status().isOk()).andReturn();
 
-        //them
+        //then
         ObjectMapper mapper = new ObjectMapper();
         ServiceResult res = mapper.readValue(result.getResponse().getContentAsString(), ServiceResult.class);
 
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIT.java
similarity index 96%
rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIntegrationTest.java
rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIT.java
index 5aaace5de71d01ab9a36b783251fa231cf7f30eb..d73c5f4a675a2b20234624a953ae034583285050 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIntegrationTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIT.java
@@ -41,7 +41,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
         "classpath:/cleanup-database.sql",
         "classpath:/webapp_integration_test_data.sql"},
         executionPhase = BEFORE_TEST_METHOD)
-public class SearchResourceIntegrationTest {
+public class SearchResourceIT {
 
     @Autowired
     private WebApplicationContext webAppContext;
@@ -66,8 +66,7 @@ public class SearchResourceIntegrationTest {
     @Test
     public void testSearchByAnonymous() throws Exception {
         // given when
-        MvcResult result = mvc.perform(get(CONTEXT_PATH_PUBLIC_SEARCH_PARTICIPANT)
-        ).andExpect(status().isOk()).andReturn();
+        MvcResult result = mvc.perform(get(CONTEXT_PATH_PUBLIC_SEARCH_PARTICIPANT)).andExpect(status().isOk()).andReturn();
 
         //then
         ObjectMapper mapper = new ObjectMapper();
@@ -76,4 +75,4 @@ public class SearchResourceIntegrationTest {
         assertNotNull(res);
         assertEquals(2, res.getServiceEntities().size());
     }
-}
\ No newline at end of file
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerIT.java
similarity index 58%
rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerTest.java
rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerIT.java
index ca2472210c2309f91db5b7ef6ef057956d828d5e..b028cd77bc180b199f765a551d313013b9e8a358 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerIT.java
@@ -1,13 +1,14 @@
 package eu.europa.ec.edelivery.smp.ui.external;
 
+import eu.europa.ec.edelivery.smp.data.enums.CredentialType;
+import eu.europa.ec.edelivery.smp.data.ui.CredentialRO;
 import eu.europa.ec.edelivery.smp.data.ui.NavigationTreeNodeRO;
 import eu.europa.ec.edelivery.smp.data.ui.SearchUserRO;
 import eu.europa.ec.edelivery.smp.data.ui.UserRO;
 import eu.europa.ec.edelivery.smp.services.ui.UIUserService;
 import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mock.web.MockHttpSession;
 import org.springframework.test.web.servlet.MvcResult;
@@ -19,23 +20,23 @@ import java.util.stream.Collectors;
 
 import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
 import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_USER;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 
-public class UserControllerTest extends AbstractControllerTest {
+public class UserControllerIT extends AbstractControllerTest {
     private static final String PATH = CONTEXT_PATH_PUBLIC_USER;
 
     @Autowired
     protected UIUserService uiUserService;
 
-    @Before
+    @BeforeEach
     public void setup() throws IOException {
         super.setup();
     }
 
-
     @Test
     public void testGetUserNavigationTreeForSystemAdmin() throws Exception {
 
@@ -48,10 +49,10 @@ public class UserControllerTest extends AbstractControllerTest {
 
         NavigationTreeNodeRO result = getObjectFromResponse(response, NavigationTreeNodeRO.class);
 
-        Assert.assertNotNull(result);
-        Assert.assertEquals(4, result.getChildren().size());
+        assertNotNull(result);
+        assertEquals(4, result.getChildren().size());
         List<String> childrenNames = result.getChildren().stream().map(NavigationTreeNodeRO::getName).collect(Collectors.toList());
-        Assert.assertEquals(Arrays.asList("Search", "Administration", "System settings", "User Settings"), childrenNames);
+        assertEquals(Arrays.asList("Search", "Administration", "System settings", "User Settings"), childrenNames);
     }
 
     @Test
@@ -66,10 +67,10 @@ public class UserControllerTest extends AbstractControllerTest {
 
         NavigationTreeNodeRO result = getObjectFromResponse(response, NavigationTreeNodeRO.class);
 
-        Assert.assertNotNull(result);
-        Assert.assertEquals(3, result.getChildren().size());
+        assertNotNull(result);
+        assertEquals(3, result.getChildren().size());
         List<String> childrenNames = result.getChildren().stream().map(NavigationTreeNodeRO::getName).collect(Collectors.toList());
-        Assert.assertEquals(Arrays.asList("Search", "Administration", "User Settings"), childrenNames);
+        assertEquals(Arrays.asList("Search", "Administration", "User Settings"), childrenNames);
     }
 
     @Test
@@ -83,8 +84,8 @@ public class UserControllerTest extends AbstractControllerTest {
 
         List<SearchUserRO> result = getArrayFromResponse(response, SearchUserRO.class);
 
-        Assert.assertNotNull(result);
-        Assert.assertTrue(result.size()>5);
+        assertNotNull(result);
+        assertTrue(result.size() > 5);
     }
 
     @Test
@@ -98,8 +99,47 @@ public class UserControllerTest extends AbstractControllerTest {
 
         List<SearchUserRO> result = getArrayFromResponse(response, SearchUserRO.class);
 
-        Assert.assertNotNull(result);
-        Assert.assertEquals(1, result.size());
-        Assert.assertEquals(userRO.getUsername(), result.get(0).getUsername());
+        assertNotNull(result);
+        assertEquals(1, result.size());
+        assertEquals(userRO.getUsername(), result.get(0).getUsername());
+    }
+
+    @Test
+    public void testGetUserCredentialStatus() throws Exception {
+        MockHttpSession session = loginWithUser2(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        MvcResult response = mvc.perform(get(PATH + "/{user-id}/username-credential-status", userRO.getUserId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        // when
+        CredentialRO result = getObjectFromResponse(response, CredentialRO.class);
+        // then
+        assertNotNull(result);
+        assertEquals(userRO.getUsername(), result.getName());
+        assertTrue(result.isActive());
+        assertTrue(result.isExpired()); // set by admin
+        assertNull(result.getExpireOn());
+    }
+
+
+    @Test
+    public void testGetAccessTokenCredentials() throws Exception {
+        MockHttpSession session = loginWithUser2(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        MvcResult response = mvc.perform(get(PATH + "/{user-id}/access-token-credentials", userRO.getUserId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        // when
+        List<CredentialRO> result = getArrayFromResponse(response, CredentialRO.class);
+        // then
+        assertNotNull(result);
+        assertEquals(1, result.size());
+        CredentialRO credentialRO = result.get(0);
+        assertEquals(CredentialType.ACCESS_TOKEN, credentialRO.getCredentialType());
+        assertTrue(credentialRO.isActive());
+        assertTrue(credentialRO.isExpired()); // set by admin
+        assertNull(credentialRO.getExpireOn());
     }
 }
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIT.java
similarity index 97%
rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIntegrationTest.java
rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIT.java
index c51451d93eff8115ed9394ead905f4c3061349c9..abde55fe8c84e93f73111daad462461b9c203b66 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIntegrationTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIT.java
@@ -3,7 +3,6 @@ package eu.europa.ec.edelivery.smp.ui.external;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.json.JsonMapper;
 import eu.europa.ec.edelivery.smp.data.ui.AccessTokenRO;
-import eu.europa.ec.edelivery.smp.data.ui.CertificateRO;
 import eu.europa.ec.edelivery.smp.data.ui.PasswordChangeRO;
 import eu.europa.ec.edelivery.smp.data.ui.UserRO;
 import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig;
@@ -23,7 +22,6 @@ import org.springframework.test.web.servlet.MvcResult;
 import org.springframework.web.context.WebApplicationContext;
 
 import javax.ws.rs.core.MediaType;
-import java.util.UUID;
 
 import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
 import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY_USER;
@@ -44,7 +42,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
         "classpath:/cleanup-database.sql",
         "classpath:/webapp_integration_test_data.sql"},
         executionPhase = BEFORE_TEST_METHOD)
-public class UserResourceIntegrationTest {
+public class UserResourceIT {
 
     private static final String PATH_PUBLIC = ResourceConstants.CONTEXT_PATH_PUBLIC_USER;
 
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminControllerIT.java
similarity index 54%
rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminResourceIntegrationTest.java
rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminControllerIT.java
index 0c4cda544909750f507a33d37172298034b9d8d1..0956d5da6c8e43f9d89d5d69386616a6399bb3d5 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminResourceIntegrationTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminControllerIT.java
@@ -1,69 +1,51 @@
 package eu.europa.ec.edelivery.smp.ui.internal;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import eu.europa.ec.edelivery.smp.data.dao.DomainDao;
 import eu.europa.ec.edelivery.smp.data.model.DBDomain;
-import eu.europa.ec.edelivery.smp.data.ui.DeleteEntityValidation;
 import eu.europa.ec.edelivery.smp.data.ui.DomainRO;
 import eu.europa.ec.edelivery.smp.data.ui.UserRO;
 import eu.europa.ec.edelivery.smp.data.ui.enums.EntityROStatus;
-import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig;
+import eu.europa.ec.edelivery.smp.data.ui.exceptions.ErrorResponseRO;
+import eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode;
 import eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils;
+import eu.europa.ec.edelivery.smp.test.testutils.TestROUtils;
+import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
 import eu.europa.ec.edelivery.smp.ui.ResourceConstants;
 import org.apache.commons.lang3.StringUtils;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.mock.web.MockHttpSession;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.jdbc.Sql;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.MvcResult;
-import org.springframework.web.context.WebApplicationContext;
 
+import java.io.IOException;
+import java.util.Collections;
 import java.util.List;
 
 import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
-import static org.hamcrest.Matchers.stringContainsInOrder;
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
-import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 
-@RunWith(SpringRunner.class)
-@WebAppConfiguration
-@DirtiesContext
-@ContextConfiguration(classes = {SmpTestWebAppConfig.class})
-@Sql(scripts = {
-        "classpath:/cleanup-database.sql",
-        "classpath:/webapp_integration_test_data.sql"},
-        executionPhase = BEFORE_TEST_METHOD)
-public class DomainAdminResourceIntegrationTest {
+public class DomainAdminControllerIT extends AbstractControllerTest {
     private static final String PATH = ResourceConstants.CONTEXT_PATH_INTERNAL_DOMAIN;
 
-    @Autowired
-    private WebApplicationContext webAppContext;
-
     @Autowired
     DomainDao domainDao;
 
-    private MockMvc mvc;
-
-    @Before
-    public void setup() {
-        mvc = MockMvcUtils.initializeMockMvc(webAppContext);
+    @BeforeEach
+    public void setup() throws IOException {
+        super.setup();
     }
 
     @Test
     public void testGetAllDomains() throws Exception {
+
         List<DBDomain> domain = domainDao.getAllDomains();
         MockHttpSession session = loginWithSystemAdmin(mvc);
         UserRO userRO = MockMvcUtils.getLoggedUserData(mvc, session);
@@ -78,6 +60,69 @@ public class DomainAdminResourceIntegrationTest {
         assertEquals(domain.size(), response.size());
     }
 
+    @Test
+    public void testCreateBasicDomainData() throws Exception {
+        DomainRO testDomain = TestROUtils.createDomain();
+
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = MockMvcUtils.getLoggedUserData(mvc, session);
+
+        MvcResult result = mvc.perform(put(PATH + "/" + userRO.getUserId() + "/create")
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(entitiToString(testDomain)))
+                .andExpect(status().isOk()).andReturn();
+
+        DomainRO resultObject = parseResponse(result, DomainRO.class);
+        assertNotNull(resultObject);
+        assertNotNull(resultObject.getDomainId());
+        assertEquals(testDomain.getDomainCode(), resultObject.getDomainCode());
+    }
+
+    @Test
+    public void testCreateDomainWithEmptyCode() throws Exception {
+        DomainRO testDomain = TestROUtils.createDomain("");
+
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = MockMvcUtils.getLoggedUserData(mvc, session);
+
+        MvcResult result = mvc.perform(put(PATH + "/" + userRO.getUserId() + "/create")
+                        .session(session)
+                        .with(csrf())
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(entitiToString(testDomain)))
+                .andExpect(status().is4xxClientError()).andReturn();
+
+        ErrorResponseRO errorRO = getObjectFromResponse(result, ErrorResponseRO.class);
+        assertNotNull(errorRO);
+        assertEquals(ErrorBusinessCode.INVALID_INPUT_DATA.name(), errorRO.getBusinessCode());
+        MatcherAssert.assertThat(errorRO.getErrorDescription(), Matchers.containsString("Invalid domain data! Domain code must not be empty!"));
+    }
+
+    @Test
+    public void testUpdateResourceDefDomainList() throws Exception {
+        String domainCode = "domainTwo";
+        String documentType = "edelivery-oasis-cppa";
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = (UserRO) session.getAttribute(MOCK_LOGGED_USER);
+
+        DomainRO domainToUpdate = getDomain(domainCode, userRO, session);
+        assertTrue(domainToUpdate.getResourceDefinitions().isEmpty());
+
+        MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "/update-resource-types")
+                        .session(session)
+                        .with(csrf())
+                        .header("Content-Type", " application/json")
+                        .content(entitiToString(Collections.singletonList(documentType))))
+                .andExpect(status().isOk()).andReturn();
+        DomainRO resultObject = parseResponse(result, DomainRO.class);
+        //
+        assertNotNull(resultObject);
+        assertEquals(1, resultObject.getResourceDefinitions().size());
+        assertEquals(documentType, resultObject.getResourceDefinitions().get(0));
+    }
+
     @Test
     public void testDeleteDomainOK() throws Exception {
         // given - delete domain two :)
@@ -87,7 +132,7 @@ public class DomainAdminResourceIntegrationTest {
         DomainRO domainToDelete = getDomain(domainCode, userRO, session);
         assertNotNull(domainToDelete);
 
-        MvcResult result = mvc.perform(delete(PATH + "/" + userRO.getUserId() + "/" + domainToDelete.getDomainId() + "" + "/delete")
+        MvcResult result = mvc.perform(delete(PATH + "/" + userRO.getUserId() + "/" + domainToDelete.getDomainId() + "/delete")
                         .session(session)
                         .with(csrf())
                         .header("Content-Type", " application/json")) // delete domain with id 2
@@ -108,7 +153,7 @@ public class DomainAdminResourceIntegrationTest {
         domainToUpdate.setDomainCode("NewCode");
         domainToUpdate.setSignatureKeyAlias("New alias");
 
-        MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "" + "/update")
+        MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() +  "/update")
                         .session(session)
                         .with(csrf())
                         .header("Content-Type", " application/json")
@@ -125,13 +170,13 @@ public class DomainAdminResourceIntegrationTest {
     public void updateDomainSmlIntegrationData() throws Exception {
         String domainCode = "domainTwo";
         MockHttpSession session = loginWithSystemAdmin(mvc);
-        UserRO userRO = (UserRO)session.getAttribute(MOCK_LOGGED_USER);
+        UserRO userRO = (UserRO) session.getAttribute(MOCK_LOGGED_USER);
 
         DomainRO domainToUpdate = getDomain(domainCode, userRO, session);
         domainToUpdate.setSmlSubdomain("NewCode");
         domainToUpdate.setSmlClientKeyAlias("New alias");
 
-        MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "" + "/update-sml-integration-data")
+        MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "/update-sml-integration-data")
                         .session(session)
                         .with(csrf())
                         .header("Content-Type", " application/json")
@@ -145,7 +190,6 @@ public class DomainAdminResourceIntegrationTest {
     }
 
     @Test
-    @Ignore
     public void updateDomainDataAddNewResourceDef() throws Exception {
         // set the webapp_integration_test_data.sql for resourceDefID
         String resourceDefID = "edelivery-oasis-cppa";
@@ -155,7 +199,7 @@ public class DomainAdminResourceIntegrationTest {
         DomainRO domainToUpdate = getDomain(domainCode, userRO, session);
         domainToUpdate.getResourceDefinitions().add(resourceDefID);
 
-        MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "" + "/update-resource-types")
+        MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "/update-resource-types")
                         .session(session)
                         .with(csrf())
                         .header("Content-Type", " application/json")
@@ -168,110 +212,6 @@ public class DomainAdminResourceIntegrationTest {
         assertEquals(EntityROStatus.UPDATED.getStatusNumber(), resultObject.getStatus());
     }
 
-/*
-    @Test
-    public void updateDomainListNotExists() throws Exception {
-// given when
-        MockHttpSession session = loginWithSystemAdmin(mvc);
-
-
-        MvcResult result = mvc.perform(put(PATH)
-                        .session(session)
-                        .with(csrf())
-                        .header("Content-Type", " application/json")
-                        .content("[{\"status\":3,\"index\":9,\"id\":10,\"domainCode\":\"domainTwoNotExist\",\"smlSubdomain\":\"newdomain\",\"smlSmpId\":\"CEF-SMP-010\",\"smlParticipantIdentifierRegExp\":null,\"smlClientCertHeader\":null,\"smlClientKeyAlias\":null,\"signatureKeyAlias\":\"sig-key\",\"smlClientCertAuth\":true,\"smlRegistered\":false}]")) // delete domain with id 2
-                .andExpect(status().isOk()).andReturn();
-    }
-
-    @Test
-    public void validateDeleteDomainOK() throws Exception {
-        // given when
-        MockHttpSession session = loginWithSystemAdmin(mvc);
-        MvcResult result = mvc.perform(put(PATH + "/validate-delete")
-                        .session(session)
-                        .with(csrf())
-                        .header("Content-Type", " application/json")
-                        .content("[2]")) // delete domain with id 2
-                .andExpect(status().isOk()).andReturn();
-
-        //them
-        ObjectMapper mapper = new ObjectMapper();
-        DeleteEntityValidation res = mapper.readValue(result.getResponse().getContentAsString(), DeleteEntityValidation.class);
-
-        assertNotNull(res);
-        assertTrue(res.getListDeleteNotPermitedIds().isEmpty());
-        assertEquals(1, res.getListIds().size());
-        assertEquals(true, res.isValidOperation());
-        assertNull(res.getStringMessage());
-    }
-
-    @Test
-    public void updateDomainListOkUpdate() throws Exception {
-// given when
-        assertEquals("CEF-SMP-002", domainDao.getDomainByCode("domainTwo").get().getSmlSmpId());
-        MockHttpSession session = loginWithSystemAdmin(mvc);
-        MvcResult result = mvc.perform(put(PATH)
-                        .session(session)
-                        .with(csrf())
-                        .header("Content-Type", " application/json")
-                        .content("[{\"status\":1,\"index\":9,\"id\":2,\"domainCode\":\"domainTwo\",\"smlSubdomain\":\"newdomain\",\"smlSmpId\":\"CEF-SMP-010\",\"smlParticipantIdentifierRegExp\":null,\"smlClientCertHeader\":null,\"smlClientKeyAlias\":null,\"signatureKeyAlias\":\"sig-key\",\"smlClientCertAuth\":true,\"smlRegistered\":false}]")) // delete domain with id 2
-                .andExpect(status().isOk()).andReturn();
-
-        // check if exists
-        assertEquals("CEF-SMP-010", domainDao.getDomainByCode("domainTwo").get().getSmlSmpId());
-    }
-
-    @Test
-    public void validateDeleteDomainFalse() throws Exception {
-        // given when
-        MockHttpSession session = loginWithSystemAdmin(mvc);
-        MvcResult result = mvc.perform(put(PATH + "/validate-delete")
-                        .session(session)
-                        .with(csrf())
-                        .header("Content-Type", " application/json")
-                        .content("[1]")) // delete domain with id 2
-                .andExpect(status().isOk()).andReturn();
-
-        //them
-        ObjectMapper mapper = new ObjectMapper();
-        DeleteEntityValidation res = mapper.readValue(result.getResponse().getContentAsString(), DeleteEntityValidation.class);
-
-        assertNotNull(res);
-        assertEquals(1, res.getListDeleteNotPermitedIds().size());
-        assertEquals(1, res.getListIds().size());
-        assertEquals(false, res.isValidOperation());
-        assertEquals("Could not delete domains used by Service groups! Domain: domain (domain ) uses by:1 SG.", res.getStringMessage());
-    }
-
-    @Test
-    public void registerDomainAndParticipantsNotEnabled() throws Exception {
-        // given when
-        // 3- user id
-        // domainTwo -  domain code
-        MockHttpSession session = loginWithSystemAdmin(mvc);
-        mvc.perform(put(PATH + "/3/sml-register/domainTwo")
-                        .session(session)
-                        .with(csrf())
-                        .header("Content-Type", " application/json"))
-                .andExpect(status().isOk())
-                .andExpect(content().string(stringContainsInOrder("Configuration error: [SML integration is not enabled!]!")));
-    }
-
-    @Test
-    public void unregisterDomainAndParticipants() throws Exception {
-        // given when
-        // 3- user id
-        // domainTwo -  domain code
-        MockHttpSession session = loginWithSystemAdmin(mvc);
-        mvc.perform(put(PATH + "/3/sml-unregister/domainTwo")
-                        .session(session)
-                        .with(csrf())
-                        .header("Content-Type", " application/json"))
-                .andExpect(status().isOk())
-                .andExpect(content().string(stringContainsInOrder("Configuration error: SML integration is not enabled!!")));
-    }
-*/
-
     private List<DomainRO> getAllDomains(UserRO userRO, MockHttpSession session) throws Exception {
         MvcResult result = mvc.perform(get(PATH + "/" + userRO.getUserId())
                         .session(session)
@@ -290,8 +230,8 @@ public class DomainAdminResourceIntegrationTest {
 
     }
 
-    private String entitiToString(Object object ) throws Exception {
-            return serializeObject(object);
+    private String entitiToString(Object object) throws Exception {
+        return serializeObject(object);
 
 
     }
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreAdminControllerIT.java
similarity index 83%
rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResourceIntegrationTest.java
rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreAdminControllerIT.java
index 7bf7eb852f422ad7c258e20d1cb73c046a0c42f8..10a1e17365d49b2a7c080116f18ed02e5e2f72f9 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResourceIntegrationTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreAdminControllerIT.java
@@ -3,14 +3,13 @@ package eu.europa.ec.edelivery.smp.ui.internal;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import eu.europa.ec.edelivery.smp.data.ui.CertificateRO;
 import eu.europa.ec.edelivery.smp.data.ui.KeystoreImportResult;
 import eu.europa.ec.edelivery.smp.data.ui.UserRO;
 import eu.europa.ec.edelivery.smp.services.ui.UIKeystoreService;
 import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mock.web.MockHttpSession;
 import org.springframework.test.web.servlet.MvcResult;
@@ -23,19 +22,19 @@ import java.util.List;
 
 import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
 import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_INTERNAL_KEYSTORE;
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
-public class KeystoreResourceIntegrationTest extends AbstractControllerTest {
+public class KeystoreAdminControllerIT extends AbstractControllerTest {
     private static final String PATH = CONTEXT_PATH_INTERNAL_KEYSTORE;
     Path keystore = Paths.get("src", "test", "resources", "keystores", "smp-keystore.jks");
 
     @Autowired
     private UIKeystoreService uiKeystoreService;
 
-    @Before
+    @BeforeEach
     public void setup() throws IOException {
         super.setup();
         uiKeystoreService.refreshData();
@@ -54,7 +53,8 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest {
 
         //then
         ObjectMapper mapper = getObjectMapper();
-        List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>(){});
+        List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() {
+        });
 
         assertNotNull(listCerts);
         assertEquals(countStart, listCerts.size());
@@ -90,7 +90,7 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest {
     public void uploadKeystoreInvalidPassword() throws Exception {
         // login
         MockHttpSession session = loginWithSystemAdmin(mvc);
-        UserRO userRO = (UserRO)session.getAttribute(MOCK_LOGGED_USER);
+        UserRO userRO = (UserRO) session.getAttribute(MOCK_LOGGED_USER);
         // given when
         MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/upload/JKS/NewPassword1234")
                         .session(session)
@@ -126,14 +126,14 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest {
     }
 
     @Test
-    public void deleteKeystoreEntryOK() throws Exception {
+    public void deleteCertificateOK() throws Exception {
         MockHttpSession session = loginWithSystemAdmin(mvc);
         UserRO userRO = getLoggedUserData(mvc, session);
-
+        String alias = "second_domain_alias";
 
         int countStart = uiKeystoreService.getKeystoreEntriesList().size();
         // given when
-        MvcResult result = mvc.perform(delete(PATH + "/" + userRO.getUserId() + "/delete/second_domain_alias")
+        MvcResult result = mvc.perform(delete(PATH + "/" + userRO.getUserId() + "/delete/" + alias)
                         .session(session)
                         .with(csrf()))
                 .andExpect(status().isOk()).andReturn();
@@ -147,5 +147,19 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest {
         assertEquals(countStart - 1, uiKeystoreService.getKeystoreEntriesList().size());
     }
 
+    @Test
+    public void deleteCertificateNotExists() throws Exception {
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userRO = getLoggedUserData(mvc, session);
+        String alias = "alias-not-exists";
+
+        // given when
+        MvcResult result = mvc.perform(delete(PATH + "/" + userRO.getUserId() + "/delete/"+ alias)
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
 
+        CertificateRO res = getObjectFromResponse(result, CertificateRO.class);
+        assertEquals("Certificate Key not removed because alias ["+alias+"] does not exist in keystore!", res.getActionMessage());
+    }
 }
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerIT.java
similarity index 77%
rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminResourceIntegrationTest.java
rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerIT.java
index 9857fd9fb099209951257d73a799382209b1f770..d8e9c06a5f3097a11ae7777db2badcfbb35c64e3 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminResourceIntegrationTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerIT.java
@@ -3,27 +3,21 @@ package eu.europa.ec.edelivery.smp.ui.internal;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import eu.europa.ec.edelivery.smp.data.ui.CertificateRO;
-import eu.europa.ec.edelivery.smp.data.ui.ServiceResult;
 import eu.europa.ec.edelivery.smp.data.ui.UserRO;
 import eu.europa.ec.edelivery.smp.services.ui.UITruststoreService;
 import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig;
 import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils;
-import eu.europa.ec.edelivery.smp.ui.external.UserResourceIntegrationTest;
+import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
+import eu.europa.ec.edelivery.smp.ui.external.UserResourceIT;
 import org.apache.commons.io.IOUtils;
 import org.hamcrest.CoreMatchers;
-import org.junit.Before;
 import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mock.web.MockHttpSession;
-import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.jdbc.Sql;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.MvcResult;
 import org.springframework.web.context.WebApplicationContext;
@@ -37,21 +31,12 @@ import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_INTER
 import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_TRUSTSTORE;
 import static org.junit.Assert.*;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
-import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
-@RunWith(SpringRunner.class)
-@DirtiesContext
-@WebAppConfiguration
 @ContextConfiguration(classes = {SmpTestWebAppConfig.class, UITruststoreService.class})
-@Sql(scripts = {
-        "classpath:/cleanup-database.sql",
-        "classpath:/webapp_integration_test_data.sql"},
-        executionPhase = BEFORE_TEST_METHOD)
-@Ignore
-public class TruststoreAdminResourceIntegrationTest{
+public class TruststoreAdminControllerIT extends AbstractControllerTest {
     private static final String PATH_INTERNAL = CONTEXT_PATH_INTERNAL_TRUSTSTORE;
     private static final String PATH_PUBLIC = CONTEXT_PATH_PUBLIC_TRUSTSTORE;
 
@@ -63,10 +48,11 @@ public class TruststoreAdminResourceIntegrationTest{
 
     private MockMvc mvc;
 
-    @Before
+    @BeforeEach
     public void setup() throws IOException {
-        uiTruststoreService.refreshData();
+
         X509CertificateTestUtils.reloadKeystores();
+        uiTruststoreService.refreshData();
         mvc = initializeMockMvc(webAppContext);
     }
 
@@ -82,25 +68,25 @@ public class TruststoreAdminResourceIntegrationTest{
 
         // given when
         mvc.perform(post(PATH_PUBLIC + "/" + userRO.getUserId() + "/validate-certificate")
-                .session(session)
-                .with(csrf())
-                .content(buff))
+                        .session(session)
+                        .with(csrf())
+                        .content(buff))
                 .andExpect(status().isOk())
                 .andExpect(content().string(CoreMatchers.containsString("Can not read the certificate!")));
     }
 
     @Test
     public void validateCertificateSystemAdmin() throws Exception {
-        byte[] buff = IOUtils.toByteArray(UserResourceIntegrationTest.class.getResourceAsStream("/SMPtest.crt"));
+        byte[] buff = IOUtils.toByteArray(UserResourceIT.class.getResourceAsStream("/SMPtest.crt"));
         // login
         MockHttpSession session = loginWithSystemAdmin(mvc);
         // when update data
         UserRO userRO = getLoggedUserData(mvc, session);
         // given when
         MvcResult result = mvc.perform(post(PATH_PUBLIC + "/" + userRO.getUserId() + "/validate-certificate")
-                .session(session)
-                .with(csrf())
-                .content(buff))
+                        .session(session)
+                        .with(csrf())
+                        .content(buff))
                 .andExpect(status().isOk()).andReturn();
 
         //then
@@ -129,13 +115,13 @@ public class TruststoreAdminResourceIntegrationTest{
         byte[] buff = certificate.getEncoded();
         // given when
         MvcResult result = mvc.perform(post(PATH_PUBLIC + "/" + userRO.getUserId() + "/validate-certificate")
-                .session(session)
-                .with(csrf())
-                .content(buff))
+                        .session(session)
+                        .with(csrf())
+                        .content(buff))
                 .andExpect(status().isOk()).andReturn();
 
         //them
-        ObjectMapper mapper =getObjectMapper();
+        ObjectMapper mapper = getObjectMapper();
         CertificateRO res = mapper.readValue(result.getResponse().getContentAsString(), CertificateRO.class);
 
         assertEquals("CN=common name,O=org,C=BE:0000000001234321", res.getCertificateId());
@@ -143,13 +129,13 @@ public class TruststoreAdminResourceIntegrationTest{
 
     @Test
     public void uploadCertificateInvalidUser() throws Exception {
-        byte[] buff = IOUtils.toByteArray(UserResourceIntegrationTest.class.getResourceAsStream("/SMPtest.crt"));
+        byte[] buff = IOUtils.toByteArray(UserResourceIT.class.getResourceAsStream("/SMPtest.crt"));
         // id and logged user not match
         // given when
         mvc.perform(post(PATH_PUBLIC + "/34556655/validate-certificate")
-                .with(getHttpBasicSMPAdminCredentials())
-                .with(csrf())
-                .content(buff))
+                        .with(getHttpBasicSMPAdminCredentials())
+                        .with(csrf())
+                        .content(buff))
                 .andExpect(status().isUnauthorized()).andReturn();
     }
 
@@ -162,14 +148,15 @@ public class TruststoreAdminResourceIntegrationTest{
         UserRO userRO = getLoggedUserData(mvc, session);
 
         int countStart = uiTruststoreService.getCertificateROEntriesList().size();
-        MvcResult result = mvc.perform(get(PATH_INTERNAL+ "/" + userRO.getUserId())
-                .session(session)
-                .with(csrf()))
+        MvcResult result = mvc.perform(get(PATH_INTERNAL + "/" + userRO.getUserId())
+                        .session(session)
+                        .with(csrf()))
                 .andExpect(status().isOk()).andReturn();
 
         //then
         ObjectMapper mapper = getObjectMapper();
-        List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>(){});
+        List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() {
+        });
 
         assertNotNull(listCerts);
         assertEquals(countStart, listCerts.size());
@@ -189,13 +176,13 @@ public class TruststoreAdminResourceIntegrationTest{
         MockHttpSession session = loginWithSystemAdmin(mvc);
         UserRO userRO = getLoggedUserData(mvc, session);
 
-        byte[] buff = IOUtils.toByteArray(UserResourceIntegrationTest.class.getResourceAsStream("/SMPtest.crt"));
+        byte[] buff = IOUtils.toByteArray(UserResourceIT.class.getResourceAsStream("/SMPtest.crt"));
 
         int countStart = uiTruststoreService.getNormalizedTrustedList().size();
         MvcResult prepRes = mvc.perform(post(PATH_INTERNAL + "/" + userRO.getUserId() + "/upload-certificate")
-                .session(session)
-                .with(csrf())
-                .content(buff))
+                        .session(session)
+                        .with(csrf())
+                        .content(buff))
                 .andExpect(status().isOk()).andReturn();
 
         // given when
@@ -207,17 +194,12 @@ public class TruststoreAdminResourceIntegrationTest{
 
         // then
         MvcResult result = mvc.perform(delete(PATH_INTERNAL + "/" + userRO.getUserId() + "/delete/" + res.getAlias())
-                .session(session)
-                .with(csrf())
-                .content(buff))
+                        .session(session)
+                        .with(csrf())
+                        .content(buff))
                 .andExpect(status().isOk()).andReturn();
         uiTruststoreService.refreshData();
         assertEquals(countStart, uiTruststoreService.getNormalizedTrustedList().size());
     }
 
-    protected  ObjectMapper getObjectMapper(){
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.registerModule(new JavaTimeModule());
-        return mapper;
-    }
 }
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java
index 29706842d6561b1be9e43cf3cc3836185667387a..d8cf8fd00d464cbf0974de84e65d76b4fb4a0ea6 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java
@@ -3,15 +3,14 @@ package eu.europa.ec.edelivery.smp.ui.internal;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import eu.europa.ec.edelivery.smp.data.ui.CertificateRO;
 import eu.europa.ec.edelivery.smp.data.ui.UserRO;
 import eu.europa.ec.edelivery.smp.data.ui.enums.EntityROStatus;
 import eu.europa.ec.edelivery.smp.services.ui.UITruststoreService;
 import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils;
 import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mock.web.MockHttpSession;
 import org.springframework.test.web.servlet.MvcResult;
@@ -23,7 +22,7 @@ import java.util.UUID;
 
 import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
 import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_INTERNAL_TRUSTSTORE;
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -35,7 +34,7 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest {
     @Autowired
     private UITruststoreService uiTruststoreService;
 
-    @Before
+    @BeforeEach
     public void setup() throws IOException {
         super.setup();
         uiTruststoreService.refreshData();
@@ -54,7 +53,8 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest {
 
         //then
         ObjectMapper mapper = getObjectMapper();
-        List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() {});
+        List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() {
+        });
 
         assertNotNull(listCerts);
         assertEquals(countStart, listCerts.size());
@@ -112,7 +112,6 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest {
     @Test
     public void testDeleteCertificateFailed() throws Exception {
 
-
         String alias = UUID.randomUUID().toString();
 
         MockHttpSession session = loginWithSystemAdmin(mvc);
@@ -134,7 +133,6 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest {
         assertEquals(countStart, uiTruststoreService.getCertificateROEntriesList().size());
     }
 
-
     @Test
     public void testDeleteCertificateOK() throws Exception {
 
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminControllerIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..49970f1c25dc6d7d7da199a4d89b71362fccde45
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminControllerIT.java
@@ -0,0 +1,263 @@
+package eu.europa.ec.edelivery.smp.ui.internal;
+
+import eu.europa.ec.edelivery.smp.data.ui.*;
+import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest;
+import eu.europa.ec.edelivery.smp.ui.ResourceConstants;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.springframework.mock.web.MockHttpSession;
+import org.springframework.test.web.servlet.MvcResult;
+
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+import java.util.Map;
+import java.util.UUID;
+
+import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
+import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.PARAM_PAGINATION_FILTER;
+import static org.junit.Assert.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+
+public class UserAdminControllerIT extends AbstractControllerTest {
+
+    private static final String PATH_INTERNAL = ResourceConstants.CONTEXT_PATH_INTERNAL_USER;
+
+    @BeforeEach
+    public void setup() throws IOException {
+        super.setup();
+    }
+
+    @Test
+    public void getUsers() throws Exception {
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        MvcResult result = mvc.perform(get(PATH_INTERNAL)
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        ServiceResult res = getObjectMapper().readValue(result.getResponse().getContentAsString(), ServiceResult.class);
+        // then
+        assertNotNull(res);
+        assertEquals(7, res.getServiceEntities().size());
+        res.getServiceEntities().forEach(sgMap -> {
+            UserRO sgro = getObjectMapper().convertValue(sgMap, UserRO.class);
+            assertNotNull(sgro.getUserId());
+            assertNotNull(sgro.getUsername());
+        });
+    }
+
+    @Test
+    public void testSearch() throws Exception {
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userROAdmin = getLoggedUserData(mvc, session);
+        MvcResult result = mvc.perform(get(PATH_INTERNAL + "/{user-enc-id}/search", userROAdmin.getUserId())
+                        .session(session)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        ServiceResult res = getObjectMapper().readValue(result.getResponse().getContentAsString(), ServiceResult.class);
+        // then
+        assertNotNull(res);
+        assertEquals(7, res.getServiceEntities().size());
+        res.getServiceEntities().forEach(sgMap -> {
+            UserRO sgro = getObjectMapper().convertValue(sgMap, UserRO.class);
+            assertNotNull(sgro.getUserId());
+            assertNotNull(sgro.getUsername());
+        });
+    }
+
+    @Test
+    public void testSearchFilterNoMatch() throws Exception {
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        UserRO userROAdmin = getLoggedUserData(mvc, session);
+        MvcResult result = mvc.perform(get(PATH_INTERNAL + "/{user-enc-id}/search", userROAdmin.getUserId())
+                        .session(session)
+                        .param(PARAM_PAGINATION_FILTER, "no-user-matches-this-filter")
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        ServiceResult res = getObjectMapper().readValue(result.getResponse().getContentAsString(), ServiceResult.class);
+        // then
+        assertNotNull(res);
+        assertEquals(0, res.getServiceEntities().size());
+    }
+
+    @Test
+    public void testValidateDeleteUserOK() throws Exception {
+
+        // login
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        // get list
+        MvcResult result = mvc.perform(get(PATH_INTERNAL)
+                        .with(csrf())
+                        .session(session))
+                .andExpect(status().isOk()).andReturn();
+        ServiceResult res = getObjectMapper().readValue(result.getResponse().getContentAsString(), ServiceResult.class);
+        assertNotNull(res);
+        assertFalse(res.getServiceEntities().isEmpty());
+        UserRO userRO = getObjectMapper().convertValue(res.getServiceEntities().get(0), UserRO.class);
+
+        MvcResult resultDelete = mvc.perform(post(PATH_INTERNAL + "/validate-delete")
+                        .with(csrf())
+                        .session(session)
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content("[\"" + userRO.getUserId() + "\"]"))
+                .andExpect(status().isOk()).andReturn();
+
+        DeleteEntityValidation dev = getObjectMapper().readValue(resultDelete.getResponse().getContentAsString(), DeleteEntityValidation.class);
+
+        assertFalse(dev.getListIds().isEmpty());
+        assertFalse(dev.getListDeleteNotPermitedIds().isEmpty());
+    }
+
+    @Test
+    public void testValidateDeleteLoggedUserNotOK() throws Exception {
+
+        // login
+        MockHttpSession session = loginWithSystemAdmin(mvc);
+        // get list
+        mvc.perform(get(PATH_INTERNAL)
+                        .with(csrf())
+                        .session(session))
+                .andExpect(status().isOk()).andReturn();
+        UserRO userRO = getLoggedUserData(mvc, session);
+
+        // note system credential has id 3!
+        MvcResult resultDelete = mvc.perform(post(PATH_INTERNAL + "/validate-delete")
+                        .with(csrf())
+                        .session(session)
+                        .contentType(org.springframework.http.MediaType.APPLICATION_JSON)
+                        .content("[\"" + userRO.getUserId() + "\"]"))
+                .andExpect(status().isOk())
+                .andReturn();
+
+        DeleteEntityValidation res = getObjectMapper().readValue(resultDelete.getResponse().getContentAsString(), DeleteEntityValidation.class);
+
+        assertTrue(res.getListIds().isEmpty());
+        assertEquals("Could not delete logged user!", res.getStringMessage());
+    }
+
+    @Test
+    public void changePasswordForUser() throws Exception {
+        MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc);
+        UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin);
+
+        MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL)
+                        .session(sessionAdmin)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        ServiceResult res = getObjectMapper().readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class);
+        Map userROToUpdate = (Map) res.getServiceEntities().stream()
+                .filter(userMap ->
+                        StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username"))).findFirst().get();
+        String newPassword = "TESTtest1234!@#$";
+
+
+        PasswordChangeRO newPass = new PasswordChangeRO();
+        newPass.setUsername(SG_USER2_USERNAME);
+        newPass.setCurrentPassword(SYS_ADMIN_PASSWD);
+        newPass.setNewPassword(newPassword);
+        assertNotEquals(newPassword, SG_USER2_PASSWD);
+
+        mvc.perform(put(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "/change-password-for/" + userROToUpdate.get("userId"))
+                .with(csrf())
+                .session(sessionAdmin)
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(getObjectMapper().writeValueAsString(newPass))
+        ).andExpect(status().isOk()).andReturn();
+
+        // test to login with new password
+        MockHttpSession sessionNew = loginWithCredentials(mvc, SG_USER2_USERNAME, newPassword);
+        assertNotNull(sessionNew);
+    }
+
+    @Test
+    public void testGetUserData() throws Exception {
+        MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc);
+        UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin);
+
+        MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL)
+                        .session(sessionAdmin)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        ServiceResult res = getObjectMapper().readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class);
+        Map userROToUpdate = (Map) res.getServiceEntities().stream()
+                .filter(userMap ->
+                        StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username"))).findFirst().get();
+
+        MvcResult result =  mvc.perform(get(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "/" + userROToUpdate.get("userId")+"/retrieve")
+                .with(csrf())
+                .session(sessionAdmin)
+        ).andExpect(status().isOk()).andReturn();
+        UserRO resultUser = getObjectMapper().readValue(result.getResponse().getContentAsString(), UserRO.class);
+
+        assertNotNull(resultUser);
+        assertNotNull(resultUser.getUserId());
+        assertEquals(SG_USER2_USERNAME, resultUser.getUsername());
+    }
+
+    @Test
+    public void testUpdateUserData() throws Exception {
+        MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc);
+        UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin);
+
+        MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL)
+                        .session(sessionAdmin)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        ServiceResult res = getObjectMapper().readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class);
+        UserRO userROToUpdate = (UserRO) res.getServiceEntities().stream()
+                .filter(userMap ->
+                        StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username")))
+                .findFirst()
+                .map(o -> getObjectMapper().convertValue(o, UserRO.class)).get();
+
+        userROToUpdate.setFullName(UUID.randomUUID().toString());
+        // when
+        MvcResult result =  mvc.perform(post(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "/" + userROToUpdate.getUserId()+"/update")
+                .with(csrf())
+                .session(sessionAdmin)
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(getObjectMapper().writeValueAsString(userROToUpdate))
+        ).andExpect(status().isOk()).andReturn();
+        UserRO resultUser = getObjectMapper().readValue(result.getResponse().getContentAsString(), UserRO.class);
+        //then
+        assertNotNull(resultUser);
+        assertNotNull(resultUser.getUserId());
+        assertEquals(SG_USER2_USERNAME, resultUser.getUsername());
+        assertEquals(userROToUpdate.getFullName(), resultUser.getFullName());
+    }
+
+    @Test
+    public void testUDeleteUserData() throws Exception {
+        MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc);
+        UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin);
+
+        MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL)
+                        .session(sessionAdmin)
+                        .with(csrf()))
+                .andExpect(status().isOk()).andReturn();
+        ServiceResult res = getObjectMapper().readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class);
+        UserRO userROToUpdate = (UserRO) res.getServiceEntities().stream()
+                .filter(userMap ->
+                        StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username")))
+                .findFirst()
+                .map(o -> getObjectMapper().convertValue(o, UserRO.class)).get();
+
+
+        // when
+        MvcResult result =  mvc.perform(delete(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "/" + userROToUpdate.getUserId()+"/delete")
+                .with(csrf())
+                .session(sessionAdmin)
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(getObjectMapper().writeValueAsString(userROToUpdate))
+        ).andExpect(status().isOk()).andReturn();
+        UserRO resultUser = getObjectMapper().readValue(result.getResponse().getContentAsString(), UserRO.class);
+        //then
+        assertNotNull(resultUser);
+        assertNotNull(resultUser.getUserId());
+        assertEquals(SG_USER2_USERNAME, resultUser.getUsername());
+
+    }
+}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminResourceIntegrationTest.java
deleted file mode 100644
index 381771a9046e282d77ccc1db7e7e901ccd64d1a2..0000000000000000000000000000000000000000
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminResourceIntegrationTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package eu.europa.ec.edelivery.smp.ui.internal;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.json.JsonMapper;
-import eu.europa.ec.edelivery.smp.data.ui.*;
-import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig;
-import eu.europa.ec.edelivery.smp.ui.ResourceConstants;
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.mock.web.MockHttpSession;
-import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.jdbc.Sql;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.MvcResult;
-import org.springframework.web.context.WebApplicationContext;
-
-import javax.ws.rs.core.MediaType;
-import java.util.Collections;
-import java.util.Map;
-import java.util.UUID;
-
-import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
-import static org.junit.Assert.*;
-import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
-import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
-@RunWith(SpringRunner.class)
-@DirtiesContext
-@WebAppConfiguration
-@ContextConfiguration(classes = {SmpTestWebAppConfig.class})
-@Sql(scripts = {
-        "classpath:/cleanup-database.sql",
-        "classpath:/webapp_integration_test_data.sql"},
-        executionPhase = BEFORE_TEST_METHOD)
-@Ignore
-public class UserAdminResourceIntegrationTest {
-
-    private static final String PATH_INTERNAL = ResourceConstants.CONTEXT_PATH_INTERNAL_USER;
-
-    @Autowired
-    private WebApplicationContext webAppContext;
-
-    private MockMvc mvc;
-
-    ObjectMapper mapper = JsonMapper.builder()
-            .findAndAddModules()
-            .build();
-
-    @Before
-    public void setup() {
-        mvc = initializeMockMvc(webAppContext);
-    }
-
-    @Test
-    public void getUsers() throws Exception {
-        MockHttpSession session = loginWithSystemAdmin(mvc);
-        MvcResult result = mvc.perform(get(PATH_INTERNAL)
-                        .session(session)
-                        .with(csrf()))
-                .andExpect(status().isOk()).andReturn();
-        ServiceResult res = mapper.readValue(result.getResponse().getContentAsString(), ServiceResult.class);
-        // then
-        assertNotNull(res);
-        assertEquals(7, res.getServiceEntities().size());
-        res.getServiceEntities().forEach(sgMap -> {
-            UserRO sgro = mapper.convertValue(sgMap, UserRO.class);
-            assertNotNull(sgro.getUserId());
-            assertNotNull(sgro.getUsername());
-        });
-    }
-
-    @Test
-    @Ignore
-    public void testValidateDeleteUserOK() throws Exception {
-
-        // login
-        MockHttpSession session = loginWithSystemAdmin(mvc);
-        // get list
-        MvcResult result = mvc.perform(get(PATH_INTERNAL)
-                        .with(csrf())
-                        .session(session))
-                .andExpect(status().isOk()).andReturn();
-        ServiceResult res = mapper.readValue(result.getResponse().getContentAsString(), ServiceResult.class);
-        assertNotNull(res);
-        assertFalse(res.getServiceEntities().isEmpty());
-        UserRO userRO = mapper.convertValue(res.getServiceEntities().get(0), UserRO.class);
-
-        MvcResult resultDelete = mvc.perform(post(PATH_INTERNAL + "/validate-delete")
-                        .with(csrf())
-                        .session(session)
-                        .contentType(MediaType.APPLICATION_JSON)
-                        .content("[\"" + userRO.getUserId() + "\"]"))
-                .andExpect(status().isOk()).andReturn();
-
-        DeleteEntityValidation dev = mapper.readValue(resultDelete.getResponse().getContentAsString(), DeleteEntityValidation.class);
-
-        assertFalse(dev.getListIds().isEmpty());
-        assertTrue(dev.getListDeleteNotPermitedIds().isEmpty());
-        assertEquals(userRO.getUserId(), dev.getListIds().get(0));
-    }
-
-    @Test
-    public void testValidateDeleteLoggedUserNotOK() throws Exception {
-
-        // login
-        MockHttpSession session = loginWithSystemAdmin(mvc);
-        // get list
-        mvc.perform(get(PATH_INTERNAL)
-                        .with(csrf())
-                        .session(session))
-                .andExpect(status().isOk()).andReturn();
-        UserRO userRO = getLoggedUserData(mvc, session);
-
-        // note system credential has id 3!
-        MvcResult resultDelete = mvc.perform(post(PATH_INTERNAL + "/validate-delete")
-                        .with(csrf())
-                        .session(session)
-                        .contentType(org.springframework.http.MediaType.APPLICATION_JSON)
-                        .content("[\"" + userRO.getUserId() + "\"]"))
-                .andExpect(status().isOk())
-                .andReturn();
-
-        DeleteEntityValidation res = mapper.readValue(resultDelete.getResponse().getContentAsString(), DeleteEntityValidation.class);
-
-        assertTrue(res.getListIds().isEmpty());
-        assertEquals("Could not delete logged user!", res.getStringMessage());
-    }
-
-
-    @Test
-    @Ignore
-    public void generateAccessTokenForUser() throws Exception {
-        MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc);
-        UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin);
-
-        MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL)
-                        .session(sessionAdmin)
-                        .with(csrf()))
-                .andExpect(status().isOk()).andReturn();
-        ServiceResult res = mapper.readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class);
-        Map userROToUpdate = (Map) res.getServiceEntities().stream()
-                .filter(userMap ->
-                        StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username"))).findFirst().get();
-
-        MvcResult result = mvc.perform(post(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "/generate-access-token-for/" + userROToUpdate.get("userId"))
-                .with(csrf())
-                .session(sessionAdmin)
-                .content(SYS_ADMIN_PASSWD)
-        ).andExpect(status().isOk()).andReturn();
-
-
-        AccessTokenRO resAccessToken = mapper.readValue(result.getResponse().getContentAsString(), AccessTokenRO.class);
-        assertNotNull(resAccessToken);
-        assertNotNull(resAccessToken.getIdentifier());
-        assertNotNull(resAccessToken.getValue());
-
-    }
-
-    @Test
-    @Ignore
-    public void changePasswordForUser() throws Exception {
-        MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc);
-        UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin);
-
-        MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL)
-                        .session(sessionAdmin)
-                        .with(csrf()))
-                .andExpect(status().isOk()).andReturn();
-        ServiceResult res = mapper.readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class);
-        Map userROToUpdate = (Map) res.getServiceEntities().stream()
-                .filter(userMap ->
-                        StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username"))).findFirst().get();
-        String newPassword = "TESTtest1234!@#$";
-
-
-        PasswordChangeRO newPass = new PasswordChangeRO();
-        newPass.setUsername(SG_USER2_USERNAME);
-        newPass.setCurrentPassword(SYS_ADMIN_PASSWD);
-        newPass.setNewPassword(newPassword);
-        assertNotEquals(newPassword, SG_USER2_PASSWD);
-
-        mvc.perform(put(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "//change-password-for/" + userROToUpdate.get("userId"))
-                .with(csrf())
-                .session(sessionAdmin)
-                .contentType(MediaType.APPLICATION_JSON)
-                .content(mapper.writeValueAsString(newPass))
-        ).andExpect(status().isOk()).andReturn();
-
-        // test to login with new password
-        MockHttpSession sessionNew = loginWithCredentials(mvc, SG_USER2_USERNAME, newPassword);
-        assertNotNull(sessionNew);
-    }
-
-}
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidatorTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidatorTest.java
deleted file mode 100644
index b53d8c877b1226a3a1f5aa066567ddc4a681a122..0000000000000000000000000000000000000000
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidatorTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 2017 European Commission | CEF eDelivery
- *
- * Licensed under the EUPL, Version 1.2 or – as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence");
- * You may not use this work except in compliance with the Licence.
- *
- * You may obtain a copy of the Licence attached in file: LICENCE-EUPL-v1.2.pdf
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the Licence for the specific language governing permissions and limitations under the Licence.
- */
-
-package eu.europa.ec.edelivery.smp.validation;
-
-import eu.europa.ec.edelivery.smp.conversion.IdentifierService;
-import eu.europa.ec.edelivery.smp.identifiers.Identifier;
-import eu.europa.ec.edelivery.smp.services.ConfigurationService;
-
-import org.hamcrest.CoreMatchers;
-import org.hamcrest.MatcherAssert;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.mockito.Mockito;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.regex.Pattern;
-
-/**
- * Created by gutowpa on 02/08/2017.
- */
-@RunWith(Parameterized.class)
-@Ignore
-public class ServiceGroupValidatorTest {
-/*
-    private static final Pattern ALLOWED_SCHEME_PATTERN = Pattern.compile("^$|^(?!^.{26})([a-z0-9]+-[a-z0-9]+-[a-z0-9]+)$|^urn:oasis:names:tc:ebcore:partyid-type:(iso6523|unregistered)(:.+)?$");
-
-    private ServiceGroupValidator validator;
-    ConfigurationService configurationService = Mockito.mock(ConfigurationService.class);
-    IdentifierService normalizer = new IdentifierService(configurationService);
-
-    @Parameterized.Parameters(name = "{index}: {0}")
-    public static Collection<Object[]> data() {
-        return Arrays.asList(new Object[][]{
-
-                {"Good peppol schema", "good6-scheme4-ok", "urn:poland:ncpb", false, true, ALLOWED_SCHEME_PATTERN, null, null},
-                {"Allowed null schema", null, "urn:poland:ncpb", false, false, ALLOWED_SCHEME_PATTERN, null, null},
-                {"Length exceeded", "ength-exceeeeeedsTheCharacters-25chars", "urn:poland:ncpb", true, true, ALLOWED_SCHEME_PATTERN, MalformedIdentifierException.class, "Scheme does not match pattern:"},
-                {"Too many parts", "too-many-segments-inside", "urn:poland:ncpb", true, true, ALLOWED_SCHEME_PATTERN, MalformedIdentifierException.class, "Scheme does not match pattern:"},
-                {"Missing parts", "only-two", "urn:poland:ncpb", true, true, ALLOWED_SCHEME_PATTERN, MalformedIdentifierException.class, "Scheme does not match pattern: "},
-                {"Null not allowed", null, "urn:poland:ncpb", true, true, ALLOWED_SCHEME_PATTERN, IllegalArgumentException.class, "Invalid Identifier: "},
-                {"EBCorePartyId Oasis", "urn:oasis:names:tc:ebcore:partyid-type:iso6523:0088", "123456", false, true, ALLOWED_SCHEME_PATTERN, null, null},
-                {"EBCorePartyId eDelivery", null, "urn:oasis:names:tc:ebcore:partyid-type:iso6523:0088:123456", false, true, ALLOWED_SCHEME_PATTERN, null, null},
-        });
-    }
-
-    @Before
-    public void init() {
-        validator = new ServiceGroupValidator(configurationService, normalizer);
-    }
-
-    @Parameterized.Parameter
-    public String caseName;
-    @Parameterized.Parameter(1)
-    public String schema;
-    @Parameterized.Parameter(2)
-    public String value;
-    @Parameterized.Parameter(3)
-    public boolean expectedThrowError;
-    @Parameterized.Parameter(4)
-    public boolean mandatoryScheme;
-    @Parameterized.Parameter(5)
-    public Pattern schemePattern;
-    @Parameterized.Parameter(6)
-    public Class errorClass;
-    @Parameterized.Parameter(7)
-    public String errorMessage;
-
-
-    @Test
-    public void testServiceGroupIdentifier() {
-        normalizer.configureParticipantIdentifierFormatter(null, mandatoryScheme, schemePattern);
-
-        validateScheme(schema, value);
-    }
-
-    private void validateScheme(String scheme, String value) {
-
-        Identifier id = new Identifier(value, scheme);
-        /*
-        //ServiceGroup sg = new ServiceGroup();
-        sg.setParticipantIdentifier(id);
-
-        if (expectedThrowError) {
-            Throwable throwable = Assert.assertThrows(errorClass, () -> validator.validate(normalizer.formatParticipant(id), sg));
-            MatcherAssert.assertThat(throwable.getMessage(), CoreMatchers.containsString(errorMessage));
-        } else {
-            validator.validate(normalizer.formatParticipant(id), sg);
-        }
-
-
-    }
-  */
-
-}
diff --git a/smp-webapp/src/test/resources/cleanup-database.sql b/smp-webapp/src/test/resources/cleanup-database.sql
index db26999a5b8bb568807c9060f426983775183a46..218ac8322c6abe9dcc2bbd1b23846486d6da05dd 100755
--- a/smp-webapp/src/test/resources/cleanup-database.sql
+++ b/smp-webapp/src/test/resources/cleanup-database.sql
@@ -1,7 +1,7 @@
-DELETE FROM SMP_ALERT;
-DELETE FROM SMP_ALERT_AUD;
 DELETE FROM SMP_ALERT_PROPERTY;
 DELETE FROM SMP_ALERT_PROPERTY_AUD;
+DELETE FROM SMP_ALERT;
+DELETE FROM SMP_ALERT_AUD;
 DELETE FROM SMP_CERTIFICATE;
 DELETE FROM SMP_CERTIFICATE_AUD;
 DELETE FROM SMP_CONFIGURATION;
diff --git a/smp-webapp/src/test/resources/webapp_integration_test_data.sql b/smp-webapp/src/test/resources/webapp_integration_test_data.sql
index 850c4356bbfa629a802d799d14605f8b6cacf3fc..1688a5596e7c594510c4f16803c9a7c476f0ef35 100644
--- a/smp-webapp/src/test/resources/webapp_integration_test_data.sql
+++ b/smp-webapp/src/test/resources/webapp_integration_test_data.sql
@@ -78,28 +78,6 @@ insert into SMP_CREDENTIAL (ID, FK_USER_ID, CREDENTIAL_ACTIVE, CREDENTIAL_NAME,
 insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values
 (18, 'CN=utf-8_z_SMP,O=EC,C=BE:0000000000000666', null,null, NOW(),  NOW());
 
-
-
--- insert into SMP_USER(ID, USERNAME, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (8, 'Cert3', 'SMP_ADMIN', 1, NOW(),  NOW());
--- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (8, 'CN=utf-8_ż_SMP,O=EC,C=BE:0000000000000666', null,null, NOW(),  NOW());
-
--- insert into SMP_USER(ID, USERNAME, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (9, 'Cert4', 'SMP_ADMIN', 1, NOW(),  NOW());
--- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (9, 'CN=EHEALTH_SMP_EC,O=European Commission,C=BE:f71ee8b11cb3b787', null,null, NOW(),  NOW());
-
--- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (10, 'cert5', '',                                                             'SMP_ADMIN', 1, NOW(),  NOW());
--- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (10, 'CN=common name UPPER database SN,O=org,C=BE:000000000000BB66', null,null, NOW(),  NOW());
-
--- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (11, 'cert6', '',                                                             'SMP_ADMIN', 1, NOW(),  NOW());
--- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (11, 'CN=ncp.fi.ehealth.testa.eu,O=Kansanelakelaitos,C=FI:f71ee8b11cb3b787', null,null, NOW(),  NOW());
-
--- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (12, 'cert7', '',                                                             'SMP_ADMIN', 1, NOW(),  NOW());
--- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (12, 'CN=Internal Business CA 2,O=T-Systems International GmbH,C=DE:f71ee8b11cb3b787', null,null, NOW(),  NOW());
-
--- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (13, 'cert8', '',                                                             'SMP_ADMIN', 1, NOW(),  NOW());
--- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (13, 'CN=GRP:test_proxy_01,O=European Commission,C=BE:0000000000001234', null,null, NOW(),  NOW());
-
--- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (14, 'cert9', '',                                                             'SMP_ADMIN', 1, NOW(),  NOW());
--- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (14, 'CN=GRP:TEST_\+\,& \=eau!,O=European Commission,C=BE:0000000000001234', null,null, NOW(),  NOW());
 -- --------------
 -- Configure domains
 insert into SMP_DOMAIN (ID, VISIBILITY, DOMAIN_CODE, SML_SUBDOMAIN, SML_SMP_ID, SIGNATURE_KEY_ALIAS,SML_REGISTERED,SML_CLIENT_CERT_AUTH, CREATED_ON, LAST_UPDATED_ON) values
@@ -107,7 +85,8 @@ insert into SMP_DOMAIN (ID, VISIBILITY, DOMAIN_CODE, SML_SUBDOMAIN, SML_SMP_ID,
 (2, 'PUBLIC', 'domainTwo','newdomain', 'CEF-SMP-002','single_domain_key',0,1,NOW(),  NOW());
 
 insert into SMP_GROUP (ID, FK_DOMAIN_ID, NAME, VISIBILITY, CREATED_ON, LAST_UPDATED_ON) values
-(1, 1, 'domain group', 'PUBLIC', NOW(),  NOW());
+(1, 1, 'domain group', 'PUBLIC', NOW(),  NOW()),
+(2, 1, 'Second group', 'PUBLIC', NOW(),  NOW());
 
 -- --------------
 -- configure extension and document types service group and servicemetadata
@@ -123,6 +102,7 @@ insert into SMP_SUBRESOURCE_DEF (ID,FK_RESOURCE_DEF_ID,URL_SEGMENT, IDENTIFIER,
 insert into SMP_DOMAIN_RESOURCE_DEF (ID, FK_RESOURCE_DEF_ID, FK_DOMAIN_ID,CREATED_ON, LAST_UPDATED_ON ) values
 (1, 1, 1, NOW(),  NOW());
 
+
 -- ----------------------------------
 -- add documents
 insert into SMP_DOCUMENT (ID, CURRENT_VERSION, MIME_TYPE, NAME,CREATED_ON, LAST_UPDATED_ON) values
@@ -142,15 +122,20 @@ insert into SMP_RESOURCE ( ID, FK_GROUP_ID, FK_DOCUMENT_ID, FK_DOREDEF_ID,  IDEN
 insert into SMP_SUBRESOURCE (ID, FK_RESOURCE_ID,FK_SUREDEF_ID, FK_DOCUMENT_ID, IDENTIFIER_SCHEME, IDENTIFIER_VALUE, CREATED_ON, LAST_UPDATED_ON) values
 (-1, -1, 1, -3, 'busdox-docid-qn', 'doc_7', NOW(),  NOW());
 
+insert into SMP_DOMAIN_MEMBER (ID, FK_DOMAIN_ID, FK_USER_ID, MEMBERSHIP_ROLE, CREATED_ON, LAST_UPDATED_ON) values
+(1, 1, 3, 'ADMIN', NOW(),  NOW());
+
 insert into SMP_GROUP_MEMBER (ID, FK_GROUP_ID, FK_USER_ID, MEMBERSHIP_ROLE, CREATED_ON, LAST_UPDATED_ON) values
-(1, 1, 1, 'ADMIN', NOW(),  NOW());
+(1, 1, 1, 'ADMIN', NOW(),  NOW()),
+(2, 1, 3, 'ADMIN', NOW(),  NOW());
 -- set ownership
 insert into SMP_RESOURCE_MEMBER (ID, FK_RESOURCE_ID, FK_USER_ID, MEMBERSHIP_ROLE, CREATED_ON, LAST_UPDATED_ON) values
 (-1, -1, 1, 'ADMIN', NOW(),  NOW()),
-(-2, -2, 1, 'ADMIN', NOW(),  NOW()),
-(-3, -1, 5, 'ADMIN', NOW(),  NOW()),
-(-4, -1, 2, 'ADMIN', NOW(),  NOW()),
-(-5, -1, 6, 'ADMIN', NOW(),  NOW());
+(-2, -1, 3, 'ADMIN', NOW(),  NOW()),
+(-3, -2, 1, 'ADMIN', NOW(),  NOW()),
+(-4, -1, 5, 'ADMIN', NOW(),  NOW()),
+(-5, -1, 2, 'ADMIN', NOW(),  NOW()),
+(-6, -1, 6, 'ADMIN', NOW(),  NOW());