Index: src/main/java/com/db/finki/www/build_board/controller/home_page/HomePageController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/home_page/HomePageController.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ src/main/java/com/db/finki/www/build_board/controller/home_page/HomePageController.java	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
@@ -3,6 +3,6 @@
 import com.db.finki.www.build_board.entity.user_type.BBUser;
 import com.db.finki.www.build_board.service.user.BBUserDetailsService;
-import com.db.finki.www.build_board.service.search.SearchService;
 import com.db.finki.www.build_board.service.thread.itf.TagService;
+import com.db.finki.www.build_board.service.util.NamedThreadService;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
@@ -20,4 +20,6 @@
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
@@ -25,27 +27,34 @@
 @Controller
 public class HomePageController {
-    private final SearchService searchService;
     private final TagService tagService;
     private final BBUserDetailsService bbUserDetailsService;
     private final SecurityContextRepository securityContextRepository;
+    private final NamedThreadService  namedThreadService;
 
-    public HomePageController(SearchService searchService, TagService tagService, BBUserDetailsService bbUserDetailsService, SecurityContextRepository securityContextRepository) {
-        this.searchService = searchService;
+    public HomePageController(TagService tagService, BBUserDetailsService bbUserDetailsService,
+            SecurityContextRepository securityContextRepository, NamedThreadService namedThreadService
+                             ) {
         this.tagService = tagService;
         this.bbUserDetailsService = bbUserDetailsService;
         this.securityContextRepository = securityContextRepository;
+        this.namedThreadService = namedThreadService;
     }
 
     @GetMapping("/")
-    public String search( @RequestParam(required = false)String query, @RequestParam(required = false) List<String> filters,  @RequestParam(required = false) String type , Model model) {
-        if(filters == null || filters.isEmpty()) {
-            filters = new ArrayList<>();
-            filters.add("all");
-        }
+    public String search(
+            @RequestParam(required = false) String title,
+            @RequestParam(required = false) String content,
+            @RequestParam(required = false, name = "threadType") String type,
+            @RequestParam(required = false) List<String> tag,
+            Model model
+                        ) {
+        if(title!=null)
+            title= URLDecoder.decode(title, StandardCharsets.UTF_8);
+        if(content!=null)
+            content=URLDecoder.decode(content, StandardCharsets.UTF_8);
 
-        model.addAttribute("threads", searchService.search(query,filters,type));
+        model.addAttribute("threads", namedThreadService.getAll(title,content,type,tag));
+        model.addAttribute("tags",tagService.getAll());
 
-        System.out.println("TAGS: " + tagService.getAll());
-        model.addAttribute("tags",tagService.getAll());
         return "home_pages/home";
     }
Index: src/main/java/com/db/finki/www/build_board/controller/thread_controller/TopicController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/thread_controller/TopicController.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ src/main/java/com/db/finki/www/build_board/controller/thread_controller/TopicController.java	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
@@ -3,8 +3,6 @@
 import com.db.finki.www.build_board.entity.blacklisted_user.BlacklistedUser;
 import com.db.finki.www.build_board.entity.entity_enum.Status;
-import com.db.finki.www.build_board.entity.thread.Project;
 import com.db.finki.www.build_board.entity.user_type.BBUser;
 import com.db.finki.www.build_board.entity.thread.Topic;
-import com.db.finki.www.build_board.entity.user_type.Moderator;
 import com.db.finki.www.build_board.service.BlacklistedUserService;
 import com.db.finki.www.build_board.service.BlacklistedUserType;
Index: c/main/java/com/db/finki/www/build_board/controller/util/SearchController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/util/SearchController.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package com.db.finki.www.build_board.controller.util;
-
-import com.db.finki.www.build_board.service.search.SearchService;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Controller
-public class SearchController {
-    private final SearchService searchService;
-
-    public SearchController(SearchService searchService) {
-        this.searchService = searchService;
-    }
-
-    @PostMapping("/search")
-    public String search(@RequestParam String query, @RequestParam(required = false) List<String> filters, @RequestParam String type , Model model, RedirectAttributes redirectAttributes) {
-        if(filters == null || filters.isEmpty()) {
-            filters = new ArrayList<>();
-            filters.add("all");
-        }
-        model.addAttribute("threads", searchService.search(query,filters,type));
-        return "/?";
-    }
-}
Index: src/main/java/com/db/finki/www/build_board/entity/thread/Project.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/thread/Project.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ src/main/java/com/db/finki/www/build_board/entity/thread/Project.java	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
@@ -4,5 +4,4 @@
 import com.db.finki.www.build_board.entity.channel.Channel;
 import com.db.finki.www.build_board.entity.user_type.BBUser;
-import com.db.finki.www.build_board.entity.thread.itf.NamedThread;
 import jakarta.persistence.*;
 import lombok.*;
@@ -19,5 +18,5 @@
 @Entity
 @Table(name = "project_thread")
-public class Project extends BBThread implements NamedThread {
+public class Project extends BBThread {
 
     private String title;
@@ -51,10 +50,4 @@
     private Set<Channel> channels;
 
-    @Override
-    public String getTypeName() {
-        return "projects";
-    }
-
-
     public String getDescription() {return content;}
     public void setDescription(String description) {this.content = description;}
Index: src/main/java/com/db/finki/www/build_board/entity/thread/Topic.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/thread/Topic.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ src/main/java/com/db/finki/www/build_board/entity/thread/Topic.java	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
@@ -2,5 +2,4 @@
 
 import com.db.finki.www.build_board.entity.blacklisted_user.BlacklistedUser;
-import com.db.finki.www.build_board.entity.thread.itf.NamedThread;
 import com.db.finki.www.build_board.entity.thread.multi_valued_attribute.Guideline;
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -15,5 +14,5 @@
 @Entity
 @Table(name = "topic_thread")
-public class Topic extends EmbeddableThread implements NamedThread {
+public class Topic extends EmbeddableThread {
 
     private String title;
@@ -30,7 +29,3 @@
     private List<BlacklistedUser> blacklistedUsers;
 
-    @Override
-    public String getTypeName() {
-        return "topics";
-    }
 }
Index: c/main/java/com/db/finki/www/build_board/entity/thread/itf/NamedThread.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/thread/itf/NamedThread.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package com.db.finki.www.build_board.entity.thread.itf;
-
-import com.db.finki.www.build_board.entity.user_type.BBUser;
-
-import java.time.LocalDateTime;
-
-public interface NamedThread {
-    String getTitle();
-    String getTypeName();
-    Integer getId();
-    String getContent();
-    BBUser getUser();
-    LocalDateTime getCreatedAt();
-}
Index: src/main/java/com/db/finki/www/build_board/entity/view/NamedThread.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/view/NamedThread.java	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
+++ src/main/java/com/db/finki/www/build_board/entity/view/NamedThread.java	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
@@ -0,0 +1,40 @@
+package com.db.finki.www.build_board.entity.view;
+
+
+import com.db.finki.www.build_board.service.util.FileUploadService;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.Immutable;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Getter
+@Setter
+@Entity
+@Immutable
+@Table(name = "v_named_threads")
+public class NamedThread {
+    @Id
+    private Integer id;
+    private String content;
+    private String title;
+    private String username;
+    private Integer userId;
+    private LocalDateTime createdAt;
+    private String type;
+    private List<String> tags;
+
+    public String getUsersAvatarUrl() {
+        Path path =
+                Path.of(FileUploadService.USER_AVATAR_DIR + File.separator + "avatar-" + userId);
+        return Files.exists(path) ? File.separator + "avatars" + File.separator + "avatar-"+userId:
+                File.separator + "default-avatar.jpg";
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/repository/NamedThreadRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/NamedThreadRepository.java	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
+++ src/main/java/com/db/finki/www/build_board/repository/NamedThreadRepository.java	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
@@ -0,0 +1,30 @@
+package com.db.finki.www.build_board.repository;
+
+import com.db.finki.www.build_board.entity.view.NamedThread;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+public interface NamedThreadRepository extends JpaRepository<NamedThread, Integer> {
+    @Query(nativeQuery = true,
+            value = """
+                    SELECT * 
+                    FROM v_named_threads t 
+                    WHERE (:title IS NULL OR t.title LIKE :title || '%') 
+                    AND (CAST(:type as varchar) IS NULL OR t.type like :type || '%') 
+                    AND (CAST(:content as varchar) IS NULL OR t.content LIKE :content || '%')
+                    AND (CAST(:tags as varchar) IS NULL OR t.tags @> string_to_array(:tags,',')::varchar[])
+                 """
+    )
+    List<NamedThread> findAll(
+            @Param("title") String title,
+            @Param("type") String type,
+            @Param("content") String content,
+            @Param("tags") String tags
+                             );
+}
Index: src/main/java/com/db/finki/www/build_board/repository/thread/BBThreadRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/thread/BBThreadRepository.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ src/main/java/com/db/finki/www/build_board/repository/thread/BBThreadRepository.java	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
@@ -2,5 +2,4 @@
 
 import com.db.finki.www.build_board.entity.thread.BBThread;
-import com.db.finki.www.build_board.entity.thread.itf.NamedThread;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
Index: c/main/java/com/db/finki/www/build_board/service/search/FilterMap.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/search/FilterMap.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ 	(revision )
@@ -1,43 +1,0 @@
-package com.db.finki.www.build_board.service.search;
-
-import com.db.finki.www.build_board.entity.thread.BBThread;
-import com.db.finki.www.build_board.entity.thread.Tag;
-import com.db.finki.www.build_board.entity.thread.itf.NamedThread;
-import jakarta.persistence.criteria.Join;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.Function;
-
-@Component
-public class FilterMap<T extends NamedThread> {
-    private final Map<String, Function<String, Specification<T>>> filterMap;
-
-    public FilterMap() {
-        filterMap = new HashMap<>();
-        filterMap.put("title", (param) -> {
-            if (param == null) {
-                return (root, query, cb) -> null;
-            } else {
-                return (root, query, cb) -> cb.like(cb.lower(root.get("title")), param.toLowerCase() + "%");
-            }
-        });
-        filterMap.put("content", (param) -> {
-            if (param == null) {
-                return (root, query, cb) -> null;
-            } else {
-                return (root, query, cb) -> cb.like(cb.lower(root.get("content")), "%" + param.toLowerCase() + "%");
-            }
-        });
-        filterMap.put("all", (param) -> {
-            Specification<T> spec = (root, query, cb) -> null;
-            return spec.or(filterMap.get("title").apply(param)).or(filterMap.get("content").apply(param));
-        });
-    }
-
-    public Function<String, Specification<T>> getFilter(String filter) {
-        return filterMap.get(filter);
-    }
-}
Index: c/main/java/com/db/finki/www/build_board/service/search/SearchFilterConfig.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/search/SearchFilterConfig.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package com.db.finki.www.build_board.service.search;
-
-import com.db.finki.www.build_board.entity.thread.Project;
-import com.db.finki.www.build_board.entity.thread.Topic;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class SearchFilterConfig {
-
-    @Bean
-    public FilterMap<Project> ProjectFilterMap() {
-        return new FilterMap<>();
-    }
-
-    @Bean
-    public FilterMap<Topic> TopicFilterMap() {
-        return new FilterMap<>();
-    }
-}
Index: c/main/java/com/db/finki/www/build_board/service/search/SearchService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/search/SearchService.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package com.db.finki.www.build_board.service.search;
-
-//spored title, content, type
-
-import com.db.finki.www.build_board.entity.thread.itf.NamedThread;
-
-import java.util.List;
-
-public interface SearchService {
-    List<NamedThread> search(String query, List<String> filters, String type);
-}
Index: c/main/java/com/db/finki/www/build_board/service/search/SearchServiceImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/search/SearchServiceImpl.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ 	(revision )
@@ -1,74 +1,0 @@
-package com.db.finki.www.build_board.service.search;
-
-import com.db.finki.www.build_board.entity.thread.Project;
-import com.db.finki.www.build_board.entity.thread.Topic;
-import com.db.finki.www.build_board.entity.thread.itf.NamedThread;
-import com.db.finki.www.build_board.repository.thread.ProjectRepository;
-import com.db.finki.www.build_board.repository.thread.TopicRepository;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-@Service
-public class SearchServiceImpl implements SearchService {
-    private final TopicRepository topicRepository;
-    private final FilterMap<Topic> topicFilterMap;
-    private final FilterMap<Project> projectFilterMap;
-    private final ProjectRepository projectRepository;
-
-    public SearchServiceImpl(TopicRepository topicRepository, FilterMap<Topic> TopicFilterMap, FilterMap<Project> ProjectFilterMap, ProjectRepository projectRepository) {
-        this.topicRepository = topicRepository;
-        this.topicFilterMap = TopicFilterMap;
-        this.projectFilterMap = ProjectFilterMap;
-        this.projectRepository = projectRepository;
-    }
-
-
-
-    private List<Topic> searchTopics(String query, List<String> filters) {
-        Specification<Topic> spec = Specification.where(null);
-        for (String filter : filters) {
-            System.out.println("FILTER: " + filter);
-            spec = spec.or(topicFilterMap.getFilter(filter).apply(query));
-        }
-        return topicRepository.findAll(spec);
-    }
-
-    private List<Project> searchProjects(String query, List<String> filters) {
-        Specification<Project> spec = Specification.where(null);
-        for (String filter : filters) {
-            spec = spec.or(projectFilterMap.getFilter(filter).apply(query));
-        }
-        return projectRepository.findAll(spec);
-    }
-
-    public List<NamedThread> search(String query, List<String> filters,String type) {
-        List<NamedThread> result = new ArrayList<>();
-        if(type == null){
-            type = "all";
-        }
-        if(filters == null || filters.isEmpty()){
-            filters = new ArrayList<>();
-            filters.add("all");
-        }
-
-        if(Objects.equals(type, "project")){
-            System.out.println("PROJECT");
-            result.addAll(searchProjects(query, filters));
-        } else if(Objects.equals(type, "topic")){
-            result.addAll(searchTopics(query, filters));
-            System.out.println("TOPIC");
-        } else {
-            result.addAll(searchTopics(query, filters));
-            result.addAll(searchProjects(query, filters));
-            System.out.println("ALL");
-        }
-
-
-
-        return result;
-    }
-}
Index: src/main/java/com/db/finki/www/build_board/service/util/NamedThreadService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/util/NamedThreadService.java	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ src/main/java/com/db/finki/www/build_board/service/util/NamedThreadService.java	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
@@ -1,8 +1,6 @@
 package com.db.finki.www.build_board.service.util;
 
-import com.db.finki.www.build_board.entity.thread.itf.NamedThread;
-import com.db.finki.www.build_board.service.thread.impl.ProjectService;
-import com.db.finki.www.build_board.service.thread.impl.TopicServiceImpl;
-import com.db.finki.www.build_board.service.thread.itf.TopicService;
+import com.db.finki.www.build_board.entity.view.NamedThread;
+import com.db.finki.www.build_board.repository.NamedThreadRepository;
 import org.springframework.stereotype.Service;
 
@@ -11,16 +9,24 @@
 @Service
 public class NamedThreadService {
-    private final TopicService topicService;
-    private final ProjectService projectService;
+    private final NamedThreadRepository namedThreadRepository;
 
-    public NamedThreadService(TopicServiceImpl topicService, ProjectService projectService) {
-        this.topicService = topicService;
-        this.projectService = projectService;
+    public NamedThreadService(NamedThreadRepository namedThreadRepository) {
+        this.namedThreadRepository = namedThreadRepository;
     }
 
-    public List<NamedThread> getAll(){
-        List<NamedThread> results = (List<NamedThread>) (List<?>) topicService.getAll();
-        results.addAll((List<NamedThread>)(List<?>) projectService.getAll());
-        return results;
+    public List<NamedThread> getAll(
+            String title,
+            String content,
+            String type,
+            List<String> tagList
+            ) {
+        String tag = tagList == null || tagList.isEmpty() ? null : String.join(",",tagList);
+
+        return namedThreadRepository.findAll(
+                title,
+                type,
+                content,
+                tag
+                                            ) ;
     }
 }
Index: src/main/resources/db/migration/V2__views.sql
===================================================================
--- src/main/resources/db/migration/V2__views.sql	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ src/main/resources/db/migration/V2__views.sql	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
@@ -65,3 +65,41 @@
                        AND rpo.for_role_permission_permission_name = rp.for_permission
                        AND rpo.for_resource = c.id
-GROUP BY c.id, c.name,pr.id
+GROUP BY c.id, c.name,pr.id;
+
+create or replace view v_named_threads as
+WITH topics_projects AS (SELECT pr.id,
+                                pr.title,
+                                'projects'::text AS "type"
+                         FROM project_thread pr
+                         UNION
+                         SELECT topic_thread.id,
+                                topic_thread.title,
+                                'topics'::text AS "type"
+                         FROM topic_thread),
+     topics_projects_threads AS (SELECT t.id,
+                                        t.content,
+                                        tp.type,
+                                        tp.title,
+                                        u.username,
+                                        u.id        AS user_id,
+                                        t.created_at
+                                 FROM thread t
+                                          JOIN users u ON u.id = t.is_created_by
+                                          JOIN topics_projects tp ON tp.id = t.id)
+        ,
+     named_threads_tags as (select tt.thread_id           as "id",
+                                   array_agg(tt.tag_name) as "tags"
+                            from tag_assigned_to_thread tt
+                            where tt.thread_id in (select id from topics_projects_threads)
+                            group by tt.thread_id)
+SELECT tpt.id,
+       tpt.content,
+       tpt.title,
+       tpt.type,
+       tpt.username,
+       tpt.user_id,
+       tpt.created_at,
+       coalesce((select ntt.tags as "tags"
+                 from named_threads_tags ntt
+                 where ntt.id = tpt.id),'{}') as "tags"
+FROM topics_projects_threads tpt;
Index: src/main/resources/templates/home_pages/home.html
===================================================================
--- src/main/resources/templates/home_pages/home.html	(revision 30dd87b6718c755e42034f25fa3f036670ba396c)
+++ src/main/resources/templates/home_pages/home.html	(revision d83e9813773001148d1b7b5111c4ff29a8c83a7e)
@@ -204,5 +204,5 @@
             <div class="list-group-item p-0 border-0" th:each="thread : ${threads}">
                 <!-- Make the entire card clickable -->
-                <a th:href="@{/{type}/{title}(title=${thread.getId()}, type=${thread.getTypeName()})}"
+                <a th:href="@{/{type}/{title}(title=${thread.getId()},type=${thread.getType()})}"
                    class="text-decoration-none">
                     <div class="card shadow-sm mb-4 border-0 transition-card">
@@ -212,6 +212,6 @@
                             <div>
                                 <img alt="user-logo" class="rounded-circle border border-1 border-info"
-                                     style="width: 3em; height: 3em" th:src="${thread.getUser().getAvatarUrl()}">
-                                <small class="fst-italic" th:text="${thread.getUser().getUsername()}"></small>
+                                     style="width: 3em; height: 3em" th:src="${thread.getUsersAvatarUrl()}">
+                                <small class="fst-italic" th:text="${thread.getUsername()}"></small>
                             </div>
                         </div>
