diff --git a/assets/img/image-coba.jpg b/assets/img/image-coba.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..71582c476ad9d91e873d5a123b48e958428686d4
Binary files /dev/null and b/assets/img/image-coba.jpg differ
diff --git a/assets/pdf/pdf-coba.pdf b/assets/pdf/pdf-coba.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..379cb93fd41385e7ea21e9f02d44b2fb84fd860d
Binary files /dev/null and b/assets/pdf/pdf-coba.pdf differ
diff --git a/core/migrations/0018_student_ui_ux_portofolio.py b/core/migrations/0018_student_ui_ux_portofolio.py
new file mode 100644
index 0000000000000000000000000000000000000000..60dd4be14a02df0ef4950c15801008c51d2e0fdf
--- /dev/null
+++ b/core/migrations/0018_student_ui_ux_portofolio.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.17 on 2019-10-06 10:14
+from __future__ import unicode_literals
+
+import core.lib.validators
+import core.models.accounts
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0017_merge_20191006_0134'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='student',
+            name='ui_ux_portofolio',
+            field=models.FileField(blank=True, null=True, upload_to=core.models.accounts.get_student_ui_ux_portofolio_file_path, validators=[core.lib.validators.validate_document_file_extension]),
+        ),
+    ]
diff --git a/core/migrations/0026_merge_20191008_0256.py b/core/migrations/0026_merge_20191008_0256.py
new file mode 100644
index 0000000000000000000000000000000000000000..319247f3aa68d720040bec6e208c926863e5887a
--- /dev/null
+++ b/core/migrations/0026_merge_20191008_0256.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.17 on 2019-10-07 19:56
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0018_student_ui_ux_portofolio'),
+        ('core', '0025_merge_20191008_0048'),
+        ('core', '0025_merge_20191007_2124'),
+    ]
+
+    operations = [
+    ]
diff --git a/core/models/accounts.py b/core/models/accounts.py
index 12536cba21caff896eff1c99bcb3dccb7622a4c7..9b1e1f08ba7261206f1d0adde5c87f797721cf77 100644
--- a/core/models/accounts.py
+++ b/core/models/accounts.py
@@ -25,6 +25,11 @@ def get_company_logo_file_path(instance, filename):
     filename = "%s.%s" % (uuid.uuid4(), extension)
     return os.path.join("company-logo/", filename)
 
+def get_student_ui_ux_portofolio_file_path(instance, filename):
+    extension = filename.split('.')[-1].lower()
+    filename = "%s.%s" % (uuid.uuid4(), extension)
+    return os.path.join("student-ui-ux-portofolio/", filename)
+
 
 def get_display_name(user, full_name=False):
     """
@@ -67,12 +72,11 @@ class Student(models.Model):
     photo = models.FileField(upload_to=get_student_photo_file_path, null=True, blank=True, validators=[validate_image_file_extension])
     linkedin_url = models.URLField(max_length=200,blank=True, null=True)
     region = models.CharField(max_length=30, blank=True, null=True)
+    ui_ux_portofolio = models.FileField(upload_to=get_student_ui_ux_portofolio_file_path, null=True, blank=True, validators=[validate_document_file_extension])
     latest_work = models.CharField(max_length=100, blank=True, null=True)
     latest_work_desc = models.TextField(blank=True, null=True)
     intro = models.CharField(max_length=50, blank=True, null=True)
 
-    intro = models.CharField(max_length=50, blank=True, null=True)
-
     @property
     def name(self):
         return get_display_name(self.user)
diff --git a/core/tests/test_accounts.py b/core/tests/test_accounts.py
index 459ad8d6c9c376f699fec6fc35ac4c4d321b7d49..87b4becbf15829cc097b67a27734cdad3020e3b0 100644
--- a/core/tests/test_accounts.py
+++ b/core/tests/test_accounts.py
@@ -180,6 +180,15 @@ class ProfileUpdateTests(APITestCase):
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
 
         url = '/api/students/' + str(student_id) + "/profile/"
+        data = self._create_test_file('./assets/pdf/pdf-coba.pdf')
+        response = self.client.patch(url, data, format='multipart')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+        url = '/api/students/' + str(student_id) + "/profile/"
+        data = self._create_test_file('./assets/img/image-coba.jpg')
+        response = self.client.patch(url, data, format='multipart')
+        self.assertEqual(response.status_code, status.HTTP_415_UNSUPPORTED_MEDIA_TYPE)
+
         response = self.client.patch(url, {'latest_work': 'Teaching assistant at Fasilkom UI'}, format='multipart')
         self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
         self.assertEqual(response.data.get('latest_work'), 'Teaching assistant at Fasilkom UI')
@@ -193,3 +202,7 @@ class ProfileUpdateTests(APITestCase):
         response = self.client.patch(url, {'intro': 'Saya tertarik dengan dunia front-end development'}, format='multipart')
         self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
         self.assertEqual(response.data.get('intro'), 'Saya tertarik dengan dunia front-end development')
+
+    def _create_test_file(self,path):
+        f = open(path, 'r')
+        return {'pdf_file': f}
diff --git a/core/views/accounts.py b/core/views/accounts.py
index 8cadcadf91e82d4def648574d318742b8cf6fdd3..fa57110c5624854523002aaeda797bc7eb413b75 100644
--- a/core/views/accounts.py
+++ b/core/views/accounts.py
@@ -63,12 +63,20 @@ class StudentViewSet(viewsets.ModelViewSet):
         ---
         """
         user = self.get_object()
-        serializer = self.serializer_class(user, data=request.data, partial=True)
-        if serializer.is_valid():
-            serializer.save()
-            return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
+        if 'pdf_file' in request.data.keys():
+            if request.data['pdf_file'].content_type == 'application/pdf':
+                user.ui_ux_portofolio = request.data['pdf_file']
+                user.save()
+                return Response({}, status=status.HTTP_200_OK)
+            else:
+                return Response({}, status=status.HTTP_415_UNSUPPORTED_MEDIA_TYPE)
         else:
-            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
+            serializer = self.serializer_class(user, data=request.data, partial=True)
+            if serializer.is_valid():
+                serializer.save()
+                return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
+            else:
+                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
 
     @detail_route(methods=['get'], permission_classes=[IsAdminOrStudent])
     def transcript(self, request, pk):