diff --git a/app/controllers/admin/sem_classes.php b/app/controllers/admin/sem_classes.php
index aef3e8487d42e27be619bb28edf2b96e262357ba..c0b098f89d873c4cf4d194bab1408efdfafe4809 100644
--- a/app/controllers/admin/sem_classes.php
+++ b/app/controllers/admin/sem_classes.php
@@ -125,6 +125,7 @@ class Admin_SemClassesController extends AuthenticatedController
         $sem_class->set('admission_type_default', Request::int("admission_type_default"));
         $sem_class->set('show_raumzeit', Request::int("show_raumzeit"));
         $sem_class->set('is_group', Request::int("is_group"));
+        $sem_class->set('unlimited_forbidden', Request::bool('unlimited_forbidden'));
         $sem_class->store();
         foreach (array_keys($sem_class->getModules()) as $module_name) {
             if ($sem_class->isModuleMandatory($module_name) && !$old_data_sem_class->isModuleMandatory($module_name)) {
diff --git a/app/views/admin/sem_classes/details.php b/app/views/admin/sem_classes/details.php
index b6b8a35ee12b05a37dd9e386f847c48500749e93..54f4f903353bfc5500bef963374757a7a71bc836 100644
--- a/app/views/admin/sem_classes/details.php
+++ b/app/views/admin/sem_classes/details.php
@@ -196,14 +196,20 @@
         </label>
 
         <label>
-            <?= _("Kurzer Beschreibungstext zum Anlegen einer Veranstaltung") ?>
-            <textarea id="create_description" maxlength="200" style="width: 100%"><?= htmlReady($sem_class['create_description']) ?></textarea>
+            <input type="checkbox" id="is_group" value="1" <?= $sem_class['is_group'] ? 'checked' : '' ?>>
+            <?= _('Kann Unterveranstaltungen haben') ?>
+        </label>
+
+        <label>
+            <input type="checkbox" id="unlimited_forbidden" value="1" <?= $sem_class['unlimited_forbidden'] ? 'checked' : '' ?>>
+            <?= _('Unbegrenzte Laufzeit verbieten') ?>
         </label>
 
         <label>
-            <input type="checkbox" id="is_group" value="1"<?= $sem_class['is_group'] ? " checked" : "" ?>>
-            <?= _("Kann Unterveranstaltungen haben") ?>
+            <?= _('Kurzer Beschreibungstext zum Anlegen einer Veranstaltung') ?>
+            <textarea id="create_description" maxlength="200" style="width: 100%"><?= htmlReady($sem_class['create_description']) ?></textarea>
         </label>
+
     </fieldset>
 
     <fieldset class="attribute_table">
diff --git a/app/views/course/timesrooms/editSemester.php b/app/views/course/timesrooms/editSemester.php
index 0ac8d1d212ca6d34c2e1ef7246205526218dc351..84b654c85bebd223846840cbd37154a427dc3a17 100644
--- a/app/views/course/timesrooms/editSemester.php
+++ b/app/views/course/timesrooms/editSemester.php
@@ -37,9 +37,11 @@
                         </option>
                     <? endif ?>
                 <? endforeach ?>
-                <option value="-1"<?= $course->isOpenEnded() ? 'selected' : '' ?>>
-                    <?= _('Unbegrenzt') ?>
-                </option>
+                <? if (!$course->getSemClass()['unlimited_forbidden']) : ?>
+                    <option value="-1"<?= $course->isOpenEnded() ? 'selected' : '' ?>>
+                        <?= _('Unbegrenzt') ?>
+                    </option>
+                <? endif ?>
             </select>
         </label>
     </fieldset>
diff --git a/db/migrations/5.5.26_tic3193_no_unlimited_courses.php b/db/migrations/5.5.26_tic3193_no_unlimited_courses.php
new file mode 100644
index 0000000000000000000000000000000000000000..ef45bced3abcbbfa41e3a18bf52f8dabccde46af
--- /dev/null
+++ b/db/migrations/5.5.26_tic3193_no_unlimited_courses.php
@@ -0,0 +1,26 @@
+<?php
+
+final class Tic3193NoUnlimitedCourses extends Migration
+{
+    public function description()
+    {
+        return 'adds option to forbid unlimited courses';
+    }
+
+    public function up()
+    {
+        DBManager::get()->exec("
+            ALTER TABLE `sem_classes` ADD `unlimited_forbidden` TINYINT UNSIGNED NOT NULL DEFAULT 0 AFTER `is_group`
+        ");
+        $cache = StudipCacheFactory::getCache();
+        $cache->expire('DB_SEM_CLASSES_ARRAY');
+    }
+
+    public function down()
+    {
+        DBManager::get()->exec("ALTER TABLE `sem_classes` DROP `unlimited_forbidden`");
+        $cache = StudipCacheFactory::getCache();
+        $cache->expire('DB_SEM_CLASSES_ARRAY');
+    }
+}
+
diff --git a/lib/classes/SemClass.class.php b/lib/classes/SemClass.class.php
index cec05cc0ef08af34dbef42b0488a67e4cd1f6a02..09580e20444aef759ecbf3fdd1c61c71ac77d05f 100644
--- a/lib/classes/SemClass.class.php
+++ b/lib/classes/SemClass.class.php
@@ -383,6 +383,7 @@ class SemClass implements ArrayAccess
                 "admission_type_default = :admission_type_default, " .
                 "show_raumzeit = :show_raumzeit, " .
                 "is_group = :is_group, " .
+                "unlimited_forbidden = :unlimited_forbidden, " .
                 "chdate = UNIX_TIMESTAMP() " .
             "WHERE id = :id ".
         "");
@@ -425,7 +426,8 @@ class SemClass implements ArrayAccess
             'admission_prelim_default' => (int)$this->data['admission_prelim_default'],
             'admission_type_default' => (int)$this->data['admission_type_default'],
             'show_raumzeit' => (int) $this->data['show_raumzeit'],
-            'is_group' => (int) $this->data['is_group']
+            'is_group' => (int) $this->data['is_group'],
+            'unlimited_forbidden' => (int) $this->data['unlimited_forbidden'],
         ]);
     }
 
diff --git a/resources/assets/javascripts/lib/admin_sem_class.js b/resources/assets/javascripts/lib/admin_sem_class.js
index 698a8d6b2770b69a60f4f9ca046a6d7ebc34a3d7..5ac9532468194ee2cd2b8dae99d033bd6380fd11 100644
--- a/resources/assets/javascripts/lib/admin_sem_class.js
+++ b/resources/assets/javascripts/lib/admin_sem_class.js
@@ -65,7 +65,8 @@ const admin_sem_class = {
                 admission_prelim_default: jQuery('#admission_prelim_default').val(),
                 admission_type_default: jQuery('#admission_type_default').val(),
                 show_raumzeit: jQuery('#show_raumzeit').is(':checked') ? 1 : 0,
-                is_group: jQuery('#is_group').is(':checked') ? 1 : 0
+                is_group: jQuery('#is_group').is(':checked') ? 1 : 0,
+                unlimited_forbidden: jQuery('#unlimited_forbidden').is(':checked') ? 1 : 0
             },
             type: 'POST',
             dataType: 'json',