diff --git a/util/factories.py b/util/factories.py
index e007428f603ee8ec48fdd059ff1eed21921aa42f..969f60f97053e6614c7e72a42fd4fbf810953783 100644
--- a/util/factories.py
+++ b/util/factories.py
@@ -2,8 +2,9 @@ import configparser
 import secrets
 import string
 
+from core.models import (Reviewer, Student, Tutor, ExamType,
+                         SubmissionType, Submission, Feedback)
 from core.models import UserAccount as User
-from core.models import Reviewer, Student, Tutor
 
 STUDENTS = 'students'
 TUTORS = 'tutors'
@@ -44,7 +45,7 @@ class GradyUserFactory:
     def _get_random_name(prefix='', suffix='', k=1):
         return ''.join((prefix, get_random_password(k), suffix))
 
-    def _make_base_user(self, username, groupname, store_pw=False, **kwargs):
+    def _make_base_user(self, username, groupname, password=None, store_pw=False, **kwargs):
         """ This is a specific wrapper for the django update_or_create method of
         objects.
             * A new user is created and password and group are set accordingly
@@ -62,7 +63,7 @@ class GradyUserFactory:
             defaults=kwargs)
 
         if created:
-            password = self.password_generator_func()
+            password = self.password_generator_func() if password is None else password
             user.set_password(password)
             user.save()
 
@@ -98,9 +99,10 @@ class GradyUserFactory:
         relation managers objects.update method. """
         user = self._make_user_generic(username, STUDENTS, **kwargs)
         if matrikel_no:
-            user.objects.update(matrikel_no=matrikel_no)
+            user.matrikel_no = matrikel_no
         if exam:
-            user.objects.update(exam=exam)
+            user.exam = exam
+        user.save()
         return user
 
     def make_tutor(self, username=None, **kwargs):
@@ -110,3 +112,162 @@ class GradyUserFactory:
     def make_reviewer(self, username=None, **kwargs):
         """ Creates or updates a reviewer if needed with defaults """
         return self._make_user_generic(username, REVIEWERS, **kwargs)
+
+
+def make_exams(exams=[], **kwargs):
+    return [ExamType.objects.get_or_create(
+        module_reference=exam['module_reference'],
+        defaults=exam)[0] for exam in exams]
+
+
+def make_submission_types(submission_types=[], **kwargs):
+    return [SubmissionType.objects.get_or_create(
+        name=submission_type['name'], defaults=submission_type)[0]
+            for submission_type in submission_types]
+
+
+def make_students(students=[], **kwargs):
+    return [GradyUserFactory().make_student(
+        username=student['username'],
+        exam=ExamType.objects.get(module_reference=student['exam'])
+    ) for student in students]
+
+
+def make_tutors(tutors=[], **kwargs):
+    return [GradyUserFactory().make_tutor(**tutor)
+            for tutor in tutors]
+
+
+def make_reviewers(reviewers=[], **kwargs):
+    return [GradyUserFactory().make_tutor(**reviewer)
+            for reviewer in reviewers]
+
+
+def make_feedback(feedback, submission_object):
+    tutor = User.objects.get(
+        username=feedback['of_tutor']).get_associated_user()
+    return Feedback.objects.update_or_create(
+        of_submission=submission_object,
+        of_tutor=tutor,
+        defaults={
+            'text': feedback['text'],
+            'score': feedback['score']
+        })[0]
+
+
+def make_submissions(submissions=[], **kwargs):
+    submission_objects = []
+    for submission in submissions:
+        submission_type, _ = SubmissionType.objects.get_or_create(
+            name=submission.get('type', 'Auto generated type'))
+        student, _ = Student.objects.get_or_create(user=User.objects.get(
+            username=submission.get('user', 'default_user')
+        ))
+        submission_object, _ = Submission.objects.get_or_create(
+            type=submission_type, student=student, defaults={
+                'seen_by_student': submission.get('seen_by_student', False),
+                'text': submission.get('text', ''),
+            })
+        if 'feedback' in submission:
+            make_feedback(submission['feedback'], submission_object)
+        submission_objects.append(submission_object)
+    return submission_objects
+
+
+def make_test_data(data_dict):
+    return {
+        'exams': make_exams(**data_dict),
+        'submission_types': make_submission_types(**data_dict),
+        'students': make_students(**data_dict),
+        'tutors': make_tutors(**data_dict),
+        'reviewers': make_reviewers(**data_dict),
+        'submissions': make_submissions(**data_dict)
+    }
+
+
+def init_test_instance():
+    return make_test_data(
+        data_dict={
+            'exams': [{
+                'module_reference': 'Test Exam 01',
+                'total_score': 100,
+                'pass_score': 60,
+            }],
+            'submission_types': [
+                {
+                    'name': '01. Sort this or that',
+                    'full_score': 35,
+                    'description': 'Very complicated',
+                    'solution': 'Trivial!'
+                },
+                {
+                    'name': '02. Merge this or that or maybe even this',
+                    'full_score': 35,
+                    'description': 'Very complicated',
+                    'solution': 'Trivial!'
+                },
+                {
+                    'name': '03. This one exists for the sole purpose to test',
+                    'full_score': 30,
+                    'description': 'Very complicated',
+                    'solution': 'Trivial!'
+                }
+            ],
+            'students': [{
+                'username': 'student01',
+                'exam': 'Test Exam 01',
+            }],
+            'tutors': [{
+                'username': 'tutor01'
+            }],
+            'reviewers': [{
+                'username': 'reviewer01'
+            }],
+            'submissions': [
+                {
+                    'text': 'function blabl\n'
+                            '   on multi lines\n'
+                            '       for blabla in bla:\n'
+                            '   arrrgh\n'
+                            '       asasxasx\n'
+                            '           lorem ipsum und so\n',
+                    'type': '01. Sort this or that',
+                    'user': 'student01',
+                    'feedback': {
+                        'text': 'Not good!',
+                        'score': 5,
+                        'of_tutor': 'tutor01',
+                    }
+                },
+                {
+                    'text': 'function blabl\n'
+                            '   on multi lines\n'
+                            '       for blabla in bla:\n'
+                            '   arrrgh\n'
+                            '       asasxasx\n'
+                            '           lorem ipsum und so\n',
+                    'type': '02. Merge this or that or maybe even this',
+                    'user': 'student01',
+                    'feedback': {
+                        'text': 'A little bit better!',
+                        'score': 10,
+                        'of_tutor': 'tutor01',
+                    },
+                },
+                {
+                    'text': 'function blabl\n'
+                            '   on multi lines\n'
+                            '       for blabla in bla:\n'
+                            '   arrrgh\n'
+                            '       asasxasx\n'
+                            '           lorem ipsum und so\n',
+                    'type': '03. This one exists for the sole purpose to test',
+                    'user': 'student01',
+                    'feedback': {
+                        'text': 'Awesome!',
+                        'score': 30,
+                        'of_tutor': 'tutor01',
+                    },
+                },
+            ],}
+    )