diff --git a/app/controllers/settings/notification.php b/app/controllers/settings/notification.php
index 6e517dd0f0f4fdbe1608c915afa2ac4a825f02d7..e3efb7b883d0aad7dbfa55192cdaf3bdc8618b80 100644
--- a/app/controllers/settings/notification.php
+++ b/app/controllers/settings/notification.php
@@ -89,8 +89,8 @@ class Settings_NotificationController extends Settings_SettingsController
                 'visible'        => $seminar['visible'],
                 'gruppe'         => $su->gruppe,
                 'sem_status'     => $seminar->status,
-                'sem_number'     => Semester::getIndexById($seminar->start_semester->id, true, true),
-                'sem_number_end' => Semester::getIndexById($seminar->end_semester->id ?? '', true, true) ?: '-1',
+                'sem_number'     => Semester::getIndexById($seminar->start_semester->id),
+                'sem_number_end' => Semester::getIndexById($seminar->end_semester->id ?? '') ?: '-1',
             ];
             if ($group_field) {
                 fill_groups($groups, Semester::getIndexById($seminar->start_semester->id), [
diff --git a/lib/classes/MyRealmModel.php b/lib/classes/MyRealmModel.php
index 2bd65fc9d75e0a78f896874362a14ddc76b9fe26..54252881a1d4ebda39d30d5440148f538be67eb3 100644
--- a/lib/classes/MyRealmModel.php
+++ b/lib/classes/MyRealmModel.php
@@ -316,8 +316,8 @@ class MyRealmModel
             $_course['visitdate']      = $visits[$course->id][0]['visitdate'];
             $_course['user_status']    = $user_status;
             $_course['gruppe']         = !$is_deputy ? $member_ships[$course->id]['gruppe'] ?? null : ($deputy ? $deputy->gruppe : null);
-            $_course['sem_number_end'] = $course->isOpenEnded() ? $max_sem_key : Semester::getIndexById($course->end_semester->id, true, true);
-            $_course['sem_number']     = Semester::getIndexById($course->start_semester->id ?? null, true, true);
+            $_course['sem_number_end'] = $course->isOpenEnded() ? $max_sem_key : Semester::getIndexById($course->end_semester->id);
+            $_course['sem_number']     = Semester::getIndexById($course->start_semester->id ?? null);
             $_course['tools']          = $course->tools;
             $_course['name']           = $course->name;
             $_course['temp_name']      = $course->name;
diff --git a/lib/meine_seminare_func.inc.php b/lib/meine_seminare_func.inc.php
index 9bd2304ba4df43848c42cf40101237d057e0526e..5313f8de6f406530cdeb46c7fbaf0273b07f3b55 100644
--- a/lib/meine_seminare_func.inc.php
+++ b/lib/meine_seminare_func.inc.php
@@ -139,38 +139,59 @@ function sort_groups($group_field, &$groups)
  */
 function correct_group_sem_number(&$groups, &$my_obj): bool
 {
-    if (is_array($groups) && is_array($my_obj)) {
-        $sem_data = Semester::findAllVisible();
-        foreach ($sem_data as $sem_key => $one_sem){
-            $current_sem = $sem_key;
-            if (!$one_sem['past']) {
-                break;
+    if (!is_array($groups) || !is_array($my_obj)) {
+        return false;
+    }
+
+    $current_semester = Semester::findCurrent();
+
+    $my_sem = array_filter(
+        $my_obj,
+        fn($values) => $values['obj_type'] === 'sem'
+    );
+
+    Course::findEachMany(
+        function (Course $course) use (&$groups, &$my_obj, $current_semester) {
+            if (count($course->semesters) === 1) {
+                return;
             }
-        }
-        foreach ($my_obj as $seminar_id => $values){
-            if ($values['obj_type'] == 'sem' && $values['sem_number'] != $values['sem_number_end']){
-                if ($values['sem_number_end'] == -1 && $values['sem_number'] < $current_sem) {
-                    unset($groups[$values['sem_number']][$seminar_id]);
-                    fill_groups($groups, $current_sem, ['seminar_id' => $seminar_id, 'name' => $values['name'], 'gruppe' => $values['gruppe']]);
-                    if (!count($groups[$values['sem_number']])) {
-                        unset($groups[$values['sem_number']]);
-                    }
-                } else {
-                    $to_sem = $values['sem_number_end'];
-                    for ($i = $values['sem_number']; $i <= $to_sem; ++$i){
-                        fill_groups($groups, $i, ['seminar_id' => $seminar_id, 'name' => $values['name'], 'gruppe' => $values['gruppe']]);
-                    }
+
+            $obj_data = $my_obj[$course->id];
+
+            if (
+                $course->isOpenEnded()
+                && $course->start_semester->beginn < $current_semester->beginn
+            ) {
+                unset($groups[$obj_data['sem_number']][$course->id]);
+
+                fill_groups($groups, Semester::getIndexById($current_semester->id), [
+                    'seminar_id' => $course->id,
+                    'name' => $obj_data['name'],
+                    'gruppe' => $obj_data['gruppe'],
+                ]);
+
+                if (count($groups[$obj_data['sem_number']]) === 0) {
+                    unset($groups[$obj_data['sem_number']]);
                 }
-                if ($GLOBALS['user']->cfg->getValue('SHOWSEM_ENABLE')){
-                    $sem_name = " (" . $sem_data[$values['sem_number']]['name'] . " - ";
-                    $sem_name .= (($values['sem_number_end'] == -1) ? _("unbegrenzt") : $sem_data[$values['sem_number_end']]['name']) . ")";
-                    $my_obj[$seminar_id]['name'] .= $sem_name;
+            } else {
+                $to_sem = $obj_data['sem_number_end'];
+                for ($i = $obj_data['sem_number']; $i <= $to_sem; ++$i){
+                    fill_groups($groups, $i, [
+                        'seminar_id' => $course->id,
+                        'name' => $obj_data['name'],
+                        'gruppe' => $obj_data['gruppe']
+                    ]);
                 }
             }
-        }
-        return true;
-    }
-    return false;
+
+            if (User::findCurrent()->getConfiguration()->getValue('SHOWSEM_ENABLE')) {
+                $my_obj[$course->id]['name'] .= ' (' . $course->getTextualSemester() . ')';
+            }
+        },
+        array_keys($my_sem)
+    );
+
+    return true;
 }
 
 /**
diff --git a/lib/models/Course.php b/lib/models/Course.php
index bf5b7385ec2b29acbd517413bf8da18871094e1e..f07440ccb8539058a696a0e9dadabfc9af270580 100644
--- a/lib/models/Course.php
+++ b/lib/models/Course.php
@@ -71,8 +71,8 @@
  * @property SimpleORMapCollection|Institute[] $institutes has_and_belongs_to_many Institute
  * @property SimpleORMapCollection|UserDomain[] $domains has_and_belongs_to_many UserDomain
  * @property-read mixed $teachers additional field
- * @property mixed $start_semester additional field
- * @property mixed $end_semester additional field
+ * @property Semester $start_semester additional field
+ * @property Semester|null $end_semester additional field
  * @property-read mixed $semester_text additional field
  * @property-read mixed $config additional field
  */
diff --git a/lib/models/Semester.php b/lib/models/Semester.php
index 371ea24b795a5860ddd23a554fbd2496937bf5d5..51ee4a6c93a7feec48a31d69e4b5014f9e71ee49 100644
--- a/lib/models/Semester.php
+++ b/lib/models/Semester.php
@@ -144,6 +144,7 @@ class Semester extends SimpleORMap
 
     /**
      * returns current Semester
+     * @return static
      */
     public static function findCurrent()
     {