Index: src/main/java/apps/spring/reportium/entity/CriminalReport.java
===================================================================
--- src/main/java/apps/spring/reportium/entity/CriminalReport.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/entity/CriminalReport.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -31,5 +31,5 @@
     private String location;
 
-    private boolean resolved = false;
+    private Boolean resolved = false;
 
     @ManyToOne(fetch = FetchType.EAGER)
@@ -39,3 +39,7 @@
     @Column(name = "descriptive_punishment", columnDefinition = "TEXT")
     private String descriptivePunishment;
+
+    @OneToOne(mappedBy = "report", fetch = FetchType.LAZY)
+    private Punishment punishment;
+
 }
Index: src/main/java/apps/spring/reportium/entity/DTOs/ReportFilterDTO.java
===================================================================
--- src/main/java/apps/spring/reportium/entity/DTOs/ReportFilterDTO.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/entity/DTOs/ReportFilterDTO.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -11,16 +11,23 @@
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 
 @Data
 public class ReportFilterDTO {
+    /*WHICH FILTER*/
+    @Enumerated(EnumType.STRING)
+    private SelectedFilterSection filter_selected;
     /*PERSON FIELDS*/
-    private String person_name_surname_string;
+    private Integer person_id;
+    private String person_name_string;
+    private String person_surname_string;
     private Integer correct_age;//option 1
-    private Integer age_start;//option 2
-    private Integer age_end;//option 2
+    private Integer age_start = 0;//option 2
+    private Integer age_end = 120;//option 2
     @Convert(converter = GenderConverter.class)
     private Gender gender;
     private String address_string;
-    private Boolean is_alive;
+    private Boolean is_alive = true;
     /*ACADEMIC REPORT FIELDS*/
     private String academic_field;
@@ -28,5 +35,5 @@
     private InstitutionType institution_type;
     /*EMPLOYMENT REPORT FIELDS*/
-    private Integer income_amount;
+    private Double income_amount;
     @Enumerated(EnumType.STRING)
     private ComparisonDTOEnum income_comparison;
@@ -46,5 +53,4 @@
     private String doctor_name_string;//doc
     private String doctor_surname_string;//doc
-    private Boolean is_active;//doc
     @Convert(converter = DoctorSpecConverter.class)
     private DoctorSpecialization specialization;//doc
@@ -53,5 +59,6 @@
 
     public boolean hasAnyAdvancedFilterSet() {
-        return person_name_surname_string != null ||
+        return person_name_string != null ||
+                person_surname_string != null ||
                 correct_age != null ||
                 age_start != null ||
@@ -70,32 +77,67 @@
     @Override
     public String toString() {
-        return "ReportFilterDTO{" +
-                "person_name_surname_string='" + person_name_surname_string + '\'' +
-                ", correct_age=" + correct_age +
-                ", age_start=" + age_start +
-                ", age_end=" + age_end +
-                ", gender=" + gender +
-                ", address_string='" + address_string + '\'' +
-                ", is_alive=" + is_alive +
-                ", academic_field='" + academic_field + '\'' +
-                ", institution_type=" + institution_type +
-                ", income_amount=" + income_amount +
-                ", income_comparison=" + income_comparison +
-                ", years_experience=" + years_experience +
-                ", years_experience_comparison=" + years_experience_comparison +
-                ", crime_type_label='" + crime_type_label + '\'' +
-                ", crime_severity_level=" + crime_severity_level +
-                ", is_resolved=" + is_resolved +
-                ", punishment_type=" + punishment_type +
-                ", punishment_fine=" + punishment_fine +
-                ", punishment_years=" + punishment_years +
-                ", doctor_name_string='" + doctor_name_string + '\'' +
-                ", doctor_surname_string='" + doctor_surname_string + '\'' +
-                ", is_active=" + is_active +
-                ", specialization=" + specialization +
-                ", is_chronic=" + is_chronic +
-                ", has_next_control=" + has_next_control +
-                '}';
+        StringBuilder sb = new StringBuilder();
+        sb.append("Report Filter: ").append(filter_selected.toString()).append("\n");
+        //TODO the advanced filter description
+//        switch (filter_selected) {
+//            case PERSON:
+//                sb.append("Person: ").append(person_name_string).append(" ").append(person_surname_string).append("\n");
+//                if (correct_age != null && correct_age > 0) {
+//                    sb.append("Correct Age: ").append(correct_age);
+//
+//                } else if (age_start != null && age_start > 0 && age_end != null && age_end < 120) {
+//                    sb.append("Age Range [").append(age_start).append(",").append(age_end).append("] ").append("\n");
+//                }
+//                sb.append("Gender: ").append(gender.toString()).append("\n");
+//                sb.append("Address: ").append(address_string).append("\n");
+//                if (getIs_alive().equals(Boolean.TRUE)) {
+//                    sb.append("alive").append("\n");
+//                } else {
+//                    sb.append("dead").append("\n");
+//                }
+//                break;
+//            case ACADEMIC:
+//                sb.append("Academic Field: ").append(academic_field).append("\n");
+//                sb.append("Institution Type: ").append(institution_type.toString()).append("\n");
+//                break;
+//            case EMPLOYMENT:
+//                if (income_comparison != null && income_amount != null && income_amount > 0)
+//                    sb.append("Income ").append(income_comparison).append(" ").append(income_amount).append(" EUR\n");
+//                if (years_experience_comparison != null && years_experience != null && years_experience > 0)
+//                    sb.append("Experience ").append(years_experience_comparison).append(" ")
+//                            .append(years_experience).append(" years\n");
+//                break;
+//
+//            case CRIMINAL:
+//                if (crime_type_label != null && !crime_type_label.isBlank())
+//                    sb.append("Crime Type: ").append(crime_type_label).append("\n");
+//                if (crime_severity_level != null)
+//                    sb.append("Severity Level: ").append(crime_severity_level).append("\n");
+//                if (is_resolved != null)
+//                    sb.append("Resolved: ").append(is_resolved ? "Yes" : "No").append("\n");
+//
+//                if (punishment_type != null) {
+//                    sb.append("Punishment: ").append(punishment_type).append(" ");
+//                    if (punishment_type == PunishmentType.FINE && punishment_fine != null)
+//                        sb.append(punishment_fine).append(" EUR\n");
+//                    else if (punishment_type == PunishmentType.PRISON && punishment_years != null)
+//                        sb.append(punishment_years).append(" years\n");
+//                }
+//                break;
+//
+//            case MEDICAL:
+//                if (doctor_name_string != null && !doctor_name_string.isBlank())
+//                    sb.append("Doctor Name: ").append(doctor_name_string).append("\n");
+//                if (doctor_surname_string != null && !doctor_surname_string.isBlank())
+//                    sb.append("Doctor Surname: ").append(doctor_surname_string).append("\n");
+//                if (specialization != null)
+//                    sb.append("Specialization: ").append(specialization).append("\n");
+//                if (is_chronic != null)
+//                    sb.append("Chronic Illness: ").append(is_chronic ? "Yes" : "No").append("\n");
+//                if (has_next_control != null)
+//                    sb.append("Next Control Scheduled: ").append(has_next_control ? "Yes" : "No").append("\n");
+//                break;
+//        }
+        return sb.toString();
     }
-
 }
Index: src/main/java/apps/spring/reportium/entity/Institution.java
===================================================================
--- src/main/java/apps/spring/reportium/entity/Institution.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/entity/Institution.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -5,4 +5,5 @@
 import jakarta.persistence.*;
 import lombok.Data;
+
 /*
 --enumeration - type of institution
@@ -26,5 +27,4 @@
 )
 public class Institution {
-
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
Index: src/main/java/apps/spring/reportium/entity/MedicalReport.java
===================================================================
--- src/main/java/apps/spring/reportium/entity/MedicalReport.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/entity/MedicalReport.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -5,4 +5,5 @@
 
 import java.time.LocalDate;
+import java.util.List;
 
 /*
@@ -35,3 +36,7 @@
     @Column(name = "next_control_date")
     private LocalDate nextControlDate;
+
+    @OneToMany(mappedBy = "report")
+    private List<MedicalReportDiagnosis> medicalReportDiagnoses;
+
 }
Index: src/main/java/apps/spring/reportium/entity/Punishment.java
===================================================================
--- src/main/java/apps/spring/reportium/entity/Punishment.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/entity/Punishment.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -48,7 +48,8 @@
 
     @Column(name = "fine_to_pay")
-    private double fineToPay;
+    private Double fineToPay;
 
     @Column(name = "release_date")
     private LocalDate releaseDate;
+
 }
Index: src/main/java/apps/spring/reportium/entity/Report.java
===================================================================
--- src/main/java/apps/spring/reportium/entity/Report.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/entity/Report.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -40,3 +40,16 @@
     @JoinColumn(name = "person_id", foreignKey = @ForeignKey(name = "fk_person_id"))
     private Person person;
+
+    @OneToOne(mappedBy = "report", fetch = FetchType.LAZY)
+    private AcademicReport academicReport;
+
+    @OneToOne(mappedBy = "report", fetch = FetchType.LAZY)
+    private EmploymentReport employmentReport;
+
+    @OneToOne(mappedBy = "report", fetch = FetchType.LAZY)
+    private MedicalReport medicalReport;
+
+    @OneToOne(mappedBy = "report", fetch = FetchType.LAZY)
+    private CriminalReport criminalReport;
+
 }
Index: src/main/java/apps/spring/reportium/entity/enumerations/SelectedFilterSection.java
===================================================================
--- src/main/java/apps/spring/reportium/entity/enumerations/SelectedFilterSection.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
+++ src/main/java/apps/spring/reportium/entity/enumerations/SelectedFilterSection.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -0,0 +1,9 @@
+package apps.spring.reportium.entity.enumerations;
+
+public enum SelectedFilterSection {
+    PERSON,
+    ACADEMIC,
+    CRIMINAL,
+    MEDICAL,
+    EMPLOYMENT
+}
Index: src/main/java/apps/spring/reportium/entity/exceptions/AgeFilterOnNotAlivePeopleException.java
===================================================================
--- src/main/java/apps/spring/reportium/entity/exceptions/AgeFilterOnNotAlivePeopleException.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
+++ src/main/java/apps/spring/reportium/entity/exceptions/AgeFilterOnNotAlivePeopleException.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -0,0 +1,7 @@
+package apps.spring.reportium.entity.exceptions;
+
+public class AgeFilterOnNotAlivePeopleException extends RuntimeException {
+    public AgeFilterOnNotAlivePeopleException(String message) {
+        super(message);
+    }
+}
Index: src/main/java/apps/spring/reportium/repository/FilterSessionRepository.java
===================================================================
--- src/main/java/apps/spring/reportium/repository/FilterSessionRepository.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
+++ src/main/java/apps/spring/reportium/repository/FilterSessionRepository.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -0,0 +1,9 @@
+package apps.spring.reportium.repository;
+
+import apps.spring.reportium.entity.FilterSession;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface FilterSessionRepository extends JpaRepository<FilterSession,Long> {
+}
Index: src/main/java/apps/spring/reportium/repository/ReportRepository.java
===================================================================
--- src/main/java/apps/spring/reportium/repository/ReportRepository.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/repository/ReportRepository.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -1,12 +1,10 @@
 package apps.spring.reportium.repository;
 
-import apps.spring.reportium.entity.DTOs.AcademicReportPerPersonDTO;
-import apps.spring.reportium.entity.DTOs.CrimeReportPerPersonDTO;
-import apps.spring.reportium.entity.DTOs.EmploymentReportPerPersonDTO;
-import apps.spring.reportium.entity.DTOs.MedicalReportPerPersonDTO;
+import apps.spring.reportium.entity.DTOs.*;
 import apps.spring.reportium.entity.Report;
 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.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
@@ -16,5 +14,5 @@
 
 @Repository
-public interface ReportRepository extends JpaRepository<Report, Long> {
+public interface ReportRepository extends JpaRepository<Report, Long>, JpaSpecificationExecutor<Report> {
 
     @Query(value = """
Index: src/main/java/apps/spring/reportium/service/FilterSessionService.java
===================================================================
--- src/main/java/apps/spring/reportium/service/FilterSessionService.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
+++ src/main/java/apps/spring/reportium/service/FilterSessionService.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -0,0 +1,7 @@
+package apps.spring.reportium.service;
+
+import apps.spring.reportium.entity.DTOs.ReportFilterDTO;
+
+public interface FilterSessionService {
+    void save(ReportFilterDTO filterDTO);
+}
Index: src/main/java/apps/spring/reportium/service/ReportService.java
===================================================================
--- src/main/java/apps/spring/reportium/service/ReportService.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/service/ReportService.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -15,6 +15,4 @@
 //    Page<Report> findPage(Integer reportId, Integer pageNum, Integer pageSize);
     Page<Report> findPaginatedReports(int page, int size, String sortField, String sortDir);
-
-    List<Report> getReportsByTypeViews(List<String> reportTypes);
     List<Report> getReportsByAdvancedFilter(ReportFilterDTO filter);
 }
Index: src/main/java/apps/spring/reportium/service/impl/AuthenticateServiceImplementation.java
===================================================================
--- src/main/java/apps/spring/reportium/service/impl/AuthenticateServiceImplementation.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/service/impl/AuthenticateServiceImplementation.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -29,12 +29,10 @@
     private final UserProfileRepository userProfileRepository;
     private final PasswordEncoder passwordEncoder;
-    private final RoleRepository roleRepository;
     private final UserProfileLogRepository profileLogRepository;
 
-    public AuthenticateServiceImplementation(ReportiumUserRepository reportiumUserRepository, UserProfileRepository userProfileRepository, PasswordEncoder passwordEncoder, RoleRepository roleRepository, UserProfileLogRepository profileLogRepository) {
+    public AuthenticateServiceImplementation(ReportiumUserRepository reportiumUserRepository, UserProfileRepository userProfileRepository, PasswordEncoder passwordEncoder, UserProfileLogRepository profileLogRepository) {
         this.reportiumUserRepository = reportiumUserRepository;
         this.userProfileRepository = userProfileRepository;
         this.passwordEncoder = passwordEncoder;
-        this.roleRepository = roleRepository;
         this.profileLogRepository = profileLogRepository;
     }
Index: src/main/java/apps/spring/reportium/service/impl/FilterSessionServiceImplementation.java
===================================================================
--- src/main/java/apps/spring/reportium/service/impl/FilterSessionServiceImplementation.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
+++ src/main/java/apps/spring/reportium/service/impl/FilterSessionServiceImplementation.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -0,0 +1,28 @@
+package apps.spring.reportium.service.impl;
+
+import apps.spring.reportium.entity.DTOs.ReportFilterDTO;
+import apps.spring.reportium.entity.FilterSession;
+import apps.spring.reportium.repository.FilterSessionRepository;
+import apps.spring.reportium.service.FilterSessionService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+@Service
+public class FilterSessionServiceImplementation implements FilterSessionService {
+    private final FilterSessionRepository filterSessionRepository;
+    private final AuthenticateServiceImplementation authenticateServiceImplementation;
+    public FilterSessionServiceImplementation(FilterSessionRepository filterSessionRepository, AuthenticateServiceImplementation authenticateServiceImplementation) {
+        this.filterSessionRepository = filterSessionRepository;
+        this.authenticateServiceImplementation = authenticateServiceImplementation;
+    }
+
+    @Override
+    public void save(ReportFilterDTO filterDTO) {
+        FilterSession obj_to_save = new FilterSession();
+        obj_to_save.setFilterDescription(filterDTO.toString());
+        obj_to_save.setReportiumUser(authenticateServiceImplementation.getCurrentUser());
+        obj_to_save.setSearchedAt(LocalDateTime.now());
+        filterSessionRepository.save(obj_to_save);
+    }
+}
Index: src/main/java/apps/spring/reportium/service/impl/ReportServiceImplementation.java
===================================================================
--- src/main/java/apps/spring/reportium/service/impl/ReportServiceImplementation.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/service/impl/ReportServiceImplementation.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -5,8 +5,10 @@
 import apps.spring.reportium.repository.ReportRepository;
 import apps.spring.reportium.service.ReportService;
+import apps.spring.reportium.specifications.ReportFilterSpecificationBuilder;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 
@@ -45,23 +47,20 @@
         return reportRepository.getCriminalReportsByPersonId(personId);
     }
+
     @Override
     public Page<Report> findPaginatedReports(int page, int size, String sortField, String sortDir) {
-        int safePage = Math.max(0, page - 1);
+        Sort sort = sortDir.equalsIgnoreCase("asc")
+                ? Sort.by(sortField).ascending().and(Sort.by("reportId").ascending())
+                : Sort.by(sortField).descending().and(Sort.by("reportId").descending());
 
-        Sort sort = sortDir.equalsIgnoreCase("asc") ?
-                Sort.by(sortField).ascending() : Sort.by(sortField).descending();
+        Pageable pageable = PageRequest.of(page, size, sort);
+        return reportRepository.findAll(pageable);
 
-        Pageable pageable = PageRequest.of(safePage, size, sort);
-        return reportRepository.findAll(pageable);
-    }
-
-    @Override
-    public List<Report> getReportsByTypeViews(List<String> reportTypes) {
-        return List.of();
     }
 
     @Override
     public List<Report> getReportsByAdvancedFilter(ReportFilterDTO filter) {
-        return List.of();
+        Specification<Report> spec = ReportFilterSpecificationBuilder.build(filter);
+        return reportRepository.findAll(spec); // from JpaSpecificationExecutor
     }
 }
Index: src/main/java/apps/spring/reportium/specifications/ReportFilterSpecificationBuilder.java
===================================================================
--- src/main/java/apps/spring/reportium/specifications/ReportFilterSpecificationBuilder.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
+++ src/main/java/apps/spring/reportium/specifications/ReportFilterSpecificationBuilder.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -0,0 +1,190 @@
+package apps.spring.reportium.specifications;
+
+import apps.spring.reportium.entity.*;
+import apps.spring.reportium.entity.DTOs.ReportFilterDTO;
+import apps.spring.reportium.entity.enumerations.PunishmentType;
+import apps.spring.reportium.entity.enumerations.SelectedFilterSection;
+import apps.spring.reportium.entity.exceptions.AgeFilterOnNotAlivePeopleException;
+import apps.spring.reportium.repository.PersonRepository;
+import apps.spring.reportium.repository.ReportRepository;
+import org.springframework.cglib.core.Local;
+import org.springframework.data.jpa.domain.Specification;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.springframework.data.jpa.domain.Specification;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Join;
+import jakarta.persistence.criteria.JoinType;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
+import jakarta.persistence.criteria.Expression;
+
+import static apps.spring.reportium.entity.enumerations.ComparisonDTOEnum.*;
+
+public class ReportFilterSpecificationBuilder {
+    public static Specification<Report> build(ReportFilterDTO filter) {
+        return (root, query, cb) -> {
+            //global things
+            query.distinct(true);
+            LocalDate now = LocalDate.now();
+            List<Predicate> predicates = new ArrayList<>();
+            if (filter.getFilter_selected().equals(SelectedFilterSection.PERSON)) {
+                //proof of concept 1 -> Person Join Filters
+                /* Person */
+                Join<Report, Person> report_on_person_join = root.join("person", JoinType.LEFT);
+                // predicate that checks if there exists a person with the string provided in the name
+                if (filter.getPerson_name_string() != null && !filter.getPerson_name_string().isBlank()) {
+                    predicates.add(cb.like(cb.lower(report_on_person_join.get("name")),
+                            "%" + filter.getPerson_name_string().toLowerCase() + "%"));
+                }
+                // predicate that checks if there exists a person with the string provided in the surname
+                if (filter.getPerson_surname_string() != null && !filter.getPerson_surname_string().isBlank()) {
+                    predicates.add(cb.like(cb.lower(report_on_person_join.get("surname")), "%" + filter.getPerson_surname_string().toLowerCase() + "%"));
+                }
+                // Age filters work for people who are alive only, otherwise no
+                if (filter.getIs_alive()) {
+                    if (filter.getCorrect_age() != null && filter.getCorrect_age() > 0) {
+                        Expression<Integer> years_age = cb.function("date_part", Integer.class, cb.literal("year"),
+                                cb.function("age", String.class, cb.currentDate(), report_on_person_join.get("dateOfBirth")));
+                        predicates.add(cb.equal(years_age, filter.getCorrect_age()));
+                    } else if (filter.getCorrect_age() == null || filter.getCorrect_age() == 0) {
+                        if (filter.getAge_start() > 0) {
+                            LocalDate start_age = now.minusYears(filter.getAge_start());//
+                            predicates.add(cb.lessThanOrEqualTo(report_on_person_join.get("dateOfBirth"), start_age));
+                        }
+                        if (filter.getAge_end() < 120) {
+                            LocalDate end_age = now.minusYears(filter.getAge_end() + 1).plusDays(1);
+                            predicates.add(cb.greaterThanOrEqualTo(report_on_person_join.get("dateOfBirth"), end_age));
+                        }
+                    }
+                    predicates.add(cb.isNull(report_on_person_join.get("dateOfDeath")));
+                } else {
+                    predicates.add(cb.isNotNull(report_on_person_join.get("dateOfDeath")));
+                }
+                // Gender
+                if (filter.getGender() != null) {
+                    predicates.add(cb.equal(report_on_person_join.get("gender"), filter.getGender()));
+                }
+                // Address
+                if (filter.getAddress_string() != null && !filter.getAddress_string().isBlank()) {
+                    predicates.add(cb.like(
+                            cb.lower(report_on_person_join.get("address")),
+                            "%" + filter.getAddress_string().toLowerCase() + "%"
+                    ));
+                }
+            }
+            if (filter.getFilter_selected().equals(SelectedFilterSection.EMPLOYMENT)) {
+                //proof of concept 2 -> Employment Report Join Filters
+                /* Employment Report */
+                Join<Report, EmploymentReport> employment_report_join = root.join("employmentReport", JoinType.LEFT);
+                //predicate for income check (more,less,equal)
+                if (filter.getIncome_comparison() != null && filter.getIncome_amount() > 0) {
+                    switch (filter.getIncome_comparison()) {
+                        case more ->
+                                predicates.add(cb.greaterThan(employment_report_join.get("incomePerMonth"), filter.getIncome_amount()));
+                        case equal ->
+                                predicates.add(cb.equal(employment_report_join.get("incomePerMonth"), filter.getIncome_amount()));
+                        case less ->
+                                predicates.add(cb.lessThan(employment_report_join.get("incomePerMonth"), filter.getIncome_amount()));
+                    }
+                }
+                //predicate for years_experience check (more,less,equal)
+                if (filter.getYears_experience_comparison() != null && filter.getYears_experience() > 0) {
+                    //this function is in the database, and I execute it
+                    Expression<Integer> totalYearsExpr = cb.function(
+                            "years_total", Integer.class,
+                            employment_report_join.get("startDate"), employment_report_join.get("endDate")
+                    );
+                    switch (filter.getYears_experience_comparison()) {
+                        case more -> predicates.add(cb.greaterThan(totalYearsExpr, filter.getYears_experience()));
+                        case equal -> predicates.add(cb.equal(totalYearsExpr, filter.getYears_experience()));
+                        case less -> predicates.add(cb.lessThan(totalYearsExpr, filter.getYears_experience()));
+                    }
+                }
+            }
+            if (filter.getFilter_selected().equals(SelectedFilterSection.ACADEMIC)) {
+                //proof of concept 3 -> Academic Report Join Filters
+                /* Academic Report */
+                Join<Report, AcademicReport> academic_report_join = root.join("academicReport", JoinType.LEFT);
+                //predicate for field of study
+                if (filter.getAcademic_field() != null && !filter.getAcademic_field().isBlank()) {
+                    predicates.add(cb.like(cb.lower(academic_report_join.get("academicField")), "%" + filter.getAcademic_field().toLowerCase() + "%"));
+                }
+                //predicate for institution field
+                Join<AcademicReport, Institution> academic_report_institution_join = academic_report_join.join("institution", JoinType.LEFT);
+                if (filter.getInstitution_type() != null) {
+                    predicates.add(cb.equal(academic_report_institution_join.get("type"), filter.getInstitution_type()));
+                }
+            }
+            if (filter.getFilter_selected().equals(SelectedFilterSection.MEDICAL)) {
+                //proof of concept 4 -> Medical Report Join Filters
+                /* Medical Report */
+                Join<Report, MedicalReport> medical_report_join = root.join("medicalReport", JoinType.LEFT);
+                Join<MedicalReport, Doctor> medical_report_doctor_join = medical_report_join.join("doctor", JoinType.LEFT);
+                //predicate for has next control
+                if (filter.getHas_next_control()) {
+                    predicates.add(cb.isNotNull(medical_report_join.get("nextControlDate")));
+                } else {
+                    predicates.add(cb.isNull(medical_report_join.get("nextControlDate")));
+                }
+                //predicate for doctor name
+                if (filter.getDoctor_name_string() != null && !filter.getDoctor_name_string().isBlank()) {
+                    predicates.add(cb.like(cb.lower(medical_report_doctor_join.get("name")), "%" + filter.getDoctor_name_string().toLowerCase() + "%"));
+                }
+                //predicate for doctor surname
+                if (filter.getDoctor_surname_string() != null && !filter.getDoctor_surname_string().isBlank()) {
+                    predicates.add(cb.like(cb.lower(medical_report_doctor_join.get("surname")), "%" + filter.getDoctor_surname_string().toLowerCase() + "%"));
+                }
+                //predicate for specialization
+                if (filter.getSpecialization() != null) {
+                    predicates.add(cb.equal(medical_report_doctor_join.get("specialization"), filter.getSpecialization()));
+                }
+                Join<MedicalReport, MedicalReportDiagnosis> mrd_join = medical_report_join.join("medicalReportDiagnoses", JoinType.INNER);
+                Join<MedicalReportDiagnosis, Diagnosis> diagnosis_join = mrd_join.join("diagnosis", JoinType.INNER);
+                //predicate for if the illness is chronic
+                if (filter.getIs_chronic() != null) {
+                    predicates.add(cb.equal(diagnosis_join.get("isChronic"), filter.getIs_chronic()));
+                }
+            }
+            if (filter.getFilter_selected().equals(SelectedFilterSection.CRIMINAL)) {
+                //proof of concept 5 -> Criminal Report Join Filters
+                /* Criminal Report */
+                Join<Report, CriminalReport> criminal_report_join = root.join("criminalReport", JoinType.LEFT);
+                Join<CriminalReport, CrimeType> crime_type_join = criminal_report_join.join("crimeType", JoinType.LEFT);
+                //predicate for severity level
+                if (filter.getCrime_severity_level() != null) {
+                    predicates.add(cb.equal(crime_type_join.get("severityLevel"), filter.getCrime_severity_level()));
+                }
+                //predicate for resolved
+                if (filter.getIs_resolved() != null) {
+                    predicates.add(cb.equal(criminal_report_join.get("resolved"), filter.getIs_resolved()));
+                }
+                Join<CriminalReport, Punishment> punishment_join = criminal_report_join.join("punishment", JoinType.INNER);
+                //predicate for punishment as fine
+                if (PunishmentType.FINE.equals(filter.getPunishment_type()) && filter.getPunishment_fine() != null && filter.getPunishment_fine() > 0) {
+                    predicates.add(cb.equal(punishment_join.get("fineToPay"), filter.getPunishment_fine()));
+                }
+                //predicate for punishment as prison
+                if (PunishmentType.PRISON.equals(filter.getPunishment_type()) && filter.getPunishment_years() != null && filter.getPunishment_years() > 0) {
+                    Expression<LocalDate> created_at = root.get("createdAt");
+                    Expression<Integer> years_in_prison = cb.function("years_total", Integer.class,
+                            created_at, punishment_join.get("releaseDate"));
+                    predicates.add(cb.equal(years_in_prison, filter.getPunishment_years()));
+                }
+                //predicate for criminal type
+                if (filter.getCrime_type_label() != null && !filter.getCrime_type_label().isBlank()) {
+                    predicates.add(cb.like(cb.lower(crime_type_join.get("label")), "%" + filter.getCrime_type_label().toLowerCase() + "%"));
+                }
+            }
+
+
+            return cb.and(predicates.toArray(new Predicate[0]));
+        };
+    }
+}
Index: src/main/java/apps/spring/reportium/web/AdvancedFilterController.java
===================================================================
--- src/main/java/apps/spring/reportium/web/AdvancedFilterController.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/web/AdvancedFilterController.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -5,11 +5,13 @@
 import apps.spring.reportium.entity.DTOs.view_fetching_dtos.CrimeReportViewFetchingDTO;
 import apps.spring.reportium.entity.DTOs.view_fetching_dtos.MedicalReportViewFetchingDTO;
+import apps.spring.reportium.entity.FilterSession;
 import apps.spring.reportium.entity.Report;
-import apps.spring.reportium.entity.enumerations.ComparisonDTOEnum;
-import apps.spring.reportium.entity.enumerations.DoctorSpecialization;
-import apps.spring.reportium.entity.enumerations.InstitutionType;
-import apps.spring.reportium.entity.enumerations.SeverityLevel;
+import apps.spring.reportium.entity.enumerations.*;
 import apps.spring.reportium.repository.ReportViewRepository;
+import apps.spring.reportium.service.FilterSessionService;
 import apps.spring.reportium.service.ReportService;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -22,6 +24,8 @@
 public class AdvancedFilterController {
     private final ReportService reportService;
-    public AdvancedFilterController(ReportService reportService) {
+    private final FilterSessionService filterSessionService;
+    public AdvancedFilterController(ReportService reportService, FilterSessionService filterSessionService) {
         this.reportService = reportService;
+        this.filterSessionService = filterSessionService;
     }
     @GetMapping("/advanced_filter")
@@ -32,7 +36,7 @@
         model.addAttribute("comparisons", Arrays.asList(ComparisonDTOEnum.values()));
         model.addAttribute("institutions", Arrays.asList(InstitutionType.values()));
+        model.addAttribute("filter_types", SelectedFilterSection.values());
         return "filter_panel";
     }
-
     @PostMapping("/advanced_filter")
     public String applyAdvancedFilter(@ModelAttribute ReportFilterDTO filter, Model model) {
@@ -41,3 +45,15 @@
         return "redirect:/reports";
     }
+    @PostMapping("/advanced_filter_pt2")
+    public String handleFilter(@ModelAttribute("filter") ReportFilterDTO filter, Model model) {
+        System.out.println("Selected filter: " + filter.getFilter_selected());
+        List<Report> filteredReports = reportService.getReportsByAdvancedFilter(filter);
+        model.addAttribute("results", filteredReports);
+        model.addAttribute("filter", filter);
+        filterSessionService.save(filter);
+        return "filtered_results";
+    }
+
+
+
 }
Index: src/main/java/apps/spring/reportium/web/ReportsController.java
===================================================================
--- src/main/java/apps/spring/reportium/web/ReportsController.java	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/java/apps/spring/reportium/web/ReportsController.java	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -22,5 +22,5 @@
     public String listReports(Model model,
                               @RequestParam(defaultValue = "0") int page,
-                              @RequestParam(defaultValue = "20") int size,
+                              @RequestParam(defaultValue = "35") int size,
                               @RequestParam(defaultValue = "reportId") String sortField,
                               @RequestParam(defaultValue = "asc") String sortDir) {
Index: src/main/resources/application-prod.properties
===================================================================
--- src/main/resources/application-prod.properties	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/resources/application-prod.properties	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -8,2 +8,3 @@
 spring.jpa.show-sql=true
 spring.jpa.properties.hibernate.format_sql=true
+logging.level.org.hibernate.type.descriptor.sql=TRACE
Index: src/main/resources/application.properties
===================================================================
--- src/main/resources/application.properties	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/resources/application.properties	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -4,4 +4,6 @@
 server.servlet.session.timeout=1200s
 
+
+
 #server.error.include-message=always
 #server.error.include-stacktrace=always
Index: src/main/resources/templates/filter_panel.html
===================================================================
--- src/main/resources/templates/filter_panel.html	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/resources/templates/filter_panel.html	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -41,97 +41,125 @@
         </div>
     </nav>
-    <form th:action="@{/advanced_filter}" method="post" th:object="${filter}">
-        <h3 class="text-center px-4 py-3 bg-dark text-white fw-bolder rounded">Advanced Filtering Page</h3>
-        <hr class="my-4 border-dark">
-        <h4 class="fw-bold mb-3">Person</h4>
-        <!-- Full Name -->
+
+    <form class="mt-5" th:action="@{/advanced_filter_pt2}" method="post" th:object="${filter}">
         <div class="mb-4">
-            <label for="person_name_surname_string" class="form-label fw-bold">Full Name</label>
-            <input id="person_name_surname_string" type="text" name="person_name_surname_string"
-                   class="form-control"
-                   th:field="*{person_name_surname_string}" placeholder="Enter name and surname">
-        </div>
-        <!-- Age Part -->
-        <div class="row mb-4 d-flex justify-content-center">
-            <!-- Age Range -->
-            <div class="col-9">
-                <label class="form-label fw-bold">Age Range</label>
-                <div class="row">
-                    <div class="col-md-6">
-                        <label for="age_start" class="form-label">Start Age</label>
-                        <input type="range" class="form-range" min="0" max="120" value="0" name="age_start"
-                               th:field="*{age_start}" id="age_start"
-                               oninput="updateAgeRange()">
-                    </div>
-                    <div class="col-md-6">
-                        <label for="age_end" class="form-label d-flex justify-content-end">End Age</label>
-                        <input type="range" class="form-range" min="0" max="120" value="120" id="age_end"
-                               name="age_end"
-                               th:field="*{age_end}" oninput="updateAgeRange()">
-                    </div>
-                </div>
-            </div>
-            <!-- Correct Age -->
-            <div class="col-3 d-flex flex-column justify-content-center align-items-center">
-                <label for="correct_age" class="form-label fw-bold text-center">Correct Age</label>
-                <input type="number" id="correct_age" class="form-control text-center" name="correct_age"
-                       style="width: 80px;" min="0"
-                       max="120" value="0"
-                       th:field="*{correct_age}" oninput="updateAgeRange()">
-            </div>
-        </div>
-        <div class="alert alert-info py-2 text-center mt-2 w-25 m-auto" role="alert">
-            <strong><span id="ageRangeDisplay">0 - 120</span></strong>
-        </div>
-        <!-- Gender -->
-        <div class="mb-4">
-            <label class="form-label fw-bold">Gender</label>
-            <div class="form-check">
-                <input class="form-check-input" type="radio" th:field="*{gender}" id="male" value="MALE">
-                <label class="form-check-label" for="male">Male</label>
-            </div>
-            <div class="form-check">
-                <input class="form-check-input" type="radio" th:field="*{gender}" id="female" value="FEMALE">
-                <label class="form-check-label" for="female">Female</label>
-            </div>
-        </div>
-        <!-- Address -->
-        <div class="mb-4">
-            <label for="address_string" class="form-label fw-bold">Address</label>
-            <input type="text" id="address_string" name="address_string" class="form-control"
-                   th:field="*{address_string}" placeholder="Enter address">
-        </div>
-        <!-- Is Alive -->
-        <div class="mb-4 form-check">
-            <input class="form-check-input"
-                   type="checkbox"
-                   th:field="*{is_alive}"
-                   id="is_alive">
-            <label class="form-check-label fw-bold" for="is_alive">
-                Is Alive
-            </label>
-        </div>
-
-        <hr class="my-4">
-        <div class="row d-flex">
-            <!-- Academic Report -->
-            <div class="col-6 border-end border-secondary-subtle">
-                <h4 class="fw-bold mb-3">Academic Report</h4>
-                <div class="mb-4">
-                    <label for="academic_field" class="form-label fw-bold">Field of Study</label>
-                    <input type="text" id="academic_field" class="form-control"
-                           placeholder="e.g. Computer Science, Biology..." th:field="*{academic_field}">
-                </div>
-                <div class="mb-4">
-                    <label for="institution_type">Institution type</label>
-                    <select class="form-select" id="institution_type" name="institution_type"
-                            th:field="*{institution_type}">
-                        <option value="" th:text="'Choose'"></option>
-                        <option th:each="inst : ${institutions}"
-                                th:value="${inst}"
-                                th:text="${inst}"></option>
-                    </select>
-                </div>
-            </div>
+            <label for="filter_type">Select a filter type:</label>
+            <select class="form-select" id="filter_type" name="filter_selected" onchange="selectFilterArea()">
+                <option th:each="fil : ${filter_types} "
+                        th:value="${fil}"
+                        th:text="${fil}"></option>
+            </select>
+        </div>
+        <div id="person_filter" class="mb-4 d-none">
+            <h3 class="text-center px-4 py-3 bg-dark text-white fw-bolder rounded">Advanced Filtering Page</h3>
+            <hr class="my-4 border-dark">
+            <h4 class="fw-bold mb-3">Person</h4>
+            <!-- Full Name -->
+            <div class="row d-flex justify-content-between">
+                <div class="col-6 mb-4">
+                    <label for="person_name_string" class="form-label fw-bold">Name</label>
+                    <input id="person_name_string" type="text" name="person_name_string"
+                           class="form-control"
+                           th:field="*{person_name_string}" placeholder="Enter name">
+                </div>
+                <div class="col-6 mb-4">
+                    <label for="person_surname_string" class="form-label fw-bold">Surname</label>
+                    <input id="person_surname_string" type="text" name="person_surname_string"
+                           class="form-control"
+                           th:field="*{person_surname_string}" placeholder="Enter surname">
+                </div>
+            </div>
+
+            <!-- Age Part -->
+            <div class="row mb-4 d-flex justify-content-center">
+                <!-- Age Range -->
+                <div class="col-9">
+                    <label class="form-label fw-bold">Age Range</label>
+                    <div class="row">
+                        <div class="col-md-6">
+                            <label for="age_start" class="form-label">Start Age</label>
+                            <input type="range" class="form-range" min="0" max="120" value="0" name="age_start"
+                                   th:field="*{age_start}" id="age_start"
+                                   oninput="updateAgeRange()">
+                        </div>
+                        <div class="col-md-6">
+                            <label for="age_end" class="form-label d-flex justify-content-end">End Age</label>
+                            <input type="range" class="form-range" min="0" max="120" value="120" id="age_end"
+                                   name="age_end"
+                                   th:field="*{age_end}" oninput="updateAgeRange()">
+                        </div>
+                    </div>
+                </div>
+                <!-- Correct Age -->
+                <div class="col-3 d-flex flex-column justify-content-center align-items-center">
+                    <label for="correct_age" class="form-label fw-bold text-center">Correct Age</label>
+                    <input type="number" id="correct_age" class="form-control text-center" name="correct_age"
+                           style="width: 80px;" min="0"
+                           max="120" value="0"
+                           th:field="*{correct_age}" oninput="updateAgeRange()">
+                </div>
+            </div>
+            <div class="alert alert-info py-2 text-center mt-2 w-25 m-auto" role="alert" id="age_label">
+                <strong><span id="ageRangeDisplay">0 - 120</span></strong>
+            </div>
+            <!-- Gender -->
+            <div class="mb-4">
+                <label class="form-label fw-bold">Gender</label>
+                <div class="form-check">
+                    <input class="form-check-input" type="radio" th:field="*{gender}" checked id="none" value="">
+                    <label class="form-check-label" for="none">Any</label>
+                </div>
+                <div class="form-check">
+                    <input class="form-check-input" type="radio" th:field="*{gender}" id="male" value="MALE">
+                    <label class="form-check-label" for="male">Male</label>
+                </div>
+                <div class="form-check">
+                    <input class="form-check-input" type="radio" th:field="*{gender}" id="female" value="FEMALE">
+                    <label class="form-check-label" for="female">Female</label>
+                </div>
+            </div>
+            <!-- Address -->
+            <div class="mb-4">
+                <label for="address_string" class="form-label fw-bold">Address</label>
+                <input type="text" id="address_string" name="address_string" class="form-control"
+                       th:field="*{address_string}" placeholder="Enter address">
+            </div>
+            <!-- Is Alive -->
+            <div class="mb-4 form-check">
+                <input class="form-check-input"
+                       type="checkbox"
+                       th:field="*{is_alive}"
+                       id="is_alive" onchange="disableAgeFilters()">
+                <label class="form-check-label fw-bold" for="is_alive">
+                    Is Alive
+                </label>
+            </div>
+        </div>
+
+        <div class="mb-4 d-none" id="academic_filter">
+            <hr class="my-4">
+            <div class="row d-flex">
+                <!-- Academic Report -->
+                <div class="col-6 border-end border-secondary-subtle">
+                    <h4 class="fw-bold mb-3">Academic Report</h4>
+                    <div class="mb-4">
+                        <label for="academic_field" class="form-label fw-bold">Field of Study</label>
+                        <input type="text" id="academic_field" class="form-control"
+                               placeholder="e.g. Computer Science, Biology..." th:field="*{academic_field}">
+                    </div>
+                    <div class="mb-4">
+                        <label for="institution_type">Institution type</label>
+                        <select class="form-select" id="institution_type" name="institution_type"
+                                th:field="*{institution_type}">
+                            <option value="" th:text="'Choose'"></option>
+                            <option th:each="inst : ${institutions}"
+                                    th:value="${inst}"
+                                    th:text="${inst}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="mb-4 d-none" id="employment_filter">
             <!-- Employment Report -->
             <div class="col-6">
@@ -151,5 +179,6 @@
                     <div class="col-md-4">
                         <label for="income_amount" class="form-label fw-bold">Income</label>
-                        <input type="number" class="form-control" name="income_amount" id="income_amount"
+                        <input type="number" step="0.01" class="form-control" name="income_amount"
+                               id="income_amount"
                                min="0" th:field="*{income_amount}">
                     </div>
@@ -181,118 +210,117 @@
             </div>
         </div>
-        <!-- Criminal Report -->
-        <hr class="my-4">
-        <h4 class="fw-bold mb-3">Criminal Report</h4>
-
-        <div class="row mb-4 d-flex">
-            <div class="col-4 border-end border-secondary-subtle">
-                <div class="col">
-                    <label for="crime_severity_level">Severity of Crime</label>
-                    <select class="form-select" id="crime_severity_level" name="crime_severity_level"
-                            th:field="*{crime_severity_level}">
+        <div class="mb-4 d-none" id="criminal_filter">
+            <!-- Criminal Report -->
+            <hr class="my-4">
+            <h4 class="fw-bold mb-3">Criminal Report</h4>
+
+            <div class="row mb-4 d-flex">
+                <div class="col-4 border-end border-secondary-subtle">
+                    <div class="col">
+                        <label for="crime_severity_level">Severity of Crime</label>
+                        <select class="form-select" id="crime_severity_level" name="crime_severity_level"
+                                th:field="*{crime_severity_level}">
+                            <option value="" th:text="'Choose'"></option>
+                            <option th:each="sev : ${severities}"
+                                    th:value="${sev}"
+                                    th:text="${sev}"></option>
+                        </select>
+                    </div>
+                    <!-- Is Resolved -->
+                    <div class="col- ms-3 mt-3 mb-4 form-check">
+                        <input class="form-check-input" type="checkbox" name="is_resolved" id="is_resolved"
+                               th:field="*{is_resolved}">
+                        <label class="form-check-label fw-bold" for="is_resolved">Is Resolved</label>
+                    </div>
+                </div>
+                <div class="col-4 d-flex justify-content-center border-end border-secondary-subtle">
+                    <!-- Punishment Type Radios -->
+                    <div class="col-6 mb-3">
+                        <label class="form-label fw-bold">Punishment Type</label>
+                        <!-- Fine Punishment -->
+                        <div class="form-check">
+                            <input class="form-check-input" type="radio" th:field="*{punishment_type}"
+                                   id="punishmentFineRadio"
+                                   value="FINE" onclick="togglePunishment()">
+                            <label class="form-check-label" for="punishmentFineRadio">Fine (euros)</label>
+                        </div>
+                        <!-- Years Punishment -->
+                        <div class="form-check">
+                            <input class="form-check-input" type="radio" th:field="*{punishment_type}"
+                                   id="punishmentYearsRadio"
+                                   value="PRISON" onclick="togglePunishment()">
+                            <label class="form-check-label" for="punishmentYearsRadio">Prison (years)</label>
+                        </div>
+                    </div>
+
+                    <!-- Fine input -->
+                    <div class="col-md-6" id="fineInput">
+                        <label for="punishment_fine" class="form-label fw-bold">Punishment Fine (euros)</label>
+                        <input type="number" id="punishment_fine" th:field="*{punishment_fine}" class="form-control"
+                               min="0">
+                    </div>
+
+                    <!-- Years input -->
+                    <div class="col-md-6 d-none" id="yearsInput">
+                        <label for="punishment_years" class="form-label fw-bold">Punishment Duration (years)</label>
+                        <input type="number" id="punishment_years" th:field="*{punishment_years}" class="form-control"
+                               min="0">
+                    </div>
+                </div>
+                <div class="col-4">
+                    <!-- Criminal Type -->
+                    <div class="mb-4">
+                        <label for="crime_type_label" class="form-label fw-bold">Criminal Type</label>
+                        <input type="text" id="crime_type_label" name="crime_type_label"
+                               th:field="*{crime_type_label}" class="form-control"
+                               placeholder="e.g. theft, fraud, fight, etc.">
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="mb-4 d-none" id="medical_filter">
+            <hr class="my-4">
+            <h4 class="fw-bold mb-3">Medical Report</h4>
+            <!-- Doctor Name + Surname -->
+            <div class="row mb-4">
+                <div class="col-6 d-flex justify-content-around">
+                    <div class="col-5">
+                        <label for="doctor_name_string" class="form-label fw-bold">Doctor Name</label>
+                        <input type="text" id="doctor_name_string" name="doctor_name_string" class="form-control"
+                               th:field="*{doctor_name_string}" placeholder="e.g. John">
+                    </div>
+                    <div class="col-5">
+                        <label for="doctor_surname_string" class="form-label fw-bold">Doctor Surname</label>
+                        <input type="text" id="doctor_surname_string" name="doctor_surname_string" class="form-control"
+                               th:field="*{doctor_surname_string}" placeholder="e.g. Smith">
+                    </div>
+                </div>
+                <div class="col-3">
+                    <label for="specialization">Doctor Specialization</label>
+                    <select class="form-select" id="specialization" name="specialization"
+                            th:field="*{specialization}">
                         <option value="" th:text="'Choose'"></option>
-                        <option th:each="sev : ${severities}"
-                                th:value="${sev}"
-                                th:text="${sev}"></option>
+                        <option th:each="specs : ${specializations}"
+                                th:value="${specs}"
+                                th:text="${specs}"></option>
                     </select>
                 </div>
-                <!-- Is Resolved -->
-                <div class="col- ms-3 mt-3 mb-4 form-check">
-                    <input class="form-check-input" type="checkbox" name="is_resolved" id="is_resolved"
-                           th:field="*{is_resolved}">
-                    <label class="form-check-label fw-bold" for="is_resolved">Is Resolved</label>
-                </div>
-            </div>
-            <div class="col-4 d-flex justify-content-center border-end border-secondary-subtle">
-                <!-- Punishment Type Radios -->
-                <div class="col-6 mb-3">
-                    <label class="form-label fw-bold">Punishment Type</label>
-                    <!-- Fine Punishment -->
-                    <div class="form-check">
-                        <input class="form-check-input" type="radio" th:field="*{punishment_type}"
-                               id="punishmentFineRadio"
-                               value="FINE" onclick="togglePunishment()">
-                        <label class="form-check-label" for="punishmentFineRadio">Fine (euros)</label>
-                    </div>
-                    <!-- Years Punishment -->
-                    <div class="form-check">
-                        <input class="form-check-input" type="radio" th:field="*{punishment_type}"
-                               id="punishmentYearsRadio"
-                               value="PRISON" onclick="togglePunishment()">
-                        <label class="form-check-label" for="punishmentYearsRadio">Prison (years)</label>
-                    </div>
-                </div>
-
-                <!-- Fine input -->
-                <div class="col-md-6" id="fineInput">
-                    <label for="punishment_fine" class="form-label fw-bold">Punishment Fine (euros)</label>
-                    <input type="number" id="punishment_fine" th:field="*{punishment_fine}" class="form-control"
-                           min="0">
-                </div>
-
-                <!-- Years input -->
-                <div class="col-md-6 d-none" id="yearsInput">
-                    <label for="punishment_years" class="form-label fw-bold">Punishment Duration (years)</label>
-                    <input type="number" id="punishment_years" th:field="*{punishment_years}" class="form-control"
-                           min="0">
-                </div>
-            </div>
-            <div class="col-4">
-                <!-- Criminal Type -->
-                <div class="mb-4">
-                    <label for="crime_type_label" class="form-label fw-bold">Criminal Type</label>
-                    <input type="text" id="crime_type_label" name="crime_type_label"
-                           th:field="*{crime_type_label}" class="form-control"
-                           placeholder="e.g. theft, fraud, etc.">
-                </div>
-            </div>
-        </div>
-        <hr class="my-4">
-        <h4 class="fw-bold mb-3">Medical Report</h4>
-        <!-- Doctor Name + Surname -->
-        <div class="row mb-4">
-            <div class="col-6 d-flex justify-content-around">
-                <div class="col-5">
-                    <label for="doctor_name_string" class="form-label fw-bold">Doctor Name</label>
-                    <input type="text" id="doctor_name_string" name="doctor_name_string" class="form-control"
-                           th:field="*{doctor_name_string}" placeholder="e.g. John">
-                </div>
-                <div class="col-5">
-                    <label for="doctor_surname_string" class="form-label fw-bold">Doctor Surname</label>
-                    <input type="text" id="doctor_surname_string" name="doctor_surname_string" class="form-control"
-                           th:field="*{doctor_surname_string}" placeholder="e.g. Smith">
-                </div>
-            </div>
-            <div class="col-3">
-                <label for="specialization">Severity of Crime</label>
-                <select class="form-select" id="specialization" name="specialization"
-                        th:field="*{specialization}">
-                    <option value="" th:text="'Choose'"></option>
-                    <option th:each="specs : ${specializations}"
-                            th:value="${specs}"
-                            th:text="${specs}"></option>
-                </select>
-            </div>
-            <!-- Still Active + Chronic Illness + Next Medical Control -->
-            <div class="col-md-3 d-flex flex-column gap-3">
-                <div>
-                    <input class="form-check-input" type="checkbox" checked id="is_active"
-                           onchange="toggleActiveBadge()" th:field="*{is_active}" name="is_active">
-                    <label class="form-check-label fw-bold me-2" for="is_active">Is Doctor still Active</label>
-                    <span id="activeBadge" class="badge bg-success text-white">Not Active</span>
-                </div>
-                <div>
-                    <input class="form-check-input" type="checkbox" name="is_chronic"
-                           id="is_chronic" th:field="*{is_chronic}">
-                    <label class="form-check-label fw-bold me-2" for="is_chronic">Is Chronic Illness</label>
-                </div>
-                <div>
-                    <input class="form-check-input" type="checkbox" checked name="has_next_control"
-                           id="has_next_control" th:field="*{has_next_control}">
-                    <label class="form-check-label fw-bold" for="has_next_control">
-                        Has Next Medical Control Scheduled
-                    </label>
-                </div>
-            </div>
+                <!-- Chronic Illness + Next Medical Control -->
+                <div class="col-md-3 d-flex flex-column gap-3">
+                    <div>
+                        <input class="form-check-input" type="checkbox" name="is_chronic"
+                               id="is_chronic" th:field="*{is_chronic}">
+                        <label class="form-check-label fw-bold me-2" for="is_chronic">Is Chronic Illness</label>
+                    </div>
+                    <div>
+                        <input class="form-check-input" type="checkbox" checked name="has_next_control"
+                               id="has_next_control" th:field="*{has_next_control}">
+                        <label class="form-check-label fw-bold" for="has_next_control">
+                            Has Next Medical Control Scheduled
+                        </label>
+                    </div>
+                </div>
+            </div>
+
         </div>
         <div class="mb-4 d-flex justify-content-center">
@@ -306,4 +334,22 @@
 
 <script>
+    function selectFilterArea() {
+        const selected = document.getElementById("filter_type").value;
+        const sections = ["person", "employment", "academic", "medical", "criminal"];
+
+        sections.forEach(sec => {
+            const sectionDiv = document.getElementById(`${sec}_filter`);
+            if (sectionDiv) {
+                if (sec.toUpperCase() === selected) {
+                    sectionDiv.classList.remove("d-none");
+                } else {
+                    sectionDiv.classList.add("d-none");
+                }
+            }
+        });
+    }
+
+
+
     function toggleActiveBadge() {
         const checkbox = document.getElementById("is_active");
@@ -325,4 +371,5 @@
         let end = parseInt(document.getElementById("age_end").value);
         let correct = parseInt(document.getElementById("correct_age").value);
+        console.log(start, end, correct);
         if (start > end) [start, end] = [end, start];
         let displayText;
@@ -351,9 +398,26 @@
     }
 
+    function disableAgeFilters() {
+        const is_alive_button = document.getElementById("is_alive");
+        const age_end = document.getElementById("age_end");
+        const age_start = document.getElementById("age_start");
+        const correct_age = document.getElementById("correct_age");
+        if (!is_alive_button.checked) {
+            age_end.disabled = true;
+            age_start.disabled = true;
+            correct_age.disabled = true;
+        } else {
+            age_end.disabled = false;
+            age_start.disabled = false;
+            correct_age.disabled = false;
+        }
+    }
 
     window.onload = function () {
+        selectFilterArea();
         updateAgeRange();
         togglePunishment();
         toggleActiveBadge();
+        disableAgeFilters();
     };
 </script>
Index: src/main/resources/templates/filtered_results.html
===================================================================
--- src/main/resources/templates/filtered_results.html	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
+++ src/main/resources/templates/filtered_results.html	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Filtered Reports</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
+    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
+</head>
+<body style="background: #f8f9fa;">
+
+<div class="container py-5">
+
+    <h2 class="text-center mb-4 text-primary fw-bold">Filtered Reports</h2>
+
+    <div class="table-responsive shadow-sm rounded">
+        <table class="table table-striped table-bordered align-middle">
+            <thead class="table-dark text-center">
+            <tr>
+                <th>ID</th>
+                <th>Summary</th>
+                <th>Created At</th>
+                <th>Person Reference</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr th:each="report : ${results}">
+                <td th:text="${report.reportId}">1</td>
+                <td th:text="${report.summary}">Sample Summary</td>
+                <td th:text="${report.createdAt}">2024-01-01</td>
+                <td>
+                    <span th:text="${'{' + report.person.personId + '} → ' + report.person.name + ' ' + report.person.surname}">Person</span>
+                </td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+</body>
+</html>
Index: src/main/resources/templates/home.html
===================================================================
--- src/main/resources/templates/home.html	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/resources/templates/home.html	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -41,5 +41,10 @@
             text-align: center;
         }
-
+        .badge-yes{
+            background-color: #36c634;
+        }
+        .badge-no{
+            background-color: #d14040;
+        }
     </style>
 </head>
Index: src/main/resources/templates/login.html
===================================================================
--- src/main/resources/templates/login.html	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/resources/templates/login.html	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -79,10 +79,12 @@
     <form th:action="@{/login}" method="post">
         <div class="mb-3">
-            <input type="text" name="username" class="form-control" value="leonasanovski@gmail.com" placeholder="Email" required>
+            <input type="text" name="username" class="form-control" value="leonasanovski@gmail.com" placeholder="Email"
+                   required>
         </div>
         <div class="mb-3">
-            <input type="password" name="password" value="#Admin123" class="form-control" placeholder="Password" required>
+            <input type="password" name="password" value="#Admin123" class="form-control" placeholder="Password"
+                   required>
         </div>
-        <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
+        <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
 
         <div class="d-grid">
@@ -90,7 +92,4 @@
         </div>
     </form>
-    <div th:if="${hasError}" class="alert alert-danger mt-3 text-center" role="alert">
-        <span th:text="${error}">Invalid credentials</span>
-    </div>
     <div class="footer-text mt-3">
         Don't have an account? <a href="/register">Register</a>
Index: src/main/resources/templates/person_reports.html
===================================================================
--- src/main/resources/templates/person_reports.html	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/resources/templates/person_reports.html	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -39,4 +39,5 @@
             overflow: hidden;
         }
+
     </style>
 </head>
Index: src/main/resources/templates/reports.html
===================================================================
--- src/main/resources/templates/reports.html	(revision 582ac3e3698f4f8ba904b5f1a42f8ba5d65146d0)
+++ src/main/resources/templates/reports.html	(revision ce73f820bfb4b153597989970f1c9b0a60da5200)
@@ -209,24 +209,10 @@
     <nav>
         <ul class="pagination justify-content-center">
-            <li class="page-item" th:classappend="${currentPage == 1} ? 'disabled'">
-                <a class="page-link"
-                   th:href="@{/reports(page=${currentPage - 1}, size=${reportsPage.size}, sortField=${sortField}, sortDir=${sortDir})}">
-                    Previous
-                </a>
-            </li>
-
             <li class="page-item"
-                th:each="i : ${#numbers.sequence(1, totalPages)}"
-                th:classappend="${i == currentPage} ? (i == 1 ? 'first-page-active' : 'active')">
+                th:each="i : ${#numbers.sequence(0, totalPages - 1)}"
+                th:classappend="${i == currentPage} ? (i == 0 ? ' first-page-active' : ' active') : ''">
                 <a class="page-link"
                    th:href="@{/reports(page=${i}, size=${reportsPage.size}, sortField=${sortField}, sortDir=${sortDir})}"
-                   th:text="${i}">1</a>
-            </li>
-
-            <li class="page-item" th:classappend="${currentPage == totalPages} ? 'disabled'">
-                <a class="page-link"
-                   th:href="@{/reports(page=${currentPage + 1}, size=${reportsPage.size}, sortField=${sortField}, sortDir=${sortDir})}">
-                    Next
-                </a>
+                   th:text="${i + 1}">1</a>
             </li>
         </ul>
