diff --git a/src/homework/__init__.py b/src/homework/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/homework/admin.py b/src/homework/admin.py
new file mode 100644
index 0000000000000000000000000000000000000000..38fed616d8ac56d7290d795fd12ada5d18b4fadd
--- /dev/null
+++ b/src/homework/admin.py
@@ -0,0 +1,6 @@
+from django.contrib import admin
+from . import models
+
+# Register your models here.
+admin.site.register(models.Solution)
+admin.site.register(models.Task)
\ No newline at end of file
diff --git a/src/homework/apps.py b/src/homework/apps.py
new file mode 100644
index 0000000000000000000000000000000000000000..98901a15dfa44243cd9894dc15652b9634c738fd
--- /dev/null
+++ b/src/homework/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class HomeworkConfig(AppConfig):
+    name = 'homework'
diff --git a/src/homework/migrations/0001_initial.py b/src/homework/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..57b9c1f5cea623dae04423523f427ff85e27bdc3
--- /dev/null
+++ b/src/homework/migrations/0001_initial.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.5 on 2018-01-24 12:09
+from __future__ import unicode_literals
+
+from django.conf import settings
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import homework.models
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Solution',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('date', models.DateTimeField(auto_now_add=True)),
+                ('ready', models.BooleanField()),
+                ('files', models.FileField(blank=True, upload_to='', validators=[django.core.validators.FileExtensionValidator('image/png', 'image/jpeg', 'application/zip')])),
+                ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Student',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('homework', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='homework.Solution')),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Task',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('title', models.CharField(max_length=150)),
+                ('date', models.DateTimeField(auto_now_add=True)),
+                ('deadline', models.DateTimeField(validators=[homework.models.validate_deadline])),
+                ('text', models.TextField()),
+                ('files', models.FileField(blank=True, upload_to='', validators=[django.core.validators.FileExtensionValidator('image/png', 'image/jpeg', 'application/zip')])),
+                ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+        migrations.AddField(
+            model_name='solution',
+            name='task',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='homework.Task'),
+        ),
+    ]
diff --git a/src/homework/migrations/0002_auto_20180124_1453.py b/src/homework/migrations/0002_auto_20180124_1453.py
new file mode 100644
index 0000000000000000000000000000000000000000..597c83e833b380d48452111a0e35eafaaa16969a
--- /dev/null
+++ b/src/homework/migrations/0002_auto_20180124_1453.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.5 on 2018-01-24 13:53
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('homework', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='student',
+            name='homework',
+        ),
+        migrations.RemoveField(
+            model_name='student',
+            name='user',
+        ),
+        migrations.AddField(
+            model_name='solution',
+            name='accepted',
+            field=models.BooleanField(default=False),
+        ),
+        migrations.AlterField(
+            model_name='solution',
+            name='created_by',
+            field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.AlterField(
+            model_name='solution',
+            name='ready',
+            field=models.BooleanField(default=False),
+        ),
+        migrations.AlterField(
+            model_name='solution',
+            name='task',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='task_solution', to='homework.Task'),
+        ),
+        migrations.AlterField(
+            model_name='task',
+            name='created_by',
+            field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.DeleteModel(
+            name='Student',
+        ),
+    ]
diff --git a/src/homework/migrations/0003_auto_20180124_1818.py b/src/homework/migrations/0003_auto_20180124_1818.py
new file mode 100644
index 0000000000000000000000000000000000000000..1fcd873a015a4518dc233d5a7071279bd0fe7165
--- /dev/null
+++ b/src/homework/migrations/0003_auto_20180124_1818.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.5 on 2018-01-24 17:18
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('homework', '0002_auto_20180124_1453'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='task',
+            name='created_by',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+        ),
+    ]
diff --git a/src/homework/migrations/__init__.py b/src/homework/migrations/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/homework/models.py b/src/homework/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..0e94c27c497efe4e6dd8eed001356a8b5b0a27b5
--- /dev/null
+++ b/src/homework/models.py
@@ -0,0 +1,69 @@
+from django.db import models
+from django.contrib.auth.models import User
+from django.core.exceptions import ValidationError
+from django.utils.translation import ugettext_lazy as _
+from django.utils import timezone
+from django.core import validators
+# from . import myfields
+
+
+# 5MB - 5242880
+__MAX_UPLOAD_SIZE = 5242880
+
+
+def validate_deadline(date):
+    if date <= timezone.now():
+        raise ValidationError(_('Date must be greater than now'), code='invalid')
+
+
+# def validate_file_size(file):
+#     if file._size > __MAX_UPLOAD_SIZE:
+#         raise ValidationError(_('Please keep filesize under' + __MAX_UPLOAD_SIZE))
+
+class Task(models.Model):
+    title = models.CharField(max_length=150, )
+    date = models.DateTimeField(auto_now_add=True, editable=False, )
+    deadline = models.DateTimeField(validators=[validate_deadline], )
+    text = models.TextField()
+    created_by = models.ForeignKey(User, )
+    files = models.FileField(
+        validators=[validators.FileExtensionValidator(
+            'image/png',
+            'image/jpeg',
+            'application/zip',
+        )],
+        blank=True,
+    )
+    # files = myfields.RestrictedFileField(
+    #     content_types=['image/png', 'image/jpeg', 'application/zip'],
+    #     max_upload_size=MAX_UPLOAD_SIZE,
+    #     blank=True,
+    #     null=True,
+    # )
+#    solution_file = models.BooleanField()
+#
+#    def clean(self):
+#        if self.deadline <= timezone.now():
+#            raise ValidationError(_('Invalid date'), code='invalid')
+
+
+class Solution(models.Model):
+    task = models.ForeignKey(Task, related_name='task_solution', on_delete=models.CASCADE, )
+    # student = models.ForeignKey(account.models.Profile, related_name='student_solution',  on_delete=models.CASCADE)
+    date = models.DateTimeField(auto_now_add=True, editable=False, )
+    ready = models.BooleanField(default=False, ) #if(Soulution.date <= Task.deadline)
+    accepted = models.BooleanField(default=False, )
+    files = models.FileField(
+        validators=[validators.FileExtensionValidator(
+            'image/png',
+            'image/jpeg',
+            'application/zip',
+        )],
+        blank=True,
+    )
+    created_by = models.ForeignKey(User, )
+    # files = myfields.RestrictedFileField(
+    #     content_types=['image/png', 'image/jpeg', 'application/zip'],
+    #     max_upload_size=MAX_UPLOAD_SIZE,
+    #     blank=True,
+    # )
diff --git a/src/homework/myfields.py b/src/homework/myfields.py
new file mode 100644
index 0000000000000000000000000000000000000000..c343daa73b1aa8407ad21dfdab6f997d51c2a021
--- /dev/null
+++ b/src/homework/myfields.py
@@ -0,0 +1,41 @@
+from django import forms
+from django.template.defaultfilters import filesizeformat
+from django.utils.translation import ugettext_lazy as _
+from django.core.exceptions import ValidationError
+
+
+class RestrictedFileField(forms.FileField):
+    """
+    Same as FileField, but you can specify:
+    * content_types - list containing allowed content_types. Example: ['application/pdf', 'image/jpeg']
+    * max_upload_size - a number indicating the maximum file size allowed for upload.
+        2.5MB - 2621440
+        5MB - 5242880
+        10MB - 10485760
+        20MB - 20971520
+        50MB - 5242880
+        100MB - 104857600
+        250MB - 214958080
+        500MB - 429916160
+"""
+
+    def __init__(self, *args, **kwargs):
+        self.content_types = kwargs.pop("content_types")
+        self.max_upload_size = kwargs.pop("max_upload_size")
+        super().__init__(*args, **kwargs)
+
+    def clean(self, data, initial=None):
+        file = super().clean(data, initial)
+
+        try:
+            content_type = file.content_type
+            if content_type in self.content_types:
+                if file._size > self.max_upload_size:
+                    raise ValidationError(_('Please keep filesize under %s. Current filesize %s') % (
+                        filesizeformat(self.max_upload_size), filesizeformat(file._size)))
+            else:
+                raise ValidationError(_('Filetype not supported.'))
+        except AttributeError:
+            pass
+
+        return data
diff --git a/src/homework/permissions.py b/src/homework/permissions.py
new file mode 100644
index 0000000000000000000000000000000000000000..762faedb33fa88dc0dbe620325847a39bd1809ce
--- /dev/null
+++ b/src/homework/permissions.py
@@ -0,0 +1,37 @@
+from rest_framework.permissions import BasePermission
+from rest_framework.permissions import SAFE_METHODS
+
+
+class IsStaffOrReadOnly(BasePermission):
+    """
+    The request is authenticated as a staff, or is a read-only request.
+    """
+
+    def has_permission(self, request, view):
+        return (
+            request.method in SAFE_METHODS or
+            request.user and
+            request.user.is_staff
+        )
+
+
+class IsAuthenticatedOrReadOnly(BasePermission):
+    """
+    The request is authenticated as a user, or is a read-only request.
+    """
+
+    def has_permission(self, request, view):
+        return (
+            request.method in SAFE_METHODS or
+            request.user and
+            request.user.is_authenticated
+        )
+
+
+class IsStaffOrReadOnlyForAuthenticated(BasePermission):
+
+    def has_object_permission(self, request, view, obj):
+        return (request.user.is_staff or
+                request.method in SAFE_METHODS and
+                request.user.is_authenticated
+        )
diff --git a/src/homework/serializers.py b/src/homework/serializers.py
new file mode 100644
index 0000000000000000000000000000000000000000..d27ebf8cbaaded2b210af704aa9ec7a27b4f0444
--- /dev/null
+++ b/src/homework/serializers.py
@@ -0,0 +1,18 @@
+from rest_framework import serializers
+from . import models
+
+
+class TaskSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = models.Task
+        read_only_fields = ('created_by', 'date')
+        extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}}
+        fields = '__all__'
+
+
+class SolutionSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = models.Solution
+        read_only_fields = ('created_by', 'date' 'ready')
+        extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}}
+        fields = '__all__'
diff --git a/src/homework/tests.py b/src/homework/tests.py
new file mode 100644
index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6
--- /dev/null
+++ b/src/homework/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/src/homework/urls.py b/src/homework/urls.py
new file mode 100644
index 0000000000000000000000000000000000000000..b049f63b55b713070f71fd581696af0c728649ee
--- /dev/null
+++ b/src/homework/urls.py
@@ -0,0 +1,8 @@
+from rest_framework import routers
+from . import views
+
+router = routers.DefaultRouter()
+router.register(r'tasks', views.TasksViewSet)
+router.register(r'solutions', views.SolutionViewSet)
+
+urlpatterns = router.urls
diff --git a/src/homework/views.py b/src/homework/views.py
new file mode 100644
index 0000000000000000000000000000000000000000..2d0344bd9b35109ba97288633535d3bfa4c0921e
--- /dev/null
+++ b/src/homework/views.py
@@ -0,0 +1,28 @@
+from rest_framework import viewsets
+
+
+from . import serializers
+from . import models
+from . import permissions
+from rest_framework.response import Response
+from rest_framework import status
+
+
+class TasksViewSet(viewsets.ModelViewSet):
+    serializer_class = serializers.TaskSerializer
+    queryset = models.Task.objects.all()
+    permission_classes = (permissions.IsStaffOrReadOnly, )
+
+
+class SolutionViewSet(viewsets.ModelViewSet):
+    serializer_class = serializers.SolutionSerializer
+    queryset = models.Solution.objects.all()
+    permission_classes = (permissions.SolutionPermission, )
+
+    def create(self, request, *args, **kwargs):
+        serializer = self.get_serializer(data=request.data)
+        serializer.is_valid(raise_exception=True)
+        serializer.validated_data['accepted'] = False
+        self.perform_create(serializer)
+        headers = self.get_success_headers(serializer.data)
+        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
diff --git a/src/kszkepzes/settings.py b/src/kszkepzes/settings.py
index d69a2b46270187fce694e5f24afadc5d259d9f6b..5c53612e437be6058af830883882a6f066779668 100644
--- a/src/kszkepzes/settings.py
+++ b/src/kszkepzes/settings.py
@@ -41,6 +41,7 @@ INSTALLED_APPS = [
     'rest_framework',
     'social_django',
     'authsch',
+    'homework',
     'account',
     'stats',
 ]
diff --git a/src/kszkepzes/urls.py b/src/kszkepzes/urls.py
index 98b91c94f1975a08a991dbfc87a59402a4be3b78..cb9bbcdc434a5db23b90606ebf69b6744b115a65 100644
--- a/src/kszkepzes/urls.py
+++ b/src/kszkepzes/urls.py
@@ -19,7 +19,7 @@ from django.contrib import admin
 urlpatterns = [
     url(r'^admin/', admin.site.urls),
     url('', include('social_django.urls', namespace='social')),
+    url(r'^api/v1/homework/', include('homework.urls')),
     url(r'^api/v1/', include('stats.urls')),
     url(r'^api/v1/', include('account.urls')),
-
 ]