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/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/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/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-webapp/pom.xml b/smp-webapp/pom.xml
index d6446e72deae32f068133e6bad87a97d75856b42..8aa32d9aa4a3505b5ec7e41407012def98072ded 100644
--- a/smp-webapp/pom.xml
+++ b/smp-webapp/pom.xml
@@ -167,9 +167,28 @@
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
                     <runOrder>alphabetical</runOrder>
+                    <excludes>
+                        <exclude>**/*IntegrationTest.java</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>integration-test</goal>
+                            <goal>verify</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <includes>
+                        <include>**/*IntegrationTest.java</include>
+                    </includes>
                 </configuration>
-
             </plugin>
+
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-assembly-plugin</artifactId>
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 ba656f46869f82eb8116cfda0baed4039bee4e04..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
@@ -8,7 +8,6 @@ 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.junit.jupiter.api.Assertions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpHeaders;
@@ -30,7 +29,6 @@ import java.util.List;
 
 import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@@ -44,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";
@@ -61,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);
     }
@@ -120,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;
     }
@@ -166,7 +166,7 @@ public class MockMvcUtils {
                 .andExpect(status().isOk()).andReturn();
 
         //then
-        return  getArrayFromResponse(result, GroupRO.class);
+        return getArrayFromResponse(result, GroupRO.class);
     }
 
     public static List<SearchUserRO> geUsersByUsernameFilter(MockMvc mvc, MockHttpSession session, UserRO userRO, String username) throws Exception {
@@ -180,8 +180,6 @@ public class MockMvcUtils {
     }
 
 
-
-
     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
index 6665f2a660bef81f544376badb4c261ffccb3b8d..61e5a91953b4d11e42fcd9205af9b7aa62e3a754 100644
--- 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
@@ -23,4 +23,13 @@ public class TestROUtils {
     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 9a4a27a846e8c7399dcb780829072115e219aba6..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,22 +3,39 @@ 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.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.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;
 
 @ExtendWith(SpringExtension.class)
 @WebAppConfiguration
@@ -43,6 +60,11 @@ abstract public class AbstractControllerTest {
         configurationDao.reloadPropertiesFromDatabase();
     }
 
+    /**
+     * Helper method for getting the ObjectMapper.
+     *
+     * @return ObjectMapper
+     */
     public ObjectMapper getObjectMapper() {
         if (mapper == null) {
             mapper = new ObjectMapper();
@@ -50,4 +72,154 @@ abstract public class AbstractControllerTest {
         }
         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/edit/DocumentEditControllerIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DocumentEditControllerIntegrationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..292face0b48e4d5ee2570f0acff076d85ae4b39e
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DocumentEditControllerIntegrationTest.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 DocumentEditControllerIntegrationTest 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/DomainEditControllerIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerIntegrationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..878d899234502ed9fc26b052fed18ff2b5fbf64f
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerIntegrationTest.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 DomainEditControllerIntegrationTest 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
index 13a87b6b24de520bbf1b50e02da8336af9d920af..6e63dcd6c38c65b47ed30aa3f4ba2c7f9a2091b1 100644
--- 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
@@ -45,7 +45,7 @@ public class DomainEditControllerTest extends AbstractControllerTest {
             "'', 1",
             "domain-admin, 1",
             "group-admin, 1",
-            "resource-admin, 0",
+            "resource-admin, 1",
     })
     public void testGetDomains(String roleType, int values) throws Exception {
         // given when
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIntegrationTest.java
index 78f2a720edb20e990656352355aa75d2bf91b596..6fc5705dfd1475e41893fa50ee2c3a28741ef5e5 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIntegrationTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIntegrationTest.java
@@ -46,7 +46,7 @@ public class GroupEditControllerIntegrationTest extends AbstractControllerTest {
             ", 2",
             "'', 2",
             "group-admin, 1",
-            "resource-admin, 0",
+            "resource-admin, 1",
             "group-viewer, 0",
             "all-roles, 1"
     })
@@ -253,36 +253,4 @@ public class GroupEditControllerIntegrationTest extends AbstractControllerTest {
         assertEquals(member.getRoleType(), response.getRoleType());
     }
 
-
-    public GroupRO addGroupToDomain(MockHttpSession session, DomainRO domainRO, UserRO domainAdminUser) throws Exception {
-
-
-        GroupRO groupRO = TestROUtils.createGroup();
-        MvcResult addGroupResult = mvc.perform(put(PATH + '/' + 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 MemberRO addGroupMember(MockHttpSession session, DomainRO domainRO, GroupRO groupRO, 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_GROUP_MEMBER_PUT, domainAdminUser.getUserId(), domainRO.getDomainId(), groupRO.getGroupId())
-                        .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/ResourceEditControllerIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditControllerIntegrationTest.java
index 173d42883c9812cc5ec0634bce3ed8f02c45b558..1cf6a766ebd088e0783545fdc9088686b59e6f5f 100644
--- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditControllerIntegrationTest.java
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditControllerIntegrationTest.java
@@ -1,12 +1,9 @@
 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.services.ui.UIResourceSearchService;
 import eu.europa.ec.edelivery.smp.services.ui.filters.ResourceFilter;
-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;
@@ -20,7 +17,6 @@ import org.springframework.test.web.servlet.MvcResult;
 import java.io.IOException;
 import java.util.List;
 import java.util.UUID;
-import java.util.stream.Collectors;
 
 import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*;
 import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*;
@@ -44,11 +40,12 @@ public class ResourceEditControllerIntegrationTest extends AbstractControllerTes
         super.setup();
     }
 
+    // test must match the webapp_integration_test_data.sql file!
     @ParameterizedTest
     @CsvSource({
             ",'', 2",
             ",'group-admin', 2",
-            ",'resource-admin', 0",
+            ",'resource-admin', 1",
             "'','', 2",
             "ehealth-actorid-qns,'', 2", // filter by group match
             "'No match at all','', 0",
@@ -131,16 +128,16 @@ public class ResourceEditControllerIntegrationTest extends AbstractControllerTes
         int initialSize = getResourceCount();
 
         // when
-        MvcResult result = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_DELETE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(),addedResource.getResourceId())
+        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();
+                .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());
+        assertEquals(initialSize - 1, getResourceCount());
     }
 
     @Test
@@ -172,7 +169,6 @@ public class ResourceEditControllerIntegrationTest extends AbstractControllerTes
         assertEquals(addedResource.getIdentifierScheme(), response.getIdentifierScheme());
     }
 
-
     @Test
     public void testGetGroupMembers() throws Exception {
         // given
@@ -216,14 +212,14 @@ public class ResourceEditControllerIntegrationTest extends AbstractControllerTes
         ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO);
 
         //when
-        MemberRO response = addResourceMember(session, domainRO, groupRO,addedResource, userRO, SG_USER_USERNAME);
+        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 {
+    public void testDeleteGroupMember() throws Exception {
         // given
         MockHttpSession session = loginWithSystemAdmin(mvc);
         UserRO userRO = getLoggedUserData(mvc, session);
@@ -277,46 +273,7 @@ public class ResourceEditControllerIntegrationTest extends AbstractControllerTes
     }
 
 
-    public MemberRO addResourceMember(MockHttpSession session, DomainRO domainRO, GroupRO groupRO, ResourceRO resourceRO,  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_RESOURCE_MEMBER_PUT,
-                        domainAdminUser.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), resourceRO.getResourceId())
-                        .session(session)
-                        .with(csrf())
-                        .contentType(MediaType.APPLICATION_JSON)
-                        .content(getObjectMapper().writeValueAsBytes(memberToAdd)))
-                .andExpect(status().isOk()).andReturn();
-
-        //then
-        return getObjectFromResponse(result, MemberRO.class);
-    }
-
-
-    public ResourceRO addResourceToGroup(MockHttpSession session, DomainRO domainRO, GroupRO groupRO,  UserRO domainAdminUser) throws Exception {
-
-        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);
-
-        MvcResult result = mvc.perform(put(PATH + '/' + 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);
-    }
-
-    public int getResourceCount(){
-        return uiResourceSearchService.getTableList(-1,-1, null, null, new ResourceFilter()).getCount().intValue();
+    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/SearchResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIntegrationTest.java
index 5aaace5de71d01ab9a36b783251fa231cf7f30eb..07ac51282f24e41c87817f23052ad15e7072cd7e 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/SearchResourceIntegrationTest.java
@@ -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/resources/webapp_integration_test_data.sql b/smp-webapp/src/test/resources/webapp_integration_test_data.sql
index 31e8184860547149971085282df6711d7f7b747e..1688a5596e7c594510c4f16803c9a7c476f0ef35 100644
--- a/smp-webapp/src/test/resources/webapp_integration_test_data.sql
+++ b/smp-webapp/src/test/resources/webapp_integration_test_data.sql
@@ -131,10 +131,11 @@ insert into SMP_GROUP_MEMBER (ID, FK_GROUP_ID, FK_USER_ID, MEMBERSHIP_ROLE, CREA
 -- 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());