diff --git a/README.md b/README.md
index 8513c3f178dbf66ced6224536a3f1036ae0142fb..4d923ce3c2e1e7bfb44e7f549c9d4486544e807b 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,11 @@
 # IA2 GMS
 
-## MySQL setup
+## Database Docker image
 
-```
-create database gms;
-create user gms@localhost identified by 'gms';
-grant all privileges on gms.* to gms@localhost;
+To build the image run **from current directory**:
 
-```
+    docker build -f database/Dockerfile --tag gms-db .
+
+To start the image and use the database:
+
+    docker run -d -p 5432:5432 -i -t gms-db:latest
diff --git a/database/Dockerfile b/database/Dockerfile
index d174c9db90e9043866d664be4cac3a3bb568388d..bb94ba24410f4c8ecb08ee2d5b253402c09318a8 100644
--- a/database/Dockerfile
+++ b/database/Dockerfile
@@ -1,2 +1,3 @@
 FROM library/postgres:11
-COPY ../gms/src/main/resources/sql/init.sql /docker-entrypoint-initdb.d/ 
+COPY gms/src/main/resources/sql/init.sql /docker-entrypoint-initdb.d/
+COPY database/user.sql /docker-entrypoint-initdb.d/
diff --git a/database/user.sql b/database/user.sql
new file mode 100644
index 0000000000000000000000000000000000000000..29be85f1e1fc255097feb3051e502b5c21374fc5
--- /dev/null
+++ b/database/user.sql
@@ -0,0 +1,4 @@
+CREATE ROLE gms WITH LOGIN PASSWORD 'gms';
+GRANT USAGE ON SCHEMA public TO gms;
+GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO gms;
+GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO gms;
\ No newline at end of file
diff --git a/gms-ui/src/components/GroupsPanel.vue b/gms-ui/src/components/GroupsPanel.vue
index ad0ee16c849bb5d12d1e1fb5295f7829b3e6667b..3ddfc6a4dec53b83fef3e602b0a828f2758108f6 100644
--- a/gms-ui/src/components/GroupsPanel.vue
+++ b/gms-ui/src/components/GroupsPanel.vue
@@ -9,7 +9,7 @@
       <b-list-group v-for="group in model.groupsPanel.items">
         <b-list-group-item href="#" v-on:click="openGroup(group)">
           <span class="float-left">{{group.groupName}}</span>
-          <span v-if="group.permissions.includes('ADMIN')" class="float-right">
+          <span v-if="group.permission === 'ADMIN'" class="float-right">
             <a href="#" v-on:click.stop="openRenameGroupModal(group)" title="Rename">
               <font-awesome-icon icon="edit"></font-awesome-icon>
             </a>
diff --git a/gms-ui/src/components/Main.vue b/gms-ui/src/components/Main.vue
index f7b8791e9d04577a3bbd3694f29f16c88603151f..36a15b26068d6884bf0074068c4f0c6b03a5b897 100644
--- a/gms-ui/src/components/Main.vue
+++ b/gms-ui/src/components/Main.vue
@@ -40,10 +40,10 @@ export default {
   },
   computed: mapState({
     model: state => state.model,
-    showAddMemberBtn: state => state.model.permissions.includes('ADMIN') && state.input.selectedTab === 'members',
-    showAddCollaboratorBtn: state => state.model.permissions.includes('MANAGE_MEMBERS') && state.input.selectedTab === 'members',
-    showAddGroupBtn: state => state.model.permissions.includes('ADMIN') && state.input.selectedTab === 'groups',
-    showAddPermissionBtn: state => state.model.permissions.includes('ADMIN') && state.input.selectedTab === 'permissions'
+    showAddMemberBtn: state => state.model.permission === 'ADMIN' && state.input.selectedTab === 'members',
+    showAddCollaboratorBtn: state => state.model.permission === 'MANAGE_MEMBERS' && state.input.selectedTab === 'members',
+    showAddGroupBtn: state => state.model.permission === 'ADMIN' && state.input.selectedTab === 'groups',
+    showAddPermissionBtn: state => state.model.permission === 'ADMIN' && state.input.selectedTab === 'permissions'
   }),
   methods: {
     tabChanged: function(tabIndex) {
diff --git a/gms/pom.xml b/gms/pom.xml
index f55c143b7ce58add20fcab7adaa2fac21c205a57..184d64bf4d3f085bd43757a8e8bfdd64d9653417 100644
--- a/gms/pom.xml
+++ b/gms/pom.xml
@@ -39,7 +39,6 @@
         <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
-            <version>42.2.6</version>
             <scope>runtime</scope>
         </dependency>
         <dependency>
@@ -58,10 +57,11 @@
             <artifactId>spring-security-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <!-- Embedded PostgreSQL: -->
         <dependency>
-            <groupId>io.zonky.test</groupId>
-            <artifactId>embedded-database-spring-test</artifactId>
-            <version>1.5.0</version>
+            <groupId>com.opentable.components</groupId>
+            <artifactId>otj-pg-embedded</artifactId>
+            <version>0.13.1</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/gms/src/main/java/it/inaf/ia2/gms/persistence/GroupsDAO.java b/gms/src/main/java/it/inaf/ia2/gms/persistence/GroupsDAO.java
index 5a38bca174501d226cbb5ec84846b7ded7e02023..88f85098ffd628212f9d6db6bfee2be091c9791f 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/persistence/GroupsDAO.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/persistence/GroupsDAO.java
@@ -132,6 +132,10 @@ public class GroupsDAO {
 
     public Map<String, Boolean> getHasChildrenMap(Set<String> groupIds) {
 
+        if (groupIds.isEmpty()) {
+            return new HashMap<>();
+        }
+
         String sql = "SELECT g.id, COUNT(s.*) > 0 AS has_children \n"
                 + "FROM gms_group g\n"
                 + "LEFT JOIN gms_group s ON s.path <@ g.path AND s.path <> g.path\n"
diff --git a/gms/src/main/java/it/inaf/ia2/gms/service/GroupsService.java b/gms/src/main/java/it/inaf/ia2/gms/service/GroupsService.java
index 15ad515678f6652f74b53e135511d5571aeabe41..e37a4b6427674cc744314ad6e21c8891727d93de 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/service/GroupsService.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/service/GroupsService.java
@@ -10,7 +10,6 @@ import it.inaf.ia2.gms.persistence.GroupsDAO;
 import it.inaf.ia2.gms.persistence.model.GroupEntity;
 import java.util.List;
 import java.util.UUID;
-import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class GroupsService {
@@ -38,7 +37,6 @@ public class GroupsService {
         }
     }
 
-    @Transactional
     public GroupEntity addGroup(String parentId, String groupName, String userId) {
 
         GroupEntity parent = getGroupById(parentId);
@@ -52,7 +50,7 @@ public class GroupsService {
             throw new BadRequestException("There is already a group named " + groupName);
         }
 
-        String newGroupId = UUID.randomUUID().toString();
+        String newGroupId = UUID.randomUUID().toString().replaceAll("-", "");
 
         String path = parent.getPath();
         if (!path.isEmpty()) {
diff --git a/gms/src/main/java/it/inaf/ia2/gms/service/PermissionUtils.java b/gms/src/main/java/it/inaf/ia2/gms/service/PermissionUtils.java
index a4d877abfea8f216503862a9b02c1b3877b44e4c..ffb58173b8236163c2e890f3c6f05e5fc7f95477 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/service/PermissionUtils.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/service/PermissionUtils.java
@@ -18,15 +18,12 @@ public class PermissionUtils {
             boolean permissionInChildGroup = permission.getGroupPath().startsWith(group.getPath());
             boolean permissionInParentGroup = group.getPath().startsWith(permission.getGroupPath());
 
-            if (directPermission || permissionInChildGroup || permissionInParentGroup) {
-
-                if (permissionInChildGroup) {
-                    // Traversal only
-                    groupPermission = Permission.addPermission(groupPermission, Permission.TRAVERSE);
-                } else {
-                    // Direct permission or permission inherited from parent
-                    groupPermission = Permission.addPermission(groupPermission, permission.getPermission());
-                }
+            if (directPermission || permissionInParentGroup) {
+                // Direct permission or permission inherited from parent
+                groupPermission = Permission.addPermission(groupPermission, permission.getPermission());
+            } else if (permissionInChildGroup) {
+                // Traversal only
+                groupPermission = Permission.addPermission(groupPermission, Permission.TRAVERSE);
             }
 
             if (groupPermission == Permission.ADMIN) {
diff --git a/gms/src/main/resources/application.properties b/gms/src/main/resources/application.properties
index c92e337f53978e2ee80a674e1e4a0a1a84cba475..94200da73eda4b6759c19f6a73062489b9bd584c 100644
--- a/gms/src/main/resources/application.properties
+++ b/gms/src/main/resources/application.properties
@@ -11,12 +11,9 @@ security.oauth2.resource.jwk.key-set-uri=http://localhost/rap-ia2/auth/oidc/jwks
 logging.level.org.springframework.security=DEBUG
 logging.level.org.springframework.jdbc=TRACE
 
-spring.jpa.hibernate.ddl-auto=update
-spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect
-spring.datasource.url=jdbc:mysql://localhost:3306/gms?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
+spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
 spring.datasource.username=gms
 spring.datasource.password=gms
-#spring.jpa.open-in-view=false
 
 rap.ws-url=http://localhost/rap-ia2/ws
 
diff --git a/gms/src/test/java/it/inaf/ia2/gms/DataSourceConfig.java b/gms/src/test/java/it/inaf/ia2/gms/DataSourceConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..8fb202b01fc14d6c7ec232a9fab5726db95bd908
--- /dev/null
+++ b/gms/src/test/java/it/inaf/ia2/gms/DataSourceConfig.java
@@ -0,0 +1,37 @@
+package it.inaf.ia2.gms;
+
+import com.opentable.db.postgres.embedded.EmbeddedPostgres;
+import java.sql.Connection;
+import javax.sql.DataSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Scope;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.jdbc.datasource.init.ScriptUtils;
+
+@Configuration
+public class DataSourceConfig {
+
+    /**
+     * Using the prototype scope we are generating a different database in each
+     * test.
+     */
+    @Bean
+    @Scope("prototype")
+    @Primary
+    public DataSource dataSource() throws Exception {
+        DataSource embeddedPostgresDS = EmbeddedPostgres.builder()
+                .start().getPostgresDatabase();
+
+        initDatabase(embeddedPostgresDS);
+
+        return embeddedPostgresDS;
+    }
+
+    private void initDatabase(DataSource dataSource) throws Exception {
+        try (Connection conn = dataSource.getConnection()) {
+            ScriptUtils.executeSqlScript(conn, new ClassPathResource("/sql/init.sql"));
+        }
+    }
+}
diff --git a/gms/src/test/java/it/inaf/ia2/gms/GmsApplicationTests.java b/gms/src/test/java/it/inaf/ia2/gms/GmsApplicationTests.java
deleted file mode 100644
index a0242fa37561d4e3d141232031904b357a4b10c6..0000000000000000000000000000000000000000
--- a/gms/src/test/java/it/inaf/ia2/gms/GmsApplicationTests.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package it.inaf.ia2.gms;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class GmsApplicationTests {
-
-    @Test
-    public void contextLoads() {
-    }
-}
diff --git a/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsControllerTest.java b/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsControllerTest.java
index 8a1ac938dfc95076607203e63b6dc212725e1a82..5ab680e13b6202b93a58288f3587fcc24b30624d 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsControllerTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/controller/GroupsControllerTest.java
@@ -49,7 +49,7 @@ public class GroupsControllerTest {
         when(groupsModelService.getGroupsModel(any(), any()))
                 .thenReturn(response);
 
-        mockMvc.perform(get("/groups?groupId=ROOT&tab=groups&paginatorPageSize=20&paginatorPage=1"))
+        mockMvc.perform(get("/groups?groupId=ROOT&tab=groups&paginatorPageSize=20&paginatorPage=1&page=main"))
                 .andExpect(status().isOk());
 
         ArgumentCaptor<GroupsModelRequest> requestCaptor = ArgumentCaptor.forClass(GroupsModelRequest.class);
diff --git a/gms/src/test/java/it/inaf/ia2/gms/model/PermissionTest.java b/gms/src/test/java/it/inaf/ia2/gms/model/PermissionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..136befaeb425607bde60075f06ddb551fe646133
--- /dev/null
+++ b/gms/src/test/java/it/inaf/ia2/gms/model/PermissionTest.java
@@ -0,0 +1,40 @@
+package it.inaf.ia2.gms.model;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class PermissionTest {
+
+    @Test
+    public void addPermissionTest() {
+
+        // Old = null
+        assertEquals(Permission.ADMIN, Permission.addPermission(null, Permission.ADMIN));
+        assertEquals(Permission.MANAGE_MEMBERS, Permission.addPermission(null, Permission.MANAGE_MEMBERS));
+        assertEquals(Permission.VIEW_MEMBERS, Permission.addPermission(null, Permission.VIEW_MEMBERS));
+        assertEquals(Permission.TRAVERSE, Permission.addPermission(null, Permission.TRAVERSE));
+
+        // Old = ADMIN -> never change
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.ADMIN, Permission.VIEW_MEMBERS));
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.ADMIN, Permission.MANAGE_MEMBERS));
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.ADMIN, Permission.TRAVERSE));
+
+        // Old = MANAGE_MEMBERS
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.MANAGE_MEMBERS, Permission.ADMIN));
+        assertEquals(Permission.MANAGE_MEMBERS, Permission.addPermission(Permission.MANAGE_MEMBERS, Permission.VIEW_MEMBERS));
+        assertEquals(Permission.MANAGE_MEMBERS, Permission.addPermission(Permission.MANAGE_MEMBERS, Permission.TRAVERSE));
+
+        // Old = VIEW_MEMBERS
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.VIEW_MEMBERS, Permission.ADMIN));
+        assertEquals(Permission.MANAGE_MEMBERS, Permission.addPermission(Permission.VIEW_MEMBERS, Permission.MANAGE_MEMBERS));
+        assertEquals(Permission.VIEW_MEMBERS, Permission.addPermission(Permission.VIEW_MEMBERS, Permission.TRAVERSE));
+
+        // Old = TRAVERSE
+        assertEquals(Permission.ADMIN, Permission.addPermission(Permission.TRAVERSE, Permission.ADMIN));
+        assertEquals(Permission.MANAGE_MEMBERS, Permission.addPermission(Permission.TRAVERSE, Permission.MANAGE_MEMBERS));
+        assertEquals(Permission.VIEW_MEMBERS, Permission.addPermission(Permission.TRAVERSE, Permission.VIEW_MEMBERS));
+    }
+}
diff --git a/gms/src/test/java/it/inaf/ia2/gms/persistence/GroupsDAOTest.java b/gms/src/test/java/it/inaf/ia2/gms/persistence/GroupsDAOTest.java
index 643cef67672d291bb775580a44ad96002150de5c..9d5ad1aa45da89c863eca21885e10d3d24b922d4 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/persistence/GroupsDAOTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/persistence/GroupsDAOTest.java
@@ -1,7 +1,6 @@
 package it.inaf.ia2.gms.persistence;
 
-import com.google.common.collect.ImmutableSet;
-import io.zonky.test.db.AutoConfigureEmbeddedDatabase;
+import it.inaf.ia2.gms.DataSourceConfig;
 import it.inaf.ia2.gms.model.GroupBreadcrumb;
 import it.inaf.ia2.gms.persistence.model.GroupEntity;
 import java.util.List;
@@ -15,12 +14,13 @@ import static org.junit.Assert.assertTrue;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.internal.util.collections.Sets;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
-@AutoConfigureEmbeddedDatabase(beanName = "dataSource")
+@ContextConfiguration(classes = DataSourceConfig.class)
 public class GroupsDAOTest {
 
     @Autowired
@@ -34,7 +34,7 @@ public class GroupsDAOTest {
     }
 
     @Test
-    @Sql("/sql/init.sql")
+    //@Sql("/sql/init.sql")
     public void testAll() {
 
         // Create groups
@@ -89,11 +89,11 @@ public class GroupsDAOTest {
         assertEquals("INAF", groups.get(0).getName());
 
         // Children map
-        Map<String, Boolean> childrenMap = dao.getHasChildrenMap(ImmutableSet.of(root.getId()));
+        Map<String, Boolean> childrenMap = dao.getHasChildrenMap(Sets.newSet(root.getId()));
         assertEquals(1, childrenMap.size());
         assertTrue(childrenMap.get(root.getId()));
 
-        childrenMap = dao.getHasChildrenMap(ImmutableSet.of(lbt.getId(), tng.getId()));
+        childrenMap = dao.getHasChildrenMap(Sets.newSet(lbt.getId(), tng.getId()));
         assertEquals(2, childrenMap.size());
         assertTrue(childrenMap.get(lbt.getId()));
         assertFalse(childrenMap.get(tng.getId()));
diff --git a/gms/src/test/java/it/inaf/ia2/gms/persistence/NestedGroupsIntegrationTest.java b/gms/src/test/java/it/inaf/ia2/gms/persistence/NestedGroupsIntegrationTest.java
index 2c546b004db478db6d0e2fbfa3b689e43c106838..398cd3d97aeda2fc2dbdb3bf5d9aee3872ecb1a9 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/persistence/NestedGroupsIntegrationTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/persistence/NestedGroupsIntegrationTest.java
@@ -1,38 +1,43 @@
 package it.inaf.ia2.gms.persistence;
 
-import io.zonky.test.db.AutoConfigureEmbeddedDatabase;
+import it.inaf.ia2.gms.DataSourceConfig;
 import it.inaf.ia2.gms.service.GroupsService;
 import it.inaf.ia2.gms.model.GroupNode;
 import it.inaf.ia2.gms.model.PaginatedModelRequest;
 import it.inaf.ia2.gms.model.Permission;
 import it.inaf.ia2.gms.persistence.model.GroupEntity;
 import it.inaf.ia2.gms.persistence.model.PermissionEntity;
+import it.inaf.ia2.gms.rap.RapClient;
 import it.inaf.ia2.gms.service.GroupsTreeBuilder;
+import it.inaf.ia2.gms.service.PermissionsService;
 import java.util.List;
+import javax.sql.DataSource;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import static org.mockito.Mockito.mock;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
-@AutoConfigureEmbeddedDatabase(beanName = "dataSource")
+@ContextConfiguration(classes = DataSourceConfig.class)
 public class NestedGroupsIntegrationTest {
 
     @Autowired
-    private PermissionsDAO permissionsDAO;
-
-    @Autowired
-    private GroupsService groupsService;
-
-    @Autowired
-    private GroupsTreeBuilder groupsTreeBuilder;
+    private DataSource dataSource;
 
     @Test
     public void testNestedGroupRetrieval() {
 
+        GroupsDAO groupsDAO = new GroupsDAO(dataSource);
+        PermissionsDAO permissionsDAO = new PermissionsDAO(dataSource);
+        PermissionsService permissionsService = new PermissionsService(permissionsDAO, mock(RapClient.class));
+        GroupsService groupsService = new GroupsService(groupsDAO, permissionsService);
+        GroupsTreeBuilder groupsTreeBuilder = new GroupsTreeBuilder(groupsDAO, permissionsDAO);
+
         String userId = "USER_ID";
 
         // Test super admin
@@ -100,14 +105,23 @@ public class NestedGroupsIntegrationTest {
         p1Permission.setUserId(userId);
         p1Permission.setGroupId(lbtInafProgram1.getId());
         p1Permission.setPermission(Permission.MANAGE_MEMBERS);
+        p1Permission.setGroupPath(lbtInafProgram1.getPath());
         permissionsDAO.createPermission(p1Permission);
 
         PermissionEntity lbtPermission = new PermissionEntity();
         lbtPermission.setUserId(userId);
         lbtPermission.setGroupId(lbtInaf.getId());
         lbtPermission.setPermission(Permission.VIEW_MEMBERS);
+        lbtPermission.setGroupPath(lbtInaf.getPath());
         permissionsDAO.createPermission(lbtPermission);
 
+        PermissionEntity radioPermission = new PermissionEntity();
+        radioPermission.setUserId(userId);
+        radioPermission.setGroupId(radio.getId());
+        radioPermission.setPermission(Permission.VIEW_MEMBERS);
+        radioPermission.setGroupPath(radio.getPath());
+        permissionsDAO.createPermission(radioPermission);
+
         // Check level 0 (ROOT)
         groupNodes = groupsTreeBuilder.listSubGroups(root.getId(), userId, request).getItems();
         assertEquals(2, groupNodes.size());
@@ -117,7 +131,7 @@ public class NestedGroupsIntegrationTest {
         assertTrue(lbtGN.isHasChildren());
         radioGN = groupNodes.get(1);
         assertEquals("Radio", radioGN.getGroupName());
-        assertEquals(Permission.TRAVERSE, radioGN.getPermission());
+        assertEquals(Permission.VIEW_MEMBERS, radioGN.getPermission());
         assertFalse(radioGN.isHasChildren());
 
         // Check level 1
diff --git a/gms/src/test/java/it/inaf/ia2/gms/persistence/PermissionsDAOTest.java b/gms/src/test/java/it/inaf/ia2/gms/persistence/PermissionsDAOTest.java
index e2bb67d9b5e05570efd0e58de4f92514abd969e7..6f411d818821c55396fa458448552a801bc3b3e2 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/persistence/PermissionsDAOTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/persistence/PermissionsDAOTest.java
@@ -1,6 +1,6 @@
 package it.inaf.ia2.gms.persistence;
 
-import io.zonky.test.db.AutoConfigureEmbeddedDatabase;
+import it.inaf.ia2.gms.DataSourceConfig;
 import it.inaf.ia2.gms.model.Permission;
 import it.inaf.ia2.gms.persistence.model.PermissionEntity;
 import it.inaf.ia2.gms.persistence.model.GroupEntity;
@@ -12,11 +12,11 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
-@AutoConfigureEmbeddedDatabase(beanName = "dataSource")
+@ContextConfiguration(classes = DataSourceConfig.class)
 public class PermissionsDAOTest {
 
     @Autowired
@@ -32,7 +32,6 @@ public class PermissionsDAOTest {
     }
 
     @Test
-    @Sql("/sql/init.sql")
     public void testAll() {
 
         GroupEntity root = new GroupEntity();
diff --git a/gms/src/test/java/it/inaf/ia2/gms/service/PermissionUtilsTest.java b/gms/src/test/java/it/inaf/ia2/gms/service/PermissionUtilsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a6d0f39570321ea215ec29dedd352aad8dc4d9a
--- /dev/null
+++ b/gms/src/test/java/it/inaf/ia2/gms/service/PermissionUtilsTest.java
@@ -0,0 +1,69 @@
+package it.inaf.ia2.gms.service;
+
+import it.inaf.ia2.gms.model.Permission;
+import it.inaf.ia2.gms.persistence.model.GroupEntity;
+import it.inaf.ia2.gms.persistence.model.PermissionEntity;
+import java.util.Collections;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class PermissionUtilsTest {
+
+    @Test
+    public void testDirectPermission() {
+
+        GroupEntity group = new GroupEntity();
+        group.setId("id");
+        group.setName("name");
+        group.setPath("path");
+
+        PermissionEntity permission = new PermissionEntity();
+        permission.setGroupId("id");
+        permission.setGroupPath("path");
+        permission.setPermission(Permission.MANAGE_MEMBERS);
+
+        List<PermissionEntity> permissions = Collections.singletonList(permission);
+
+        assertEquals(Permission.MANAGE_MEMBERS, PermissionUtils.getGroupPermission(group, permissions).get());
+    }
+
+    @Test
+    public void testPermissionInheritedFromParent() {
+
+        GroupEntity group = new GroupEntity();
+        group.setId("id_LBT_INAF");
+        group.setName("INAF");
+        group.setPath("LBT:INAF");
+
+        PermissionEntity permission = new PermissionEntity();
+        permission.setGroupId("id_LBT");
+        permission.setGroupPath("LBT");
+        permission.setPermission(Permission.ADMIN);
+
+        List<PermissionEntity> permissions = Collections.singletonList(permission);
+
+        assertEquals(Permission.ADMIN, PermissionUtils.getGroupPermission(group, permissions).get());
+    }
+
+    @Test
+    public void testTraversalIfPermissionInChild() {
+
+        GroupEntity group = new GroupEntity();
+        group.setId("id_LBT");
+        group.setName("name");
+        group.setPath("LBT");
+
+        PermissionEntity permission = new PermissionEntity();
+        permission.setGroupId("id_LBT_INAF_P1");
+        permission.setGroupPath("LBT:INAF:P1");
+        permission.setPermission(Permission.VIEW_MEMBERS);
+
+        List<PermissionEntity> permissions = Collections.singletonList(permission);
+
+        assertEquals(Permission.TRAVERSE, PermissionUtils.getGroupPermission(group, permissions).get());
+    }
+}
diff --git a/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceIntegrationTest.java b/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceIntegrationTest.java
index 1273d72a251d656eaa5ede726b297a1fa39d32a4..fc04b4e3a282ad9b15f514dce6bbb730f8d60ad2 100644
--- a/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceIntegrationTest.java
+++ b/gms/src/test/java/it/inaf/ia2/gms/service/PermissionsServiceIntegrationTest.java
@@ -1,6 +1,6 @@
 package it.inaf.ia2.gms.service;
 
-import io.zonky.test.db.AutoConfigureEmbeddedDatabase;
+import it.inaf.ia2.gms.DataSourceConfig;
 import it.inaf.ia2.gms.model.Permission;
 import it.inaf.ia2.gms.model.RapUser;
 import it.inaf.ia2.gms.model.UserPermission;
@@ -11,6 +11,7 @@ import it.inaf.ia2.gms.persistence.model.PermissionEntity;
 import it.inaf.ia2.gms.rap.RapClient;
 import java.util.Collections;
 import java.util.List;
+import javax.sql.DataSource;
 import static org.junit.Assert.assertEquals;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -18,26 +19,27 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
-@AutoConfigureEmbeddedDatabase(beanName = "dataSource")
+@ContextConfiguration(classes = DataSourceConfig.class)
 public class PermissionsServiceIntegrationTest {
 
     private static final String USER_ID = "USER_ID";
 
-    @Autowired
-    private GroupsDAO groupsDAO;
-
-    @Autowired
-    private PermissionsDAO permissionsDAO;
-
     @MockBean
     private RapClient rapClient;
 
+    @Autowired
+    private DataSource dataSource;
+
     @Test
     public void permissionsRetrievalTest() {
 
+        GroupsDAO groupsDAO = new GroupsDAO(dataSource);
+        PermissionsDAO permissionsDAO = new PermissionsDAO(dataSource);
+
         // Mock RAP client
         RapUser rapUser = new RapUser();
         rapUser.setId(USER_ID);