diff --git a/app/controllers/module/download.php b/app/controllers/module/download.php
index e5f5be836b740ae038fe78af3bdd9a66d2f55a7e..be527d5747ebf48b258c5f312bc50c76410ae8a7 100644
--- a/app/controllers/module/download.php
+++ b/app/controllers/module/download.php
@@ -10,15 +10,14 @@ class Module_DownloadController extends MVVController
 
     public function details_action($modul_id, $language = null)
     {
+        $language = Request::get('display_language', $language);
+        ModuleManagementModel::setLanguage($language);
+
         $modul = Modul::find($modul_id);
         if (!$modul) {
             throw new Exception(_('Ungültiges Modul'));
         }
-        $language = Request::get('display_language', $language) ?? $modul->original_language;
-        I18NString::setDefaultLanguage($modul->original_language);
-        I18NString::setContentLanguage($language);
-
-        $this->getDetails($modul_id);
+        $this->getDetails($modul_id, $language);
         $this->download = true;
         $as_pdf = Request::int('pdf');
 
@@ -52,7 +51,7 @@ class Module_DownloadController extends MVVController
         }
     }
 
-    private function getDetails($id)
+    private function getDetails($id, $language = null)
     {
         $modul = Modul::find($id);
         if (!$modul) {
@@ -82,7 +81,7 @@ class Module_DownloadController extends MVVController
         $modulTeilData = [];
 
         foreach ($modul->modulteile as $modulTeil) {
-            $deskriptor = $modulTeil->getDeskriptor();
+            $deskriptor = $modulTeil->getDeskriptor($language);
             $num_bezeichnung = $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG']['values'][$modulTeil->num_bezeichnung]['name'] ?? '';
 
             $name_kurz = sprintf('%s %d', $num_bezeichnung, $modulTeil->nummer);
@@ -135,7 +134,7 @@ class Module_DownloadController extends MVVController
         $this->semesterSelector = Semester::GetSemesterSelector(null, $currentSemester->getId(), 'semester_id', false);
         $this->modul = $modul;
         $this->pruefungsEbene = $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]['name'] ?? null;
-        $this->modulDeskriptor = $modul->getDeskriptor();
+        $this->modulDeskriptor = $modul->getDeskriptor($language);
         $this->startSemester = Semester::find($modul->start);
         if ($modul->responsible_institute->institute) {
             $this->instituteName = $modul->responsible_institute->getDisplayName();
diff --git a/app/controllers/module/module.php b/app/controllers/module/module.php
index 7ced00363a3706ec458e737de06cc610a222cbd0..10674d07dc916d8ded6d027efa57f00cc72bdf0d 100644
--- a/app/controllers/module/module.php
+++ b/app/controllers/module/module.php
@@ -105,20 +105,6 @@ class Module_ModuleController extends MVVController
         $this->setSidebar();
     }
 
-    public function select_module_language_action()
-    {
-        $this->languages = [];
-        foreach (Config::get()->CONTENT_LANGUAGES as $language_code => $language) {
-            $code = strtok($language_code, '_');
-            $this->languages[] = [
-                'name' => $language['name'],
-                'code' => $language_code,
-                'picture' => "lang_{$code}_text.svg",
-            ];
-        };
-        PageLayout::setTitle(_('Sprache wählen'));
-    }
-
     public function modul_action($modul_id = null, $institut_id = null)
     {
         $own_institutes = MvvPerm::getOwnInstitutes();
@@ -147,20 +133,13 @@ class Module_ModuleController extends MVVController
         if ($this->modul->isNew()) {
             PageLayout::setTitle(_('Neues Modul anlegen'));
             $success_message = ('Das Modul "%s" wurde angelegt.');
-            $language = Request::option('display_language');
-            $content_languages = Config::get()->CONTENT_LANGUAGES;
-            if (!empty($content_languages[$language])) {
-                $this->display_language = $language;
-            } else {
-                $this->display_language = Config::get()->MVV_DEFAULT_LANGUAGE;
-            }
-            $this->modul->original_language = $this->display_language;
-            $this->deskriptor = $this->modul->getDeskriptor();
+            $this->display_language = $this->modul->getDefaultLanguage();
+            $this->deskriptor = $this->modul->getDeskriptor($this->display_language, true);
             $this->reset_search('Modul');
             if (!$modul_id) {
                 PageLayout::postInfo(sprintf(
-                    _('Sie legen ein neues Modul an. Das Modul wird zunächst in der Ausgabesprache <em>%s</em> angelegt (Originalsprache).'),
-                    Config::get()->CONTENT_LANGUAGES[$this->display_language]['name']
+                    _('Sie legen ein neues Modul an. Das Modul muss zunächst in der Ausgabesprache <em>%s</em> angelegt werden.'),
+                    $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name']
                 ));
             }
             // set default language of instruction
@@ -172,17 +151,17 @@ class Module_ModuleController extends MVVController
         } else {
             $this->display_language = Request::option(
                 'display_language',
-                $this->modul->original_language
+                $this->modul->getDefaultLanguage()
             );
 
-            $this->deskriptor = $this->modul->getDeskriptor();
-            $this->translations = $this->deskriptor->getAvailableTranslations($this->modul->original_language);
+            $this->deskriptor = $this->modul->getDeskriptor($this->display_language, true);
+            $this->translations = $this->deskriptor->getAvailableTranslations();
             if (!in_array($this->display_language, $this->translations)) {
                 PageLayout::setTitle(
                     sprintf(
                         _('Modul: <em>%s</em> in der Ausgabesprache <em>%s</em> neu anlegen.'),
                         $this->modul->getDisplayName(),
-                        Config::get()->CONTENT_LANGUAGE[$this->display_language]['name']
+                        $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name']
                     )
                 );
             } else {
@@ -194,18 +173,15 @@ class Module_ModuleController extends MVVController
             $success_message = _('Das Modul "%s" wurde geändert.');
             // language selector as sidebar widget
             $template_factory = $this->get_template_factory();
-            $sidebar_template = $template_factory->render(
-                'shared/deskriptor_language',
-                [
-                    'original_language' => $this->modul->original_language,
-                    'display_language' => $this->display_language,
-                    'descriptor' => $this->modul->deskriptoren,
-                    'link' => $this->modulURL($this->modul->id, $this->institut_id),
-                ]
+            $sidebar_template = $template_factory->render('shared/deskriptor_language', [
+                'modul'   => $this->modul,
+                'sprache' => $this->display_language,
+                'link'    => $this->modulURL($this->modul->id, $this->institut_id),
+                'url'     => $this->url]
             );
 
             $widget  = new SidebarWidget();
-            $widget->setTitle(_('Ausgabesprache wählen'));
+            $widget->setTitle(_('Ausgabesprache'));
             $widget->addElement(new WidgetElement($sidebar_template));
             $sidebar->addWidget($widget, 'language');
 
@@ -259,11 +235,9 @@ class Module_ModuleController extends MVVController
                 $sidebar->addWidget($widget, 'variants');
             }
         }
-
         $this->semester = array_reverse(Semester::getAll());
-        $this->def_lang = $this->display_language === $this->modul->original_language;
-        I18NString::setDefaultLanguage($this->modul->original_language);
-        I18NString::setContentLanguage($this->display_language);
+        $this->def_lang = $this->display_language === $this->modul->getDefaultLanguage();
+        ModuleManagementModel::setContentLanguage($this->display_language);
         if (!$this->def_lang) {
             $action_widget = $sidebar->getWidget('actions');
             $action_widget->addLink(
@@ -273,6 +247,7 @@ class Module_ModuleController extends MVVController
             );
         }
 
+        $this->language = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['content_language'];
         if (Request::isPost()) {
             CSRFProtection::verifyUnsafeRequest();
             $stored = false;
@@ -304,13 +279,6 @@ class Module_ModuleController extends MVVController
                 $this->modul->fassung_typ = Request::option('fassung_typ');
                 $this->modul->version = trim(Request::get('version'));
                 $this->modul->verantwortlich = trim(Request::get('verantwortlich'));
-                // change original language
-                if (
-                    !$this->modul->isNew()
-                    && $this->modul->original_language !== Request::option('original_language')
-                ) {
-                    $this->setOriginalLanguage($this->modul, Request::option('original_language'));
-                }
             }
 
             $deskriptor_fields = ['bezeichnung', 'verantwortlich',
@@ -322,16 +290,10 @@ class Module_ModuleController extends MVVController
 
             foreach ($deskriptor_fields as $deskriptor_field) {
                 if ($this->deskriptor->isI18nField($deskriptor_field)) {
-                    if ($this->display_language === $this->modul->original_language) {
-                        $this->deskriptor->$deskriptor_field->setOriginal(
-                            trim(Request::get($deskriptor_field))
-                        );
-                    } else {
-                        $this->deskriptor->$deskriptor_field->setLocalized(
-                            trim(Request::get($deskriptor_field)),
-                            $this->display_language
-                        );
-                    }
+                    $this->deskriptor->$deskriptor_field->setLocalized(
+                        trim(Request::get($deskriptor_field)),
+                        $this->language
+                    );
                 } else {
                     $this->deskriptor->setValue(
                         $deskriptor_field,
@@ -345,7 +307,7 @@ class Module_ModuleController extends MVVController
                 $df = $this->deskriptor->datafields->findOneBy('datafield_id', $df_key);
                 if ($df) {
                     $tdf = $df->getTypedDatafield();
-                    $tdf->setContentLanguage($this->display_language);
+                    $tdf->setContentLanguage($this->language);
                     $tdf->setValueFromSubmit($df_value);
                     $tdf->store();
                 }
@@ -690,31 +652,29 @@ class Module_ModuleController extends MVVController
         if ($this->modulteil->isNew()) {
             PageLayout::setTitle(_('Neuen Modulteil anlegen'));
             $success_message = ('Der Modulteil "%s" wurde angelegt.');
-            $this->display_language = Request::option(
-                'display_language',
-                $this->modul->original_language
-            );
-            $this->deskriptor = $this->modulteil->getDeskriptor();
+            $this->display_language = $this->modulteil->getDefaultLanguage();
+            $this->deskriptor = $this->modulteil->getDeskriptor($this->display_language, true);
             PageLayout::postInfo(sprintf(
                 _('Sie legen einen neuen Modulteil für das Modul <em>%s</em> an. Der Modulteil muss zunächst in der Ausgabesprache <em>%s</em> angelegt werden.'),
                 htmlReady($this->modul->getDisplayName()),
-                htmlReady(Config::get()->MVV_MODUL_DESKRIPTOR['SPRACHE']['values'][$this->display_language]['name'])
+                htmlReady($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'])
             ));
             // set default language of instruction
-            if (Config::get()->MVV_MODULTEIL['SPRACHE']['default']) {
+            if ($GLOBALS['MVV_MODULTEIL']['SPRACHE']['default']) {
                 $this->modulteil->assignLanguagesOfInstruction([
-                    Config::get()->MVV_MODULTEIL['SPRACHE']['default']
+                    $GLOBALS['MVV_MODULTEIL']['SPRACHE']['default']
                 ]);
             }
         } else {
-            $this->display_language = Request::option('display_language', $this->modul->original_language);
-            $this->deskriptor = $this->modulteil->getDeskriptor();
-            $this->translations = $this->deskriptor->getAvailableTranslations($this->modul->original_language);
+            $this->display_language = Request::option('display_language', $this->modulteil->getDefaultLanguage());
+            $this->deskriptor = $this->modulteil->getDeskriptor($this->display_language, true);
+            $this->translations = $this->deskriptor->getAvailableTranslations();
+
             if (!in_array($this->display_language, $this->translations)) {
                 PageLayout::setTitle(sprintf(
                     _('Modulteil: "%s" in der Ausgabesprache "%s" neu anlegen.'),
                     $this->modulteil->getDisplayName(),
-                    Config::get()->CONTENT_LANGUAGES[$this->display_language]['name']
+                    $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name']
                 ));
             } else {
                 PageLayout::setTitle(sprintf(_('Modulteil: %s'), htmlReady($this->modulteil->getDisplayName())));
@@ -728,10 +688,10 @@ class Module_ModuleController extends MVVController
             $widget_element = new WidgetElement(
                 $template_factory->render('shared/deskriptor_language',
                     [
-                        'descriptor' => $this->modulteil->deskriptoren,
-                        'display_language' => $this->display_language,
-                        'original_language' => $this->modul->original_language,
-                        'link' => $this->modulteilURL($this->modulteil->id),
+                        'modul'   => $this->modulteil,
+                        'sprache' => $this->display_language,
+                        'link'    => $this->modulteilURL($this->modulteil->id),
+                        'url'     => $this->url
                     ]
                 )
             );
@@ -739,9 +699,7 @@ class Module_ModuleController extends MVVController
             $sidebar->addWidget($widget, 'languages');
         }
 
-        $this->def_lang = $this->display_language === $this->modul->original_language;
-        I18NString::setDefaultLanguage($this->modul->original_language);
-        I18NString::setContentLanguage($this->display_language);
+        $this->def_lang = $this->display_language === $this->modulteil->getDefaultLanguage();
 
         if (!$this->def_lang) {
             $action_widget = $sidebar->getWidget('actions');
@@ -753,6 +711,7 @@ class Module_ModuleController extends MVVController
             );
         }
 
+        $this->language = $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['content_language'];
         if (Request::submitted('store')) {
             CSRFProtection::verifyUnsafeRequest();
             $stored = false;
@@ -789,21 +748,12 @@ class Module_ModuleController extends MVVController
 
             foreach ($deskriptor_fields as $deskriptor_field) {
                 if ($this->deskriptor->isI18nField($deskriptor_field)) {
-                    if ($this->display_language === $this->modul->original_language) {
-                        $this->deskriptor->$deskriptor_field->setOriginal(
-                            trim(Request::get($deskriptor_field))
-                        );
-                    } else {
-                        $this->deskriptor->$deskriptor_field->setLocalized(
-                            trim(Request::get($deskriptor_field)),
-                            $this->display_language
-                        );
-                    }
-                } else {
-                    $this->deskriptor->setValue(
-                        $deskriptor_field,
-                        trim(Request::get($deskriptor_field))
+                    $this->deskriptor->$deskriptor_field->setLocalized(
+                        trim(Request::get($deskriptor_field)),
+                        $this->language
                     );
+                } else {
+                    $this->deskriptor->setValue($deskriptor_field, trim(Request::get($deskriptor_field)));
                 }
             }
 
@@ -812,7 +762,7 @@ class Module_ModuleController extends MVVController
                 $df = $this->deskriptor->datafields->findOneBy('datafield_id', $df_key);
                 if ($df) {
                     $tdf = $df->getTypedDatafield();
-                    $tdf->setContentLanguage($this->display_language);
+                    $tdf->setContentLanguage($this->language);
                     $tdf->setValueFromSubmit($df_value);
                     $tdf->store();
                 }
@@ -845,11 +795,11 @@ class Module_ModuleController extends MVVController
                 return;
             }
         }
-        if ($this->display_language !== $this->modul->original_language && $this->deskriptor->isNew()) {
+        if ($this->display_language !== $this->modulteil->getDefaultLanguage() && $this->deskriptor->isNew()) {
             PageLayout::postInfo(sprintf(
                 _('Neue Beschreibung zum Modulteil "%s" in der Ausgabesprache %s anlegen.'),
                 htmlReady($this->modulteil->getDisplayName()),
-                htmlReady(Config::get()->CONTENT_LANGUAGES[$this->display_language]['name'])
+                htmlReady($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'])
             ));
         }
         $this->cancel_url = $this->detailsURL($this->modulteil->modul_id);
@@ -878,7 +828,7 @@ class Module_ModuleController extends MVVController
         if (is_null($deskriptor)) {
             throw new Trails\Exception(404, _('Unbekannter Deskriptor'));
         }
-        $def_lang = $deskriptor->modulteil->modul->original_language;
+        $def_lang = $deskriptor->modulteil->getDefaultLanguage();
         if ($language === $def_lang) {
             throw new Trails\Exception(403, _('Ein Deskriptor in der Original-Sprache kann nicht gelöscht werden.'));
         }
@@ -1398,9 +1348,9 @@ class Module_ModuleController extends MVVController
         if (MvvPerm::havePermCreate('Modul')) {
             $widget->addLink(
                 _('Neues Modul anlegen'),
-                $this->select_module_languageURL(),
+                $this->modulURL(),
                 Icon::create('add')
-            )->asDialog('size=600x300');
+            );
         }
         $sidebar->addWidget($widget, 'actions');
 
@@ -1623,40 +1573,4 @@ class Module_ModuleController extends MVVController
                   WHERE `mvv_studiengang`.`abschluss_id` = ?";
         return DBManager::get()->fetchFirst($query, [$abschluss_id]);
     }
-
-    private function setOriginalLanguage(Modul $module, string $original_language): void
-    {
-        $content_language = Config::get()->CONTENT_LANGUAGES[$original_language];
-        if (empty($content_language)) {
-            throw new InvalidArgumentException("Original language $original_language is not defined");
-        }
-        if ($module->deskriptoren) {
-            $current_language = $module->original_language;
-            $module->original_language = $original_language;
-            DBManager::get()->execute("
-                UPDATE `i18n`
-                SET `lang` = ?
-                WHERE `object_id` = ?
-                  AND `table` = 'mvv_modul_deskriptor'
-                  AND `lang` = ?",
-                [
-                    $original_language,
-                    $module->deskriptoren->id,
-                    $current_language
-                ]);
-            $module->modulteile->each(fn($component) => DBManager::get()->execute("
-                    UPDATE `i18n`
-                    SET `lang` = ?
-                    WHERE `object_id` IN (?)
-                      AND `table` = 'mvv_modulteil_deskriptor'
-                      AND `lang` = ?",
-                    [
-                        $original_language,
-                        $module->deskriptoren->id,
-                        $current_language
-                    ]
-                )
-            );
-        }
-    }
 }
diff --git a/app/controllers/search/studiengaenge.php b/app/controllers/search/studiengaenge.php
index 7f6dc5b4b49f93497a9df0e47eb3a61c7b7cb4ec..e17eb2a9773c3a8d93c2738dabaf79be22d5b9f5 100644
--- a/app/controllers/search/studiengaenge.php
+++ b/app/controllers/search/studiengaenge.php
@@ -341,7 +341,7 @@ class Search_StudiengaengeController extends MVVController
             // add links to export Modulhandbücher as PDF
             $widget = new ActionsWidget();
             $widget->setTitle(_('Aktuelle Modulhandbücher'));
-            $avl_lang = array_keys(Config::get()->CONTENT_LANGUAGES);
+            $avl_lang = array_keys($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values']);
 
             foreach ($avl_lang as $language) {
                 if ($language === $GLOBALS['MVV_LANGUAGES']['default']) {
diff --git a/app/controllers/shared/modul.php b/app/controllers/shared/modul.php
index 1f1e5ce836804099fa816b24ee7f49ef6b884f54..d1a6ecfb21625f335418b20d88121703ebb5b37a 100644
--- a/app/controllers/shared/modul.php
+++ b/app/controllers/shared/modul.php
@@ -13,6 +13,8 @@
  * @since       3.5
  */
 
+
+
 class Shared_ModulController extends AuthenticatedController
 {
 
@@ -28,89 +30,96 @@ class Shared_ModulController extends AuthenticatedController
         $display_language = Request::option('display_language', $_SESSION['_language']);
         ModuleManagementModel::setLanguage($display_language);
 
-        $this->modul = Modul::find($modul_id);
-        if (!$this->modul->hasPublicStatus()) {
+        $modul = Modul::find($modul_id);
+        if (!$modul->hasPublicStatus()) {
             throw new AccessDeniedException();
         }
-        if ($this->modul) {
-            $this->details_id = $this->modul->getId();
+        if ($modul) {
+            $this->details_id = $modul->getId();
 
             $type = 1;
-            if (count($this->modul->modulteile) == 1) {
-                $modulteil = $this->modul->modulteile->first();
+            if (count($modul->modulteile) == 1) {
+                $modulteil = $modul->modulteile->first();
                 $type = 3;
                 if (count($modulteil->lvgruppen) > 0) {
                     $type = 2;
                 }
-            } else if (count($this->modul->modulteile) == 0) {
+            } else if (count($modul->modulteile) == 0) {
                 $type = 3;
             }
 
             if (!$semester_id) {
-                $current_semester = Semester::findDefault();
+                $currentSemester = Semester::findDefault();
             } else {
-                $current_semester = Semester::find($semester_id);
+                $currentSemester = Semester::find($semester_id);
             }
 
             $sws = 0;
-            $institut = new Institute($this->modul->responsible_institute->institut_id);
-            $modulteile_data = [];
-            foreach ($this->modul->modulteile as $modulteil) {
-                $modulteil_deskriptor = $modulteil->getDeskriptor();
-                $sws += (int) $modulteil->sws;
-                $num_bezeichnung = $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG']['values'][$modulteil->num_bezeichnung]['name'] ?? '';
-                $name_kurz = sprintf('%s %d', $num_bezeichnung, $modulteil->nummer);
-                $modulteile_data[$modulteil->getId()] = [
-                    'name' => $modulteil->getDisplayName(),
+            $institut = new Institute($modul->responsible_institute->institut_id);
+            $modulTeileData = [];
+            foreach ($modul->modulteile as $modulTeil) {
+
+                $modulTeilDeskriptor = $modulTeil->getDeskriptor($display_language);
+
+                $sws += (int) $modulTeil->sws;
+
+                $num_bezeichnung = $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG']['values'][$modulTeil->num_bezeichnung]['name'] ?? '';
+
+                $name_kurz = sprintf('%s %d', $num_bezeichnung, $modulTeil->nummer);
+
+                $modulTeileData[$modulTeil->getId()] = [
+                    'name' => $modulTeil->getDisplayName(),
                     'name_kurz' => $name_kurz,
-                    'voraussetzung' => $modulteil_deskriptor->voraussetzung,
-                    'pruef_leistung' => $modulteil_deskriptor->pruef_leistung,
-                    'pruef_vorleistung' => $modulteil_deskriptor->pruef_vorleistung,
-                    'kommentar' => $modulteil_deskriptor->kommentar,
-                    'kapazitaet' => $modulteil->kapazitaet,
+                    'voraussetzung' => $modulTeilDeskriptor->voraussetzung,
+                    'pruef_leistung' => $modulTeilDeskriptor->pruef_leistung,
+                    'pruef_vorleistung' => $modulTeilDeskriptor->pruef_vorleistung,
+                    'kommentar' => $modulTeilDeskriptor->kommentar,
+                    'kapazitaet' => $modulTeil->kapazitaet,
                     'lvGruppen' => []
                 ];
 
-                $lvGruppen = Lvgruppe::findByModulteil($modulteil->getId());
+                $lvGruppen = Lvgruppe::findByModulteil($modulTeil->getId());
                 foreach ($lvGruppen as $lvGruppe) {
-                    $ids = array_column($lvGruppe->getAssignedCoursesBySemester($current_semester['semester_id'], $GLOBALS['user']->id), 'seminar_id');
+                    $ids = array_column($lvGruppe->getAssignedCoursesBySemester($currentSemester['semester_id'], $GLOBALS['user']->id), 'seminar_id');
                     $courses = Course::findMany($ids, 'order by Veranstaltungsnummer, Name');
-                    $modulteile_data[$modulteil->getId()]['lvGruppen'][$lvGruppe->getId()] = [
+                    $modulTeileData[$modulTeil->getId()]['lvGruppen'][$lvGruppe->getId()] = [
                         'courses' => $courses,
                         'alt_texte' => $lvGruppe->alttext
                     ];
                 }
             }
-            $this->modulteile = $modulteile_data;
-            $this->deskriptor = $this->modul->getDeskriptor();
+            $this->modulTeile = $modulTeileData;
+            $this->deskriptor = $modul->getDeskriptor($display_language);
             $this->institut = $institut;
-            $this->semester = $current_semester;
+            $this->semester = $currentSemester;
             $this->sws = $sws;
 
-            $this->pruef_ebene = $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$this->modul->pruef_ebene]['name'] ?? null;
+            $this->pruef_ebene = $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]['name'] ?? null;
+            $this->modul = $modul;
             $this->type = $type;
             $this->self_url = $this->url_for('modul/show/' . $modul_id);
             $this->detail_url = $this->url_for('modul/detail/' . $modul_id);
-            PageLayout::setTitle($this->modul->getDisplayName() . ' (' . _('Veranstaltungsübersicht') .')');
+            $this->teilnahmeVoraussetzung = $modul->getDeskriptor()->voraussetzung;
+            PageLayout::setTitle($modul->getDisplayName() . ' (' . _('Veranstaltungsübersicht') .')');
         }
     }
 
     public function description_action($id)
     {
-        $this->modul = Modul::find($id);
-        $perm = MvvPerm::get($this->modul);
-        if (!($this->modul->hasPublicStatus() || $perm->haveObjectPerm(MvvPerm::PERM_READ))) {
+        $modul = Modul::find($id);
+        $perm = MvvPerm::get($modul);
+        if (!($modul->hasPublicStatus() || $perm->haveObjectPerm(MvvPerm::PERM_READ))) {
             throw new AccessDeniedException();
         }
-        $this->type = 1;
-        if (count($this->modul->modulteile) == 1) {
-            $modulteil = $this->modul->modulteile->first();
-            $this->type = 3;
+        $type = 1;
+        if (count($modul->modulteile) == 1) {
+            $modulteil = $modul->modulteile->first();
+            $type = 3;
             if (count($modulteil->lvgruppen) > 0) {
-                $this->type = 2;
+                $type = 2;
             }
-        } else if (count($this->modul->modulteile) == 0) {
-            $this->type = 3;
+        } else if (count($modul->modulteile) == 0) {
+            $type = 3;
         }
 
         if (!Request::get('sem_select')) {
@@ -119,27 +128,28 @@ class Shared_ModulController extends AuthenticatedController
             $currentSemester = Semester::find(Request::get('sem_select'));
         }
 
-        $this->display_language = Request::get('display_language', $this->modul->original_language);
-        ModuleManagementModel::setLanguage($this->display_language);
-        I18NString::setDefaultLanguage($this->modul->original_language);
-        I18NString::setContentLanguage($this->display_language);
+        $display_language = Request::get('display_language', $_SESSION['_language']);
+        ModuleManagementModel::setLanguage($display_language);
 
         $this->semesterSelector = Semester::getSemesterSelector(null, $currentSemester['semester_id'], 'semester_id', false);
-        $this->pruefungsEbene = isset($GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$this->modul->pruef_ebene])
-                              ? $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$this->modul->pruef_ebene]['name']
+        $this->modul = $modul;
+        $this->pruefungsEbene = isset($GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene])
+                              ? $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]['name']
                               : null;
-        $this->modulDeskriptor = $this->modul->getDeskriptor();
-        $this->startSemester = Semester::findByTimestamp($this->modul->start);
+        $this->modulDeskriptor = $modul->getDeskriptor($display_language);
+        $this->startSemester = Semester::findByTimestamp($modul->start);
 
-        if (!$this->modul->responsible_institute) {
+        if (!$modul->responsible_institute) {
             $this->instituteName = null;
-        } elseif ($this->modul->responsible_institute->institute) {
-            $this->instituteName = $this->modul->responsible_institute->institute->name;
+        } elseif ($modul->responsible_institute->institute) {
+            $this->instituteName = $modul->responsible_institute->institute->name;
         } else {
             $this->instituteName = _('Unbekannte Einrichtung');
         }
+        $this->type = $type;
         $this->semester = $currentSemester;
-        PageLayout::setTitle($this->modul->getDisplayName() . ' (' . _('Vollständige Modulbeschreibung') .')');
+        $this->display_language = $display_language;
+        PageLayout::setTitle($modul->getDisplayName() . ' (' . _('Vollständige Modulbeschreibung') .')');
     }
 
     public function mail_action($modul_id, $semester_id)
diff --git a/app/views/admin/datafields/edit.php b/app/views/admin/datafields/edit.php
index 49de4522b0610f36c406fc42e5dd00ba45e83afc..46b7aa1dcb8c988220d3a291f4ff4aabea6fe753 100644
--- a/app/views/admin/datafields/edit.php
+++ b/app/views/admin/datafields/edit.php
@@ -71,7 +71,7 @@ use Studip\Button, Studip\LinkButton;
 
             <select multiple name="object_class[]" id="object_class" required>
                 <option value="NULL" <? if ($item->object_class === null) echo 'selected'; ?>><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option>
-            <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?>
+            <? foreach ((array) $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?>
                 <option value="<?= htmlReady($key) ?>" <? if (mb_strpos($item->object_class, $key) !== false) echo 'selected'; ?>>
                     <?= htmlReady($value['name']) ?>
                 </option>
@@ -82,7 +82,7 @@ use Studip\Button, Studip\LinkButton;
 
             <select multiple name="object_class[]" id="object_class" required>
                 <option value="NULL" <? if ($item->object_class === null) echo 'selected'; ?>><?= _('alle (mehrsprachige Eingabe)') ?></option>
-            <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?>
+            <? foreach ((array) $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?>
                 <option value="<?= htmlReady($key) ?>" <? if (mb_strpos($item->object_class, $key) !== false) echo 'selected'; ?>>
                     <?= htmlReady($value['name']) ?>
                 </option>
@@ -90,7 +90,7 @@ use Studip\Button, Studip\LinkButton;
             </select>
         <? elseif ($item->object_type === 'studycourse'): ?>
             <?= _('Typ/Abschnitt') ?>
-
+            
             <select name="object_class" required>
                 <option value="all_settings"<?= mb_strpos($item->object_class, 'all_settings') !== false ? ' selected' : '' ?>><?= _('alle (Abschnitt "Einstellungen")') ?></option>
                 <option value="all_info"<?= mb_strpos($item->object_class, 'all_info') !== false ? ' selected' : '' ?>><?= _('alle (Abschnitt "Inhalte und Informationen")') ?></option>
diff --git a/app/views/admin/datafields/index.php b/app/views/admin/datafields/index.php
index de4b512c8be011d9175bea4024c6d0f7a9e9fe28..e62b8d6fd0004832747a165d16ad94fd22a1694b 100644
--- a/app/views/admin/datafields/index.php
+++ b/app/views/admin/datafields/index.php
@@ -108,7 +108,7 @@
                 <?=  $val->object_class !== null ? htmlReady($GLOBALS['INST_TYPE'][$val->object_class]['name']) : _('alle')?>
             <? elseif ($key === 'moduldeskriptor' || $key === 'modulteildeskriptor') : ?>
                 <?=  $val->object_class !== null ? htmlReady(implode(', ', array_map(function ($class) {
-                    return Config::get()->CONTENT_LANGUAGES[$class]['name'];
+                    return $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$class]['name'];
                 }, explode(',', $val->object_class)))) : _('alle')?>
             <? elseif ($key === 'studycourse'): ?>
                 <? $object_classes =
diff --git a/app/views/admin/datafields/new.php b/app/views/admin/datafields/new.php
index 3b99d2d2205b11cdbd68e9d4744db1adb88c70ac..e64293ff5b6f354b2abcc88072924ea1d0917a06 100644
--- a/app/views/admin/datafields/new.php
+++ b/app/views/admin/datafields/new.php
@@ -72,13 +72,13 @@ use Studip\Button, Studip\LinkButton;
         <? elseif ($object_typ === 'moduldeskriptor') : ?>
             <select multiple name="object_class[]" required>
                 <option value="NULL" selected><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option>
-            <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?>
+            <? foreach ((array) $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?>
                 <option value="<?= htmlReady($key) ?>"><?= htmlReady($value['name']) ?></option>
             <? endforeach; ?>
         <? elseif ($object_typ === 'modulteildeskriptor') : ?>
             <select multiple name="object_class[]" required>
                 <option value="NULL" selected><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option>
-            <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?>
+            <? foreach ((array) $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?>
                 <option value="<?= htmlReady($key) ?>"><?= htmlReady($value['name']) ?></option>
             <? endforeach; ?>
         <? elseif ($object_typ === 'studycourse') : ?>
diff --git a/app/views/module/module/details.php b/app/views/module/module/details.php
index 3666f85478fdef2e212dc5f8049f69ef94bb9d81..4509d520e345caab979aa8f98a7132cdbe5aa99b 100644
--- a/app/views/module/module/details.php
+++ b/app/views/module/module/details.php
@@ -1,19 +1,8 @@
-<?php
-/**
- * @var Modul $modul
- * @var string $modulteil_id
- * @var string $display_language
- * @var Module_ModuleController $controller
- * @var string $institut_id
- */
-?>
-
 <td colspan="6">
     <table class="default collapsable sortable" id="<?= $modul->id ?>">
         <colgroup>
             <col>
-            <col style="width: 150px;">
-            <col style="width: 70px;">
+            <col span="2" style="width: 150px;">
         </colgroup>
         <? foreach ($modul->modulteile as $modulteil) : ?>
             <? $perm = MvvPerm::get($modulteil) ?>
@@ -31,8 +20,8 @@
                     </td>
                     <td class="dont-hide actions" style="white-space: nowrap; text-align: center;">
                         <? if ($perm->havePermWrite()) : ?>
-                            <? foreach ($modulteil->deskriptoren->getAvailableTranslations($modulteil->modul->original_language) as $language) : ?>
-                                <? $lang = Config::get()->CONTENT_LANGUAGES[$language]; ?>
+                            <? foreach ($modulteil->deskriptoren->getAvailableTranslations() as $language) : ?>
+                                <? $lang = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]; ?>
                                 <a href="<?= $controller->action_link('modulteil/' . join('/', [$modulteil->id, $institut_id]), ['display_language' => $language]) ?>">
                                     <?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?>
                                 </a>
diff --git a/app/views/module/module/index.php b/app/views/module/module/index.php
index 017d23dada2f7a66bd3e1a28aab1144feb9c25f0..1028a2db12067eaa8d27859ab4b35ea56605702a 100644
--- a/app/views/module/module/index.php
+++ b/app/views/module/module/index.php
@@ -1,21 +1,5 @@
-<?php
-/**
- * @var Module_ModuleController $controller
- * @var int $count
- * @var int $page
- */
-?>
-
 <?= $controller->jsUrl() ?>
 <table class="default collapsable">
-    <colgroup>
-        <col>
-        <col>
-        <col>
-        <col>
-        <col style="width: 150px">
-        <col style="width: 70px">
-    </colgroup>
     <caption>
         <?= _('Module')?>
         <span class="actions"><?= sprintf(ngettext('%s Modul', '%s Module', $count), $count) ?></span>
@@ -26,10 +10,10 @@
             <?= $controller->renderSortLink('module/module/', _('Modul'), 'bezeichnung') ?>
             <?= $controller->renderSortLink('module/module/', _('Fassung'), 'fassung_nr', ['style' => 'width: 5%;']) ?>
             <?= $controller->renderSortLink('module/module/', _('Modulteile'), 'count_modulteile', ['style' => 'width: 5%;']) ?>
-            <th style="text-align: center;">
+            <th style="text-align: right; width: 150px;">
                 <?= _('Ausgabesprachen') ?>
             </th>
-            <th style="text-align: right;"><?= _('Aktionen') ?></th>
+            <th style="width: 5%; text-align: right;"><?= _('Aktionen') ?></th>
         </tr>
     </thead>
     <?= $this->render_partial('module/module/module') ?>
diff --git a/app/views/module/module/modul.php b/app/views/module/module/modul.php
index 8fe49c83d3603983e25b9bf75babd8f74ea20f56..e209a1808b4bee1afe338827260c23784e762ffb 100644
--- a/app/views/module/module/modul.php
+++ b/app/views/module/module/modul.php
@@ -1,29 +1,9 @@
-<?php
-/**
- * @var Module_ModuleController $controller
- * @var Modul $modul
- * @var ModulDeskriptor $deskriptor
- * @var string $display_language
- * @var boolean $def_lang
- * @var QuickSearch $search_modul
- * @var string $qs_id_module
- * @var Semester[] $semester
- * @var QuickSearch $search_responsible
- * @var string $qs_id_responsible
- * @var QuickSearch $search_institutes
- * @var string $qs_id_institutes
- * @var SimpleORMapCollection $contacts
- * @var array $translations
- * @var string $cancel_url
- */
-?>
-
 <? use Studip\Button, Studip\LinkButton; ?>
 <?= $controller->jsUrl() ?>
 <?
 $perm   = MvvPerm::get($modul);
 $perm_d = MvvPerm::get($deskriptor);
-if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) {
+if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) {
     $perm_d->setVariant($display_language);
 }
 ?>
@@ -164,12 +144,12 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) {
                 <?= _('Beschlussdatum:') ?>
                 <? if ($perm->haveFieldPerm('beschlussdatum')) : ?>
                     <input type="text" name="beschlussdatum"
-                           value="<?= $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : '' ?>"
+                           value="<?= ($modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : '') ?>"
                            placeholder="<?= _('TT.MM.JJJJ') ?>" class="with-datepicker">
                 <? else : ?>
-                    <?= $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : '' ?>
+                    <?= ($modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : '') ?>
                     <input type="hidden" name="beschlussdatum"
-                           value="<?= $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : '' ?>">
+                           value="<?= ($modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : '') ?>">
                 <? endif; ?>
             </label>
             <label for="mvv-field-modul-fassung_nr"><?= _('Fassung:') ?>
@@ -216,7 +196,7 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) {
             </div>
             <div id="mvv-field-modul-beschlussdatum">
                 <? printf(_('Beschlussdatum: %s'),
-                    $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : _('nicht angegeben')) ?>
+                    $modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : _('nicht angegeben')) ?>
             </div>
             <div id="mvv-field-modul-fassung_nr">
                 <?
@@ -464,17 +444,6 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) {
         <? endif; ?>
         </label>
 
-        <? if ($def_lang && !$modul->isNew()) : ?>
-            <label id="mvv-field-modul-original_language"><?= _('Originalsprache der Modulbeschreibung') ?>
-                <select name="original_language" id="original_language">
-                <? foreach (Config::get()->CONTENT_LANGUAGES as $language_code => $content_language) : ?>
-                    <option value="<?= htmlReady($language_code) ?>"<?= $modul->original_language === $language_code ? ' selected' : '' ?>>
-                        <?= htmlReady($content_language['name']) ?>
-                    </option>
-                <? endforeach ?>
-                </select>
-            </label>
-        <? endif ?>
     </fieldset>
 
     <fieldset class="collapsable collapsed" id="mvv-field-modul-assigned_users">
@@ -688,7 +657,7 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) {
                             $entry->datafield_id,
                             $entry->range_id,
                             $entry->sec_range_id,
-                            $display_language === Config::get()->MVV_DEFAULT_LANGUAGE ? '' : $display_language
+                            $language == 'de_DE' ? '' : $language
                         ]); ?>
                 <? else : ?>
                     <? $df = $entry; ?>
@@ -725,6 +694,6 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) {
 </form>
 <? if (!$def_lang) : ?>
     <script>
-        jQuery('#modul_form').find('textarea, input[type=text]').after('<div style="padding-top:10px;"><a href="#" title="<?= _('Originalfassung anzeigen') ?>" class="mvv-show-original" data-type="modul"><?= Assets::img(MVV::getContentLanguageImagePath($modul->original_language), ['alt' => _('Originalfassung'), 'size' => 24]) ?></a></div>');
+        jQuery('#modul_form').find('textarea, input[type=text]').after('<div style="padding-top:10px;"><a href="#" title="<?= _('Originalfassung anzeigen') ?>" class="mvv-show-original" data-type="modul"><?= Assets::img(MVV::getContentLanguageImagePath($modul->getDefaultLanguage()), ['alt' => _('Originalfassung'), 'size' => 24]) ?></a></div>');
     </script>
 <? endif; ?>
diff --git a/app/views/module/module/module.php b/app/views/module/module/module.php
index 851aabdb1b56b09204b93425e4368da8ad003345..d6cda88fdf11408f1d35b1f38ae29a65cde35388 100644
--- a/app/views/module/module/module.php
+++ b/app/views/module/module/module.php
@@ -1,9 +1,3 @@
-<?php
-/**
- * @var Modul[] $module
- */
-?>
-
 <? foreach ($module as $modul) : ?>
     <? $perm = MvvPerm::get($modul) ?>
     <tbody class="<?= $modul->count_modulteile ? '' : 'empty ' ?><?= $modul_id === $modul->getId() ? 'not-collapsed' : 'collapsed' ?>">
@@ -35,13 +29,13 @@
                     <? endif;?>
                 </td>
             <? else : ?>
-                <td style="white-space:nowrap; font-weight: 700; padding-left: 20px;">
+                <td style="white-space:nowrap;">
                     <? if ($ampel_icon) : ?>
                         <?= $ampel_icon->asImg(['title' => $ampelstatus, 'style' => 'vertical-align: text-top;']) ?>
                     <? endif; ?>
                     <?= htmlReady($modul->code) ?>
                 </td>
-                <td class="dont-hide" style="font-weight: 700;">
+                <td class="dont-hide" style="font-weight: bold;">
                     <?= htmlReady($modul->getDisplayName()) ?>
                 </td>
             <? endif; ?>
@@ -49,12 +43,11 @@
             <td style="text-align: center;" class="dont-hide"><?= $modul->count_modulteile ?></td>
             <td class="dont-hide actions" style="text-align: center;">
                 <? if ($perm->havePermRead()) : ?>
-                    <? $languages = $modul->deskriptoren->getAvailableTranslations($modul->original_language); ?>
-                    <? $content_languages = Config::get()->CONTENT_LANGUAGES ?>
+                    <? $languages = $modul->deskriptoren->getAvailableTranslations(); ?>
                     <? foreach ($languages as $language) : ?>
+                        <? $lang = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]; ?>
                         <a href="<?= $controller->action_link('modul/' . $modul->id . '/', ['display_language' => $language]) ?>">
-                            <?= Assets::img(MVV::getContentLanguageImagePath($language),
-                                ['alt' => $content_languages[$language]['name'], 'size' => 24]) ?>
+                            <?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?>
                         </a>
                     <? endforeach; ?>
                 <? endif; ?>
diff --git a/app/views/module/module/select_module_language.php b/app/views/module/module/select_module_language.php
deleted file mode 100644
index 2e411abee5ba6fae8649bea56710cd157c35af30..0000000000000000000000000000000000000000
--- a/app/views/module/module/select_module_language.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * @var Module_ModuleController $controller
- * @var array $languages
- */
-?>
-
-<ul class="content-items" style="padding-top: 10px;">
-    <? foreach ($languages as $language) : ?>
-        <li class="content-item">
-            <a class="content-item-link" href="<?= $controller->modulURL(['display_language' => $language['code']]) ?>">
-                <div class="content-item-img-wrapper">
-                    <?= Assets::img('/images/languages/' . $language['picture'], ['size' => 64]) ?>
-                </div>
-                <div class="content-item-text">
-                    <p class="content-item-title">
-                        <?= htmlReady($language['name']) ?>
-                    </p>
-                    <p class="content-item-description">
-                        <? printf(_('Erstellen Sie ein Modul in der Originalsprache <em>%s</em>.'), $language['name']) ?>
-                    </p>
-                </div>
-            </a>
-        </li>
-    <? endforeach ?>
-</ul>
diff --git a/app/views/shared/deskriptor_language.php b/app/views/shared/deskriptor_language.php
index dde61204db42a39ab6aa3b3b7cd5815782005dc6..44cdb6502f3772cef416a539e7fa8377205c1558 100644
--- a/app/views/shared/deskriptor_language.php
+++ b/app/views/shared/deskriptor_language.php
@@ -1,21 +1,11 @@
-<?php
-/**
- * @var ModulDeskriptor|ModulteilDeskriptor $descriptor
- * @var string $original_language
- * @var string $display_language
- * @var string $link
- */
-?>
-
-<? $languages = $descriptor->getAvailableTranslations($original_language) ?>
-<? $content_languages = array_merge(array_flip($languages), Config::get()->CONTENT_LANGUAGES) ?>
-<? foreach ($content_languages as $code => $language) : ?>
+<? $table = get_class($modul) == 'Modul' ? 'mvv_modul_deskriptor' : 'mvv_modulteil_deskriptor'; ?>
+<? $languages = $modul->deskriptoren->getAvailableTranslations(); ?>
+<? foreach ($GLOBALS[strtoupper($table)]['SPRACHE']['values'] as $lang => $value) : ?>
 <div style="padding-top:10px;">
-    <a href="<?= URLHelper::getLink($link, ['display_language' => $code]) ?>">
-        <?= Assets::img(MVV::getContentLanguageImagePath($code), ['alt' => $language['name'], 'size' => 24]) ?>
-        <?= $language['name'] ?> (<?= ($code === $original_language ? 'Originalfassung, ' : '')
-            . (in_array($code, $languages) ? 'bearbeiten' : 'neu anlegen') ?>)
-        <?= $code === $display_language ? Icon::create('accept', Icon::ROLE_ACCEPT) : '' ?>
+    <a href="<?= URLHelper::getLink($link, ['display_language' => $lang]) ?>">
+        <?= Assets::img(MVV::getContentLanguageImagePath($lang), ['alt' => $value['name'], 'size' => 24]) ?>
+        <?= $value['name'] ?> (<?= in_array($lang, $languages) ? 'bearbeiten' : 'neu anlegen' ?>)
+        <?= $lang == $sprache ? Icon::create('accept', 'accept', [])->asImg() : '' ?>
     </a>
 </div>
-<? endforeach ?>
+<? endforeach; ?>
diff --git a/app/views/shared/modul/description.php b/app/views/shared/modul/description.php
index 7acb014f942c61cfa19ebfc0c8fda8ac7f665b86..59512bd94ea5c5b7f21481c55fb3e42651900210 100644
--- a/app/views/shared/modul/description.php
+++ b/app/views/shared/modul/description.php
@@ -1,15 +1,7 @@
-<?php
-/**
- * @var Modul $modul
- * @var int $type
- * @var Shared_ModulController $controller
- */
-?>
-
 <? if (count($modul->deskriptoren) > 1): ?>
 <div style="width: 100%; text-align: right;">
-    <? foreach ($modul->deskriptoren->getAvailableTranslations($modul->original_language) as $language) : ?>
-        <? $lang = Config::get()->CONTENT_LANGUAGES[$language]; ?>
+    <? foreach ($modul->deskriptoren->getAvailableTranslations() as $language) : ?>
+        <? $lang = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]; ?>
         <a data-dialog="size=auto;title='<?= htmlReady($modul->getDisplayName()) ?>'" href="<?= $controller->action_link('description/' . $modul->id . '/', ['display_language' => $language]) ?>">
             <?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?>
         </a>
@@ -27,4 +19,4 @@
 <? endif; ?>
 <? if ($type === 3) : ?>
     <?= $this->render_partial('shared/modul/_modul_ohne_lv') ?>
-<? endif; ?>
+<? endif; ?>
\ No newline at end of file
diff --git a/app/views/shared/modul/overview.php b/app/views/shared/modul/overview.php
index be91c7a6a181d4f3470fd995a6d84d55e4f0b65e..4bfd71efced6e1bfeaf1ad9de008c0e0504e1b02 100644
--- a/app/views/shared/modul/overview.php
+++ b/app/views/shared/modul/overview.php
@@ -1,15 +1,3 @@
-<?php
-/**
- * @var Modul $modul
- * @var Institute $institut
- * @var ModulDeskriptor $deskriptor
- * @var array $modulteile
- * @var Semester $semester
- * @var string $pruef_ebene
- * @var int $type
- */
-?>
-
 <table class="default mvv-modul-details nohover">
     <tr>
         <th class="mvv-modul-details-head" style="width: 30%"><?= htmlReady($modul->code) ?></th>
@@ -46,10 +34,10 @@
     <tr>
         <td colspan="4" style="padding: 0;">
             <table class="default nohover">
-                <? if (mb_strlen($deskriptor->voraussetzung) > 0): ?>
+                <? if (mb_strlen($teilnahmeVoraussetzung) > 0): ?>
                     <tr>
                         <td style="width: 20%; font-weight: bold;"><?= _('Teilnahmevoraussetzungen') ?></td>
-                        <td ><?= formatReady($deskriptor->voraussetzung) ?></td>
+                        <td ><?= formatReady($teilnahmeVoraussetzung) ?></td>
                     </tr>
                 <? endif; ?>
                 <? if (mb_strlen($deskriptor->kommentar)) : ?>
@@ -116,7 +104,7 @@
                 <th><?= _('Prüfungsleistung') ?></th>
             <? endif; ?>
         </tr>
-        <? foreach ($modulteile as $modul_teil): ?>
+        <? foreach ($modulTeile as $modul_teil): ?>
             <tr>
                 <? if ($type === 1): ?>
                 <td>
diff --git a/config/mvv_config.php b/config/mvv_config.php
index 79ee9157bfb9d61120108c3f9d186b5ada8700c3..dae7c5d7c15e6bcbf36518b2036a2694372a182a 100644
--- a/config/mvv_config.php
+++ b/config/mvv_config.php
@@ -114,6 +114,17 @@ $GLOBALS['MVV_MODUL']['INSTITUT_GRUPPEN'] = [
     ]
 ];
 
+// Moduldeskriptor Ausgabesprache
+$GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE'] = [
+    'values'            => [
+        'DE'                => ['visible' => 1, 'name' => _('Originalfassung'), 'content_language' => 'de_DE'],
+        'EN'                => ['visible' => 1, 'name' => _('Englisch'), 'content_language' => 'en_GB']
+    //    'de_DE'                => array('visible' => 1, 'name' => _('Originalfassung')),
+    //    'en_GB'                => array('visible' => 1, 'name' => _('Englisch'))
+    ],
+    'default'           => 'DE'
+];
+
 // Modulteile
 $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG'] = [
     'values'            => [
@@ -190,6 +201,9 @@ $GLOBALS['MVV_MODULTEIL']['LERNLEHRFORM'] = [
     'default'           => ''
 ];
 
+// Modulteildeskriptor
+$GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE'] = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE'];
+
 // Maximale Anzahl Fachsemester
 $GLOBALS['MVV_MODULTEIL_FACHSEMESTER'] = 10;
 
@@ -216,6 +230,16 @@ $GLOBALS['MVV_STGTEILVERSION']['STATUS'] = $GLOBALS['MVV_MODUL']['STATUS'];
 
 $GLOBALS['MVV_STGTEIL']['STATUS'] = $GLOBALS['MVV_MODUL']['STATUS'];
 
+$GLOBALS['MVV_LANGUAGES'] = [
+    'values'            => [
+        'DE'                => ['visible' => 1, 'name' => _('Deutsch'),
+                                'locale' => 'de_DE'],
+        'EN'                => ['visible' => 1, 'name' => _('Englisch'),
+                                'locale' => 'en_GB']
+    ],
+    'default'           => 'DE'
+];
+
 $GLOBALS['MVV_STUDIENGANG']['FASSUNG_TYP'] = $GLOBALS['MVV_STGTEILVERSION']['FASSUNG_TYP'];
 
 $GLOBALS['MVV_STUDIENGANG']['STUDYCOURSE_TYPE'] = [
diff --git a/db/migrations/6.0.36_step_4261.php b/db/migrations/6.0.36_step_4261.php
deleted file mode 100644
index 0e5fe3953686bedb531c093ecb61f10e1e1cdbfb..0000000000000000000000000000000000000000
--- a/db/migrations/6.0.36_step_4261.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-final class Step4261 extends Migration
-{
-    public function description()
-    {
-        return 'Add field to module table to store original language.';
-    }
-
-    protected function up()
-    {
-        $db = DBManager::get();
-
-        // retrieve default language from config
-        $config_language = $db->fetchColumn(
-            "SELECT `value` FROM `config` WHERE `field` = 'DEFAULT_LANGUAGE'"
-        );
-        $default_language = $config_language ?? array_keys($GLOBALS['CONTENT_LANGUAGES'])[0] ?? 'de_DE';
-        $db->execute(
-            'ALTER TABLE `mvv_modul`
-            ADD `original_language` VARCHAR(10) NOT NULL DEFAULT ? COLLATE latin1_bin AFTER `verantwortlich`',
-            [$default_language]
-        );
-
-        $query = "INSERT INTO `config` (`field`, `value`, `type`, `range`, `section`, `mkdate`, `chdate`, `description`)
-                  VALUES ('MVV_DEFAULT_LANGUAGE', ?, 'string', 'global', 'mvv', UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), ?)";
-        $db->execute($query,
-            [
-                $default_language,
-                'Code der Inhalts-Sprache, die als Original-Sprache der Deskriptoren für Module und Modulteile vorausgewählt ist.',
-            ]
-        );
-    }
-
-    protected function down()
-    {
-        $db = DBManager::get();
-
-        $db->exec(
-            "ALTER TABLE `mvv_modul`
-            DROP COLUMN `original_language`"
-        );
-
-        $query = "DELETE `config`, `config_values`
-                  FROM `config`
-                  LEFT JOIN `config_values` USING (`field`)
-                  WHERE `field` = 'MVV_DEFAULT_LANGUAGE'";
-        $db->exec($query);
-    }
-}
diff --git a/lib/classes/MVV.php b/lib/classes/MVV.php
index 83568a90bf29909cef23e2e3f45c21b45934a58e..b4d9edf6eec9101e18662df2e4f16eaec1332145 100644
--- a/lib/classes/MVV.php
+++ b/lib/classes/MVV.php
@@ -834,7 +834,7 @@ class MVV implements Loggable {
     }
 
     /**
-     * Returns image path for given language, used by MVV
+     * Returns imagepath for given language, used by MVV
      * First tries $GLOBALS['CONTENT_LANGUAGES'], if not defined returns hardcoded path
      *
      * @param string $language e.g. 'DE'
@@ -842,8 +842,8 @@ class MVV implements Loggable {
      */
     public static function getContentLanguageImagePath($language): string
     {
-        $code = strtok($language, '_');
-        return 'languages/' . ($GLOBALS['CONTENT_LANGUAGES'][$language]['picture'] ?? 'lang_' . mb_strtolower($code) . '.gif');
+        $content_language = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]['content_language'];
+        return 'languages/' . ($GLOBALS['CONTENT_LANGUAGES'][$content_language]['picture'] ?? 'lang_' . mb_strtolower($language) . '.gif');
     }
 
 }
diff --git a/lib/models/Lvgruppe.php b/lib/models/Lvgruppe.php
index 6f82215dd460fa6ab8808b4a82236f8fa86efd40..5e9eb7bef4780404d94bbd6d720c5cd08cdcdcbd 100644
--- a/lib/models/Lvgruppe.php
+++ b/lib/models/Lvgruppe.php
@@ -583,7 +583,9 @@ class Lvgruppe extends ModuleManagementModelTreeItem
         $modul = Modul::find($modul_id);
         if ($modul) {
             $name = $modul->responsible_institute->institute->getShortName();
-            $short_name_modul = $modul->getDeskriptor()->bezeichnung_kurz;
+            $short_name_modul = $modul->getDeskriptor(
+                    $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['default'])
+                    ->bezeichnung_kurz;
             $name .= $short_name_modul ? ' ' . $short_name_modul : '';
         }
          *
@@ -592,6 +594,7 @@ class Lvgruppe extends ModuleManagementModelTreeItem
         $modulteil = Modulteil::findCached($modulteil_id);
         if ($modulteil) {
             $name = $modulteil->getDeskriptor()->bezeichnung;
+            //$name = $name_modulteil ? ' ' . $name_modulteil : '';
         }
         return $name;
     }
diff --git a/lib/models/Modul.php b/lib/models/Modul.php
index 70ffad6ccaccd36be64123d7afa1205175c6ab50..31f4bbec7f0f775d296d3862dcec2598f550de66 100644
--- a/lib/models/Modul.php
+++ b/lib/models/Modul.php
@@ -36,7 +36,6 @@
  * @property string|null $stat database column
  * @property string|null $kommentar_status database column
  * @property string|null $verantwortlich database column
- * @property string $original_language database column
  * @property string $author_id database column
  * @property string $editor_id database column
  * @property int $mkdate database column
@@ -384,12 +383,14 @@ class Modul extends ModuleManagementModelTreeItem
      * previously set by ApplicationSimpleORMap::setLanguage() or the one
      * defined as default in mvv_config.php.
      */
-    private function setDefaultLanguage(): void
+    private function setDefaultLanguage()
     {
-        if ($this->isNew()) {
-            $this->default_language = Config::get()->MVV_DESCRIPTOR_DEFAULT_LANGUAGE;
+        if (isset($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values']
+                [ModuleManagementModel::getLanguage()])) {
+            $this->default_language = ModuleManagementModel::getLanguage();
         } else {
-            $this->default_language = $this->original_language;
+            $this->default_language =
+                    $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['default'];
         }
     }
 
@@ -404,13 +405,18 @@ class Modul extends ModuleManagementModelTreeItem
     }
 
     /**
-     * Returns the descriptor. If this component has no descriptor already
-     * a new one is created and returned.
+     * Returns the Deskriptor in the given language. A Modul has always a
+     * Deskriptor in the default language. If the given language is unknown, the
+     * method returns the deskriptor in the default language.
      *
-     * @return ModulDeskriptor The descriptor.
+     * @param string $language The id of the language
+     * @param bool If true returns always a new descriptor
+     * @return object The Deskriptor.
      */
-    public function getDeskriptor()
-    {
+    public function getDeskriptor($language = null, $force_new = false) {
+        if (!isset($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language])) {
+            $language = $this->default_language;
+        }
         if (!$this->deskriptoren) {
             // the module is new and has no descriptor
             // return a new descriptor in the default language
@@ -475,7 +481,7 @@ class Modul extends ModuleManagementModelTreeItem
     /**
      * Assignes languages of instruction to this part-module.
      *
-     * @param array $languages An array of language keys defined in mvv_config.php.
+     * @param type $languages An array of language keys defined in mvv_config.php.
      */
     public function assignLanguagesOfInstruction($languages)
     {
diff --git a/lib/models/ModulDeskriptor.php b/lib/models/ModulDeskriptor.php
index 9f48fc2caa0efaca4f1e8920ac2d74bab4ca96be..5a3d07152cf27d030a2179dcbb685d3dde9b4bed 100644
--- a/lib/models/ModulDeskriptor.php
+++ b/lib/models/ModulDeskriptor.php
@@ -140,13 +140,12 @@ class ModulDeskriptor extends ModuleManagementModel
      * @see ModuleManagementModel::getVariant()
      * @return string The language identifier.
      */
-    public function getVariant(): string
+    public function getVariant()
     {
-        if (self::getLanguage() === Config::get()->MVV_DESCRIPTOR_DEFAULT_LANGUAGE) {
+        if (self::getLanguage() == $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['default']) {
             return '';
         }
-        $splitted_code = explode('_', self::getLanguage());
-        return mb_strtoupper($splitted_code[0] ?? '');
+        return self::getLanguage();
     }
 
     /**
@@ -157,6 +156,7 @@ class ModulDeskriptor extends ModuleManagementModel
      */
     public function deleteTranslation($language)
     {
-        return I18NString::removeAllTranslations($this->id, 'mvv_modul_deskriptor', $language);
+        $locale = $GLOBALS['MVV_LANGUAGES']['values'][$language]['locale'];
+        return I18NString::removeAllTranslations($this->id, 'mvv_modul_deskriptor', $locale);
     }
 }
diff --git a/lib/models/ModuleManagementModel.php b/lib/models/ModuleManagementModel.php
index 88b264f6008107f5a841922195915bfc6eaecd15..3bd5eb75b4fde2be9ba1572742d050fa8d90879d 100644
--- a/lib/models/ModuleManagementModel.php
+++ b/lib/models/ModuleManagementModel.php
@@ -725,26 +725,25 @@ abstract class ModuleManagementModel extends SimpleORMap implements ModuleManage
      */
     public static function setContentLanguage($language)
     {
-        if (!is_array(Config::get()->CONTENT_LAGUAGES[$language])) {
+        if (!is_array($GLOBALS['MVV_LANGUAGES']['values'][$language])) {
             throw new InvalidArgumentException();
         }
-        I18NString::setContentLanguage($language);
+        $locale = $GLOBALS['MVV_LANGUAGES']['values'][$language]['locale'];
+        I18NString::setContentLanguage($locale);
         self::$language = $language;
     }
 
-    public function getAvailableTranslations(string $original_language): array
+    public function getAvailableTranslations()
     {
-        $translations = [];
+        $translations[] = $GLOBALS['MVV_LANGUAGES']['default'];
         $stmt = DBManager::get()->prepare('SELECT DISTINCT `lang` '
                 . 'FROM i18n '
                 . 'WHERE `object_id` = ? AND `table` = ?');
         $stmt->execute([$this->id, $this->db_table()]);
-        $languages = array_merge([$original_language],
-            $stmt->fetchAll(PDO::FETCH_COLUMN));
-        $content_languages = Config::get()->CONTENT_LANGUAGES;
-        foreach ($languages as $code) {
-            if (is_array($content_languages[$code])) {
-                $translations[] = $code;
+        foreach ($stmt->fetchAll() as $locale) {
+            $language = mb_strtoupper(mb_strstr($locale['lang'], '_', true));
+            if (is_array($GLOBALS['MVV_LANGUAGES']['values'][$language])) {
+                $translations[] = $language;
             }
         }
         return $translations;
diff --git a/lib/models/Modulteil.php b/lib/models/Modulteil.php
index cc992afa38b11b2d67cf3c7efd695fb22bc93d98..3b8f146de6fc2138bd2a38754e8f480976f4e080 100644
--- a/lib/models/Modulteil.php
+++ b/lib/models/Modulteil.php
@@ -114,11 +114,7 @@ class Modulteil extends ModuleManagementModelTreeItem
     {
         parent::__construct($id);
         $this->object_real_name = _('Modulteil');
-        if ($this->modul) {
-            $this->default_language = $this->modul->original_language;
-        } else {
-            $this->default_language = Config::get()->MVV_DESCRIPTOR_DEFAULT_LANGUAGE;
-        }
+        $this->default_language = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['default'];
     }
 
     /**
@@ -169,7 +165,7 @@ class Modulteil extends ModuleManagementModelTreeItem
 
     public function getDisplayName()
     {
-        $deskriptor = $this->getDeskriptor();
+        $deskriptor = $this->getDeskriptor(self::getLanguage());
         $template = Config::get()->MVV_TEMPLATE_NAME_MODULTEIL;
         if (trim($template)) {
             $placeholders = [
@@ -214,12 +210,19 @@ class Modulteil extends ModuleManagementModelTreeItem
     }
 
     /**
-     * Returns the descriptor. If this component has no descriptor already
-     * a new one is created and returned.
+     * Returns the Deskriptor in the given language. A Modul has always a
+     * Deskriptor in the default language. If the given language is unknown, the
+     * method returns the deskriptor in the default language.
      *
-     * @return ModulteilDeskriptor The descriptor.
+     * @param string $language The id of the language
+     * @param bool If true returns always a new descriptor
+     * @return object The Deskriptor.
      */
-    public function getDeskriptor() {
+    public function getDeskriptor($language = null, $force_new = false) {
+        if (!isset($GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$language])) {
+            $language = $this->default_language;
+        }
+
         if (!$this->deskriptoren) {
             // the module is new and has no descriptor
             // return a new descriptor in the default language
diff --git a/lib/models/ModulteilDeskriptor.php b/lib/models/ModulteilDeskriptor.php
index ebe5026f9d5ff14f2c5205746b01c9f4019e8469..aa6ddf7054bd7b287a30cc347c6c85fce0c9368e 100644
--- a/lib/models/ModulteilDeskriptor.php
+++ b/lib/models/ModulteilDeskriptor.php
@@ -114,13 +114,12 @@ class ModulteilDeskriptor extends ModuleManagementModel
      * @see ModuleManagementModel::getVariant()
      * @return string The language identifier.
      */
-    public function getVariant(): string
+    public function getVariant()
     {
-        if (self::getLanguage() === Config::get()->MVV_DESCRIPTOR_DEFAULT_LANGUAGE) {
+        if (self::getLanguage() == $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['default']) {
             return '';
         }
-        $splitted_code = explode('_', self::getLanguage());
-        return mb_strtoupper($splitted_code[0] ?? '');
+        return self::getLanguage();
     }
 
     /**
@@ -131,6 +130,7 @@ class ModulteilDeskriptor extends ModuleManagementModel
      */
     public function deleteTranslation($language)
     {
-        return I18NString::removeAllTranslations($this->id, 'mvv_modulteil_deskriptor', $language);
+        $locale = $GLOBALS['MVV_LANGUAGES']['values'][$language]['locale'];
+        return I18NString::removeAllTranslations($this->id, 'mvv_modulteil_deskriptor', $locale);
     }
 }