diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6311e654974104495e8f77e6fa53cb1e9dee9282..b8dafdd4127606f173d7d04afbc827d9e0a6ae53 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,8 +3,8 @@ include:
     file: /ci/general.yml
   - project: "AlekSIS/official/AlekSIS"
     file: /ci/prepare/lock.yml
-  - project: "AlekSIS/official/AlekSIS"
-    file: /ci/test/test.yml
+  #  - project: "AlekSIS/official/AlekSIS"
+  #    file: /ci/test/test.yml
   - project: "AlekSIS/official/AlekSIS"
     file: /ci/test/lint.yml
   - project: "AlekSIS/official/AlekSIS"
diff --git a/aleksis/apps/chronos/tests/test_notifications.py b/aleksis/apps/chronos/tests/test_notifications.py
deleted file mode 100644
index 2e2393cb2b3fa962613615115ce57966b538af7a..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/tests/test_notifications.py
+++ /dev/null
@@ -1,269 +0,0 @@
-from datetime import date, time
-
-from django.db import transaction
-from django.db.models.signals import m2m_changed, post_delete, post_save, pre_delete
-from django.test import TransactionTestCase, override_settings
-
-import pytest
-
-from aleksis.apps.chronos.models import (
-    Event,
-    ExtraLesson,
-    Lesson,
-    LessonPeriod,
-    LessonSubstitution,
-    Subject,
-    SupervisionSubstitution,
-    TimePeriod,
-)
-from aleksis.apps.chronos.util.change_tracker import TimetableDataChangeTracker
-from aleksis.core.models import Group, Person, Room, SchoolTerm
-
-pytestmark = pytest.mark.django_db
-
-
-@override_settings(CELERY_BROKER_URL="memory://localhost//")
-class NotificationTests(TransactionTestCase):
-    serialized_rollback = True
-
-    def setUp(self):
-        self.school_term = SchoolTerm.objects.create(
-            date_start=date(2020, 1, 1), date_end=date(2020, 12, 31)
-        )
-
-        self.teacher_a = Person.objects.create(
-            first_name="Teacher", last_name="A", short_name="A", email="test1@example.org"
-        )
-        self.teacher_b = Person.objects.create(
-            first_name="Teacher", last_name="B", short_name="B", email="test2@example.org"
-        )
-
-        self.student_a = Person.objects.create(
-            first_name="Student", last_name="A", email="test3@example.org"
-        )
-        self.student_b = Person.objects.create(
-            first_name="Student", last_name="B", email="test4@example.org"
-        )
-        self.student_c = Person.objects.create(
-            first_name="Student", last_name="C", email="test5@example.org"
-        )
-        self.student_d = Person.objects.create(
-            first_name="Student", last_name="D", email="test6@example.org"
-        )
-        self.student_e = Person.objects.create(
-            first_name="Student", last_name="E", email="test7@example.org"
-        )
-
-        self.group_a = Group.objects.create(
-            name="Class 9a", short_name="9a", school_term=self.school_term
-        )
-        self.group_a.owners.add(self.teacher_a)
-        self.group_a.members.add(self.student_a, self.student_b, self.student_c)
-        self.group_b = Group.objects.create(
-            name="Class 9b", short_name="9b", school_term=self.school_term
-        )
-        self.group_b.owners.add(self.teacher_b)
-        self.group_b.members.add(self.student_c, self.student_d, self.student_e)
-
-        self.time_period_a = TimePeriod.objects.create(
-            weekday=0, period=1, time_start=time(8, 0), time_end=time(9, 0)
-        )
-        self.time_period_b = TimePeriod.objects.create(
-            weekday=1, period=2, time_start=time(9, 0), time_end=time(10, 0)
-        )
-
-        self.subject_a = Subject.objects.create(name="English", short_name="En")
-        self.subject_b = Subject.objects.create(name="Deutsch", short_name="De")
-
-        self.room_a = Room.objects.create(short_name="004", name="Room 0.04")
-        self.room_b = Room.objects.create(short_name="005", name="Room 0.05")
-
-        self.lesson = Lesson.objects.create(subject=self.subject_a)
-        self.lesson.groups.set([self.group_a])
-        self.lesson.teachers.set([self.teacher_a])
-
-        self.period_1 = LessonPeriod.objects.create(
-            period=self.time_period_a, room=self.room_a, lesson=self.lesson
-        )
-        self.period_2 = LessonPeriod.objects.create(
-            period=self.time_period_b, room=self.room_a, lesson=self.lesson
-        )
-
-    def _parse_receivers(self, receivers):
-        return [str(r[1]) for r in receivers]
-
-    def test_signal_registration(self):
-        for model in [Event, LessonSubstitution, ExtraLesson, SupervisionSubstitution]:
-            assert "TimetableDataChangeTracker._handle_save" not in "".join(
-                [str(r) for r in post_save._live_receivers(model)]
-            )
-
-        for model in [Event, LessonSubstitution, ExtraLesson, SupervisionSubstitution]:
-            assert "TimetableDataChangeTracker._handle_delete" not in "".join(
-                [str(r) for r in post_delete._live_receivers(model)]
-            )
-
-        assert "TimetableDataChangeTracker._handle_m2m_changed" not in "".join(
-            [str(r) for r in m2m_changed._live_receivers(LessonSubstitution.teachers.through)]
-        )
-        assert "TimetableDataChangeTracker._handle_m2m_changed" not in "".join(
-            [str(r) for r in m2m_changed._live_receivers(Event.teachers.through)]
-        )
-        assert "TimetableDataChangeTracker._handle_m2m_changed" not in "".join(
-            [str(r) for r in m2m_changed._live_receivers(Event.groups.through)]
-        )
-        assert "TimetableDataChangeTracker._handle_m2m_changed" not in "".join(
-            [str(r) for r in m2m_changed._live_receivers(ExtraLesson.teachers.through)]
-        )
-        assert "TimetableDataChangeTracker._handle_m2m_changed" not in "".join(
-            [str(r) for r in m2m_changed._live_receivers(ExtraLesson.groups.through)]
-        )
-        assert "TimetableDataChangeTracker._handle_m2m_changed" not in "".join(
-            [str(r) for r in m2m_changed._live_receivers(ExtraLesson.groups.through)]
-        )
-
-        with transaction.atomic():
-            tracker = TimetableDataChangeTracker()
-
-            for model in [Event, LessonSubstitution, ExtraLesson, SupervisionSubstitution]:
-                assert "TimetableDataChangeTracker._handle_save" in "".join(
-                    [str(r) for r in post_save._live_receivers(model)]
-                )
-
-            for model in [Event, LessonSubstitution, ExtraLesson, SupervisionSubstitution]:
-                assert "TimetableDataChangeTracker._handle_delete" in "".join(
-                    [str(r) for r in pre_delete._live_receivers(model)]
-                )
-
-            assert "TimetableDataChangeTracker._handle_m2m_changed" in "".join(
-                [str(r) for r in m2m_changed._live_receivers(LessonSubstitution.teachers.through)]
-            )
-            assert "TimetableDataChangeTracker._handle_m2m_changed" in "".join(
-                [str(r) for r in m2m_changed._live_receivers(Event.teachers.through)]
-            )
-            assert "TimetableDataChangeTracker._handle_m2m_changed" in "".join(
-                [str(r) for r in m2m_changed._live_receivers(Event.groups.through)]
-            )
-            assert "TimetableDataChangeTracker._handle_m2m_changed" in "".join(
-                [str(r) for r in m2m_changed._live_receivers(ExtraLesson.teachers.through)]
-            )
-            assert "TimetableDataChangeTracker._handle_m2m_changed" in "".join(
-                [str(r) for r in m2m_changed._live_receivers(ExtraLesson.groups.through)]
-            )
-
-    def test_outside_transaction(self):
-        with pytest.raises(RuntimeError):
-            TimetableDataChangeTracker()
-
-    def test_create_detection(self):
-        with transaction.atomic():
-            tracker = TimetableDataChangeTracker()
-
-            assert not tracker.changes
-
-            lesson_substitution = LessonSubstitution.objects.create(
-                week=20, year=2020, lesson_period=self.period_1, cancelled=True
-            )
-
-            assert tracker.changes
-
-            assert len(tracker.changes) == 1
-            change = tracker.changes[tracker.get_instance_key(lesson_substitution)]
-            assert change.instance == lesson_substitution
-            assert change.created
-            assert not change.deleted
-            assert not change.changed_fields
-
-            lesson_substitution.cancelled = False
-            lesson_substitution.subject = self.subject_b
-            lesson_substitution.save()
-
-            assert len(tracker.changes) == 1
-            change = tracker.changes[tracker.get_instance_key(lesson_substitution)]
-            assert change.instance == lesson_substitution
-            assert change.created
-            assert not change.deleted
-            assert change.changed_fields
-
-    def test_change_detection(self):
-        with transaction.atomic():
-            lesson_substitution = LessonSubstitution.objects.create(
-                week=20, year=2020, lesson_period=self.period_1, cancelled=True
-            )
-
-            tracker = TimetableDataChangeTracker()
-
-            assert not tracker.changes
-
-            lesson_substitution.cancelled = False
-            lesson_substitution.subject = self.subject_b
-            lesson_substitution.save()
-
-            assert len(tracker.changes) == 1
-            change = tracker.changes[tracker.get_instance_key(lesson_substitution)]
-            assert change.instance == lesson_substitution
-            assert not change.created
-            assert not change.deleted
-            assert set(change.changed_fields.keys()) == {"cancelled", "subject_id"}
-
-            assert change.changed_fields["cancelled"]
-            assert change.changed_fields["subject_id"] is None
-
-            lesson_substitution.teachers.add(self.teacher_a)
-
-            assert len(tracker.changes) == 1
-            change = tracker.changes[tracker.get_instance_key(lesson_substitution)]
-            assert change.instance == lesson_substitution
-            assert not change.created
-            assert not change.deleted
-            assert set(change.changed_fields.keys()) == {"cancelled", "subject_id", "teachers"}
-
-            assert change.changed_fields["teachers"] == []
-
-            lesson_substitution.teachers.remove(self.teacher_a)
-
-            assert len(tracker.changes) == 1
-            change = tracker.changes[tracker.get_instance_key(lesson_substitution)]
-            assert change.instance == lesson_substitution
-            assert not change.created
-            assert not change.deleted
-            assert set(change.changed_fields.keys()) == {"cancelled", "subject_id", "teachers"}
-
-            assert change.changed_fields["teachers"] == []
-
-        with transaction.atomic():
-            lesson_substitution.teachers.add(self.teacher_a)
-
-            tracker = TimetableDataChangeTracker()
-
-            lesson_substitution.teachers.remove(self.teacher_a)
-
-            assert len(tracker.changes) == 1
-            change = tracker.changes[tracker.get_instance_key(lesson_substitution)]
-            assert change.instance == lesson_substitution
-            assert not change.created
-            assert not change.deleted
-            assert set(change.changed_fields.keys()) == {"teachers"}
-
-            assert change.changed_fields["teachers"] == [self.teacher_a]
-
-    def test_delete_detected(self):
-        lesson_substitution = LessonSubstitution.objects.create(
-            week=20, year=2020, lesson_period=self.period_1, cancelled=True
-        )
-
-        with transaction.atomic():
-            tracker = TimetableDataChangeTracker()
-
-            pk = lesson_substitution.pk
-
-            assert not tracker.changes
-
-            lesson_substitution.delete()
-
-            assert len(tracker.changes) == 1
-            change = tracker.changes[f"lessonsubstitution_{pk}"]
-            assert change.instance == lesson_substitution
-            assert not change.created
-            assert change.deleted
-            assert not change.changed_fields
diff --git a/pyproject.toml b/pyproject.toml
index 843a09f56bcf2c750e650a0a9820c3cc4e251dd1..1f1d194eb6007c7fa6633316d68f84e17373490b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-App-Chronos"
-version = "4.0.0.dev3"
+version = "4.0.0.dev4"
 packages = [
     { include = "aleksis" }
 ]
@@ -51,9 +51,9 @@ priority = "supplemental"
 [tool.poetry.dependencies]
 python = "^3.10"
 calendarweek = "^0.5.0"
-aleksis-core = "^4.0.0.dev5"
+aleksis-core = "^4.0.0.dev6"
 aleksis-app-resint = "^4.0.0.dev1"
-aleksis-app-cursus = "^0.1.dev0"
+aleksis-app-cursus = "^0.1.0.dev1"
 
 
 [tool.poetry.plugins."aleksis.app"]