diff --git a/app/models.py b/app/models.py
index 39911d3e01ef2efdba9f0a661c5b0b6ce458ec9f..b0333c1da1f631395826008f2b1a75437535b41c 100644
--- a/app/models.py
+++ b/app/models.py
@@ -70,6 +70,13 @@ class Materi(models.Model):
         count = Like.objects.filter(materi=self).count()
         return count
 
+    @property
+    def is_like(self):
+        like = False
+        if Like.objects.filter(materi=self).exists():
+            like = True
+
+
 class Comment(models.Model):
     username = models.CharField(max_length=100)
     profile = models.CharField(max_length=100, default=getRandomColor)
diff --git a/app/templates/app/includes/sidebar.html b/app/templates/app/includes/sidebar.html
index 18338f5f504edc29b60e49b0f6c0cc3220069520..ff0bb3adb420af54f491adcdc994bd422f1991d6 100644
--- a/app/templates/app/includes/sidebar.html
+++ b/app/templates/app/includes/sidebar.html
@@ -32,7 +32,7 @@
         </a>
     </li>
     <li class="nav-item">
-        <a class="nav-link" href="#">
+        <a class="nav-link" href="{% url 'favorite' %}">
             <span>Favorite Materi</span>
         </a>
     </li>
diff --git a/app/templates/user_favorite_materi.html b/app/templates/user_favorite_materi.html
new file mode 100644
index 0000000000000000000000000000000000000000..7ca9ccffc1b172244c76e97fe59a9db72a231a0f
--- /dev/null
+++ b/app/templates/user_favorite_materi.html
@@ -0,0 +1,64 @@
+{% extends 'app/base_dashboard.html' %}
+{% load static %}
+
+{% block title %}
+<title>Materi Favorite | Digipus</title>
+{% endblock %}
+
+{% block stylesheets %}
+<link rel="stylesheet" type="text/css" href="{% static 'app/css/user_uploaded_posts.css' %}"/>
+{% endblock %}
+
+{% block content %}
+
+<div style="padding: 1rem 0" id="like">
+	{% if materi %}
+		{% for _, mat in materi.items %}
+		<div id="mat-{{ mat.data.id }}">
+			<div class="posts-space-between-container bg-white rounded shadow" style="margin: 0.5rem 2rem; padding: 1rem;">
+				<div id="posts-user-profile">
+					{% if mat.data.cover %}
+					<img id="posts-img" src="{{ post.data.cover.url }}" alt="profile-picture"/>
+					{% else %}
+					</div style="background-color: grey; width: 100px; height: 100px;">
+					{% endif %}
+					<div id="posts-info">
+						<span><a class="ml-auto p-1 link" style="text-align: left; font-size: 2rem;" href="{% url 'detail-materi' post.data.id %}">
+							{{ mat.data.title }}
+						</a></span>
+						<span style="font-size: 0.75rem; padding-left: 0.3rem;">{{ mat.data.date_created }}</span>
+					</div>
+				</div>
+				<div class="posts-vertically-centered ml-auto pr-4">
+					<span id="post-like-count-{{post.data.id}}">{{ mat.data.like_count }}</span>
+					<span>Like</span>
+				</div>
+				<div class="posts-vertically-centered">
+					<span>{{ mat.comments|length }}</span>
+					<span>Komentar</span>
+				</div>
+			</div>
+            {% for comment in mat.comments %}
+			<div id="post-{{ post.data.id }}-comment-{{ comment.id }}">
+				<div id="posts-comment-info" class="bg-white rounded shadow" >
+					<img id="posts-profile-picture" src="{{ comment.user.profile_picture.url }}" alt="profile-picture" width="40px" height="40px" style="margin: 18px"/>
+					<div style="display: flex; align-items: center;">
+						<div style="display: flex; flex-direction: column;">
+							<span style="font-size: 0.9rem;"><strong>{{ comment.user.name }}</strong> - {{ comment.timestamp }}</span>
+							{{ comment.comment }}
+						</div>
+					</div>
+				</div>
+			</div>
+            {% endfor %}
+		</div>
+		{% endfor %}
+	{% else %}
+		<div class="text-center h5">
+			Anda belum memiliki materi yang disukai
+		</div>
+	{% endif %}
+
+</div>
+
+{% endblock %}
diff --git a/app/urls.py b/app/urls.py
index 7ccc70c3a5dc1c82dbcb59772f950b9a04e9c2da..ee398dc154f43962ddded97e31c2a85aceee1113 100644
--- a/app/urls.py
+++ b/app/urls.py
@@ -5,7 +5,7 @@ from app.views import (DashboardKontributorView, ProfilKontributorView,
                        SuksesLoginAdminView, SuksesLoginKontributorView, DownloadHistoryView,
                        SuntingProfilView, UploadMateriHTML, UploadMateriView, UploadMateriExcelView,
                        ProfilAdminView, PostsView, SuntingProfilAdminView,
-                       ReqMateriView, KatalogPerKontributorView)
+                       ReqMateriView, KatalogPerKontributorView, MateriFavorite)
 
 urlpatterns = [
     path("", views.DaftarKatalog.as_view(), name="daftar_katalog"),
@@ -34,4 +34,5 @@ urlpatterns = [
          name="katalog-per-kontributor"),
     path("materi/rate/", views.add_rating_materi, name="rate-materi"),
     path("materi/<int:pk>/save-to-gdrive/", views.save_to_gdrive, name="save-to-gdrive"),
+    path("favorite", MateriFavorite.as_view(), name="favorite")
 ]
diff --git a/app/views.py b/app/views.py
index 90ab4581fcbc9582420cf266ecb51a6e7c10c206..94353f25fa8f3d8365220d22aaf2134d0c30b00f 100644
--- a/app/views.py
+++ b/app/views.py
@@ -845,3 +845,31 @@ def save_to_gdrive(request, pk):
         raise Http404("File tidak dapat ditemukan.")
 
     return HttpResponseRedirect(reverse('detail-materi', kwargs={'pk': pk}))
+
+class MateriFavorite(TemplateView):
+
+    template_name = "user_favorite_materi.html"
+
+    def dispatch(self, request, *args, **kwargs):
+        if not request.user.is_authenticated:
+            raise PermissionDenied(request)
+        return super(MateriFavorite, self).dispatch(request, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        context = super().get_context_data(**kwargs)
+        user = self.request.user
+
+        materi = Materi.objects.filter(like=True)
+        likes_data = { like.id: { "data": materi, "comments": [] } for mat in materi }
+
+        comments = Comment.objects \
+            .filter(materi__id__in=likes_data.keys()) \
+            .order_by("-timestamp")
+
+        for comment in comments:
+            likes_data[comment.materi.id]["comments"].append(comment)
+
+        context["user"] = user
+        context["likes"] = likes_data
+
+        return self.render_to_response(context=context)
\ No newline at end of file