Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/bootstrap/DataHolder.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/bootstrap/DataHolder.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/bootstrap/DataHolder.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -26,4 +26,6 @@
     public static List<Local> locals = new ArrayList<>();
     public static List<Event> events = new ArrayList<>();
+    private final TableRepository tableRepository;
+
 
     private final AdminRepository adminRepository;
@@ -35,5 +37,6 @@
     private final EventRepository eventRepository;
 
-    public DataHolder(AdminRepository adminRepository, CustomerRepository customerRepository, LocalManagerRepository localManagerRepository, LocalRepository localRepository, LocalWorkerRepository localWorkerRepository, PasswordEncoder passwordEncoder, EventRepository eventRepository) {
+    public DataHolder(TableRepository tableRepository, AdminRepository adminRepository, CustomerRepository customerRepository, LocalManagerRepository localManagerRepository, LocalRepository localRepository, LocalWorkerRepository localWorkerRepository, PasswordEncoder passwordEncoder, EventRepository eventRepository) {
+        this.tableRepository = tableRepository;
         this.adminRepository = adminRepository;
         this.customerRepository = customerRepository;
@@ -120,6 +123,17 @@
         }
         localRepository.saveAll(locals);
-
+        List<DiningTable> tables = new ArrayList<>();
+        int tableCounter = 1;
         for (Local local : locals) {
+            for (int j = 1; j <= 5; j++) {
+                DiningTable table = new DiningTable(
+                        tableCounter,
+                        2 + (j % 3),
+                        local
+                );
+                tables.add(table);
+                tableCounter++;
+            }
+            tableRepository.saveAll(tables);
             // Active event
             Event activeEvent = new Event(
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/CreateReservationDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/CreateReservationDTO.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/CreateReservationDTO.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.it.reservengo.dto.reservationDTO;
+
+import java.time.LocalDateTime;
+
+public record CreateReservationDTO(
+        Long localId,
+        LocalDateTime timeOfReservation,
+        Long tableId,
+        Integer tableNumber,
+        Integer capacity
+) {
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/DisplayReservationDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/DisplayReservationDTO.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/DisplayReservationDTO.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,34 @@
+package mk.ukim.finki.it.reservengo.dto.reservationDTO;
+
+import mk.ukim.finki.it.reservengo.model.domain.Reservation;
+import mk.ukim.finki.it.reservengo.model.enumerations.ReservationStatus;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+public record DisplayReservationDTO(
+        String localName,
+        String localLogo,
+        LocalDateTime timeOfReservation,
+        Integer tableNumber,
+        Integer capacity,
+        ReservationStatus status
+) {
+
+    public static DisplayReservationDTO from(Reservation reservation) {
+        return new DisplayReservationDTO(
+                reservation.getLocal().getName(),
+                reservation.getLocal().getLogoUrl(),
+                reservation.getTimeOfReservation(),
+                reservation.getTable().getTableNumber(),
+                reservation.getTable().getCapacity(),
+                reservation.getStatus()
+        );
+    }
+
+    public static List<DisplayReservationDTO> from(List<Reservation> reservations) {
+        return reservations.stream()
+                .map(DisplayReservationDTO::from)
+                .toList();
+    }
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/EditReservationDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/EditReservationDTO.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/EditReservationDTO.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.it.reservengo.dto.reservationDTO;
+
+import mk.ukim.finki.it.reservengo.model.enumerations.ReservationStatus;
+
+import java.time.LocalDateTime;
+
+public record EditReservationDTO(
+        LocalDateTime timeOfReservation,
+        Long tableId,
+        ReservationStatus status
+) {
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/EditReservationInfoDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/EditReservationInfoDTO.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/reservationDTO/EditReservationInfoDTO.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,30 @@
+package mk.ukim.finki.it.reservengo.dto.reservationDTO;
+
+import mk.ukim.finki.it.reservengo.dto.tableDTO.TableInfoDTO;
+import mk.ukim.finki.it.reservengo.model.domain.Reservation;
+import mk.ukim.finki.it.reservengo.model.enumerations.ReservationStatus;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+public record EditReservationInfoDTO(
+        String localName,
+        String localLogo,
+        LocalDateTime currentTimeOfReservation,
+        Long currentTableId,
+        Integer currentTableNumber,
+        ReservationStatus currentReservationStatus,
+        List<TableInfoDTO> availableTables
+) {
+    public static EditReservationInfoDTO from(Reservation reservation, List<TableInfoDTO> availableTables) {
+        return new EditReservationInfoDTO(
+                reservation.getLocal().getName(),
+                reservation.getLocal().getLogoUrl(),
+                reservation.getTimeOfReservation(),
+                reservation.getTable().getId(),
+                reservation.getTable().getTableNumber(),
+                reservation.getStatus(),
+                availableTables
+        );
+    }
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/tableDTO/TableInfoDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/tableDTO/TableInfoDTO.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/tableDTO/TableInfoDTO.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,8 @@
+package mk.ukim.finki.it.reservengo.dto.tableDTO;
+
+public record TableInfoDTO(
+        Long id,
+        Integer tableNumber,
+        Integer capacity
+) {
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/DiningTable.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/DiningTable.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/DiningTable.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,28 @@
+package mk.ukim.finki.it.reservengo.model.domain;
+
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class DiningTable {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    private Integer tableNumber;
+    private Integer capacity;
+
+    @ManyToOne
+    private Local local;
+
+    public DiningTable(Integer tableNumber, Integer capacity, Local local) {
+        this.tableNumber = tableNumber;
+        this.capacity = capacity;
+        this.local = local;
+    }
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/Reservation.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/Reservation.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/Reservation.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -6,5 +6,5 @@
 import mk.ukim.finki.it.reservengo.model.enumerations.ReservationStatus;
 
-import java.util.Map;
+import java.time.LocalDateTime;
 
 @EqualsAndHashCode(callSuper = true)
@@ -24,8 +24,8 @@
     private Local local;
 
-    @ElementCollection
-    @MapKeyColumn(name = "table_id")
-    @Column(name = "num_people")
-    private Map<Integer, Integer> reservedTables;
+    private LocalDateTime timeOfReservation;
+
+    @ManyToOne
+    private DiningTable table;
 
     @Enumerated(EnumType.STRING)
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/ReservationStatus.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/ReservationStatus.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/ReservationStatus.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -2,5 +2,5 @@
 
 public enum ReservationStatus {
-    DENIED,
+    EXPIRED,
     PENDING,
     ACCEPTED,
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/TableIdNotFoundException.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/TableIdNotFoundException.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/TableIdNotFoundException.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.it.reservengo.model.exceptions;
+
+public class TableIdNotFoundException extends RuntimeException {
+    public TableIdNotFoundException(Long id) {
+        super("Table with id " + id + " not found");
+    }
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/TableNotAvailableException.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/TableNotAvailableException.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/TableNotAvailableException.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,9 @@
+package mk.ukim.finki.it.reservengo.model.exceptions;
+
+import java.time.LocalDateTime;
+
+public class TableNotAvailableException extends RuntimeException {
+    public TableNotAvailableException(Long tableId, LocalDateTime time) {
+        super("Table with id " + tableId + " is not available at time " + time);
+    }
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/UnauthorizedReservationAccessException.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/UnauthorizedReservationAccessException.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/UnauthorizedReservationAccessException.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.it.reservengo.model.exceptions;
+
+public class UnauthorizedReservationAccessException extends RuntimeException {
+    public UnauthorizedReservationAccessException(Long customerId, Long reservationId) {
+        super("Customer with id " + customerId + " is not authorized to access reservation with id " + reservationId + ".");
+    }
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/ReservationRepository.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/ReservationRepository.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/ReservationRepository.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -2,11 +2,13 @@
 
 import mk.ukim.finki.it.reservengo.model.domain.Reservation;
+import mk.ukim.finki.it.reservengo.model.enumerations.ReservationStatus;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 @Repository
 public interface ReservationRepository extends JpaRepository<Reservation, Long> {
-    List<Reservation> findAllByCustomerId(Long customerId);
+    List<Reservation> findByTableIdAndTimeOfReservationAndStatusNot(Long tableId, LocalDateTime reservationTime, ReservationStatus reservationStatus);
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/TableRepository.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/TableRepository.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/TableRepository.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,10 @@
+package mk.ukim.finki.it.reservengo.repository;
+
+import mk.ukim.finki.it.reservengo.model.domain.DiningTable;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface TableRepository extends JpaRepository<DiningTable, Long> {
+    List<DiningTable> findByLocalId(Long id);
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/CustomerServiceImpl.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/CustomerServiceImpl.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/CustomerServiceImpl.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -4,15 +4,20 @@
 import mk.ukim.finki.it.reservengo.dto.eventDTO.DisplayEventDTO;
 import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDTO;
-import mk.ukim.finki.it.reservengo.model.domain.Customer;
-import mk.ukim.finki.it.reservengo.model.domain.Event;
-import mk.ukim.finki.it.reservengo.model.domain.Local;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.CreateReservationDTO;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.DisplayReservationDTO;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.EditReservationDTO;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.EditReservationInfoDTO;
+import mk.ukim.finki.it.reservengo.dto.tableDTO.TableInfoDTO;
+import mk.ukim.finki.it.reservengo.model.domain.*;
+import mk.ukim.finki.it.reservengo.model.enumerations.ReservationStatus;
 import mk.ukim.finki.it.reservengo.model.exceptions.*;
 import mk.ukim.finki.it.reservengo.repository.CustomerRepository;
-import mk.ukim.finki.it.reservengo.service.intf.CustomerService;
-import mk.ukim.finki.it.reservengo.service.intf.EventService;
-import mk.ukim.finki.it.reservengo.service.intf.LocalService;
-import mk.ukim.finki.it.reservengo.service.intf.UserService;
+import mk.ukim.finki.it.reservengo.repository.ReservationRepository;
+import mk.ukim.finki.it.reservengo.repository.TableRepository;
+import mk.ukim.finki.it.reservengo.service.intf.*;
 import org.springframework.stereotype.Service;
-
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
 import java.util.List;
 
@@ -23,10 +28,16 @@
     private final UserService userService;
     private final EventService eventService;
-
-    public CustomerServiceImpl(CustomerRepository customerRepository, LocalService localService, UserService userService, EventService eventService) {
+    private final ReservationRepository reservationRepository;
+    private final TableRepository tableRepository;
+    private final TableService tableService;
+
+    public CustomerServiceImpl(CustomerRepository customerRepository, LocalService localService, UserService userService, EventService eventService, ReservationRepository reservationRepository, TableRepository tableRepository, TableService tableService) {
         this.customerRepository = customerRepository;
         this.localService = localService;
         this.userService = userService;
         this.eventService = eventService;
+        this.reservationRepository = reservationRepository;
+        this.tableRepository = tableRepository;
+        this.tableService = tableService;
     }
 
@@ -124,3 +135,97 @@
         return local.getRatings().get(customerId);
     }
+
+    @Override
+    public List<DisplayReservationDTO> listAllReservations(Long id) {
+        Customer customer = customerRepository.findById(id).orElseThrow(() -> new CustomerIdNotFoundException(id));
+        return DisplayReservationDTO.from(customer.getReservations());
+    }
+
+    @Override
+    public DisplayReservationDTO getReservationPreview(Long customerId, Long reservationId) {
+        Reservation reservation = reservationRepository.findById(reservationId).orElseThrow(() -> new ReservationIdNotFoundException(reservationId));
+
+        if (!reservation.getCustomer().getId().equals(customerId)) {
+            throw new UnauthorizedReservationAccessException(customerId, reservationId);
+        }
+
+        return DisplayReservationDTO.from(reservation);
+    }
+
+    @Override
+    @Transactional
+    public DisplayReservationDTO editReservation(Long id, Long reservationId, EditReservationDTO editReservationDTO) {
+        Reservation reservation = reservationRepository.findById(reservationId).orElseThrow(() -> new ReservationIdNotFoundException(reservationId));
+
+        if (!reservation.getCustomer().getId().equals(id)) {
+            throw new UnauthorizedReservationAccessException(id, reservationId);
+        }
+
+        LocalDateTime newTime = editReservationDTO.timeOfReservation();
+        Long newTableId = editReservationDTO.tableId();
+
+        if (!tableService.isTableAvailable(newTableId, newTime)) {
+            throw new TableNotAvailableException(newTableId, newTime);
+        }
+
+        reservation.setTimeOfReservation(newTime);
+
+        DiningTable table = tableRepository.findById(newTableId).orElseThrow(() -> new TableIdNotFoundException(editReservationDTO.tableId()));
+
+        reservation.setTable(table);
+        reservation.setStatus(editReservationDTO.status());
+        reservationRepository.save(reservation);
+
+        return DisplayReservationDTO.from(reservation);
+    }
+
+    @Override
+    public void cancelReservation(Long id, Long reservationId) {
+        Reservation reservation = reservationRepository.findById(reservationId).orElseThrow(() -> new ReservationIdNotFoundException(reservationId));
+
+        if (!reservation.getCustomer().getId().equals(id)) {
+            throw new UnauthorizedReservationAccessException(id, reservationId);
+        }
+
+        reservation.setStatus(ReservationStatus.CANCELED);
+        reservationRepository.save(reservation);
+    }
+
+    @Override
+    public EditReservationInfoDTO getEditReservationInfo(Long id, Long reservationId) {
+        Reservation reservation = reservationRepository.findById(reservationId).orElseThrow(() -> new ReservationIdNotFoundException(reservationId));
+
+        if (!reservation.getCustomer().getId().equals(id)) {
+            throw new UnauthorizedReservationAccessException(id, reservationId);
+        }
+
+        List<TableInfoDTO> availableTablesAtThatTime = tableService.getAvailableTables(reservation.getLocal().getId(), reservation.getTimeOfReservation());
+
+        return EditReservationInfoDTO.from(reservation, availableTablesAtThatTime);
+    }
+
+    @Override
+    @Transactional
+    public DisplayReservationDTO makeReservation(Long id, CreateReservationDTO createReservationDTO) {
+        Customer customer = customerRepository.findById(id).orElseThrow(() -> new CustomerIdNotFoundException(id));
+        Local local = localService.findLocalById(createReservationDTO.localId());
+        Long tableId = createReservationDTO.tableId();
+
+        if (!tableService.isTableAvailable(tableId, createReservationDTO.timeOfReservation())) {
+            throw new TableNotAvailableException(tableId, createReservationDTO.timeOfReservation());
+        }
+
+        DiningTable table = tableRepository.findById(tableId).orElseThrow(() -> new TableIdNotFoundException(tableId));
+
+        Reservation reservation = new Reservation();
+        reservation.setCustomer(customer);
+        reservation.setLocal(local);
+        reservation.setTimeOfReservation(createReservationDTO.timeOfReservation());
+        reservation.setTable(table);
+        reservation.setStatus(ReservationStatus.PENDING);
+
+        reservationRepository.save(reservation);
+
+        return DisplayReservationDTO.from(reservation);
+    }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/TableServiceImpl.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/TableServiceImpl.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/TableServiceImpl.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,44 @@
+package mk.ukim.finki.it.reservengo.service.impl;
+
+import mk.ukim.finki.it.reservengo.dto.tableDTO.TableInfoDTO;
+import mk.ukim.finki.it.reservengo.model.domain.DiningTable;
+import mk.ukim.finki.it.reservengo.model.enumerations.ReservationStatus;
+import mk.ukim.finki.it.reservengo.repository.ReservationRepository;
+import mk.ukim.finki.it.reservengo.repository.TableRepository;
+import mk.ukim.finki.it.reservengo.service.intf.TableService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+public class TableServiceImpl implements TableService {
+
+    private final TableRepository tableRepository;
+    private final ReservationRepository reservationRepository;
+
+    public TableServiceImpl(TableRepository tableRepository, ReservationRepository reservationRepository) {
+        this.tableRepository = tableRepository;
+        this.reservationRepository = reservationRepository;
+    }
+
+    @Override
+    public List<TableInfoDTO> getAvailableTables(Long localId, LocalDateTime reservationTime) {
+        List<DiningTable> allTables = tableRepository.findByLocalId(localId);
+
+        return allTables.stream()
+                .filter(t -> isTableAvailable(t.getId(), reservationTime))
+                .map(t -> new TableInfoDTO(t.getId(), t.getTableNumber(), t.getCapacity()))
+                .toList();
+    }
+
+    @Override
+    public boolean isTableAvailable(Long tableId, LocalDateTime reservationTime) {
+        return reservationRepository
+                .findByTableIdAndTimeOfReservationAndStatusNot(
+                        tableId,
+                        reservationTime,
+                        ReservationStatus.CANCELED
+                ).isEmpty();
+    }
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/CustomerService.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/CustomerService.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/CustomerService.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -4,6 +4,9 @@
 import mk.ukim.finki.it.reservengo.dto.eventDTO.DisplayEventDTO;
 import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDTO;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.CreateReservationDTO;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.DisplayReservationDTO;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.EditReservationDTO;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.EditReservationInfoDTO;
 import mk.ukim.finki.it.reservengo.model.domain.Customer;
-import mk.ukim.finki.it.reservengo.model.domain.Local;
 
 import java.util.List;
@@ -30,3 +33,15 @@
 
     int findLocalRating(Long customerId, Long localId);
+
+    List<DisplayReservationDTO> listAllReservations(Long id);
+
+    DisplayReservationDTO getReservationPreview(Long customerId, Long reservationId);
+
+    DisplayReservationDTO editReservation(Long id, Long reservationId, EditReservationDTO editReservationDTO);
+
+    void cancelReservation(Long id, Long reservationId);
+
+    EditReservationInfoDTO getEditReservationInfo(Long id, Long reservationId);
+
+    DisplayReservationDTO makeReservation(Long id, CreateReservationDTO createReservationDTO);
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/TableService.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/TableService.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/TableService.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.it.reservengo.service.intf;
+
+import mk.ukim.finki.it.reservengo.dto.tableDTO.TableInfoDTO;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+public interface TableService {
+    List<TableInfoDTO> getAvailableTables(Long localId, LocalDateTime reservationTime);
+    boolean isTableAvailable(Long tableId, LocalDateTime reservationTime);
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/CustomerController.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/CustomerController.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/CustomerController.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -73,5 +73,5 @@
     }
 
-    @GetMapping("local/{id}/rating")
+    @GetMapping("/local/{id}/rating")
     public ResponseEntity<RatingDTO> getRatingForLocal(@AuthenticationPrincipal User user, @PathVariable Long id) {
         RatingDTO ratingDTO = RatingDTO.from(customerService.findLocalRating(user.getId(), id));
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/ReservationController.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/ReservationController.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/ReservationController.java	(revision fcc4a614964c888603586e588c755d8dc8a68d04)
@@ -1,9 +1,61 @@
 package mk.ukim.finki.it.reservengo.web.controller;
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.CreateReservationDTO;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.DisplayReservationDTO;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.EditReservationDTO;
+import mk.ukim.finki.it.reservengo.dto.reservationDTO.EditReservationInfoDTO;
+import mk.ukim.finki.it.reservengo.model.domain.User;
+import mk.ukim.finki.it.reservengo.service.intf.CustomerService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 @RestController
 @RequestMapping("/api/reservations")
 public class ReservationController {
+
+    private final CustomerService customerService;
+
+    public ReservationController(CustomerService customerService) {
+        this.customerService = customerService;
+    }
+
+    @GetMapping
+    public ResponseEntity<List<DisplayReservationDTO>> listCustomerReservations(@AuthenticationPrincipal User user) {
+        List<DisplayReservationDTO> allReservation = customerService.listAllReservations(user.getId());
+        return new ResponseEntity<>(allReservation, HttpStatus.OK);
+    }
+
+    @GetMapping("/{reservationId}")
+    public ResponseEntity<DisplayReservationDTO> getReservationDetails(@AuthenticationPrincipal User user, @PathVariable Long reservationId) {
+        DisplayReservationDTO reservationDTO = customerService.getReservationPreview(user.getId(), reservationId);
+        return new ResponseEntity<>(reservationDTO, HttpStatus.OK);
+    }
+
+    @PutMapping("/{reservationId}/cancel")
+    public ResponseEntity<Void> cancelReservation(@AuthenticationPrincipal User user, @PathVariable Long reservationId) {
+        customerService.cancelReservation(user.getId(), reservationId);
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+
+    @GetMapping("/{reservationId}/edit-info")
+    public ResponseEntity<EditReservationInfoDTO> editReservationInfo(@AuthenticationPrincipal User user, @PathVariable Long reservationId) {
+        EditReservationInfoDTO editReservationInfoDTO = customerService.getEditReservationInfo(user.getId(), reservationId);
+        return new ResponseEntity<>(editReservationInfoDTO, HttpStatus.OK);
+    }
+
+    @PutMapping("/{reservationId}/edit")
+    public ResponseEntity<DisplayReservationDTO> editReservation(@AuthenticationPrincipal User user, @PathVariable Long reservationId, @RequestBody EditReservationDTO editReservationDTO) {
+        DisplayReservationDTO editedReservationDTO = customerService.editReservation(user.getId(), reservationId, editReservationDTO);
+        return new ResponseEntity<>(editedReservationDTO, HttpStatus.OK);
+    }
+
+    @PostMapping("/make-reservation")
+    public ResponseEntity<DisplayReservationDTO> makeReservation(@AuthenticationPrincipal User user, @RequestBody CreateReservationDTO createReservationDTO) {
+        DisplayReservationDTO newReservation = customerService.makeReservation(user.getId(), createReservationDTO);
+        return new ResponseEntity<>(newReservation, HttpStatus.OK);
+    }
 }
