Index: src/main/java/it/finki/charitable/controller/DonationPostController.java
===================================================================
--- src/main/java/it/finki/charitable/controller/DonationPostController.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
+++ src/main/java/it/finki/charitable/controller/DonationPostController.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -2,10 +2,6 @@
 
 import it.finki.charitable.entities.*;
-import it.finki.charitable.services.DonationInformationService;
-import it.finki.charitable.services.DonationPostService;
-import it.finki.charitable.services.FundsCollectedService;
-import it.finki.charitable.services.UserService;
+import it.finki.charitable.services.*;
 import it.finki.charitable.util.FileUploadUtil;
-import org.springframework.data.domain.Page;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -16,5 +12,4 @@
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.File;
 import java.io.IOException;
 import java.time.LocalDate;
@@ -32,10 +27,14 @@
     private final FundsCollectedService fundsCollectedService;
     private final DonationInformationService donationInformationService;
-
-    public DonationPostController(DonationPostService donationPostService, UserService userService, FundsCollectedService fundsCollectedService, DonationInformationService donationInformationService) {
+    private final ReportPostService reportPostService;
+    private final ReasonService reasonService;
+
+    public DonationPostController(DonationPostService donationPostService, UserService userService, FundsCollectedService fundsCollectedService, DonationInformationService donationInformationService, ReportPostService reportPostService, ReasonService reasonService) {
         this.donationPostService = donationPostService;
         this.userService = userService;
         this.fundsCollectedService = fundsCollectedService;
         this.donationInformationService = donationInformationService;
+        this.reportPostService = reportPostService;
+        this.reasonService = reasonService;
     }
 
@@ -140,27 +139,22 @@
             return "post";
         }
-        AppUser user = post.getUser();
-        model.addAttribute("post", post);
-        model.addAttribute("createdByFirstName", user.getFirstName());
-        model.addAttribute("createdByLastName", user.getLastName());
-        double total = post.getFundsCollected().stream().mapToDouble(FundsCollected::getFunds).sum();
-        model.addAttribute("total", total);
+
+        if (post.getApproved() || (post.getUser().getUsername().equals(SecurityContextHolder.getContext().getAuthentication().getName()) && !post.getApproved())) {
+            AppUser user = post.getUser();
+            Moderator moderator = post.getModerator();
+            model.addAttribute("post", post);
+            model.addAttribute("createdByFirstName", user.getFirstName());
+            model.addAttribute("createdByLastName", user.getLastName());
+            if (moderator != null) {
+                model.addAttribute("moderatorFirstName", moderator.getFirstName());
+                model.addAttribute("moderatorLastName", moderator.getLastName());
+            }
+            double total = post.getFundsCollected().stream().mapToDouble(FundsCollected::getFunds).sum();
+            model.addAttribute("total", total);
+        } else {
+            model.addAttribute("notFound", true);
+        }
         return "post";
     }
-
-//    @RequestMapping("/deletePost")
-//    public String deletePost(@RequestParam Long postid) {
-//        DonationPost post = donationPostService.getById(postid);
-//        if (post.getUser().getUsername().equals(SecurityContextHolder.getContext().getAuthentication().getName())) {
-//            List<String> fileForDeletion = post.getPhotosForDeletion();
-//            for (String f : fileForDeletion) {
-//                File file = new File(f);
-//                file.delete();
-//            }
-//            donationPostService.delete(post);
-//        }
-//
-//        return "redirect:/myPosts";
-//    }
 
     @RequestMapping("/donate")
@@ -188,4 +182,25 @@
     }
 
+    @RequestMapping("/report")
+    public String report(@RequestParam Long postid,
+                         @RequestParam String description) {
+
+        DonationPost donationPost = donationPostService.getById(postid);
+        ReportPost reportPost = reportPostService.findByDonationPost(donationPost);
+        if(reportPost == null) {
+            reportPost = new ReportPost();
+            reportPost.setDonationPost(donationPost);
+        }
+
+        Reason reason = new Reason();
+        AppUser user = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        reason.setUser(user);
+        reason.setDescription(description);
+        reasonService.save(reason);
+        reportPost.getReasons().add(reason);
+        reportPostService.save(reportPost);
+        return String.format("redirect:/post?postid=%d", postid);
+    }
+
     @ModelAttribute("user")
     public AppUser addAttributes() {
Index: src/main/java/it/finki/charitable/controller/ModeratorController.java
===================================================================
--- src/main/java/it/finki/charitable/controller/ModeratorController.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
+++ src/main/java/it/finki/charitable/controller/ModeratorController.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -1,8 +1,9 @@
 package it.finki.charitable.controller;
 
-import it.finki.charitable.entities.AppUser;
-import it.finki.charitable.entities.DonationPost;
+import it.finki.charitable.entities.*;
 import it.finki.charitable.services.DonationPostService;
 import it.finki.charitable.services.EmailService;
+import it.finki.charitable.services.ReasonService;
+import it.finki.charitable.services.ReportPostService;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Controller;
@@ -13,4 +14,5 @@
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
 
@@ -20,8 +22,12 @@
     private final DonationPostService donationPostService;
     private final EmailService emailService;
+    private final ReportPostService reportPostService;
+    private final ReasonService reasonService;
 
-    public ModeratorController(DonationPostService donationPostService, EmailService emailService) {
+    public ModeratorController(DonationPostService donationPostService, EmailService emailService, ReportPostService reportPostService, ReasonService reasonService) {
         this.donationPostService = donationPostService;
         this.emailService = emailService;
+        this.reportPostService = reportPostService;
+        this.reasonService = reasonService;
     }
 
@@ -48,4 +54,7 @@
         model.addAttribute("createdByFirstName", user.getFirstName());
         model.addAttribute("createdByLastName", user.getLastName());
+        if (post.getApproved()) {
+            model.addAttribute("approved", true);
+        }
         return "moderatorPost";
     }
@@ -55,6 +64,7 @@
         DonationPost post = donationPostService.getById(postid);
         post.setApproved(true);
+        post.setModerator((Moderator) SecurityContextHolder.getContext().getAuthentication().getPrincipal());
         donationPostService.save(post);
-        emailService.sendApprovalEmail(post.getUser().getEmail(),"CharitAbleMk: " + post.getTitle() + " has been approved", postid);
+        emailService.sendApprovalEmail(post.getUser().getEmail(), "CharitAbleMk: " + post.getTitle() + " has been approved", postid);
         return "redirect:/moderator/approval";
     }
@@ -65,11 +75,84 @@
         DonationPost post = donationPostService.getById(postid);
         emailService.sendNoApprovalEmail(post.getUser().getEmail(), "CharitAbleMk: " + post.getTitle() + " has not been approved", description);
-        List<String> fileForDeletion = post.getPhotosForDeletion();
+        deleteDonationPost(post);
+        return "redirect:/moderator/approval";
+    }
+
+    @RequestMapping("/moderator/myApprovedPosts")
+    public String myApprovedPosts(Model model) {
+        Moderator moderator = (Moderator) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        List<DonationPost> postList = donationPostService.findAllByModerator(moderator);
+        if (postList.size() == 0) {
+            model.addAttribute("noPosts", true);
+            return "postApproval";
+        }
+        model.addAttribute("postList", postList);
+        return "postApproval";
+    }
+
+    @RequestMapping("/moderator/report")
+    public String reportedPosts(Model model) {
+        List<ReportPost> postList = reportPostService.findAll();
+        if (postList.size() == 0) {
+            model.addAttribute("noPosts", true);
+            return "reportedPosts";
+        }
+        model.addAttribute("postList", postList);
+        return "reportedPosts";
+    }
+
+    @RequestMapping("/moderator/reportPost")
+    public String report(@RequestParam Long postid, Model model) {
+        ReportPost post = reportPostService.findById(postid);
+        model.addAttribute("post", post);
+        DonationPost donationPost = post.getDonationPost();
+        AppUser user = donationPost.getUser();
+        model.addAttribute("createdByFirstName", user.getFirstName());
+        model.addAttribute("createdByLastName", user.getLastName());
+        model.addAttribute("report", true);
+        Moderator moderator = post.getDonationPost().getModerator();
+        model.addAttribute("moderatorFirstName", moderator.getFirstName());
+        model.addAttribute("moderatorLastName", moderator.getLastName());
+
+        return "reportPost";
+    }
+
+    @RequestMapping("/moderator/dismiss")
+    public String dismiss(@RequestParam Long postid) {
+        ReportPost post = reportPostService.findById(postid);
+        deleteReportPost(post);
+        return "redirect:/moderator/reportedPosts";
+    }
+
+    @RequestMapping("/moderator/deletePost")
+    public String deletePost(@RequestParam Long postid,
+                             @RequestParam String description) {
+        ReportPost post = reportPostService.findById(postid);
+        DonationPost donationPost = post.getDonationPost();
+        emailService.sendDeletionEmail(donationPost.getUser().getEmail(), "CharitAbleMk: " + donationPost.getTitle() + " has been deleted", description);
+        deleteReportPost(post);
+        deleteDonationPost(donationPost);
+        return "redirect:/moderator/approval";
+    }
+
+    public void deleteDonationPost(DonationPost donationPost) {
+        List<String> fileForDeletion = donationPost.getPhotosForDeletion();
         for (String f : fileForDeletion) {
             File file = new File(f);
             file.delete();
         }
-        donationPostService.delete(post);
-        return "redirect:/moderator/approval";
+        donationPostService.delete(donationPost);
+    }
+
+    public void deleteReportPost(ReportPost reportPost) {
+        List<Reason> reasons = new ArrayList<>(reportPost.getReasons());
+        if (reportPost.getReasons().size() > 0) {
+            reportPost.getReasons().subList(0, reportPost.getReasons().size()).clear();
+        }
+        reportPostService.save(reportPost);
+        for(Reason r: reasons) {
+            reasonService.delete(r);
+        }
+        reportPostService.delete(reportPost);
     }
 
Index: src/main/java/it/finki/charitable/entities/DonationPost.java
===================================================================
--- src/main/java/it/finki/charitable/entities/DonationPost.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
+++ src/main/java/it/finki/charitable/entities/DonationPost.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -55,4 +55,7 @@
     private AppUser user;
 
+    @ManyToOne
+    private Moderator moderator;
+
     @OneToMany
     private List<FundsCollected> fundsCollected = new ArrayList<>();
@@ -204,4 +207,12 @@
     }
 
+    public Moderator getModerator() {
+        return moderator;
+    }
+
+    public void setModerator(Moderator moderator) {
+        this.moderator = moderator;
+    }
+
     public List<FundsCollected> getFundsCollected() {
         return fundsCollected;
Index: src/main/java/it/finki/charitable/entities/Reason.java
===================================================================
--- src/main/java/it/finki/charitable/entities/Reason.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
+++ src/main/java/it/finki/charitable/entities/Reason.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -0,0 +1,53 @@
+package it.finki.charitable.entities;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "reason")
+public class Reason {
+
+    @SequenceGenerator(
+            name = "reason_sequence",
+            sequenceName = "reason_sequence",
+            allocationSize = 1
+    )
+    @GeneratedValue(
+            strategy = GenerationType.SEQUENCE,
+            generator = "reason_sequence"
+    )
+    @Id
+    @Column(
+            name = "id",
+            nullable = false,
+            updatable = false
+    )
+    private Long id;
+
+    private String description;
+    @OneToOne
+    private AppUser user;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public AppUser getUser() {
+        return user;
+    }
+
+    public void setUser(AppUser user) {
+        this.user = user;
+    }
+}
Index: src/main/java/it/finki/charitable/entities/ReportPost.java
===================================================================
--- src/main/java/it/finki/charitable/entities/ReportPost.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
+++ src/main/java/it/finki/charitable/entities/ReportPost.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -0,0 +1,57 @@
+package it.finki.charitable.entities;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+@Table(name = "report_post")
+public class ReportPost {
+
+    @SequenceGenerator(
+            name = "report_post_sequence",
+            sequenceName = "report_post_sequence",
+            allocationSize = 1
+    )
+    @GeneratedValue(
+            strategy = GenerationType.SEQUENCE,
+            generator = "report_post_sequence"
+    )
+    @Id
+    @Column(
+            name = "id",
+            nullable = false,
+            updatable = false
+    )
+    private Long id;
+
+    @OneToOne
+    private DonationPost donationPost;
+
+    @OneToMany
+    private List<Reason> reasons = new ArrayList<>();
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public DonationPost getDonationPost() {
+        return donationPost;
+    }
+
+    public void setDonationPost(DonationPost donationPost) {
+        this.donationPost = donationPost;
+    }
+
+    public List<Reason> getReasons() {
+        return reasons;
+    }
+
+    public void setReasons(List<Reason> reasons) {
+        this.reasons = reasons;
+    }
+}
Index: src/main/java/it/finki/charitable/repository/DonationPostRepository.java
===================================================================
--- src/main/java/it/finki/charitable/repository/DonationPostRepository.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
+++ src/main/java/it/finki/charitable/repository/DonationPostRepository.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -3,4 +3,5 @@
 import it.finki.charitable.entities.AppUser;
 import it.finki.charitable.entities.DonationPost;
+import it.finki.charitable.entities.Moderator;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
@@ -12,3 +13,4 @@
     List<DonationPost> findAllByUser(AppUser user);
     List<DonationPost> findAllByApproved(Boolean approved);
+    List<DonationPost> findAllByModerator(Moderator moderator);
 }
Index: src/main/java/it/finki/charitable/repository/ReasonRepository.java
===================================================================
--- src/main/java/it/finki/charitable/repository/ReasonRepository.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
+++ src/main/java/it/finki/charitable/repository/ReasonRepository.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -0,0 +1,9 @@
+package it.finki.charitable.repository;
+
+import it.finki.charitable.entities.Reason;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ReasonRepository extends JpaRepository<Reason, Long> {
+}
Index: src/main/java/it/finki/charitable/repository/ReportPostRepository.java
===================================================================
--- src/main/java/it/finki/charitable/repository/ReportPostRepository.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
+++ src/main/java/it/finki/charitable/repository/ReportPostRepository.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -0,0 +1,12 @@
+package it.finki.charitable.repository;
+
+import it.finki.charitable.entities.DonationPost;
+import it.finki.charitable.entities.ReportPost;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ReportPostRepository extends JpaRepository<ReportPost, Long> {
+
+    ReportPost findByDonationPost(DonationPost post);
+}
Index: src/main/java/it/finki/charitable/services/DonationPostService.java
===================================================================
--- src/main/java/it/finki/charitable/services/DonationPostService.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
+++ src/main/java/it/finki/charitable/services/DonationPostService.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -3,4 +3,5 @@
 import it.finki.charitable.entities.AppUser;
 import it.finki.charitable.entities.DonationPost;
+import it.finki.charitable.entities.Moderator;
 import it.finki.charitable.repository.DonationPostRepository;
 import org.springframework.data.domain.Page;
@@ -45,4 +46,8 @@
     }
 
+    public List<DonationPost> findAllByModerator(Moderator moderator) {
+        return donationPostRepository.findAllByModerator(moderator);
+    }
+
     public void delete(DonationPost donationPost) {
         donationPostRepository.delete(donationPost);
Index: src/main/java/it/finki/charitable/services/EmailService.java
===================================================================
--- src/main/java/it/finki/charitable/services/EmailService.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
+++ src/main/java/it/finki/charitable/services/EmailService.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -40,5 +40,16 @@
         message.setSubject(subject);
 
-        String text = "Sorry, your post hasn't been approved" + "\n" +
+        String text = "Sorry, your post hasn't been approved\n" +
+                "Moderator:\n" + description;
+        message.setText(text);
+        javaMailSender.send(message);
+    }
+
+    public void sendDeletionEmail(String to, String subject, String description) {
+        SimpleMailMessage message = new SimpleMailMessage();
+        message.setTo(to);
+        message.setSubject(subject);
+
+        String text = "Sorry, your post has been deleted\n" +
                 "Moderator:\n" + description;
         message.setText(text);
Index: src/main/java/it/finki/charitable/services/ReasonService.java
===================================================================
--- src/main/java/it/finki/charitable/services/ReasonService.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
+++ src/main/java/it/finki/charitable/services/ReasonService.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -0,0 +1,23 @@
+package it.finki.charitable.services;
+
+import it.finki.charitable.entities.Reason;
+import it.finki.charitable.repository.ReasonRepository;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ReasonService {
+
+    private final ReasonRepository reasonRepository;
+
+    public ReasonService(ReasonRepository reasonRepository) {
+        this.reasonRepository = reasonRepository;
+    }
+
+    public void save(Reason reason) {
+        reasonRepository.save(reason);
+    }
+
+    public void delete(Reason reason) {
+        reasonRepository.delete(reason);
+    }
+}
Index: src/main/java/it/finki/charitable/services/ReportPostService.java
===================================================================
--- src/main/java/it/finki/charitable/services/ReportPostService.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
+++ src/main/java/it/finki/charitable/services/ReportPostService.java	(revision ab4933857c0cfa01b78b275c9ecbb8ae480c8737)
@@ -0,0 +1,39 @@
+package it.finki.charitable.services;
+
+import it.finki.charitable.entities.DonationPost;
+import it.finki.charitable.entities.Reason;
+import it.finki.charitable.entities.ReportPost;
+import it.finki.charitable.repository.ReportPostRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ReportPostService {
+
+    private final ReportPostRepository reportPostRepository;
+
+    public ReportPostService(ReportPostRepository reportPostRepository) {
+        this.reportPostRepository = reportPostRepository;
+    }
+
+    public List<ReportPost> findAll() {
+        return reportPostRepository.findAll();
+    }
+
+    public ReportPost findById(Long id) {
+        return reportPostRepository.getById(id);
+    }
+
+    public ReportPost findByDonationPost(DonationPost post) {
+        return reportPostRepository.findByDonationPost(post);
+    }
+
+    public void save(ReportPost post) {
+        reportPostRepository.save(post);
+    }
+
+    public void delete(ReportPost reportPost) {
+        reportPostRepository.delete(reportPost);
+    }
+}
