diff --git a/aleksis/apps/untis/model_extensions.py b/aleksis/apps/untis/model_extensions.py
index fecd602689bba92928b9c3811fae642bb7d26a6e..bf639c33979131509fd63946c0bc3b7ec6f7ad2e 100644
--- a/aleksis/apps/untis/model_extensions.py
+++ b/aleksis/apps/untis/model_extensions.py
@@ -82,3 +82,8 @@ chronos_models.Absence.field(
         verbose_name=_("UNTIS import reference"), null=True, blank=True
     )
 )
+chronos_models.Event.field(
+    import_ref_untis=IntegerField(
+        verbose_name=_("UNTIS import reference"), null=True, blank=True
+    )
+)
diff --git a/aleksis/apps/untis/util/mysql/importers/events.py b/aleksis/apps/untis/util/mysql/importers/events.py
new file mode 100644
index 0000000000000000000000000000000000000000..9c0dccc2a836ede548396d112437c404401afff8
--- /dev/null
+++ b/aleksis/apps/untis/util/mysql/importers/events.py
@@ -0,0 +1,134 @@
+import logging
+
+from aleksis.apps.chronos import models as chronos_models
+
+from .... import models as mysql_models
+from ..util import (
+    run_default_filter,
+    get_term,
+    untis_date_to_date,
+    move_weekday_to_range,
+    get_first_period,
+    get_last_period,
+    connect_untis_fields, sync_m2m,
+)
+
+logger = logging.getLogger(__name__)
+
+
+def import_events(time_periods_ref, teachers_ref, classes_ref, rooms_ref):
+    ref = {}
+
+    # Get term
+    term = get_term()
+    term_date_start = untis_date_to_date(term.datefrom)
+    term_date_end = untis_date_to_date(term.dateto)
+
+    # Get absences
+    events = (
+        run_default_filter(mysql_models.Event.objects, filter_term=False)
+        .filter(datefrom__lte=term.dateto, dateto__gte=term.datefrom)
+        .order_by("event_id")
+    )
+
+    existing_events = []
+    for event in events:
+        import_ref = event.event_id
+
+        logger.info("Import event {}".format(import_ref))
+
+        # Build values
+        comment = event.text
+
+        date_from = untis_date_to_date(event.datefrom)
+        date_to = untis_date_to_date(event.dateto)
+        period_from = event.lessonfrom
+        period_to = event.lessonto
+        weekday_from = date_from.weekday()
+        weekday_to = date_to.weekday()
+
+        # Check min/max weekdays
+        weekday_from = move_weekday_to_range(time_periods_ref, weekday_from)
+        weekday_to = move_weekday_to_range(time_periods_ref, weekday_to)
+
+        # Check min/max periods
+        first_period = get_first_period(time_periods_ref, weekday_from)
+        last_period = get_last_period(time_periods_ref, weekday_from)
+
+        if period_from == 0:
+            period_from = first_period
+        if period_to == 0:
+            period_to = last_period
+
+        time_period_from = time_periods_ref[weekday_from][period_from]
+        time_period_to = time_periods_ref[weekday_to][period_to]
+
+        groups = []
+        teachers = []
+        rooms = []
+
+        # Get groups, teachers and rooms
+        raw_events = connect_untis_fields(event, "eventelement", 10)
+        for raw_event in raw_events:
+            el = raw_event.split("~")
+
+            # Group
+            if el[0] != "0" and el[0] != "":
+                group = classes_ref[int(el[0])]
+                groups.append(group)
+
+            # Teacher
+            if el[2] != "0" and el[2] != "":
+                teacher = teachers_ref[int(el[2])]
+                teachers.append(teacher)
+
+            # Room
+            if el[3] != "0" and el[3] != "":
+                room = rooms_ref[int(el[3])]
+                rooms.append(room)
+
+        new_event, created = chronos_models.Event.objects.get_or_create(
+            import_ref_untis=import_ref,
+            defaults={
+                "date_start": date_from,
+                "date_end": date_to,
+                "period_from": time_period_from,
+                "period_to": time_period_to,
+                "title": comment,
+            },
+        )
+
+        if created:
+            logger.info("  New event created")
+
+        # Sync simple fields
+        if (
+            new_event.date_start != date_from
+            or new_event.date_end != date_to
+            or new_event.period_from != time_period_from
+            or new_event.period_to != time_period_to
+            or new_event.title != comment
+        ):
+            new_event.date_start = date_from
+            new_event.date_end = date_to
+            new_event.period_from = time_period_from
+            new_event.period_to = time_period_to
+            new_event.title = comment
+            new_event.save()
+            logger.info("  Time range and title updated")
+
+        # Sync m2m-fields
+        sync_m2m(groups, new_event.groups)
+        sync_m2m(teachers, new_event.teachers)
+        sync_m2m(rooms, new_event.rooms)
+
+        existing_events.append(import_ref)
+        ref[import_ref] = new_event
+
+        # Delete all no longer existing events
+        for e in chronos_models.Event.objects.filter(
+            date_start__lte=term_date_start, date_end__gte=term_date_end
+        ):
+            if e.import_ref_untis and e.import_ref_untis not in existing_events:
+                logger.info("Event {} deleted".format(e.id))
+                e.delete()
diff --git a/aleksis/apps/untis/util/mysql/main.py b/aleksis/apps/untis/util/mysql/main.py
index b004de24ea86a220c2bf95c4eadf81279e4dc142..15f7230151e0b241cf1e81544e57cc83a4d932ff 100644
--- a/aleksis/apps/untis/util/mysql/main.py
+++ b/aleksis/apps/untis/util/mysql/main.py
@@ -9,6 +9,7 @@ from .importers.common_data import (
     import_breaks,
     import_absence_reasons,
 )
+from .importers.events import import_events
 from .importers.lessons import import_lessons
 from .importers.substitutions import import_substitutions
 
@@ -36,3 +37,6 @@ def untis_import_mysql():
     # Substitutions
     import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes_ref, rooms_ref)
     import_substitutions(teachers_ref, subjects_ref, rooms_ref, classes_ref, supervision_areas_ref)
+
+    # Events
+    import_events(time_periods_ref, teachers_ref, classes_ref, rooms_ref)