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 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/bootstrap/DataHolder.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -4,6 +4,7 @@
 import mk.ukim.finki.it.reservengo.model.domain.*;
 import mk.ukim.finki.it.reservengo.model.enumerations.EventStatus;
+import mk.ukim.finki.it.reservengo.model.enumerations.LocalType;
 import mk.ukim.finki.it.reservengo.model.enumerations.Role;
-import mk.ukim.finki.it.reservengo.model.enumerations.Service;
+import mk.ukim.finki.it.reservengo.model.enumerations.ProvidedService;
 import mk.ukim.finki.it.reservengo.repository.*;
 import org.springframework.security.crypto.password.PasswordEncoder;
@@ -90,5 +91,5 @@
 
         //Local
-        List<Service> serviceList = new ArrayList<>(List.of(Service.values()));
+        List<ProvidedService> serviceList = new ArrayList<>(List.of(ProvidedService.values()));
         for (int i = 1; i <= 3; i++) {
             Local local = new Local(
@@ -105,5 +106,6 @@
                     null,
                     null,
-                    null
+                    null,
+                    LocalType.RESTAURANT
             );
             locals.add(local);
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/CreateLocalDetailsDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/CreateLocalDetailsDTO.java	(revision 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/CreateLocalDetailsDTO.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -2,5 +2,6 @@
 
 import mk.ukim.finki.it.reservengo.dto.contactDTO.DisplayContactDTO;
-import mk.ukim.finki.it.reservengo.model.enumerations.Service;
+import mk.ukim.finki.it.reservengo.model.enumerations.LocalType;
+import mk.ukim.finki.it.reservengo.model.enumerations.ProvidedService;
 
 import java.util.List;
@@ -11,5 +12,6 @@
         String address,
         String workingHours,
-        List<Service> services,
+        List<ProvidedService> services,
+        LocalType localType,
         String menuLink,
         DisplayContactDTO contact
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/DisplayLocalDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/DisplayLocalDTO.java	(revision 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/DisplayLocalDTO.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -2,4 +2,5 @@
 
 import mk.ukim.finki.it.reservengo.model.domain.Local;
+import mk.ukim.finki.it.reservengo.model.enumerations.LocalType;
 
 import java.util.List;
@@ -12,4 +13,5 @@
         String workingHours,
         String logo,
+        LocalType localType,
         Double averageRating
 ) {
@@ -22,4 +24,5 @@
                 local.getWorkingHours(),
                 local.getLogoUrl(),
+                local.getLocalType(),
                 local.getAverageRating()
         );
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/DisplayLocalDetailsDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/DisplayLocalDetailsDTO.java	(revision 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/DisplayLocalDetailsDTO.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -4,5 +4,5 @@
 import mk.ukim.finki.it.reservengo.dto.eventDTO.DisplayEventDTO;
 import mk.ukim.finki.it.reservengo.model.domain.Local;
-import mk.ukim.finki.it.reservengo.model.enumerations.Service;
+import mk.ukim.finki.it.reservengo.model.enumerations.ProvidedService;
 
 import java.util.List;
@@ -14,5 +14,5 @@
         String address,
         String workingHours,
-        List<Service> services,
+        List<ProvidedService> services,
         Double ratingAvg,
         List<DisplayEventDTO> events,
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/PagedLocalDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/PagedLocalDTO.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/PagedLocalDTO.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -0,0 +1,28 @@
+package mk.ukim.finki.it.reservengo.dto.localDTO;
+
+import mk.ukim.finki.it.reservengo.model.enumerations.LocalType;
+import mk.ukim.finki.it.reservengo.model.enumerations.ProvidedService;
+import org.springframework.data.domain.Page;
+
+
+import java.util.List;
+
+public record PagedLocalDTO(
+        List<DisplayLocalDTO> local,
+        int currentPage,
+        int totalPages,
+        long itemsPerPage,
+        List<ProvidedService> services,
+        List<LocalType> localTypes
+) {
+    public static PagedLocalDTO from(Page<DisplayLocalDTO> page) {
+        return new PagedLocalDTO(
+                page.getContent(),
+                page.getNumber(),
+                page.getTotalPages(),
+                page.getTotalElements(),
+                List.of(ProvidedService.values()),
+                List.of(LocalType.values())
+        );
+    }
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/Local.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/Local.java	(revision 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/Local.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -7,5 +7,6 @@
 import lombok.NoArgsConstructor;
 import mk.ukim.finki.it.reservengo.config.listeners.Auditable;
-import mk.ukim.finki.it.reservengo.model.enumerations.Service;
+import mk.ukim.finki.it.reservengo.model.enumerations.LocalType;
+import mk.ukim.finki.it.reservengo.model.enumerations.ProvidedService;
 import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
@@ -36,5 +37,8 @@
     @Enumerated(EnumType.STRING)
     @ElementCollection
-    private List<Service> availableServices;
+    private List<ProvidedService> availableServices;
+
+    @Enumerated(EnumType.STRING)
+    private LocalType localType;
 
     @ElementCollection
@@ -61,5 +65,5 @@
     private String logoUrl;
 
-    public Local(String name, String description, String address, String workingHours, List<Service> availableServices, Map<Long, Integer> ratings, List<Event> events, String logoUrl, List<String> localPhotos, String menuLink, Contact contact, List<Reservation> reservations, List<LocalWorker> workers) {
+    public Local(String name, String description, String address, String workingHours, List<ProvidedService> availableServices, Map<Long, Integer> ratings, List<Event> events, String logoUrl, List<String> localPhotos, String menuLink, Contact contact, List<Reservation> reservations, List<LocalWorker> workers, LocalType localType) {
         this.name = name;
         this.description = description;
@@ -75,4 +79,5 @@
         this.reservations = reservations;
         this.workers = workers;
+        this.localType = localType;
     }
 
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/LocalType.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/LocalType.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/LocalType.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -0,0 +1,14 @@
+package mk.ukim.finki.it.reservengo.model.enumerations;
+
+public enum LocalType {
+    RESTAURANT,
+    CAFE,
+    BAR,
+    PUB,
+    BISTRO,
+    FOOD_TRUCK,
+    BUFFET,
+    FAST_FOOD,
+    LOUNGE,
+    DELI
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/ProvidedService.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/ProvidedService.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/ProvidedService.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -0,0 +1,11 @@
+package mk.ukim.finki.it.reservengo.model.enumerations;
+
+public enum ProvidedService {
+    WIFI,
+    PET_FRIENDLY,
+    PARKING,
+    OUTDOOR,
+    INDOOR,
+    PLAYGROUND,
+    VEGAN_FRIENDLY
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/Service.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/Service.java	(revision 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package mk.ukim.finki.it.reservengo.model.enumerations;
-
-public enum Service {
-    WIFI,
-    PET_FRIENDLY,
-    PARKING,
-    OUTDOOR,
-    INDOOR,
-    PLAYGROUND,
-    VEGAN_FRIENDLY
-}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/LocalRepository.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/LocalRepository.java	(revision 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/repository/LocalRepository.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -3,7 +3,8 @@
 import mk.ukim.finki.it.reservengo.model.domain.Local;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.stereotype.Repository;
 
 @Repository
-public interface LocalRepository extends JpaRepository<Local, Long> {
+public interface LocalRepository extends JpaRepository<Local, Long>, JpaSpecificationExecutor<Local> {
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/LocalServiceImpl.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/LocalServiceImpl.java	(revision 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/LocalServiceImpl.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -3,9 +3,14 @@
 import mk.ukim.finki.it.reservengo.dto.localDTO.CreateLocalDetailsDTO;
 import mk.ukim.finki.it.reservengo.dto.localDTO.DeleteLocalPhotosResultDTO;
+import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDTO;
 import mk.ukim.finki.it.reservengo.model.domain.Local;
+import mk.ukim.finki.it.reservengo.model.enumerations.LocalType;
+import mk.ukim.finki.it.reservengo.model.enumerations.ProvidedService;
 import mk.ukim.finki.it.reservengo.model.exceptions.*;
 import mk.ukim.finki.it.reservengo.repository.LocalRepository;
 import mk.ukim.finki.it.reservengo.service.intf.FileStorageService;
 import mk.ukim.finki.it.reservengo.service.intf.LocalService;
+import org.springframework.data.domain.*;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -13,8 +18,9 @@
 
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
-@Transactional
 public class LocalServiceImpl implements LocalService {
 
@@ -44,4 +50,5 @@
 
     @Override
+    @Transactional
     public Local edit(Long localId, CreateLocalDetailsDTO createLocalDetailsDTO) {
         Local local = localRepository.findById(localId).orElseThrow(() -> new LocalIdNotFoundException(localId));
@@ -52,4 +59,5 @@
         local.setWorkingHours(createLocalDetailsDTO.workingHours());
         local.setAvailableServices(createLocalDetailsDTO.services());
+        local.setLocalType(createLocalDetailsDTO.localType());
         local.setMenuLink(createLocalDetailsDTO.menuLink());
         local.setContact(createLocalDetailsDTO.contact().toContact());
@@ -82,4 +90,5 @@
 
     @Override
+    @Transactional
     public void deleteLogo(Long localId) {
         Local local = localRepository.findById(localId).orElseThrow(() -> new LocalIdNotFoundException(localId));
@@ -113,4 +122,5 @@
 
     @Override
+    @Transactional
     public DeleteLocalPhotosResultDTO deletePhotos(Long localId, List<String> photoPaths) {
         Local local = localRepository.findById(localId).orElseThrow(() -> new LocalIdNotFoundException(localId));
@@ -138,3 +148,49 @@
         return new DeleteLocalPhotosResultDTO(deletedPhotos, notFoundPhotos);
     }
+
+    @Override
+    public Page<DisplayLocalDTO> searchLocals(String name, List<ProvidedService> services, LocalType localType, int page, int size, String sortBy, String direction) {
+        boolean sortByRating = "rating".equalsIgnoreCase(sortBy);
+
+        Pageable pageable = PageRequest.of(page, size, getSort(sortBy, direction));
+
+        Specification<Local> spec = Specification.where(null);
+
+        if (name != null && !name.trim().isEmpty()) {
+            spec = spec.and((root, query, cb) ->
+                    cb.like(cb.lower(root.get("name")), "%" + name.toLowerCase() + "%"));
+        }
+
+        if (services != null && !services.isEmpty()) {
+            spec = spec.and((root, query, cb) -> root.join("availableServices").in(services));
+        }
+
+        if (localType != null) {
+            spec = spec.and((root, query, cb) -> cb.equal(root.get("localType"), localType));
+        }
+
+        Page<Local> localsPage = localRepository.findAll(spec, pageable);
+
+        // If sorting by rating, do it in-memory after mapping to DTOs
+        if (sortByRating) {
+            List<DisplayLocalDTO> sorted = localsPage.getContent().stream()
+                    .map(DisplayLocalDTO::fromLocal)
+                    .sorted(Comparator.comparingDouble(DisplayLocalDTO::averageRating).reversed())
+                    .collect(Collectors.toList());
+
+            return new PageImpl<>(sorted, pageable, localsPage.getTotalElements());
+        }
+
+        return localsPage.map(DisplayLocalDTO::fromLocal);
+    }
+
+    private Sort getSort(String sortBy, String direction) {
+        Sort.Direction sortDirection = "desc".equalsIgnoreCase(direction) ? Sort.Direction.DESC : Sort.Direction.ASC;
+
+        return switch (sortBy) {
+            case "createdAt" -> Sort.by(sortDirection, "createdAt");
+            case "rating" -> Sort.unsorted(); // handled manually
+            default -> Sort.by(sortDirection, "name");
+        };
+    }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/LocalService.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/LocalService.java	(revision 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/LocalService.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -3,5 +3,9 @@
 import mk.ukim.finki.it.reservengo.dto.localDTO.CreateLocalDetailsDTO;
 import mk.ukim.finki.it.reservengo.dto.localDTO.DeleteLocalPhotosResultDTO;
+import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDTO;
 import mk.ukim.finki.it.reservengo.model.domain.Local;
+import mk.ukim.finki.it.reservengo.model.enumerations.LocalType;
+import mk.ukim.finki.it.reservengo.model.enumerations.ProvidedService;
+import org.springframework.data.domain.Page;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -26,3 +30,5 @@
 
     DeleteLocalPhotosResultDTO deletePhotos(Long localId, List<String> photoUrls);
+
+    Page<DisplayLocalDTO> searchLocals(String name, List<ProvidedService> services, LocalType localType, int page, int size, String sortBy, String direction);
 }
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 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/CustomerController.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -25,5 +25,6 @@
     @GetMapping("/favourite-locals")
     public ResponseEntity<List<DisplayLocalDTO>> listFavouriteLocals(@AuthenticationPrincipal User user) {
-        return new ResponseEntity<>(customerService.listFavouriteLocals(user.getId()), HttpStatus.OK);
+        List<DisplayLocalDTO> list = customerService.listFavouriteLocals(user.getId());
+        return new ResponseEntity<>(list, HttpStatus.OK);
     }
 
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/LocalController.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/LocalController.java	(revision 2e68c83c919881e5da3b34501be9c615b6c25610)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/LocalController.java	(revision ba8516756325b4351b3b4d62006b76a07ffe71ac)
@@ -3,5 +3,9 @@
 import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDTO;
 import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDetailsDTO;
+import mk.ukim.finki.it.reservengo.dto.localDTO.PagedLocalDTO;
+import mk.ukim.finki.it.reservengo.model.enumerations.LocalType;
+import mk.ukim.finki.it.reservengo.model.enumerations.ProvidedService;
 import mk.ukim.finki.it.reservengo.service.intf.LocalService;
+import org.springframework.data.domain.Page;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -21,7 +25,16 @@
 
     @GetMapping
-    public ResponseEntity<List<DisplayLocalDTO>> getLocals() {
-        List<DisplayLocalDTO> displayLocalDTOList = DisplayLocalDTO.fromLocals(localService.listAll());
-        return new ResponseEntity<>(displayLocalDTOList, HttpStatus.OK);
+    public ResponseEntity<PagedLocalDTO> getLocals(
+            @RequestParam(required = false) String name,
+            @RequestParam(required = false) List<ProvidedService> services,
+            @RequestParam(required = false)LocalType localType,
+            @RequestParam(required = false, defaultValue = "name") String sortBy,
+            @RequestParam(required = false, defaultValue = "asc") String direction,
+            @RequestParam(defaultValue = "0") int page,
+            @RequestParam(defaultValue = "10") int size
+            ) {
+        Page<DisplayLocalDTO> dtoPage = localService.searchLocals(name, services, localType, page, size, sortBy, direction);
+        PagedLocalDTO pagedLocalDTO = PagedLocalDTO.from(dtoPage);
+        return new ResponseEntity<>(pagedLocalDTO, HttpStatus.OK);
     }
 
