Index: src/main/java/com/db/finki/www/build_board/controller/channel/ChannelController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/channel/ChannelController.java	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/java/com/db/finki/www/build_board/controller/channel/ChannelController.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -69,4 +69,5 @@
                 project.getId()
         )){
+            System.out.println("vleze deny access");
             model.addAttribute("error","You dont have permission to access this channel");
             return "redirect:/projects/" + project.getId();
Index: src/main/java/com/db/finki/www/build_board/controller/thread_controller/ProjectController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/thread_controller/ProjectController.java	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/java/com/db/finki/www/build_board/controller/thread_controller/ProjectController.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -4,11 +4,14 @@
 import com.db.finki.www.build_board.dto.AddRoleDTO;
 import com.db.finki.www.build_board.dto.DeveloperWithRolesForProjectDTO;
-import com.db.finki.www.build_board.entity.access_managment.Permission;
 import com.db.finki.www.build_board.entity.access_managment.ProjectResource;
+import com.db.finki.www.build_board.entity.access_managment.ProjectRole;
 import com.db.finki.www.build_board.entity.access_managment.ProjectRolePermission;
 import com.db.finki.www.build_board.entity.access_managment.ProjectRolePermissionResourceOverride;
 import com.db.finki.www.build_board.entity.channel.Channel;
+import com.db.finki.www.build_board.entity.compositeId.ProjectRoleId;
 import com.db.finki.www.build_board.entity.thread.Project;
 import com.db.finki.www.build_board.entity.user_type.BBUser;
+import com.db.finki.www.build_board.entity.view.RoleChannelPermissions;
+import com.db.finki.www.build_board.repository.access_managment.ProjectRoleRepository;
 import com.db.finki.www.build_board.service.access_managment.AddRoleDTOEntitiesMapper;
 import com.db.finki.www.build_board.service.access_managment.ProjectAccessManagementService;
@@ -42,6 +45,7 @@
     private final BBUserDetailsService userDetailsService;
     private final ChannelService channelService;
-
-    public ProjectController(ProjectService projectService, TagServiceImpl topicService, ProjectAccessManagementService projectAccessManagementService, AddRoleDTOEntitiesMapper mapper, BBUserDetailsService userDetailsService, ChannelService channelService) {
+    private final ProjectRoleRepository projectRoleRepository;
+
+    public ProjectController(ProjectService projectService, TagServiceImpl topicService, ProjectAccessManagementService projectAccessManagementService, AddRoleDTOEntitiesMapper mapper, BBUserDetailsService userDetailsService, ChannelService channelService, ProjectRoleRepository projectRoleRepository) {
         this.projectService = projectService;
         this.tagService = topicService;
@@ -50,4 +54,5 @@
         this.userDetailsService = userDetailsService;
         this.channelService = channelService;
+        this.projectRoleRepository = projectRoleRepository;
     }
 
@@ -120,62 +125,21 @@
     @GetMapping("{title}/roles/{roleName}/edit")
     public String getEditRolePage(@PathVariable(name = "title") Project project, @PathVariable(name = "roleName") String roleName, Model model) {
+        ProjectRole projectRole = projectRoleRepository.findById(new ProjectRoleId(roleName,project)).orElseThrow(() -> new IllegalArgumentException("bad project id or role name"));
         List<ProjectRolePermission> projectRolePermissions = projectAccessManagementService.getRolePermissionsForRole(roleName,project);
-        List<ProjectRolePermissionResourceOverride> projectRolePermissionResourceOverrides = projectAccessManagementService.getResourceOverridesForRole(roleName, project);
+        List<RoleChannelPermissions> roleChannelPermissions = channelService.getRoleChannelPermissions(roleName,project.getId());
         List<Channel> channels = channelService.getAllChannelsForProject(project);
-        List<String> perResourcePermissionNames = List.of("READ",
-                "WRITE");
-
-         ProjectResourcePermissionOverrideType overrideType = projectRolePermissions
-                 .stream()
-                 .filter(p -> p.getPermission().getName().equals("READ") || p.getPermission().getName().equals("WRITE"))
-                 .findFirst().map(ProjectRolePermission::getOverrideType).orElseThrow(() -> new IllegalStateException("krcna"));
-        Map<ProjectResource,Channel> resourceToChannelMap = channels.stream().collect(Collectors.toMap(Channel::getProjectResource, Function.identity()));
-
-        Set<ProjectResource> resourceOverrides = projectRolePermissionResourceOverrides.stream()
-                .map(ProjectRolePermissionResourceOverride::getProjectResource)
-                .collect(Collectors.toSet());
-
-        Set<ProjectResource> channelProjectResources = resourceToChannelMap.keySet();
-
-        Map<String, Set<ProjectResource>> init = new HashMap<>();
-        init.put("READ", new HashSet<>());
-        init.put("WRITE", new HashSet<>());
-
-        projectRolePermissionResourceOverrides.stream()
-                .filter(pr -> pr.getProjectRolePermission()
-                        .getPermission().getName().equals("READ") || pr.getProjectRolePermission().getPermission().getName().equals("WRITE"))
-                .forEach(p -> init.get(p.getProjectRolePermission().getPermission().getName()).add(p.getProjectResource()));
-
-        Map<String, Set<ProjectResource>> selectedChannels = init.entrySet()
-                .stream().map(entry -> {
-                    if (overrideType == ProjectResourcePermissionOverrideType.INCLUDE) {
-                        entry.getValue().retainAll(channelProjectResources);
-                        return Map.entry(entry.getKey(), entry.getValue());
-                    } else {
-                        Set<ProjectResource> tmp = new HashSet<>(channelProjectResources);
-                        tmp.removeAll(resourceOverrides);
-                        return Map.entry(entry.getKey(), tmp);
-                    }
-                }).collect(Collectors.toMap(
-                        Map.Entry::getKey,
-                        Map.Entry::getValue
-                ));
+        List<String> selectedGlobalPermissions = projectRolePermissions
+                .stream()
+                .filter(p -> p.getPermission().getName().equals("CREATE") || p.getPermission().getName().equals("DELETE")).map(s -> s.getPermission().getName()).toList();
 
 
         model.addAttribute("roleName",roleName);
-        model.addAttribute("overrideType",projectRolePermissions.get(0).getOverrideType().name());
+        model.addAttribute("overrideType",projectRole.getOverrideType().toString());
         model.addAttribute("project",project);
-        model.addAttribute("globalPermissions",
-                List.of("CREATE",
-                        "DELETE"));
-        model.addAttribute("perResourcePermissions",
-                List.of("READ",
-                        "WRITE"));
-        model.addAttribute("selectedGlobalPermissions",projectRolePermissions
-                .stream()
-                .filter(p -> p.getPermission().getName().equals("CREATE") || p.getPermission().getName().equals("DELETE")).collect(Collectors.toSet()));
+        model.addAttribute("globalPermissions", List.of("CREATE", "DELETE"));
+        model.addAttribute("perResourcePermissions", List.of("READ", "WRITE"));
+        model.addAttribute("selectedGlobalPermissions",selectedGlobalPermissions);
+        model.addAttribute("roleChannelPermissions",roleChannelPermissions);
         model.addAttribute("channels",channels);
-        model.addAttribute("selectedChannels",selectedChannels);
-
         return "project_pages/edit-role";
 
Index: src/main/java/com/db/finki/www/build_board/entity/access_managment/ProjectRole.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/access_managment/ProjectRole.java	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/java/com/db/finki/www/build_board/entity/access_managment/ProjectRole.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -1,4 +1,5 @@
 package com.db.finki.www.build_board.entity.access_managment;
 
+import com.db.finki.www.build_board.common.enums.ProjectResourcePermissionOverrideType;
 import com.db.finki.www.build_board.entity.compositeId.ProjectRoleId;
 import com.db.finki.www.build_board.entity.thread.Project;
@@ -16,4 +17,10 @@
     @EmbeddedId
     private ProjectRoleId id;
+    @Column(name = "override_type",nullable = false)
+    private String overrideType = "EXCLUDE";
+
+    public ProjectRole(ProjectRoleId id) {
+        this.id = id;
+    }
 
     public String getName(){
@@ -23,3 +30,8 @@
         return id.getProject();
     }
+    public ProjectResourcePermissionOverrideType getOverrideType() {
+        return overrideType.equals(ProjectResourcePermissionOverrideType.INCLUDE.name()) ?
+                ProjectResourcePermissionOverrideType.INCLUDE
+                : ProjectResourcePermissionOverrideType.EXCLUDE;
+    }
 }
Index: src/main/java/com/db/finki/www/build_board/entity/access_managment/ProjectRolePermission.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/access_managment/ProjectRolePermission.java	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/java/com/db/finki/www/build_board/entity/access_managment/ProjectRolePermission.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -14,5 +14,4 @@
 @Table(name = "role_permissions")
 @Entity
-@AllArgsConstructor
 @NoArgsConstructor
 @Getter
@@ -21,7 +20,4 @@
     @EmbeddedId
     private ProjectRolePermissionId id;
-
-    @Column(name = "override_type",nullable = false)
-    private String overrideType;
 
     public ProjectRolePermission(ProjectRolePermissionId projectRolePermissionId) {
@@ -36,9 +32,5 @@
         return id.getProjectRole();
     }
-    public ProjectResourcePermissionOverrideType getOverrideType() {
-        return overrideType.equals(ProjectResourcePermissionOverrideType.INCLUDE.name()) ?
-                ProjectResourcePermissionOverrideType.INCLUDE
-                : ProjectResourcePermissionOverrideType.EXCLUDE;
-    }
+
 
 }
Index: src/main/java/com/db/finki/www/build_board/entity/view/RoleChannelPermissions.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/view/RoleChannelPermissions.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
+++ src/main/java/com/db/finki/www/build_board/entity/view/RoleChannelPermissions.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -0,0 +1,46 @@
+package com.db.finki.www.build_board.entity.view;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.hibernate.annotations.Immutable;
+
+import java.util.Objects;
+
+@Entity
+@Immutable
+@Table(name = "role_channel_permissions")
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class RoleChannelPermissions {
+    @Id
+    @Column(name = "project_resource_id")
+    private Integer resourceId;
+    @Column(name = "project_id")
+    private Integer projectId;
+    @Column(name = "name")
+    private String channelName;
+    @Column(name = "role_name")
+    private String roleName;
+    @Column(name = "permissions")
+    private String permissions; // comma seperated PERMISSIONS
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == null || getClass() != o.getClass()) return false;
+        RoleChannelPermissions that = (RoleChannelPermissions) o;
+        return Objects.equals(resourceId, that.resourceId) && Objects.equals(projectId, that.projectId) && Objects.equals(channelName, that.channelName) && Objects.equals(roleName, that.roleName) && Objects.equals(permissions, that.permissions);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(resourceId, projectId, channelName, roleName, permissions);
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/repository/RoleChannelPermissionsRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/RoleChannelPermissionsRepository.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
+++ src/main/java/com/db/finki/www/build_board/repository/RoleChannelPermissionsRepository.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -0,0 +1,10 @@
+package com.db.finki.www.build_board.repository;
+
+import com.db.finki.www.build_board.entity.view.RoleChannelPermissions;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface RoleChannelPermissionsRepository extends JpaRepository<RoleChannelPermissions, Integer> {
+    List<RoleChannelPermissions> findByRoleNameAndProjectId(String roleName, Integer projectId);
+}
Index: src/main/java/com/db/finki/www/build_board/repository/access_managment/ProjectRolePermissionResourceOverrideRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/access_managment/ProjectRolePermissionResourceOverrideRepository.java	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/java/com/db/finki/www/build_board/repository/access_managment/ProjectRolePermissionResourceOverrideRepository.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -4,4 +4,5 @@
 import com.db.finki.www.build_board.entity.access_managment.ProjectRolePermission;
 import com.db.finki.www.build_board.entity.access_managment.ProjectRolePermissionResourceOverride;
+import com.db.finki.www.build_board.entity.channel.Channel;
 import com.db.finki.www.build_board.entity.compositeId.ProjectRolePermissionResourceOverrideId;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -9,4 +10,6 @@
 import org.springframework.stereotype.Repository;
 
+
+//todo override_type vo project_role
 import java.util.List;
 
@@ -16,27 +19,28 @@
     @Query(value = """
             SELECT COALESCE(
-                           EXISTS (
-                               SELECT 1
-                               FROM users_project_roles upr
-                                        JOIN role_permissions rp
-                                             ON upr.role_name = rp.role_name
-                                                 AND upr.project_id = rp.project_id
-                                        LEFT JOIN role_permissions_overrides rpo
-                                                  ON rpo.role_name = rp.role_name
-                                                      AND rpo.project_id = rp.project_id
-                                                      AND rpo.permission_name = rp.permission_name
-                                                      AND rpo.project_resource_id = :resourceId
-                               WHERE upr.user_id = :userId
-                                 AND rp.project_id = :projectId
-                                 AND rp.permission_name = :permissionName
-                                 AND (
-                                   (rp.override_type = 'INCLUDE' AND rpo.project_resource_id IS NOT NULL)
-                                       OR (rp.override_type = 'EXCLUDE' AND rpo.project_resource_id IS NULL)
-                                   )
-                           ), FALSE
-                   ) AS has_access;
-            """, nativeQuery = true)
+                  EXISTS (SELECT 1
+                          FROM users_project_roles upr
+                                   JOIN project_role pr
+                               ON pr.name = upr.role_name
+                                            AND pr.project_id = upr.project_id
+                                   JOIN role_permissions rp
+                                        ON upr.role_name = rp.role_name
+                                            AND upr.project_id = rp.project_id
+                                   LEFT JOIN role_permissions_overrides rpo
+                                             ON rpo.role_name = rp.role_name
+                                                 AND rpo.project_id = rp.project_id
+                                                 AND rpo.permission_name = rp.permission_name
+                                                 AND rpo.project_resource_id = :resourceId
+   
+                          WHERE upr.user_id = :userId
+                            AND rp.project_id = :projectId
+                            AND rp.permission_name = :permissionName
+                            AND (
+                              (pr.override_type = 'INCLUDE' AND rpo.project_resource_id IS NOT NULL)
+                                  OR (pr.override_type = 'EXCLUDE' AND rpo.project_resource_id IS NULL)
+                              )), FALSE
+          ) AS has_access;
+          """, nativeQuery = true)
     boolean hasPermissionForResource(int projectId,int userId,String permissionName,int resourceId);
-
     List<ProjectRolePermissionResourceOverride> findAllByIdProjectRolePermissionIdProjectRole(ProjectRole projectRole);
 }
Index: src/main/java/com/db/finki/www/build_board/service/access_managment/ProjectAccessManagementService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/access_managment/ProjectAccessManagementService.java	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/java/com/db/finki/www/build_board/service/access_managment/ProjectAccessManagementService.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -4,4 +4,5 @@
 import com.db.finki.www.build_board.dto.PermissionResourceWrapper;
 import com.db.finki.www.build_board.entity.access_managment.*;
+import com.db.finki.www.build_board.entity.channel.Channel;
 import com.db.finki.www.build_board.entity.compositeId.ProjectRoleId;
 import com.db.finki.www.build_board.entity.compositeId.ProjectRolePermissionId;
@@ -68,6 +69,5 @@
                                 p,
                                 role
-                        ),
-                        ProjectResourcePermissionOverrideType.EXCLUDE.name()
+                        )
                 ))
                 .toList();
@@ -84,7 +84,5 @@
                         new ProjectRolePermissionId(
                                 p.getPermission(),
-                                role
-                        ),
-                        overrideType.name()
+                                role)
                 ))
                 .toList();
@@ -123,5 +121,6 @@
                                 addRoleDTO.getName(),
                                 addRoleDTO.getProject()
-                        )
+                        ),
+                        addRoleDTO.getProjectResourcePermissionOverrideType().name()
                 )
                                                      );
Index: src/main/java/com/db/finki/www/build_board/service/channel/ChannelService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/channel/ChannelService.java	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/java/com/db/finki/www/build_board/service/channel/ChannelService.java	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -6,5 +6,8 @@
 import com.db.finki.www.build_board.entity.user_type.BBUser;
 import com.db.finki.www.build_board.entity.user_type.Developer;
+import com.db.finki.www.build_board.entity.view.RoleChannelPermissions;
 import com.db.finki.www.build_board.repository.DeveloperRepository;
+import com.db.finki.www.build_board.repository.RoleChannelPermissionsRepository;
+import com.db.finki.www.build_board.repository.access_managment.ProjectRolePermissionResourceOverrideRepository;
 import com.db.finki.www.build_board.repository.channel.ChannelRepository;
 import org.springframework.stereotype.Service;
@@ -16,6 +19,8 @@
     private final ChannelRepository channelRepository;
     private final DeveloperRepository developerRepository;
+    private final ProjectRolePermissionResourceOverrideRepository  projectRolePermissionResourceOverrideRepository;
 
     private final String INVALID_INPUT_REGEX = "(^/|/$|[\\#?])";
+    private final RoleChannelPermissionsRepository roleChannelPermissionsRepository;
 
     private boolean isInvalidInput(String input) {
@@ -23,7 +28,9 @@
     }
 
-    public ChannelService(ChannelRepository channelRepository, DeveloperRepository developerRepository) {
+    public ChannelService(ChannelRepository channelRepository, DeveloperRepository developerRepository, ProjectRolePermissionResourceOverrideRepository projectRolePermissionResourceOverrideRepository, RoleChannelPermissionsRepository roleChannelPermissionsRepository) {
         this.channelRepository = channelRepository;
         this.developerRepository = developerRepository;
+        this.projectRolePermissionResourceOverrideRepository = projectRolePermissionResourceOverrideRepository;
+        this.roleChannelPermissionsRepository = roleChannelPermissionsRepository;
     }
 
@@ -31,4 +38,9 @@
         return channelRepository.findAllByProjectIdOrderByNameAsc(project.getId());
     }
+
+    public List<RoleChannelPermissions> getRoleChannelPermissions(String roleName, Integer projectId) {
+        return roleChannelPermissionsRepository.findByRoleNameAndProjectId(roleName, projectId);
+    }
+
 
     public Channel create(Project project, String channelName, String description, BBUser user){
Index: src/main/resources/db/migration/U1__remove_ddl.sql
===================================================================
--- src/main/resources/db/migration/U1__remove_ddl.sql	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/resources/db/migration/U1__remove_ddl.sql	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -15,7 +15,7 @@
 DROP TABLE IF EXISTS developer_associated_with_project CASCADE;
 DROP TABLE IF EXISTS permissions CASCADE;
-DROP TABLE IF EXISTS project_roles CASCADE;
+DROP TABLE IF EXISTS project_role CASCADE;
 DROP TABLE IF EXISTS users_project_roles CASCADE;
-DROP TABLE IF EXISTS project_roles_permissions CASCADE;
+DROP TABLE IF EXISTS roles_permissions CASCADE;
 DROP TABLE IF EXISTS project_request CASCADE;
 DROP TABLE IF EXISTS report CASCADE;
@@ -30,4 +30,6 @@
 DROP VIEW IF EXISTS v_project_owner CASCADE;
 DROP VIEW IF EXISTS v_moderator CASCADE;
+DROP TABLE IF EXISTS project_resource CASCADE ;
+DROP TABLE IF EXISTS role_permissions_overrides CASCADE ;
 drop function if exists fn_insert_project_manager CASCADE;
 drop function if exists fn_insert_topics_creator_as_moderator CASCADE;
Index: src/main/resources/db/migration/V1__init_ddl.sql
===================================================================
--- src/main/resources/db/migration/V1__init_ddl.sql	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/resources/db/migration/V1__init_ddl.sql	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -167,4 +167,5 @@
     name       varchar(32) NOT NULL,
     project_id int references project_thread (id) ON DELETE CASCADE,
+    override_type varchar(20) check ( override_type in ('INCLUDE','EXCLUDE')) NOT NULL DEFAULT 'EXCLUDE',
     PRIMARY KEY (name, project_id)
 );
@@ -172,9 +173,9 @@
 CREATE TABLE role_permissions
 (
-    permission_name VARCHAR(32) REFERENCES permissions (name),
+    permission_name VARCHAR(32),
     role_name       VARCHAR(32),
     project_id      INT,
-    override_type varchar(20) check ( override_type in ('INCLUDE','EXCLUDE')) NOT NULL,
     FOREIGN KEY (role_name, project_id) REFERENCES project_role (name, project_id) ON DELETE CASCADE,
+    FOREIGN KEY (permission_name) REFERENCES permissions(name),
     PRIMARY KEY (permission_name, role_name, project_id)
 );
@@ -294,2 +295,36 @@
          join thread t
               on t.id = d.id;
+
+
+CREATE OR REPLACE VIEW role_channel_permissions AS
+SELECT
+    c.project_resource_id,
+    c.name,
+    pr.name AS role_name,
+    c.project_id,
+    COALESCE(
+                    STRING_AGG(
+                    DISTINCT rp.permission_name, ',' ORDER BY rp.permission_name
+                              ) FILTER (
+                        WHERE
+                        (pr.override_type = 'INCLUDE' AND rpo.project_resource_id IS NOT NULL)
+                            OR
+                        (pr.override_type = 'EXCLUDE' AND rpo.project_resource_id IS NULL)
+                        ),
+                    ''
+    ) AS permissions
+FROM channel c
+         JOIN project_role pr
+              ON pr.project_id = c.project_id
+         LEFT JOIN role_permissions rp
+                   ON rp.project_id = c.project_id
+                       AND rp.role_name = pr.name
+                       AND rp.permission_name IN ('READ','WRITE')
+         LEFT JOIN role_permissions_overrides rpo
+                   ON rpo.project_id = rp.project_id
+                       AND rpo.role_name = rp.role_name
+                       AND rpo.permission_name = rp.permission_name
+                       AND rpo.project_resource_id = c.project_resource_id
+GROUP BY c.project_resource_id, c.name, pr.name, c.project_id;
+
+
Index: src/main/resources/db/migration/V3__add_test_data.sql
===================================================================
--- src/main/resources/db/migration/V3__add_test_data.sql	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/resources/db/migration/V3__add_test_data.sql	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -56,9 +56,9 @@
     (5, 7);
 
-
-INSERT INTO blacklisted_user (topic_id, user_id, moderator_id, start_date, end_date, reason)
-VALUES
-    (1, 2, 1, NOW(), NOW() + INTERVAL '7 days', 'Spamming'),
-    (2, 3, 2, NOW(), NOW() + INTERVAL '3 days', 'Offensive language');
+--
+-- INSERT INTO blacklisted_user (topic_id, user_id, moderator_id, start_date, end_date, reason)
+-- VALUES
+--     (1, 2, 1, NOW(), NOW() + INTERVAL '7 days', 'Spamming'),
+--     (2, 3, 2, NOW(), NOW() + INTERVAL '3 days', 'Offensive language');
 
 INSERT INTO permissions (name)
@@ -69,8 +69,8 @@
     ('DELETE');
 
-INSERT INTO project_role (name, project_id)
-VALUES
-    ('Admin', 5),
-    ('Developer', 5);
+INSERT INTO project_role (name, project_id,override_type)
+VALUES
+    ('Admin', 5,'EXCLUDE'),
+    ('Developer', 5,'INCLUDE');
 
 
@@ -80,10 +80,10 @@
     (5, 5, 'Developer');
 
-INSERT INTO role_permissions (permission_name, role_name, project_id,override_type)
-VALUES
-    ('READ', 'Admin', 5,'EXCLUDE'),
-    ('WRITE', 'Admin', 5,'EXCLUDE'),
-    ('CREATE','Admin',5,'EXCLUDE'),
-    ('DELETE','Admin',5,'EXCLUDE');
+INSERT INTO role_permissions (permission_name, role_name, project_id)
+VALUES
+    ('READ', 'Admin', 5),
+    ('WRITE', 'Admin', 5),
+    ('CREATE','Admin',5),
+    ('DELETE','Admin',5);
 
 insert into submission(created_by,status,description)
Index: src/main/resources/templates/channels/show-channel.html
===================================================================
--- src/main/resources/templates/channels/show-channel.html	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/resources/templates/channels/show-channel.html	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -56,7 +56,7 @@
             <!-- Input Section -->
             <div class="input-container">
-                <textarea id="chat-message" th:disabled="${canWrite}" class="form-control h-fit-content" name="chatMessage"
+                <textarea id="chat-message" th:disabled="${!canWrite}" class="form-control h-fit-content" name="chatMessage"
                           placeholder="Type your message..."></textarea>
-                <button id="send-message-button" th:disabled="${canWrite}" class="btn btn-primary">Send</button>
+                <button id="send-message-button" th:disabled="${!canWrite}" class="btn btn-primary">Send</button>
             </div>
         </div>
Index: src/main/resources/templates/project_pages/edit-role.html
===================================================================
--- src/main/resources/templates/project_pages/edit-role.html	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/resources/templates/project_pages/edit-role.html	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -35,10 +35,10 @@
                         <div class="form-check">
                             <input class="form-check-input" type="radio" name="overrideType" id="includeTypeUpdate" value="INCLUDE"
-                                   th:checked="${overrideType == 'INCLUDE' ? 'checked' : ''}">
+                                   th:checked="${overrideType == 'INCLUDE'}">
                             <label class="form-check-label" for="includeTypeUpdate">INCLUDE</label>
                         </div>
                         <div class="form-check">
                             <input class="form-check-input" type="radio" name="overrideType" id="excludeTypeUpdate" value="EXCLUDE"
-                                   th:checked="${overrideType == 'EXCLUDE' ? 'checked' : ''}">
+                                   th:checked="${overrideType == 'EXCLUDE'}">
                             <label class="form-check-label" for="excludeTypeUpdate">EXCLUDE</label>
                         </div>
@@ -55,5 +55,5 @@
                                        th:name="'global-permission'"
                                        th:value="${permission.toLowerCase()}"
-                                       th:checked="${selectedGlobalPermissions.contains(permission) ? 'checked' : ''}">
+                                       th:checked="${selectedGlobalPermissions.contains(permission)}">
                                 <label class="form-check-label" th:for="'global-' + ${permission}"
                                        th:text="${permission.toLowerCase() + ' channels'}">Permission</label>
@@ -68,16 +68,16 @@
                             <div class="mb-2">
                                 <strong th:text="${permission}">Permission Name</strong>
-                                <div class="d-flex flex-wrap gap-2 mt-1" th:each="channel : ${project.getChannels()}">
+                                <div class="d-flex flex-wrap gap-2 mt-1" th:each="rcp : ${roleChannelPermissions}">
                                     <div class="form-check">
                                         <input class="form-check-input perm-checkbox"
                                                type="checkbox"
-                                               th:id="${permission + '-' + channel.getProjectResource().getId()}"
+                                               th:id="${permission + '-' + rcp.getResourceId()}"
                                                name="per-resource-permission"
                                                th:value="${permission}"
-                                               th:attr="data-resource-id=${channel.getProjectResource().getId()}"
-                                               th:checked="${selectedChannels.get(permission).contains(channel.getProjectResource())}">
+                                               th:attr="data-resource-id=${rcp.getResourceId()}"
+                                               th:checked="${rcp.getPermissions().contains(permission)}">
                                         <label class="form-check-label"
-                                               th:for="${permission + '-' + channel.getProjectResource().getId()}"
-                                               th:text="${channel.getName()}">Resource Name</label>
+                                               th:for="${permission + '-' + rcp.getResourceId()}"
+                                               th:text="${rcp.getChannelName()}">Resource Name</label>
                                     </div>
                                 </div>
@@ -89,7 +89,9 @@
 
                 <!-- Submit -->
-                <div class="modal-footer">
+                <div class="modal-footer d-flex justify-content-between">
+                    <a th:href="@{/projects/{ptitle}/roles (ptitle=${project.getTitle()})}" class="btn btn-secondary w-100 me-2">Cancel</a>
                     <button type="submit" id="update-role-modal-submit" class="btn btn-warning w-100">Update Role</button>
                 </div>
+
 
             </form>
@@ -102,5 +104,80 @@
 <!-- Script to show modal by default -->
 <script>
+
+    const getCheckedValues = (inputs) => {
+        const values = []
+        for(let i of inputs){
+            if(i.checked)
+                values.push(i.value)
+        }
+        return values
+    }
+
+    const processPerResourcePermissions = (inputs) => {
+        const values = []
+        for(let i of inputs){
+            if(i.checked){
+                values.push({
+                    name: i.value,
+                    resourceId: i.dataset.resourceId
+                })
+            }
+        }
+        return values
+    }
+
+    const getProjectTitle = () => {
+        return document.body.dataset.projectTitle
+    }
+
+    document.getElementById('add-role-form').addEventListener('submit', async function(event) {
+        event.preventDefault()
+        const roleNameInput = document.querySelector("#roleName")
+        const includeExcludeInput = document.querySelectorAll("input[name='overrideType']")
+        const globalPermissions = document.querySelectorAll("input[name='global-permission']")
+        const perResourcePermissions = document.querySelectorAll("input[name='per-resource-permission']")
+
+        const roleName = roleNameInput.value
+        const includeExcludeDecided = getCheckedValues(includeExcludeInput)[0]
+        const globalSelectedPermissions = getCheckedValues(globalPermissions)
+        const perResourceSelectedPermissions = processPerResourcePermissions(perResourcePermissions)
+        const projectTitle = getProjectTitle()
+
+        const response = await fetch(`/projects/${projectTitle}/roles/${roleName}/edit`, {
+            method: "POST",
+            headers: {
+                "Content-Type" : "application/json",
+            },
+            body: JSON.stringify({
+                name: roleName,
+                projectTitle: projectTitle,
+                permissionOverrideType: includeExcludeDecided,
+                globalPermissions: globalSelectedPermissions,
+                permissionResourceDTOS: perResourceSelectedPermissions.map(p => ({
+                    permissionName: p.name,
+                    projectResourceID: p.resourceId
+                }))
+            }),
+            credentials: "include"
+        })
+
+        if(!response.ok)
+            throw new Error("Something went wrong")
+
+        location.reload()
+    });
+
     document.addEventListener("DOMContentLoaded", function() {
+        const includeRadio = document.getElementById("includeType");
+        const excludeRadio = document.getElementById("excludeType");
+        const permCheckboxes = document.querySelectorAll(".perm-checkbox");
+
+        function updateCheckboxes() {
+            permCheckboxes.forEach(cb => cb.checked = !cb.checked);
+        }
+
+        includeRadio.addEventListener("change", updateCheckboxes);
+        excludeRadio.addEventListener("change", updateCheckboxes);
+
         const modalEl = document.getElementById('updateRoleModal');
         const modal = new bootstrap.Modal(modalEl, {
Index: src/main/resources/templates/project_pages/project-roles.html
===================================================================
--- src/main/resources/templates/project_pages/project-roles.html	(revision 591e6827984f23e7df9735ec611ec49da3fa5486)
+++ src/main/resources/templates/project_pages/project-roles.html	(revision becf9bfe9c849e851f1a6eca11e29a68f4fbfd22)
@@ -113,5 +113,5 @@
                             <div class="d-flex flex-wrap gap-2 mt-1" th:each="permission : ${globalPermissions}">
                                 <div class="form-check">
-                                    <input class="form-check-input"
+                                    <input class="form-check-input perm-checkbox"
                                            type="checkbox"
                                            th:id="${permission}"
@@ -223,7 +223,4 @@
     });
 
-    document.getElementById("add-role-modal-submit").addEventListener('click',() => {
-
-    })
 
     document.addEventListener("DOMContentLoaded", function () {
@@ -233,9 +230,5 @@
 
         function updateCheckboxes() {
-            if (includeRadio.checked) {
-                permCheckboxes.forEach(cb => cb.checked = false);
-            } else if (excludeRadio.checked) {
-                permCheckboxes.forEach(cb => cb.checked = true);
-            }
+            permCheckboxes.forEach(cb => cb.checked = !cb.checked);
         }
 
