Index: backend/auth_form/utils.py
===================================================================
--- backend/auth_form/utils.py	(revision caaa60c68b532985100ec4e8fa6dcb688137e73e)
+++ backend/auth_form/utils.py	(revision caaa60c68b532985100ec4e8fa6dcb688137e73e)
@@ -0,0 +1,41 @@
+from subjects.models import Subject
+
+
+def check_prerequisites(has_extracurricular, passed_subjects):
+    """
+    Checks if all prerequisite requirements are fulfilled based on passed subjects and extracurricular credits.
+    """
+    
+    invalid_subjects = []
+
+    # Track valid subjects as we go
+    valid_subject_ids = set(id for id in passed_subjects)
+    for subject_id in passed_subjects:
+        prereqs = Subject.objects.get(id=subject_id).subject_info.prerequisite
+        if 'subjects' in prereqs:
+            if not any(prereq in valid_subject_ids for prereq in prereqs['subjects']):
+                invalid_subjects.append(subject_id)
+                valid_subject_ids.discard(subject_id)
+    
+    total_credits = len(valid_subject_ids) * 6
+    
+    pv = Subject.objects.get(name="Професионални вештини").id
+    sport = Subject.objects.get(name="Спорт и здравје").id
+
+    if pv in valid_subject_ids or sport in valid_subject_ids:
+        total_credits -= 6
+    if has_extracurricular:
+        total_credits += 6
+    
+    for subject_id in passed_subjects:
+        prereqs = Subject.objects.get(id=subject_id).subject_info.prerequisite
+        if 'credits' in prereqs:
+            if total_credits < prereqs['credits']:
+                invalid_subjects.append(subject_id)
+                valid_subject_ids.discard(subject_id)
+                total_credits -= 6
+    return (True, []) if len(invalid_subjects) == 0 else (False, invalid_subjects)
+
+b = Subject.objects.get(name="Вештачка интелигенција").id
+a = Subject.objects.get(name="Бизнис и менаџмент").id
+check_prerequisites(False, [a,b])
Index: backend/auth_form/views.py
===================================================================
--- backend/auth_form/views.py	(revision aba5377d31dbac4f86f796be4f3e4b7f569ed854)
+++ backend/auth_form/views.py	(revision caaa60c68b532985100ec4e8fa6dcb688137e73e)
@@ -1,2 +1,3 @@
+from .utils import check_prerequisites
 from .models import Student
 from .serializers import RegistrationSerializer, LoginSerializer, StudentFormSerializer
@@ -67,5 +68,19 @@
         if hasattr(request.user, 'student') and request.user.student.has_filled_form:
             return Response({"detail": "Student profile already exists."}, status=status.HTTP_400_BAD_REQUEST)
+        
+        has_extracurricular = request.data['has_extracurricular']
+        passed_subjects = request.data['passed_subjects']    
+        is_valid, invalid_subjects = check_prerequisites(has_extracurricular, passed_subjects)
+        
+        if not is_valid:
+            return Response({"prereqs": invalid_subjects}, status=status.HTTP_400_BAD_REQUEST)
+
+        index_match = Student.objects.filter(index=request.data['index'])
+        
+        if index_match.exists():
+           return Response({'message': "Постои студент со тој индекс."}, status=status.HTTP_400_BAD_REQUEST)
+        
         serializer = StudentFormSerializer(instance=request.user.student, data=request.data)
+
         if serializer.is_valid():
             serializer.save()
@@ -73,8 +88,4 @@
             request.user.student.save()
             return Response(serializer.data, status=status.HTTP_201_CREATED)
-        
-        index_match = Student.objects.filter(index=request.data['index'])
-        if index_match.exists():
-           return Response({'message': "Постои студент со тој индекс."}, status=status.HTTP_400_BAD_REQUEST)
 
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@@ -83,5 +94,13 @@
         if not hasattr(request.user, 'student'):
             return Response({"detail": "No student profile found."}, status=status.HTTP_404_NOT_FOUND)
-        serializer = StudentFormSerializer(instance=request.user.student, data=request.data)
+
+        has_extracurricular = request.data['has_extracurricular']
+        passed_subjects = request.data['passed_subjects']
+        is_valid, invalid_subjects = check_prerequisites(has_extracurricular, passed_subjects)
+        if not is_valid:
+            return Response({"prereqs": invalid_subjects}, status=status.HTTP_400_BAD_REQUEST)
+        
+        index_match = Student.objects.filter(index=request.data['index'])
+
 
         index = request.data['index']
@@ -89,4 +108,8 @@
         if index_match.exists():
             return Response({'message': "Постои студент со тој индекс."}, status=status.HTTP_400_BAD_REQUEST)
+        
+        
+        serializer = StudentFormSerializer(instance=request.user.student, data=request.data)
+
         if serializer.is_valid():
             serializer.save()
Index: frontend/src/components/StudentForm/StudentForm.tsx
===================================================================
--- frontend/src/components/StudentForm/StudentForm.tsx	(revision aba5377d31dbac4f86f796be4f3e4b7f569ed854)
+++ frontend/src/components/StudentForm/StudentForm.tsx	(revision caaa60c68b532985100ec4e8fa6dcb688137e73e)
@@ -8,5 +8,5 @@
 } from "../../constants/subjects";
 import { useAuth } from "../../hooks/useAuth";
-import { Programs, StudentData, Subject } from "../types";
+import { Programs, StudentData, Subject, SubjectID } from "../types";
 import FieldButton from "./FieldButton";
 import SkeletonForm from "./SkeletonForm";
@@ -89,4 +89,5 @@
 		});
 	const [hasExtracurricular, setHasExtracurricular] = useState(false);
+	const [invalidSubjects, setInvalidSubjects] = useState<Subject[]>([]);
 
 	// Update form when formData changes (e.g., after fetching user data)
@@ -249,5 +250,5 @@
 					isError: false,
 				});
-
+				setInvalidSubjects([]);
 				setTimeout(() => {
 					setFormStatus((prev) => ({ ...prev, message: "" }));
@@ -255,5 +256,17 @@
 			} else {
 				const errorData = await res.json();
-				throw new Error(errorData.message || "Error submitting form");
+				if (errorData.prereqs) {
+					const invalidSubjects_: Subject[] = errorData.prereqs.map(
+						(sub_id: SubjectID) =>
+							subjects.find((item: Subject) => item.id == sub_id)
+					);
+					console.log("invalid: ", invalidSubjects_);
+					setInvalidSubjects(invalidSubjects_);
+					setFormStatus({
+						isSubmitting: false,
+						message: `Грешка при зачувување: Проверете кој предмети не ги исполнуваат предусловите`,
+						isError: true,
+					});
+				} else throw new Error(errorData.message || "Error submitting form");
 			}
 			setIsSubmitted(true);
@@ -261,4 +274,5 @@
 		} catch (error) {
 			console.error("Form submission error:", error);
+
 			setFormStatus({
 				isSubmitting: false,
@@ -403,4 +417,5 @@
 				validationErrors={validationErrors}
 				passedSubjectsPerSemester={passedSubjectsPerSemester}
+				invalidSubjects={invalidSubjects}
 			/>
 			<div>
Index: frontend/src/components/StudentForm/SubjectsSelector.tsx
===================================================================
--- frontend/src/components/StudentForm/SubjectsSelector.tsx	(revision aba5377d31dbac4f86f796be4f3e4b7f569ed854)
+++ frontend/src/components/StudentForm/SubjectsSelector.tsx	(revision caaa60c68b532985100ec4e8fa6dcb688137e73e)
@@ -12,4 +12,5 @@
 	validationErrors: { [key: string]: string };
 	passedSubjectsPerSemester: Record<number, Subject[]>;
+	invalidSubjects: Subject[];
 }
 
@@ -29,4 +30,5 @@
 	</svg>
 );
+
 function SubjectsSelector({
 	studyTrack,
@@ -39,4 +41,5 @@
 	validationErrors,
 	passedSubjectsPerSemester,
+	invalidSubjects,
 }: SubjectsSelectorProps) {
 	return (
@@ -81,4 +84,11 @@
 								subject.subject_info.elective_for.includes(studyTrack)
 							);
+
+							const semesterInvalid = invalidSubjects.filter(
+								(subject: Subject) =>
+									(passedSubjectsPerSemester[semester] || []).some(
+										(s) => s.id === subject.id
+									)
+							);
 							return (
 								<div
@@ -101,4 +111,7 @@
 															passedSubjectsPerSemester[semester] || []
 														).some((s) => s.id === subject.id);
+														const isInvalid = semesterInvalid.some(
+															(s) => s.id === subject.id
+														);
 														return (
 															<button
@@ -107,6 +120,10 @@
 																onClick={() => toggleSubject(subject, semester)}
 																className={`flex items-center gap-2 px-3 py-2 border rounded-md transition-all duration-200 text-sm
-                                  ${
-																		isSelected
+                                  									// TODO
+																	//prettier-ignore
+																	${
+																		isInvalid
+																			? "bg-red-300 border-red-400 text-red-700"
+																			: isSelected
 																			? "bg-green-500 border-green-600 text-green-50"
 																			: "bg-white hover:bg-gray-50 border-gray-300"
@@ -114,5 +131,5 @@
 																aria-pressed={isSelected}
 															>
-																{isSelected && <TickSvg />}
+																{isSelected && !isInvalid && <TickSvg />}
 																<span>{subject.name}</span>
 															</button>
@@ -152,18 +169,28 @@
 													<div className="mb-3">
 														<div className="flex flex-wrap gap-2">
-															{selectedElectivesForSemester.map((subject) => (
-																<button
-																	type="button"
-																	key={subject.id}
-																	onClick={() =>
-																		toggleSubject(subject, semester)
-																	}
-																	className="flex items-center gap-2 px-3 py-2 border rounded-md transition-all duration-200 text-sm bg-green-500 text-white border-green-600 shadow-md"
-																	aria-pressed={true}
-																>
-																	<TickSvg />
-																	<span>{subject.name}</span>
-																</button>
-															))}
+															{selectedElectivesForSemester.map((subject) => {
+																const isInvalid = semesterInvalid.some(
+																	(s) => s.id === subject.id
+																);
+																return (
+																	<button
+																		type="button"
+																		key={subject.id}
+																		onClick={() =>
+																			toggleSubject(subject, semester)
+																		}
+																		className={`flex items-center gap-2 px-3 py-2 border rounded-md transition-all duration-200 text-sm  shadow-md
+       																 	${
+																					isInvalid
+																						? "bg-red-300 border-red-400 text-red-700"
+																						: "bg-green-500 text-white border-green-600"
+																				}`}
+																		aria-pressed={true}
+																	>
+																		{!isInvalid && <TickSvg />}
+																		<span>{subject.name}</span>
+																	</button>
+																);
+															})}
 														</div>
 													</div>
@@ -204,29 +231,37 @@
 																)
 																.slice(0, 8)
-																.map((subject) => (
-																	<button
-																		type="button"
-																		key={subject.id}
-																		onClick={() => {
-																			if (
-																				selectedElectivesForSemester.length <
+																.map((subject) => {
+																	const isInvalid = semesterInvalid.some(
+																		(s) => s.id === subject.id
+																	);
+																	return (
+																		<button
+																			type="button"
+																			key={subject.id}
+																			onClick={() => {
+																				if (
+																					selectedElectivesForSemester.length <
+																					electiveSlots
+																				) {
+																					setSemesterSearchTerms(
+																						(prev: any) => ({
+																							...prev,
+																							[semester]: "",
+																						})
+																					);
+																					toggleSubject(subject, semester);
+																				}
+																			}}
+																			disabled={
+																				selectedElectivesForSemester.length >=
 																				electiveSlots
-																			) {
-																				setSemesterSearchTerms((prev: any) => ({
-																					...prev,
-																					[semester]: "",
-																				}));
-																				toggleSubject(subject, semester);
 																			}
-																		}}
-																		disabled={
-																			selectedElectivesForSemester.length >=
-																			electiveSlots
-																		}
-																		className="flex items-center gap-2 px-3 py-2 border rounded-md transition-all duration-200 text-sm bg-white text-gray-800 border-gray-300 hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed"
-																	>
-																		<span>{subject.name}</span>
-																	</button>
-																))}
+																			className={`flex items-center gap-2 px-3 py-2 border rounded-md transition-all duration-200 text-sm bg-white text-gray-800 border-gray-300 hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed
+          																		${isInvalid ? "bg-red-300 border-red-400 text-red-700" : ""}`}
+																		>
+																			<span>{subject.name}</span>
+																		</button>
+																	);
+																})}
 														</div>
 														<p className="mt-3 text-xs text-gray-500 px-2 py-1">
