Index: backend/backend/settings.py
===================================================================
--- backend/backend/settings.py	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ backend/backend/settings.py	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -48,6 +48,7 @@
     'DEFAULT_AUTHENTICATION_CLASSES': [
         'rest_framework_simplejwt.authentication.JWTAuthentication'
-    ]
-    
+    ],
+    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
+    'PAGE_SIZE': 10
 }
 
Index: backend/subjects/models.py
===================================================================
--- backend/subjects/models.py	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ backend/subjects/models.py	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -88,5 +88,5 @@
 
 class EvaluationReview(models.Model):
-    review = models.OneToOneField(Review, on_delete=models.CASCADE)
+    review = models.OneToOneField(Review, on_delete=models.CASCADE, related_name='evaluation_review')
     signature_condition = models.CharField(max_length=64, blank=True)
 
@@ -130,5 +130,5 @@
         ("other", "Other"),
     ]
-    review = models.OneToOneField(Review, on_delete=models.CASCADE)
+    review = models.OneToOneField(Review, on_delete=models.CASCADE, related_name='other_review')
     content = models.TextField()
     category = models.CharField(max_length=16, choices=CATEGORY_TYPE_CHOICES)
Index: backend/subjects/permissions.py
===================================================================
--- backend/subjects/permissions.py	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
+++ backend/subjects/permissions.py	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -0,0 +1,14 @@
+from rest_framework.permissions import BasePermission
+
+class IsUserType(BasePermission):
+    allowed_user_types = []
+
+    def has_permission(self, request, view):
+        user = request.user
+        return user.is_authenticated and user.user_type in self.allowed_user_types
+
+class IsAdminUserType(IsUserType):
+    allowed_user_types = ['admin']
+
+class IsStudentUserType(IsUserType):
+    allowed_user_types = ['student']
Index: backend/subjects/serializers.py
===================================================================
--- backend/subjects/serializers.py	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ backend/subjects/serializers.py	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -34,9 +34,10 @@
 class ReviewMetaSerializer(serializers.ModelSerializer):
     student = serializers.SerializerMethodField()
+    subject = serializers.SerializerMethodField()
     user_has_voted = serializers.SerializerMethodField()
 
     class Meta:
         model = Review
-        fields = ['id', 'student', 'is_confirmed', 'votes_score', 'user_has_voted']
+        fields = ['id', 'student', 'subject', 'is_confirmed', 'votes_score', 'user_has_voted']
 
 
@@ -56,4 +57,7 @@
     def get_student(self, obj):
         return obj.student.index
+
+    def get_subject(self, obj):
+        return {"name": obj.subject.name, "code": obj.subject.code}
 
 class EvaluationComponentSerializer(serializers.ModelSerializer):
Index: backend/subjects/urls.py
===================================================================
--- backend/subjects/urls.py	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ backend/subjects/urls.py	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -1,5 +1,5 @@
 from django.urls import path
 from .views import (ToggleSubjectPreferences, PreferencesView, all_subjects,
-                    get_recommendations, SubjectReview, ReviewsForSubject, ToggleVote)
+                    get_recommendations, SubjectReview, ReviewsForSubject, ToggleVote, ReviewListView)
 urlpatterns = [
     path('all/', all_subjects, name='all_subjects'),
@@ -8,4 +8,5 @@
     path('toggle-subject-pref/', ToggleSubjectPreferences.as_view(), name='student-toggle-preferences'),
     path('subject-review/', SubjectReview.as_view(), name='subject-review'),
+    path('subjects-reviews-list/', ReviewListView.as_view(), name='review-list'),
     path('subject-review/toggle-vote/', ToggleVote.as_view(), name='toggle-vote'),
     path('subject-review/<str:code>/', ReviewsForSubject.as_view(), name='subject-review'),
Index: backend/subjects/views.py
===================================================================
--- backend/subjects/views.py	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ backend/subjects/views.py	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -11,5 +11,6 @@
 from .serializers import SubjectSerializer, EvaluationReviewSerializer, OtherReviewSerializer
 from .models import Subject, Review, EvaluationReview, OtherReview, ReviewVote
-
+from rest_framework.pagination import LimitOffsetPagination
+from .permissions import IsAdminUserType, IsStudentUserType
 def index(request):
     return HttpResponse("ok")
@@ -60,5 +61,5 @@
 
 class PreferencesView(APIView):
-    permission_classes = [IsAuthenticated]
+    permission_classes = [IsAuthenticated, IsStudentUserType]
 
     def get(self, request, *args, **kwargs):
@@ -77,5 +78,5 @@
     Expects a POST request with {'subject_id': <id>}.
     """
-    permission_classes = [IsAuthenticated]
+    permission_classes = [IsAuthenticated, IsStudentUserType]
     def post(self, request, *args, **kwargs):
         subject_id = request.data.get('subject_id')
@@ -128,5 +129,4 @@
 class SubjectReview(APIView):
     permission_classes = [IsAuthenticated]
-
     def post(self, request):
         student = request.user.student
@@ -237,2 +237,36 @@
             return Response({"message": "Vote recorded.", "vote_score": review.votes_score}, status=status.HTTP_201_CREATED)
 
+class ReviewListView(APIView):
+    # permission_classes = [IsAuthenticated, IsAdminUserType]
+
+    def get(self, request):
+        review_query_set = Review.objects.all()
+
+        review_type = request.query_params.get('type')
+        if review_type:
+            if review_type not in ["evaluation", "other"]:
+                return Response({"message": "Invalid type."}, status=status.HTTP_400_BAD_REQUEST)
+            review_query_set = review_query_set.filter(review_type=review_type)
+
+        is_confirmed = request.query_params.get('is_confirmed')
+        if is_confirmed:
+            if is_confirmed not in ["true", "false"]:
+                    return Response({"message": "Invalid is_confirmed param."}, status=status.HTTP_400_BAD_REQUEST)
+            is_confirmed = True if is_confirmed == "true" else False
+            review_query_set = review_query_set.filter(is_confirmed=is_confirmed)
+
+        review_query_set = review_query_set.select_related("evaluation_review", "other_review")
+
+        paginator = LimitOffsetPagination()
+        paginated_query_set = paginator.paginate_queryset(review_query_set, request)
+
+        data = []
+        for review in paginated_query_set:
+            if review.review_type == 'evaluation' and hasattr(review, "evaluation_review"):
+                    serializer = EvaluationReviewSerializer(review.evaluation_review)
+                    data.append(serializer.data)
+            elif review.review_type == 'other' and hasattr(review, "other_review"):
+                serializer = OtherReviewSerializer(review.other_review)
+                data.append(serializer.data)
+
+        return paginator.get_paginated_response(data)
Index: frontend/src/App.tsx
===================================================================
--- frontend/src/App.tsx	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ frontend/src/App.tsx	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -10,4 +10,5 @@
 import "./index.css";
 import Account from "./pages/Account";
+import AdminDashboard from "./pages/AdminDashboard";
 import Home from "./pages/Home";
 import Login from "./pages/Login";
@@ -82,6 +83,14 @@
 				path: "review-form/:code",
 				element: (
-					<PrivateRoute allowedUserTypes={["student"]}>
+					<PrivateRoute allowedUserTypes={["student", "admin"]}>
 						<ReviewForm />
+					</PrivateRoute>
+				),
+			},
+			{
+				path: "admin",
+				element: (
+					<PrivateRoute allowedUserTypes={["admin"]}>
+						<AdminDashboard />
 					</PrivateRoute>
 				),
Index: frontend/src/components/Navbar.tsx
===================================================================
--- frontend/src/components/Navbar.tsx	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ frontend/src/components/Navbar.tsx	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -118,7 +118,11 @@
 									{user?.user_type === "admin" ? (
 										<>
-											<div className="block px-4 py-2 text-sm text-gray-500">
-												Admin Panel (Placeholder)
-											</div>
+											<Link
+												to="/admin"
+												className="block px-4 py-2 text-sm hover:bg-gray-100 hover:underline"
+												onClick={() => setProfileMenuOpen(false)}
+											>
+												Админ панел
+											</Link>
 											<button
 												onClick={() => {
@@ -192,5 +196,11 @@
 							{user?.user_type === "admin" ? (
 								<>
-									<div className="text-gray-400">Admin Panel (Placeholder)</div>
+									<Link
+										to="/admin"
+										className="hover:underline"
+										onClick={() => setMenuOpen(false)}
+									>
+										Админ панел
+									</Link>
 									<button
 										onClick={() => {
Index: frontend/src/components/PrivateRoute.tsx
===================================================================
--- frontend/src/components/PrivateRoute.tsx	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ frontend/src/components/PrivateRoute.tsx	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -14,4 +14,8 @@
 }) => {
 	const { isAuthenticated, loading, user } = useAuth();
+	if (loading) {
+		// TODO: add loading screen or skeleton, or dont
+		return null;
+	}
 	if (!isAuthenticated && !loading) {
 		return <Navigate to="/login" replace />;
Index: frontend/src/components/StudentForm/StudentForm.tsx
===================================================================
--- frontend/src/components/StudentForm/StudentForm.tsx	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ frontend/src/components/StudentForm/StudentForm.tsx	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -1,5 +1,4 @@
 import { isAxiosError } from "axios";
 import { useCallback, useEffect, useState } from "react";
-import { useNavigate } from "react-router-dom";
 import axiosInstance from "../../api/axiosInstance";
 import { fetchFormData } from "../../api/formdata";
@@ -134,19 +133,13 @@
 	);
 	const [invalidSubjects, setInvalidSubjects] = useState<Subject[]>([]);
-	const { setFormData, user } = useAuth();
-	const navigate = useNavigate();
+	const { setFormData } = useAuth();
 
 	// Update form when formData changes (e.g., after fetching user data)
 	useEffect(() => {
-		if (user?.user_type == "admin") {
-			navigate("/");
-			return;
-		}
-
 		if (!subjects || subjects.length === 0) {
 			fetchSubjects(setSubjects);
 		}
 		const token = localStorage.getItem("access");
-		if (user?.user_type !== "student" && token && !formData) {
+		if (token && !formData) {
 			fetchFormData(token, setFormData);
 		}
Index: frontend/src/components/types.ts
===================================================================
--- frontend/src/components/types.ts	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ frontend/src/components/types.ts	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -103,4 +103,9 @@
 }
 
+export interface ReviewSubject {
+	name: string;
+	code: string;
+}
+
 export interface Review {
 	id?: number;
@@ -108,4 +113,5 @@
 	is_confirmed?: boolean;
 	votes_score?: number;
+	subject: ReviewSubject;
 	user_has_voted?: "none" | "up" | "down";
 }
Index: frontend/src/pages/AdminDashboard.tsx
===================================================================
--- frontend/src/pages/AdminDashboard.tsx	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
+++ frontend/src/pages/AdminDashboard.tsx	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -0,0 +1,372 @@
+import { CheckCircle, Eye, Trash2, XCircle } from "lucide-react";
+import { useEffect, useState } from "react";
+import axiosInstance from "../api/axiosInstance";
+import { MAP_REVIEW_CATEGORY_TO_MK } from "../components/SubjectCatalog/utils";
+import { EvaluationReview, OtherReview } from "../components/types";
+import { EVALUATION_MAP_TO_MK } from "../constants/subjects";
+
+type AdminReviewsList = (OtherReview | EvaluationReview)[];
+
+interface ApiResponse {
+	count: number;
+	next: string | null;
+	previous: string | null;
+	results: AdminReviewsList;
+}
+
+const AdminDashboard = () => {
+	const [reviews, setReviews] = useState<AdminReviewsList>([]);
+	const [loading, setLoading] = useState(false);
+	const [nextUrl, setNextUrl] = useState<string | null>(null);
+	const [filters, setFilters] = useState({
+		type: "all", // "all", "evaluation", "other"
+		approved: "all", // "all", "approved", "unapproved"
+	});
+	const [expandedReview, setExpandedReview] = useState<number | null>(null);
+
+	const fetchReviews = async (url?: string, reset = false) => {
+		setLoading(true);
+		try {
+			const params = new URLSearchParams();
+			if (filters.type !== "all") params.append("type", filters.type);
+			if (filters.approved !== "all") {
+				params.append(
+					"is_confirmed",
+					filters.approved === "approved" ? "true" : "false"
+				);
+			}
+			const requestUrl =
+				url || `/subjects/subjects-reviews-list/?${params.toString()}`;
+			const response = await axiosInstance.get<ApiResponse>(requestUrl);
+
+			if (reset) {
+				setReviews(response.data.results);
+			} else {
+				setReviews((prev) => [...prev, ...response.data.results]);
+			}
+			setNextUrl(response.data.next);
+		} catch (error) {
+			console.error("Error fetching reviews:", error);
+		} finally {
+			setLoading(false);
+		}
+	};
+
+	useEffect(() => {
+		fetchReviews(undefined, true);
+	}, []);
+
+	const toggleApproval = async (reviewId: number, currentStatus: boolean) => {
+		try {
+			await axiosInstance.patch(`/subjects/admin/reviews/${reviewId}/`, {
+				is_confirmed: !currentStatus,
+			});
+			setReviews((prev) =>
+				prev.map((review) =>
+					review.review.id === reviewId
+						? {
+								...review,
+								review: { ...review.review, is_confirmed: !currentStatus },
+						  }
+						: review
+				)
+			);
+		} catch (error) {
+			console.error("Error updating review approval:", error);
+		}
+	};
+
+	const deleteReview = async (reviewId: number) => {
+		if (!confirm("Дали сте сигурни дека сакате да избришете?")) {
+			return;
+		}
+
+		try {
+			await axiosInstance.delete(`/subjects/admin/reviews/${reviewId}/`);
+			setReviews((prev) =>
+				prev.filter((review) => review.review.id !== reviewId)
+			);
+		} catch (error) {
+			console.error("Error deleting review:", error);
+		}
+	};
+
+	const handleSearch = () => {
+		fetchReviews(undefined, true);
+	};
+
+	const loadMore = () => {
+		if (nextUrl && !loading) {
+			fetchReviews(nextUrl);
+		}
+	};
+
+	return (
+		<div className="max-w-7xl mx-auto p-6 bg-white">
+			<h1 className="text-3xl font-bold mb-8">Администраторски панел</h1>
+
+			<div className="bg-gray-50 rounded-lg p-4 mb-6">
+				<div className="flex items-center space-x-4">
+					<div className="flex flex-col items-start space-x-0 space-y-2">
+						<div className="flex flex-col md:flex-row md:space-x-8">
+							<div>
+								<label className="block text-sm font-medium text-gray-700 mb-1">
+									Тип
+								</label>
+								<select
+									value={filters.type}
+									onChange={(e) =>
+										setFilters((prev) => ({ ...prev, type: e.target.value }))
+									}
+									className="px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 custom-select"
+								>
+									<option value="all">Сите</option>
+									<option value="evaluation">Информации за полагање</option>
+									<option value="other">Други информации</option>
+								</select>
+							</div>
+							<div>
+								<label className="block text-sm font-medium text-gray-700 mb-1">
+									Статус на одобрување
+								</label>
+								<select
+									value={filters.approved}
+									onChange={(e) =>
+										setFilters((prev) => ({
+											...prev,
+											approved: e.target.value,
+										}))
+									}
+									className="px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500  custom-select"
+								>
+									<option value="all">Сите</option>
+									<option value="approved">Одобрени</option>
+									<option value="unapproved">Неодобрени</option>
+								</select>
+							</div>
+						</div>
+						<div className="flex pt-4">
+							<button
+								onClick={handleSearch}
+								disabled={loading}
+								className="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500"
+							>
+								{loading ? "Се вчитува..." : "Пребарај"}
+							</button>
+						</div>
+					</div>
+				</div>
+			</div>
+
+			{/* Reviews List */}
+			<div className="space-y-4">
+				{reviews.length === 0 && !loading ? (
+					<p className="text-gray-500 text-center py-8">
+						Нема рецензии според избраните филтри.
+					</p>
+				) : (
+					reviews.map((review) => (
+						<div
+							key={review.review.id}
+							className="border border-gray-200 rounded-lg p-6"
+						>
+							<div className="flex items-start justify-between mb-4">
+								<div className="flex-1">
+									<div className="flex items-center space-x-3 mb-2">
+										<span className="font-semibold text-lg">
+											{review.review.subject.name} ({review.review.subject.code}
+											)
+										</span>
+										<span
+											className={
+												"px-2 py-1 rounded text-xs font-medium bg-blue-100 text-blue-800"
+											}
+										>
+											{/* className={`px-2 py-1 rounded text-xs font-medium ${ 
+												"methods" in review
+													? "bg-blue-100 text-blue-800"
+													: "bg-purple-100 text-purple-800"
+											}`}
+										>
+										*/}
+											{/* make api specify types to prevent this */}
+											{"methods" in review ? "Полагање" : "Други"}
+										</span>
+										{"category" in review && review.category && (
+											<span className="bg-gray-100 text-gray-800 px-2 py-1 rounded text-xs">
+												{
+													MAP_REVIEW_CATEGORY_TO_MK[
+														review.category as keyof typeof MAP_REVIEW_CATEGORY_TO_MK
+													]
+												}
+											</span>
+										)}
+									</div>
+									<div className="flex items-center space-x-4 text-sm text-gray-600">
+										<span>Студент: {review.review.student}</span>
+										<span>
+											Гласови:{" "}
+											{`${
+												review.review.votes_score ?? 0 > 0
+													? "+"
+													: review.review.votes_score ?? 0 < 0
+													? "-"
+													: ""
+											}${review.review.votes_score}`}
+										</span>
+									</div>
+								</div>
+								<div className="flex items-center space-x-2">
+									<button
+										onClick={() =>
+											setExpandedReview(
+												expandedReview === review.review.id
+													? null
+													: review.review.id ?? null
+											)
+										}
+										className="p-2 text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded"
+										title="Прегледај детали"
+									>
+										<Eye className="w-4 h-4" />
+									</button>
+									<button
+										onClick={() =>
+											toggleApproval(
+												review.review.id!,
+												review.review.is_confirmed!
+											)
+										}
+										className={`p-2 rounded ${
+											review.review.is_confirmed
+												? "text-red-600 hover:text-red-800 hover:bg-red-50"
+												: "text-green-600 hover:text-green-800 hover:bg-green-50"
+										}`}
+										title={
+											review.review.is_confirmed
+												? "Означи како неодобрено"
+												: "Означи како одобрено"
+										}
+									>
+										{review.review.is_confirmed ? (
+											<XCircle className="w-4 h-4" />
+										) : (
+											<CheckCircle className="w-4 h-4" />
+										)}
+									</button>
+									<button
+										onClick={() => deleteReview(review.review.id!)}
+										className="p-2 text-red-600 hover:text-red-800 hover:bg-red-50 rounded"
+										title="Избриши"
+									>
+										<Trash2 className="w-4 h-4" />
+									</button>
+								</div>
+							</div>
+
+							<div className="flex items-center space-x-2 mb-3">
+								<span
+									className={`text-sm font-medium ${
+										review.review.is_confirmed
+											? "text-green-600"
+											: "text-red-600"
+									}`}
+								>
+									{review.review.is_confirmed ? "✓ Одобрено" : "✗ Неодобрено"}
+								</span>
+							</div>
+
+							{/* Expanded Details */}
+							{expandedReview === review.review.id && (
+								<div className="mt-4 pt-4 border-t border-gray-200">
+									{"methods" in review ? (
+										<div className="space-y-4">
+											<h4 className="font-medium">Начини на оценување:</h4>
+											{review.methods?.map((method, index) => (
+												<div key={index} className="bg-gray-50 rounded p-3">
+													<p className="font-medium mb-2">Метод {index + 1}:</p>
+													{method.note && (
+														<p className="text-sm text-gray-600 mb-2">
+															Забелешка: {method.note}
+														</p>
+													)}
+													<div className="overflow-x-auto">
+														<table className="min-w-full border border-gray-300">
+															<thead className="bg-gray-100">
+																<tr>
+																	<th className="px-3 py-2 text-left text-sm font-medium">
+																		Активност
+																	</th>
+																	<th className="px-3 py-2 text-left text-sm font-medium">
+																		Процент
+																	</th>
+																</tr>
+															</thead>
+															<tbody>
+																{method.components.map((component, idx) => (
+																	<tr key={idx}>
+																		<td className="px-3 py-2 text-sm border-b">
+																			{
+																				EVALUATION_MAP_TO_MK[
+																					(component.category
+																						.charAt(0)
+																						.toUpperCase() +
+																						component.category.slice(
+																							1
+																						)) as keyof typeof EVALUATION_MAP_TO_MK
+																				]
+																			}
+																		</td>
+																		<td className="px-3 py-2 text-sm border-b">
+																			{component.percentage}%
+																		</td>
+																	</tr>
+																))}
+															</tbody>
+														</table>
+													</div>
+												</div>
+											))}
+											<div>
+												<strong>Услов за потпис:</strong>{" "}
+												{review.signature_condition || "Нема"}
+											</div>
+										</div>
+									) : (
+										<div>
+											<h4 className="font-medium mb-2">Содржина:</h4>
+											<p className="text-gray-700">
+												{"content" in review ? review.content : "Нема содржина"}
+											</p>
+										</div>
+									)}
+								</div>
+							)}
+						</div>
+					))
+				)}
+
+				{/* Load More Button */}
+				{nextUrl && (
+					<div className="flex justify-center pt-6">
+						<button
+							onClick={loadMore}
+							disabled={loading}
+							className="px-6 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed"
+						>
+							{loading ? "Се вчитува..." : "Вчитај уште"}
+						</button>
+					</div>
+				)}
+			</div>
+
+			{loading && reviews.length === 0 && (
+				<div className="flex justify-center py-8">
+					<div className="text-gray-500">Се вчитува...</div>
+				</div>
+			)}
+		</div>
+	);
+};
+
+export default AdminDashboard;
Index: frontend/src/pages/ReviewForm.tsx
===================================================================
--- frontend/src/pages/ReviewForm.tsx	(revision 48ee75d108679bbc15057385d7cc1cb0c1eecf42)
+++ frontend/src/pages/ReviewForm.tsx	(revision 522e6290294133bb73f7150fe715fc9848aeafc3)
@@ -141,4 +141,6 @@
 			return;
 		}
+
+		// TODO: handle admin requests (should be approved from start)
 
 		// post specific for evaluation reviews
