diff --git a/app/migrations/0029_merge_20201101_0217.py b/app/migrations/0029_merge_20201101_0217.py
new file mode 100644
index 0000000000000000000000000000000000000000..69826d1afcfbd93ecf7643f8109e292879d785b4
--- /dev/null
+++ b/app/migrations/0029_merge_20201101_0217.py
@@ -0,0 +1,14 @@
+# Generated by Django 3.1 on 2020-10-31 19:17
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('app', '0028_notifikasikontributor'),
+        ('app', '0028_adminnotification'),
+    ]
+
+    operations = [
+    ]
diff --git a/app/migrations/0031_merge_20201101_1729.py b/app/migrations/0031_merge_20201101_1729.py
new file mode 100644
index 0000000000000000000000000000000000000000..e284b5ff2882614bf7c9f7fae48e11fcf2d18c4c
--- /dev/null
+++ b/app/migrations/0031_merge_20201101_1729.py
@@ -0,0 +1,14 @@
+# Generated by Django 3.1 on 2020-11-01 10:29
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('app', '0030_merge_20201101_0621'),
+        ('app', '0029_merge_20201101_0217'),
+    ]
+
+    operations = [
+    ]
diff --git a/app/templates/app/base_dashboard.html b/app/templates/app/base_dashboard.html
index c74bd589eb745d75b89cb9f1560428d76b24e4fb..d7303650586965b4cbee33dabf2ca56c4b249556 100644
--- a/app/templates/app/base_dashboard.html
+++ b/app/templates/app/base_dashboard.html
@@ -23,6 +23,9 @@
 
     <!-- Custom styles for this page -->
     <link href="{% static 'vendor/datatables/dataTables.bootstrap4.min.css' %}" rel="stylesheet">
+
+    <!-- Bootstrap CSS -->
+
     {% block stylesheets %}{% endblock %}
     {% block scripts %}{% endblock %}
 </head>
@@ -69,6 +72,10 @@
         <em class="fas fa-angle-up"></em>
     </a>
 
+    <!-- Bootstrap scripts -->
+    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
 </body>
 
 </html>
\ No newline at end of file
diff --git a/app/templates/app/base_profile.html b/app/templates/app/base_profile.html
index 081dc2ef7b2c7c987d31d20c31301d3e81849d8b..f9975a5b732b99d096c2de0c44e19a9914156c02 100644
--- a/app/templates/app/base_profile.html
+++ b/app/templates/app/base_profile.html
@@ -71,6 +71,10 @@
         <em class="fas fa-angle-up"></em>
     </a>
 
+    <!-- Bootstrap scripts -->
+    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
 </body>
 
 </html>
\ No newline at end of file
diff --git a/app/templates/app/includes/navigation.html b/app/templates/app/includes/navigation.html
index b50f655fbc127d401cf1917f34e195fc55e9b0ec..d83b7829d02e5e243ca0730e6b6d9ff4d548af41 100644
--- a/app/templates/app/includes/navigation.html
+++ b/app/templates/app/includes/navigation.html
@@ -11,19 +11,26 @@
     <ul class="navbar-nav ml-auto">
 
         {% if request.user.is_contributor %}
-        <li class="nav-item dropdown">
-            <a id="notifBtn" class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Notifikasi</a>
-            <div class="dropdown-menu show" aria-labelledby="notifBtn">
+        <li class="nav-item">
+            <div class="dropdown">
                 {% if kontributor_notif %}
-                    {% for notif in kontributor_notif %}
-                        <a class="dropdown-item" style="white-space: break-spaces;" href="{% url 'dashboard' %}">Materi "{{notif.materi.title}}" <br>{{ notif }}</a>
-                        <div class="dropdown-divider"></div>
-                    {% endfor %}
+                <a id="notifBtn" class="nav-link dropdown-toggle" data-toggle="dropdown" href="#"role="button" aria-haspopup="true" aria-expanded="false" style="color: #4e73df;">
+                Notifikasi</a>
+                <div class="dropdown-menu" aria-labelledby="notifBtn">
+                {% for notif in kontributor_notif %}
+                    <div class="dropdown-divider"></div>
+                    <a class="dropdown-item" style="white-space: break-spaces;" href="{% url 'dashboard' %}">Materi "{{notif.materi.title}}" <br>{{ notif }}</a>
+                    <div class="dropdown-divider"></div>
+                {% endfor %}
                 {% else %}
+                <a id="notifBtn" class="nav-link dropdown-toggle" data-toggle="dropdown" href="#"role="button" aria-haspopup="true" aria-expanded="false">
+                Notifikasi</a>
+                <div class="dropdown-menu" aria-labelledby="notifBtn">
                     <a class="dropdown-item disabled" href="#" style="white-space: break-spaces;">Anda tidak memiliki notifikasi baru</a>
                 {% endif %}
-              </div>
-            </a>
+                    </div>
+                </a>
+            </div>
         </li>
         
         <li class="nav-item">
diff --git a/app/tests.py b/app/tests.py
index 75c6aaa7774aad2c4b4149b933e763e2609cdd79..8b0583fd0f4d2594e66be93e314eb6462744c9e8 100644
--- a/app/tests.py
+++ b/app/tests.py
@@ -4300,6 +4300,7 @@ class NotifikasiKontributorTest(TestCase):
         self.content = SimpleUploadedFile("ExampleFile221.pdf", b"Test file")
         self.category = Category.objects.create(id="1", name="medis", description="kategori medis")
         VerificationSetting.objects.create(title="Kriteria 1", description="memenuhi kriteria 1", archived=False, pk=1)
+        self.make_materi()
     
     @override_settings(MEDIA_ROOT=tempfile.gettempdir())
     def setUpImage(self):
@@ -4312,14 +4313,7 @@ class NotifikasiKontributorTest(TestCase):
             charset='utf-8',
         )
     
-    def test_no_notification(self):
-        self.client.login(**self.contributor_credential)
-        notifs = NotifikasiKontributor.objects.filter(user=self.contributor)
-        self.assertEqual(notifs.count(), 0)
-        self.client.logout()
-
-    def test_notification(self):
-        # Client as Kontributor posting new Materi
+    def make_materi(self):
         self.client.login(**self.contributor_credential)
         self.client.post(
             "/unggah/", data={"title":"Materi 1", "author":"Agas", "publisher":"Kelas SC", "release_year":"2000",
@@ -4329,16 +4323,25 @@ class NotifikasiKontributorTest(TestCase):
         )
         self.client.logout()
 
-        # Client as Admin disapproving the Materi
+    def admin_disapprove_materi(self, materi, pk_new_materi):
         self.client.login(**self.admin_credential)
-        materi = Materi.objects.get(title="Materi 1", uploader=self.contributor)
-        pk_new_materi = materi.id
         self.client.post(
             "/administration/detail-verif/"+str(pk_new_materi)+"/", data={
                 'kriteria-1':'0','feedback':"a", 'action':"disapprove"
             }
         )
         self.client.logout()
+    
+    def test_no_notification(self):
+        self.client.login(**self.contributor_credential)
+        notifs = NotifikasiKontributor.objects.filter(user=self.contributor)
+        self.assertEqual(notifs.count(), 0)
+        self.client.logout()
+
+    def test_notification(self):
+        materi = Materi.objects.get(title="Materi 1", uploader=self.contributor)
+        pk_new_materi = materi.id
+        self.admin_disapprove_materi(materi, pk_new_materi)
         self.assertEqual(NotifikasiKontributor.objects.filter(materi=materi, user=self.contributor).count(), 1)
         
         # Client as Kontributor get notifications
@@ -4347,10 +4350,36 @@ class NotifikasiKontributorTest(TestCase):
         html = self.client.get("/dashboard/").content.decode("utf-8")
         self.assertIn(str(notif), html)
 
+    def test_notifications_reset_when_it_is_revised(self):
+        materi = Materi.objects.get(title="Materi 1", uploader=self.contributor)
+        pk_new_materi = materi.id
+        self.admin_disapprove_materi(materi, pk_new_materi)
+        self.assertEqual(NotifikasiKontributor.objects.filter(materi=materi, user=self.contributor).count(), 1)
+
+        self.client.login(**self.contributor_credential)
+        notif = NotifikasiKontributor.objects.get(materi=materi, user=self.contributor)
+
         # Client as Kontributor check Materi detail, and the notification should be gone
-        self.client.get("/materi/"+str(materi.id)+"/")
+        response = self.client.post(
+            "/revisi/materi/"+str(pk_new_materi)+"/",
+            data={"title":"Materi 2", "author":"Agas", "publisher":"Kelas SC", "release_year":"2000",
+            "descriptions":"Deskripsi Materi 2", 'categories':"1", "cover":self.cover, "content":self.content,
+            "yt_video_id":"jNwz4L9MGVY"}
+        )
         self.assertEqual(NotifikasiKontributor.objects.filter(materi=materi, user=self.contributor).count(), 0)
+    
+    def test_notifications_reset_when_it_is_opened_in_detail(self):
+        materi = Materi.objects.get(title="Materi 1", uploader=self.contributor)
+        pk_new_materi = materi.id
+        self.admin_disapprove_materi(materi, pk_new_materi)
+        self.assertEqual(NotifikasiKontributor.objects.filter(materi=materi, user=self.contributor).count(), 1)
 
+        self.client.login(**self.contributor_credential)
+        notif = NotifikasiKontributor.objects.get(materi=materi, user=self.contributor)
+
+        # Client as Kontributor check Materi detail, and the notification should be gone
+        self.client.get("/materi/"+str(materi.id)+"/")
+        self.assertEqual(NotifikasiKontributor.objects.filter(materi=materi, user=self.contributor).count(), 0)
 
 class AdminNotificationTest(TestCase):
         
diff --git a/app/views.py b/app/views.py
index 1d831a6019cd4e655a8105cf694370d4ef23ccd8..699bd8ae7afda5124c725aa3d7ffb6aa7dc43022 100644
--- a/app/views.py
+++ b/app/views.py
@@ -701,6 +701,11 @@ class RevisiMateriView(TemplateView):
             raise PermissionDenied(request)
 
         current_materi = get_object_or_404(Materi, pk=kwargs["pk"])
+
+        if request.user.is_authenticated and request.user.is_contributor:
+            opened_notif = NotifikasiKontributor.objects.filter(user=request.user, materi=current_materi)
+            opened_notif.delete()
+        
         form = UploadMateriForm(
             request.POST, request.FILES, instance=current_materi)
         if form.is_valid():