Index: frontend/src/components/SubjectCatalog/FilterSidebar.tsx
===================================================================
--- frontend/src/components/SubjectCatalog/FilterSidebar.tsx	(revision aa08549fdae665fa04e8ebf1293f4856bc6ca83c)
+++ frontend/src/components/SubjectCatalog/FilterSidebar.tsx	(revision 35d0383d3aa6f2701b00bb6feeb10273f1a1d2fe)
@@ -1,4 +1,5 @@
+import { ChevronDown } from "lucide-react";
 import { useState } from "react";
-import { STUDY_TRACKS } from "../../constants/subjects";
+import { EVALUATIONS, STUDY_TRACKS } from "../../constants/subjects";
 import { Filters } from "../types";
 import { resetFilters } from "./utils";
@@ -12,4 +13,36 @@
 }
 
+const FilterHeader = ({
+	label,
+	filterKey,
+	openFilters,
+	toggleFilter,
+	children,
+}: {
+	label: string;
+	filterKey: string;
+	openFilters: { [key: string]: boolean };
+	toggleFilter: (key: string) => void;
+	children: React.ReactNode;
+}) => (
+	<div className="mb-2">
+		<button
+			type="button"
+			className="w-full flex justify-between items-center py-2"
+			onClick={() => toggleFilter(filterKey)}
+		>
+			<span className="font-medium">{label}</span>
+			<ChevronDown
+				className="h-4 w-4 text-gray-500"
+				style={{
+					transform: openFilters[filterKey] ? "rotate(180deg)" : "rotate(0deg)",
+					transition: "transform 0.2s ease-in-out",
+				}}
+			/>
+		</button>
+		{openFilters[filterKey] && children}
+	</div>
+);
+
 const FilterSidebar = ({
 	setSearchTerm,
@@ -21,4 +54,21 @@
 }: FilterSidebarProps) => {
 	const [showTags, setShowTags] = useState(false);
+	const [openFilters, setOpenFilters] = useState<{ [key: string]: boolean }>(
+		{}
+	);
+	const toggleFilter = (key: string) => {
+		setOpenFilters((prev) => ({ ...prev, [key]: !prev[key] }));
+	};
+
+	const handleResetFilters = () => {
+		resetFilters(
+			setSearchTerm,
+			setProfessorSearchTerm,
+			setAssistantSearchTerm,
+			setFilters
+		);
+		setOpenFilters({});
+	};
+
 	return (
 		<div className="max-w-sm mx-auto">
@@ -26,12 +76,5 @@
 				<h2 className="text-lg font-semibold">Филтри</h2>
 				<button
-					onClick={() =>
-						resetFilters(
-							setSearchTerm,
-							setProfessorSearchTerm,
-							setAssistantSearchTerm,
-							setFilters
-						)
-					}
+					onClick={handleResetFilters}
 					className="text-sm text-gray-600 hover:text-gray-900"
 				>
@@ -40,8 +83,12 @@
 			</div>
 			<div className="mb-4">
-				{/* filter by season*/}
-				<div className="space-y-1 mb-4">
-					<h3 className="font-medium mb-2">Семестар</h3>
-					<div className="grid grid-cols-2">
+				{/* SEASON */}
+				<FilterHeader
+					label="Сезона"
+					filterKey="season"
+					openFilters={openFilters}
+					toggleFilter={toggleFilter}
+				>
+					<div className="grid grid-cols-2 mb-2 mt-1">
 						{["Летен", "Зимски"].map((season) => {
 							const seasonValue = season === "Летен" ? "S" : "W";
@@ -71,9 +118,13 @@
 						})}
 					</div>
-				</div>
-				{/* filter by semester*/}
-				<div className="space-y-1 mb-4">
-					{/* <h3 className="font-medium mb-2">Семестар</h3> */}
-					<div className="grid grid-cols-4 gap-2">
+				</FilterHeader>
+				{/* SEMESTER */}
+				<FilterHeader
+					label="Семестар"
+					filterKey="semester"
+					openFilters={openFilters}
+					toggleFilter={toggleFilter}
+				>
+					<div className="grid grid-cols-4 gap-2 mb-2 mt-1">
 						{Array.from(Array(8)).map((_, index) => {
 							const i = index + 1;
@@ -82,5 +133,5 @@
 									<input
 										type="checkbox"
-										name="season"
+										name="semester"
 										id={`s${i}`}
 										onChange={() =>
@@ -102,9 +153,13 @@
 						})}
 					</div>
-				</div>
-				{/* filter by level */}
-				<div className="space-y-1 mb-4">
-					<h3 className="font-medium mb-2">Ниво</h3>
-					<div className="flex gap-4 sm:grid sm:grid-cols-3">
+				</FilterHeader>
+				{/* LEVEL */}
+				<FilterHeader
+					label="Ниво"
+					filterKey="level"
+					openFilters={openFilters}
+					toggleFilter={toggleFilter}
+				>
+					<div className="flex gap-4 sm:grid sm:grid-cols-3 mb-2 mt-1">
 						{Array.from(Array(3)).map((_, index) => {
 							const i = index + 1;
@@ -137,9 +192,13 @@
 						})}
 					</div>
-				</div>
-				{/* filter by activation*/}
-				<div className="space-y-1 mb-4">
-					<h3 className="font-medium mb-2">Активирани</h3>
-					<div className="grid grid-cols-2">
+				</FilterHeader>
+				{/* ACTIVATED */}
+				<FilterHeader
+					label="Активирани"
+					filterKey="activated"
+					openFilters={openFilters}
+					toggleFilter={toggleFilter}
+				>
+					<div className="grid grid-cols-2 mb-2 mt-1">
 						{["Активирани", "Неактивирани"].map((value) => {
 							const activeValue =
@@ -149,5 +208,5 @@
 									<input
 										type="checkbox"
-										name="season"
+										name="activated"
 										id={activeValue}
 										onChange={() =>
@@ -171,9 +230,13 @@
 						})}
 					</div>
-				</div>
-				{/* filter by mandatoryFor */}
-				<div className="space-y-1 mb-4">
-					<h3 className="font-medium mb-2">Задолжителен за:</h3>
-					<div className="grid grid-cols-3 gap-2">
+				</FilterHeader>
+				{/* MANDATORY */}
+				<FilterHeader
+					label="Задолжителен за:"
+					filterKey="mandatoryFor"
+					openFilters={openFilters}
+					toggleFilter={toggleFilter}
+				>
+					<div className="grid grid-cols-3 gap-2 mb-2 mt-1">
 						{STUDY_TRACKS.map((track) => {
 							const studyTrack = track.replace(/\d+$/, "");
@@ -182,5 +245,5 @@
 									<input
 										type="checkbox"
-										name="level"
+										name="mandatoryFor"
 										id={track}
 										onChange={() =>
@@ -205,9 +268,13 @@
 						})}
 					</div>
-				</div>
-				{/* filter by electiveFor */}
-				<div className="space-y-1 mb-6">
-					<h3 className="font-medium mb-2">Изборен за:</h3>
-					<div className="grid grid-cols-3 gap-2">
+				</FilterHeader>
+				{/* ELECTIVE */}
+				<FilterHeader
+					label="Изборен за:"
+					filterKey="electiveFor"
+					openFilters={openFilters}
+					toggleFilter={toggleFilter}
+				>
+					<div className="grid grid-cols-3 gap-2 mb-2 mt-1">
 						{STUDY_TRACKS.map((track) => {
 							const studyTrack = track.replace(/\d+$/, "");
@@ -216,5 +283,5 @@
 									<input
 										type="checkbox"
-										name="level"
+										name="electiveFor"
 										id={track}
 										onChange={() =>
@@ -239,29 +306,61 @@
 						})}
 					</div>
-				</div>
-				{/* filter by prereq */}
-				<div className="space-y-1 mb-4">
-					<div className="flex items-center space-x-2">
-						<input
-							type="checkbox"
-							name="prereq"
-							id="prereq"
-							onChange={() =>
-								setFilters((prev) => ({
-									...prev,
-									hasPrerequisites: !prev.hasPrerequisites,
-								}))
-							}
-							checked={filters.hasPrerequisites}
-							className="h-4 w-4 rounded border-gray-300 text-blue-600"
-						/>
-						<label htmlFor={"prereq"} className="text-sm text-gray-700">
-							Предметот нема предуслови
+				</FilterHeader>
+				{/* PREREQUISITES */}
+				<FilterHeader
+					label="Предуслови"
+					filterKey="prereq"
+					openFilters={openFilters}
+					toggleFilter={toggleFilter}
+				>
+					<div className="flex flex-col gap-2 mb-2 mt-1">
+						<label className="flex items-center space-x-2">
+							<input
+								type="checkbox"
+								name="prereqsNo"
+								id="prereqsNo"
+								onChange={() =>
+									setFilters((prev) => ({
+										...prev,
+										hasPrerequisites:
+											prev.hasPrerequisites === false ? "" : false,
+									}))
+								}
+								checked={filters.hasPrerequisites === false}
+								className="h-4 w-4 text-blue-600"
+							/>
+							<span className="text-sm text-gray-700">
+								Предметот нема предуслови
+							</span>
 						</label>
-					</div>
-				</div>
-				<div className="space-y-1 mb-4">
-					<h3 className="font-medium mb-2">Тагови:</h3>
-					<div className="grid grid-cols-1 gap-2">
+						<label className="flex items-center space-x-2">
+							<input
+								type="checkbox"
+								name="prereqYes"
+								id="prereqsYes"
+								onChange={() =>
+									setFilters((prev) => ({
+										...prev,
+										hasPrerequisites:
+											prev.hasPrerequisites === true ? "" : true,
+									}))
+								}
+								checked={filters.hasPrerequisites === true}
+								className="h-4 w-4 text-blue-600"
+							/>
+							<span className="text-sm text-gray-700">
+								Предметот има предуслови
+							</span>
+						</label>
+					</div>
+				</FilterHeader>
+				{/* TAGS */}
+				<FilterHeader
+					label="Тагови:"
+					filterKey="tags"
+					openFilters={openFilters}
+					toggleFilter={toggleFilter}
+				>
+					<div className="grid grid-cols-1 gap-2 mb-2">
 						{tags.slice(0, showTags ? undefined : 4).map((tag) => {
 							return (
@@ -269,5 +368,5 @@
 									<input
 										type="checkbox"
-										name="level"
+										name="tags"
 										id={tag}
 										onChange={() =>
@@ -297,5 +396,37 @@
 						)}
 					</div>
-				</div>
+				</FilterHeader>
+				{/* EVALUATION */}
+				<FilterHeader
+					label="Евалуација"
+					filterKey="evaluation"
+					openFilters={openFilters}
+					toggleFilter={toggleFilter}
+				>
+					<div className="grid grid-cols-2 gap-2 mb-2 mt-1">
+						{EVALUATIONS.map((evalType) => (
+							<div key={evalType} className="flex items-center space-x-2">
+								<input
+									type="checkbox"
+									name="evaluation"
+									id={evalType}
+									onChange={() =>
+										setFilters((prev) => ({
+											...prev,
+											evaluation: prev.evaluation.includes(evalType)
+												? prev.evaluation.filter((item) => item !== evalType)
+												: [...prev.evaluation, evalType],
+										}))
+									}
+									checked={filters.evaluation.includes(evalType)}
+									className="h-4 w-4 rounded border-gray-300 text-blue-600"
+								/>
+								<label htmlFor={evalType} className="text-sm text-gray-700">
+									{evalType}
+								</label>
+							</div>
+						))}
+					</div>
+				</FilterHeader>
 			</div>
 		</div>
Index: frontend/src/components/SubjectCatalog/SubjectCatalog.tsx
===================================================================
--- frontend/src/components/SubjectCatalog/SubjectCatalog.tsx	(revision aa08549fdae665fa04e8ebf1293f4856bc6ca83c)
+++ frontend/src/components/SubjectCatalog/SubjectCatalog.tsx	(revision 35d0383d3aa6f2701b00bb6feeb10273f1a1d2fe)
@@ -34,5 +34,6 @@
 		assistants: [],
 		tags: [],
-		hasPrerequisites: false,
+		hasPrerequisites: "",
+		evaluation: [],
 	});
 	const filteredSubjects: Subject[] = filterSubjects({
Index: frontend/src/components/SubjectCatalog/utils.ts
===================================================================
--- frontend/src/components/SubjectCatalog/utils.ts	(revision aa08549fdae665fa04e8ebf1293f4856bc6ca83c)
+++ frontend/src/components/SubjectCatalog/utils.ts	(revision 35d0383d3aa6f2701b00bb6feeb10273f1a1d2fe)
@@ -1,2 +1,3 @@
+import { EVALUATION_MAP_TO_MK } from "../../constants/subjects";
 import { LatinToCyrillic } from "../StudentForm/utils";
 import { Filters, StudyTrack, Subject } from "../types";
@@ -15,6 +16,7 @@
 		professors: string[];
 		assistants: string[];
-		hasPrerequisites: boolean;
+		hasPrerequisites: boolean | "";
 		tags: string[];
+		evaluation: string[];
 	};
 	subjects: Subject[];
@@ -29,10 +31,14 @@
 }: filteredSubjectsParams) =>
 	subjects?.filter((subject) => {
-		if (searchTerm !== "") searchTerm = LatinToCyrillic(searchTerm);
+		let cyrilicSearchTerm = "";
+		if (searchTerm !== "") {
+			cyrilicSearchTerm = LatinToCyrillic(searchTerm).toLowerCase();
+			searchTerm = searchTerm.toLowerCase();
+		}
 		const searchMatches =
 			searchTerm === "" ||
-			subject.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
-			subject.code.toLowerCase().includes(searchTerm.toLowerCase()) ||
-			subject.abstract?.toLowerCase().includes(searchTerm.toLowerCase());
+			subject.name.toLowerCase().includes(cyrilicSearchTerm) ||
+			subject.code.toLowerCase().includes(searchTerm) ||
+			subject.abstract?.toLowerCase().includes(cyrilicSearchTerm);
 
 		const seasonMatches =
@@ -81,9 +87,24 @@
 
 		const prerequisitesMatch =
-			!filters.hasPrerequisites || subject.subject_info.prerequisite == null;
+			filters.hasPrerequisites === "" ||
+			(!filters.hasPrerequisites &&
+				subject.subject_info.prerequisite &&
+				Object.keys(subject.subject_info.prerequisite).length == 0) ||
+			(filters.hasPrerequisites &&
+				subject.subject_info.prerequisite &&
+				Object.keys(subject.subject_info.prerequisite).length > 0);
 
 		const tagsMatch =
 			filters.tags.length == 0 ||
 			subject.subject_info.tags.some((item) => filters.tags.includes(item));
+
+		const evaluationMatch =
+			filters.evaluation.length == 0 ||
+			subject.subject_info.evaluation.some((item) =>
+				filters.evaluation.includes(
+					EVALUATION_MAP_TO_MK[item as keyof typeof EVALUATION_MAP_TO_MK]
+				)
+			);
+
 		return (
 			searchMatches &&
@@ -97,5 +118,6 @@
 			assistantsMatches &&
 			prerequisitesMatch &&
-			tagsMatch
+			tagsMatch &&
+			evaluationMatch
 		);
 	});
@@ -119,6 +141,7 @@
 		professors: [],
 		assistants: [],
-		hasPrerequisites: false,
+		hasPrerequisites: "",
 		tags: [],
+		evaluation: [],
 	}));
 };
Index: frontend/src/components/types.ts
===================================================================
--- frontend/src/components/types.ts	(revision aa08549fdae665fa04e8ebf1293f4856bc6ca83c)
+++ frontend/src/components/types.ts	(revision 35d0383d3aa6f2701b00bb6feeb10273f1a1d2fe)
@@ -62,6 +62,7 @@
 	professors: string[];
 	assistants: string[];
-	hasPrerequisites: boolean;
+	hasPrerequisites: boolean | "";
 	tags: string[];
+	evaluation: string[];
 };
 
