diff --git a/.pylintrc b/.pylintrc
index 7b3eea25625171d7c0e7d67de3ae6a3f2db83cf2..09b688ca5ca2d49df263bfbd2d19c00bafd5ef60 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -10,4 +10,5 @@ disable=line-too-long,
         arguments-differ,
         invalid-name,
         no-else-raise,
+        arguments-renamed,
 
diff --git a/README.md b/README.md
index 075146a4cb0ac01f5e58a25ff1f64718db803781..d88c851df0e42011cb185053bba899c9d85c5cc8 100644
--- a/README.md
+++ b/README.md
@@ -134,4 +134,9 @@ instead of returning Result(data), the paginator needs to be used again so it ca
 return paginator.get_paginated_response(serializer.data)
 ```
 
-This function already returns a fully valid Response, so it can be directly returned.
\ No newline at end of file
+This function already returns a fully valid response, so it can be directly returned.
+
+
+## Our Handling of REST Standards
+
+In our usecase of the Admin Frontend, we either explicitly work on objects we chose from a list of given objects, or we create a new object all together. Because of these circumstances, it is not relevant for the PUT request to create new objects entirely, since we know that all objects currently being edited exist. This means that the PUT implementations in `views.py` do not create new objects if called with an unknown primary key. Instead, they are similar to PATCH, but require all fields to be sent along instead of just a portion of them as PATCH does.
\ No newline at end of file
diff --git a/unisportomat/course_scraper/course_scraper.py b/unisportomat/quiz/course_scraper/course_scraper.py
similarity index 93%
rename from unisportomat/course_scraper/course_scraper.py
rename to unisportomat/quiz/course_scraper/course_scraper.py
index 4c4a7103633a2b69de4ccd6f760bbe57c843e6f3..855a951c21bbf77c6e02302e14f57c2992c50ab1 100644
--- a/unisportomat/course_scraper/course_scraper.py
+++ b/unisportomat/quiz/course_scraper/course_scraper.py
@@ -5,6 +5,7 @@ for http://www.buchsys.de for SWP UniSport-O-Mat.
 
 import requests
 from bs4 import BeautifulSoup
+from collections import OrderedDict
 
 
 def fetch_website(url):
@@ -27,14 +28,14 @@ def fetch_website(url):
         raise
 
 
-def scraping(site=None) -> dict:
+def scraping(site=None) -> OrderedDict:
     """
     Returns a dictionary of the form {name: link},
     containing the scraped content of
     https://www.buchsys.de/fu-berlin/angebote/aktueller_zeitraum/index.html,
     unless another URL is given as an argument.
     """
-    courses = {}
+    courses = OrderedDict()
 
     if site is None:
         site = "https://www.buchsys.de/fu-berlin/angebote/aktueller_zeitraum/"
diff --git a/unisportomat/course_scraper/test_course_scraper.py b/unisportomat/quiz/course_scraper/test_course_scraper.py
similarity index 85%
rename from unisportomat/course_scraper/test_course_scraper.py
rename to unisportomat/quiz/course_scraper/test_course_scraper.py
index 62909ec52d70d6e7cee664b28aaf2eedd181253f..b48a3f437b6e084b44687ad95a13ab848a7aa542 100644
--- a/unisportomat/course_scraper/test_course_scraper.py
+++ b/unisportomat/quiz/course_scraper/test_course_scraper.py
@@ -3,6 +3,7 @@ Testing module, yo. Just for the course_scraper.py.
 """
 from django.test import TestCase
 from course_scraper import scraping  # , fetch_website
+from collections import OrderedDict
 
 
 class ScraperTestCase(TestCase):
@@ -15,7 +16,7 @@ class ScraperTestCase(TestCase):
         """
         Testing return type of scraping().
         """
-        self.assertIsInstance(scraping(), dict)
+        self.assertIsInstance(scraping(), OrderedDict)
 
     def test_dict_not_empty(self):
         """
diff --git a/unisportomat/quiz/management/commands/seed_db.py b/unisportomat/quiz/management/commands/seed_db.py
index c1d32d105a7259013226305b519da8a6adb65096..36270c940a091efad080543a29b7441dea5d802b 100644
--- a/unisportomat/quiz/management/commands/seed_db.py
+++ b/unisportomat/quiz/management/commands/seed_db.py
@@ -133,11 +133,12 @@ class Command(BaseCommand):
             ),
             ("Mache vor der nächsten Frage 3 Jumping Jacks", "Do Three Jumping Jacks."),
         ]
-        image = SimpleUploadedFile(
-            name="test_image.png",
-            content=open("quiz/fixtures/images/test_image.png", "rb").read(),
-            content_type="image/png",
-        )
+        with open("quiz/fixtures/images/test_image.png", "rb") as read_file:
+            image = SimpleUploadedFile(
+                name="test_image.png",
+                content=read_file.read(),
+                content_type="image/png",
+            )
 
         for text in calls_to_move:
             activate("de")
@@ -161,11 +162,13 @@ class Command(BaseCommand):
                 "That proper training prevents heart disease?",
             ),
         ]
-        image = SimpleUploadedFile(
-            name="logo.png",
-            content=open("quiz/fixtures/images/logo.png", "rb").read(),
-            content_type="image/png",
-        )
+
+        with open("quiz/fixtures/images/logo.png", "rb") as read_file:
+            image = SimpleUploadedFile(
+                name="logo.png",
+                content=read_file.read(),
+                content_type="image/png",
+            )
         for text in knowledge_snacks:
             activate("de")
             k_s = KnowledgeSnack(text=text[0], image=image)
diff --git a/unisportomat/quiz/migrations/0007_auto_20210626_1130.py b/unisportomat/quiz/migrations/0007_auto_20210626_1130.py
new file mode 100644
index 0000000000000000000000000000000000000000..d9c59dfc3dd3e02c0a93db350c2bb9012efaa96a
--- /dev/null
+++ b/unisportomat/quiz/migrations/0007_auto_20210626_1130.py
@@ -0,0 +1,30 @@
+# Generated by Django 3.2 on 2021-06-26 11:30
+
+import datetime
+from django.db import migrations, models
+import quiz.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("quiz", "0006_auto_20210612_1230"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="sport",
+            name="currently_active",
+            field=models.BooleanField(default=True),
+        ),
+        migrations.AddField(
+            model_name="sport",
+            name="last_used",
+            field=models.DateField(default=datetime.date(2021, 6, 26)),
+        ),
+        migrations.AlterField(
+            model_name="criterionrating",
+            name="rating",
+            field=models.IntegerField(validators=[quiz.models.validate_rating]),
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0008_alter_sport_last_used.py b/unisportomat/quiz/migrations/0008_alter_sport_last_used.py
new file mode 100644
index 0000000000000000000000000000000000000000..5a5e06b96d2149901c63a005ff9e5a1c72e2e64e
--- /dev/null
+++ b/unisportomat/quiz/migrations/0008_alter_sport_last_used.py
@@ -0,0 +1,22 @@
+# Generated by Django 3.2 on 2021-06-26 11:32
+
+import datetime
+from django.db import migrations, models
+from django.utils.timezone import utc
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("quiz", "0007_auto_20210626_1130"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="sport",
+            name="last_used",
+            field=models.DateField(
+                default=datetime.datetime(2021, 6, 26, 11, 32, 52, 231135, tzinfo=utc)
+            ),
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0009_alter_sport_last_used.py b/unisportomat/quiz/migrations/0009_alter_sport_last_used.py
new file mode 100644
index 0000000000000000000000000000000000000000..fdff24a74c6ede72aded2b24ca5c01f2a4973231
--- /dev/null
+++ b/unisportomat/quiz/migrations/0009_alter_sport_last_used.py
@@ -0,0 +1,22 @@
+# Generated by Django 3.2 on 2021-06-26 11:33
+
+import datetime
+from django.db import migrations, models
+from django.utils.timezone import utc
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("quiz", "0008_alter_sport_last_used"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="sport",
+            name="last_used",
+            field=models.DateField(
+                default=datetime.datetime(2021, 6, 26, 11, 33, 26, 967602, tzinfo=utc)
+            ),
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0010_alter_sport_last_used.py b/unisportomat/quiz/migrations/0010_alter_sport_last_used.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf01355db7f84777abbb3babee4c85baa4ad77e6
--- /dev/null
+++ b/unisportomat/quiz/migrations/0010_alter_sport_last_used.py
@@ -0,0 +1,22 @@
+# Generated by Django 3.2 on 2021-06-26 11:39
+
+import datetime
+from django.db import migrations, models
+from django.utils.timezone import utc
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("quiz", "0009_alter_sport_last_used"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="sport",
+            name="last_used",
+            field=models.DateTimeField(
+                default=datetime.datetime(2021, 6, 26, 11, 39, 12, 106108, tzinfo=utc)
+            ),
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0011_alter_sport_last_used.py b/unisportomat/quiz/migrations/0011_alter_sport_last_used.py
new file mode 100644
index 0000000000000000000000000000000000000000..798a23521e313425f1f3b2ea274e5c976bde3d5b
--- /dev/null
+++ b/unisportomat/quiz/migrations/0011_alter_sport_last_used.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.2 on 2021-06-26 11:39
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("quiz", "0010_alter_sport_last_used"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="sport",
+            name="last_used",
+            field=models.DateField(default=django.utils.timezone.now),
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0012_merge_20210627_2254.py b/unisportomat/quiz/migrations/0012_merge_20210627_2254.py
new file mode 100644
index 0000000000000000000000000000000000000000..10c78f769bbe9f298834ac459242b60bd1abc907
--- /dev/null
+++ b/unisportomat/quiz/migrations/0012_merge_20210627_2254.py
@@ -0,0 +1,13 @@
+# Generated by Django 3.2 on 2021-06-27 22:54
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("quiz", "0008_auto_20210627_1812"),
+        ("quiz", "0011_alter_sport_last_used"),
+    ]
+
+    operations = []
diff --git a/unisportomat/quiz/migrations/0013_auto_20210628_1751.py b/unisportomat/quiz/migrations/0013_auto_20210628_1751.py
new file mode 100644
index 0000000000000000000000000000000000000000..4035eed73d5d5e03b4a51a0f179838c877f3dafe
--- /dev/null
+++ b/unisportomat/quiz/migrations/0013_auto_20210628_1751.py
@@ -0,0 +1,52 @@
+# Generated by Django 3.2 on 2021-06-28 17:51
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("quiz", "0012_merge_20210627_2254"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="GreetingEndTexts",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "greeting",
+                    models.TextField(default="Willkommen zum Uni-Sport-O-Mat!"),
+                ),
+                (
+                    "greeting_de",
+                    models.TextField(
+                        default="Willkommen zum Uni-Sport-O-Mat!", null=True
+                    ),
+                ),
+                (
+                    "greeting_en",
+                    models.TextField(
+                        default="Willkommen zum Uni-Sport-O-Mat!", null=True
+                    ),
+                ),
+                ("end", models.TextField(default="Wähle deinen Sport!")),
+                ("end_de", models.TextField(default="Wähle deinen Sport!", null=True)),
+                ("end_en", models.TextField(default="Wähle deinen Sport!", null=True)),
+            ],
+        ),
+        migrations.AlterField(
+            model_name="sport",
+            name="last_used",
+            field=models.DateField(default=django.utils.timezone.localdate),
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0014_auto_20210628_1850.py b/unisportomat/quiz/migrations/0014_auto_20210628_1850.py
new file mode 100644
index 0000000000000000000000000000000000000000..de98942795110aa6175d146d46e3a856af9a0da9
--- /dev/null
+++ b/unisportomat/quiz/migrations/0014_auto_20210628_1850.py
@@ -0,0 +1,60 @@
+# Generated by Django 3.2 on 2021-06-28 18:50
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("quiz", "0013_auto_20210628_1751"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="EndText",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("text", models.TextField(default="Wähle deinen Sport!")),
+                ("text_de", models.TextField(default="Wähle deinen Sport!", null=True)),
+                ("text_en", models.TextField(default="Wähle deinen Sport!", null=True)),
+            ],
+        ),
+        migrations.CreateModel(
+            name="GreetingText",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("text", models.TextField(default="Willkommen zum Uni-Sport-O-Mat!")),
+                (
+                    "text_de",
+                    models.TextField(
+                        default="Willkommen zum Uni-Sport-O-Mat!", null=True
+                    ),
+                ),
+                (
+                    "text_en",
+                    models.TextField(
+                        default="Willkommen zum Uni-Sport-O-Mat!", null=True
+                    ),
+                ),
+            ],
+        ),
+        migrations.DeleteModel(
+            name="GreetingEndTexts",
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0015_merge_0010_auto_20210627_2218_0014_auto_20210628_1850.py b/unisportomat/quiz/migrations/0015_merge_0010_auto_20210627_2218_0014_auto_20210628_1850.py
new file mode 100644
index 0000000000000000000000000000000000000000..b215e53de13aae4f135735a34e50774de27dce72
--- /dev/null
+++ b/unisportomat/quiz/migrations/0015_merge_0010_auto_20210627_2218_0014_auto_20210628_1850.py
@@ -0,0 +1,13 @@
+# Generated by Django 3.2 on 2021-07-02 13:29
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("quiz", "0010_auto_20210627_2218"),
+        ("quiz", "0014_auto_20210628_1850"),
+    ]
+
+    operations = []
diff --git a/unisportomat/quiz/models.py b/unisportomat/quiz/models.py
index d832f508ad22c6e3c0fe68974defca77a8c7e575..7299a22679504cb7f9ad75304704f6683b42a616 100644
--- a/unisportomat/quiz/models.py
+++ b/unisportomat/quiz/models.py
@@ -3,6 +3,7 @@ import base64
 from django.core.files.uploadedfile import SimpleUploadedFile
 from django.core.exceptions import ValidationError
 from django.db import models
+from django.utils import timezone
 
 
 def validate_rating(value):
@@ -42,9 +43,11 @@ class SportManager(models.Manager):
 
     def create_sport(self, **kwargs):
         """
-        Creates new Sport Object and every CriterionRating for it
+        Creates new sport object and every CriterionRating for it
         """
         sport = self.create(**kwargs)
+        sport.currently_active = True
+        sport.last_used = timezone.localdate()
 
         for crit in Criterion.objects.iterator():
             sport.rate(crit, -1)
@@ -54,15 +57,23 @@ class SportManager(models.Manager):
 
 class Sport(models.Model):
     """
-    Defines a Sport with name, url that leads to the booking page.
+    Defines a sport with name, url that leads to the booking page.
     A sport includes ratings for all criterions.
     (e.g. How much it corresponds to the criterion "Martial Arts")
+    TODO: last_used may be changed in the future to better work with other functionalities, eg. statistics.
     """
 
     name = models.TextField()
     url = models.URLField()
     criteria_ratings = models.ManyToManyField("Criterion", through="CriterionRating")
 
+    # The Date Field last_used is set to now-time everytime a sport is activated
+    # Either through manual activation or activation through the scraper
+    last_used = models.DateField(default=timezone.localdate)
+
+    # Boolean currently_active states whether the sport is in the archive or not
+    currently_active = models.BooleanField(default=True)
+
     objects = SportManager()
 
     def __str__(self):
@@ -94,6 +105,13 @@ class Sport(models.Model):
 
         return True
 
+    def reactivate(self):
+        """
+        Sets currently_active to True and updates the last_used Date
+        """
+        self.currently_active = True
+        self.last_used = timezone.localdate()
+
 
 class CriterionManager(models.Manager):
     """
@@ -345,3 +363,27 @@ class QuestionOrderEntry(models.Model):
 
     def __str__(self):
         return f"Entry {self.order_id}: {self.type_of_slot}"
+
+
+class GreetingText(models.Model):
+    """
+    Database with only one row (if everything is done right)
+    Includes start text as column
+    """
+
+    text = models.TextField(default="Willkommen zum Uni-Sport-O-Mat!")
+
+    def __str__(self):
+        return f"{self.text}"
+
+
+class EndText(models.Model):
+    """
+    Database with only one row (if everything is done right)
+    Includes end text as column
+    """
+
+    text = models.TextField(default="Wähle deinen Sport!")
+
+    def __str__(self):
+        return f"{self.text}"
diff --git a/unisportomat/quiz/serializers.py b/unisportomat/quiz/serializers.py
index feced60febcc558e401f81e625abbe3952992b1c..0e295cfbce7f6ee7de3285c1c835bf664f509940 100644
--- a/unisportomat/quiz/serializers.py
+++ b/unisportomat/quiz/serializers.py
@@ -80,6 +80,8 @@ class SingleSportSerializer(serializers.BaseSerializer):
         serialized_data["id"] = sport.pk
         serialized_data["name"] = sport.name
         serialized_data["url"] = sport.url
+        serialized_data["currently_active"] = sport.currently_active
+        serialized_data["last_used"] = sport.last_used
 
         criteria = []
 
@@ -117,6 +119,9 @@ class SingleSportSerializer(serializers.BaseSerializer):
         if "url" in request.data.keys():
             sport_dictionary["url"] = request.data["url"]
 
+        if "currently_active" in request.data.keys():
+            sport_dictionary["currently_active"] = request.data["currently_active"]
+
         # If the Sport is only now created with a POST-Request, no Criteria can be filled out for it
         # This is because the Admin Frontend doesn't have a list of Criteria ready
         if "criteria" in request.data.keys():
@@ -377,3 +382,47 @@ class SingleSnackTivitySerializer(serializers.BaseSerializer):
         }
 
         return data
+
+
+class ArchiveSerializer(serializers.BaseSerializer):
+    """
+    Serializes Sports in an archive format
+    """
+
+    def to_representation(self, sport_list):
+        """
+        Takes a list of Sport Objects and returns id, name, last_used, url serialized
+        """
+
+        json_sport_list = []
+
+        for sport in sport_list:
+
+            json_sport_list.append(
+                {
+                    "id": sport.pk,
+                    "name": sport.name,
+                    "last_used": sport.last_used,
+                    "url": sport.url,
+                }
+            )
+
+        return json_sport_list
+
+
+class GreetingEndSerializer(serializers.BaseSerializer):
+    """
+    Serializer for GreetingText and EndText
+    """
+
+    def to_representation(self, obj):
+        """
+        Represents the object with German and English text
+        """
+
+        json_obj = {
+            "text_de": obj.text_de,
+            "text_en": obj.text_en,
+        }
+
+        return json_obj
diff --git a/unisportomat/quiz/tests.py b/unisportomat/quiz/tests.py
index d4879d0a64d6c9c8e9ff760699421cb877bbe6fd..c20a00c436724370ab6e5e06ec2946b4b40b5ecf 100644
--- a/unisportomat/quiz/tests.py
+++ b/unisportomat/quiz/tests.py
@@ -1,6 +1,7 @@
 """ This module tests all our quiz models"""
 
 import os
+import re
 import shutil
 import tempfile
 import shutil
@@ -8,6 +9,7 @@ import shutil
 from django.core.files.uploadedfile import SimpleUploadedFile
 from django.core.management import call_command
 from django.utils.translation import get_language, activate
+from django.utils import timezone
 from django.urls import reverse
 from django.test import TestCase, override_settings
 from rest_framework.test import APITestCase
@@ -404,6 +406,8 @@ class APITest(APITestCase):
             "id": 1,
             "name": "Jiu Jitsu",
             "url": "http://www.test.de",
+            "currently_active": True,
+            "last_used": timezone.localdate(),
             "criteria": [{"id": 1, "name": "Outdoorsport", "value": 1}],
         }
         self.assertDictEqual(response.data, sport_data)
@@ -415,6 +419,7 @@ class APITest(APITestCase):
         sport_data = {
             "name": "Karate",
             "url": "http://www.test2.de",
+            "currently_active": True,
             "criteria": [{"id": 1, "name": "Outdoorsport", "value": 1}],
         }
 
@@ -423,8 +428,12 @@ class APITest(APITestCase):
             data=sport_data,
             format="json",
         )
+
+        response = self.client.get(reverse("small-sport-list-detail", kwargs={"pk": 1}))
+
         self.assertEqual(response.data["name"], sport_data["name"])
         self.assertEqual(response.data["url"], sport_data["url"])
+        self.assertEqual(response.data["currently_active"], True)
         self.assertEqual(len(response.data["criteria"]), Criterion.objects.count())
         self.assertDictEqual(
             response.data["criteria"][0], {"id": 1, "name": "Outdoorsport", "value": 1}
@@ -443,6 +452,9 @@ class APITest(APITestCase):
             data=sport_data,
             format="json",
         )
+
+        response = self.client.get(reverse("small-sport-list-detail", kwargs={"pk": 1}))
+
         self.assertEqual(response.data["name"], "Jiu Jitsu")
         self.assertEqual(response.data["url"], "http://www.test.de")
         self.assertEqual(len(response.data["criteria"]), Criterion.objects.count())
@@ -638,6 +650,127 @@ class APITest(APITestCase):
 
         self.assertEqual(response.data["results"], [])
 
+    def test_currently_active(self):
+        """
+        Tests if PATCHing the 'currently_active' value to false correctly changes the sport
+        """
+
+        # Set Up Values
+        response = self.client.patch(
+            reverse("small-sport-list-detail", kwargs={"pk": 1}),
+            data={"currently_active": False},
+            format="json",
+        )
+
+        response = self.client.get(reverse("small-sport-list-detail", kwargs={"pk": 1}))
+
+        self.assertEqual(response.data["currently_active"], False)
+
+    def test_sport_archive(self):
+        """
+        Tests whether a sport is correctly displayed in the archive
+        """
+
+        # Get initial State of Archive
+        response = self.client.get(reverse("archive"))
+
+        self.assertEqual(response.data["results"], [])
+
+        # Change State of Sport
+        response = self.client.patch(
+            reverse("small-sport-list-detail", kwargs={"pk": 1}),
+            data={"currently_active": False},
+            format="json",
+        )
+
+        # Check whether the Archive changed
+        response = self.client.get(reverse("archive"))
+
+        self.assertEqual(response.data["results"][0]["id"], 1)
+        self.assertEqual(response.data["results"][0]["name"], "Jiu Jitsu")
+
+    def test_sport_scraper(self):
+        """
+        Tests what the SportScrapingAPI returns
+        """
+
+        # Get small-sport-list
+        sport_response = self.client.get(reverse("small-sport-list-list"))
+        self.assertEqual(len(sport_response.data["results"]), 1)
+
+        # Get Diff List
+        response = self.client.get(reverse("scraper"))
+
+        # Check for Length
+        # At the moment of the Test, 124 Sports are in buchsys
+        # (Might Break in new Semester with new Sports!)
+        self.assertEqual(len(response.data["results"]), 124 + 1)
+
+        # Send Diff back to Server
+        response = self.client.post(
+            reverse("scraper"), response.data["results"], format="json"
+        )
+
+        sport_response = self.client.get(reverse("small-sport-list-list"))
+        self.assertEqual(len(sport_response.data["results"]), 124 + 1)
+
+        sport_response = self.client.get(reverse("archive"))
+        self.assertEqual(len(sport_response.data["results"]), 1)
+
+    def test_greeting_view(self):
+        """
+        Test whether the greeting behaves correctly
+        """
+
+        response = self.client.get(reverse("greeting"))
+
+        self.assertEqual(response.data["text_de"], "Willkommen zum Uni-Sport-O-Mat!")
+        self.assertEqual(response.data["text_de"], response.data["text_en"])
+
+        # Test whether new Values change correctly
+
+        data = {"text_de": "Hallo", "text_en": "Hi"}
+
+        response = self.client.post(reverse("greeting"), format="json", data=data)
+
+        response = self.client.get(reverse("greeting"))
+
+        self.assertEqual(response.data["text_de"], "Hallo")
+        self.assertEqual(response.data["text_en"], "Hi")
+
+        # If the object is deleted, the default values are returned again
+        response = self.client.delete(reverse("greeting"))
+
+        self.assertEqual(response.data["text_de"], "Willkommen zum Uni-Sport-O-Mat!")
+        self.assertEqual(response.data["text_de"], response.data["text_en"])
+
+    def test_end_view(self):
+        """
+        Test whether the end behaves correctly
+        """
+
+        response = self.client.get(reverse("end"))
+
+        self.assertEqual(response.data["text_de"], "Wähle deinen Sport!")
+        self.assertEqual(response.data["text_de"], response.data["text_en"])
+
+        # Test whether new values change correctly
+
+        data = {"text_de": "Hallo", "text_en": "Hi"}
+
+        response = self.client.post(reverse("end"), format="json", data=data)
+
+        response = self.client.get(reverse("end"))
+
+        self.assertEqual(response.data["text_de"], "Hallo")
+        self.assertEqual(response.data["text_en"], "Hi")
+
+        # If the object is deleted, the default values are returned again
+        response = self.client.delete(reverse("end"))
+
+        self.assertEqual(response.data["text_de"], "Wähle deinen Sport!")
+        self.assertEqual(response.data["text_de"], response.data["text_en"])
+
 
 class APITest_For_Snacks_Activities(APITestCase):
     """Tests the Django API"""
diff --git a/unisportomat/quiz/translation.py b/unisportomat/quiz/translation.py
index 99f4681c570903c200e2a751ec518209868b2ed7..4d8b8adab122620933396be8bf9db3e78642d435 100644
--- a/unisportomat/quiz/translation.py
+++ b/unisportomat/quiz/translation.py
@@ -4,7 +4,7 @@ Here, every Model which needs translation fields is registered.
 
 
 from modeltranslation.translator import register, TranslationOptions
-from .models import Question, CallToMove, KnowledgeSnack
+from .models import Question, CallToMove, KnowledgeSnack, GreetingText, EndText
 
 
 @register(Question)
@@ -41,3 +41,21 @@ class KnowledgeSnackTranslationOptions(TranslationOptions):
     fields = ("text",)
     required_languages = ("de",)
     fallback_values = ("No Translation for this Field",)
+
+
+@register(GreetingText)
+class GreetingTextTranslationOptions(TranslationOptions):
+    """
+    Translation options for GreetingText.
+    """
+
+    fields = ("text",)
+
+
+@register(EndText)
+class EndTextTranslationOptions(TranslationOptions):
+    """
+    Translation options for EndText.
+    """
+
+    fields = ("text",)
diff --git a/unisportomat/quiz/views.py b/unisportomat/quiz/views.py
index c22ff483981471e0a0a6acd4e18b29c0a34bbca7..3f64287e8bd09f84f01444f3d5e654adf47e2dbf 100644
--- a/unisportomat/quiz/views.py
+++ b/unisportomat/quiz/views.py
@@ -2,8 +2,7 @@
 Defines the views for the API
 """
 
-# from django.shortcuts import render
-
+import copy
 from rest_framework import viewsets
 from rest_framework.views import APIView
 from rest_framework.response import Response
@@ -11,6 +10,8 @@ from django.shortcuts import get_object_or_404
 from django.http import HttpResponse
 from .pagination import PageNumberWithPageSizePagination
 
+from .course_scraper.course_scraper import scraping
+
 from .serializers import (
     SingleQuestionSerializer,
     SmallSportListSerializer,
@@ -24,6 +25,8 @@ from .serializers import (
     QuestionOrderSerializer,
     SnackTivityListSerializer,
     SingleSnackTivitySerializer,
+    ArchiveSerializer,
+    GreetingEndSerializer,
 )
 from .models import (
     Sport,
@@ -32,8 +35,11 @@ from .models import (
     QuestionOrderEntry,
     KnowledgeSnack,
     CallToMove,
+    GreetingText,
+    EndText,
 )
 
+
 # Create your views here.
 
 
@@ -176,10 +182,18 @@ class SmallSportListView(viewsets.ViewSet):
         sport.name = request_data["name"]
         sport.url = request_data["url"]
 
+        if request_data["currently_active"] is True and sport.currently_active is False:
+            # If the Sport is just now being activated, update the Date
+            sport.reactivate()
+        else:
+            sport.currently_active = request_data["currently_active"]
+
         # Overwrite Criterion Ratings
         for criterion, value in request_data["criteria"]:
             sport.rate(criterion, value)
 
+        sport.save()
+
         # Re-Serialize changed Sport and Send it back
         response = SingleSportSerializer(sport)
 
@@ -209,9 +223,22 @@ class SmallSportListView(viewsets.ViewSet):
         if "url" in request_data.keys():
             sport.url = request_data["url"]
 
+        if "currently_active" in request_data.keys():
+            if (
+                request_data["currently_active"] is True
+                and sport.currently_active is False
+            ):
+                # If the Sport is just now being activated, update the Date
+                sport.reactivate()
+            else:
+                sport.currently_active = request_data["currently_active"]
+
         # Overwrite Criterion Ratings
-        for criterion, value in request_data["criteria"]:
-            sport.rate(criterion, value)
+        if "criteria" in request_data.keys():
+            for criterion, value in request_data["criteria"]:
+                sport.rate(criterion, value)
+
+        sport.save()
 
         # Re-Serialize changed Sport and Send it back
         response = SingleSportSerializer(sport)
@@ -252,7 +279,7 @@ class IncompleteSportView(APIView):
 
         incomplete_sport_list = []
 
-        for sport in queryset:
+        for sport in Sport.objects.filter(currently_active=True).iterator():
 
             if not sport.is_filled():
                 incomplete_sport_list.append(sport)
@@ -636,3 +663,299 @@ class ActivityView(SnackTivityView):
     """
 
     used_objects = CallToMove
+
+
+class SportArchiveView(APIView):
+    """
+    View for the list of all archived sports (so all sports with currently_active = False)
+    """
+
+    def get(self, request):
+        """
+        GET for api/admin/archive/
+        """
+
+        paginator = PageNumberWithPageSizePagination()
+
+        archived_sports = paginator.paginate_queryset(
+            Sport.objects.filter(currently_active=False).order_by("name"), request
+        )
+
+        response = ArchiveSerializer(archived_sports)
+
+        return paginator.get_paginated_response(response.data)
+
+
+class ScraperView(APIView):
+    """
+    View for the scraper, including GET and POST
+    """
+
+    def get(self, request):  # pylint: disable=too-many-locals
+        """
+        Scrapes the sports currently on the default website,
+        and sends a diff of the current sports and the scraped ones
+        """
+
+        # Scrape sports from their website
+        scraped_sports = scraping()
+
+        # Iterate through DB Sport entries to see which ones are in the new Sport list etc
+        diff_list = []
+
+        id_counter = 1
+
+        empty_diff_dict = {
+            "id": -1,
+            "kind_of_diff": "",
+            "old_sport": {
+                "id": -1,
+                "name": "",
+                "url": "",
+                "last_used": "",
+            },
+            "new_sport": {
+                "name": "",
+                "url": "",
+            },
+        }
+
+        for old_sport in Sport.objects.filter(currently_active=True):
+
+            diff_dict = copy.deepcopy(empty_diff_dict)
+
+            diff_dict["id"] = id_counter
+
+            diff_dict["old_sport"]["id"] = old_sport.pk
+            diff_dict["old_sport"]["name"] = old_sport.name
+            diff_dict["old_sport"]["url"] = old_sport.url
+            diff_dict["old_sport"]["last_used"] = old_sport.last_used
+
+            if old_sport.name in scraped_sports.keys():
+                # A Sport currently active is also found in the new scraped sports
+                # -> "same" Sport
+
+                diff_dict["kind_of_diff"] = "same"
+
+                new_sport_url = scraped_sports.pop(old_sport.name)
+
+                diff_dict["new_sport"]["name"] = old_sport.name
+                diff_dict["new_sport"]["url"] = new_sport_url
+
+            else:
+                # A Sport currently active is _not_ found in the new scraped sports
+                # -> "to_be_archived" Sport
+
+                diff_dict["kind_of_diff"] = "to_be_archived"
+
+            diff_list.append(diff_dict)
+            id_counter += 1
+
+        for new_sport_name, new_sport_url in scraped_sports.items():
+
+            # The query should only contain zero values, or one value.
+            # The name is technically not primary key candidate, but they shouldn't be included more than once
+            query = Sport.objects.filter(name=new_sport_name)
+
+            diff_dict = copy.deepcopy(empty_diff_dict)
+
+            diff_dict["id"] = id_counter
+
+            diff_dict["new_sport"]["name"] = new_sport_name
+            diff_dict["new_sport"]["url"] = new_sport_url
+
+            if query.count() == 0:
+                # The new Sport is not found in the Archive, so it is completely new
+                # -> "new" Sport
+
+                diff_dict["kind_of_diff"] = "new"
+
+            else:
+                # The new Sport is in the Archive, so it needs to be resurrected
+                # -> "from_archive" Sport
+
+                old_sport = query.get(name=new_sport_name)
+
+                diff_dict["kind_of_diff"] = "from_archive"
+
+                diff_dict["old_sport"]["id"] = old_sport.pk
+                diff_dict["old_sport"]["name"] = old_sport.name
+                diff_dict["old_sport"]["url"] = old_sport.url
+                diff_dict["old_sport"]["last_used"] = old_sport.last_used
+
+            diff_list.append(diff_dict)
+            id_counter += 1
+
+        # Paginate it all!
+
+        paginator = PageNumberWithPageSizePagination()
+        paginated_list = paginator.paginate_queryset(diff_list, request)
+
+        return paginator.get_paginated_response(paginated_list)
+
+    def post(self, request):
+        """
+        Gets list of diffs from Frontend and writes them into the database
+        """
+
+        diff_data = request.data
+
+        for diff in diff_data:
+
+            if diff["kind_of_diff"] == "new":
+
+                sport = Sport.objects.create_sport()
+                sport.name = diff["new_sport"]["name"]
+                sport.url = diff["new_sport"]["url"]
+
+            elif diff["kind_of_diff"] == "same":
+                # In case of URL changes, "same" updates the URL
+
+                sport = Sport.objects.get(pk=diff["old_sport"]["id"])
+
+                sport.url = diff["new_sport"]["url"]
+
+                # To update last_used
+                sport.reactivate()
+
+            elif diff["kind_of_diff"] == "to_be_archived":
+
+                sport = Sport.objects.get(pk=diff["old_sport"]["id"])
+                sport.currently_active = False
+
+            else:
+                # -> from_archive
+
+                sport = Sport.objects.get(pk=diff["old_sport"]["id"])
+                sport.reactivate()
+
+                # Same as in "same", URL could be different
+                sport.url = diff["new_sport"]["url"]
+
+            sport.save()
+
+        return Response(status=200)
+
+
+class GreetingEndView(APIView):
+    """
+    View for handling the beginning sentence
+    """
+
+    given_object = None
+
+    def post(self, request):
+        """
+        api/greeting POST
+        Creates a new object if none exist, otherwise forwards to PUT
+        """
+
+        if self.given_object.objects.count() > 0:
+            return self.put(request)
+
+        sentence = self.given_object()  # pylint: disable=not-callable
+
+        if "text_de" in request.data.keys():
+            sentence.text_de = request.data["text_de"]
+
+        if "text_en" in request.data.keys():
+            sentence.text_en = request.data["text_en"]
+
+        sentence.save()
+
+        return Response(GreetingEndSerializer(sentence).data)
+
+    def get(self, request):
+        """
+        api/greeting GET
+        Sends out the greeting
+        """
+
+        sentence = self.given_object.objects.all()
+
+        if sentence.count() == 0:
+            sentence = self.given_object()  # pylint: disable=not-callable
+        else:
+            sentence = sentence.first()
+
+        return Response(GreetingEndSerializer(sentence).data)
+
+    def put(self, request):
+        """
+        api/greeting PUT
+        Overwrites German and English beginning
+        """
+
+        sentence = self.given_object.objects.all()
+
+        if sentence.count() == 0:
+            return Response(status=404)
+
+        sentence = sentence.first()
+
+        sentence.text_de = request.data["text_de"]
+        sentence.text_en = request.data["text_en"]
+
+        sentence.save()
+
+        return Response(GreetingEndSerializer(sentence).data)
+
+    def patch(self, request):
+        """
+        api/greeting PATCH
+        Overwrites German and/or English beginning, if they exist
+        """
+
+        sentence = self.given_object.objects.all()
+
+        if sentence.count() == 0:
+            return Response(status=404)
+
+        sentence = sentence.first()
+
+        if "text_de" in request.data.keys():
+            sentence.text_de = request.data["text_de"]
+        if "text_en" in request.data.keys():
+            sentence.text_en = request.data["text_en"]
+
+        sentence.save()
+
+        return Response(GreetingEndSerializer(sentence).data)
+
+    def delete(self, request):
+        """
+        api/greeting DELETE
+        Deletes the object so default values are reinstated
+        """
+
+        sentence = self.given_object.objects.all()
+
+        if sentence.count() == 0:
+            return Response(status=404)
+
+        sentence = sentence.first()
+
+        sentence.text_de = self.given_object._meta.get_field("text").get_default()
+        sentence.text_en = self.given_object._meta.get_field("text").get_default()
+
+        sentence.save()
+
+        return Response(GreetingEndSerializer(sentence).data)
+
+
+class GreetingView(GreetingEndView):
+    """
+    View for the greeting strings
+    Inherited CRUD from GreetingEndView
+    """
+
+    given_object = GreetingText
+
+
+class EndView(GreetingEndView):
+    """
+    View for the end strings
+    Inherited CRUD from GreetingEndView
+    """
+
+    given_object = EndText
diff --git a/unisportomat/unisportomat/settings.py b/unisportomat/unisportomat/settings.py
index adbb9228cacfb7ea116403efb0431d667824058a..29f9b9d422082d361f676b915ace22a153870bd4 100644
--- a/unisportomat/unisportomat/settings.py
+++ b/unisportomat/unisportomat/settings.py
@@ -60,7 +60,8 @@ MIDDLEWARE = [
 # SOURCE: https://github.com/bmihelac/ra-data-django-rest-framework
 REST_FRAMEWORK = {
     "DEFAULT_PAGINATION_CLASS": "quiz.pagination.PageNumberWithPageSizePagination",
-    "PAGE_SIZE": 10,
+    # Page size can be chosen by Frontend, so we set it high internally to streamline testing
+    "PAGE_SIZE": 1000,
     "DEFAULT_FILTER_BACKENDS": [
         "rest_framework.filters.OrderingFilter",
     ],
diff --git a/unisportomat/unisportomat/urls.py b/unisportomat/unisportomat/urls.py
index 948c5b2286c36507bc2dc3c947fdaf1b6c5da5cb..6996cd330b71f073506ef100e17b342019ca53b1 100644
--- a/unisportomat/unisportomat/urls.py
+++ b/unisportomat/unisportomat/urls.py
@@ -37,4 +37,8 @@ urlpatterns = [
     ),
     path("api/admin/criteria/", views.CriteriaView.as_view(), name="criteria"),
     path("api/admin/question/order", views.QuestionOrderView.as_view(), name="order"),
+    path("api/admin/sport/archive/", views.SportArchiveView.as_view(), name="archive"),
+    path("api/admin/sport/scraper/", views.ScraperView.as_view(), name="scraper"),
+    path("api/admin/greeting/", views.GreetingView.as_view(), name="greeting"),
+    path("api/admin/end/", views.EndView.as_view(), name="end"),
 ]