diff --git a/core/migrations/0005_auto_20170328_1904.py b/core/migrations/0005_auto_20170328_1904.py
new file mode 100644
index 0000000000000000000000000000000000000000..bde81294681c4e88df8ed0943159cf00f5a3aded
--- /dev/null
+++ b/core/migrations/0005_auto_20170328_1904.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-03-28 12:04
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0004_auto_20170328_1417'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Application',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('cover_letter', models.TextField(blank=True, null=True)),
+                ('allow_transcript', models.BooleanField(default=True)),
+            ],
+        ),
+        migrations.RemoveField(
+            model_name='student',
+            name='applied_vacancies',
+        ),
+        migrations.AddField(
+            model_name='student',
+            name='applied_vacancies',
+            field=models.ManyToManyField(blank=True, related_name='applied_vacancies', through='core.Application', to='core.Vacancy'),
+        ),
+        migrations.AddField(
+            model_name='application',
+            name='student',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Student'),
+        ),
+        migrations.AddField(
+            model_name='application',
+            name='vacancy',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Vacancy'),
+        ),
+    ]
diff --git a/core/migrations/0006_auto_20170328_1950.py b/core/migrations/0006_auto_20170328_1950.py
new file mode 100644
index 0000000000000000000000000000000000000000..85ba09d0c51c338e7d151cce47438c4991795dd2
--- /dev/null
+++ b/core/migrations/0006_auto_20170328_1950.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-03-28 12:50
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0005_auto_20170328_1904'),
+    ]
+
+    operations = [
+        migrations.AlterUniqueTogether(
+            name='application',
+            unique_together=set([('student', 'vacancy')]),
+        ),
+    ]
diff --git a/core/models/__init__.py b/core/models/__init__.py
index a9638e4ef7c2a7639d525d26be476251dd6cf13f..8ca55685987932b8038fd9f98e96ab508ba6eccf 100755
--- a/core/models/__init__.py
+++ b/core/models/__init__.py
@@ -3,6 +3,8 @@ from core.models.accounts import Company
 from core.models.accounts import Student
 from core.models.accounts import Supervisor
 from core.models.vacancies import Vacancy
+from core.models.vacancies import Application
+
 
 
 
diff --git a/core/models/accounts.py b/core/models/accounts.py
index e94c7f0404cb60e31ec3e66eb026860da306ec82..296851594da3f3abaad2c1f59f9201e9e9de2c47 100644
--- a/core/models/accounts.py
+++ b/core/models/accounts.py
@@ -49,7 +49,8 @@ class Student(models.Model):
     resume = models.FileField(upload_to=get_student_resume_file_path, null=True, blank=True)
     phone_number = models.CharField(max_length=100, blank=True, db_index=True, null=True)
     bookmarked_vacancies = models.ManyToManyField('core.Vacancy', related_name="bookmarked_vacancies", blank=True)
-    applied_vacancies = models.ManyToManyField('core.Vacancy', related_name="applied_vacancies", blank=True)
+    applied_vacancies = models.ManyToManyField('core.Vacancy', related_name="applied_vacancies",
+                                               blank=True, through='core.Application')
 
     @property
     def name(self):
diff --git a/core/models/vacancies.py b/core/models/vacancies.py
index ef7f752532bfcf379dee73a8d217403ba3c61d88..f165a2b562545ef8feddf717ffda2f1db3063f7f 100644
--- a/core/models/vacancies.py
+++ b/core/models/vacancies.py
@@ -1,6 +1,6 @@
 from django.db import models
 
-from core.models.accounts import Company
+from core.models.accounts import Company, Student
 
 
 class Vacancy(models.Model):
@@ -12,3 +12,14 @@ class Vacancy(models.Model):
     created = models.DateTimeField(auto_now_add=True)
     updated = models.DateTimeField(auto_now=True)
     name = models.CharField(max_length=100, null=False)
+
+
+class Application(models.Model):
+    cover_letter = models.TextField(null=True, blank=True)
+    allow_transcript = models.BooleanField(null=False, default=True)
+    student = models.ForeignKey(Student, on_delete=models.CASCADE)
+    vacancy = models.ForeignKey(Vacancy, on_delete=models.CASCADE)
+
+    class Meta:
+        unique_together = (("student", "vacancy"),)
+
diff --git a/core/serializers/vacancies.py b/core/serializers/vacancies.py
index c8a443405fa6cb57ae48a2392abea5a597668528..eb1fde4354fddf5162f5eb97b56b9cd530856143 100644
--- a/core/serializers/vacancies.py
+++ b/core/serializers/vacancies.py
@@ -1,5 +1,5 @@
 from rest_framework import serializers
-from core.serializers.accounts import CompanySerializer
+from core.serializers.accounts import CompanySerializer, StudentSerializer
 from core.models.vacancies import Vacancy
 
 
@@ -11,3 +11,14 @@ class VacancySerializer(serializers.ModelSerializer):
         fields = '__all__'
 
 
+class ApplicationSerializer(serializers.ModelSerializer):
+    vacancy = VacancySerializer()
+    student = StudentSerializer()
+
+    class Meta:
+        model = Vacancy
+        fields = '__all__'
+
+
+
+
diff --git a/core/views/vacancies.py b/core/views/vacancies.py
index 576fa85b492ae385a5e7f9578cd5d7686cee1397..2adf5b9cde73f72481b27d39906bd156bb12151d 100644
--- a/core/views/vacancies.py
+++ b/core/views/vacancies.py
@@ -5,8 +5,8 @@ from rest_framework.response import Response
 
 from core.lib.permissions import IsAdminOrStudent, IsAdminOrCompany
 from core.models import Student
-from core.models.vacancies import Vacancy
-from core.serializers.vacancies import VacancySerializer
+from core.models.vacancies import Vacancy, Application
+from core.serializers.vacancies import VacancySerializer, ApplicationSerializer
 
 
 class VacancyViewSet(viewsets.ModelViewSet):
@@ -30,16 +30,18 @@ class ApplicationViewSet(viewsets.GenericViewSet):
         return Response(vacancies.data)
 
     def create(self, request, student_id):
-        vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data['vacancy_id'])
+        cover_letter = request.data.get('cover_letter')
+        vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data.get('vacancy_id'))
         student = get_object_or_404(Student.objects.all(), pk=student_id)
-        student.applied_vacancies.add(vacancy)
-        return Response(self.serializer_class(student.applied_vacancies, many=True, context={'request': request}).data)
+        application = Application(vacancy=vacancy, student=student, cover_letter=cover_letter)
+        application.save()
+        return Response(ApplicationSerializer(application, context={'request': request}).data)
 
     def destroy(self, request, student_id, pk):
         vacancy = get_object_or_404(Vacancy.objects.all(), pk=pk)
         student = get_object_or_404(Student.objects.all(), pk=student_id)
-        student.applied_vacancies.remove(vacancy)
-        return Response(self.serializer_class(student.applied_vacancies, many=True, context={'request': request}).data)
+        application = get_object_or_404(Application.objects.all(), student=student, vacancy=vacancy)
+        return Response(ApplicationSerializer(application, context={'request': request}).data)
 
 
 class BookmarkedVacancyByStudentViewSet(viewsets.GenericViewSet):