diff --git a/aleksis/apps/untis/util/mysql/importers/common_data.py b/aleksis/apps/untis/util/mysql/importers/common_data.py
index 733a50d8f0f4dfa49046275a49ca5233c8a9c7b8..c7bf7d7f815155ec9ef235ce8eae576069346a5d 100644
--- a/aleksis/apps/untis/util/mysql/importers/common_data.py
+++ b/aleksis/apps/untis/util/mysql/importers/common_data.py
@@ -3,6 +3,7 @@ from datetime import time
 from enum import Enum
 from typing import Dict
 
+from aleksis.apps.chronos.models import ValidityRange
 from tqdm import tqdm
 
 from aleksis.apps.chronos import models as chronos_models
@@ -25,12 +26,12 @@ class CommonDataId(Enum):
     PERIOD = 40
 
 
-def import_subjects() -> Dict[int, chronos_models.Subject]:
+def import_subjects(validity_range: ValidityRange) -> Dict[int, chronos_models.Subject]:
     """Import subjects."""
     subjects_ref = {}
 
     # Get subjects
-    subjects = run_default_filter(mysql_models.Subjects.objects, filter_term=False)
+    subjects = run_default_filter(validity_range, mysql_models.Subjects.objects, filter_term=False)
 
     for subject in tqdm(subjects, desc="Import subjects", **TQDM_DEFAULTS):
         # Check if needed data are provided
@@ -92,12 +93,12 @@ def import_subjects() -> Dict[int, chronos_models.Subject]:
     return subjects_ref
 
 
-def import_teachers() -> Dict[int, core_models.Person]:
+def import_teachers(validity_range: ValidityRange) -> Dict[int, core_models.Person]:
     """Import teachers."""
     teachers_ref = {}
 
     # Get teachers
-    teachers = run_default_filter(mysql_models.Teacher.objects)
+    teachers = run_default_filter(validity_range, mysql_models.Teacher.objects)
 
     for teacher in tqdm(teachers, desc="Import teachers", **TQDM_DEFAULTS):
         # Check if needed data are provided
@@ -157,12 +158,12 @@ def import_teachers() -> Dict[int, core_models.Person]:
     return teachers_ref
 
 
-def import_classes(teachers_ref: Dict[int, core_models.Person]) -> Dict[int, core_models.Group]:
+def import_classes(validity_range: ValidityRange, teachers_ref: Dict[int, core_models.Person]) -> Dict[int, core_models.Group]:
     """Import classes."""
     classes_ref = {}
 
     # Get classes
-    course_classes = run_default_filter(mysql_models.Class.objects, filter_term=True)
+    course_classes = run_default_filter(validity_range, mysql_models.Class.objects, filter_term=True)
 
     for class_ in tqdm(course_classes, desc="Import classes", **TQDM_DEFAULTS):
         # Check if needed data are provided
@@ -181,12 +182,12 @@ def import_classes(teachers_ref: Dict[int, core_models.Person]) -> Dict[int, cor
         logger.info("Import class {} (as group) …".format(short_name))
 
         try:
-            new_group = core_models.Group.objects.get(short_name__iexact=short_name)
+            new_group = core_models.Group.objects.get(short_name__iexact=short_name, school_term__in=[None, validity_range.school_term])
         except core_models.Group.DoesNotExist:
             new_group = core_models.Group.objects.create(
-                short_name=short_name, name=name, import_ref_untis=import_ref,
+                short_name=short_name, name=name, import_ref_untis=import_ref, school_term=validity_range.school_term
             )
-            logger.info("  New person created")
+            logger.info("  New group created")
 
         changed = False
 
@@ -208,6 +209,11 @@ def import_classes(teachers_ref: Dict[int, core_models.Person]) -> Dict[int, cor
             changed = True
             logger.info("  Import reference updated")
 
+        if new_group.school_term != validity_range.school_term:
+            new_group.school_term = validity_range.school_term
+            changed = True
+            logger.info("  School term updated")
+
         if changed:
             new_group.save()
 
@@ -223,12 +229,12 @@ def import_classes(teachers_ref: Dict[int, core_models.Person]) -> Dict[int, cor
     return classes_ref
 
 
-def import_rooms() -> Dict[int, chronos_models.Room]:
+def import_rooms(validity_range: ValidityRange) -> Dict[int, chronos_models.Room]:
     """Import rooms."""
     ref = {}
 
     # Get rooms
-    rooms = run_default_filter(mysql_models.Room.objects)
+    rooms = run_default_filter(validity_range, mysql_models.Room.objects)
 
     for room in tqdm(rooms, desc="Import rooms", **TQDM_DEFAULTS):
         if not room.name:
@@ -270,12 +276,12 @@ def import_rooms() -> Dict[int, chronos_models.Room]:
     return ref
 
 
-def import_supervision_areas(breaks_ref, teachers_ref) -> Dict[int, chronos_models.SupervisionArea]:
+def import_supervision_areas(validity_range: ValidityRange, breaks_ref, teachers_ref) -> Dict[int, chronos_models.SupervisionArea]:
     """Import supervision areas."""
     ref = {}
 
     # Get supervision areas
-    areas = run_default_filter(mysql_models.Corridor.objects, filter_term=False)
+    areas = run_default_filter(validity_range, mysql_models.Corridor.objects, filter_term=False)
 
     for area in tqdm(areas, desc="Import supervision areas", **TQDM_DEFAULTS):
         if not area.name:
@@ -390,10 +396,10 @@ def import_supervision_areas(breaks_ref, teachers_ref) -> Dict[int, chronos_mode
     return ref
 
 
-def import_time_periods() -> Dict[int, Dict[int, chronos_models.TimePeriod]]:
+def import_time_periods(validity_range: ValidityRange) -> Dict[int, Dict[int, chronos_models.TimePeriod]]:
     """Import time periods an breaks."""
     times = (
-        run_default_filter(mysql_models.Commondata.objects, filter_term=False)
+        run_default_filter(validity_range, mysql_models.Commondata.objects, filter_term=False)
         .filter(id=30)
         .order_by("number")
     )
@@ -409,7 +415,7 @@ def import_time_periods() -> Dict[int, Dict[int, chronos_models.TimePeriod]]:
         times_ref[period] = (start_time, end_time)
 
     periods = (
-        run_default_filter(mysql_models.Commondata.objects, filter_term=False)
+        run_default_filter(validity_range, mysql_models.Commondata.objects, filter_term=False)
         .filter(id=CommonDataId.PERIOD.value)
         .order_by("number", "number1")
     )
@@ -426,6 +432,7 @@ def import_time_periods() -> Dict[int, Dict[int, chronos_models.TimePeriod]]:
         new_time_period, created = chronos_models.TimePeriod.objects.get_or_create(
             weekday=weekday,
             period=period,
+            validity=validity_range,
             defaults={"time_start": start_time, "time_end": end_time},
         )
 
@@ -447,7 +454,7 @@ def import_time_periods() -> Dict[int, Dict[int, chronos_models.TimePeriod]]:
 
 
 def import_breaks(
-    time_periods_ref: Dict[int, Dict[int, chronos_models.TimePeriod]],
+    validity_range: ValidityRange, time_periods_ref: Dict[int, Dict[int, chronos_models.TimePeriod]],
 ) -> Dict[int, Dict[int, chronos_models.Break]]:
     # Build breaks for all weekdays
     breaks_ref = {}
@@ -479,6 +486,7 @@ def import_breaks(
             new_break, created = chronos_models.Break.objects.get_or_create(
                 after_period=after_period,
                 before_period=before_period,
+                validity=validity_range,
                 defaults={"short_name": short_name, "name": short_name},
             )
 
@@ -492,12 +500,12 @@ def import_breaks(
     return breaks_ref
 
 
-def import_absence_reasons() -> Dict[int, chronos_models.AbsenceReason]:
+def import_absence_reasons(validity_range: ValidityRange) -> Dict[int, chronos_models.AbsenceReason]:
     """Import absence reasons."""
     ref = {}
 
     # Get reasons
-    reasons = run_default_filter(mysql_models.Absencereason.objects, filter_term=False)
+    reasons = run_default_filter(validity_range, mysql_models.Absencereason.objects, filter_term=False)
 
     for reason in tqdm(reasons, desc="Import absence reasons", **TQDM_DEFAULTS):
         if not reason.name:
diff --git a/aleksis/apps/untis/util/mysql/main.py b/aleksis/apps/untis/util/mysql/main.py
index 318710cb2addae6e3c66dd9f345c5596f3777ed4..4be632b500b484706879fbbb7c75b3e4b62bc100 100644
--- a/aleksis/apps/untis/util/mysql/main.py
+++ b/aleksis/apps/untis/util/mysql/main.py
@@ -1,5 +1,7 @@
 from aleksis.apps.untis.util.mysql.importers.terms import import_terms, get_terms_for_date
+from aleksis.apps.untis.util.mysql.util import TQDM_DEFAULTS
 from django.db import transaction
+from tqdm import tqdm
 
 from .importers.absences import import_absences
 from .importers.common_data import (
@@ -24,18 +26,19 @@ def untis_import_mysql():
     terms = get_terms_for_date()
     validity_ref = import_terms(terms)
 
-    # Coomon data for Chronos
-    subjects_ref = import_subjects()
-    rooms_ref = import_rooms()
-    absence_reasons_ref = import_absence_reasons()
+    for validity_range in tqdm(validity_ref.values(), desc="Import data for terms ...", **TQDM_DEFAULTS):
+        # Common data for Chronos
+        subjects_ref = import_subjects(validity_range)
+        rooms_ref = import_rooms(validity_range)
+        absence_reasons_ref = import_absence_reasons(validity_range)
 
-    # Common data for core
-    teachers_ref = import_teachers()
-    classes_ref = import_classes(teachers_ref)
+        # Common data for core
+        teachers_ref = import_teachers(validity_range)
+        classes_ref = import_classes(validity_range, teachers_ref)
 
-    # Time periods
-    time_periods_ref = import_time_periods()
-    breaks_ref = import_breaks(time_periods_ref)
+        # Time periods
+        time_periods_ref = import_time_periods(validity_range)
+        breaks_ref = import_breaks(validity_range, time_periods_ref)
 
     # Holidays
     holidays_ref = import_holidays()
diff --git a/aleksis/apps/untis/util/mysql/util.py b/aleksis/apps/untis/util/mysql/util.py
index 88a13341297ca4fd65c0d89a0607cd5d473ff06a..6e52cb55c502a42f8ab8a6e45a535a6e48f91ef3 100644
--- a/aleksis/apps/untis/util/mysql/util.py
+++ b/aleksis/apps/untis/util/mysql/util.py
@@ -2,6 +2,7 @@ import logging
 from datetime import date, datetime
 from typing import Any, Callable, Optional, Sequence, Union
 
+from aleksis.apps.chronos.models import ValidityRange
 from django.db.models import Model, QuerySet
 
 DB_NAME = "untis"
@@ -22,18 +23,18 @@ def run_using(obj: QuerySet) -> QuerySet:
 
 
 def run_default_filter(
+    validity_range: ValidityRange,
     qs: QuerySet,
     for_date: Optional[date] = None,
     filter_term: bool = True,
     filter_deleted: bool = True,
 ) -> QuerySet:
     """Add a default filter in order to select the correct term."""
-    term = get_term(for_date)
     term_id, schoolyear_id, school_id, version_id = (
-        term.term_id,
-        term.schoolyear_id,
-        term.school_id,
-        term.version_id,
+        validity_range.import_ref_untis,
+        validity_range.school_term.import_ref_untis,
+        validity_range.school_id_untis,
+        validity_range.version_id_untis,
     )
 
     qs = run_using(qs).filter(