Index: src/main/java/com/db/finki/www/build_board/config/WebSecurityConfig.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/config/WebSecurityConfig.java	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/java/com/db/finki/www/build_board/config/WebSecurityConfig.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -54,6 +54,8 @@
                                 ).permitAll()
                                 .requestMatchers(
-                                        new AntPathRequestMatcher("/topic/*", HttpMethod.GET.name()),
-                                        new AntPathRequestMatcher("/project/*",HttpMethod.GET.name()),
+                                        new AntPathRequestMatcher("/topics/*",
+                                                HttpMethod.GET.name()),
+                                        new AntPathRequestMatcher("/projects/*",
+                                                HttpMethod.GET.name()),
                                         new AntPathRequestMatcher("/avatars/**",HttpMethod.GET.name())
                                 ).permitAll()
Index: src/main/java/com/db/finki/www/build_board/controller/home_page/UserProfileController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/home_page/UserProfileController.java	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/java/com/db/finki/www/build_board/controller/home_page/UserProfileController.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -3,4 +3,5 @@
 import com.db.finki.www.build_board.entity.entity_enum.Status;
 import com.db.finki.www.build_board.entity.user_type.BBUser;
+import com.db.finki.www.build_board.service.ReportService;
 import com.db.finki.www.build_board.service.user.BBUserDetailsService;
 import com.db.finki.www.build_board.service.request.ProjectRequestService;
@@ -24,9 +25,11 @@
     private final FileUploadService fileUploadService;
     private final ProjectRequestService projectRequestService;
+    private final ReportService reportService;
 
-    public UserProfileController(BBUserDetailsService userService, FileUploadService fileUploadService, ProjectRequestService projectRequestService) {
+    public UserProfileController(BBUserDetailsService userService, FileUploadService fileUploadService, ProjectRequestService projectRequestService, ReportService reportService) {
         this.userService = userService;
         this.fileUploadService = fileUploadService;
         this.projectRequestService = projectRequestService;
+        this.reportService = reportService;
     }
 
@@ -53,4 +56,15 @@
     }
 
+    @GetMapping("/reports")
+    public String getReportsByUser(@PathVariable String username,
+            @SessionAttribute @P("user") BBUser user,
+            @RequestParam(required = false) Status status,
+            Model model) {
+        BBUser byUser = (BBUser) userService.loadUserByUsername(username);
+        model.addAttribute("user", byUser);
+        model.addAttribute("requests", reportService.getByStatusAndUser(status,byUser));
+        model.addAttribute("status", Status.values());
+        return "/show-user-reports";
+    }
 
     @GetMapping("/project-requests")
Index: src/main/java/com/db/finki/www/build_board/controller/thread_controller/TopicController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/thread_controller/TopicController.java	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/java/com/db/finki/www/build_board/controller/thread_controller/TopicController.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -1,6 +1,13 @@
 package com.db.finki.www.build_board.controller.thread_controller;
 
+import com.db.finki.www.build_board.entity.blacklisted_user.BlacklistedUser;
+import com.db.finki.www.build_board.entity.entity_enum.Status;
+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.thread.Topic;
+import com.db.finki.www.build_board.entity.user_type.Moderator;
+import com.db.finki.www.build_board.service.BlacklistedUserService;
+import com.db.finki.www.build_board.service.BlacklistedUserType;
+import com.db.finki.www.build_board.service.ReportService;
 import com.db.finki.www.build_board.service.thread.impl.DiscussionService;
 import com.db.finki.www.build_board.service.thread.itf.TagService;
@@ -13,4 +20,8 @@
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import org.springframework.web.servlet.view.RedirectView;
+
+import java.util.List;
+import java.util.Map;
 
 @Controller
@@ -22,9 +33,23 @@
     private final DiscussionService discussionService;
     private final String DUPLICATE_TITTLE = "There already exists a topic with title";
-
-    public TopicController(TopicService topicService, TagService tagService, DiscussionService discussionService) {
+    private final ReportService reportService;
+    private final BlacklistedUserService  blacklistedUserService;
+
+    public TopicController(TopicService topicService, TagService tagService, DiscussionService discussionService, ReportService reportService, BlacklistedUserService blacklistedUserService) {
         this.topicService = topicService;
         this.tagService = tagService;
         this.discussionService = discussionService;
+        this.reportService = reportService;
+        this.blacklistedUserService = blacklistedUserService;
+    }
+
+    private String bootstartTopic(long topicId, Model model){
+        Topic t = topicService.getById((long)topicId);
+
+        model.addAttribute("topic", t);
+        model.addAttribute("tags", tagService.getAllNotUsed(t));
+        model.addAttribute("replies", discussionService.getByTopic(t.getId()));
+
+        return "show-topic";
     }
 
@@ -38,13 +63,17 @@
     @GetMapping("/{topic-id}")
     public String showTopic(@PathVariable(name = "topic-id") int topicId, Model model,
-            @RequestParam(required = false) Boolean duplicateTittle) {
+            @RequestParam(required = false) Boolean duplicateTittle,
+            @SessionAttribute(required = false) BBUser user) {
+
         if (duplicateTittle != null) {
             model.addAttribute("errMsg", "There already exists a thread with the same title in that parent");
         }
-        Topic t = topicService.getById((long)topicId);
-        model.addAttribute("topic", t);
-        model.addAttribute("tags", tagService.getAllNotUsed(t));
-        model.addAttribute("replies", discussionService.getByTopic(t.getId()));
-        return "show-topic";
+
+        if(user != null && blacklistedUserService.isBlacklisted(user.getId(), topicId)) {
+            return "blacklisted";
+        }
+
+        model.addAttribute("blacklisted", blacklistedUserService.findForTopic(topicId));
+        return bootstartTopic(topicId, model);
     }
 
@@ -87,4 +116,15 @@
     }
 
+    @PostMapping("{id}/report")
+    public String reportUser(
+            @PathVariable(name = "id") @P("topicId") long topicId,
+            @RequestParam String reason
+            , @SessionAttribute @P("user") BBUser user,
+            @RequestParam(name = "report-username") String reportingUser){
+
+        reportService.createReport(topicId,reason,user, reportingUser);
+        return "redirect:/topics/" + topicId;
+    }
+
     public String handleDuplicatedTitle(org.springframework.orm.jpa.JpaSystemException e,
             RedirectAttributes attr, String redirectPath) {
@@ -96,3 +136,70 @@
     }
 
+    @GetMapping("{id}/reports")
+    @PreAuthorize("@topicServiceImpl.getById(#topicId).user.id.equals(#user.id)")
+    public String getReports(@PathVariable(name = "id") @P("topicId") long topicId, Model model,
+            @RequestParam(required = false) Status status,
+            @RequestParam(required = false, name = "checkSearchLatest") String isSearForLatestActive,
+            @SessionAttribute @P("user") BBUser user
+                            ){
+       Topic t = topicService.getById(topicId);
+
+       model.addAttribute("topic", t);
+       model.addAttribute("reports", reportService.getByStatusAndProjectAndLatest(status,
+                       (int) topicId, isSearForLatestActive));
+
+       model.addAttribute("status", Status.values());
+       model.addAttribute("isSearForLatestActive", isSearForLatestActive);
+
+       return "show-reports";
+    }
+
+    @PostMapping("{id}/reports/{req-id}/accept")
+    @PreAuthorize("@topicServiceImpl.getById(#topicId).user.id.equals(#user.id)")
+    public RedirectView acceptRequest(
+            @PathVariable(name = "req-id") Integer reqId,
+            @PathVariable(name = "id") @P("topicId") long topicId,
+            @RequestParam(name = "feedback-desc") String feedbackDesc,
+            @SessionAttribute @P("user") BBUser user
+                                     ) {
+        reportService.accept(reqId, feedbackDesc, user);
+        return new RedirectView(
+                String.format("/topics/%s/reports", topicId)
+        );
+    }
+
+    @PostMapping("{id}/reports/{req-id}/deny")
+    @PreAuthorize("@topicServiceImpl.getById(#topicId).user.id.equals(#user.id)")
+    public RedirectView denyRequest(
+            @PathVariable(name = "req-id") Integer reqId,
+            @PathVariable(name = "id") @P("topicId") long topicId,
+            @RequestParam(name = "feedback-desc") String feedbackDesc,
+            @SessionAttribute @P("user") BBUser user
+                                   ) {
+        reportService.deny(reqId, feedbackDesc, user);
+        return new RedirectView(
+                String.format("/topics/%s/reports", topicId)
+        );
+    }
+
+    @GetMapping("{id}/blacklisted")
+    public String getBlacklistedUsers(@PathVariable(name = "id") long topicId, Model model){
+        Map<BlacklistedUserType, List<BlacklistedUser>> tmp = topicService.getBlacklistedUsersForTopicById(topicId);
+
+        model.addAttribute("current",  tmp.get(BlacklistedUserType.CURRENT));
+        model.addAttribute("previous",  tmp.get(BlacklistedUserType.PREVIOUS));
+
+        return "show-blacklisted-users";
+    }
+
+    @PostMapping("{id}/blacklisted/{userId}")
+    public RedirectView revokeBlacklistedUser(
+            @PathVariable(name = "id") long topicId,
+            @PathVariable(name = "userId") int blacklistedUserId
+                                             ){
+        blacklistedUserService.revoke(topicId,blacklistedUserId);
+        return new RedirectView(
+                String.format("/topics/%s/blacklisted", topicId)
+        );
+    }
 }
Index: src/main/java/com/db/finki/www/build_board/entity/blacklisted_user/BlacklistedUser.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/blacklisted_user/BlacklistedUser.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/java/com/db/finki/www/build_board/entity/blacklisted_user/BlacklistedUser.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,56 @@
+package com.db.finki.www.build_board.entity.blacklisted_user;
+
+import com.db.finki.www.build_board.entity.thread.Topic;
+import com.db.finki.www.build_board.entity.user_type.BBUser;
+import com.db.finki.www.build_board.entity.user_type.Moderator;
+import jakarta.persistence.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+@Entity
+@Getter
+@Setter
+@IdClass(BlacklistedUserId.class)
+public class BlacklistedUser {
+    @ManyToOne
+    @Id
+    @JoinColumn(name = "topic_id")
+    Topic topic;
+
+    @ManyToOne
+    @Id
+    @JoinColumn(name = "moderator_id")
+    Moderator moderator;
+
+    @Id
+    @Column(name = "start_date")
+    LocalDateTime startTime;
+
+    @ManyToOne
+    @Id
+    @JoinColumn(name = "user_id")
+    BBUser refersTo;
+
+    String reason;
+
+    @Column(name = "end_date")
+    LocalDateTime endTime;
+
+    public BlacklistedUser(
+            Topic topic,
+            Moderator moderator,
+            LocalDateTime startTime,
+            BBUser refersTo,
+            String reason
+                          ) {
+        setTopic(topic);
+        setModerator(moderator);
+        setStartTime(startTime);
+        setRefersTo(refersTo);
+        setReason(reason);
+    }
+
+    public BlacklistedUser(){}
+}
Index: src/main/java/com/db/finki/www/build_board/entity/blacklisted_user/BlacklistedUserId.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/blacklisted_user/BlacklistedUserId.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/java/com/db/finki/www/build_board/entity/blacklisted_user/BlacklistedUserId.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,14 @@
+package com.db.finki.www.build_board.entity.blacklisted_user;
+
+import com.db.finki.www.build_board.entity.thread.Topic;
+import com.db.finki.www.build_board.entity.user_type.BBUser;
+import com.db.finki.www.build_board.entity.user_type.Moderator;
+
+import java.time.LocalDateTime;
+
+public class BlacklistedUserId {
+    Topic topic;
+    Moderator moderator;
+    LocalDateTime startTime;
+    BBUser refersTo;
+}
Index: src/main/java/com/db/finki/www/build_board/entity/request/Report.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/request/Report.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/java/com/db/finki/www/build_board/entity/request/Report.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,38 @@
+package com.db.finki.www.build_board.entity.request;
+
+import com.db.finki.www.build_board.entity.entity_enum.Status;
+import com.db.finki.www.build_board.entity.thread.Topic;
+import com.db.finki.www.build_board.entity.user_type.BBUser;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Table;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+@Entity
+@Getter
+@Setter
+@NoArgsConstructor
+@Table(name = "report")
+public class Report extends Submission {
+    @ManyToOne
+    @JoinColumn(name = "for_user_id")
+    BBUser user;
+
+    @ManyToOne
+    @JoinColumn(name = "thread_id")
+    Topic topic;
+
+    public Report(Topic topic, BBUser creator, String description, BBUser misconductedUser) {
+        setDescription(description);
+        setCreator(creator);
+        setTopic(topic);
+        setStatus(Status.PENDING);
+        setCreatedAt(LocalDateTime.now());
+        setUser(misconductedUser);
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/entity/thread/Topic.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/thread/Topic.java	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/java/com/db/finki/www/build_board/entity/thread/Topic.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -1,4 +1,5 @@
 package com.db.finki.www.build_board.entity.thread;
 
+import com.db.finki.www.build_board.entity.blacklisted_user.BlacklistedUser;
 import com.db.finki.www.build_board.entity.thread.itf.NamedThread;
 import com.db.finki.www.build_board.entity.thread.multi_valued_attribute.Guideline;
@@ -26,8 +27,10 @@
     private Project parent;
 
+    @OneToMany(mappedBy = "topic")
+    private List<BlacklistedUser> blacklistedUsers;
+
     @Override
     public String getTypeName() {
         return "topics";
     }
-
 }
Index: src/main/java/com/db/finki/www/build_board/repository/BlacklistedUserRepo.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/BlacklistedUserRepo.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/java/com/db/finki/www/build_board/repository/BlacklistedUserRepo.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,35 @@
+package com.db.finki.www.build_board.repository;
+
+import com.db.finki.www.build_board.entity.blacklisted_user.BlacklistedUser;
+import com.db.finki.www.build_board.entity.blacklisted_user.BlacklistedUserId;
+import jakarta.transaction.Transactional;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+public interface BlacklistedUserRepo extends JpaRepository<BlacklistedUser, BlacklistedUserId> {
+    @Query(nativeQuery = true,
+    value = """
+        select exists(
+                select *
+                from blacklisted_user bu
+                where bu.end_date is NULL and bu.user_id=:userId and bu.topic_id = :topicId 
+        ) 
+    """)
+    boolean isUserInBlacklist(@Param("userId") long userId, @Param("topicId") long topicId);
+
+    @Modifying
+    @Transactional
+    @Query(nativeQuery = true,
+    value = """
+    update blacklisted_user
+    set end_date = now()
+    where topic_id=:topic and user_id = :user
+""")
+    void revoke(@Param("topic") long topicId, @Param("user") int blacklistedUserId);
+
+    List<BlacklistedUser> findAllByTopicId(Integer topicId);
+}
Index: src/main/java/com/db/finki/www/build_board/repository/ModeratorRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/ModeratorRepository.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/java/com/db/finki/www/build_board/repository/ModeratorRepository.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,7 @@
+package com.db.finki.www.build_board.repository;
+
+import com.db.finki.www.build_board.entity.user_type.Moderator;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface ModeratorRepository extends JpaRepository<Moderator,Integer> {
+}
Index: src/main/java/com/db/finki/www/build_board/repository/ReportRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/ReportRepository.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/java/com/db/finki/www/build_board/repository/ReportRepository.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,40 @@
+package com.db.finki.www.build_board.repository;
+
+import com.db.finki.www.build_board.entity.request.Report;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+public interface ReportRepository extends JpaRepository<Report, Long> {
+    @Query(value = """
+            select *
+            from report r 
+            join submission s 
+            on s.id = r.id
+            where (:latest is null or (s.created_by,s.created_at) IN ( select created_by,max(created_at) from submission r  group by created_by)) 
+                        and r.thread_id =:topicId
+                        and (:status is null or s.status=:status)
+            """,
+            nativeQuery = true
+    )
+    List<Report> getLatestRequestByTopicAndStatus(
+            @Param("topicId") Integer topicId,
+            @Param("status") String status,
+            @Param("latest") String forLatest
+                                                 );
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                        select * 
+                        from report r 
+                        join submission s 
+                        on s.id = r.id 
+                        where s.created_by = :user_id and (:status is null or s.status= :status) 
+                    """
+    )
+    List<Report> findAllBySendByUsernameAndStatus(@Param("user_id") long userId,
+            @Param("status") String status);
+}
Index: src/main/java/com/db/finki/www/build_board/service/BlacklistedUserService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/BlacklistedUserService.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/java/com/db/finki/www/build_board/service/BlacklistedUserService.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,29 @@
+package com.db.finki.www.build_board.service;
+
+import com.db.finki.www.build_board.entity.blacklisted_user.BlacklistedUser;
+import com.db.finki.www.build_board.repository.BlacklistedUserRepo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Service
+public class BlacklistedUserService {
+    private final BlacklistedUserRepo  blacklistedUserRepo;
+
+    public BlacklistedUserService(BlacklistedUserRepo blacklistedUserRepo) {this.blacklistedUserRepo = blacklistedUserRepo;}
+
+    public boolean isBlacklisted(long userId, long topicId) {
+        return blacklistedUserRepo.isUserInBlacklist(userId, topicId);
+    }
+
+    public void revoke(long topicId, int blacklistedUserId) {
+        blacklistedUserRepo.revoke(topicId,blacklistedUserId);
+    }
+
+    public Set<Integer> findForTopic(int topicId) {
+       return blacklistedUserRepo.findAllByTopicId(topicId).stream().map(b -> b.getRefersTo()
+               .getId()).collect(Collectors.toSet());
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/service/BlacklistedUserType.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/BlacklistedUserType.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/java/com/db/finki/www/build_board/service/BlacklistedUserType.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,6 @@
+package com.db.finki.www.build_board.service;
+
+public enum BlacklistedUserType {
+    CURRENT,
+    PREVIOUS
+}
Index: src/main/java/com/db/finki/www/build_board/service/ReportService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/ReportService.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/java/com/db/finki/www/build_board/service/ReportService.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,137 @@
+package com.db.finki.www.build_board.service;
+
+import com.db.finki.www.build_board.entity.blacklisted_user.BlacklistedUser;
+import com.db.finki.www.build_board.entity.entity_enum.FeedbackFor;
+import com.db.finki.www.build_board.entity.entity_enum.Status;
+import com.db.finki.www.build_board.entity.request.ProjectRequests;
+import com.db.finki.www.build_board.entity.request.Report;
+import com.db.finki.www.build_board.entity.thread.Project;
+import com.db.finki.www.build_board.entity.thread.Topic;
+import com.db.finki.www.build_board.entity.user_type.BBUser;
+import com.db.finki.www.build_board.entity.user_type.Moderator;
+import com.db.finki.www.build_board.repository.BlacklistedUserRepo;
+import com.db.finki.www.build_board.repository.ModeratorRepository;
+import com.db.finki.www.build_board.repository.ReportRepository;
+import com.db.finki.www.build_board.service.request.FeedbackService;
+import com.db.finki.www.build_board.service.thread.itf.TopicService;
+import org.apache.coyote.Request;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class ReportService {
+    private final ReportRepository reportRepository;
+    private final TopicService topicService;
+    private final UserDetailsService userDetailsService;
+    private final FeedbackService feedbackService;
+    private final BlacklistedUserRepo blacklistedUserRepo;
+    private final ModeratorRepository moderatorRepository;
+
+
+    public ReportService(
+            ReportRepository reportRepository, TopicService topicService,
+            UserDetailsService userDetailsService, FeedbackService feedbackService,
+            BlacklistedUserRepo blacklistedUserRepo, ModeratorRepository moderatorRepository
+                        ) {
+        this.reportRepository = reportRepository;
+        this.topicService = topicService;
+        this.userDetailsService = userDetailsService;
+        this.feedbackService = feedbackService;
+        this.blacklistedUserRepo = blacklistedUserRepo;
+        this.moderatorRepository = moderatorRepository;
+    }
+
+    public void createReport(
+            long topicId, String reason, BBUser creator,
+            String reportingUsername
+                            ) {
+        Topic topic = topicService.getById(topicId);
+        BBUser reportedUser = (BBUser) userDetailsService.loadUserByUsername(reportingUsername);
+
+        if(blacklistedUserRepo.isUserInBlacklist(reportedUser.getId(), topicId)){
+            return;
+        }
+
+        reportRepository.save(
+                new Report(topic,
+                        creator,
+                        reason,
+                        reportedUser)
+                             );
+    }
+
+    public List<Report> getByStatusAndProjectAndLatest(
+            Status status, Integer topicId,
+            String isLatest
+                                                      ) {
+        return reportRepository.getLatestRequestByTopicAndStatus(
+                topicId,
+                status == null ? null : status.name(),
+                isLatest
+                                                                );
+    }
+
+    @Transactional
+    public void accept(long reqId, String feedbackDesc, BBUser moderatorAsAUser) {
+        Report reqForReqId =
+                reportRepository
+                        .findById(reqId)
+                        .orElseThrow(() -> new RuntimeException("The id " +
+                                "is invalid"));
+        String reason = reqForReqId.getDescription();
+        Moderator moderator =
+                moderatorRepository
+                        .findById(moderatorAsAUser.getId())
+                        .orElseThrow(() -> new RuntimeException("The user is not a moderator"));
+
+        reqForReqId.setStatus(Status.ACCEPTED);
+
+        feedbackService.create(
+                feedbackDesc,
+                moderator,
+                FeedbackFor.R,
+                reqForReqId
+                              );
+
+        blacklistedUserRepo.save(
+                new BlacklistedUser(
+                        reqForReqId.getTopic(),
+                        moderator,
+                        LocalDateTime.now(),
+                        reqForReqId.getUser(),
+                        reason
+                )
+                                );
+    }
+
+    @Transactional
+    public void deny(long reqId, String feedbackDesc, BBUser creator) {
+        Report report =
+                reportRepository
+                        .findById(reqId)
+                        .orElseThrow(() -> new RuntimeException("The " +
+                                "report doesn't exist"));
+        report.setStatus(Status.DENIED);
+
+        feedbackService.create(
+                feedbackDesc,
+                creator,
+                FeedbackFor.R,
+                report);
+
+        reportRepository.save(report);
+    }
+
+    public List<Report> getByStatusAndUser(Status status, BBUser byUser) {
+        return reportRepository.findAllBySendByUsernameAndStatus(byUser.getId(),
+                Optional
+                        .ofNullable(status)
+                        .map(Status::name)
+                        .orElse(null));
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/service/request/ProjectRequestService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/request/ProjectRequestService.java	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/java/com/db/finki/www/build_board/service/request/ProjectRequestService.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -31,4 +31,5 @@
     }
 
+    @Transactional
     public void deny(Integer reqId, String desc, BBUser creator) {
         ProjectRequests prReq = getRequestById(reqId);
Index: src/main/java/com/db/finki/www/build_board/service/thread/impl/TopicServiceImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/thread/impl/TopicServiceImpl.java	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/java/com/db/finki/www/build_board/service/thread/impl/TopicServiceImpl.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -1,4 +1,5 @@
 package com.db.finki.www.build_board.service.thread.impl;
 
+import com.db.finki.www.build_board.entity.blacklisted_user.BlacklistedUser;
 import com.db.finki.www.build_board.entity.thread.Project;
 import com.db.finki.www.build_board.entity.user_type.BBUser;
@@ -8,9 +9,14 @@
 import com.db.finki.www.build_board.repository.thread.TagRepository;
 import com.db.finki.www.build_board.repository.thread.TopicRepository;
+import com.db.finki.www.build_board.service.BlacklistedUserType;
 import com.db.finki.www.build_board.service.thread.itf.TopicService;
 import jakarta.transaction.Transactional;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @Service
@@ -28,15 +34,15 @@
     public Topic create(String title, String description, BBUser user) {
         Topic topic = new Topic();
-        
+
         topic.setTitle(title);
         topic.setContent(description);
         topic.setUser(user);
-        
+
         return topicRepository.save(topic);
     }
 
-    public Topic create(String title, String description, BBUser user, Project parent){
+    public Topic create(String title, String description, BBUser user, Project parent) {
         Topic topic = new Topic();
-        
+
         topic.setTitle(title);
         topic.setContent(description);
@@ -69,5 +75,7 @@
     @Override
     public Topic getById(Long id) {
-        return topicRepository.findById(id).orElse(null);
+        return topicRepository
+                .findById(id)
+                .orElse(null);
     }
 
@@ -75,16 +83,28 @@
     @Transactional
     public void addTagToTopic(Topic topic, String tagName, BBUser user) {
-        tagRepository.findByName(tagName).ifPresentOrElse(tag -> {
-            topic.getTags().add(tag);
-            tag.getThreads().add(topic);
-            topicRepository.save(topic);
-            tagRepository.save(tag);
-        },() -> {
-            Tag tag = new Tag(tagName,user);
-            tagRepository.save(tag);
-            topic.getTags().add(tag);
-            tag.getThreads().add(topic);
-            topicRepository.save(topic);
-        });
+        tagRepository
+                .findByName(tagName)
+                .ifPresentOrElse(tag -> {
+                            topic
+                                    .getTags()
+                                    .add(tag);
+                            tag
+                                    .getThreads()
+                                    .add(topic);
+                            topicRepository.save(topic);
+                            tagRepository.save(tag);
+                        },
+                        () -> {
+                            Tag tag = new Tag(tagName,
+                                    user);
+                            tagRepository.save(tag);
+                            topic
+                                    .getTags()
+                                    .add(tag);
+                            tag
+                                    .getThreads()
+                                    .add(topic);
+                            topicRepository.save(topic);
+                        });
     }
 
@@ -100,8 +120,23 @@
     public Topic deleteTagFromTopic(long id, String tagName) {
         Topic t = getById(id);
-        boolean removed = t.getTags().removeIf(tag -> tag.getName().equals(tagName));
-        if(!removed) throw new IllegalArgumentException("Tag not found");
+        boolean removed = t
+                .getTags()
+                .removeIf(tag -> tag
+                        .getName()
+                        .equals(tagName));
+        if (!removed) throw new IllegalArgumentException("Tag not found");
         return topicRepository.save(t);
     }
 
+    public Map<BlacklistedUserType, List<BlacklistedUser>> getBlacklistedUsersForTopicById(long id) {
+        return topicRepository
+                .findById(id)
+                .getBlacklistedUsers()
+                .stream()
+                .collect(Collectors.groupingBy(
+                        b -> b.getEndTime() == null
+                                ? BlacklistedUserType.CURRENT
+                                : BlacklistedUserType.PREVIOUS
+                                              ));
+    }
 }
Index: src/main/java/com/db/finki/www/build_board/service/thread/itf/TopicService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/thread/itf/TopicService.java	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/java/com/db/finki/www/build_board/service/thread/itf/TopicService.java	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -1,10 +1,14 @@
 package com.db.finki.www.build_board.service.thread.itf;
 
+import com.db.finki.www.build_board.entity.blacklisted_user.BlacklistedUser;
 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.thread.BBThread;
 import com.db.finki.www.build_board.entity.thread.Topic;
+import com.db.finki.www.build_board.service.BlacklistedUserType;
 
 import java.util.List;
+import java.util.Map;
+
 public interface TopicService {
     Topic create(String title, String description, BBUser user);
@@ -18,3 +22,4 @@
     Topic edit(Topic t, String title, String description);
     Topic deleteTagFromTopic(long id, String tagName);
+    Map<BlacklistedUserType,List<BlacklistedUser>> getBlacklistedUsersForTopicById(long id);
 }
Index: src/main/resources/db/migration/V1__init_ddl.sql
===================================================================
--- src/main/resources/db/migration/V1__init_ddl.sql	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/resources/db/migration/V1__init_ddl.sql	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -22,5 +22,5 @@
 DROP TABLE IF EXISTS project_roles CASCADE;
 DROP TABLE IF EXISTS users_project_roles CASCADE;
-DROP TABLE IF EXISTS role_permissions CASCADE;
+DROP TABLE IF EXISTS project_roles_permissions CASCADE;
 DROP TABLE IF EXISTS project_request CASCADE;
 DROP TABLE IF EXISTS report CASCADE;
Index: src/main/resources/db/migration/V2__triggers_ddl.sql
===================================================================
--- src/main/resources/db/migration/V2__triggers_ddl.sql	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/resources/db/migration/V2__triggers_ddl.sql	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -183,4 +183,39 @@
 $$;
 
+CREATE OR REPLACE FUNCTION fn_change_status_on_pending_reports()
+    RETURNS TRIGGER
+    LANGUAGE plpgsql
+AS $$
+BEGIN
+    RAISE NOTICE 'user_id: %, topic_id: %', NEW.user_id, NEW.topic_id;
+
+UPDATE submission
+SET status = 'ACCEPTED'
+WHERE id in (
+    select id
+    from report r
+    where r.for_user_id = NEW.user_id and r.thread_id = NEW.topic_id
+);
+
+RETURN NEW;
+END;
+$$;
+
+create or replace function fn_add_blacklisted_user()
+RETURNS trigger
+LANGUAGE plpgsql
+AS $$
+BEGIN
+	IF NOT EXISTS(
+		select 1
+		from blacklisted_user
+		where  topic_id = NEW.topic_id and user_id = NEW.user_id and end_date is NULL
+	)
+	THEN
+		RETURN NEW;
+END IF;
+RETURN NULL;
+END;
+$$;
 
 ------------------------------------------------------------
@@ -196,5 +231,5 @@
     FOR EACH ROW
 EXECUTE FUNCTION fn_insert_topics_creator_as_moderator();
-----
+
 CREATE OR REPLACE TRIGGER tr_remove_orphan_moderator --RADI
     AFTER DELETE
@@ -203,5 +238,4 @@
 EXECUTE FUNCTION fn_remove_orphan_moderator();
 
-
 CREATE OR REPLACE TRIGGER tr_a_insert_project_manager --RADI
     AFTER INSERT
@@ -232,10 +266,4 @@
 execute function fn_aa_rm_orphan_dics();
 
-create or replace trigger tr_rm_orphan_disc
-    after delete
-    on topic_thread
-    for each row
-execute function fn_aa_rm_orphan_dics();
-
 create or replace trigger tr_add_project_resource_channel
     before insert
@@ -243,2 +271,13 @@
     for each row
 execute function fn_add_project_resource();
+
+create or replace trigger tr_add_blacklisted_user
+before insert on blacklisted_user
+for each row
+execute function fn_add_blacklisted_user();
+
+CREATE OR REPLACE TRIGGER tr_change_status_on_pending_reports
+    AFTER INSERT
+    ON blacklisted_user
+    FOR EACH ROW
+EXECUTE FUNCTION fn_change_status_on_pending_reports();
Index: src/main/resources/templates/blacklisted.html
===================================================================
--- src/main/resources/templates/blacklisted.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/resources/templates/blacklisted.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0">
+    <title>
+        Add
+        Topic</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"
+          rel="stylesheet">
+    <style>
+        .error-bubble {
+            display: inline-block;
+            background-color: #dc3545; /* Bootstrap danger color */
+            color: white;
+            padding: 10px 15px;
+            border-radius: 20px;
+            font-weight: bold;
+            box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.2);
+        }
+    </style>
+</head>
+<body>
+<div th:replace="/home_pages/home :: navigation"></div>
+<main class="d-flex vh-100 justify-content-center align-items-center">
+    <h1 class="text-center">
+        The moderators have blacklisted you from this site
+    </h1>
+</main>
+</body>
Index: src/main/resources/templates/fragments/discussion.html
===================================================================
--- src/main/resources/templates/fragments/discussion.html	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/resources/templates/fragments/discussion.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -1,11 +1,15 @@
-<th:object th:fragment="discussion(reply_cont)" th:each="reply : ${reply_cont}">
+<th:object
+        th:fragment="discussion(reply_cont, blacklisted, ownerId)"
+        th:each="reply : ${reply_cont}">
     <div
-         class="card shadow-sm mt-4 d-flex"
-         th:style="'margin-left: ' + (${reply.depth + 1} * 5) + '%'"
+            class="card shadow-sm mt-4 d-flex"
+            th:style="'margin-left: ' + (${reply.depth + 1} * 5) + '%'"
     >
         <div class="card-header bg-light d-flex justify-content-between align-items-center"
              th:id="${reply.getId() + '/' + reply.getUser().getUsername()}">
             <div class="d-flex align-items-center w-100">
-                <img th:src="${reply.getAvatarUrl()}" alt="Profile Picture" id="profileImage"
+                <img th:src="${reply.getAvatarUrl()}"
+                     alt="Profile Picture"
+                     id="profileImage"
                      class="rounded-circle border border-1 border-info me-3"
                      style="width: 3rem; height: 3rem; object-fit: cover; vertical-align: middle;">
@@ -16,5 +20,4 @@
                      <strong th:text="'Replying to:  ' + ${reply.getDiscussion().getParent().getUser().getUsername()}"></strong>
                 </span>
-
             </div>
             <div th:if="${session.user != null && session.user.getId() == reply.getUser().getId()}"
@@ -23,5 +26,6 @@
                 <div>
                     <button class="btn  btn-warning btn-sm edit-reply-btn"
-                            th:attr="data-reply-id=${reply.getDiscussion().getId()}">Edit
+                            th:attr="data-reply-id=${reply.getDiscussion().getId()}">
+                        Edit
                     </button>
                 </div>
@@ -29,13 +33,33 @@
                 <div>
                     <form th:action="@{/topics/{topic-id}/discussions/{discussionId}/delete(topic-id=${topic.getId()
-                    },discussionId=${reply.getId()})}" method="post">
-                        <input type="hidden" name="threadId" th:value="${reply.getDiscussion().getId()}" class="w-0">
+                    },discussionId=${reply.getId()})}"
+                          method="post">
+                        <input type="hidden"
+                               name="threadId"
+                               th:value="${reply.getDiscussion().getId()}"
+                               class="w-0">
                         <button class="btn btn-danger btn-sm edit-delete-btn ms-2"
-                                th:attr="data-reply-id=${reply.getDiscussion().getId()}">Delete
+                                th:attr="data-reply-id=${reply.getDiscussion().getId()}">
+                            Delete
                         </button>
-                        <input th:if="${session.user!=null}" type="hidden" name="username"
+                        <input th:if="${session.user!=null}"
+                               type="hidden"
+                               name="username"
                                th:value="${session.user.username}"/>
                     </form>
                 </div>
+            </div>
+            <div th:if="${session.user != null
+             and !session.user.getId().equals(reply.getDiscussion().getUser().getId())
+             and !blacklisted.contains(reply.getDiscussion().getUser().getId())
+             and !ownerId.equals(reply.getDiscussion().getUser().getId())}">
+                <button type="button"
+                        class="btn btn-danger btn-sm edit-delete-btn ms-2 report-btn"
+                        th:data-username="${reply.getDiscussion().getUser().getUsername()}"
+                        th:if="${!reply.getUser().getUsername().equals(session.user.getUsername())}"
+                        data-bs-toggle="modal"
+                        data-bs-target="#reportModal">
+                    Report
+                </button>
             </div>
         </div>
@@ -43,18 +67,39 @@
         <!-- Reply content -->
         <div class="card-body">
-            <div th:attr="data-reply-id=${reply.getDiscussion().getId()}" class="reply-content">
-                <p th:text="${reply.getDiscussion().getContent()}">Reply content goes here.</p>
+            <div th:attr="data-reply-id=${reply.getDiscussion().getId()}"
+                 class="reply-content">
+                <p th:text="${reply.getDiscussion().getContent()}">
+                    Reply
+                    content
+                    goes
+                    here.</p>
             </div>
-            <div class="d-none edit-reply" th:attr="data-reply-id=${reply.getDiscussion().getId()}">
+            <div class="d-none edit-reply"
+                 th:attr="data-reply-id=${reply.getDiscussion().getId()}">
                 <form th:action="@{/topics/{topic-id}/discussions/{replyId}/edit(topic-id=${topic.getId()},replyId=${reply.getId()})}"
                       method="post">
-                    <input type="hidden" name="replyId" th:value="${reply.getDiscussion().getId()}">
-                    <textarea name="content" th:text="${reply.getDiscussion().getContent()}" class="form-control"
-                              rows="3" placeholder="Write your reply here"></textarea>
+                    <input type="hidden"
+                           name="replyId"
+                           th:value="${reply.getDiscussion().getId()}">
+                    <textarea
+                            name="content"
+                            th:text="${reply.getDiscussion().getContent()}"
+                            class="form-control"
+                            rows="3"
+                            placeholder="Write your reply here"></textarea>
 
-                    <button type="submit" class="btn btn-sm btn-success mt-2">Save Changes</button>
-                    <button type="button" class="close-edit-btn btn btn-sm btn-danger mt-2"
-                            th:attr="data-reply-id=${reply.getDiscussion().getId()}">Cancel</button>
-                    <input th:if="${session.user!=null}" type="hidden" name="username"
+                    <button type="submit"
+                            class="btn btn-sm btn-success mt-2">
+                        Save
+                        Changes
+                    </button>
+                    <button type="button"
+                            class="close-edit-btn btn btn-sm btn-danger mt-2"
+                            th:attr="data-reply-id=${reply.getDiscussion().getId()}">
+                        Cancel
+                    </button>
+                    <input th:if="${session.user!=null}"
+                           type="hidden"
+                           name="username"
                            th:value="${session.user.username}"/>
                 </form>
@@ -65,18 +110,29 @@
             <div class="d-flex justify-content-between align-items-center mt-3 pt-3">
                 <div class="d-flex flex-row">
-                    <form th:action="@{/threads/{thread-id}/like(thread-id=${reply.getId()})}" method="post">
-                        <input name="topic-id" type="hidden" th:value="${topic.getId()}">
+                    <form th:action="@{/threads/{thread-id}/like(thread-id=${reply.getId()})}"
+                          method="post">
+                        <input name="topic-id"
+                               type="hidden"
+                               th:value="${topic.getId()}">
                         <button th:if="${session.user!=null}"
-                                type="submit" class="btn btn-outline-success btn-sm me-2 like-button"
+                                type="submit"
+                                class="btn btn-outline-success btn-sm me-2 like-button"
                                 th:attr="data-reply-id=${reply.getDiscussion().getId()}">
-                            👍 Like (<span th:text="${reply.getDiscussion().getNumLikes()}">0</span>)
+                            👍
+                            Like
+                            (<span
+                                th:text="${reply.getDiscussion().getNumLikes()}">0</span>)
                         </button>
                     </form>
-                    <form th:action="@{/threads/{thread-id}/dislike(thread-id=${reply.getId()})}" method="post">
-                        <input type="hidden" name="topic-id" th:value="${topic.getId()}">
+                    <form th:action="@{/threads/{thread-id}/dislike(thread-id=${reply.getId()})}"
+                          method="post">
+                        <input type="hidden"
+                               name="topic-id"
+                               th:value="${topic.getId()}">
                         <button th:if="${session.user!=null}"
                                 class="btn btn-outline-danger btn-sm dislike-button"
                                 th:attr="data-reply-id=${reply.getDiscussion().getId()}">
-                            👎 Dislike
+                            👎
+                            Dislike
                         </button>
                     </form>
@@ -85,5 +141,6 @@
                     <button th:if="${session.user!=null}"
                             class="btn btn-info btn-sm reply-button"
-                            th:attr="data-reply-id=${reply.getDiscussion().getId()}">Reply
+                            th:attr="data-reply-id=${reply.getDiscussion().getId()}">
+                        Reply
                     </button>
                 </div>
@@ -93,17 +150,31 @@
 
         <!-- Add Reply Card Hidden -->
-        <div th:attr="data-reply-id=${reply.getDiscussion().getId()}" class="card-body d-none reply-body">
-            <form th:action="@{/topics/{topic-id}/discussions/add(topic-id=${topic.getId()})}" method="post">
+        <div th:attr="data-reply-id=${reply.getDiscussion().getId()}"
+             class="card-body d-none reply-body">
+            <form th:action="@{/topics/{topic-id}/discussions/add(topic-id=${topic.getId()})}"
+                  method="post">
                 <div class="mb-3">
-                    <label class="form-label">Your Reply</label>
-                    <textarea name="content" class="form-control" rows="3" placeholder="Write your reply here"
-                              required></textarea>
+                    <label class="form-label">Your
+                        Reply</label>
+                    <textarea
+                            name="content"
+                            class="form-control"
+                            rows="3"
+                            placeholder="Write your reply here"
+                            required></textarea>
                 </div>
                 <div class="d-flex justify-content-between">
-                    <input type="hidden" th:value="${reply.getId()}" name="parentId">
-                    <button type="submit" class="btn btn-success w-10 ms-2">Post Reply</button>
+                    <input type="hidden"
+                           th:value="${reply.getId()}"
+                           name="parentId">
+                    <button type="submit"
+                            class="btn btn-success w-10 ms-2">
+                        Post
+                        Reply
+                    </button>
                     <div class="d-flex justify-content-end reply-cancel">
                         <button class="btn btn-danger btn-sm reply-cancel w-10 me-2"
-                                th:attr="data-reply-id=${reply.getDiscussion().getId()}">Cancel
+                                th:attr="data-reply-id=${reply.getDiscussion().getId()}">
+                            Cancel
                         </button>
                     </div>
@@ -112,4 +183,4 @@
         </div>
     </div>
-    <div th:replace="~{/fragments/discussion :: discussion(reply_cont=${reply.getChildren()})}"></div>
+    <div th:replace="~{/fragments/discussion :: discussion(reply_cont=${reply.getChildren()},blacklisted=${blacklisted},ownerId=${ownerId})}"></div>
 </th:object>
Index: src/main/resources/templates/fragments/user_fields.html
===================================================================
--- src/main/resources/templates/fragments/user_fields.html	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/resources/templates/fragments/user_fields.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -27,5 +27,4 @@
        <input type="hidden" name="cur_user_username"
               th:value="${session.user == null} ? '' : ${session.user.getUsername()}">
-       <a th:href="@{/{username}/project-requests(username=${username})}">View project requests</a>
        <button th:if="${canEdit}" class="btn btn-success btn-sm w-50 align-self-center">Save changes
        </button>
Index: src/main/resources/templates/home_pages/public-profile.html
===================================================================
--- src/main/resources/templates/home_pages/public-profile.html	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/resources/templates/home_pages/public-profile.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -112,4 +112,13 @@
                 <h5>Projects worked in:</h5>
               </div>
+              <a th:href="@{/{username}/project-requests(username=${username})}"
+                 class="btn btn-info btn-md me-2 mt-4">
+                View project requests
+              </a>
+              <a th:href="@{/{username}/reports(username=${username})}"
+                 class="btn btn-info btn-md mt-4">
+                View submitted reports
+              </a>
+            </div>
             </div>
           </div>
Index: src/main/resources/templates/project_pages/requests/show-requests.html
===================================================================
--- src/main/resources/templates/project_pages/requests/show-requests.html	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/resources/templates/project_pages/requests/show-requests.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -70,8 +70,7 @@
             </div>
             <div class="card-footer"
-                 th:if="${req.getStatus().name().equals('DENIED')}"
+                 th:if="${req.getFeedback() != null}"
             >
                 <button type="button"
-                        th:if="${req.getStatus().name().equals('DENIED')}"
                         class="btn-feedback-open btn btn-success">View feedback
                 </button>
Index: src/main/resources/templates/show-blacklisted-users.html
===================================================================
--- src/main/resources/templates/show-blacklisted-users.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/resources/templates/show-blacklisted-users.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<head>
+    <meta charset="UTF-8">
+    <title>
+        Reports</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"
+          rel="stylesheet">
+</head>
+<body>
+<header>
+    <div th:replace="/home_pages/home :: navigation"></div>
+</header>
+<main class="d-flex align-items-center mt-5 flex-column">
+    <div class="list-group w-75">
+        <h1 class="text-center">
+            Latest</h1>
+        <div class="row fs-4"
+             th:if="${!#lists.isEmpty(current)}">
+            <div class="col"></div>
+            <div class="col-auto "
+                 style="width: 7em">
+                <span>Start time</span>
+            </div>
+        </div>
+        <div class="list-group-item d-flex gap-2 justify-content-between align-items-center ps-4 pe-4 flex-wrap"
+             th:each="blacklisted : ${current}">
+            <div class="w-100 d-flex flex-row justify-content-between">
+                <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="${blacklisted.getRefersTo().getAvatarUrl()}">
+                    <h5 class="mb-1 d-flex">
+                        <a th:href="@{/{username}/profile (username=${blacklisted.getRefersTo().getUsername()})}"
+                           th:text="${blacklisted.getRefersTo().getUsername()}"
+                           class="text-decoration-none"
+                        ></a>
+                        </a>
+                    </h5>
+                </div>
+                <div class="d-flex gap-3 align-items-center">
+                    <p style="cursor: pointer;"
+                       class="show-reason text-decoration-underline mb-0"
+                       th:if="${!blacklisted.getReason().isBlank()}">
+                        Reason</p>
+                    <form method="post"
+                          th:action="@{/topics/{id}/blacklisted/{userId}(
+          id=${blacklisted.topic.getId()},
+          userId=${blacklisted.getRefersTo().getId()}
+      )}">
+                        <button class="btn btn-outline-danger btn-sm px-3">
+                            <i class="bi bi-x-circle me-1"></i>
+                            Revoke
+                        </button>
+                    </form>
+                    <p class="mb-0"
+                       th:text="${#temporals.format(blacklisted.getStartTime(), 'dd MMM yyyy')}"
+                       style="width: 7em">
+                        Start
+                        time</p>
+                </div>
+            </div>
+            <div th:if="${!blacklisted.getReason().isBlank()}"
+                 style="display: none"
+                 class="reason w-100 mt-3">
+                <h3>
+                    Reason:</h3>
+                <p th:text="${blacklisted.getReason()}"></p>
+            </div>
+        </div>
+    </div>
+    <div class="mt-2 w-75">
+        <h1 class="text-center mb-0 mt-2">
+            Previous</h1>
+        <div class="list-group w-full">
+            <div class="d-flex fs-4 justify-content-end">
+                <span style="margin-right: 1em">Start time</span>
+                <span style="margin-right: 2em">End time</span>
+            </div>
+            <div class="list-group-item d-flex gap-2 justify-content-between align-items-center ps-4 pe-4 flex-wrap"
+                 th:each="prev : ${previous}">
+                <div class="w-100 d-flex flex-row justify-content-between">
+                    <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="${prev.getRefersTo().getAvatarUrl()}">
+                        <h5 class="mb-1 d-flex">
+                            <a th:href="@{/{username}/profile (username=${prev.getRefersTo().getUsername()})}"
+                               th:text="${prev.getRefersTo().getUsername()}"
+                               class="text-decoration-none"
+                            ></a>
+                        </h5>
+                    </div>
+                    <div class="d-flex gap-3 align-items-center">
+                        <p style="cursor: pointer"
+                           class="show-reason text-decoration-underline mb-0"
+                           th:if="${!prev.getReason().isBlank()}">
+                            Reason</p>
+                        <p class="mb-0"
+                           style="width: 7em"
+                           th:text="${#temporals.format(prev.getStartTime(), 'dd MMM yyyy')}">
+                            Start
+                            time</p>
+                        <p class="mb-0"
+                           style="width: 7em"
+                           th:text="${#temporals.format(prev.getEndTime(), 'dd MMM yyyy')}">
+                            End
+                            time</p>
+                    </div>
+                </div>
+                <div th:if="${!prev.getReason().isBlank()}"
+                     style="display: none"
+                     class="reason w-100 mt-3">
+                    <h3>
+                        Reason:</h3>
+                    <p th:text="${prev.getReason()}"></p>
+                </div>
+            </div>
+        </div>
+    </div>
+</main>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
+<script>
+    document.addEventListener("click", ev => {
+        const target = ev.target
+        if (target == null) return
+        else if (target.classList.contains("show-reason")) {
+            target.classList.remove("show-reason")
+
+            const feedbackContainer = target.parentElement.parentElement.parentElement.querySelector('.reason')
+            feedbackContainer.style.display = 'block'
+
+            target.innerText = 'Less'
+            target.classList.add("show-less")
+        } else if (target.classList.contains("show-less")) {
+            target.classList.remove("show-less")
+
+            const feedbackContainer = target.parentElement.parentElement.parentElement.querySelector('.reason')
+            feedbackContainer.style.display = 'none'
+
+            target.innerText = 'Reason'
+            target.classList.add("show-reason")
+        }
+    })
+</script>
+</body>
Index: src/main/resources/templates/show-reports.html
===================================================================
--- src/main/resources/templates/show-reports.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/resources/templates/show-reports.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,221 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>
+        Requests</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"
+          rel="stylesheet">
+</head>
+<body>
+<header>
+    <div th:replace="/home_pages/home :: navigation"></div>
+</header>
+<section
+        class="d-flex mt-3 flex-column w-100 align-items-center mt-5">
+    <form method="get"
+          th:action="@{/topics/{id}/reports(id=${topic.getId()})}"
+          class="d-flex flex-row gap-2 align-items-center"
+          style="width:fit-content">
+        <label for="status-query">Filter
+            by
+            status:</label>
+        <select id="status-query"
+                name="status"
+                class="form-select form-select-sm w-auto">
+            <option
+                    th:each="st:${status}"
+                    th:text="${st}"
+                    th:value="${st}"
+            ></option>
+            <option value=""
+                    selected>
+                All
+            </option>
+        </select>
+        <label>
+            <input type="checkbox"
+                   th:checked="${isSearForLatestActive != null}"
+                   th:value="y"
+                   name="checkSearchLatest">
+            Show
+            only
+            latest
+            request
+        </label>
+        <button class="btn btn-primary">
+            Search
+        </button>
+    </form>
+</section>
+<main class="d-flex justify-content-center mt-5 align-items-center flex-column ">
+    <div class="card shadow-sm mb-4 w-75"
+         th:each="req:${reports}"
+    >
+        <div class="card-header  text-white d-flex justify-content-between align-items-center"
+             th:with="st=${req.getStatus()}"
+             th:classappend="${st.name() == 'PENDING' ? 'bg-warning' : (st.name() == 'DENIED' ? 'bg-danger' : 'bg-info')}"
+        >
+            <h3 th:text="|About ${req.getUser().getUsername()}|">
+                Creator
+                of
+                request</h3>
+            <h3 class="fs-6 ">
+                <span>Status:</span>
+                <span
+                        th:text="${#strings.capitalize(req.getStatus().name().toLowerCase())}"></span>
+            </h3>
+        </div>
+        <div class="d-flex flex-column gap-3 justify-content-between card-body">
+            <div>
+                <h4>
+                    Description</h4>
+                <p th:text="${req.getDescription()}">
+                    Description
+                    of
+                    the
+                    project
+                    goes
+                    here.</p>
+                <p th:text="|Submitted on: ${#temporals.format(req.getCreatedAt(), 'dd/MM/yyyy HH:mm')}|"></p>
+                <p>
+                    <span>Created by:</span>
+                    <span class="fw-bold"
+                          th:text="${req.getCreator().getUsername()}">Created by</span>
+                </p>
+            </div>
+            <!--            Tuka moderator -->
+            <!--                        th:attr="data-pr-title=${project.getTitle()}, data-req-id=${req.getId()}"-->
+
+            <div th:if="${req.getStatus().name().equals('PENDING') &&  session.user != null && session.user.getId() == topic.getUser().getId()}"
+                 class="card-footer d-flex flex-row gap-3">
+                <button type="button"
+                        class="btn btn-success accept-btn footer-btn"
+                        th:attr="data-topic-id=${req.getTopic().getId()}, data-req-id=${req.getId()}"
+                        data-bs-toggle="modal"
+                        data-bs-target="#modal"
+                >
+                    Accept
+                </button>
+                <button type="button"
+                        class="btn btn-danger deny-btn footer-btn"
+                        th:attr="data-topic-id=${req.getTopic().getId()}, data-req-id=${req.getId()}"
+                        data-bs-toggle="modal"
+                        data-bs-target="#modal"
+                >
+                    Deny
+                </button>
+            </div>
+            <div class="card-footer" th:if="${req.getFeedback() != null}">
+                <button type="button"
+                        class="btn-feedback-open btn btn-success">
+                    View
+                    feedback
+                </button>
+                <div th:if="${req.getFeedback()!=null && req.getFeedback().getDescription()!=null}"
+                     th:with="feed=${req.getFeedback()}"
+                     class="feedback d-flex flex-column gap-2 invisible"
+                     style="height: 0">
+                    <h5>
+                        Feedback</h5>
+                    <p th:text="${feed==null ? '' : (feed.getDescription() == null ? '' : feed.getDescription()) }"></p>
+                    <p>
+                        <span>Submitted at:</span>
+                        <span th:text="${feed != null ? #temporals.format(feed.getCreatedAt(), 'dd/MM/yyyy  HH:mm')  : ''}"></span>
+                    <div class="w-100 d-flex justify-content-end">
+                        <button type="button"
+                                class="btn-feedback-close btn-danger btn">
+                            Close
+                        </button>
+                    </div>
+                </div>
+                <p th:if="${req.getFeedback() != null && req.getFeedback().getDescription()==null}"
+                   th:text="|Accepted on: ${#temporals.format(req.getFeedback().getCreatedAt(), 'dd/MM/yyyy  HH:mm')}|"></p>
+            </div>
+        </div>
+        <div class="modal fade"
+             id="modal"
+             data-bs-backdrop="static"
+             data-bs-keyboard="false"
+             tabindex="-1"
+             aria-labelledby="staticBackdropLabel"
+             aria-hidden="true"
+        >
+            <form method="post"
+                  id="modal-form">
+                <div class="modal-dialog">
+                    <div class="modal-content">
+                        <div class="modal-header">
+                            <h1 class="modal-title fs-5"
+                                id="staticBackdropLabel2">
+                                Feedback</h1>
+                            <button type="button"
+                                    class="btn-close"
+                                    data-bs-dismiss="modal"
+                                    aria-label="Close"></button>
+                        </div>
+                        <div class="modal-body d-flex flex-column gap-2">
+                            <label>Description</label>
+                            <textarea
+                                    id="feedback-desc2"
+                                    style="height: 20vh"
+                                    class="w-100 border border-rounded"
+                                    name="feedback-desc"></textarea>
+                        </div>
+                        <div class="modal-footer">
+                            <button class="btn btn-success">
+                                Submit
+                            </button>
+                        </div>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+</main>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
+<script src="/js/modal_utils.js"></script>
+<script>
+    document.querySelectorAll(".modal").forEach(modal => modalConts.push(modal))
+    const formModal = document.querySelector("#modal-form")
+    document.addEventListener("click", ev => {
+        if (ev.target == null || ev.target.type !== 'button') return;
+        console.log(ev.target.classList)
+        if (ev.target.classList.contains("footer-btn")) {
+            const btn = ev.target
+            const topicId = btn.dataset.topicId
+            const reqId = btn.dataset.reqId
+            if (btn.classList.contains("deny-btn")) {
+                formModal.action = `/topics/${topicId}/reports/${reqId}/deny`
+            }else if(btn.classList.contains("accept-btn")){
+                formModal.action =`/topics/${topicId}/reports/${reqId}/accept`
+            }
+        } else if (ev.target.classList.contains("btn-feedback-open")) {
+            const btn = ev.target
+            const feedbackCont = btn.nextElementSibling
+
+            btn.classList.add('invisible')
+            btn.style.width = '0'
+            btn.style.height = '0'
+
+            feedbackCont.style.height = 'max-content';
+            feedbackCont.classList.remove('invisible')
+
+        } else if (ev.target.classList.contains("btn-feedback-close")) {
+            const closeBtn = ev.target
+            const feedbackCont = closeBtn.parentElement.parentElement
+            const btn = feedbackCont.previousElementSibling
+
+            console.log(feedbackCont)
+
+            btn.classList.remove('invisible')
+            btn.style.width = 'max-content'
+            btn.style.height = 'max-content'
+
+            feedbackCont.style.height = '0';
+            feedbackCont.classList.add('invisible')
+        }
+    })
+</script>
+</body>
+</html>
Index: src/main/resources/templates/show-topic.html
===================================================================
--- src/main/resources/templates/show-topic.html	(revision af4af82cc617f8fbc2b81f85fe772c9a4e0fa159)
+++ src/main/resources/templates/show-topic.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -3,7 +3,9 @@
 <head>
     <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0">
     <title th:text="${topic.getTitle()}"></title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"
+          rel="stylesheet">
 
     <style>
@@ -31,15 +33,19 @@
             box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.2);
         }
-        .badge{
+
+        .badge {
             background: #00e7ff80
         }
     </style>
 </head>
-<body>
+<body th:attr="data-topic-id=${topic.getId()}">
 <div th:replace="/home_pages/home :: navigation"></div>
 <div class="mt-3 w-100 d-flex justify-content-center align-items-center">
-    <div th:if="${errMsg!=null}" class="error-bubble">
-        <h5 class="text-center">Error</h5>
-        <p th:text="${errMsg}" class="mb-0"></p>
+    <div th:if="${errMsg!=null}"
+         class="error-bubble">
+        <h5 class="text-center">
+            Error</h5>
+        <p th:text="${errMsg}"
+           class="mb-0"></p>
     </div>
 </div>
@@ -48,9 +54,36 @@
     <div class="card shadow-sm mb-4">
         <div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
-            <h3 th:text="${topic.getTitle()}">Topic Title</h3>
+            <h3 th:text="${topic.getTitle()}">
+                Topic
+                Title</h3>
             <!-- Add Tag Button -->
-            <button th:if="${session.user!=null && session.user.equals(topic.getUser())}"
-                    class="btn btn-info btn-sm" data-bs-toggle="modal" data-bs-target="#addTagModal">Add Tag
-            </button>
+            <div>
+                <button th:if="${session.user!=null && session.user.equals(topic.getUser())}"
+                        class="btn btn-info btn-sm"
+                        data-bs-toggle="modal"
+                        data-bs-target="#addTagModal">
+                    Add
+                    Tag
+                </button>
+                <button
+                        class="btn btn-info btn-sm"
+                        data-bs-toggle="modal"
+                        data-bs-target="#show-guidelines">
+                    Show
+                    guidelines
+                </button>
+                <!--                Moderator check -->
+                <a th:if="${session.user != null && session.user.id == topic.getUser().getId()}"
+                   th:href="@{/topics/{id}/reports(id=${topic.getId()})}"
+                   class="btn btn-info btn-sm">
+                    Show
+                    reports
+                </a>
+                <a th:if="${session.user != null && session.user.id == topic.getUser().getId()}"
+                   th:href="@{/topics/{id}/blacklisted(id=${topic.getId()})}"
+                   class="btn btn-info btn-sm">
+                    Show blacklisted users
+                </a>
+            </div>
         </div>
 
@@ -58,15 +91,25 @@
             <!-- Top Section: Description + Tags -->
             <div class="d-flex justify-content-between">
-                <p th:text="${topic.getContent()}">Description of the topic goes here.</p>
+                <p th:text="${topic.getContent()}">
+                    Description
+                    of
+                    the
+                    topic
+                    goes
+                    here.</p>
                 <!-- Tags Section -->
                 <div>
                     <ul class="list-inline text-end">
-                        <li th:each="tag : ${topic.getTags()}" class="list-inline-item">
+                        <li th:each="tag : ${topic.getTags()}"
+                            class="list-inline-item">
                         <span class="badge text-dark d-inline-flex align-items-center">
                             <span th:text="${tag.getName()}">Tag Name</span>
                             <form th:if="${session.user!=null && session.user.equals(topic.getUser())}"
                                   th:action="@{/topics/{topicId}/tags/{tag-name}/delete (topicId=${topic.getId()}, tag-name=${tag.getName()})}"
-                                  method="post" class="d-inline">
-                                <button type="submit" class="btn btn-sm btn-link text-danger p-0 ms-1" style="line-height: 1;">
+                                  method="post"
+                                  class="d-inline">
+                                <button type="submit"
+                                        class="btn btn-sm btn-link text-danger p-0 ms-1"
+                                        style="line-height: 1;">
                                     &times;
                                 </button>
@@ -84,5 +127,6 @@
                     <button th:if="${session.user != null}"
                             class="btn btn-info btn-sm reply-button"
-                            th:attr="data-reply-id=${topic.getId()}">Reply
+                            th:attr="data-reply-id=${topic.getId()}">
+                        Reply
                     </button>
                 </div>
@@ -90,16 +134,27 @@
                 <!-- Like & Dislike Buttons -->
                 <div class="d-flex flex-row">
-                    <form th:action="@{/threads/{thread-id}/like(thread-id=${topic.getId()})}" method="post">
-                        <input type="hidden" name="topic-id" th:value="${topic.getId()}">
+                    <form th:action="@{/threads/{thread-id}/like(thread-id=${topic.getId()})}"
+                          method="post">
+                        <input type="hidden"
+                               name="topic-id"
+                               th:value="${topic.getId()}">
                         <button th:if="${session.user!=null}"
-                                type="submit" class="btn btn-outline-success btn-sm me-2 like-button">
-                            👍 Like (<span th:text="${topic.getNumLikes()}">0</span>)
+                                type="submit"
+                                class="btn btn-outline-success btn-sm me-2 like-button">
+                            👍
+                            Like
+                            (<span
+                                th:text="${topic.getNumLikes()}">0</span>)
                         </button>
                     </form>
-                    <form th:action="@{/threads/{thread-id}/dislike(thread-id=${topic.getId()})}" method="post">
-                        <input type="hidden" name="topic-id" th:value="${topic.getId()}">
+                    <form th:action="@{/threads/{thread-id}/dislike(thread-id=${topic.getId()})}"
+                          method="post">
+                        <input type="hidden"
+                               name="topic-id"
+                               th:value="${topic.getId()}">
                         <button th:if="${session.user!=null}"
                                 class="btn btn-outline-danger btn-sm dislike-button">
-                            👎 Dislike
+                            👎
+                            Dislike
                         </button>
                     </form>
@@ -110,52 +165,153 @@
 
     <!-- Edit and Delete Buttons for Topic -->
-        <div th:if="${session.user != null && session.user.getId() == topic.getUser().getId()}"
-             class="card-footer d-flex justify-content-between">
-            <div>
-                <button class="btn btn-warning btn-sm" data-bs-toggle="modal" data-bs-target="#editTopicModal">Edit
+    <div th:if="${session.user != null && session.user.getId() == topic.getUser().getId()}"
+         class="card-footer d-flex justify-content-between">
+        <div>
+            <button class="btn btn-warning btn-sm"
+                    data-bs-toggle="modal"
+                    data-bs-target="#editTopicModal">
+                Edit
+                Topic
+            </button>
+            <form th:action="@{/topics/{id}/delete (id=${topic.getId()})}"
+                  method="post"
+                  style="display:inline;">
+                <input type="hidden"
+                       name="id"
+                       th:value="${topic.getId()}"/>
+                <button type="submit"
+                        class="btn btn-danger btn-sm">
+                    Delete
                     Topic
                 </button>
-                <form th:action="@{/topics/{id}/delete (id=${topic.getId()})}" method="post" style="display:inline;">
-                    <input type="hidden" name="id" th:value="${topic.getId()}"/>
-                    <button type="submit" class="btn btn-danger btn-sm">Delete Topic</button>
-                    <input th:if="${session.user!=null}" type="hidden" name="username"
-                           th:value="${session.user.username}"/>
+                <input th:if="${session.user!=null}"
+                       type="hidden"
+                       name="username"
+                       th:value="${session.user.username}"/>
+            </form>
+        </div>
+    </div>
+    </div>
+    <!--    DO TUKA E TOPIC-->
+
+    <!-- Replies Section -->
+    <div th:replace="~{/fragments/discussion :: discussion(reply_cont=${replies},blacklisted=${blacklisted},ownerId=${topic.getUser().getId()})}"></div>
+
+    <!--    Report modal -->
+    <div class="modal fade"
+         id="reportModal"
+         tabindex="-1"
+         aria-labelledby="reportModal"
+         aria-hidden="true"
+    >
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <form id="reporting-form"
+                      method="post"
+                      th:action="@{/topics/{id}/report(id=${topic.getId()})}">
+                    <div class="modal-header">
+                        <h5 class="modal-title">
+                            Report
+                            User</h5>
+                        <button type="button"
+                                class="btn-close"
+                                data-bs-dismiss="modal"></button>
+                    </div>
+                    <div class="modal-body">
+                        <input type="hidden"
+                               name="report-username"
+                               id="reportUsername">
+                        <label for="reason"
+                               class="form-label">Reason</label>
+                        <textarea
+                                id="reason"
+                                name="reason"
+                                class="form-control"
+                                rows="3"
+                                placeholder="Enter reason for reporting..."
+                                required></textarea>
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button"
+                                class="btn btn-secondary"
+                                data-bs-dismiss="modal">
+                            Cancel
+                        </button>
+                        <button type="submit"
+                                class="btn btn-danger">
+                            Submit
+                            Report
+                        </button>
+                    </div>
                 </form>
             </div>
         </div>
     </div>
-    <!--    DO TUKA E TOPIC-->
-
-    <!-- Replies Section -->
-    <div th:replace="~{/fragments/discussion :: discussion(reply_cont=${replies})}"></div>
-
-
 </main>
 
 <!-- Add Tag Modal -->
-<div class="modal fade" id="addTagModal" tabindex="-1" aria-labelledby="addTagModalLabel" aria-hidden="true">
+<div class="modal fade"
+     id="addTagModal"
+     tabindex="-1"
+     aria-labelledby="show-guidelines"
+     aria-hidden="true">
     <div class="modal-dialog">
         <div class="modal-content">
             <div class="modal-header">
                 <h5
-                        class="modal-title" id="addTagModalLabel">Add a Tag</h5>
-                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                        class="modal-title"
+                        id="addTagModalLabel">
+                    Add
+                    a
+                    Tag</h5>
+                <button type="button"
+                        class="btn-close"
+                        data-bs-dismiss="modal"
+                        aria-label="Close"></button>
             </div>
             <div class="modal-body">
-                <form th:action="@{/topics/{id}/tags/add (id=${topic.getId()})}" method="post" id="addTagForm">
+                <form th:action="@{/topics/{id}/tags/add (id=${topic.getId()})}"
+                      method="post"
+                      id="addTagForm">
                     <div class="mb-3">
-                        <label class="form-label">Tag Name</label>
-                        <select id="existingTags" class="form-select mb-3" name="tagName">
-                            <option value="" selected disabled>Select an existing tag</option>
-                            <option th:each="tag : ${tags}" th:value="${tag.getName()}" th:text="${tag.getName()}">
-                                Example Tag
+                        <label class="form-label">Tag
+                            Name</label>
+                        <select id="existingTags"
+                                class="form-select mb-3"
+                                name="tagName">
+                            <option value=""
+                                    selected
+                                    disabled>
+                                Select
+                                an
+                                existing
+                                tag
                             </option>
-                            <option value="custom">Enter a custom tag...</option>
+                            <option th:each="tag : ${tags}"
+                                    th:value="${tag.getName()}"
+                                    th:text="${tag.getName()}">
+                                Example
+                                Tag
+                            </option>
+                            <option value="custom">
+                                Enter
+                                a
+                                custom
+                                tag...
+                            </option>
                         </select>
-                        <input type="text" id="customTag" class="form-control d-none"
+                        <input type="text"
+                               id="customTag"
+                               class="form-control d-none"
                                placeholder="Enter custom tag name"/>
                     </div>
-                    <button type="submit" class="btn btn-primary w-100">Add Tag</button>
-                    <input th:if="${session.user!=null}" type="hidden" name="username"
+                    <button type="submit"
+                            class="btn btn-primary w-100">
+                        Add
+                        Tag
+                    </button>
+                    <input th:if="${session.user!=null}"
+                           type="hidden"
+                           name="username"
                            th:value="${session.user.username}"/>
                 </form>
@@ -166,25 +322,53 @@
 
 <!-- Edit Topic Modal -->
-<div class="modal fade" id="editTopicModal" tabindex="-1" aria-labelledby="editTopicModalLabel" aria-hidden="true">
+<div class="modal fade"
+     id="editTopicModal"
+     tabindex="-1"
+     aria-labelledby="editTopicModalLabel"
+     aria-hidden="true">
     <div class="modal-dialog">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title" id="editTopicModalLabel">Edit Topic</h5>
-                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                <h5 class="modal-title"
+                    id="editTopicModalLabel">
+                    Edit
+                    Topic</h5>
+                <button type="button"
+                        class="btn-close"
+                        data-bs-dismiss="modal"
+                        aria-label="Close"></button>
             </div>
             <div class="modal-body">
-                <form th:action="@{/topics/{id}/edit (id=${topic.getId()})}" method="post">
+                <form th:action="@{/topics/{id}/edit (id=${topic.getId()})}"
+                      method="post">
                     <div class="mb-3">
-                        <label for="topicTitle" class="form-label">Title</label>
-                        <input type="text" id="topicTitle" name="title" class="form-control"
-                               th:value="${topic.getTitle()}" required>
+                        <label for="topicTitle"
+                               class="form-label">Title</label>
+                        <input type="text"
+                               id="topicTitle"
+                               name="title"
+                               class="form-control"
+                               th:value="${topic.getTitle()}"
+                               required>
                     </div>
                     <div class="mb-3">
-                        <label for="topicContent" class="form-label">Content</label>
-                        <textarea id="topicContent" name="content" class="form-control" rows="5"
-                                  th:text="${topic.getContent()}" required></textarea>
-                    </div>
-                    <button type="submit" class="btn btn-primary w-100">Save Changes</button>
-                    <input th:if="${session.user!=null}" type="hidden" name="username"
+                        <label for="topicContent"
+                               class="form-label">Content</label>
+                        <textarea
+                                id="topicContent"
+                                name="content"
+                                class="form-control"
+                                rows="5"
+                                th:text="${topic.getContent()}"
+                                required></textarea>
+                    </div>
+                    <button type="submit"
+                            class="btn btn-primary w-100">
+                        Save
+                        Changes
+                    </button>
+                    <input th:if="${session.user!=null}"
+                           type="hidden"
+                           name="username"
                            th:value="${session.user.username}"/>
                 </form>
@@ -194,5 +378,41 @@
 </div>
 
-<!-- Edit Reply Modal -->
+<!-- Show guidelines modal -->
+<div class="modal fade"
+     id="show-guidelines"
+     tabindex="-1"
+     aria-labelledby="addTagModalLabel"
+     aria-hidden="true">
+    <div class="modal-dialog modal-dialog-centered">
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <h5 class="modal-title"
+                    id="show-guidelines-label">
+                    Guidelines</h5>
+                <button type="button"
+                        class="btn-close"
+                        data-bs-dismiss="modal"
+                        aria-label="Close"></button>
+            </div>
+
+            <div class="modal-body">
+                <p th:text="|The guidelines for ${topic.getTitle()}|"></p>
+                <ul th:each="guideline:${topic.getGuidelines()}">
+                    <li th:text="${guideline.getDescription()}"></li>
+                </ul>
+            </div>
+
+            <div class="modal-footer">
+                <button type="button"
+                        class="btn btn-secondary btn-sm"
+                        data-bs-dismiss="modal">
+                    Close
+                </button>
+            </div>
+
+        </div>
+    </div>
+</div>
 
 
@@ -260,6 +480,5 @@
             editClasses(editBox, 'd-none', 'd-block')
             contentBox.classList.add("d-none")
-        }else if(target.classList.contains("close-edit-btn"))
-        {
+        } else if (target.classList.contains("close-edit-btn")) {
             const id = target.dataset.replyId;
             const editBox = document.querySelector(`.edit-reply[data-reply-id="${id}"]`)
@@ -267,4 +486,8 @@
             editClasses(editBox, 'd-block', 'd-none')
             contentBox.classList.remove("d-none")
+        } else if (target.classList.contains("report-btn")) {
+            const userForReporting = target.dataset.username
+            const userForReportingInput = document.querySelector('#reportUsername')
+            userForReportingInput.value = userForReporting
         }
     })
Index: src/main/resources/templates/show-user-reports.html
===================================================================
--- src/main/resources/templates/show-user-reports.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
+++ src/main/resources/templates/show-user-reports.html	(revision dafe07c8bb8ac0f724dca47cc925cd4d8c449a9b)
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Users Requests</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<header>
+    <div th:replace="/home_pages/home :: navigation"></div>
+</header>
+<section class="d-flex mt-3 flex-column w-100 align-items-center mt-5">
+    <form method="get" th:action="@{/{username}/reports(username=${user.getUsername()})}"
+          class="d-flex flex-row gap-2 align-items-center"
+          style="width:fit-content">
+        <label for="status-query">Filter by status:</label>
+        <select id="status-query" name="status" class="form-select form-select-sm w-auto">
+            <option
+                    th:each="st:${status}"
+                    th:text="${st}"
+                    th:value="${st}"
+            ></option>
+            <option value="">All</option>
+        </select>
+        <button class="btn btn-primary">Search</button>
+    </form>
+</section>
+<main class="d-flex justify-content-center mt-5 align-items-center flex-column ">
+    <div class="card shadow-sm mb-4 w-75"
+         th:each="req:${requests}">
+        <div class="card-header  text-white d-flex justify-content-between align-items-center"
+             th:with="st=${req.getStatus()}"
+             th:classappend="${st.name() == 'PENDING' ? 'bg-warning' : (st.name() == 'DENIED' ? 'bg-danger' : 'bg-info')}"
+        >
+            <h3 th:text="${req.getCreator().getUsername()}">Creator of request</h3>
+            <h3 class="fs-6 ">
+                <span>Status:</span>
+                <span
+                        th:text="${#strings.capitalize(req.getStatus().name().toLowerCase())}"></span>
+            </h3>
+        </div>
+        <div class="d-flex flex-column gap-3 justify-content-between card-body">
+            <div>
+                <h4>Description</h4>
+                <p th:text="${req.getDescription()}">Description of the project goes here.</p>
+                <p th:text="|Submitted on: ${#temporals.format(req.getCreatedAt(), 'dd/MM/yyyy  HH:mm')}|"></p>
+            </div>
+        </div>
+        <div class="card-footer" th:if="${req.getFeedback() != null}">
+            <button type="button"
+                    class="btn-feedback-open btn btn-success">View feedback
+            </button>
+            <div
+                    th:with="feed=${req.getFeedback()}"
+                    class="feedback d-flex flex-column gap-2 invisible" style="height: 0">
+                <h5>Feedback</h5>
+                <p th:text="${feed==null ? '' : (feed.getDescription()!=null ? feed.getDescription() : '')}"></p>
+                <p>
+                    <span>Submitted at:</span>
+                    <span th:text="${feed != null ?  feed.getCreatedAt() : ''}"></span>
+                <div class="w-100 d-flex justify-content-end">
+                    <button type="button" class="btn-feedback-close btn-danger btn">Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
+</main>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
+<script src="/js/modal_utils.js"></script>
+<script>
+    document.querySelectorAll(".modal").forEach(modal => modalConts.push(modal))
+    const formModal = document.querySelector("#modal-form")
+    document.addEventListener("click", ev => {
+        console.log(ev.target.type)
+        if (ev.target == null || ev.target.type !== 'button') return;
+        if (ev.target.classList.contains("btn-feedback-open")) {
+            const btn = ev.target
+            const feedbackCont = btn.nextElementSibling
+
+            btn.classList.add('invisible')
+            btn.style.width = '0'
+            btn.style.height = '0'
+
+            feedbackCont.style.height = 'max-content';
+            feedbackCont.classList.remove('invisible')
+
+        } else if (ev.target.classList.contains("btn-feedback-close")) {
+            const closeBtn = ev.target
+            const feedbackCont = closeBtn.parentElement.parentElement
+            const btn = feedbackCont.previousElementSibling
+
+            console.log(feedbackCont)
+
+            btn.classList.remove('invisible')
+            btn.style.width = 'max-content'
+            btn.style.height = 'max-content'
+
+            feedbackCont.style.height = '0';
+            feedbackCont.classList.add('invisible')
+        }
+    })
+</script>
+</body>
+</html>
