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 cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/java/com/db/finki/www/build_board/controller/channel/ChannelController.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -73,4 +73,8 @@
         }
 
+        boolean canWrite = projectAccessManagementService
+                .hasPermissionToAccessResource(user.getId(),Permission.WRITE,c.getProjectResource().getId(),project.getId());
+        model.addAttribute("canWrite", canWrite);
+
             return "channels/show-channel";
     }
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 cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/java/com/db/finki/www/build_board/controller/thread_controller/ProjectController.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -1,6 +1,6 @@
 package com.db.finki.www.build_board.controller.thread_controller;
 
-import com.db.finki.www.build_board.common.enums.PermissionValue;
 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.thread.Project;
 import com.db.finki.www.build_board.entity.user_type.BBUser;
@@ -10,4 +10,5 @@
 import com.db.finki.www.build_board.service.thread.impl.TagServiceImpl;
 import com.db.finki.www.build_board.service.thread.itf.TagService;
+import com.db.finki.www.build_board.service.user.BBUserDetailsService;
 import org.hibernate.Hibernate;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -30,10 +31,12 @@
     private final ProjectAccessManagementService projectAccessManagementService;
     private final AddRoleDTOEntitiesMapper mapper;
-
-    public ProjectController(ProjectService projectService, TagServiceImpl topicService, ProjectAccessManagementService projectAccessManagementService, AddRoleDTOEntitiesMapper mapper) {
+    private final BBUserDetailsService userDetailsService;
+
+    public ProjectController(ProjectService projectService, TagServiceImpl topicService, ProjectAccessManagementService projectAccessManagementService, AddRoleDTOEntitiesMapper mapper, BBUserDetailsService userDetailsService) {
         this.projectService = projectService;
         this.tagService = topicService;
         this.projectAccessManagementService = projectAccessManagementService;
         this.mapper = mapper;
+        this.userDetailsService = userDetailsService;
     }
 
@@ -142,6 +145,17 @@
         model.addAttribute("project",
                 project);
-        model.addAttribute("developers",
-                projectService.getAllDevelopersForProject(project));
+
+        List<BBUser> developers = projectService.getAllDevelopersForProject(project);
+
+        List<DeveloperWithRolesForProjectDTO> devWrapper = developers
+                .stream()
+                .map(dev -> new DeveloperWithRolesForProjectDTO(dev,projectAccessManagementService.getRolesForDeveloperInProject(dev,project))).toList();
+
+        System.out.println("MAPPED" + " " + devWrapper);
+
+        model.addAttribute("developers", devWrapper);
+        model.addAttribute("projectRoles",projectAccessManagementService.getRolesForMembersInProject(project));
+
+
         return "project_pages/members";
     }
@@ -211,4 +225,19 @@
     }
 
+    @PostMapping("{title}/add-role/{userId}")
+    public String assignRolesToUser(@PathVariable(name = "title") @P("project") Project project, @PathVariable Integer userId,@RequestParam(name = "roles") List<String> roleNames){
+        BBUser user = userDetailsService.loadUserById(userId);
+        projectAccessManagementService.addRolesToUser(user,project,roleNames);
+        return "redirect:/projects/" + project.getTitle() + "/members";
+    }
+    @PostMapping("{title}/remove-role/{userId}")
+    public String deleteRoleForUser(@PathVariable(name = "title") @P("project") Project project, @PathVariable Integer userId,String roleName){
+        BBUser user = userDetailsService.loadUserById(userId);
+        projectAccessManagementService.deleteRoleForUser(user,project,roleName);
+        return "redirect:/projects/" + project.getTitle() + "/members";
+    }
+
+
+
     @PreAuthorize("#project.getUser().getUsername().equals(#username)")
     @PostMapping("/topics/add")
Index: src/main/java/com/db/finki/www/build_board/dto/DeveloperWithRolesForProjectDTO.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/dto/DeveloperWithRolesForProjectDTO.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
+++ src/main/java/com/db/finki/www/build_board/dto/DeveloperWithRolesForProjectDTO.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -0,0 +1,17 @@
+package com.db.finki.www.build_board.dto;
+
+import com.db.finki.www.build_board.entity.access_managment.ProjectRole;
+import com.db.finki.www.build_board.entity.user_type.BBUser;
+import lombok.*;
+
+import java.util.List;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+public class DeveloperWithRolesForProjectDTO {
+    private BBUser user;
+    private List<ProjectRole> roles;
+}
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 cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/java/com/db/finki/www/build_board/entity/access_managment/ProjectRole.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -4,8 +4,5 @@
 import com.db.finki.www.build_board.entity.thread.Project;
 import jakarta.persistence.*;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
+import lombok.*;
 
 @Table(name = "project_role")
@@ -15,4 +12,5 @@
 @AllArgsConstructor
 @NoArgsConstructor
+@ToString
 public class ProjectRole {
     @EmbeddedId
Index: src/main/java/com/db/finki/www/build_board/entity/access_managment/UsersProjectRoles.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/access_managment/UsersProjectRoles.java	(revision cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/java/com/db/finki/www/build_board/entity/access_managment/UsersProjectRoles.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -6,7 +6,15 @@
 import jakarta.persistence.Entity;
 import jakarta.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
 
 @Entity
 @Table(name = "users_project_roles")
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
 public class UsersProjectRoles {
     @EmbeddedId
Index: src/main/java/com/db/finki/www/build_board/entity/compositeId/ProjectRoleId.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/compositeId/ProjectRoleId.java	(revision cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/java/com/db/finki/www/build_board/entity/compositeId/ProjectRoleId.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -3,8 +3,5 @@
 import com.db.finki.www.build_board.entity.thread.Project;
 import jakarta.persistence.*;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
+import lombok.*;
 
 @Getter
@@ -13,4 +10,5 @@
 @AllArgsConstructor
 @NoArgsConstructor
+@ToString
 public class ProjectRoleId {
     String name;
Index: src/main/java/com/db/finki/www/build_board/entity/user_type/BBUser.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/user_type/BBUser.java	(revision cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/java/com/db/finki/www/build_board/entity/user_type/BBUser.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -1,4 +1,5 @@
 package com.db.finki.www.build_board.entity.user_type;
 
+import com.db.finki.www.build_board.entity.access_managment.ProjectRole;
 import com.db.finki.www.build_board.entity.thread.BBThread;
 import com.db.finki.www.build_board.entity.thread.Project;
@@ -8,4 +9,5 @@
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import lombok.ToString;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -67,5 +69,4 @@
 
 
-
     @Override
     public boolean equals(Object other){
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 cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/java/com/db/finki/www/build_board/repository/access_managment/ProjectRolePermissionResourceOverrideRepository.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -11,35 +11,25 @@
 
     @Query(value = """
-            SELECT COALESCE((
-                                SELECT
-                                    CASE
-                                        WHEN rp.override_type = 'INCLUDE'
-                                            THEN EXISTS (
-                                            SELECT 1
-                                            FROM role_permissions_overrides rpo
-                                            WHERE 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 = :resource_id
-                                        )
-                                        WHEN rp.override_type = 'EXCLUDE'
-                                            THEN NOT EXISTS (
-                                            SELECT 1
-                                            FROM role_permissions_overrides rpo
-                                            WHERE 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 = :resource_id
-                                        )
-                                        END
-                                FROM users_project_roles upr
-                                         JOIN role_permissions rp
-                                              ON upr.role_name = rp.role_name
-                                                  AND upr.project_id = rp.project_id
-                                WHERE upr.user_id = :user_id
-                                  AND rp.project_id = :project_id
-                                  AND rp.permission_name = :permission_name
-                                LIMIT 1
-                            ), FALSE) AS has_access;
+            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)
     boolean hasPermissionForResource(int projectId,int userId,String permissionName,int resourceId);
Index: src/main/java/com/db/finki/www/build_board/repository/access_managment/UserProjectRoleRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/access_managment/UserProjectRoleRepository.java	(revision cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/java/com/db/finki/www/build_board/repository/access_managment/UserProjectRoleRepository.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -13,4 +13,4 @@
 @Repository
 public interface UserProjectRoleRepository extends JpaRepository<UsersProjectRoles, UsersProjectRolesId> {
-    List<UsersProjectRoles> findByIdRoleIdProjectId(int projectId);
+    List<UsersProjectRoles> findByIdRoleIdProjectIdAndIdUserId(int projectId,int userId);
 }
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 cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/java/com/db/finki/www/build_board/service/access_managment/ProjectAccessManagementService.java	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -7,5 +7,7 @@
 import com.db.finki.www.build_board.entity.compositeId.ProjectRolePermissionId;
 import com.db.finki.www.build_board.entity.compositeId.ProjectRolePermissionResourceOverrideId;
+import com.db.finki.www.build_board.entity.compositeId.UsersProjectRolesId;
 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.repository.access_managment.ProjectRolePermissionResourceOverrideRepository;
 import com.db.finki.www.build_board.repository.access_managment.ProjectRoleRepository;
@@ -46,4 +48,8 @@
                 permission,
                 resourceId);
+    }
+
+    public List<ProjectRole> getRolesForDeveloperInProject(BBUser user,Project project){
+        return userProjectRoleRepository.findByIdRoleIdProjectIdAndIdUserId(project.getId(),user.getId()).stream().map(UsersProjectRoles::getProjectRole).toList();
     }
 
@@ -145,3 +151,20 @@
         projectRoleRepository.deleteById(new ProjectRoleId(roleName,project));
     }
+
+    public void addRolesToUser(BBUser user, Project project, List<String> roleNames) {
+        List<UsersProjectRoles> roles = roleNames
+                .stream()
+                .map(r -> new ProjectRole(new ProjectRoleId(r,project)))
+                .map(role -> new UsersProjectRoles(new UsersProjectRolesId(role,user)))
+                .toList();
+
+        userProjectRoleRepository.saveAll(roles);
+
+
+    }
+
+    public void deleteRoleForUser(BBUser user, Project project, String roleName) {
+        ProjectRole role = new ProjectRole(new ProjectRoleId(roleName,project));
+        userProjectRoleRepository.deleteById(new UsersProjectRolesId(role,user));
+    }
 }
Index: src/main/resources/templates/channels/show-channel.html
===================================================================
--- src/main/resources/templates/channels/show-channel.html	(revision cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/resources/templates/channels/show-channel.html	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -56,7 +56,7 @@
             <!-- Input Section -->
             <div class="input-container">
-                <textarea id="chat-message" 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" 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 d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
+++ src/main/resources/templates/project_pages/edit-role.html	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Update Role</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div th:replace="/home_pages/home :: navigation"></div>
+
+<div class="container mt-5">
+    <div class="row justify-content-center">
+        <div class="col-md-6">
+
+            <div class="card shadow">
+                <div class="card-header bg-warning text-white">
+                    <h5 class="mb-0">Update Role</h5>
+                </div>
+                <div class="card-body">
+                    <form th:action="@{/projects/{title}/roles/{roleName}/update(title=${project.getTitle()}, roleName=${role.name})}"
+                          method="post">
+                        <div class="mb-3">
+                            <label for="updateRoleName" class="form-label">Role Name</label>
+                            <input type="text"
+                                   class="form-control"
+                                   id="updateRoleName"
+                                   name="roleName"
+                                   th:value="${role.name}"
+                                   required>
+                        </div>
+                        <button type="submit" class="btn btn-warning w-100">Update Role</button>
+                    </form>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/project_pages/members.html
===================================================================
--- src/main/resources/templates/project_pages/members.html	(revision cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/resources/templates/project_pages/members.html	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -25,5 +25,6 @@
             text-align: center;
         }
-        #kick-user-button{
+
+        #kick-user-button {
             position: absolute;
             top: 0;
@@ -35,4 +36,11 @@
         }
 
+        .btn-close-red {
+            filter: invert(28%) sepia(93%) saturate(7484%) hue-rotate(356deg) brightness(97%) contrast(122%);
+        }
+        .btn-close-red:hover {
+            filter: invert(19%) sepia(94%) saturate(6397%) hue-rotate(356deg) brightness(95%) contrast(126%);
+        }
+
     </style>
 </head>
@@ -46,25 +54,49 @@
     <div class="list-group w-75">
         <div class="list-group-item d-flex gap-2 justify-content-between align-items-center ps-4 pe-4"
-             th:each="member : ${developers}">
+             th:each="memberWrapper : ${developers}">
             <div class="d-flex flex-row align-items-center gap-3">
                 <img class="rounded-circle border border-1 border-info"
-                     style="width: 5em; height: 5em" th:src="${member.getAvatarUrl()}">
+                     style="width: 5em; height: 5em" th:src="${memberWrapper.getUser().getAvatarUrl()}">
                 <h5 class="mb-1 d-flex">
-                    <a th:href="@{/{username}/profile (username=${member.getUsername()})}"
-                       th:text="${member.getUsername()}"
-                        class="text-decoration-none"
+                    <a th:href="@{/{username}/profile (username=${memberWrapper.getUser().getUsername()})}"
+                       th:text="${memberWrapper.getUser().getUsername()}"
+                       class="text-decoration-none"
                     ></a>
                 </h5>
+                <div class="d-flex w-100">
+                    <form method="post"
+                          th:action="@{/projects/{projectName}/remove-role/{memberId}(projectName=${project.getTitle()}, memberId=${memberWrapper.getUser().getId()})}"
+                          class="d-inline"
+                          th:each="role : ${memberWrapper.getRoles()}">
+                        <input type="hidden" name="roleName" th:value="${role.getName()}"/>
+                        <span class="badge bg-primary me-1 d-flex align-items-center user-roles" th:attr="data-user=${memberWrapper.getUser().getId()}">
+        <span th:text="${role.getName()}"></span>
+        <button type="submit" class="btn-close btn-sm ms-2 btn-close-red" aria-label="Remove role"></button>
+    </span>
+                    </form>
+                </div>
+
             </div>
             <div class="d-flex align-items-center gap-5">
-                <div>
-                    roles here ko badges
-                </div>
-                <h5 th:if="${member.getId() != project.getUser().getId()}" class="fw-lighter mb-0 fst-italic">Developer</h5>
-                <h5 th:if="${member.getId() == project.getUser().getId()}" class="fw-lighter mb-0 fst-italic">Owner</h5>
-                <div style="position: relative; display: inline-block;" th:if="${session.user.getId() == project.getUser().getId() && member.getId() != project.getUser().getId()}"
+
+                <button
+                        th:if="${session.user.getId() == project.getUser().getId()}"
+                        th:attr="data-mem-id=${memberWrapper.getUser().getId()},data-selected-user=${memberWrapper.getUser().getId()}"
+                        class="btn btn-success open-role-dialog"
+                        data-bs-toggle="modal"
+                        data-bs-target="#addRoleModal">
+                    Add Role
+                </button>
+
+                <h5 th:if="${memberWrapper.getUser().getId() != project.getUser().getId()}"
+                    class="fw-lighter mb-0 fst-italic">
+                    Developer</h5>
+                <h5 th:if="${memberWrapper.getUser().getId() == project.getUser().getId()}"
+                    class="fw-lighter mb-0 fst-italic">Owner</h5>
+                <div style="position: relative; display: inline-block;"
+                     th:if="${session.user.getId() == project.getUser().getId() && memberWrapper.getUser().getId() != project.getUser().getId()}"
                      class="d-flex flex-row gap-1 align-items-center">
                     <button
-                            th:attr="data-mem-id=${member.getId()}"
+                            th:attr="data-mem-id=${memberWrapper.getUser().getId()}"
                             type="button" class="btn rounded open-kick-dialog"
                             style="background-image: url('/project_imgs/im-kick-user.svg'); width: 3rem; height: 3rem; background-color: transparent"
@@ -73,5 +105,5 @@
                     >
                     </button>
-            </div>
+                </div>
 
             </div>
@@ -92,6 +124,6 @@
                 <form method="post"
                       class="confirm-form d-flex justify-content-end"
-                      th:action="@{/project/{projectName}/members/{member-id}/kick(projectName=${project.getTitle()})}" >
-                    <button class="btn btn-danger rounded"  type="submit">Confirm</button>
+                      th:action="@{/project/{projectName}/members/{member-id}/kick(projectName=${project.getTitle()})}">
+                    <button class="btn btn-danger rounded" type="submit">Confirm</button>
                 </form>
             </div>
@@ -99,17 +131,70 @@
     </div>
 </div>
+<!-- Add Role Modal -->
+<div class="modal fade" id="addRoleModal" tabindex="-1" aria-labelledby="addRoleLabel" aria-hidden="true">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h1 class="modal-title fs-5" id="addRoleLabel">Add Role(s)</h1>
+                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+            </div>
+            <div class="modal-body">
+                <form method="post" id="add-role-modal">
+                    <div class="mb-3">
+                        <label class="form-label">Select Role(s)</label>
+                        <div class="border rounded p-2" style="max-height: 200px; overflow-y: auto;">
+                            <div class="form-check" th:each="role : ${projectRoles}">
+                                <input class="form-check-input"
+                                       type="checkbox"
+                                       name="roles"
+                                       th:value="${role.getId().getName()}"
+                                       id="role_${role.getId().getName()}">
+                                <label class="form-check-label"
+                                       th:for="${'role_' + role.getId().getName()}"
+                                       th:text="${role.getName()}"></label>
+                            </div>
+                        </div>
+                        <small class="text-muted">You can select multiple roles.</small>
+                    </div>
+
+                    <div class="d-flex justify-content-end">
+                        <button type="submit" class="btn btn-primary">Assign Role(s)</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
 <script src="/js/modal_utils.js"></script>
 <script>
-modalConts.push(document.querySelector("#confirm"))
-
-const projectTitle = document.body.dataset.projectName
-const form=document.querySelector(".confirm-form")
-
-document.addEventListener("click", ev => {
-    if(ev.target.classList.contains("open-kick-dialog")){
-        const memberId = ev.target.dataset.memId
-        form.action=`/projects/${projectTitle}/members/${memberId}/kick`
-    }
-})
+    //data-user
+    const getUserRoles = (userId) =>
+        [...document.querySelectorAll(`span[data-user="${userId}"]`)].map(span => span.textContent.trim());
+
+    const setAvailableRoles = (appliedRoles) =>
+         [...document.querySelectorAll('input[name="roles"]')].filter(input => appliedRoles.includes(input.value)).forEach(input => input.parentElement.style.display = 'none')
+
+
+    document.body.addEventListener('click', (evt) => {
+        if (evt.target.classList.contains('open-role-dialog')) {
+            const projectName = document.body.dataset.projectName
+            const userId = evt.target.dataset.selectedUser
+            document.getElementById("add-role-modal").action = `/projects/${projectName}/add-role/${userId}`
+            setAvailableRoles(getUserRoles(userId))
+        }
+    })
+
+    modalConts.push(document.querySelector("#confirm"))
+
+    const projectTitle = document.body.dataset.projectName
+    const form = document.querySelector(".confirm-form")
+
+    document.addEventListener("click", ev => {
+        if (ev.target.classList.contains("open-kick-dialog")) {
+            const memberId = ev.target.dataset.memId
+            form.action = `/projects/${projectTitle}/members/${memberId}/kick`
+        }
+    })
 
 </script>
Index: src/main/resources/templates/project_pages/project-roles.html
===================================================================
--- src/main/resources/templates/project_pages/project-roles.html	(revision cad3b1b28b96f4bc31aa994f4d984d5b439a796b)
+++ src/main/resources/templates/project_pages/project-roles.html	(revision d1ebd7639458b8fd0a3b45424adfb842401c4ac1)
@@ -246,27 +246,4 @@
 
 
-<!-- Update Role Modals -->
-<!--<div th:each="role : ${roles}" th:id="'updateRoleModal-' + ${role.id}" class="modal fade" tabindex="-1" aria-hidden="true">-->
-<!--    <div class="modal-dialog">-->
-<!--        <div class="modal-content">-->
-<!--            <div class="modal-header">-->
-<!--                <h5 class="modal-title">Update Role</h5>-->
-<!--                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>-->
-<!--            </div>-->
-<!--            <form th:action="@{/projects/{title}/roles/{roleName}/update(title=${project.getTitle()}, roleName=${role.name})}" method="post">-->
-<!--                <div class="modal-body">-->
-<!--                    <div class="mb-3">-->
-<!--                        <label for="updateRoleName" class="form-label">Role Name</label>-->
-<!--                        <input type="text" class="form-control" id="updateRoleName" name="roleName" th:value="${role.name}" required>-->
-<!--                    </div>-->
-<!--                </div>-->
-<!--                <div class="modal-footer">-->
-<!--                    <button type="submit" class="btn btn-warning w-100">Update Role</button>-->
-<!--                </div>-->
-<!--            </form>-->
-<!--        </div>-->
-<!--    </div>-->
-<!--</div>-->
-
 <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
 </body>
