Index: src/main/java/edu/gjoko/schedlr/config/AppAuthenticationSuccessHandler.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/config/AppAuthenticationSuccessHandler.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ 	(revision )
@@ -1,67 +1,0 @@
-package edu.gjoko.schedlr.config;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.web.DefaultRedirectStrategy;
-import org.springframework.security.web.RedirectStrategy;
-import org.springframework.security.web.WebAttributes;
-import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-public class AppAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
-
-    protected Log logger = LogFactory.getLog(this.getClass());
-    private final RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
-
-    @Override
-    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
-        handle(request, response, authentication);
-        clearAuthenticationAttributes(request);
-    }
-
-    protected void handle(HttpServletRequest request,
-                          HttpServletResponse response,
-                          Authentication authentication) throws IOException {
-        String targetUrl = determineTargetUrl(authentication);
-
-        if (response.isCommitted()) {
-            logger.debug("Response has already been committed. Unable to redirect to " +
-                    targetUrl);
-            return;
-        }
-        redirectStrategy.sendRedirect(request, response, targetUrl);
-    }
-
-    protected String determineTargetUrl(final Authentication authentication) {
-        Map<String, String> roleTargetUrlMap = new HashMap<>();
-        roleTargetUrlMap.put("DATE", "/date");
-        roleTargetUrlMap.put("GUESS_NUMBER", "/number");
-
-        final Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
-        for (final GrantedAuthority grantedAuthority : authorities) {
-            String authorityName = grantedAuthority.getAuthority();
-            if (roleTargetUrlMap.containsKey(authorityName)) {
-                return roleTargetUrlMap.get(authorityName);
-            }
-        }
-        throw new IllegalStateException();
-    }
-
-    protected void clearAuthenticationAttributes(HttpServletRequest request) {
-        HttpSession session = request.getSession(false);
-        if (session == null) {
-            return;
-        }
-        session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
-    }
-}
Index: src/main/java/edu/gjoko/schedlr/config/AppConfig.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/config/AppConfig.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/config/AppConfig.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -15,8 +15,4 @@
     }
 
-    @Bean
-    public AuthenticationSuccessHandler appAuthenticationSuccessHandler() {
-        return new AppAuthenticationSuccessHandler();
-    }
 
     @Bean
Index: src/main/java/edu/gjoko/schedlr/config/AppFilter.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/config/AppFilter.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/config/AppFilter.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -64,5 +64,9 @@
                             break;
                         case "CUSTOMER":
-                            page = "/homepage";
+                            if ("/customer_admin".equals(httpServletRequest.getRequestURI())) {
+                                page = "/customer_admin";
+                            } else {
+                                page = "/homepage";
+                            }
                             break;
                         case "BUSINESS_OWNER":
Index: src/main/java/edu/gjoko/schedlr/config/AppSecurityConfig.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/config/AppSecurityConfig.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/config/AppSecurityConfig.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -32,6 +32,4 @@
     private final BCryptPasswordEncoder passwordEncoder;
 
-    private final AuthenticationSuccessHandler authenticationSuccessHandler;
-
     private final AuthenticationFailureHandler authenticationFailureHandler;
 
@@ -57,7 +55,6 @@
                 .loginPage("/login")
                 .loginProcessingUrl("/login")
-                .successHandler(authenticationSuccessHandler)
                 .failureHandler(authenticationFailureHandler)
-                .defaultSuccessUrl("/homepage")
+                .defaultSuccessUrl("/login")
                 .and()
                 .logout(logout -> logout
Index: src/main/java/edu/gjoko/schedlr/config/ExceptionHandlerAdvice.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/config/ExceptionHandlerAdvice.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/config/ExceptionHandlerAdvice.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,19 @@
+package edu.gjoko.schedlr.config;
+
+import edu.gjoko.schedlr.exceptions.BlockingTimeException;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
+
+@ControllerAdvice
+public class ExceptionHandlerAdvice extends ResponseEntityExceptionHandler {
+
+    @ExceptionHandler(value = BlockingTimeException.class)
+    protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) {
+        return handleExceptionInternal(ex, ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT, request);
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/config/MvcConfig.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/config/MvcConfig.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/config/MvcConfig.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -16,4 +16,5 @@
         registry.addViewController("/admin").setViewName("admin");
         registry.addViewController("/business_admin").setViewName("business_admin");
+        registry.addViewController("/customer_admin").setViewName("customer_admin");
     }
 }
Index: src/main/java/edu/gjoko/schedlr/controllers/AdminController.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/AdminController.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ 	(revision )
@@ -1,29 +1,0 @@
-package edu.gjoko.schedlr.controllers;
-
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-
-import javax.servlet.http.HttpServletRequest;
-import java.security.Principal;
-
-@Controller
-public class AdminController {
-
-    @GetMapping(path = "/admin")
-    public String getAdminPageTemplate(Model model, HttpServletRequest request) {
-        return "admin";
-    }
-
-    @GetMapping(path = "/business_admin")
-    public String getBusinessAdminPageTemplate(Model model, HttpServletRequest request) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String currentPrincipalName = authentication.getName();
-
-        return "business_admin";
-    }
-
-
-}
Index: src/main/java/edu/gjoko/schedlr/controllers/AdministrationController.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/AdministrationController.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/controllers/AdministrationController.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,30 @@
+package edu.gjoko.schedlr.controllers;
+
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Controller
+public class AdministrationController {
+
+    @GetMapping(path = "/admin")
+    public String getAdminPageTemplate(Model model) {
+        return "admin";
+    }
+
+    @GetMapping(path = "/business_admin")
+    public String getBusinessAdminPageTemplate(Model model) {
+        return "business_admin";
+    }
+
+    @GetMapping(path = "/customer_admin")
+    public String getCustomerAdminPageTemplate(Model model) {
+        return "customer_admin";
+    }
+
+
+}
Index: src/main/java/edu/gjoko/schedlr/controllers/rest/AppointmentApi.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/rest/AppointmentApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/controllers/rest/AppointmentApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,59 @@
+package edu.gjoko.schedlr.controllers.rest;
+
+import edu.gjoko.schedlr.dto.AppointmentDto;
+import edu.gjoko.schedlr.dto.AppointmentInfoDto;
+import edu.gjoko.schedlr.entity.Appointment;
+import edu.gjoko.schedlr.entity.Stakeholder;
+import edu.gjoko.schedlr.mappers.AppointmentDtoMapper;
+import edu.gjoko.schedlr.services.AppointmentsService;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.security.sasl.AuthenticationException;
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("api/appointment")
+@AllArgsConstructor
+public class AppointmentApi {
+
+    private final AppointmentsService appointmentsService;
+    private final AppointmentDtoMapper appointmentsMapper;
+
+    @PostMapping
+    public void getBusinessTypes(@RequestBody Appointment appointment, HttpServletRequest request) {
+        Long customerId = (long) request.getSession(true).getAttribute("stakeholderId");
+        Stakeholder customer = new Stakeholder();
+        customer.setId(customerId);
+        appointment.setCustomer(customer);
+        appointmentsService.saveAppointment(appointment);
+    }
+
+    @GetMapping(path = "/business/{businessId}")
+    public List<AppointmentDto> getAppointmentsByBusiness(@PathVariable("businessId") Long businessId) {
+        return appointmentsService.getActiveAppointmentsByBusiness(businessId).stream()
+                .map(appointmentsMapper::appointmentToAppointmentDto)
+                .collect(Collectors.toList());
+    }
+
+    @GetMapping(path = "/future/me")
+    public List<AppointmentInfoDto> getFutureAppointmentsInfoList(HttpServletRequest request) {
+        Long businessOwnerId = (long) request.getSession(true).getAttribute("stakeholderId");
+        return appointmentsService.getFutureAppointmentInfoList(businessOwnerId);
+    }
+
+    @GetMapping(path = "/past/me")
+    public List<AppointmentInfoDto> getPastAppointmentsInfoList(HttpServletRequest request) {
+        Long stakeholderId = (long) request.getSession(true).getAttribute("stakeholderId");
+        return appointmentsService.getPastAppointmentInfoList(stakeholderId);
+    }
+
+    @DeleteMapping("/{appointmentId}")
+    public void cancelAppointment(@PathVariable("appointmentId") Long appointmentId, HttpServletRequest request) throws AuthenticationException {
+        Long stakeholderId = (long) request.getSession(true).getAttribute("stakeholderId");
+        appointmentsService.deleteAppointment(appointmentId, stakeholderId);
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/controllers/rest/AppointmentController.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/rest/AppointmentController.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ 	(revision )
@@ -1,37 +1,0 @@
-package edu.gjoko.schedlr.controllers.rest;
-
-import edu.gjoko.schedlr.entity.Appointment;
-import edu.gjoko.schedlr.entity.Business;
-import edu.gjoko.schedlr.entity.Stakeholder;
-import edu.gjoko.schedlr.repositories.AppointmentRepository;
-import edu.gjoko.schedlr.services.AppointmentsService;
-import edu.gjoko.schedlr.services.StakeholderService;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-
-@RestController
-@RequestMapping("api/appointment")
-@AllArgsConstructor
-public class AppointmentController {
-
-    private final AppointmentsService appointmentsService;
-
-    @PostMapping
-    public void getBusinessTypes(@RequestBody Appointment appointment, HttpServletRequest request) {
-        Long customerId = (long) request.getSession(true).getAttribute("stakeholderId");
-        Stakeholder customer = new Stakeholder();
-        customer.setId(customerId);
-        appointment.setCustomer(customer);
-        appointmentsService.saveAppointment(appointment);
-    }
-
-    @GetMapping(path = "/business/{businessId}")
-    public List<Appointment> getAppointmentsByBusiness(@PathVariable("businessId") Long businessId) {
-        var business = new Business();
-        business.setId(businessId);
-        return appointmentsService.getAppointmentsByBusiness(business);
-    }
-}
Index: src/main/java/edu/gjoko/schedlr/controllers/rest/BusinessApi.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/rest/BusinessApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/controllers/rest/BusinessApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,43 @@
+package edu.gjoko.schedlr.controllers.rest;
+
+import edu.gjoko.schedlr.entity.Business;
+import edu.gjoko.schedlr.services.BusinessService;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/business")
+@AllArgsConstructor
+public class BusinessApi {
+
+    private final BusinessService businessService;
+
+    @PostMapping
+    public void saveBusiness(@RequestBody Business business) {
+        businessService.saveBusiness(business);
+    }
+
+    @GetMapping
+    public List<Business> findAll() {
+        return businessService.findAll();
+    }
+
+    @PatchMapping
+    public void updateBusinesses(@RequestBody List<Business> businessList) {
+        businessService.updateBusinesses(businessList);
+    }
+
+    @GetMapping(path = "/me")
+    public Business getPersonalInfo(HttpServletRequest request) {
+        Long businessOwnerId = (long) request.getSession(true).getAttribute("stakeholderId");
+        return businessService.findByOwner(businessOwnerId);
+    }
+
+    @GetMapping(path = "/{businessTypeId}")
+    public List<Business> getBusinessesByBusinessType(@PathVariable("businessTypeId") Long id) {
+        return businessService.findByBusinessTypeAndActiveStatus(id);
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/controllers/rest/BusinessController.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/rest/BusinessController.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ 	(revision )
@@ -1,46 +1,0 @@
-package edu.gjoko.schedlr.controllers.rest;
-
-import edu.gjoko.schedlr.entity.Business;
-import edu.gjoko.schedlr.entity.BusinessType;
-import edu.gjoko.schedlr.services.BusinessService;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-
-@RestController
-@RequestMapping("api/business")
-@AllArgsConstructor
-public class BusinessController {
-
-    final BusinessService businessService;
-
-    @PostMapping
-    public void getBusinessTypes(@RequestBody Business business) {
-        businessService.saveBusiness(business);
-    }
-
-    @GetMapping
-    public List<Business> findAll() {
-        return businessService.findAll();
-    }
-
-    @PatchMapping
-    public void updateBusinesses(@RequestBody List<Business> businessList) {
-        businessService.updateBusinesses(businessList);
-    }
-
-    @GetMapping(path = "/me")
-    public Business getPersonalInfo(HttpServletRequest request) {
-        Long businessOwnerId = (long) request.getSession(true).getAttribute("stakeholderId");
-        return businessService.findByOwner(businessOwnerId);
-    }
-
-    @GetMapping(path = "/{businessTypeId}")
-    public List<Business> getBusinessesByBusinessType(@PathVariable("businessTypeId") Long id) {
-        BusinessType businessType = new BusinessType();
-        businessType.setId(id);
-        return businessService.findByBusinessTypeAndActiveStatus(businessType);
-    }
-}
Index: src/main/java/edu/gjoko/schedlr/controllers/rest/CustomerApi.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/rest/CustomerApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/controllers/rest/CustomerApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,29 @@
+package edu.gjoko.schedlr.controllers.rest;
+
+import edu.gjoko.schedlr.entity.Business;
+import edu.gjoko.schedlr.entity.Stakeholder;
+import edu.gjoko.schedlr.services.StakeholderService;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/customer")
+@AllArgsConstructor
+public class CustomerApi {
+
+    private final StakeholderService stakeholderService;
+
+    @GetMapping(path = "/me")
+    public Stakeholder getCustomerInfo(HttpServletRequest request) {
+        Long customerId = (long) request.getSession(true).getAttribute("stakeholderId");
+        return stakeholderService.findById(customerId);
+    }
+
+    @PatchMapping
+    public void updateCustomer(@RequestBody Stakeholder stakeholder) {
+        stakeholderService.saveOrUpdateStakeholder(stakeholder);
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/controllers/rest/NomenclatureApi.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/rest/NomenclatureApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/controllers/rest/NomenclatureApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,22 @@
+package edu.gjoko.schedlr.controllers.rest;
+
+import edu.gjoko.schedlr.entity.BusinessType;
+import edu.gjoko.schedlr.services.NomenclaturesService;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("api/nomenclatures")
+@AllArgsConstructor
+public class NomenclatureApi {
+
+    private final NomenclaturesService nomenclaturesService;
+    @GetMapping( "/businessTypes")
+    public List<BusinessType> getBusinessTypes() {
+        return nomenclaturesService.getBusinessTypes();
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/controllers/rest/NomenclatureController.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/rest/NomenclatureController.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package edu.gjoko.schedlr.controllers.rest;
-
-import edu.gjoko.schedlr.entity.BusinessType;
-import edu.gjoko.schedlr.services.NomenclaturesService;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-@RestController
-@RequestMapping("api/nomenclatures")
-@AllArgsConstructor
-public class NomenclatureController {
-
-    private final NomenclaturesService nomenclaturesService;
-    @GetMapping( "/businessTypes")
-    public List<BusinessType> getBusinessTypes() {
-        return nomenclaturesService.getBusinessTypes();
-    }
-}
Index: src/main/java/edu/gjoko/schedlr/controllers/rest/ReviewApi.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/rest/ReviewApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/controllers/rest/ReviewApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,44 @@
+package edu.gjoko.schedlr.controllers.rest;
+
+import edu.gjoko.schedlr.dto.ReviewDto;
+import edu.gjoko.schedlr.entity.Review;
+import edu.gjoko.schedlr.entity.Stakeholder;
+import edu.gjoko.schedlr.mappers.ReviewDtoMapper;
+import edu.gjoko.schedlr.services.ReviewService;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/review")
+@AllArgsConstructor
+public class ReviewApi {
+
+    private final ReviewService reviewService;
+    private final ReviewDtoMapper reviewDtoMapper;
+
+    @PostMapping
+    public void getBusinessTypes(@RequestBody Review review, HttpServletRequest request) {
+        Long customerId = (long) request.getSession(true).getAttribute("stakeholderId");
+        Stakeholder customer = new Stakeholder();
+        customer.setId(customerId);
+        reviewService.save(review, customerId);
+    }
+
+    @GetMapping(path = "/me")
+    public List<ReviewDto> getReviews(HttpServletRequest request) {
+        Long customerId = (long) request.getSession(true).getAttribute("stakeholderId");
+        return reviewService.getReviewsByCustomerId(customerId).stream()
+                .map(reviewDtoMapper::mapToReviewDto)
+                .toList();
+    }
+
+    @GetMapping(path = "/{serviceId}")
+    public List<ReviewDto> getReviewsForService(@PathVariable("serviceId") Long serviceId) {
+        return reviewService.getReviewsByServiceId(serviceId).stream()
+                .map(reviewDtoMapper::mapToReviewDto)
+                .toList();
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/controllers/rest/UserApi.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/rest/UserApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/controllers/rest/UserApi.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,19 @@
+package edu.gjoko.schedlr.controllers.rest;
+
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@RequestMapping("api/user")
+@AllArgsConstructor
+public class UserApi {
+
+    @GetMapping(path = "/me")
+    public boolean findAll(HttpServletRequest request) {
+        return request.getSession(true).getAttribute("stakeholderId") != null;
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/controllers/rest/UserController.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/controllers/rest/UserController.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ 	(revision )
@@ -1,21 +1,0 @@
-package edu.gjoko.schedlr.controllers.rest;
-
-import edu.gjoko.schedlr.entity.Business;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-
-@RestController
-@RequestMapping("api/user")
-@AllArgsConstructor
-public class UserController {
-
-    @GetMapping(path = "/me")
-    public boolean findAll(HttpServletRequest request) {
-        return request.getSession(true).getAttribute("stakeholderId") != null;
-    }
-}
Index: src/main/java/edu/gjoko/schedlr/dto/AppointmentDto.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/dto/AppointmentDto.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/dto/AppointmentDto.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,17 @@
+package edu.gjoko.schedlr.dto;
+
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class AppointmentDto {
+
+    private String title;
+    private LocalDateTime startTime;
+    private LocalDateTime endTime;
+}
Index: src/main/java/edu/gjoko/schedlr/dto/AppointmentInfoDto.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/dto/AppointmentInfoDto.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/dto/AppointmentInfoDto.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,18 @@
+package edu.gjoko.schedlr.dto;
+
+import lombok.*;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class AppointmentInfoDto {
+
+    private Long appointmentId;
+    private String fullName;
+    private String email;
+    private String phoneNumber;
+    private String timePeriod;
+    private String serviceName;
+    private String status;
+}
Index: src/main/java/edu/gjoko/schedlr/dto/ReviewDto.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/dto/ReviewDto.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/dto/ReviewDto.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,20 @@
+package edu.gjoko.schedlr.dto;
+
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ReviewDto {
+
+    private String customerName;
+    private String businessName;
+    private String serviceName;
+    private Long rating;
+    private String comment;
+    private LocalDateTime created;
+}
Index: src/main/java/edu/gjoko/schedlr/entity/Appointment.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/entity/Appointment.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/entity/Appointment.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -1,8 +1,6 @@
 package edu.gjoko.schedlr.entity;
 
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import lombok.*;
 import org.springframework.data.annotation.LastModifiedDate;
 import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@@ -14,6 +12,5 @@
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "appointment")
-@Getter
-@Setter
+@Data
 @NoArgsConstructor
 @AllArgsConstructor
@@ -30,15 +27,17 @@
     private LocalDateTime endTime;
 
-    @OneToOne
-    @JoinColumn(name = "customer_id", referencedColumnName = "id")
+    @ManyToOne
+    @JoinColumn(name = "stakeholder_id")
+    @JsonBackReference(value = "customerAppointments")
     private Stakeholder customer;
 
     @ManyToOne
-    @JoinColumn(name = "business_id")
-    private Business business;
+    @JoinColumn(name = "service_id")
+    @JsonBackReference(value = "serviceAppointments")
+    private Service service;
 
-    @ManyToOne
-    @JoinColumn(name = "service_id")
-    private Service service;
+    @Column(name = "appointment_status", length = 32, columnDefinition = "varchar(32) default 'NEW'")
+    @Enumerated(EnumType.STRING)
+    private AppointmentStatus appointmentStatus = AppointmentStatus.NEW;
 
     @Column(name = "created")
@@ -49,3 +48,8 @@
     @LastModifiedDate
     private LocalDateTime modified;
+
+    public String getTimePeriod() {
+        return startTime + " - " + endTime;
+    }
+
 }
Index: src/main/java/edu/gjoko/schedlr/entity/AppointmentStatus.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/entity/AppointmentStatus.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/entity/AppointmentStatus.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,8 @@
+package edu.gjoko.schedlr.entity;
+
+public enum AppointmentStatus {
+    NEW,
+    CANCELLED_BY_CUSTOMER,
+    CANCELLED_BY_BUSINESS_OWNER,
+    FINISHED_AND_REVIEWED_BY_USER;
+}
Index: src/main/java/edu/gjoko/schedlr/entity/Business.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/entity/Business.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/entity/Business.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -37,5 +37,5 @@
     private BusinessType businessType;
 
-    @ManyToOne()
+    @OneToOne(cascade = CascadeType.PERSIST)
     @JoinColumn(name = "owner_id", referencedColumnName = "id", nullable = false)
     @JsonProperty("owner")
@@ -43,5 +43,5 @@
 
     @OneToMany(mappedBy = "business", cascade = CascadeType.PERSIST)
-    @JsonManagedReference
+    @JsonManagedReference(value = "services")
     private List<Service> services;
 
Index: src/main/java/edu/gjoko/schedlr/entity/Review.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/entity/Review.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/entity/Review.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,46 @@
+package edu.gjoko.schedlr.entity;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+@Entity
+@EntityListeners(AuditingEntityListener.class)
+@Table(name = "review")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class Review {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE)
+    private Long id;
+
+    @Column(name = "rating")
+    private Integer rating;
+
+    @Column(name = "comment")
+    private String comment;
+
+    @OneToOne
+    @JoinColumn(name = "appointment_id", referencedColumnName = "id")
+    @JsonProperty("appointment")
+    private Appointment appointment;
+
+    @Column(name = "created")
+    @LastModifiedDate
+    private LocalDateTime created;
+
+    @Column(name = "modified")
+    @LastModifiedDate
+    private LocalDateTime modified;
+}
Index: src/main/java/edu/gjoko/schedlr/entity/Service.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/entity/Service.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/entity/Service.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -3,4 +3,5 @@
 import com.fasterxml.jackson.annotation.JsonBackReference;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonManagedReference;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
@@ -13,4 +14,5 @@
 import javax.persistence.*;
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Entity
@@ -33,5 +35,11 @@
     private Integer price;
 
-    @OneToOne(cascade = CascadeType.PERSIST)
+    @Column(name = "cumulated_rating")
+    private Float rating = 0.0f;
+
+    @Column(name = "reviews_count")
+    private Integer reviewsCount = 0;
+
+    @OneToOne(cascade = CascadeType.MERGE)
     @JoinColumn(name = "service_type_id", referencedColumnName = "id")
     private ServiceType serviceType;
@@ -39,6 +47,10 @@
     @ManyToOne
     @JoinColumn(name = "business_id")
-    @JsonBackReference
+    @JsonBackReference(value = "services")
     private Business business;
+
+    @OneToMany(mappedBy="service")
+    @JsonManagedReference(value = "serviceAppointments")
+    private List<Appointment> appointments;
 
     @Column(name = "created")
Index: src/main/java/edu/gjoko/schedlr/entity/Stakeholder.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/entity/Stakeholder.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/entity/Stakeholder.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -2,4 +2,5 @@
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonManagedReference;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
@@ -12,4 +13,5 @@
 import javax.persistence.*;
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Entity
@@ -39,4 +41,7 @@
     private String email;
 
+    @Column(name = "phone_number")
+    private String phoneNumber;
+
     @Column(name = "username")
     private String username;
@@ -44,4 +49,8 @@
     @Column(name = "password")
     private String password;
+
+    @OneToMany(mappedBy = "customer")
+    @JsonManagedReference(value = "customerAppointments")
+    private List<Appointment> appointments;
 
     @Column(name = "created")
@@ -54,3 +63,7 @@
     @JsonIgnore
     private LocalDateTime modified;
+
+    public String getFullName() {
+        return firstName + " " + lastName;
+    }
 }
Index: src/main/java/edu/gjoko/schedlr/exceptions/BlockingTimeException.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/exceptions/BlockingTimeException.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/exceptions/BlockingTimeException.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -3,5 +3,5 @@
 public class BlockingTimeException extends RuntimeException {
 
-    public static final String MESSAGE = "The selected dates are overlapping with another appointment";
+    public static final String MESSAGE = "Error! The selected dates are overlapping with another appointment.";
     public BlockingTimeException() {
         super(MESSAGE);
Index: src/main/java/edu/gjoko/schedlr/mappers/AppointmentDtoMapper.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/mappers/AppointmentDtoMapper.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/mappers/AppointmentDtoMapper.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,25 @@
+package edu.gjoko.schedlr.mappers;
+
+import edu.gjoko.schedlr.dto.AppointmentDto;
+import edu.gjoko.schedlr.entity.Appointment;
+import org.modelmapper.Condition;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeMap;
+import org.modelmapper.config.Configuration;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AppointmentDtoMapper extends ModelMapper {
+
+    public AppointmentDtoMapper() {
+        this.getConfiguration().setFieldMatchingEnabled(true).setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);
+        TypeMap<Appointment, AppointmentDto> propertyMapper = this.createTypeMap(Appointment.class, AppointmentDto.class);
+        Condition<String, String> hasTitle = ctx -> ctx.getSource() != null;
+        propertyMapper.addMappings(
+                mapper -> mapper.when(hasTitle).map(appointment -> appointment.getService().getServiceType().getName(), AppointmentDto::setTitle)
+        );
+    }
+    public AppointmentDto appointmentToAppointmentDto(Appointment appointment) {
+        return this.map(appointment, AppointmentDto.class);
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/mappers/AppointmentInfoDtoBusinessMapper.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/mappers/AppointmentInfoDtoBusinessMapper.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/mappers/AppointmentInfoDtoBusinessMapper.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,32 @@
+package edu.gjoko.schedlr.mappers;
+
+import edu.gjoko.schedlr.dto.AppointmentInfoDto;
+import edu.gjoko.schedlr.entity.Appointment;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeMap;
+import org.modelmapper.config.Configuration;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AppointmentInfoDtoBusinessMapper extends ModelMapper {
+
+    public AppointmentInfoDtoBusinessMapper() {
+        this.getConfiguration().setFieldMatchingEnabled(true).setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);
+        TypeMap<Appointment, AppointmentInfoDto> propertyMapper = this.createTypeMap(Appointment.class, AppointmentInfoDto.class);
+        propertyMapper.addMappings(
+                mapper -> {
+                    mapper.map(Appointment::getId, AppointmentInfoDto::setAppointmentId);
+                    mapper.map(appointment -> appointment.getCustomer().getFullName(), AppointmentInfoDto::setFullName);
+                    mapper.map(appointment -> appointment.getCustomer().getEmail(), AppointmentInfoDto::setEmail);
+                    mapper.map(appointment -> appointment.getCustomer().getPhoneNumber(),AppointmentInfoDto::setPhoneNumber);
+                    mapper.map(Appointment::getTimePeriod, AppointmentInfoDto::setTimePeriod);
+                    mapper.map(appointment -> appointment.getService().getServiceType().getName(), AppointmentInfoDto::setServiceName);
+                    mapper.map(Appointment::getAppointmentStatus, AppointmentInfoDto::setStatus);
+                }
+        );
+    }
+
+    public AppointmentInfoDto appointmentToAppointmentInfoDto(Appointment appointment) {
+        return this.map(appointment, AppointmentInfoDto.class);
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/mappers/AppointmentInfoDtoCustomerMapper.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/mappers/AppointmentInfoDtoCustomerMapper.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/mappers/AppointmentInfoDtoCustomerMapper.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,32 @@
+package edu.gjoko.schedlr.mappers;
+
+import edu.gjoko.schedlr.dto.AppointmentInfoDto;
+import edu.gjoko.schedlr.entity.Appointment;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeMap;
+import org.modelmapper.config.Configuration;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AppointmentInfoDtoCustomerMapper extends ModelMapper {
+
+    public AppointmentInfoDtoCustomerMapper() {
+        this.getConfiguration().setFieldMatchingEnabled(true).setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);
+        TypeMap<Appointment, AppointmentInfoDto> propertyMapper = this.createTypeMap(Appointment.class, AppointmentInfoDto.class);
+        propertyMapper.addMappings(
+                mapper -> {
+                    mapper.map(Appointment::getId, AppointmentInfoDto::setAppointmentId);
+                    mapper.map(appointment -> appointment.getService().getBusiness().getOwner().getFullName(), AppointmentInfoDto::setFullName);
+                    mapper.map(appointment -> appointment.getCustomer().getEmail(), AppointmentInfoDto::setEmail);
+                    mapper.map(appointment -> appointment.getCustomer().getPhoneNumber(),AppointmentInfoDto::setPhoneNumber);
+                    mapper.map(Appointment::getTimePeriod, AppointmentInfoDto::setTimePeriod);
+                    mapper.map(appointment -> appointment.getService().getServiceType().getName(), AppointmentInfoDto::setServiceName);
+                    mapper.map(Appointment::getAppointmentStatus, AppointmentInfoDto::setStatus);
+                }
+        );
+    }
+
+    public AppointmentInfoDto appointmentToAppointmentInfoDto(Appointment appointment) {
+        return this.map(appointment, AppointmentInfoDto.class);
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/mappers/ReviewDtoMapper.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/mappers/ReviewDtoMapper.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/mappers/ReviewDtoMapper.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,32 @@
+package edu.gjoko.schedlr.mappers;
+
+import edu.gjoko.schedlr.dto.AppointmentDto;
+import edu.gjoko.schedlr.dto.ReviewDto;
+import edu.gjoko.schedlr.entity.Appointment;
+import edu.gjoko.schedlr.entity.Review;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeMap;
+import org.modelmapper.config.Configuration;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ReviewDtoMapper extends ModelMapper {
+
+    public ReviewDtoMapper() {
+        this.getConfiguration().setFieldMatchingEnabled(true).setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);
+        TypeMap<Review, ReviewDto> propertyMapper = this.createTypeMap(Review.class, ReviewDto.class);
+        propertyMapper.addMappings(mapper -> {
+            mapper.map(review -> review.getAppointment().getService().getBusiness().getCompanyName(), ReviewDto::setBusinessName);
+            mapper.map(review -> review.getAppointment().getCustomer().getFullName(), ReviewDto::setCustomerName);
+            mapper.map(review -> review.getAppointment().getService().getServiceType().getName(), ReviewDto::setServiceName);
+            mapper.map(Review::getComment, ReviewDto::setComment);
+            mapper.map(Review::getRating, ReviewDto::setRating);
+            mapper.map(Review::getCreated, ReviewDto::setCreated);
+        }
+        );
+    }
+
+    public ReviewDto mapToReviewDto(Review review) {
+        return this.map(review, ReviewDto.class);
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/repositories/AppointmentRepository.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/repositories/AppointmentRepository.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/repositories/AppointmentRepository.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -2,5 +2,4 @@
 
 import edu.gjoko.schedlr.entity.Appointment;
-import edu.gjoko.schedlr.entity.Business;
 import edu.gjoko.schedlr.entity.Stakeholder;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -10,21 +9,46 @@
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Optional;
 
 @Repository
 public interface AppointmentRepository extends JpaRepository<Appointment, Long> {
 
-    List<Appointment> getAppointmentsByBusiness(Business business);
+    @Query(value = "select ap from Appointment as ap " +
+            "where ap.service.business.id = :businessId " +
+            "and ap.appointmentStatus = 'NEW'")
+    List<Appointment> getActiveAppointmentsByBusiness(Long businessId);
 
-    List<Appointment> getAppointmentsByCustomer(Stakeholder customer);
+    @Query( value = "select ap from Appointment as ap " +
+            "where ap.service.business.id = :businessId " +
+            "and (" +
+            "(ap.startTime between :startDate and :endDate) " +
+            "or (ap.endTime between :startDate and :endDate) " +
+            "or (:startDate = ap.startTime and ap.startTime = :endDate)" +
+            "or (:startDate > ap.startTime and ap.endTime > :endDate)" +
+            ")")
+    List<Appointment> findBlockingAppointments(Long businessId, LocalDateTime startDate, LocalDateTime endDate);
 
-    List<Appointment> findAppointmentsByBusinessAndStartTimeBetweenOrEndTimeBetween(Business business, LocalDateTime startTime, LocalDateTime endTime, LocalDateTime startTime1, LocalDateTime endTime1);
+    @Query(value = "select ap from Appointment  as ap " +
+            "where ap.service.business.owner.id = :businessOwnerId " +
+            "and ap.startTime > :now ")
+    List<Appointment> findFutureAppointmentsByBusinessOwnerId(Long businessOwnerId, LocalDateTime now);
 
-    @Query(value = "select a from Appointment a " +
-            "where business_id = :businessId " +
-            "and (" +
-            "(start_time between :startDate and :endDate) " +
-            "or (end_time between :startDate and :endDate) " +
-            "or (:startDate <= start_time and end_time >= :endDate)" +
-            ")", nativeQuery = true)
-    List<Appointment> findBlockingAppointments(Long businessId, LocalDateTime startDate, LocalDateTime endDate);
+    @Query(value = "select ap from Appointment  as ap " +
+            "where ap.customer.id = :customerId " +
+            "and ap.startTime < :now")
+    List<Appointment> findPastAppointmentsByCustomerId(Long customerId, LocalDateTime now);
+
+    @Query(value = "select ap from Appointment  as ap " +
+            "where ap.service.business.owner.id = :businessOwnerId " +
+            "and ap.startTime < :now ")
+    List<Appointment> findPastAppointmentsByBusinessOwnerId(Long businessOwnerId, LocalDateTime now);
+
+    @Query(value = "select ap from Appointment  as ap " +
+            "where ap.customer.id = :customerId " +
+            "and ap.startTime > :now ")
+    List<Appointment> findFutureAppointmentsByCustomerId(Long customerId, LocalDateTime now);
+
+    Optional<Appointment> findAppointmentByIdAndCustomer_Id(Long id, Long customerId);
+
+    Optional<Appointment> findAppointmentByIdAndService_Business_Owner_Id(Long id, Long ownerId);
 }
Index: src/main/java/edu/gjoko/schedlr/repositories/BusinessRepository.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/repositories/BusinessRepository.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/repositories/BusinessRepository.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -17,3 +17,5 @@
 
     List<Business> findBusinessesByBusinessTypeAndBusinessStatus(BusinessType businessType, BusinessStatus businessStatus);
+
+    List<Business> findBusinessesByBusinessStatusAndBusinessType_Id(BusinessStatus businessStatus, Long id);
 }
Index: src/main/java/edu/gjoko/schedlr/repositories/ReviewRepository.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/repositories/ReviewRepository.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/repositories/ReviewRepository.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,16 @@
+package edu.gjoko.schedlr.repositories;
+
+import edu.gjoko.schedlr.entity.Review;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ReviewRepository extends JpaRepository<Review, Long> {
+
+
+    List<Review> findAllByAppointment_Customer_Id(Long customerId);
+
+    List<Review> findAllByAppointment_Service_Id(Long serviceId);
+}
Index: src/main/java/edu/gjoko/schedlr/services/AppointmentsService.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/services/AppointmentsService.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/services/AppointmentsService.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -1,15 +1,21 @@
 package edu.gjoko.schedlr.services;
 
-import edu.gjoko.schedlr.entity.Appointment;
-import edu.gjoko.schedlr.entity.Business;
-import edu.gjoko.schedlr.entity.Stakeholder;
+import edu.gjoko.schedlr.dto.AppointmentInfoDto;
+import edu.gjoko.schedlr.entity.*;
 import edu.gjoko.schedlr.exceptions.BlockingTimeException;
+import edu.gjoko.schedlr.mappers.AppointmentInfoDtoBusinessMapper;
+import edu.gjoko.schedlr.mappers.AppointmentInfoDtoCustomerMapper;
 import edu.gjoko.schedlr.repositories.AppointmentRepository;
 import edu.gjoko.schedlr.repositories.ServiceRepository;
-import edu.gjoko.schedlr.repositories.ServiceTypeRepository;
+import edu.gjoko.schedlr.repositories.StakeholderRepository;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.EntityNotFoundException;
+import javax.security.sasl.AuthenticationException;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 @Service
@@ -18,13 +24,18 @@
 
     private final AppointmentRepository appointmentRepository;
+    private final StakeholderRepository stakeholderRepository;
+    private final ServiceRepository serviceRepository;
+    private final AppointmentInfoDtoBusinessMapper appointmentInfoDtoBusinessMapper;
+    private final AppointmentInfoDtoCustomerMapper appointmentInfoDtoCustomerMapper;
 
-    private final ServiceRepository serviceRepository;
 
     public void saveAppointment(Appointment appointment) {
         var service = serviceRepository.findById(appointment.getService().getId()).get();
-        appointment.setEndTime(appointment.getStartTime().plusMinutes(service.getDuration()));
+
+        // remove 1 minute in order to prevent overlapping
+        appointment.setEndTime(appointment.getStartTime().plusMinutes(service.getDuration() - 1));
         List<Appointment> blockingAppointments = appointmentRepository.
                 findBlockingAppointments(
-                        appointment.getBusiness().getId(), appointment.getStartTime(), appointment.getEndTime());
+                        appointment.getService().getBusiness().getId(), appointment.getStartTime(), appointment.getEndTime());
 
         // check to see if there are blocking exceptions
@@ -35,10 +46,64 @@
     }
 
-    public List<Appointment> getAppointmentsByBusiness(Business business) {
-        return appointmentRepository.getAppointmentsByBusiness(business);
+    public List<AppointmentInfoDto> getFutureAppointmentInfoList(Long stakeholderId) {
+        StakeholderType type = stakeholderRepository.findById(stakeholderId).get().getStakeholderType();
+        List<AppointmentInfoDto> appointmentInfoDtoList = new ArrayList<>();
+
+        switch (type) {
+            case BUSINESS_OWNER -> appointmentInfoDtoList = appointmentRepository.findFutureAppointmentsByBusinessOwnerId(stakeholderId, LocalDateTime.now())
+                    .stream()
+                    .map(appointmentInfoDtoBusinessMapper::appointmentToAppointmentInfoDto)
+                    .toList();
+            case CUSTOMER -> appointmentInfoDtoList = appointmentRepository.findFutureAppointmentsByCustomerId(stakeholderId, LocalDateTime.now())
+                    .stream()
+                    .map(appointmentInfoDtoCustomerMapper::appointmentToAppointmentInfoDto)
+                    .toList();
+        }
+
+        return appointmentInfoDtoList;
     }
 
-    private List<Appointment> getAppointmentsByCustomer(Stakeholder stakeholder) {
-        return appointmentRepository.getAppointmentsByCustomer(stakeholder);
+    public List<AppointmentInfoDto> getPastAppointmentInfoList(Long stakeholderId) {
+        StakeholderType type = stakeholderRepository.findById(stakeholderId).get().getStakeholderType();
+        List<Appointment> appointmentInfoDtoList = new ArrayList<>();
+
+        switch (type) {
+            case BUSINESS_OWNER -> appointmentInfoDtoList = appointmentRepository.findPastAppointmentsByBusinessOwnerId(stakeholderId, LocalDateTime.now());
+            case CUSTOMER -> appointmentInfoDtoList = appointmentRepository.findPastAppointmentsByCustomerId(stakeholderId, LocalDateTime.now());
+        }
+
+        return appointmentInfoDtoList
+                .stream()
+                .map(appointmentInfoDtoBusinessMapper::appointmentToAppointmentInfoDto)
+                .toList();
+
+    }
+
+    public List<Appointment> getActiveAppointmentsByBusiness(Long businessId) {
+        return appointmentRepository.getActiveAppointmentsByBusiness(businessId);
+    }
+
+    public void deleteAppointment(Long appointmentId, Long stakeholderId) throws AuthenticationException {
+        Optional<Stakeholder> stakeholderOptional = stakeholderRepository.findById(stakeholderId);
+        if (stakeholderOptional.isPresent()) {
+            Optional<Appointment> optional = appointmentRepository.findAppointmentByIdAndCustomer_Id(appointmentId, stakeholderId);
+            if (optional.isEmpty()) {
+                optional = appointmentRepository.findAppointmentByIdAndService_Business_Owner_Id(appointmentId, stakeholderId);
+                if (optional.isEmpty()) {
+                    throw new EntityNotFoundException("No appointment was found for the give stakeholder and appointment id.");
+                } else {
+                    softDeleteAppointment(optional.get(), AppointmentStatus.CANCELLED_BY_BUSINESS_OWNER);
+                }
+            } else {
+                softDeleteAppointment(optional.get(), AppointmentStatus.CANCELLED_BY_CUSTOMER);
+            }
+        } else {
+            throw new AuthenticationException();
+        }
+    }
+
+    public void softDeleteAppointment(Appointment appointment, AppointmentStatus appointmentStatus) {
+        appointment.setAppointmentStatus(appointmentStatus);
+        appointmentRepository.save(appointment);
     }
 }
Index: src/main/java/edu/gjoko/schedlr/services/BusinessService.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/services/BusinessService.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/services/BusinessService.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -2,11 +2,9 @@
 
 import edu.gjoko.schedlr.entity.*;
-import edu.gjoko.schedlr.repositories.BusinessRepository;
-import edu.gjoko.schedlr.repositories.ServiceRepository;
-import edu.gjoko.schedlr.repositories.ServiceTypeRepository;
-import edu.gjoko.schedlr.repositories.StakeholderRepository;
+import edu.gjoko.schedlr.repositories.*;
 import lombok.AllArgsConstructor;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.util.List;
@@ -22,4 +20,5 @@
     private final ServiceTypeRepository serviceTypeRepository;
     private final ServiceRepository serviceRepository;
+    private final StakeholderService stakeholderService;
 
     private final StakeholderRepository stakeholderRepository;
@@ -54,7 +53,7 @@
                 .stream()
                 .forEach(business -> {
-                    stakeholderRepository.save(business.getOwner());
-                    serviceRepository.saveAll(business.getServices());
-                    businessRepository.save(business);
+                    stakeholderService.saveOrUpdateStakeholder(business.getOwner());
+                    saveOrUpdateServices(business.getServices());
+                    saveOrUpdateBusiness(business);
                 });
     }
@@ -66,6 +65,28 @@
     }
 
-    public List<Business> findByBusinessTypeAndActiveStatus(BusinessType businessType) {
-        return businessRepository.findBusinessesByBusinessTypeAndBusinessStatus(businessType, ACTIVE);
+    public List<Business> findByBusinessTypeAndActiveStatus(Long businessTypeId) {
+        return businessRepository.findBusinessesByBusinessStatusAndBusinessType_Id(ACTIVE, businessTypeId);
+    }
+
+
+
+    private void saveOrUpdateBusiness(Business business) {
+        if (business.getId() != null) {
+            var foundBusinessEntity = businessRepository.findById(business.getId());
+            business.setCreated(foundBusinessEntity.get().getCreated());
+        }
+        businessRepository.save(business);
+    }
+
+    private void saveOrUpdateServices(List<edu.gjoko.schedlr.entity.Service> serviceList) {
+        if (!CollectionUtils.isEmpty(serviceList)) {
+            serviceList.forEach( service -> {
+                if (service.getId() != null) {
+                    var found = serviceRepository.findById(service.getId());
+                    service.setCreated(found.get().getCreated());
+                }
+            });
+            serviceRepository.saveAll(serviceList);
+        }
     }
 }
Index: src/main/java/edu/gjoko/schedlr/services/ReviewService.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/services/ReviewService.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
+++ src/main/java/edu/gjoko/schedlr/services/ReviewService.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -0,0 +1,57 @@
+package edu.gjoko.schedlr.services;
+
+import edu.gjoko.schedlr.entity.Appointment;
+import edu.gjoko.schedlr.entity.AppointmentStatus;
+import edu.gjoko.schedlr.entity.Review;
+import edu.gjoko.schedlr.repositories.AppointmentRepository;
+import edu.gjoko.schedlr.repositories.ReviewRepository;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.EntityNotFoundException;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@AllArgsConstructor
+public class ReviewService {
+
+    private final ReviewRepository reviewRepository;
+    private final AppointmentRepository appointmentRepository;
+
+    public void save(Review review, Long customerId) {
+        Optional<Appointment> appointmentOptional = appointmentRepository.findById(review.getAppointment().getId());
+        if (appointmentOptional.isEmpty()) {
+            throw new EntityNotFoundException();
+        }
+        Appointment appointment = appointmentOptional.get();
+        if (appointment.getCustomer().getId().equals(customerId)) {
+            review.setAppointment(appointment);
+            markAppointmentAsReviewed(review.getAppointment());
+            calculateAndUpdateCumulatedRatingForService(appointment.getService(), review.getRating());
+            reviewRepository.save(review);
+        } else {
+            throw new EntityNotFoundException();
+        }
+    }
+
+    public List<Review> getReviewsByServiceId(Long businessId) {
+        return reviewRepository.findAllByAppointment_Service_Id(businessId);
+    }
+
+    public List<Review> getReviewsByCustomerId(Long customerId) {
+        return reviewRepository.findAllByAppointment_Customer_Id(customerId);
+    }
+
+    private void markAppointmentAsReviewed(Appointment appointment) {
+        appointment.setAppointmentStatus(AppointmentStatus.FINISHED_AND_REVIEWED_BY_USER);
+    }
+
+    private void calculateAndUpdateCumulatedRatingForService(edu.gjoko.schedlr.entity.Service service, int rating) {
+        int newReviewsCount = service.getReviewsCount() + 1;
+        float currentRating = service.getRating();
+        float newRating = (currentRating * service.getReviewsCount() + rating) / newReviewsCount;
+        service.setReviewsCount(newReviewsCount);
+        service.setRating(newRating);
+    }
+}
Index: src/main/java/edu/gjoko/schedlr/services/StakeholderService.java
===================================================================
--- src/main/java/edu/gjoko/schedlr/services/StakeholderService.java	(revision 950fa0d7a6b439770e79c885947e9b7d6058b424)
+++ src/main/java/edu/gjoko/schedlr/services/StakeholderService.java	(revision 77205be723c8b2ffd1ee5618a05e1d12b1cee44a)
@@ -6,4 +6,6 @@
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
+
+import java.util.Optional;
 
 @Service
@@ -28,3 +30,15 @@
         return stakeholderRepository.findById(id).get();
     }
+
+    public void saveOrUpdateStakeholder(Stakeholder stakeholder) {
+        if (stakeholder.getId() != null) {
+            var found = stakeholderRepository.findById(stakeholder.getId()).get();
+            found.setFirstName(stakeholder.getFirstName());
+            found.setLastName(stakeholder.getLastName());
+            found.setPhoneNumber(stakeholder.getPhoneNumber());
+            found.setEmail(stakeholder.getEmail());
+            found.setUsername(stakeholder.getUsername());
+            stakeholderRepository.save(found);
+        }
+    }
 }
