Index: src/app/api/prof/grade/add/route.ts
===================================================================
--- src/app/api/prof/grade/add/route.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
+++ src/app/api/prof/grade/add/route.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -0,0 +1,13 @@
+import { NextResponse } from "next/server";
+import { setGrade, type AddGrade } from "@/lib/prof-demo-store";
+
+export async function POST(req: Request) {
+  try {
+    const payload = (await req.json()) as AddGrade;
+    const result = setGrade(payload, "add");
+    return NextResponse.json({ ok: true, ...result });
+  } catch (err) {
+    const message = err instanceof Error ? err.message : "Unknown error";
+    return NextResponse.json({ ok: false, message }, { status: 400 });
+  }
+}
Index: src/app/api/prof/grade/edit/route.ts
===================================================================
--- src/app/api/prof/grade/edit/route.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
+++ src/app/api/prof/grade/edit/route.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -0,0 +1,13 @@
+import { NextResponse } from "next/server";
+import { setGrade, type AddGrade } from "@/lib/prof-demo-store";
+
+export async function POST(req: Request) {
+  try {
+    const payload = (await req.json()) as AddGrade;
+    const result = setGrade(payload, "edit");
+    return NextResponse.json({ ok: true, ...result });
+  } catch (err) {
+    const message = err instanceof Error ? err.message : "Unknown error";
+    return NextResponse.json({ ok: false, message }, { status: 400 });
+  }
+}
Index: src/app/api/prof/grade/remove/route.ts
===================================================================
--- src/app/api/prof/grade/remove/route.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
+++ src/app/api/prof/grade/remove/route.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -0,0 +1,13 @@
+import { NextResponse } from "next/server";
+import { setGrade, type AddGrade } from "@/lib/prof-demo-store";
+
+export async function POST(req: Request) {
+  try {
+    const payload = (await req.json()) as AddGrade;
+    const result = setGrade(payload, "remove");
+    return NextResponse.json({ ok: true, ...result });
+  } catch (err) {
+    const message = err instanceof Error ? err.message : "Unknown error";
+    return NextResponse.json({ ok: false, message }, { status: 400 });
+  }
+}
Index: src/app/api/prof/students/route.ts
===================================================================
--- src/app/api/prof/students/route.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
+++ src/app/api/prof/students/route.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -0,0 +1,6 @@
+import { NextResponse } from "next/server";
+import { getSubjects } from "@/lib/prof-demo-store";
+
+export async function GET() {
+  return NextResponse.json(getSubjects());
+}
Index: src/app/page.tsx
===================================================================
--- src/app/page.tsx	(revision 997d094e19512a2b34c6fb682f5cfde0dd4edae7)
+++ src/app/page.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -35,6 +35,6 @@
     setIsSubmitting(true);
     try {
-      await login({ email: formData.email, password: formData.password });
-      window.location.href = '/students/profile';
+      const session = await login({ email: formData.email, password: formData.password });
+      window.location.href = session.role === 'Professor' ? '/professor' : '/students';
     } catch (err) {
       setErrorMessage(err instanceof Error ? err.message : 'Login failed.');
Index: src/app/professor/layout.tsx
===================================================================
--- src/app/professor/layout.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
+++ src/app/professor/layout.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -0,0 +1,38 @@
+import type { Metadata } from "next";
+import { Geist, Geist_Mono } from "next/font/google";
+import "../globals.css";
+import "@fortawesome/fontawesome-svg-core/styles.css";
+import { config } from "@fortawesome/fontawesome-svg-core";
+import Header from "@/components/header";
+import ProfessorNavbar from "@/components/professor-navbar";
+
+config.autoAddCss = false;
+
+const geistSans = Geist({
+  variable: "--font-geist-sans",
+  subsets: ["latin"],
+});
+
+const geistMono = Geist_Mono({
+  variable: "--font-geist-mono",
+  subsets: ["latin"],
+});
+
+export const metadata: Metadata = {
+  title: "IKnow - Professor Portal",
+  description: "Professor portal for managing students and grades",
+};
+
+export default function ProfessorLayout({
+  children,
+}: Readonly<{
+  children: React.ReactNode;
+}>) {
+  return (
+    <div className={`${geistSans.variable} ${geistMono.variable} antialiased`}>
+      <Header />
+      <ProfessorNavbar />
+      {children}
+    </div>
+  );
+}
Index: src/app/professor/page.tsx
===================================================================
--- src/app/professor/page.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
+++ src/app/professor/page.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -0,0 +1,5 @@
+import { redirect } from "next/navigation";
+
+export default function ProfessorHome() {
+  redirect("/professor/students");
+}
Index: src/app/professor/profile/page.tsx
===================================================================
--- src/app/professor/profile/page.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
+++ src/app/professor/profile/page.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -0,0 +1,278 @@
+"use client";
+
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import {
+  faUser,
+  faIdCard,
+  faAddressCard,
+  faCalendarAlt,
+  faFlag,
+  faVenus,
+  faMars,
+  faEnvelope,
+  faPhone,
+  faMapMarkerAlt,
+  faPassport,
+} from "@fortawesome/free-solid-svg-icons";
+import { useEffect, useState } from "react";
+import { getAccessToken } from "@/lib/auth";
+import { IconDefinition } from "@fortawesome/fontawesome-svg-core";
+
+type PersonalInfo = {
+  firstName: string;
+  middleName: string;
+  lastName: string;
+  maidenName: string;
+  dateOfBirth: string;
+  gender: string;
+  nationality: string;
+  citizenship: string;
+  scholarship: string;
+  currentPlan: string;
+  registryNumber: string;
+  studyGroup: string;
+  notes?: string;
+  index: string;
+  embg: string;
+};
+
+type BirthInfo = {
+  placeOfBirth: string;
+  municipalityOfBirth: string;
+  country: string;
+};
+
+// Present in the API response, but intentionally not shown on professor profile.
+type PreviousEducation = {
+  type: string;
+  profession: string;
+  average: string | number;
+  language: string;
+  country: string;
+  previousUniversity: string;
+  previousFaculty: string;
+  previousStudyMode: string;
+};
+
+// Present in the API response, but intentionally not shown on professor profile.
+type EnrollmentInfo = {
+  enrollmentYear: string | number;
+  status: string;
+  cycle: string;
+  program: string;
+  quota: string;
+  secondaryEducationNumber: string;
+  previousEducationCredits: string | number;
+};
+
+type Contact = {
+  placeOfResidence: string;
+  municipalityOfResidence: string;
+  country: string;
+  address: string;
+  temporaryAddress: string;
+  phone: string;
+  mobilePhone: string;
+  passportNumber: string;
+  passportExpiryDate: string;
+  email: string;
+  microsoftEmail: string;
+};
+
+type StudentProfile = {
+  personalInfo: PersonalInfo;
+  birthInfo: BirthInfo;
+  previousEducation: PreviousEducation;
+  enrollmentInfo: EnrollmentInfo;
+  contact: Contact;
+};
+
+interface InfoRowProps {
+  label: string;
+  value: string | number;
+  icon?: IconDefinition;
+}
+
+const InfoRow = ({ label, value, icon }: InfoRowProps) => (
+  <div className="flex justify-between items-center py-3 border-b border-gray-100 last:border-b-0">
+    <div className="flex items-center gap-2 text-gray-600 font-medium">
+      {icon && <FontAwesomeIcon icon={icon} className="w-4 h-4" />}
+      <span>{label}:</span>
+    </div>
+    <div className="text-gray-900 font-semibold text-right max-w-xs break-words">
+      {value || "N/A"}
+    </div>
+  </div>
+);
+
+interface SectionProps {
+  title: string;
+  icon: IconDefinition;
+  children: React.ReactNode;
+}
+
+const Section = ({ title, icon, children }: SectionProps) => (
+  <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden">
+    <div className="bg-primary text-white px-6 py-4">
+      <div className="flex items-center gap-3">
+        <FontAwesomeIcon icon={icon} className="text-xl" />
+        <h2 className="text-xl font-bold">{title}</h2>
+      </div>
+    </div>
+    <div className="p-6">{children}</div>
+  </div>
+);
+
+export default function ProfessorProfilePage() {
+  const [profileData, setProfileData] = useState<StudentProfile | null>(null);
+  const [isLoading, setIsLoading] = useState(true);
+  const [errorMessage, setErrorMessage] = useState<string | null>(null);
+
+  useEffect(() => {
+    let cancelled = false;
+
+    async function load() {
+      setIsLoading(true);
+      setErrorMessage(null);
+
+      const token = getAccessToken();
+      if (!token) {
+        setErrorMessage("Not authenticated. Please login again.");
+        setIsLoading(false);
+        return;
+      }
+
+      try {
+        const response = await fetch("https://iknow-api.onrender.com/api/user/getUser", {
+          method: "GET",
+          headers: {
+            Authorization: `Bearer ${token}`,
+          },
+        });
+
+        if (!response.ok) {
+          const text = await response.text().catch(() => "");
+          throw new Error(text || `Failed to load profile (${response.status})`);
+        }
+
+        const data = (await response.json()) as StudentProfile;
+        if (!cancelled) setProfileData(data);
+      } catch (err) {
+        if (!cancelled) {
+          setErrorMessage(err instanceof Error ? err.message : "Failed to load profile.");
+        }
+      } finally {
+        if (!cancelled) setIsLoading(false);
+      }
+    }
+
+    void load();
+
+    return () => {
+      cancelled = true;
+    };
+  }, []);
+
+  if (isLoading) {
+    return (
+      <div className="min-h-screen pb-8">
+        <div className="bg-white rounded-xl shadow-sm border border-gray-100 p-6">Loading...</div>
+      </div>
+    );
+  }
+
+  if (errorMessage || !profileData) {
+    return (
+      <div className="min-h-screen pb-8">
+        <div className="rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700">
+          {errorMessage ?? "Failed to load profile."}
+        </div>
+      </div>
+    );
+  }
+
+  const { personalInfo, birthInfo, contact } = profileData;
+
+  return (
+    <div className="min-h-screen pb-8">
+      {/* Header */}
+      <div className="bg-primary text-white rounded-xl p-8 mb-8">
+        <div className="flex items-center gap-6">
+          <div className="relative">
+            <div className="w-20 h-20 bg-white bg-opacity-20 rounded-full flex items-center justify-center border-2 border-white border-opacity-30">
+              <FontAwesomeIcon icon={faUser} className="text-3xl text-primary" />
+            </div>
+            <div className="absolute -bottom-1 -right-1 w-6 h-6 bg-green-500 rounded-full border-2 border-white"></div>
+          </div>
+          <div>
+            <h1 className="text-3xl font-bold mb-2">
+              {personalInfo.firstName} {personalInfo.middleName} {personalInfo.lastName}
+            </h1>
+            <div className="text-lg opacity-90">
+              Индекс: {personalInfo.index} | ЕМБГ: {personalInfo.embg}
+            </div>
+          </div>
+        </div>
+      </div>
+
+      {/* Profile Sections */}
+      <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
+        {/* Personal Information */}
+        <Section title="Лични податоци" icon={faIdCard}>
+          <InfoRow label="Име" value={personalInfo.firstName} />
+          <InfoRow label="Средно име" value={personalInfo.middleName} />
+          <InfoRow label="Презиме" value={personalInfo.lastName} />
+          <InfoRow label="Моминско презиме" value={personalInfo.maidenName} />
+          <InfoRow label="Датум на раѓање" value={personalInfo.dateOfBirth} icon={faCalendarAlt} />
+          <InfoRow
+            label="Пол"
+            value={personalInfo.gender}
+            icon={personalInfo.gender === "машки" ? faMars : faVenus}
+          />
+          <InfoRow label="Националност" value={personalInfo.nationality} icon={faFlag} />
+          <InfoRow label="Државјанство" value={personalInfo.citizenship} />
+          <InfoRow label="Стипендија" value={personalInfo.scholarship} />
+          <InfoRow label="Тековен план" value={personalInfo.currentPlan} />
+          <InfoRow label="Бр. во матична книга" value={personalInfo.registryNumber} />
+          <InfoRow label="Група на студирање" value={personalInfo.studyGroup} />
+          {personalInfo.notes && (
+            <div className="mt-4 p-4 bg-blue-50 rounded-lg">
+              <div className="text-sm font-medium text-blue-800 mb-1">Забелешка:</div>
+              <div className="text-sm text-blue-700">{personalInfo.notes}</div>
+            </div>
+          )}
+        </Section>
+
+        {/* Birth Information */}
+        <Section title="Податоци за раѓање" icon={faMapMarkerAlt}>
+          <InfoRow label="Место на раѓање" value={birthInfo.placeOfBirth} />
+          <InfoRow label="Општина на раѓање" value={birthInfo.municipalityOfBirth} />
+          <InfoRow label="Земја" value={birthInfo.country} />
+        </Section>
+
+        {/* Contact Information */}
+        <div className="lg:col-span-2">
+          <Section title="Контакт" icon={faAddressCard}>
+            <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
+              <div>
+                <InfoRow label="Место на живеење" value={contact.placeOfResidence} icon={faMapMarkerAlt} />
+                <InfoRow label="Општина на живеење" value={contact.municipalityOfResidence} />
+                <InfoRow label="Држава" value={contact.country} />
+                <InfoRow label="Адреса" value={contact.address} />
+                <InfoRow label="Адреса на престој" value={contact.temporaryAddress} />
+              </div>
+              <div>
+                <InfoRow label="Телефон" value={contact.phone} icon={faPhone} />
+                <InfoRow label="Моб. телефон" value={contact.mobilePhone} icon={faPhone} />
+                <InfoRow label="Број на пасош" value={contact.passportNumber} icon={faPassport} />
+                <InfoRow label="Датум на истекување на пасошот" value={contact.passportExpiryDate} />
+                <InfoRow label="Е-пошта" value={contact.email} icon={faEnvelope} />
+                <InfoRow label="Microsoft email" value={contact.microsoftEmail} icon={faEnvelope} />
+              </div>
+            </div>
+          </Section>
+        </div>
+      </div>
+    </div>
+  );
+}
Index: src/app/professor/students/page.tsx
===================================================================
--- src/app/professor/students/page.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
+++ src/app/professor/students/page.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -0,0 +1,290 @@
+"use client";
+
+import { useEffect, useMemo, useState } from "react";
+
+type UsersBySubject = {
+  Id?: string;
+  Name?: string;
+  Grade: number;
+};
+
+type SubjectsAndUsers = {
+  Name?: string;
+  Id?: number;
+  Users: UsersBySubject[];
+};
+
+type GradePayload = {
+  StudentId: number;
+  SubjectId: number;
+  grade: number;
+};
+
+type FlatRow = {
+  studentIdStr: string;
+  studentIdNum: number | null;
+  studentName: string;
+  subjectId: number;
+  subjectName: string;
+  grade: number;
+};
+
+function toInt(value: string): number | null {
+  const n = Number.parseInt(value, 10);
+  return Number.isFinite(n) ? n : null;
+}
+
+export default function ProfessorStudentsPage() {
+  const [subjects, setSubjects] = useState<SubjectsAndUsers[]>([]);
+  const [loading, setLoading] = useState(true);
+  const [error, setError] = useState<string | null>(null);
+
+  const [subjectFilter, setSubjectFilter] = useState<string>("all");
+  const [studentIdQuery, setStudentIdQuery] = useState<string>("");
+
+  const [gradeSelection, setGradeSelection] = useState<Record<string, number>>({});
+  const [actionBusyKey, setActionBusyKey] = useState<string | null>(null);
+
+  async function refresh() {
+    setLoading(true);
+    setError(null);
+    try {
+      const res = await fetch("/api/prof/students", { cache: "no-store" });
+      if (!res.ok) {
+        throw new Error(`Failed to fetch students (${res.status})`);
+      }
+      const data = (await res.json()) as SubjectsAndUsers[];
+      setSubjects(data);
+
+      const nextSelections: Record<string, number> = {};
+      for (const subj of data) {
+        if (!subj.Id) continue;
+        for (const u of subj.Users) {
+          const key = `${subj.Id}:${u.Id ?? ""}`;
+          const current = u.Grade;
+          nextSelections[key] = current >= 5 && current <= 10 ? current : 5;
+        }
+      }
+      setGradeSelection(nextSelections);
+    } catch (e) {
+      setError(e instanceof Error ? e.message : "Unknown error");
+    } finally {
+      setLoading(false);
+    }
+  }
+
+  useEffect(() => {
+    void refresh();
+  }, []);
+
+  const flatRows = useMemo<FlatRow[]>(() => {
+    const rows: FlatRow[] = [];
+    for (const subj of subjects) {
+      if (!subj.Id) continue;
+      for (const u of subj.Users) {
+        rows.push({
+          studentIdStr: u.Id ?? "",
+          studentIdNum: toInt(u.Id ?? ""),
+          studentName: u.Name ?? "",
+          subjectId: subj.Id,
+          subjectName: subj.Name ?? "",
+          grade: u.Grade,
+        });
+      }
+    }
+    return rows;
+  }, [subjects]);
+
+  const filteredRows = useMemo(() => {
+    const q = studentIdQuery.trim();
+    return flatRows.filter((r) => {
+      if (subjectFilter !== "all" && String(r.subjectId) !== subjectFilter) return false;
+      if (q.length > 0 && !r.studentIdStr.includes(q)) return false;
+      return true;
+    });
+  }, [flatRows, subjectFilter, studentIdQuery]);
+
+  async function postGrade(url: string, payload: GradePayload, busyKey: string) {
+    setActionBusyKey(busyKey);
+    setError(null);
+    try {
+      const res = await fetch(url, {
+        method: "POST",
+        headers: { "Content-Type": "application/json" },
+        body: JSON.stringify(payload),
+      });
+      const body = (await res.json()) as { ok: boolean; message?: string };
+      if (!res.ok || !body.ok) {
+        throw new Error(body.message || `Request failed (${res.status})`);
+      }
+      await refresh();
+    } catch (e) {
+      setError(e instanceof Error ? e.message : "Unknown error");
+    } finally {
+      setActionBusyKey(null);
+    }
+  }
+
+  return (
+    <div className="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
+      <div className="flex flex-col gap-4 md:flex-row md:items-end md:justify-between">
+        <div>
+          <h1 className="text-2xl font-semibold text-gray-900">Professor • Students</h1>
+          <p className="text-gray-700 mt-1">
+            Data comes from <span className="font-mono">/api/prof/students</span> (demo store).
+          </p>
+        </div>
+
+        <div className="flex flex-col sm:flex-row gap-3">
+          <div className="flex flex-col">
+            <label className="text-sm text-gray-700">Filter by subject</label>
+            <select
+              className="border border-gray-300 rounded-lg px-3 py-2"
+              value={subjectFilter}
+              onChange={(e) => setSubjectFilter(e.target.value)}
+            >
+              <option value="all">All subjects</option>
+              {subjects
+                .filter((s) => typeof s.Id === "number")
+                .map((s) => (
+                  <option key={String(s.Id)} value={String(s.Id)}>
+                    {s.Name ?? `Subject ${s.Id}`}
+                  </option>
+                ))}
+            </select>
+          </div>
+
+          <div className="flex flex-col">
+            <label className="text-sm text-gray-700">Find student by index / ID</label>
+            <input
+              className="border border-gray-300 rounded-lg px-3 py-2"
+              placeholder="e.g. 20001"
+              value={studentIdQuery}
+              onChange={(e) => setStudentIdQuery(e.target.value)}
+            />
+          </div>
+        </div>
+      </div>
+
+      {error && (
+        <div className="mt-4 rounded-lg border border-red-200 bg-red-50 text-red-800 px-4 py-3">
+          {error}
+        </div>
+      )}
+
+      <div className="mt-6 overflow-x-auto">
+        <table className="min-w-full border border-gray-200 rounded-lg overflow-hidden">
+          <thead className="bg-gray-50">
+            <tr>
+              <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b">Student</th>
+              <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b">ID</th>
+              <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b">Subject</th>
+              <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b">Grade</th>
+              <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b">Actions</th>
+            </tr>
+          </thead>
+          <tbody>
+            {loading ? (
+              <tr>
+                <td className="px-4 py-4 text-gray-700" colSpan={5}>
+                  Loading...
+                </td>
+              </tr>
+            ) : filteredRows.length === 0 ? (
+              <tr>
+                <td className="px-4 py-4 text-gray-700" colSpan={5}>
+                  No students found.
+                </td>
+              </tr>
+            ) : (
+              filteredRows.map((r) => {
+                const key = `${r.subjectId}:${r.studentIdStr}`;
+                const selected = gradeSelection[key] ?? 5;
+                const busy = actionBusyKey === key;
+
+                return (
+                  <tr key={key} className="hover:bg-gray-50">
+                    <td className="px-4 py-3 border-b text-gray-900">{r.studentName}</td>
+                    <td className="px-4 py-3 border-b text-gray-900">{r.studentIdStr}</td>
+                    <td className="px-4 py-3 border-b text-gray-900">{r.subjectName}</td>
+                    <td className="px-4 py-3 border-b">
+                      <div className="flex items-center gap-3">
+                        <select
+                          className="border border-gray-300 rounded-lg px-3 py-2"
+                          value={selected}
+                          onChange={(e) =>
+                            setGradeSelection((prev) => ({
+                              ...prev,
+                              [key]: Number.parseInt(e.target.value, 10),
+                            }))
+                          }
+                        >
+                          {[5, 6, 7, 8, 9, 10].map((g) => (
+                            <option key={g} value={g}>
+                              {g}
+                            </option>
+                          ))}
+                        </select>
+                        <span className="text-sm text-gray-600">
+                          Current: {r.grade > 0 ? r.grade : "—"}
+                        </span>
+                      </div>
+                    </td>
+                    <td className="px-4 py-3 border-b">
+                      <div className="flex flex-wrap gap-2">
+                        <button
+                          disabled={busy || r.studentIdNum === null}
+                          className="px-3 py-2 rounded-lg bg-green-600 text-white text-sm font-medium disabled:opacity-50"
+                          onClick={() => {
+                            if (r.studentIdNum === null) return;
+                            void postGrade(
+                              "/api/prof/grade/add",
+                              { StudentId: r.studentIdNum, SubjectId: r.subjectId, grade: selected },
+                              key,
+                            );
+                          }}
+                        >
+                          Add grade
+                        </button>
+
+                        <button
+                          disabled={busy || r.studentIdNum === null}
+                          className="px-3 py-2 rounded-lg bg-blue-600 text-white text-sm font-medium disabled:opacity-50"
+                          onClick={() => {
+                            if (r.studentIdNum === null) return;
+                            void postGrade(
+                              "/api/prof/grade/edit",
+                              { StudentId: r.studentIdNum, SubjectId: r.subjectId, grade: selected },
+                              key,
+                            );
+                          }}
+                        >
+                          Edit grade
+                        </button>
+
+                        <button
+                          disabled={busy || r.studentIdNum === null}
+                          className="px-3 py-2 rounded-lg bg-gray-800 text-white text-sm font-medium disabled:opacity-50"
+                          onClick={() => {
+                            if (r.studentIdNum === null) return;
+                            void postGrade(
+                              "/api/prof/grade/remove",
+                              { StudentId: r.studentIdNum, SubjectId: r.subjectId, grade: 0 },
+                              key,
+                            );
+                          }}
+                        >
+                          Remove grade
+                        </button>
+                      </div>
+                    </td>
+                  </tr>
+                );
+              })
+            )}
+          </tbody>
+        </table>
+      </div>
+    </div>
+  );
+}
Index: src/app/students/page.tsx
===================================================================
--- src/app/students/page.tsx	(revision 997d094e19512a2b34c6fb682f5cfde0dd4edae7)
+++ src/app/students/page.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -1,7 +1,5 @@
-export default function Home() {
-  return (
-    <>
-      
-    </>
-  );
+import { redirect } from "next/navigation";
+
+export default function StudentsHome() {
+  redirect("/students/profile");
 }
Index: src/components/professor-navbar.tsx
===================================================================
--- src/components/professor-navbar.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
+++ src/components/professor-navbar.tsx	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -0,0 +1,78 @@
+"use client";
+
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { faUser, faUsers, faBars, faTimes, faChalkboardUser } from "@fortawesome/free-solid-svg-icons";
+import Link from "next/link";
+import { useState } from "react";
+
+const ProfessorNavbar = () => {
+  const [isMenuOpen, setIsMenuOpen] = useState(false);
+
+  const toggleMenu = () => {
+    setIsMenuOpen((v) => !v);
+  };
+
+  const menuItems = [
+    { icon: faUser, label: "Профил", href: "/professor/profile" },
+    { icon: faUsers, label: "Студенти", href: "/professor/students" },
+  ];
+
+  return (
+    <>
+      {/* Desktop Navbar */}
+      <nav className="hidden md:flex flex-row gap-2 justify-evenly bg-primary text-white p-7 rounded-xl my-5 text-xl">
+        {menuItems.map((item) => (
+          <Link key={item.href} href={item.href}>
+            <div className="group flex flex-row items-center gap-2 px-3 py-2 rounded-lg cursor-pointer transition-all duration-300 hover:bg-white hover:bg-opacity-20 hover:scale-105 hover:shadow-lg hover:text-primary">
+              <FontAwesomeIcon icon={item.icon} className="transition-transform duration-300 group-hover:rotate-12" />
+              <span>{item.label}</span>
+            </div>
+          </Link>
+        ))}
+      </nav>
+
+      {/* Mobile Navbar */}
+      <nav className="md:hidden bg-primary text-white rounded-xl my-5">
+        <div className="flex justify-between items-center p-4">
+          <div className="flex items-center gap-2 text-xl font-bold">
+            <FontAwesomeIcon icon={faChalkboardUser} className="text-xl" />
+            Professor
+          </div>
+
+          <button
+            onClick={toggleMenu}
+            className="p-2 rounded-lg hover:bg-white hover:bg-opacity-20 transition-colors duration-300"
+            aria-label="Toggle menu"
+          >
+            <FontAwesomeIcon
+              icon={isMenuOpen ? faTimes : faBars}
+              className="text-xl transition-transform duration-300"
+            />
+          </button>
+        </div>
+
+        <div
+          className={`overflow-hidden transition-all duration-300 ease-in-out ${
+            isMenuOpen ? "max-h-64 opacity-100" : "max-h-0 opacity-0"
+          }`}
+        >
+          <div className="px-4 pb-4 space-y-2">
+            {menuItems.map((item) => (
+              <Link key={item.href} href={item.href}>
+                <div className="group flex flex-row items-center gap-3 px-3 py-3 rounded-lg cursor-pointer transition-all duration-300 hover:bg-white hover:bg-opacity-20 hover:text-primary">
+                  <FontAwesomeIcon
+                    icon={item.icon}
+                    className="transition-transform duration-300 group-hover:rotate-12"
+                  />
+                  <span className="text-lg">{item.label}</span>
+                </div>
+              </Link>
+            ))}
+          </div>
+        </div>
+      </nav>
+    </>
+  );
+};
+
+export default ProfessorNavbar;
Index: src/lib/auth.ts
===================================================================
--- src/lib/auth.ts	(revision 997d094e19512a2b34c6fb682f5cfde0dd4edae7)
+++ src/lib/auth.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -2,4 +2,10 @@
   accessToken: string;
   refreshToken: string;
+};
+
+export type UserRole = 'Professor' | 'Student' | string;
+
+export type AuthSession = AuthTokens & {
+  role: UserRole;
 };
 
@@ -12,4 +18,5 @@
   access: 'iknow.auth.access',
   refresh: 'iknow.auth.refresh',
+  role: 'iknow.auth.role',
 } as const;
 
@@ -59,4 +66,9 @@
 }
 
+export function setUserRole(role: UserRole) {
+  // Keep role TTL aligned with access token TTL.
+  writeStoredToken(STORAGE_KEYS.role, role, ACCESS_TOKEN_TTL_MS);
+}
+
 export function getAccessToken(): string | null {
   return readStoredToken(STORAGE_KEYS.access)?.value ?? null;
@@ -67,11 +79,16 @@
 }
 
+export function getUserRole(): UserRole | null {
+  return readStoredToken(STORAGE_KEYS.role)?.value ?? null;
+}
+
 export function clearAuthTokens() {
   if (!isBrowser()) return;
   window.localStorage.removeItem(STORAGE_KEYS.access);
   window.localStorage.removeItem(STORAGE_KEYS.refresh);
+  window.localStorage.removeItem(STORAGE_KEYS.role);
 }
 
-export async function login(params: { email: string; password: string }) {
+export async function login(params: { email: string; password: string }): Promise<AuthSession> {
   const baseUrl = process.env.NEXT_PUBLIC_API_BASE_URL ?? 'https://iknow-api.onrender.com';
 
@@ -100,9 +117,12 @@
 
   const data = (await response.json()) as {
-    token?: { accessToken?: string; refreshToken?: string };
+    token?: string;
+    refreshToken?: string;
+    role?: string;
   };
 
-  const accessToken = data?.token?.accessToken;
-  const refreshToken = data?.token?.refreshToken;
+  const accessToken = data?.token;
+  const refreshToken = data?.refreshToken;
+  const role = data?.role;
 
   if (!accessToken || !refreshToken) {
@@ -110,6 +130,12 @@
   }
 
-  const tokens: AuthTokens = { accessToken, refreshToken };
-  setAuthTokens(tokens);
-  return tokens;
+  const session: AuthSession = {
+    accessToken,
+    refreshToken,
+    role: role ?? 'Student',
+  };
+
+  setAuthTokens(session);
+  setUserRole(session.role);
+  return session;
 }
Index: src/lib/prof-demo-store.ts
===================================================================
--- src/lib/prof-demo-store.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
+++ src/lib/prof-demo-store.ts	(revision 298f9b3987050da08cb65ce62c3d1f8295faeff4)
@@ -0,0 +1,107 @@
+export type UsersBySubject = {
+  Id?: string;
+  Name?: string;
+  Grade: number;
+};
+
+export type SubjectsAndUsers = {
+  Name?: string;
+  Id?: number;
+  Users: UsersBySubject[];
+};
+
+export type AddGrade = {
+  StudentId: number;
+  SubjectId: number;
+  grade: number;
+};
+
+type Store = {
+  subjects: SubjectsAndUsers[];
+};
+
+function createInitialStore(): Store {
+  return {
+    subjects: [
+      {
+        Id: 101,
+        Name: "Web Programming",
+        Users: [
+          { Id: "20001", Name: "Ana Petrovska", Grade: 0 },
+          { Id: "20002", Name: "Marko Trajkov", Grade: 8 },
+          { Id: "20003", Name: "Elena Stojanova", Grade: 0 },
+        ],
+      },
+      {
+        Id: 102,
+        Name: "Databases",
+        Users: [
+          { Id: "20001", Name: "Ana Petrovska", Grade: 0 },
+          { Id: "20004", Name: "Nikola Iliev", Grade: 9 },
+          { Id: "20005", Name: "Sara Dimitrova", Grade: 7 },
+        ],
+      },
+      {
+        Id: 103,
+        Name: "Algorithms",
+        Users: [
+          { Id: "20002", Name: "Marko Trajkov", Grade: 0 },
+          { Id: "20006", Name: "Ivana Kostova", Grade: 10 },
+        ],
+      },
+    ],
+  };
+}
+
+function getGlobalStore(): Store {
+  const globalKey = "__iknow_prof_demo_store__";
+  const globalObj = globalThis as unknown as Record<string, unknown>;
+
+  if (!globalObj[globalKey]) {
+    globalObj[globalKey] = createInitialStore();
+  }
+
+  return globalObj[globalKey] as Store;
+}
+
+export function getSubjects(): SubjectsAndUsers[] {
+  return getGlobalStore().subjects;
+}
+
+function parseStudentId(id: string | undefined): number | null {
+  if (!id) return null;
+  const parsed = Number.parseInt(id, 10);
+  return Number.isFinite(parsed) ? parsed : null;
+}
+
+export function setGrade(
+  payload: AddGrade,
+  mode: "add" | "edit" | "remove",
+): { subject: SubjectsAndUsers; user: UsersBySubject } {
+  const store = getGlobalStore();
+  const subject = store.subjects.find((s) => s.Id === payload.SubjectId);
+  if (!subject) {
+    throw new Error("Subject not found");
+  }
+
+  const user = subject.Users.find((u) => parseStudentId(u.Id) === payload.StudentId);
+  if (!user) {
+    throw new Error("Student not found in subject");
+  }
+
+  if (mode === "remove") {
+    user.Grade = 0;
+    return { subject, user };
+  }
+
+  if (payload.grade < 5 || payload.grade > 10) {
+    throw new Error("Grade must be between 5 and 10");
+  }
+
+  if (mode === "add" && user.Grade > 0) {
+    throw new Error("Grade already exists; use edit");
+  }
+
+  user.Grade = payload.grade;
+  return { subject, user };
+}
