Index: src/main/java/it/finki/charitable/CharitableApplication.java
===================================================================
--- src/main/java/it/finki/charitable/CharitableApplication.java	(revision 194776a42ab45f74d99c7afd74d5674184e9d8ae)
+++ src/main/java/it/finki/charitable/CharitableApplication.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -4,6 +4,8 @@
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
+@EnableScheduling
 public class CharitableApplication {
 
Index: src/main/java/it/finki/charitable/controller/DonationPostController.java
===================================================================
--- src/main/java/it/finki/charitable/controller/DonationPostController.java	(revision 194776a42ab45f74d99c7afd74d5674184e9d8ae)
+++ src/main/java/it/finki/charitable/controller/DonationPostController.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -73,4 +73,5 @@
         post.setDateDue(dateDue);
         post.setBankAccount(bankAccount);
+        post.setApproved(false);
 
         List<String> phoneNumbers = Arrays.asList(telekom, a1);
@@ -123,5 +124,5 @@
     @RequestMapping("/album")
     public String album(Model model) {
-        List<DonationPost> postList = donationPostService.findAll();
+        List<DonationPost> postList = donationPostService.findAllByApproved(true);
         if (postList.size() == 0) {
             model.addAttribute("noPosts", true);
@@ -148,18 +149,18 @@
     }
 
-    @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("/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")
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 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -0,0 +1,83 @@
+package it.finki.charitable.controller;
+
+import it.finki.charitable.entities.AppUser;
+import it.finki.charitable.entities.DonationPost;
+import it.finki.charitable.services.DonationPostService;
+import it.finki.charitable.services.EmailService;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.io.File;
+import java.util.List;
+
+@Controller
+public class ModeratorController {
+
+    private final DonationPostService donationPostService;
+    private final EmailService emailService;
+
+    public ModeratorController(DonationPostService donationPostService, EmailService emailService) {
+        this.donationPostService = donationPostService;
+        this.emailService = emailService;
+    }
+
+    @RequestMapping("moderator/approval")
+    public String approval(Model model) {
+        List<DonationPost> postList = donationPostService.findAllByApproved(false);
+        if (postList.size() == 0) {
+            model.addAttribute("noPosts", true);
+            return "postApproval";
+        }
+        model.addAttribute("postList", postList);
+        return "postApproval";
+    }
+
+    @RequestMapping("moderator/post")
+    public String post(Model model, @RequestParam Long postid) {
+        DonationPost post = donationPostService.getById(postid);
+        if (post == null) {
+            model.addAttribute("notFound", true);
+            return "post";
+        }
+        AppUser user = post.getUser();
+        model.addAttribute("post", post);
+        model.addAttribute("createdByFirstName", user.getFirstName());
+        model.addAttribute("createdByLastName", user.getLastName());
+        return "moderatorPost";
+    }
+
+    @RequestMapping("/moderator/approvePost")
+    public String approvePost(@RequestParam Long postid) {
+        DonationPost post = donationPostService.getById(postid);
+        post.setApproved(true);
+        donationPostService.save(post);
+        emailService.sendApprovalEmail(post.getUser().getEmail(),"CharitAbleMk: " + post.getTitle() + " has been approved", postid);
+        return "redirect:/moderator/approval";
+    }
+
+    @RequestMapping("/moderator/dontApprove")
+    public String dontApprove(@RequestParam Long postid,
+                              @RequestParam String description) {
+        DonationPost post = donationPostService.getById(postid);
+        emailService.sendNoApprovalEmail(post.getUser().getEmail(), "CharitAbleMk: " + post.getTitle() + " has not been approved", description);
+        List<String> fileForDeletion = post.getPhotosForDeletion();
+        for (String f : fileForDeletion) {
+            File file = new File(f);
+            file.delete();
+        }
+        donationPostService.delete(post);
+        return "redirect:/moderator/approval";
+    }
+
+    @ModelAttribute("user")
+    public AppUser addAttributes() {
+        if (SecurityContextHolder.getContext().getAuthentication().getPrincipal() != "anonymousUser") {
+            return (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        }
+        return null;
+    }
+}
Index: src/main/java/it/finki/charitable/entities/DonationPost.java
===================================================================
--- src/main/java/it/finki/charitable/entities/DonationPost.java	(revision 194776a42ab45f74d99c7afd74d5674184e9d8ae)
+++ src/main/java/it/finki/charitable/entities/DonationPost.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -37,4 +37,5 @@
     private LocalDate dateDue;
     private String bankAccount;
+    private Boolean approved;
 
     @ElementCollection
@@ -74,5 +75,10 @@
 
         List<String> photoPaths = new ArrayList<>();
+
         for(String path: images) {
+            photoPaths.add("../../../../post-photos/" + id + "/" + path);
+        }
+
+        for(String path: moderatorImages) {
             photoPaths.add("../../../../moderator-photos/" + id + "/" + path);
         }
@@ -158,4 +164,12 @@
     }
 
+    public Boolean getApproved() {
+        return approved;
+    }
+
+    public void setApproved(Boolean approved) {
+        this.approved = approved;
+    }
+
     public List<String> getPhoneNumbers() {
         return phoneNumbers;
Index: src/main/java/it/finki/charitable/repository/DonationPostRepository.java
===================================================================
--- src/main/java/it/finki/charitable/repository/DonationPostRepository.java	(revision 194776a42ab45f74d99c7afd74d5674184e9d8ae)
+++ src/main/java/it/finki/charitable/repository/DonationPostRepository.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -11,3 +11,4 @@
 public interface DonationPostRepository extends JpaRepository<DonationPost, Long> {
     List<DonationPost> findAllByUser(AppUser user);
+    List<DonationPost> findAllByApproved(Boolean approved);
 }
Index: src/main/java/it/finki/charitable/security/SecurityConfig.java
===================================================================
--- src/main/java/it/finki/charitable/security/SecurityConfig.java	(revision 194776a42ab45f74d99c7afd74d5674184e9d8ae)
+++ src/main/java/it/finki/charitable/security/SecurityConfig.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -7,6 +7,15 @@
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.core.Authentication;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.web.DefaultRedirectStrategy;
+import org.springframework.security.web.RedirectStrategy;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
 import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 @Configuration
@@ -40,6 +49,6 @@
                 .authorizeRequests()
                 .antMatchers(publicMatchers).permitAll()
-                .antMatchers("/moderator-photos/**").hasAuthority(UserRole.MODERATOR.name())
-                .anyRequest().authenticated();
+                .antMatchers("/moderator-photos/**", "/moderator/**").hasAuthority(UserRole.MODERATOR.name())
+                .anyRequest().hasAuthority(UserRole.USER.name());
 
         http
@@ -47,5 +56,5 @@
                 .cors().disable()
                 .formLogin().loginPage("/login")
-                .defaultSuccessUrl("/", true)
+                .successHandler(authenticationSuccessHandler)
                 .and()
                 .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
@@ -55,4 +64,13 @@
     }
 
+    AuthenticationSuccessHandler authenticationSuccessHandler = (httpServletRequest, httpServletResponse, authentication) -> {
+        RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
+        if(authentication.getAuthorities().toString().contains("MODERATOR")) {
+            redirectStrategy.sendRedirect(httpServletRequest, httpServletResponse, "/moderator/approval");
+        } else {
+            redirectStrategy.sendRedirect(httpServletRequest, httpServletResponse, "/");
+        }
+    };
+
     @Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
Index: src/main/java/it/finki/charitable/services/DonationPostService.java
===================================================================
--- src/main/java/it/finki/charitable/services/DonationPostService.java	(revision 194776a42ab45f74d99c7afd74d5674184e9d8ae)
+++ src/main/java/it/finki/charitable/services/DonationPostService.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -41,4 +41,8 @@
     }
 
+    public List<DonationPost> findAllByApproved(Boolean approved) {
+        return donationPostRepository.findAllByApproved(approved);
+    }
+
     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 194776a42ab45f74d99c7afd74d5674184e9d8ae)
+++ src/main/java/it/finki/charitable/services/EmailService.java	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -24,3 +24,24 @@
         javaMailSender.send(message);
     }
+
+    public void sendApprovalEmail(String to, String subject, Long postId) {
+        SimpleMailMessage message = new SimpleMailMessage();
+        message.setTo(to);
+        message.setSubject(subject);
+
+        String text = "Your post has been approved\n" + "http://localhost:8080/post?postid=" + postId;
+        message.setText(text);
+        javaMailSender.send(message);
+    }
+
+    public void sendNoApprovalEmail(String to, String subject, String description) {
+        SimpleMailMessage message = new SimpleMailMessage();
+        message.setTo(to);
+        message.setSubject(subject);
+
+        String text = "Sorry, your post hasn't been approved" + "\n" +
+                "Moderator:\n" + description;
+        message.setText(text);
+        javaMailSender.send(message);
+    }
 }
Index: src/main/resources/templates/common/navbar.html
===================================================================
--- src/main/resources/templates/common/navbar.html	(revision 194776a42ab45f74d99c7afd74d5674184e9d8ae)
+++ src/main/resources/templates/common/navbar.html	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -9,6 +9,6 @@
     <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
         <div class="container-fluid">
-            <a class="navbar-brand" href="#">
-                <img th:src="@{image/charity.png}" class="bi me-2" width="40" height="32" />
+            <a class="navbar-brand" th:href="@{/}">
+                <img th:src="@{/image/charity.png}" class="bi me-2" width="40" height="32" />
                 <span class="fs-4">Charitable</span>
             </a>
@@ -20,11 +20,13 @@
                 <ul class="navbar-nav me-auto mb-2 mb-md-0">
                     <li class="nav-item">
-                        <a th:href="@{/}" class="nav-link px-2 text-white">Home</a>
+                        <a sec:authorize="isAnonymous() or hasAuthority('USER')" th:href="@{/}" class="nav-link px-2 text-white">Home</a>
                     </li>
                     <li class="nav-item">
-                        <a th:href="@{/album?page=1}" class="nav-link px-2 text-white">Posts</a>
+                        <a sec:authorize="isAnonymous() or hasAuthority('USER')" th:href="@{/album?page=1}" class="nav-link px-2 text-white">Posts</a>
+                        <a sec:authorize="hasAuthority('MODERATOR')" th:href="@{/moderator/approval}" class="nav-link px-2 text-white">Posts for approval</a>
                     </li>
                     <li class="nav-item">
-                        <a th:href="@{/upload}" class="nav-link px-2 text-white">Upload</a>
+                        <a sec:authorize="hasAuthority('USER')" th:href="@{/upload}" class="nav-link px-2 text-white">Upload</a>
+                        <a sec:authorize="hasAuthority('MODERATOR')" th:href="@{/moderator/report}" class="nav-link px-2 text-white">Reported posts</a>
                     </li>
                 </ul>
Index: src/main/resources/templates/moderatorPost.html
===================================================================
--- src/main/resources/templates/moderatorPost.html	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
+++ src/main/resources/templates/moderatorPost.html	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -0,0 +1,97 @@
+<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml" xmlns:sec="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="UTF-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <title>Register</title>
+    <!-- Bootstrap core CSS -->
+    <link href="/css/bootstrap.min.css" rel="stylesheet"/>
+    <link href="/css/carousel.css" rel="stylesheet"/>
+    <meta name="theme-color" content="#7952b3"/>
+</head>
+<body>
+<header th:replace="common/navbar :: navbar"></header>
+<br/>
+<br/>
+<br/>
+<div th:if="${notFound}">
+    Post not found
+</div>
+<div th:unless="${notFound}">
+    <div class="row">
+        <div class="col-md-6" style="margin-left: 5px">
+            <div class="col-md-12">
+
+                <div id="myCarousel" class="carousel carousel-dark slide card" data-bs-ride="carousel">
+                    <div class="carousel-indicators">
+                        <button th:each="image, itrStat : ${post.moderatorPath}" type="button" data-bs-target="#myCarousel"
+                                th:data-bs-slide-to="${itrStat.index}" th:classappend="${itrStat.index} == 0 ? active"></button>
+                    </div>
+                    <div class="carousel-inner">
+                        <div th:each="image, itrStat : ${post.moderatorPath}" th:classappend="${itrStat.index} == 0 ? active"
+                             class="carousel-item">
+                            <img class="card-img" th:src="${image}" style="object-fit: contain">
+                        </div>
+                    </div>
+                    <button class="carousel-control-prev" type="button" data-bs-target="#myCarousel" data-bs-slide="prev">
+                        <span class="carousel-control-prev-icon" aria-hidden="true"></span>
+                        <span class="visually-hidden">Previous</span>
+                    </button>
+                    <button class="carousel-control-next" type="button" data-bs-target="#myCarousel" data-bs-slide="next">
+                        <span class="carousel-control-next-icon" aria-hidden="true"></span>
+                        <span class="visually-hidden">Next</span>
+                    </button>
+                </div>
+            </div>
+        </div>
+        <div class="col-md-5" style="margin-left: 5px">
+            <div class="col-md-12">
+                <h1 th:text="${post.title}"></h1>
+                <h5>Description:</h5>
+                <p th:text="${post.description}"></p>
+                <h5>Funds needed:</h5>
+                <p><span th:text="${total}"></span>/<span th:text="${post.fundsNeeded}"></span> - <span th:text="${post.currency}"></span></p>
+                <h5>Date due:</h5>
+                <p th:text="${post.dateDue}"></p>
+                <h5>Bank account:</h5>
+                <p th:text="${post.bankAccount}"></p>
+                <h5>Phone numbers:</h5>
+                <p><span th:text="${post.phoneNumbers[0]}"></span> - Telekom</p>
+                <p><span th:text="${post.phoneNumbers[1]}"></span> - A1</p>
+                <h5>Created by:</h5>
+                <p><span th:text="${createdByFirstName}"></span> <span th:text="${createdByLastName}"></span></p>
+
+                <a class="btn btn-success" th:href="@{/moderator/approvePost(postid=${post.id})}">Approve</a>
+                <button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#staticBackdrop">
+                    Dont Approve
+                </button>
+
+                <!-- Modal -->
+                <div class="modal fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
+                    <div class="modal-dialog modal-dialog-centered">
+                        <div class="modal-content">
+                            <div class="modal-header">
+                                <h5 class="modal-title" id="staticBackdropLabel">Donate</h5>
+                                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                            </div>
+                            <div class="modal-body">
+                                <div class="card-body">
+                                    <form th:action="@{/moderator/dontApprove(postid=${post.id})}" method="post" id="myForm">
+                                        <label for="description">Description</label>
+                                        <textarea class="form-control" id="description" name="description" rows="5"></textarea>
+                                    </form>
+                                </div>
+                            </div>
+                            <div class="modal-footer">
+                                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
+                                <input type="submit" class="btn btn-primary" form="myForm" value="Confirm">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="/js/bootstrap.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/postApproval.html
===================================================================
--- src/main/resources/templates/postApproval.html	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
+++ src/main/resources/templates/postApproval.html	(revision 5306751d2d24af6bfb27078e1727d579fa8b5939)
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="UTF-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <title>Album</title>
+    <!-- Bootstrap core CSS -->
+    <link href="/css/bootstrap.min.css" rel="stylesheet"/>
+</head>
+<body>
+<header th:replace="common/navbar :: navbar"></header>
+<hr class="dropdown-divider">
+<br/>
+<br/>
+<main>
+    <p th:if="${noPosts}">No posts</p>
+    <div th:unless="${noPosts}" class="album py-5 bg-light">
+        <div class="container">
+
+            <div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 g-3">
+                <div class="col" th:each="post : ${postList}">
+                    <div class="card shadow-sm">
+                        <img class="card-img" style="object-fit: contain" width="100%" height="225"
+                             th:src="${post.imagesPath[0]}">
+                        <div class="card-body overflow-hidden">
+                            <h4 th:text="${post.title}" style="height: 60px"></h4>
+                            <p class="card-text text-truncate" style="height: 45px" th:text="${post.description}"></p>
+                            <div class="d-flex justify-content-between align-items-center">
+                                <div class="btn-group">
+                                    <a class="btn btn-sm btn-outline-secondary" th:href="@{/moderator/post(postid=${post.id})}">Open</a>
+                                </div>
+                                <span class="text-muted">Date due: <small th:text="${post.dateDue}"></small></span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <hr class="ui-menu-divider" />
+    </div>
+
+</main>
+<script src="/js/bootstrap.min.js"></script>
+</body>
+</html>
