From 207406981b8a86f3db95ba7d155e49c5ffcce246 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Noack?= <noack@data-quest.de>
Date: Wed, 4 Sep 2024 08:01:19 +0000
Subject: [PATCH] Resolve "Ausbau der Elearning Schnittstelle"

Closes #4109

Merge request studip/studip!3351
---
 app/controllers/course/elearning.php          |  365 ------
 app/controllers/elearning.php                 |  174 ---
 app/controllers/loncapa.php                   |   34 -
 app/views/elearning/my_accounts.php           |   48 -
 config/config_defaults.inc.php                |   82 --
 db/migrations/6.0.16_step_4109.php            |   47 +
 lib/bootstrap.php                             |    5 +-
 lib/classes/UserManagement.php                |   18 -
 lib/elearning/ConnectedCMS.php                |  466 -------
 lib/elearning/ConnectedLink.php               |  129 --
 lib/elearning/ConnectedPermissions.php        |   57 -
 lib/elearning/ConnectedUser.php               |  512 --------
 lib/elearning/ContentModule.php               |  388 ------
 lib/elearning/ContentModuleView.php           |  189 ---
 lib/elearning/ELearningUtils.php              |  612 ----------
 lib/elearning/Ilias3ConnectedCMS.php          |  350 ------
 lib/elearning/Ilias3ConnectedLink.php         |  188 ---
 lib/elearning/Ilias3ConnectedPermissions.php  |  256 ----
 lib/elearning/Ilias3ConnectedUser.php         |  345 ------
 lib/elearning/Ilias3ContentModule.php         |  292 -----
 lib/elearning/Ilias3ObjectXMLParser.php       |  236 ----
 lib/elearning/Ilias3SaxParser.php             |  230 ----
 lib/elearning/Ilias3Soap.php                  | 1069 -----------------
 lib/elearning/Ilias4ConnectedCMS.php          |  271 -----
 lib/elearning/Ilias4ConnectedLink.php         |  124 --
 lib/elearning/Ilias4ConnectedPermissions.php  |  126 --
 lib/elearning/Ilias4ConnectedUser.php         |  168 ---
 lib/elearning/Ilias4ContentModule.php         |  106 --
 lib/elearning/Ilias4Soap.php                  |  181 ---
 lib/elearning/Ilias5ConnectedCMS.php          |   21 -
 lib/elearning/Ilias5ConnectedLink.php         |   16 -
 lib/elearning/Ilias5ConnectedPermissions.php  |   17 -
 lib/elearning/Ilias5ConnectedUser.php         |   40 -
 lib/elearning/Ilias5ContentModule.php         |   16 -
 lib/elearning/Ilias5Soap.php                  |  114 --
 lib/elearning/LonCapaConnectedCMS.php         |   67 --
 lib/elearning/LonCapaConnectedLink.php        |   67 --
 lib/elearning/LonCapaContentModule.php        |   86 --
 lib/elearning/LonCapaRequest.php              |  110 --
 lib/elearning/ObjectConnections.php           |  254 ----
 lib/elearning/PmWikiConnectedCMS.php          |   86 --
 lib/elearning/PmWikiConnectedLink.php         |  134 ---
 lib/elearning/PmWikiContentModule.php         |  115 --
 .../clients/soap_webservice_client.php        |   25 -
 lib/elearning/clients/webservice_client.php   |   29 -
 .../clients/xml_rpc_webservice_client.php     |   33 -
 .../StudipSoapClient.php}                     |    0
 .../studip_referrer_7x.php                    |    0
 .../studip_referrer_8x.php                    |    0
 lib/models/Course.php                         |   12 -
 lib/modules/CoreElearningInterface.php        |  143 ---
 lib/navigation/AdminNavigation.php            |    4 -
 lib/navigation/ContentsNavigation.php         |    8 -
 lib/navigation/StartNavigation.php            |    5 -
 lib/soap/StudipSoapClient.php                 |   58 -
 public/admin_elearning_interface.php          |  196 ---
 public/ilias3_referrer.php                    |   78 --
 57 files changed, 48 insertions(+), 8754 deletions(-)
 delete mode 100644 app/controllers/course/elearning.php
 delete mode 100644 app/controllers/elearning.php
 delete mode 100644 app/controllers/loncapa.php
 delete mode 100644 app/views/elearning/my_accounts.php
 create mode 100644 db/migrations/6.0.16_step_4109.php
 delete mode 100644 lib/elearning/ConnectedCMS.php
 delete mode 100644 lib/elearning/ConnectedLink.php
 delete mode 100644 lib/elearning/ConnectedPermissions.php
 delete mode 100644 lib/elearning/ConnectedUser.php
 delete mode 100644 lib/elearning/ContentModule.php
 delete mode 100644 lib/elearning/ContentModuleView.php
 delete mode 100644 lib/elearning/ELearningUtils.php
 delete mode 100644 lib/elearning/Ilias3ConnectedCMS.php
 delete mode 100644 lib/elearning/Ilias3ConnectedLink.php
 delete mode 100644 lib/elearning/Ilias3ConnectedPermissions.php
 delete mode 100644 lib/elearning/Ilias3ConnectedUser.php
 delete mode 100644 lib/elearning/Ilias3ContentModule.php
 delete mode 100644 lib/elearning/Ilias3ObjectXMLParser.php
 delete mode 100644 lib/elearning/Ilias3SaxParser.php
 delete mode 100644 lib/elearning/Ilias3Soap.php
 delete mode 100644 lib/elearning/Ilias4ConnectedCMS.php
 delete mode 100644 lib/elearning/Ilias4ConnectedLink.php
 delete mode 100644 lib/elearning/Ilias4ConnectedPermissions.php
 delete mode 100644 lib/elearning/Ilias4ConnectedUser.php
 delete mode 100644 lib/elearning/Ilias4ContentModule.php
 delete mode 100644 lib/elearning/Ilias4Soap.php
 delete mode 100644 lib/elearning/Ilias5ConnectedCMS.php
 delete mode 100644 lib/elearning/Ilias5ConnectedLink.php
 delete mode 100644 lib/elearning/Ilias5ConnectedPermissions.php
 delete mode 100644 lib/elearning/Ilias5ConnectedUser.php
 delete mode 100644 lib/elearning/Ilias5ContentModule.php
 delete mode 100644 lib/elearning/Ilias5Soap.php
 delete mode 100644 lib/elearning/LonCapaConnectedCMS.php
 delete mode 100644 lib/elearning/LonCapaConnectedLink.php
 delete mode 100644 lib/elearning/LonCapaContentModule.php
 delete mode 100644 lib/elearning/LonCapaRequest.php
 delete mode 100644 lib/elearning/ObjectConnections.php
 delete mode 100644 lib/elearning/PmWikiConnectedCMS.php
 delete mode 100644 lib/elearning/PmWikiConnectedLink.php
 delete mode 100644 lib/elearning/PmWikiContentModule.php
 delete mode 100644 lib/elearning/clients/soap_webservice_client.php
 delete mode 100644 lib/elearning/clients/webservice_client.php
 delete mode 100644 lib/elearning/clients/xml_rpc_webservice_client.php
 rename lib/{soap/StudipSoapClient_PHP5.php => ilias_interface/StudipSoapClient.php} (100%)
 rename lib/{elearning => ilias_interface}/studip_referrer_7x.php (100%)
 rename lib/{elearning => ilias_interface}/studip_referrer_8x.php (100%)
 delete mode 100644 lib/modules/CoreElearningInterface.php
 delete mode 100644 lib/soap/StudipSoapClient.php
 delete mode 100644 public/admin_elearning_interface.php
 delete mode 100644 public/ilias3_referrer.php

diff --git a/app/controllers/course/elearning.php b/app/controllers/course/elearning.php
deleted file mode 100644
index 6e67b64a653..00000000000
--- a/app/controllers/course/elearning.php
+++ /dev/null
@@ -1,365 +0,0 @@
-<?php
-/**
- * Elearning Interface für Veranstaltungen/ Einrichtungen
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * @author   Arne Schröder <schroeder@data-quest.de>
- * @license  http://www.gnu.org/licenses/gpl-2.0.html GPL version 2
- * @category Stud.IP
- * @since    3.1
- */
-
-class Course_ElearningController extends AuthenticatedController
-{
-    /**
-     * Before filter, set up the page by initializing the session and checking
-     * all conditions.
-     *
-     * @param String $action Name of the action to be invoked
-     * @param Array  $args   Arguments to be passed to the action method
-     */
-    public function before_filter(&$action, &$args)
-    {
-        parent::before_filter($action, $args);
-
-        if (!Config::Get()->ELEARNING_INTERFACE_ENABLE ) {
-            throw new AccessDeniedException(_('Elearning-Interface ist nicht aktiviert.'));
-        } else
-            $this->elearning_active = true;
-
-        PageLayout::setHelpKeyword('Basis.Ilias');
-        PageLayout::setTitle(Context::getHeaderLine(). " - " . _("Lernmodule"));
-
-        checkObject(); // do we have an open object?
-        $module = checkObjectModule('ElearningInterface');
-        object_set_visit_module($module->getPluginId());
-
-        $this->search_key = Request::get('search_key');
-        $GLOBALS['search_key'] = $this->search_key;
-        $this->cms_select = Request::quoted('cms_select');
-        $GLOBALS['cms_select'] = $this->cms_select;
-        $this->open_all = Request::get('open_all');
-        $this->close_all = Request::get('close_all');
-        $this->new_account_cms = Request::get('new_account_cms');
-        $this->module_system_type = Request::get('module_system_type');
-        $this->module_id = Request::get('module_id');
-        $this->module_type = Request::get('module_type');
-        $this->anker_target = Request::get('anker_target');
-        $this->seminar_id = Context::getId();
-        $this->rechte = $GLOBALS['perm']->have_studip_perm('tutor', $this->seminar_id);
-        if (!isset($GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->new_account_cms])) {
-            unset($this->new_account_cms);
-        }
-        if (!isset($GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_select])) {
-            unset($this->cms_select);
-        }
-        if (
-            isset($_SESSION['elearning_open_close']['id'])
-            && $this->seminar_id !== $_SESSION['elearning_open_close']['id']
-        ) {
-            unset($_SESSION['cache_data']);
-            unset($_SESSION['elearning_open_close']);
-        }
-        if ($this->open_all != "")
-            $_SESSION['elearning_open_close']["all open"] = true;
-        elseif ($this->close_all != "")
-            $_SESSION['elearning_open_close']["all open"] = "";
-        $_SESSION['elearning_open_close']["type"] = "seminar";
-        $_SESSION['elearning_open_close']["id"] = $this->seminar_id;
-        if (Request::get('do_open')) {
-            $this->anker_target = Request::get('do_open');
-            $_SESSION['elearning_open_close'][Request::get('do_open')] = true;
-        } elseif (Request::get('do_close')) {
-            $this->anker_target = Request::get('do_close');
-            $_SESSION['elearning_open_close'][Request::get('do_close')] = false;
-        }
-        $this->sidebar = Sidebar::get();
-        $this->sidebar->setContextAvatar(CourseAvatar::getAvatar($this->seminar_id));
-    }
-
-    /**
-     * Displays a page.
-     */
-    public function show_action($id = null)
-    {
-        global $connected_cms, $current_module;
-        Navigation::activateItem('/course/elearning/show');
-        $GLOBALS['view'] = 'show';
-
-        // Zugeordnete Ilias-Kurse ermitteln und ggf. aktualisieren
-        $this->course_output = ELearningUtils::getIliasCourses($this->seminar_id);
-        if (!empty($this->new_account_cms)) {
-            //Dummy-Instanz der Zuordnungs-Klasse ohne Verbindung zur Veranstaltung
-            $object_connections = new ObjectConnections();
-        } else {
-            //Instanz mit den Zuordnungen von Content-Modulen zur Veranstaltung
-            $object_connections = new ObjectConnections($this->seminar_id);
-
-            $connected_modules = $object_connections->getConnections();
-        }
-        $this->module_count = 0;
-        $content_modules_list = [];
-        if ($object_connections->isConnected()) {
-            $caching_active = true;
-            $type_tmp = [];
-
-            if (!empty($connected_modules)) {
-                foreach ($connected_modules as $key => $connection) {
-                    if (ELearningUtils::isCMSActive($connection["cms"])) {
-
-                        ELearningUtils::loadClass($connection["cms"]);
-
-                        $connected_cms[$connection["cms"]]->newContentModule($connection["id"], $connection["type"], true);
-                        $connected_modules[$key]['title'] = $connected_cms[$connection["cms"]]->content_module[$connection["id"]]->getTitle();
-                        $title_tmp[$key] = str_replace(['ä','ö','ü','ß'],['ae','oe','ue','ss'],mb_strtolower($connected_modules[$key]['title']));
-                        $type_tmp[$key] = array_search($connection['type'], array_keys($GLOBALS['ELEARNING_INTERFACE_MODULES'][$connection["cms"]]['types']));
-                        $class_tmp[$key] = $GLOBALS['ELEARNING_INTERFACE_MODULES'][$connection["cms"]]["CLASS_PREFIX"];
-                    }
-                }
-            }
-            array_multisort($class_tmp, SORT_ASC, $type_tmp, SORT_ASC, $title_tmp, SORT_ASC, $connected_modules);
-
-            foreach ($connected_modules as $index => $connection) {
-                $current_module = $connection["id"];
-
-                if ($this->module_count == 0)
-                    $content_modules_list[$index]['show_header'] = true;
-                $this->module_count++;
-                $this->module_system_count[$connection["cms"]]++;
-
-                if ($this->open_all != "")
-                    $_SESSION['elearning_open_close'][$connected_cms[$connection["cms"]]->content_module[$connection["id"]]->getReferenceString()] = true;
-                elseif ($this->close_all != "")
-                    $_SESSION['elearning_open_close'][$connected_cms[$connection["cms"]]->content_module[$connection["id"]]->getReferenceString()] = false;
-
-                $connected_cms[$connection["cms"]]->content_module[$connection["id"]]->view->setChangeDate($connection["chdate"]);
-                $content_modules_list[$index]['module'] = $connected_cms[$connection["cms"]]->content_module[$connection["id"]]->view->show();
-            }
-        }
-        if (!$this->module_count && !$this->new_account_cms) {
-            if (Context::isInstitute()) {
-                PageLayout::postInfo(_('Momentan sind dieser Einrichtung keine Lernmodule zugeordnet.'));
-            } else {
-                PageLayout::postInfo(_('Momentan sind dieser Veranstaltung keine Lernmodule zugeordnet.'));
-            }
-        }
-
-        $widget = new ActionsWidget();
-        $widget->addLink(
-            _('Externe Accounts verwalten'),
-            URLHelper::getURL('dispatch.php/elearning/my_accounts'),
-            Icon::create('person')
-        );
-        if ($this->course_output['courses'])
-            foreach ($this->course_output['courses'] as $course) {
-                $widget->addLink(
-                    sprintf(_('Direkt zum Kurs in %s'), $course['cms_name']),
-                    $course['url'],
-                    Icon::create('link-extern'),
-                    ['target' => '_blank', 'rel' => 'noopener noreferrer']
-                );
-            }
-        $this->sidebar->addWidget($widget);
-        $this->new_account = $this->new_account_cms;
-        $this->content_modules = $content_modules_list;
-    }
-
-    /**
-     * Displays a page.
-     */
-    public function edit_action($id = null)
-    {
-        global $connected_cms, $current_module;
-        if (!$this->rechte) {
-            throw new AccessDeniedException();
-        }
-        Navigation::activateItem('/course/elearning/edit');
-        $GLOBALS['view'] = 'edit';
-        // ggf. neuen Ilias4-Kurs anlegen
-        if (Request::submitted('create_course') AND $this->rechte) {
-            ELearningUtils::loadClass($this->cms_select);
-            if ((method_exists($connected_cms[$this->cms_select], "createCourse")))
-                if ($connected_cms[$this->cms_select]->createCourse($this->seminar_id))
-                    PageLayout::postInfo(_('Kurs wurde angelegt.'));
-        }
-
-        // ggf. bestehenden Ilias4-Kurs zuordnen
-        if (Request::submitted('connect_course')) {
-            if (
-                ObjectConnections::getConnectionModuleId(Request::option('connect_course_sem_id'), 'crs', $this->cms_select)
-                && $GLOBALS['perm']->have_studip_perm('dozent', Request::option('connect_course_sem_id'))
-            ) {
-                ObjectConnections::setConnection($this->seminar_id, ObjectConnections::getConnectionModuleId(Request::option("connect_course_sem_id"), "crs", $this->cms_select), "crs", $this->cms_select);
-                PageLayout::postInfo(_('Zuordnung wurde gespeichert.'));
-                ELearningUtils::loadClass($this->cms_select);
-                if ((method_exists($connected_cms[$this->cms_select], "updateConnections")))
-                    $connected_cms[$this->cms_select]->updateConnections( ObjectConnections::getConnectionModuleId(Request::option("connect_course_sem_id"), "crs", $this->cms_select) );
-            }
-        }
-
-        // Zugeordnete Ilias-Kurse ermitteln und ggf. aktualisieren
-        $this->course_output = ELearningUtils::getIliasCourses($this->seminar_id);
-        if ($this->new_account_cms == "") {
-            if ($this->module_system_type != "") {
-                $user_crs_role = $connected_cms[$this->module_system_type]->crs_roles[$GLOBALS['auth']->auth["perm"]];
-                ELearningUtils::loadClass($this->module_system_type);
-            }
-            if (Request::submitted('remove')) {
-                $connected_cms[$this->module_system_type]->newContentModule($this->module_id, $this->module_type, true);
-                if ($connected_cms[$this->module_system_type]->content_module[$this->module_id]->unsetConnection($this->seminar_id, $this->module_id, $this->module_type, $this->module_system_type))
-                    PageLayout::postInfo(_('Die Zuordnung wurde entfernt.'));
-                unset($connected_cms[$this->module_system_type]->content_module[$this->module_id]);
-            } elseif (Request::submitted('add')) {
-                $connected_cms[$this->module_system_type]->newContentModule($this->module_id, $this->module_type, true);
-                if ($connected_cms[$this->module_system_type]->content_module[$this->module_id]->setConnection($this->seminar_id))
-                    PageLayout::postInfo(_('Die Zuordnung wurde gespeichert.'));
-                unset($connected_cms[$this->module_system_type]->content_module[$this->module_id]);
-            }
-            if ($this->search_key != "") {
-                ELearningUtils::loadClass($this->cms_select);
-                if ( mb_strlen( trim($this->search_key) ) > 2)
-                    $searchresult_content_modules = $connected_cms[$this->cms_select]->searchContentModules($this->search_key);
-                else
-                    PageLayout::postError(_('Jeder Suchbegriff muss mindestens 3 Zeichen lang sein!'));
-            }
-        }
-        //Instanz mit den Zuordnungen von Content-Modulen zur Veranstaltung
-        $object_connections = new ObjectConnections($this->seminar_id);
-
-        $connected_modules = $object_connections->getConnections();
-        $this->module_count = 0;
-        $content_modules_list = [];
-        $user_modules_list = [];
-        $search_modules_list = [];
-        if ($object_connections->isConnected()) {
-            $caching_active = true;
-            foreach ($connected_modules as $key => $connection) {
-                if (ELearningUtils::isCMSActive($connection["cms"])) {
-
-                    ELearningUtils::loadClass($connection["cms"]);
-
-                    $connected_cms[$connection["cms"]]->newContentModule($connection["id"], $connection["type"], true);
-                    $connected_modules[$key]['title'] = $connected_cms[$connection["cms"]]->content_module[$connection["id"]]->getTitle();
-                    $title_tmp[$key] = str_replace(['ä','ö','ü','ß'],['ae','oe','ue','ss'],mb_strtolower($connected_modules[$key]['title']));
-                    $type_tmp[$key] = array_search($connection['type'], array_keys($GLOBALS['ELEARNING_INTERFACE_MODULES'][$connection["cms"]]['types']));
-                    $class_tmp[$key] = $GLOBALS['ELEARNING_INTERFACE_MODULES'][$connection["cms"]]["CLASS_PREFIX"];
-                }
-            }
-            array_multisort($class_tmp, SORT_ASC, $type_tmp, SORT_ASC, $title_tmp, SORT_ASC, $connected_modules);
-
-            foreach ($connected_modules as $index => $connection) {
-                $current_module = $connection["id"];
-
-                if ($this->module_count == 0)
-                    $content_modules_list[$index]['show_header'] = true;
-                $this->module_count++;
-                $this->module_system_count[$connection["cms"]]++;
-
-                if ($this->open_all != "")
-                    $_SESSION['elearning_open_close'][$connected_cms[$connection["cms"]]->content_module[$connection["id"]]->getReferenceString()] = true;
-                elseif ($this->close_all != "")
-                    $_SESSION['elearning_open_close'][$connected_cms[$connection["cms"]]->content_module[$connection["id"]]->getReferenceString()] = false;
-                    $content_modules_list[$index]['module'] = $connected_cms[$connection["cms"]]->content_module[$connection["id"]]->view->showAdmin();
-            }
-        }
-        if (($this->module_count == 0) AND ($this->new_account_cms == "")) {
-            if (Context::isInstitute()) {
-                PageLayout::postInfo(_('Momentan sind dieser Einrichtung keine Lernmodule zugeordnet.'));
-            } else {
-                PageLayout::postInfo(_('Momentan sind dieser Veranstaltung keine Lernmodule zugeordnet.'));
-            }
-        }
-        $this->caching_active = false;
-        if (isset($GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_select]["name"])) {
-            ELearningUtils::loadClass($this->cms_select);
-
-            $user_content_modules = $connected_cms[$this->cms_select]->getUserContentModules();
-            if (! ($user_content_modules == false)) {
-                foreach ($user_content_modules as $key => $connection) {
-                    // show only those modules which are not already connected to the seminar
-                    if (is_object($connected_cms[$this->cms_select]->content_module[$connection["ref_id"]]))
-                            continue;
-                    $connected_cms[$this->cms_select]->setContentModule($connection, false);
-                    $connected_cms[$this->cms_select]->content_module[$current_module]->view->showAdmin();
-                    $user_modules_list[$key]['module'] = $connected_cms[$this->cms_select]->content_module[$current_module]->view->showAdmin();
-                }
-            }
-
-             if (!$connected_cms[$this->cms_select]->isAuthNecessary()
-                || $connected_cms[$this->cms_select]->user->isConnected()) {
-                $this->show_search = true;
-            }
-
-            if (! ($searchresult_content_modules == false)) {
-                foreach ($searchresult_content_modules as $key => $connection) {
-                    // show only those modules which are not already connected to the seminar
-                    if (is_object($connected_cms[$this->cms_select]->content_module[$connection["ref_id"]]))
-                        continue;
-                    $connected_cms[$this->cms_select]->setContentModule($connection, false);
-                    $search_modules_list[$key]['module'] = $connected_cms[$this->cms_select]->content_module[$current_module]->view->showAdmin();
-                }
-            }
-
-                // ILIAS 4: Leeren Kurs anlegen oder Kurse von anderen Veranstaltungen zuordnen
-                if ((method_exists($connected_cms[$this->cms_select], "updateConnections")) AND ! ($this->module_system_count[$this->cms_select]) AND ! (ObjectConnections::getConnectionModuleId($this->seminar_id, "crs", $this->cms_select)))
-                {
-                    $show_ilias_empty_course = true;
-                    if ($GLOBALS['perm']->have_perm('root')) {
-                        $query = "SELECT DISTINCT object_id, module_id, Name
-                                  FROM object_contentmodules
-                                  LEFT JOIN seminare ON (object_id = Seminar_id)
-                                  WHERE module_type = 'crs' AND system_type = ?";
-                    } else {
-                        $query = "SELECT DISTINCT object_id, module_id, Name
-                                  FROM object_contentmodules
-                                  LEFT JOIN seminare ON (object_id = Seminar_id)
-                                  LEFT JOIN seminar_user USING (Seminar_id)
-                                  WHERE module_type = 'crs' AND system_type = ? AND seminar_user.status = 'dozent'";
-                    }
-                    $statement = DBManager::get()->prepare($query);
-                    $statement->execute([$this->cms_select]);
-                    while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
-                        if ($GLOBALS['perm']->have_studip_perm('dozent', $row['object_id'])) {
-                            $existing_courses[$row['object_id']] = my_substr($row['Name'],0,60)." ".sprintf(_("(Kurs-ID %s)"), $row['module_id']);
-                        }
-                    }
-                }
-
-                // ILIAS 4: ggf. Hinweis auf Möglichkeit, weitere Modulformen als Link einzubinden
-                elseif (method_exists($connected_cms[$this->cms_select], "updateConnections") AND count($connected_cms[$this->cms_select]->types['webr'])) {
-                    $this->show_ilias_link_info = true;
-                    $crs_data = ObjectConnections::getConnectionModuleId($this->seminar_id, "crs", $this->cms_select);
-                }
-            }
-
-        // Cachen der SOAP-Daten
-        if (is_array($connected_cms))
-            foreach($connected_cms as $system)
-                $system->terminate();
-
-        $widget = new ActionsWidget();
-        if (is_array($this->course_output['courses']) && count($this->course_output['courses'])) {
-            $widget->addLink(
-                _('Zuordnungen aktualisieren'),
-                URLHelper::getURL('?', ['view' => 'edit', 'cms_select' => $this->cms_select,'update'=>1]),
-                Icon::create('refresh')
-            );
-        }
-        $this->sidebar->addWidget($widget);
-        $this->new_account = $this->new_account_cms;
-        $this->is_inst = Context::isInstitute();
-        if ($this->cms_select) {
-            $this->cms_name = $connected_cms[$this->cms_select]->getName();
-            $this->cms_logo = $connected_cms[$this->cms_select]->getLogo();
-            $this->user_modules = $user_modules_list;
-            $this->search_modules = $search_modules_list;
-            $this->existing_courses = $existing_courses;
-            $this->show_ilias_empty_course = $show_ilias_empty_course;
-        }
-        $this->content_modules = $content_modules_list;
-    }
-}
diff --git a/app/controllers/elearning.php b/app/controllers/elearning.php
deleted file mode 100644
index b2a2117ebe4..00000000000
--- a/app/controllers/elearning.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-/*
- * elearning.php
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * @author      Arne Schroeder <schroeder@data-quest.de>
- * @author      Suchi & Berg GmbH <info@data-quest.de>
- * @license     http://www.gnu.org/licenses/gpl-2.0.html GPL version 2
- * @category    Stud.IP
-*/
-
-class ElearningController extends AuthenticatedController
-{
-    /**
-     * Before filter, set up the page by initializing the session and checking
-     * all conditions.
-     *
-     * @param String $action Name of the action to be invoked
-     * @param Array  $args   Arguments to be passed to the action method
-     */
-    public function before_filter(&$action, &$args)
-    {
-        parent::before_filter($action, $args);
-
-        if (!Config::Get()->ELEARNING_INTERFACE_ENABLE ) {
-            throw new AccessDeniedException(_('Elearning-Interface ist nicht aktiviert.'));
-        } else
-            $this->elearning_active = true;
-
-        PageLayout::setHelpKeyword('Basis.Ilias');
-
-        $this->cms_select = Request::quoted('cms_select');
-        $GLOBALS['cms_select'] = $this->cms_select;
-        $this->cms_list = [];
-        if (isset($_SESSION['elearning_open_close']) && $_SESSION['elearning_open_close']["type"] != "user") {
-            unset($_SESSION['elearning_open_close']);
-        }
-        $_SESSION['elearning_open_close']["type"] = "user";
-        $_SESSION['elearning_open_close']["id"] = $GLOBALS['user']->id;
-        if (Request::get('do_open'))
-            $_SESSION['elearning_open_close'][Request::get('do_open')] = true;
-        elseif (Request::get('do_close'))
-            $_SESSION['elearning_open_close'][Request::get('do_close')] = false;
-
-        $this->open_all = Request::get('open_all');
-        $this->close_all = Request::get('close_all');
-        $this->new_account_cms = Request::get('new_account_cms');
-        $this->module_system_type = Request::option('module_system_type');
-        $this->module_id = Request::option('module_id');
-        $this->module_type = Request::option('module_type');
-        $this->anker_target = Request::option('anker_target');
-
-        if (!isset($GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->new_account_cms])) {
-            unset($this->new_account_cms);
-        }
-        if (!isset($GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_select])) {
-            unset($this->cms_select);
-        }
-        if ($this->open_all != "")
-            $_SESSION['elearning_open_close']["all open"] = true;
-        elseif ($this->close_all != "")
-            $_SESSION['elearning_open_close']["all open"] = "";
-        $this->sidebar = Sidebar::get();
-        //$this->sidebar->setContextAvatar(CourseAvatar::getAvatar($this->seminar_id));
-    }
-
-    /**
-     * Displays accounts and elearning modules for active user
-     */
-    public function my_accounts_action()
-    {
-        global $connected_cms, $current_module,$messages;
-        Navigation::activateItem('/contents/my_elearning');
-
-        PageLayout::setTitle(_("Meine Lernmodule und Benutzer-Accounts"));
-
-        if ($this->new_account_cms != "")
-            $this->new_account_form = ELearningUtils::getNewAccountForm($this->new_account_cms);
-        foreach($GLOBALS['ELEARNING_INTERFACE_MODULES'] as $cms => $cms_preferences) {
-            if (ELearningUtils::isCMSActive($cms)) {
-                ELearningUtils::loadClass($cms);
-                if ( $cms_preferences["auth_necessary"] == true) {
-                    $this->new_module_form[$cms] = ELearningUtils::getNewModuleForm($cms);
-                }
-                $connection_status = $connected_cms[$cms]->getConnectionStatus($cms);
-
-                foreach ($connection_status as $type => $msg) {
-                    if (!empty($msg["error"])) {
-                        PageLayout::postError(_("Es traten Probleme bei der Anbindung einzelner Lermodule auf. Bitte wenden Sie sich an Ihren Systemadministrator."), [$cms .': ' . $msg["error"]]);
-                        $GLOBALS["ELEARNING_INTERFACE_" . $cms . "_ACTIVE"] = false;
-                    }
-                }
-            }
-        }
-
-        $connected_cms = [];
-        // prepare cms list
-        foreach($GLOBALS['ELEARNING_INTERFACE_MODULES'] as $cms => $cms_preferences) {
-            if (ELearningUtils::isCMSActive($cms) AND $cms_preferences["auth_necessary"]) {
-                ELearningUtils::loadClass($cms);
-                $this->cms_list[$cms] = $cms_preferences;
-                $this->cms_list[$cms]['name'] = $connected_cms[$cms]->getName();
-                $this->cms_list[$cms]['logo'] = $connected_cms[$cms]->getLogo();
-                $this->cms_list[$cms]['modules'] = [];
-                if ($this->new_account_cms != $cms)
-                    $this->cms_list[$cms]['show_account_form'] = $cms_preferences;
-                if ($GLOBALS["module_type_" . $cms] != "")
-                    $this->cms_list[$cms]['cms_anker_target'] = true;
-                if ($connected_cms[$cms]->user->isConnected())
-                    $this->cms_list[$cms]['start_link'] = $connected_cms[$cms]->link->getStartpageLink();
-
-                if ($this->new_account_cms != $cms) {
-                    if ($connected_cms[$cms]->user->isConnected()) {
-                        $this->cms_list[$cms]['user'] = $connected_cms[$cms]->user->getUsername();
-                        $connected_cms[$cms]->soap_client->setCachingStatus(false);
-                        $this->user_content_modules = $connected_cms[$cms]->getUserContentModules();
-                        $connected_cms[$cms]->soap_client->setCachingStatus(true);
-                        if (! ($this->user_content_modules == false)) {
-                            foreach ($this->user_content_modules as $key => $connection) {
-                                $connected_cms[$cms]->setContentModule($connection, false);
-                                $this->cms_list[$cms]['modules'][] = $connected_cms[$cms]->content_module[$current_module]->view->show();
-                            }
-                        }
-                        $this->cms_list[$cms]['new_module_form'] = $this->new_module_form[$cms];
-                    }
-                } else {
-                    $this->cms_list[$cms]['account_form'] = $this->new_account_form;
-                }
-            }
-        }
-
-        $sidebar = Sidebar::get();
-        $widget = new ActionsWidget();
-
-        $link_count = 0;
-        if ($GLOBALS['perm']->have_perm('autor') AND count($this->cms_list)) {
-            foreach($this->cms_list as $cms_key => $cms_data) {
-                if ($connected_cms[$cms_key]->user->isConnected()) {
-                    $widget->addLink(
-                        sprintf(_('Zur %s Startseite'), $cms_data['name']),
-                        URLHelper::getURL($cms_data['start_link']),
-                        Icon::create('link-extern', 'clickable'),
-                        ['target' => '_blank', 'rel' => 'noopener noreferrer']
-                    );
-                    $link_count++;
-                }
-            }
-        }
-        if ($link_count) {
-            $sidebar->addWidget($widget);
-        }
-
-        // terminate objects
-        if (is_array($connected_cms)) {
-            foreach ($connected_cms as $system) {
-                $system->terminate();
-            }
-        }
-
-       if (is_array($messages)) {
-           foreach ($messages as $mtype => $mtext) {
-               PageLayout::postMessage(MessageBox::$mtype($mtext));
-           }
-       }
-    }
-}
diff --git a/app/controllers/loncapa.php b/app/controllers/loncapa.php
deleted file mode 100644
index dd7ea4085b7..00000000000
--- a/app/controllers/loncapa.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-class LoncapaController extends AuthenticatedController
-{
-    public function enter_action()
-    {
-        checkObject();
-        checkObjectModule("elearning_interface");
-
-        $cms_type = Request::get('cms_type');
-        $module = Request::get('module');
-        $course_id = Context::getId();
-
-        if ($GLOBALS['perm']->have_studip_perm('user', $course_id)
-            && isset($GLOBALS['ELEARNING_INTERFACE_MODULES'][$cms_type]))
-        {
-            require_once 'lib/elearning/ELearningUtils.php';
-            require_once 'lib/elearning/ObjectConnections.php';
-
-            $object_connections = new ObjectConnections($course_id);
-            $connected_modules = $object_connections->getConnections();
-            $reference = "{$cms_type}_loncapa_{$module}";
-
-            if (isset($connected_modules[$reference])
-                && ELearningUtils::isCMSActive($cms_type))
-            {
-                ELearningUtils::loadClass($cms_type);
-                $lclink = new LonCapaConnectedLink($cms_type);
-                $this->redirect($lclink->getRedirectUrl($module, $course_id));
-                return;
-            }
-        }
-        throw new AccessDeniedException(_('LonCapa Zugang nicht erlaubt'));
-    }
-}
diff --git a/app/views/elearning/my_accounts.php b/app/views/elearning/my_accounts.php
deleted file mode 100644
index 83719ffe9aa..00000000000
--- a/app/views/elearning/my_accounts.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php use Studip\Button, Studip\LinkButton; ?>
-    <h2><?=_('Meine Lernmodule und Benutzer-Accounts')?></h2>
-    <? foreach($cms_list as $cms_index => $cms_data) : ?>
-        <? if ($cms_anker_target == $cms_index) : ?>
-            <a name='anker'></a>
-        <? endif?>
-        <?=ELearningUtils::getCMSHeader($cms_data['name'])?>
-        <br>
-        <?=ELearningUtils::getHeader(_("Mein Benutzeraccount"))?>
-        <? if ($cms_data['account_form']) : ?>
-            <?=$cms_data['account_form']?>
-        <? else : ?>
-            <? if ($cms_data['show_account_form'] AND $cms_data['user']) : ?>
-                <?=ELearningUtils::getMyAccountForm('', $cms_index)?>
-            <? elseif ($cms_data['show_account_form']) : ?>
-                <?=ELearningUtils::getMyAccountForm(sprintf(_("Sie haben im System %s bisher keinen Benutzer-Account."), htmlReady($cms_data['name'])), $cms_index)?>
-            <? endif ?>
-            <? if ($cms_data['user'] AND $cms_data['start_link']) : ?>
-                <div class="messagebox messagebox_info" style="background-image: none; padding-left: 15px">
-                    <?=_('Hier gelangen Sie direkt zur Startseite im angebundenen System:')?>
-                    <a href="<?= URLHelper::getScriptLink($cms_data['start_link']) ?>" target="_blank" rel="noopener noreferrer">
-                        <?= htmlReady($cms_data['name']) ?>
-                    </a>
-                </div>
-                <br>
-            <? endif ?>
-            <?=ELearningUtils::getHeader(_('Meine Lernmodule'))?>
-            <? if (count($cms_data['modules'])) : ?>
-                <? foreach ($cms_data['modules'] as $module_html) : ?>
-                    <?=$module_html?>
-                <? endforeach ?>
-            <? else : ?>
-                <table border="0" cellspacing="0" cellpadding="6">
-                    <tr>
-                        <td>
-                            <?=sprintf(_("Sie haben im System %s keine eigenen Lernmodule."), htmlReady($cms_data['name']))?><br>
-                            <br>
-                        </td>
-                    </tr>
-                </table>
-            <? endif ?>
-            <br>
-            <br>
-            <?=$cms_data['new_module_form']?>
-        <? endif ?>
-        <?=ELearningUtils::getCMSFooter($cms_data['logo'])?>
-        <br>
-    <? endforeach ?>
diff --git a/config/config_defaults.inc.php b/config/config_defaults.inc.php
index e4aed075eb6..d0f7d69acc1 100644
--- a/config/config_defaults.inc.php
+++ b/config/config_defaults.inc.php
@@ -78,88 +78,6 @@ $FOP_SH_CALL = "/usr/bin/fop";                        //path to fop
 
 $EXTERN_SERVER_NAME = "";                               //define name, if you use special setup
 
-$ELEARNING_INTERFACE_MODULES = [];
-
-// example entry for wikifarm as server for elearning modules
-// Copy them into your customized config_local.inc.php and adjust them.
-// remember to activate studip-webservices with WEBSERVICES_ENABLE and to set STUDIP_INSTALLATION_ID
-
-// $ELEARNING_INTERFACE_MODULES["ilias5"] = [
-//     "name" => "ILIAS 5",
-//     "ABSOLUTE_PATH_ELEARNINGMODULES" => "http://<your Ilias installation>/",
-//     "ABSOLUTE_PATH_SOAP" => "http://<your Ilias installation>/webservice/soap/server.php?wsdl",
-//     "CLASS_PREFIX" => "Ilias5",
-//     "auth_necessary" => true,
-//     "USER_AUTO_CREATE" => true,
-//     "USER_PREFIX" => "",
-//     "target_file" => "studip_referrer.php",
-//     "logo_file" => "assets/images/logos/ilias_logo.png",
-//     "soap_data" => [
-//         "username" => "<username>",     //this credentials are used to communicate with your Ilias 3 installation over SOAP
-//         "password" => "<password>",
-//         "client" => "<ilias client id>"],
-//     "types" => [
-//         "webr" => ["name" => "ILIAS-Link", "icon" => "learnmodule"],
-//         "htlm" => ["name" => "HTML-Lerneinheit", "icon" => "learnmodule"],
-//         "sahs" => ["name" => "SCORM/AICC-Lerneinheit", "icon" => "learnmodule"],
-//         "lm" => ["name" => "ILIAS-Lerneinheit", "icon" => "learnmodule"],
-//         "glo" => ["name" => "ILIAS-Glossar", "icon" => "learnmodule"],
-//         "tst" => ["name" => "ILIAS-Test", "icon" => "learnmodule"],
-//         "svy" => ["name" => "ILIAS-Umfrage", "icon" => "learnmodule"],
-//         "exc" => ["name" => "ILIAS-Ãœbung", "icon" => "learnmodule"]
-//     ],
-//     "global_roles" => [4,5,14], // put here the ilias role-ids for User, Guest and Anonymous
-//     "roles" =>  [
-//         "autor" => "4",
-//         "tutor" => "4",
-//         "dozent" => "4",
-//         "admin" => "4",
-//         "root" => "2"
-//     ],
-//     "crs_roles" =>  [
-//         "autor" => "member",
-//         "tutor" => "tutor",
-//         "dozent" => "admin",
-//         "admin" => "admin",
-//         "root" => "admin"
-//     ]
-// ];
-//
-// $ELEARNING_INTERFACE_MODULES["pmwiki-farm"] =   [
-//                         "name" => "Wikifarm",
-//                         "ABSOLUTE_PATH_ELEARNINGMODULES" => "http://<your PmWiki farm server>/<path to wiki fields>/",
-//
-//                         "WEBSERVICE_CLASS" => "xml_rpc_webserviceclient",
-//                         "ABSOLUTE_PATH_SOAP" => "http://<your PmWiki farm server>/<path to PmWiki farm>/pmwiki.php",  // url to farm webservices
-//                         "URL_PARAMS" => "action=xmlrpc",
-//
-//                         "CLASS_PREFIX" => "PmWiki",
-//                         "auth_necessary" => false,
-//
-//                         "field_script" => "field.php",
-//                         "logo_file" => $ASSETS_URL."/images/logos/pmwiki-32.gif",
-//
-//                         "soap_data" => [
-//               "api-key" => "<api-key for wiki webservices>",
-//             ],
-//                         "types" =>  [
-//               "wiki" => ["name" => "PmWiki-Lernmodul", "icon" => "learnmodule"],
-//             ]
-// ];
-//
-// $ELEARNING_INTERFACE_MODULES["loncapa"] =
-// [
-//     "name" => "LonCapa",
-//     "ABSOLUTE_PATH_ELEARNINGMODULES" => "http://127.0.0.1/loncapa",
-//     "CLASS_PREFIX" => "LonCapa",
-//     "auth_necessary" => false,
-//     "logo_file" => "assets/images/logos/lon-capa.gif",
-//     "types" =>  [
-//         "loncapa" => ["name" => "LonCapa-Lernmodul",
-//                            "icon" => "learnmodule"],
-//         ]
-// ];
-
 $PLUGINS_UPLOAD_ENABLE = $_ENV['STUDIP_PLUGIN_UPLOAD_ENABLE'] ?? true;      //Upload of Plugins is enabled
 
 $PLUGIN_REPOSITORIES = [
diff --git a/db/migrations/6.0.16_step_4109.php b/db/migrations/6.0.16_step_4109.php
new file mode 100644
index 00000000000..6332f26116b
--- /dev/null
+++ b/db/migrations/6.0.16_step_4109.php
@@ -0,0 +1,47 @@
+<?php
+return new class extends Migration
+{
+
+    public function description()
+    {
+        return 'StEP 4109: Remove ELEARNING_INTERFACE';
+    }
+
+    protected function up()
+    {
+        $db = DBManager::get();
+
+        $plugin_id = $db->fetchColumn("SELECT pluginid FROM plugins WHERE pluginclassname='CoreElearningInterface'");
+        $db->execute("DELETE FROM roles_plugins WHERE pluginid=?", [$plugin_id]);
+        $db->execute("DELETE FROM tools_activated WHERE plugin_id=?", [$plugin_id]);
+        $db->execute("DELETE FROM plugins WHERE pluginid=?", [$plugin_id]);
+
+        $ilias_config = $db->fetchColumn("SELECT `value` FROM config_values WHERE `field`='ILIAS_INTERFACE_SETTINGS'");
+        if ($ilias_config) {
+            $ilias_config = json_decode($ilias_config, true);
+            if (is_array($ilias_config)) {
+                $config_keys = array_keys($ilias_config);
+                if (count($config_keys)) {
+                    $db->execute("DELETE FROM auth_extern WHERE external_user_system_type NOT IN (?)", [$config_keys]);
+                    $db->execute("DELETE FROM object_contentmodules WHERE system_type NOT IN (?)", [$config_keys]);
+                }
+            }
+        } else {
+            $elearning_active = $db->fetchColumn("SELECT `value` FROM config_values WHERE `field` LIKE 'ELEARNING_INTERFACE%ACTIVE' LIMIT 1");
+            if (!$elearning_active) {
+                $db->execute("DELETE FROM auth_extern");
+                $db->execute("DELETE FROM object_contentmodules");
+            }
+        }
+        $db->exec("DELETE FROM `config_values` WHERE `field` LIKE 'ELEARNING_INTERFACE%'");
+        $db->exec("DELETE FROM `config_values` WHERE `field` IN ('SOAP_ENABLE', 'SOAP_USE_PHP5')");
+        $db->exec("DELETE FROM `config` WHERE `field` LIKE 'ELEARNING_INTERFACE%'");
+        $db->exec("DELETE FROM `config` WHERE `field` IN ('SOAP_ENABLE', 'SOAP_USE_PHP5')");
+
+    }
+
+    protected function down()
+    {
+    }
+
+};
diff --git a/lib/bootstrap.php b/lib/bootstrap.php
index 478ca0e0c09..2e762c5a142 100644
--- a/lib/bootstrap.php
+++ b/lib/bootstrap.php
@@ -223,13 +223,10 @@ if (Config::get()->CALENDAR_ENABLE) {
     require_once 'lib/calendar_functions.inc.php';
 }
 
-if (Config::get()->SOAP_ENABLE) {
-    require_once 'lib/soap/StudipSoapClient' . (Config::get()->SOAP_USE_PHP5 ? '_PHP5' : '' ) . '.php';
-}
-
 if (Config::Get()->ILIAS_INTERFACE_ENABLE) {
     require_once 'lib/ilias_interface/IliasUserObserver.php';
     require_once 'lib/ilias_interface/IliasCourseObserver.php';
+    require_once 'lib/ilias_interface/StudipSoapClient.php';
 }
 
 // set dummy navigation until db is ready
diff --git a/lib/classes/UserManagement.php b/lib/classes/UserManagement.php
index 53b56755578..809d0c3e15a 100644
--- a/lib/classes/UserManagement.php
+++ b/lib/classes/UserManagement.php
@@ -1250,24 +1250,6 @@ class UserManagement
             $msg .= 'info§' . _('Bild gelöscht.') . '§';
         }
 
-        //delete connected users
-        if (Config::get()->ELEARNING_INTERFACE_ENABLE) {
-            if (ELearningUtils::initElearningInterfaces()) {
-                foreach ($GLOBALS['connected_cms'] as $cms){
-                    if ($cms->auth_necessary && $cms->user instanceOf ConnectedUser) {
-                        $user_auto_create = $cms->USER_AUTO_CREATE;
-                        $cms->USER_AUTO_CREATE = false;
-                        $userclass = mb_strtolower(get_class($cms->user));
-                        $connected_user = new $userclass($cms->cms_type, $user_id);
-                        if ($connected_user->deleteUser() && $connected_user->is_connected) {
-                            $msg .= 'info§' . sprintf(_('Der verknüpfte Nutzer %s wurde im System %s gelöscht.'), $connected_user->login, $connected_user->cms_type) . '§';
-                        }
-                        $cms->USER_AUTO_CREATE = $user_auto_create;
-                    }
-                }
-            }
-        }
-
         return $msg;
     }
 
diff --git a/lib/elearning/ConnectedCMS.php b/lib/elearning/ConnectedCMS.php
deleted file mode 100644
index f5617e83264..00000000000
--- a/lib/elearning/ConnectedCMS.php
+++ /dev/null
@@ -1,466 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-/**
-* main-class for connected systems
-*
-* This class contains the main methods of the elearning-interface to connect content-management-systems.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       ConnectedCMS
-* @package  ELearning-Interface
-*/
-class ConnectedCMS
-{
-    public $title;
-
-    public $is_active;
-    public $cms_type;
-    public $name = null;
-    public $ABSOLUTE_PATH_ELEARNINGMODULES = null;
-    public $ABSOLUTE_PATH_SOAP = null;
-    public $RELATIVE_PATH_DB_CLASSES = false;
-    public $CLASS_PREFIX = null;
-    public $auth_necessary = null;
-    public $USER_AUTO_CREATE = null;
-    public $USER_PREFIX = null;
-    public $target_file = null;
-    public $logo_file = null;
-    public $db_classes;
-    public $soap_data = null;
-    public $soap_client;
-    public $types = null;
-    public $roles = null;
-
-    public $db;
-    public $db_class;
-    public $link;
-    public $user;
-    public $permissions;
-    public $content_module;
-
-    /**
-    * constructor
-    *
-    * init class. don't call directly but by extending class ("new Ilias3ConnectedCMS($cms)" for example), except for basic administration
-    * @access
-    * @param string $cms system-type
-    */
-    public function __construct($cms = "")
-    {
-        $this->cms_type = $cms;
-        $this->is_active = (bool) Config::get()->getValue("ELEARNING_INTERFACE_{$cms}_ACTIVE");
-
-        if ($cms) {
-            $this->init($cms);
-        }
-    }
-
-    /**
-    * init settings
-    *
-    * gets settings from config-array and initializes db
-    * @access private
-    * @param string $cms system-type
-    */
-    public function init($cms)
-    {
-        global $ELEARNING_INTERFACE_MODULES;
-
-        $this->name = $ELEARNING_INTERFACE_MODULES[$cms]['name'] ?? null;
-        $this->ABSOLUTE_PATH_ELEARNINGMODULES = $ELEARNING_INTERFACE_MODULES[$cms]["ABSOLUTE_PATH_ELEARNINGMODULES"];
-        $this->ABSOLUTE_PATH_SOAP = $ELEARNING_INTERFACE_MODULES[$cms]["ABSOLUTE_PATH_SOAP"];
-        if (isset($ELEARNING_INTERFACE_MODULES[$cms]["RELATIVE_PATH_DB_CLASSES"])) {
-            $this->RELATIVE_PATH_DB_CLASSES = $ELEARNING_INTERFACE_MODULES[$cms]["RELATIVE_PATH_DB_CLASSES"];
-            $this->db_classes = $ELEARNING_INTERFACE_MODULES[$cms]["db_classes"];
-        } else {
-            $this->RELATIVE_PATH_DB_CLASSES = false;
-        }
-        $this->CLASS_PREFIX = $ELEARNING_INTERFACE_MODULES[$cms]['CLASS_PREFIX'];
-        $this->auth_necessary = $ELEARNING_INTERFACE_MODULES[$cms]['auth_necessary'];
-        $this->USER_AUTO_CREATE = $ELEARNING_INTERFACE_MODULES[$cms]['USER_AUTO_CREATE'] ?? null;
-        $this->USER_PREFIX = $ELEARNING_INTERFACE_MODULES[$cms]['USER_PREFIX'] ?? null;
-        $this->target_file = $ELEARNING_INTERFACE_MODULES[$cms]['target_file'] ?? null;
-        $this->logo_file = $ELEARNING_INTERFACE_MODULES[$cms]['logo_file'] ?? null;
-        $this->soap_data = $ELEARNING_INTERFACE_MODULES[$cms]['soap_data'] ?? null;
-        $this->types = $ELEARNING_INTERFACE_MODULES[$cms]['types'] ?? null;
-        $this->roles = $ELEARNING_INTERFACE_MODULES[$cms]['roles'] ?? null;
-    }
-
-    /**
-    * init subclasses
-    *
-    * loads classes for user-functions
-    * @access public
-    */
-    public function initSubclasses()
-    {
-        if ($this->auth_necessary) {
-            require_once $this->CLASS_PREFIX . "ConnectedUser.php";
-            $classname = $this->CLASS_PREFIX . "ConnectedUser";
-            $this->user = new $classname($this->cms_type);
-
-            require_once $this->CLASS_PREFIX  . "ConnectedPermissions.php";
-            $classname = $this->CLASS_PREFIX  . "ConnectedPermissions";
-            $this->permissions = new $classname($this->cms_type);
-        }
-        require_once $this->CLASS_PREFIX . "ConnectedLink.php";
-        $classname = $this->CLASS_PREFIX . "ConnectedLink";
-        $this->link = new $classname($this->cms_type);
-    }
-
-    /**
-    * get connection status
-    *
-    * checks settings
-    * @access public
-    * @param string $cms system-type
-    * @return array messages
-    */
-    public function getConnectionStatus($cms = "")
-    {
-        $msg = [
-            'path' => [],
-        ];
-
-        if ($this->cms_type == "") {
-            $this->init($cms);
-        }
-
-        // check connection to CMS
-        if (!$this->auth_necessary) {
-            $msg['auth'] = [
-                'info' => _('Eine Authentifizierung ist für dieses System nicht vorgesehen.')
-            ];
-        }
-
-        // check for SOAP-Interface
-        if (in_array($this->CLASS_PREFIX, ['Ilias3','Ilias4','Ilias5'])) {
-            $ch = curl_init($this->ABSOLUTE_PATH_ELEARNINGMODULES . 'login.php');
-            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
-            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-            curl_exec($ch);
-
-            if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) !== 200) {
-                $msg['path']['error'] = sprintf(
-                    _('Die Verbindung zum System "%s" konnte nicht hergestellt werden. Der Pfad "%s" ist ungültig.'),
-                    $this->name,
-                    $this->ABSOLUTE_PATH_ELEARNINGMODULES
-                );
-
-            } else {
-                $msg['path']['info'] = sprintf(
-                    _('Die %s-Installation wurde gefunden.'),
-                    $this->name
-                );
-            }
-
-            $msg['soap'] = [];
-            if (!Config::get()->SOAP_ENABLE) {
-                $msg['soap']['error'] = _('Das Stud.IP-Modul für die SOAP-Schnittstelle ist nicht aktiviert. Ändern Sie den entsprechenden Eintrag in der Konfigurationsdatei "local.inc".');
-            } elseif (!is_array($this->soap_data)) {
-                $msg['soap']['error'] = _('Die SOAP-Verbindungsdaten sind für dieses System nicht gesetzt. Ergänzen Sie die Einstellungen für dieses Systems um den Eintrag "soap_data" in der Konfigurationsdatei "local.inc".');
-            } else {
-                $this->soap_client = new StudipSoapClient($this->ABSOLUTE_PATH_SOAP);
-                $msg['soap']['info'] = _('Das SOAP-Modul ist aktiv.');
-            }
-        } else {
-            $file = fopen($this->ABSOLUTE_PATH_ELEARNINGMODULES, 'r');
-            if ($file === false) {
-                $msg['path']['error'] = sprintf(
-                    _('Die Verbindung zum System "%s" konnte nicht hergestellt werden. Der Pfad "%s" ist ungültig.'),
-                    $this->name,
-                    $this->ABSOLUTE_PATH_ELEARNINGMODULES
-                );
-            } else {
-                fclose($file);
-                $msg['path']['info'] = sprintf(
-                    _("Die %s-Installation wurde gefunden."),
-                    $this->name
-                );
-
-                // check if target-file exists
-                $msg['auth'] = [];
-
-                $file = fopen($this->ABSOLUTE_PATH_ELEARNINGMODULES . $this->target_file, 'r');
-                if ($file === false) {
-                    $msg['auth']['error'] = sprintf(
-                        _('Die Zieldatei "%s" liegt nicht im Hauptverzeichnis der %s-Installation.'),
-                        $this->target_file,
-                        $this->name
-                    );
-                } else {
-                    fclose($file);
-                    $msg['auth']['info'] = _('Die Zieldatei ist vorhanden.');
-                }
-            }
-        }
-
-        $el_path = $GLOBALS['STUDIP_BASE_PATH'] . '/lib/elearning';
-        // check if needed classes exist
-        $files = [
-            'class_link'    => "{$el_path}/{$this->CLASS_PREFIX}ConnectedLink.php",
-            'class_content' => "{$el_path}/{$this->CLASS_PREFIX}ContentModule.php",
-            'class_cms'     => "{$el_path}/{$this->CLASS_PREFIX}ConnectedCMS.php",
-        ];
-
-        if ($this->auth_necessary) {
-            $files['class_user'] = "{$el_path}/{$this->CLASS_PREFIX}ConnectedUser.php";
-            $files['class_perm'] = "{$el_path}/{$this->CLASS_PREFIX}ConnectedPermissions.php";
-        }
-
-        $errors = 0;
-        foreach ($files as $index => $file) {
-            if (!file_exists($file)) {
-                $msg[$index] = [
-                    'error' => sprintf(_('Die Datei "%s" existiert nicht.'), $file),
-                ];
-                $errors += 1;
-            }
-        }
-
-        $msg['classes'] = [];
-        if ($errors === 0) {
-            require_once $files['class_cms'];
-            $msg['classes']['info'] = sprintf(
-                _('Die Klassen der Schnittstelle zum System "%s" wurden geladen.'),
-                $this->name
-            );
-        } else {
-            $msg['classes']['error'] = sprintf(
-                _('Die Klassen der Schnittstelle zum System "%s" wurden nicht geladen.'),
-                $this->name
-            );
-        }
-
-        return $msg;
-    }
-
-    /**
-    * get preferences
-    *
-    * shows additional settings. can be overwritten by subclass.
-    * @access public
-    */
-    public function getPreferences()
-    {
-        if ($this->types != "")
-        {
-            echo "<b>" . _("Angebundene Lernmodul-Typen: ") . "</b>";
-            echo "<br>\n";
-            foreach($this->types as $key => $type)
-                echo Icon::create($type["icon"], Icon::ROLE_INACTIVE)->asImg() . $type["name"] . " ($key)<br>\n";
-            echo "<br>\n";
-        }
-
-        if ($this->db_classes != "")
-        {
-            echo "<b>" . _("Verwendete DB-Zugriffs-Klassen: ") . "</b>";
-            echo "<br>\n";
-            foreach($this->db_classes as $key => $type) {
-                echo $type["file"] . " ($key)<br>\n";
-            }
-            echo "<br>\n";
-        }
-    }
-
-    /**
-    * create new instance of subclass content-module with given values
-    *
-    * creates new instance of subclass content-module with given values
-    * @access public
-    * @param array $data module-data
-    * @param boolean $is_connected is module connected to seminar?
-    */
-    public function setContentModule($data, $is_connected = false)
-    {
-        global $current_module;
-        $current_module = $data["ref_id"];
-
-        require_once($this->CLASS_PREFIX . "ContentModule.php");
-        $classname = $this->CLASS_PREFIX  . "ContentModule";
-
-        $this->content_module[$current_module] = new  $classname("", $data["type"], $this->cms_type);
-        $this->content_module[$current_module]->setId($data["ref_id"]);
-        $this->content_module[$current_module]->setTitle($data["title"]);
-        $this->content_module[$current_module]->setDescription($data["description"]);
-        $this->content_module[$current_module]->setConnectionType($is_connected);
-    }
-
-    /**
-    * create new instance of subclass content-module
-    *
-    * creates new instance of subclass content-module
-    * @access public
-    * @param string $module_id module-id
-    * @param string $module_type module-type
-    * @param boolean $is_connected is module connected to seminar?
-    */
-    public function newContentModule($module_id, $module_type, $is_connected = false)
-    {
-        global $current_module;
-        $current_module = $module_id;
-
-        require_once($this->CLASS_PREFIX . "ContentModule.php");
-        $classname = $this->CLASS_PREFIX  . "ContentModule";
-
-        if ($is_connected == false)
-        {
-            $this->content_module[$module_id] = new  $classname("", $module_type, $this->cms_type);
-            $this->content_module[$module_id]->setId($module_id);
-        }
-        else
-        {
-            $this->content_module[$module_id] = new  $classname($module_id, $module_type, $this->cms_type);
-        }
-
-        $this->content_module[$module_id]->setConnectionType($is_connected);
-    }
-
-    /**
-    * get name of cms
-    *
-    * returns name of cms
-    * @access public
-    * @return string name
-    */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-    * get type of cms
-    *
-    * returns type of cms
-    * @access public
-    * @return string type
-    */
-    public function getCMSType()
-    {
-        return $this->cms_type;
-    }
-
-    /**
-    * get path of cms
-    *
-    * returns path of cms
-    * @access public
-    * @return string path
-    */
-    public function getAbsolutePath()
-    {
-        return $this->ABSOLUTE_PATH_ELEARNINGMODULES;
-    }
-
-    /**
-    * get target file of cms
-    *
-    * returns target file of cms
-    * @access public
-    * @return string target file
-    */
-    public function getTargetFile()
-    {
-        return $this->target_file;
-    }
-
-    /**
-    * get class prefix
-    *
-    * returns class prefix
-    * @access public
-    * @return string class prefix
-    */
-    public function getClassPrefix()
-    {
-        return $this->CLASS_PREFIX;
-    }
-
-    /**
-    * get authentification-setting
-    *
-    * returns true, if authentification is necessary
-    * @access public
-    * @return boolean authentification-setting
-    */
-    public function isAuthNecessary()
-    {
-        return $this->auth_necessary;
-    }
-
-    /**
-    * get active-setting
-    *
-    * returns true, if cms is active
-    * @access public
-    * @return boolean active-setting
-    function isActive($cms = "")
-    {
-        return $this->is_active;
-    }
-    */
-
-    /**
-    * get user prefix
-    *
-    * returns user prefix
-    * @access public
-    * @return string user prefix
-    */
-    public function getUserPrefix()
-    {
-        return $this->USER_PREFIX;
-    }
-
-    /**
-    * get logo-image
-    *
-    * returns logo-image
-    * @access public
-    * @return string logo-image
-    */
-    public function getLogo()
-    {
-        return "<img src=\"" . $this->logo_file . "\">";
-    }
-
-    /**
-    * get user modules
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @return boolean returns false
-    */
-    public function getUserContentModules()
-    {
-        return false;
-    }
-
-    /**
-    * search modules
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @return boolean returns false
-    */
-    public function searchContentModules($key)
-    {
-        return false;
-    }
-
-    /**
-    * dummy-method. can be overwritten by subclass.
-    */
-    public function terminate()
-    {
-    }
-
-    public function deleteConnectedModules($object_id){
-        return ObjectConnections::DeleteAllConnections($object_id, $this->cms_type);
-    }
-}
diff --git a/lib/elearning/ConnectedLink.php b/lib/elearning/ConnectedLink.php
deleted file mode 100644
index 6fa1de51dc1..00000000000
--- a/lib/elearning/ConnectedLink.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-/**
-* class to generate links to connected systems
-*
-* This class contains methods to generate links to connected content-management-systems.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       ConnectedLink
-* @package  ELearning-Interface
-*/
-
-use Studip\Button, Studip\LinkButton;
-
-class ConnectedLink
-{
-    var $cms_type;
-    var $cms_link;
-    /**
-    * constructor
-    *
-    * init class. don't call directly, class is loaded by ConnectedCMS.
-    * @access public
-    * @param string $cms system-type
-    */
-    function __construct($cms)
-    {
-        global $ELEARNING_INTERFACE_MODULES;
-
-        $this->cms_type = $cms;
-        $this->cms_link = $ELEARNING_INTERFACE_MODULES[$cms]["ABSOLUTE_PATH_ELEARNINGMODULES"] . ($ELEARNING_INTERFACE_MODULES[$cms]["target_file"] ?? null);
-    }
-
-    /**
-    * get link to create new account
-    *
-    * returns link to create new user-account
-    * @access public
-    * @return string html-code
-    */
-    function getNewAccountLink()
-    {
-        global $connected_cms, $cms_select, $current_module;
-
-        $output =  "<form method=\"POST\" action=\"" . URLHelper::getLink() . "\">\n";
-        $output .= CSRFProtection::tokenTag();
-        $output .= "<input type=\"HIDDEN\" name=\"view\" value=\"" . Request::option('view') . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"ref_id\" value=\"" . htmlReady($connected_cms[$this->cms_type]->content_module[$current_module]->getId()) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"module_type\" value=\"" . htmlReady($connected_cms[$this->cms_type]->content_module[$current_module]->getModuleType()) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"search_key\" value=\"" . htmlReady(Request::get('search_key')) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"cms_select\" value=\"" . htmlReady($cms_select) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"new_account_cms\" value=\"" . htmlReady($this->cms_type) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"new_account_step\" value=\"0\">\n";
-        $output .= Button::createAccept(_('Starten'), 'start');
-        $output .= "</form>";
-        return $output;
-    }
-
-    /**
-    * get module-links for user
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @return boolean returns false
-    */
-    function getUserModuleLinks()
-    {
-        return false;
-    }
-
-    /**
-    * get module-links for admin
-    *
-    * returns links to remove or add module to object
-    * @access public
-    * @return string html-code
-    */
-    function getAdminModuleLinks()
-    {
-        global $connected_cms, $view, $search_key, $cms_select, $current_module;
-
-        $output = "<form method=\"POST\" action=\"" . URLHelper::getLink() . "\">\n";
-        $output .= CSRFProtection::tokenTag();
-        $output .= "<input type=\"HIDDEN\" name=\"view\" value=\"" . htmlReady($view) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"search_key\" value=\"" . htmlReady($search_key) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"cms_select\" value=\"" . htmlReady($cms_select) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"module_type\" value=\"" . htmlReady($connected_cms[$this->cms_type]->content_module[$current_module]->getModuleType()) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"module_id\" value=\"" . htmlReady($connected_cms[$this->cms_type]->content_module[$current_module]->getId()) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"module_system_type\" value=\"" . htmlReady($this->cms_type) . "\">\n";
-
-        if ($connected_cms[$this->cms_type]->content_module[$current_module]->isConnected())
-            $output .= "&nbsp;" . Button::create(_('Entfernen'), 'remove');
-        else
-            $output .= "&nbsp;" . Button::create(_('Hinzufügen'), 'add');
-        $output .= "</form>";
-
-        return $output;
-    }
-
-    /**
-    * get new module link
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @return boolean returns false
-    */
-    function getNewModuleLink()
-    {
-        return false;
-    }
-
-    /**
-    * get start page link
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @return boolean returns false
-    */
-    function getStartpageLink()
-    {
-        return false;
-    }
-}
-?>
diff --git a/lib/elearning/ConnectedPermissions.php b/lib/elearning/ConnectedPermissions.php
deleted file mode 100644
index a2216b7cb9c..00000000000
--- a/lib/elearning/ConnectedPermissions.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-/**
-* class to handle access controls
-*
-* This class contains methods to handle permissions on connected objects.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       ConnectedPermission
-* @package  ELearning-Interface
-*/
-class ConnectedPermissions
-{
-    var $cms_type;
-
-    var $db_class;
-    /**
-    * constructor
-    *
-    * init class. don't call directly, class is loaded by ConnectedCMS.
-    * @access public
-    * @param string $cms system-type
-    */
-    function __construct($cms)
-    {
-        global $connected_cms, $ELEARNING_INTERFACE_MODULES;
-
-        $this->cms_type = $cms;
-        if ($ELEARNING_INTERFACE_MODULES[$this->cms_type]["RELATIVE_PATH_DB_CLASSES"] != false)
-        {
-            require_once('lib/elearning/' . $ELEARNING_INTERFACE_MODULES[$this->cms_type]["RELATIVE_PATH_DB_CLASSES"]
-                . "/" . $ELEARNING_INTERFACE_MODULES[$this->cms_type]["db_classes"]["permissions"]["file"] );
-            $classname = $ELEARNING_INTERFACE_MODULES[$this->cms_type]["db_classes"]["permissions"]["classname"];
-            $this->db_class = new $classname();
-        }
-
-    }
-
-    /**
-    * get module-permissions
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @param string $module_id module-id
-    * @return boolean returns false
-    */
-    function getContentModulePerms($module_id)
-    {
-        return false;
-    }
-}
-?>
\ No newline at end of file
diff --git a/lib/elearning/ConnectedUser.php b/lib/elearning/ConnectedUser.php
deleted file mode 100644
index 3c74a14589a..00000000000
--- a/lib/elearning/ConnectedUser.php
+++ /dev/null
@@ -1,512 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-DEFINE ("USER_TYPE_ORIGINAL" , "1");
-DEFINE ("USER_TYPE_CREATED", "0");
-
-/**
-* class to handle user-accounts
-*
-* This class contains methods to handle connected user-accounts.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       ConnectedUser
-* @package  ELearning-Interface
-*/
-class ConnectedUser
-{
-    var $cms_type;
-    var $id;
-    var $studip_id;
-    var $studip_login;
-    var $studip_password;
-    var $login;
-    var $external_password;
-    var $category;
-    var $gender;
-    var $title_front;
-    var $title_rear;
-    var $title;
-    var $firstname;
-    var $lastname;
-    var $institution;
-    var $department;
-    var $street;
-    var $city;
-    var $zipcode;
-    var $country;
-    var $phone_home;
-    var $fax;
-    var $matriculation;
-    var $email;
-    var $type;
-    var $is_connected;
-
-    var $db_class;
-    /**
-    * constructor
-    *
-    * init class. don't call directly, class is loaded by ConnectedCMS.
-    * @access public
-    * @param string $cms system-type
-    */
-    function __construct($cms, $user_id = false)
-    {
-        global $auth, $ELEARNING_INTERFACE_MODULES;
-
-        $this->studip_id = $user_id ? $user_id : $auth->auth["uid"];
-        $this->cms_type = $cms;
-
-        if ($ELEARNING_INTERFACE_MODULES[$this->cms_type]["RELATIVE_PATH_DB_CLASSES"] != false)
-        {
-            require_once("lib/elearning/" . $ELEARNING_INTERFACE_MODULES[$this->cms_type]["RELATIVE_PATH_DB_CLASSES"] . "/" . $ELEARNING_INTERFACE_MODULES[$this->cms_type]["db_classes"]["user"]["file"] );
-            $classname = $ELEARNING_INTERFACE_MODULES[$this->cms_type]["db_classes"]["user"]["classname"];
-            $this->db_class = new $classname();
-        }
-        $this->readData();
-        $this->getStudipUserData();
-    }
-
-    /**
-    * get data
-    *
-    * gets data from database
-    * @access public
-    * @return boolean returns false, if no data was found
-    */
-    function readData()
-    {
-        $query = "SELECT external_user_id, external_user_name, external_user_password, external_user_category, external_user_type
-                  FROM auth_extern
-                  WHERE studip_user_id = ? AND external_user_system_type = ?";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([$this->studip_id, $this->cms_type]);
-        $data = $statement->fetch(PDO::FETCH_ASSOC);
-
-        if (!$data) {
-            $this->id = '';
-            $this->is_connected = false;
-            return false;
-        }
-
-        $this->id                = $data['external_user_id'];
-        $this->login             = $data['external_user_name'];
-        $this->external_password = $data['external_user_password'];
-        $this->category          = $data['external_user_category'];
-        $this->type              = $data['external_user_type'];
-        $this->is_connected      = true;
-
-        return true;
-    }
-
-    /**
-    * get stud.ip-user-data
-    *
-    * gets stud.ip-user-data from database
-    * @access public
-    * @return boolean returns false, if no data was found
-    */
-    function getStudipUserData()
-    {
-        global $connected_cms;
-
-        $query = "SELECT username, password, title_front, title_rear, Vorname, 
-                         Nachname, Email, privatnr, privadr, geschlecht
-                  FROM auth_user_md5
-                  LEFT JOIN  user_info USING (user_id)
-                  WHERE user_id = ?";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([$this->studip_id]);
-        $data = $statement->fetch(PDO::FETCH_ASSOC);
-
-        if (!$data) {
-            return false;
-        }
-
-        $this->studip_login = $data['username'];
-        if ($this->is_connected == false) {
-            $this->login = $connected_cms[$this->cms_type]->getUserPrefix() . $this->studip_login;
-        }
-
-        $this->studip_password = $data['password'];
-        $this->title_front     = $data['title_front'];
-        $this->title_rear      = $data['title_rear'];
-        $this->firstname       = $data['Vorname'];
-        $this->lastname        = $data['Nachname'];
-        $this->email           = $data['Email'];
-        $this->phone_home      = $data['privatnr'];
-        $this->street          = $data['privadr'];
-        $this->gender          = ($data['geschlecht'] == 2 ? 'f' : 'm');
-
-        if ($this->title_front != '') {
-            $this->title = $this->title_front;
-        }
-        if ($this->title_front != '' && $this->title_rear != '') {
-            $this->title .= ' ';
-        }
-        if ($this->title_rear != '') {
-            $this->title .= $this->title_rear;
-        }
-        return true;
-    }
-
-    /**
-    * create new user-account
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @return boolean returns false
-    */
-    function newUser()
-    {
-        return false;
-    }
-
-    /**
-    * update user-account
-    *
-    * dummy-method. must be overwritten by subclass.
-    */
-    public function updateUser()
-    {
-    }
-
-    /**
-    * delete user-account
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @return boolean returns false
-    */
-    function deleteUser()
-    {
-        return false;
-    }
-
-    /**
-    * get login-data of user-account
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @return boolean returns false
-    */
-    function getLoginData($username)
-    {
-        return false;
-    }
-
-    /**
-    * get id
-    *
-    * returns id
-    * @access public
-    * @return string id
-    */
-    function getId()
-    {
-        return $this->id;
-    }
-
-    /**
-    * get stud.ip user-id
-    *
-    * returns id
-    * @access public
-    * @return string stud.ip user-id
-    */
-    function getStudipId()
-    {
-        return $this->studip_id;
-    }
-
-    /**
-    * get username
-    *
-    * returns username
-    * @access public
-    * @return string username
-    */
-    function getUsername()
-    {
-        return $this->login;
-    }
-
-    /**
-    * set username
-    *
-    * sets username
-    * @access public
-    * @param string $user_login username
-    */
-    function setUsername($user_login)
-    {
-        $this->login = $user_login;
-    }
-
-    /**
-    * get password
-    *
-    * returns password
-    * @access public
-    * @return string password
-    */
-    function getPassword()
-    {
-        return $this->external_password;
-    }
-
-    /**
-    * set password
-    *
-    * sets password
-    * @access public
-    * @param string $user_password password
-    */
-    function setPassword($user_password)
-    {
-        $this->external_password = $user_password;
-    }
-
-    /**
-    * get user category
-    *
-    * returns id
-    * @access public
-    * @return string id
-    */
-    function getCategory()
-    {
-        return $this->category;
-    }
-
-    /**
-    * set user category
-    *
-    * sets user category
-    * @access public
-    * @param string $user_category category
-    */
-    function setCategory($user_category)
-    {
-        $this->category = $user_category;
-    }
-
-    /**
-    * get crypted password
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @return boolean returns false
-    */
-    function getCryptedPassword($password)
-    {
-        return false;
-    }
-
-    /**
-    * verify login data
-    *
-    * returns true, if login-data is valid
-    * @access public
-    * @param string $username username
-    * @param string $password password
-    * @return boolean login-validation
-    */
-    function verifyLogin($username, $password)
-    {
-        $this->getLoginData($username);
-        if (($username == "") OR ($password == ""))
-            return false;
-        if ( ($this->login == $username) AND  ($this->external_password == $this->getCryptedPassword($password) ) )
-            return true;
-        return false;
-    }
-
-    /**
-    * get gender
-    *
-    * returns gender-setting
-    * @access public
-    * @return string gender-setting
-    */
-    function getGender()
-    {
-        return $this->gender;
-    }
-
-    /**
-    * set gender
-    *
-    * sets gender
-    * @access public
-    * @param string $user_gender gender-setting
-    */
-    function setGender($user_gender)
-    {
-        $this->gender = $user_gender;
-    }
-
-    /**
-    * get full name
-    *
-    * returns full name
-    * @access public
-    * @return string name
-    */
-    function getName()
-    {
-        if ($this->title != "")
-            return $this->title . ' ' . $this->firstname . ' ' . $this->lastname;
-        else
-            return $this->firstname . ' ' . $this->lastname;
-    }
-
-    /**
-    * get firstname
-    *
-    * returns firstname
-    * @access public
-    * @return string firstname
-    */
-    function getFirstname()
-    {
-        return $this->firstname;
-    }
-
-    /**
-    * set firstname
-    *
-    * sets firstname
-    * @access public
-    * @param string $user_firstname firstname
-    */
-    function setFirstname($user_firstname)
-    {
-        $this->firstname = $user_firstname;
-    }
-
-    /**
-    * get lastname
-    *
-    * returns lastname
-    * @access public
-    * @return string lastname
-    */
-    function getLastname()
-    {
-        return $this->lastname;
-    }
-
-    /**
-    * set lastname
-    *
-    * sets lastname
-    * @access public
-    * @param string $user_lastname lastname
-    */
-    function setLastname($user_lastname)
-    {
-        $this->lastname = $user_lastname;
-    }
-
-    /**
-    * get email-adress
-    *
-    * returns email-adress
-    * @access public
-    * @return string email-adress
-    */
-    function getEmail()
-    {
-        return $this->email;
-    }
-
-    /**
-    * set email-adress
-    *
-    * sets email-adress
-    * @access public
-    * @param string $user_email email-adress
-    */
-    function setEmail($user_email)
-    {
-        $this->email = $user_email;
-    }
-
-    /**
-    * get user-type
-    *
-    * returns user-type
-    * @access public
-    * @return string user-type
-    */
-    function getUserType()
-    {
-        return $this->type;
-    }
-
-    /**
-    * set user-type
-    *
-    * sets user-type
-    * @access public
-    * @param string $user_type user-type
-    */
-    function setUserType($user_type)
-    {
-        $this->type = $user_type;
-    }
-
-    /**
-     * save connection for user-account
-     *
-     * saves user-connection to database and sets type for actual user
-     * @param string $user_type user-type
-     */
-    public function setConnection($user_type)
-    {
-        $this->setUserType($user_type);
-
-        $query = "INSERT INTO auth_extern (studip_user_id, external_user_id, external_user_name, 
-                                           external_user_password, external_user_category,
-                                           external_user_system_type, external_user_type)
-                  VALUES (?, ?, ?, ?, ?, ?, ?)
-                  ON DUPLICATE KEY
-                    UPDATE external_user_name = VALUES(external_user_name),
-                           external_user_password = VALUES(external_user_password),
-                           external_user_category = VALUES(external_user_category),
-                           external_user_id = VALUES(external_user_id),
-                           external_user_type = VALUES(external_user_type)";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([
-            (string)$this->studip_id,
-            (string)$this->id,
-            (string)$this->login,
-            (string)$this->external_password,
-            (string)$this->category,
-            (string)$this->cms_type,
-            (int)$this->type,
-        ]);
-
-        $this->is_connected = true;
-        $this->readData();
-    }
-
-    /**
-    * get connection-status
-    *
-    * returns true, if there is a connected user
-    * @access public
-    * @return boolean connection-status
-    */
-    function isConnected()
-    {
-        return $this->is_connected;
-    }
-}
-?>
diff --git a/lib/elearning/ContentModule.php b/lib/elearning/ContentModule.php
deleted file mode 100644
index 1b2921bdefb..00000000000
--- a/lib/elearning/ContentModule.php
+++ /dev/null
@@ -1,388 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/**
-* class to handle content module data
-*
-* This class contains methods to handle connected content module data.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       ContentModule
-* @package  ELearning-Interface
-*/
-abstract class ContentModule
-{
-    /**
-     * Fetches data from conencted cms.
-     */
-    abstract function readData();
-
-    var $id;
-    var $title;
-    var $module_type;
-    var $module_type_name;
-    var $icon_file;
-    var $cms_type;
-    var $cms_name;
-    var $description;
-    var $authors;
-    var $is_connected;
-    var $is_dummy;
-    var $allowed_operations;
-
-    var $db_class;
-    var $view;
-    /**
-    * constructor
-    *
-    * init class. don't call directly, class is loaded by ConnectedCMS.
-    * @access public
-    * @param string $module_id module-id
-    * @param string $module_type module-type
-    * @param string $cms_type system-type
-    */
-    function __construct($module_id, $module_type, $cms_type)
-    {
-        global $connected_cms;
-
-        $this->is_dummy = false;
-        $this->setCMSType($cms_type);
-        $this->setModuleType($module_type);
-        if ($module_id != "")
-        {
-            $this->setId($module_id);
-
-            $this->readData();
-        }
-        $this->view = new ContentModuleView($this->cms_type);
-
-/**/    }
-
-/*  // Dummy-method. Must be overwritten by subclass.
-    function readData()
-    {
-        return false;
-    }
-*/
-
-    /**
-    * set id
-    *
-    * sets id
-    * @access public
-    * @param string $module_id id
-    */
-    function setId($module_id)
-    {
-        $this->id = $module_id;
-    }
-
-    /**
-    * get id
-    *
-    * returns id
-    * @access public
-    * @return string id
-    */
-    function getId()
-    {
-        return $this->id;
-    }
-
-    /**
-    * set cms-type
-    *
-    * sets cms-type
-    * @access public
-    * @param string $module_cms_type cms-type
-    */
-    function setCMSType($module_cms_type)
-    {
-        global $ELEARNING_INTERFACE_MODULES;
-        $this->cms_type = $module_cms_type;
-        $this->cms_name = $ELEARNING_INTERFACE_MODULES[$module_cms_type]["name"];
-    }
-
-    /**
-    * get cms-type
-    *
-    * returns cms-type
-    * @access public
-    * @return string cms-type
-    */
-    function getCMSType()
-    {
-        return $this->cms_type;
-    }
-
-    /**
-    * get cms name
-    *
-    * returns cms name
-    * @access public
-    * @return string cms name
-    */
-    function getCMSName()
-    {
-        return $this->cms_name;
-    }
-
-    /**
-    * set module-type
-    *
-    * sets module-type
-    * @access public
-    * @param string $module_type module-type
-    */
-    function setModuleType($module_type)
-    {
-        global $ELEARNING_INTERFACE_MODULES;
-        $this->module_type = $module_type;
-        $this->module_type_name = $ELEARNING_INTERFACE_MODULES[$this->cms_type]["types"][$module_type]["name"];
-        $this->icon_file = $ELEARNING_INTERFACE_MODULES[$this->cms_type]["types"][$module_type]["icon"];
-    }
-
-    /**
-    * get module-type
-    *
-    * returns module-type
-    * @access public
-    * @return string module-type
-    */
-    function getModuleType()
-    {
-        return $this->module_type;
-    }
-
-    /**
-    * get module-type name
-    *
-    * returns module-type name
-    * @access public
-    * @return string module-type name
-    */
-    function getModuleTypeName()
-    {
-        return $this->module_type_name;
-    }
-
-    /**
-    * set title
-    *
-    * sets title
-    * @access public
-    * @param string $module_title title
-    */
-    function setTitle($module_title)
-    {
-        $this->title = $module_title;
-    }
-
-    /**
-    * get title
-    *
-    * returns title
-    * @access public
-    * @return string title
-    */
-    function getTitle()
-    {
-        return $this->title;
-    }
-
-    /**
-    * set description
-    *
-    * sets description
-    * @access public
-    * @param string $module_description description
-    */
-    function setDescription($module_description)
-    {
-        $this->description = $module_description;
-    }
-
-    /**
-    * get description
-    *
-    * returns description
-    * @access public
-    * @return string description
-    */
-    function getDescription()
-    {
-        return $this->description;
-    }
-
-    /**
-    * set authors
-    *
-    * sets authors
-    * @access public
-    * @param array $module_authors authors
-    */
-    function setAuthors($module_authors)
-    {
-        $this->authors = $module_authors;
-    }
-
-    /**
-    * get authors
-    *
-    * returns authors
-    * @access public
-    * @return array authors
-    */
-    function getAuthors()
-    {
-        return $this->authors;
-    }
-
-    /**
-    * set connection
-    *
-    * sets connection with seminar
-    * @access public
-    * @param string $seminar_id seminar-id
-    * @return boolean successful
-    */
-    function setConnection($seminar_id)
-    {
-        $this->is_connected = true;
-//      echo "$this->id, $this->module_type, $this->cms_type";
-        return ObjectConnections::setConnection($seminar_id, $this->id, $this->module_type, $this->cms_type);
-    }
-
-    /**
-    * unset connection
-    *
-    * unsets connection with seminar
-    * @access public
-    * @param string $seminar_id seminar-id
-    * @return boolean successful
-    */
-    function unsetConnection($seminar_id)
-    {
-        $this->is_connected = false;
-        return ObjectConnections::unsetConnection($seminar_id, $this->id, $this->module_type, $this->cms_type);
-    }
-
-    /**
-    * set connection-status
-    *
-    * sets connection-status
-    * @access public
-    * @param boolean $is_connected connection-status
-    */
-    function setConnectionType($is_connected)
-    {
-        $this->is_connected = $is_connected;
-    }
-
-    /**
-    * get connection-status
-    *
-    * returns true, if module is connected to seminar
-    * @access public
-    * @return boolean connection-status
-    */
-    function isConnected()
-    {
-        return $this->is_connected;
-    }
-
-    /**
-    * get reference string
-    *
-    * returns reference string for content-module
-    * @access public
-    * @return string reference string
-    */
-    function getReferenceString()
-    {
-        return $this->cms_type."_".$this->module_type."_".$this->id;
-    }
-
-    /**
-    * get icon-image
-    *
-    * returns icon-image
-    * @access public
-    * @return string icon-image
-    */
-    function getIcon()
-    {
-        if (!$this->icon_file) {
-            $this->icon_file = 'learnmodule';
-        }
-        if (mb_strpos('http', $this->icon_file) === 0) {
-            return "<img src=\"" . $this->icon_file . "\">";
-        } else {
-            return Icon::create($this->icon_file, 'inactive')->asImg();
-        }
-    }
-
-    /**
-    * get module-status
-    *
-    * returns true, if module is a dummy
-    * @access public
-    * @return boolean module-status
-    */
-    function isDummy()
-    {
-        return $this->is_dummy;
-    }
-
-    /**
-    * create module-dummy
-    *
-    * sets title and description of module to display error-message
-    * @access public
-    * @param string $error error-type
-    */
-    function createDummyForErrormessage($error = "unknown")
-    {
-        global $connected_cms;
-
-        switch($error)
-        {
-            case "no permission":
-                $this->setTitle(_("--- Keine Lese-Berechtigung! ---"));
-                $this->setDescription(sprintf(_("Sie haben im System \"%s\" keine Lese-Berechtigung für das Lernmodul, das dieser Veranstaltung / Einrichtung an dieser Stelle zugeordnet ist."), $this->getCMSName()));
-                break;
-            case "not found":
-                $this->setTitle(_("--- Dieses Content-Modul existiert nicht mehr im angebundenen System! ---"));
-                $this->setDescription(sprintf(_("Das Lernmodul, das dieser Veranstaltung / Einrichtung an dieser Stelle zugeordnet war, existiert nicht mehr. Dieser Fehler tritt auf, wenn das angebundene LCMS \"%s\" nicht erreichbar ist oder wenn das Lernmodul innerhalb des angebundenen Systems gelöscht wurde."), $this->getCMSName()));
-                break;
-            case "deleted":
-                $this->setTitle(_("--- Dieses Content-Modul wurde im angebundenen System gelöscht! ---"));
-                $this->setDescription(sprintf(_("Das Lernmodul, das dieser Veranstaltung / Einrichtung an dieser Stelle zugeordnet war, wurde gelöscht."), $this->getCMSName()));
-                break;
-            default:
-                $this->setTitle(_("--- Es ist ein unbekannter Fehler aufgetreten! ---"));
-                $this->setDescription(sprintf(_("Unbekannter Fehler beim Lernmodul mit der Referenz-ID \"%s\" im LCMS \"%s\""), $this->getId(), $this->getCMSName()));
-        }
-
-        $this->is_dummy = true;
-    }
-
-    /**
-    * ask for permission for given operation
-    *
-    * dummy-method. returns false. must be overwritten by subclass.
-    * @access public
-    * @param string $operation operation
-    * @return boolean returns false
-    */
-    function isAllowed($operation)
-    {
-        return false;
-    }
-}
-?>
diff --git a/lib/elearning/ContentModuleView.php b/lib/elearning/ContentModuleView.php
deleted file mode 100644
index c351c1cf8a3..00000000000
--- a/lib/elearning/ContentModuleView.php
+++ /dev/null
@@ -1,189 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-/**
-* class to show content-module data
-*
-* This class contains methods for output of connected module data.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       ContentModuleView
-* @package  ELearning-Interface
-*/
-class ContentModuleView
-{
-    var $view_mode;
-    var $change_date;
-    var $module_new;
-    var $cms_type;
-    /**
-    * constructor
-    *
-    * init class. don't call directly, class is loaded by ContentModule.
-    * @access public
-    * @param string $cms system-type
-    */
-    function __construct($cms)
-    {
-        global $connected_cms;
-
-        $this->change_date = 0;
-        $this->module_new = false;
-        $this->cms_type = $cms;
-        $this->setViewMode("closed");
-    }
-
-    /**
-    * show module-data
-    *
-    * show module-data in printhead/printcontent-style. user-mode
-    * @access public
-    */
-    function show($mode = "")
-    {
-        global $connected_cms, $view, $search_key, $cms_select, $current_module, $anker_target;
-
-        $content_module = $connected_cms[$this->cms_type]->content_module[$current_module];
-
-        if ( (! $content_module->isDummy()) AND ($connected_cms[$this->cms_type]->isAuthNecessary() == true) AND ($connected_cms[$this->cms_type]->user->isConnected() == true)) {
-            if (! $content_module->isAllowed(OPERATION_VISIBLE)) {
-                return false;
-            }
-        }
-
-        if ($_SESSION['elearning_open_close'][$content_module->getReferenceString()] == true)
-            $this->setViewMode("open");
-        $module_title = $content_module->getTitle();
-/*/
-        if ($mode == "searchresult") {
-            $module_title = $module_title . " (ID " . $content_module->getId() . ", ";
-            if ($content_module->isAllowed(OPERATION_WRITE))
-                $module_title = $module_title . " " . _("Schreibzugriff") . ")";
-            else
-                $module_title = $module_title . " " . _("Lesezugriff") . ")";
-        }/**/
-        if ($this->isOpen() == true)
-            $module_link = URLHelper::getLink('?do_close='. $content_module->getReferenceString() . '&view='.$view.'&search_key='.$search_key.'&cms_select='.$cms_select.'#anker');
-        else
-            $module_link = URLHelper::getLink('?do_open='. $content_module->getReferenceString() . '&view='.$view.'&search_key='.$search_key.'&cms_select='.$cms_select.'#anker');
-        if (! $content_module->isDummy())
-            $module_buttons = $connected_cms[$this->cms_type]->link->getUserModuleLinks();
-        $template = $GLOBALS['template_factory']->open('elearning/_content_module.php');
-        $template->set_attribute('module_anker_target', ($anker_target == $content_module->getReferenceString()));
-        $template->set_attribute('module_link', $module_link);
-        $template->set_attribute('module_buttons', $module_buttons);
-        $template->set_attribute('module_authors', $content_module->getAuthors());
-        $template->set_attribute('module_title', $module_title);
-        $template->set_attribute('module_description', $content_module->getDescription());
-        $template->set_attribute('module_is_new', $this->module_new);
-        $template->set_attribute('module_chdate', $this->change_date);
-        $template->set_attribute('module_reference', $content_module->getReferenceString());
-        $template->set_attribute('module_source', $content_module->getCMSName() . " / " . $content_module->getModuleTypeName());
-        $template->set_attribute('module_icon', $content_module->getIcon());
-        $template->set_attribute('module_is_open', $this->isOpen());
-        return $template->render();
-    }
-
-    /**
-    * show module-data to admin
-    *
-    * show module-data in printhead/printcontent-style. admin-mode
-    * @access public
-    */
-    function showAdmin($mode = "")
-    {
-        global $connected_cms, $view, $search_key, $cms_select, $current_module, $anker_target;
-
-        $content_module = $connected_cms[$this->cms_type]->content_module[$current_module];
-
-        if ( (! $content_module->isDummy()) AND ($connected_cms[$this->cms_type]->isAuthNecessary() == true) AND ($connected_cms[$this->cms_type]->user->isConnected() == true)) {
-            if (! $content_module->isAllowed(OPERATION_VISIBLE)) {
-                return false;
-            }
-        }
-
-        if ($_SESSION['elearning_open_close'][$content_module->getReferenceString()] == true)
-            $this->setViewMode("open");
-
-        $module_title = $content_module->getTitle();
-        $module_title = $module_title . " (ID " . $content_module->getId();
-        if ($content_module->isAllowed(OPERATION_WRITE))
-            $module_title = $module_title . ", " . _("Schreibzugriff");
-        elseif ($content_module->isAllowed(OPERATION_READ))
-            $module_title = $module_title . ", " . _("Lesezugriff");
-        else
-            $module_title = $module_title . ", " . _("kein Lesezugriff");
-        $module_title = $module_title . ")";
-
-        if ($this->isOpen() == true)
-            $module_link = URLHelper::getLink('?do_close='. $content_module->getReferenceString() . '&view='.$view.'&search_key='.$search_key.'&cms_select='.$cms_select.'#anker');
-        else
-            $module_link = URLHelper::getLink('?do_open='. $content_module->getReferenceString() . '&view='.$view.'&search_key='.$search_key.'&cms_select='.$cms_select.'#anker');
-
-        $template = $GLOBALS['template_factory']->open('elearning/_content_module.php');
-        $template->set_attribute('module_anker_target', ($anker_target == $content_module->getReferenceString()));
-        $template->set_attribute('module_link', $module_link);
-        if ($content_module->isAllowed(OPERATION_READ))
-            $module_buttons = $connected_cms[$this->cms_type]->link->getAdminModuleLinks();
-        $template->set_attribute('module_buttons', $module_buttons);
-        $template->set_attribute('module_authors', $content_module->getAuthors());
-        $template->set_attribute('module_title', $module_title);
-        $template->set_attribute('module_description', $content_module->getDescription());
-        $template->set_attribute('module_is_new', $this->module_new);
-        $template->set_attribute('module_chdate', $this->change_date);
-        $template->set_attribute('module_reference', $content_module->getReferenceString());
-        $template->set_attribute('module_source', $content_module->getCMSName() . " / " . $content_module->getModuleTypeName());
-        $template->set_attribute('module_icon', $content_module->getIcon());
-        $template->set_attribute('module_is_open', $this->isOpen());
-        return $template->render();
-    }
-
-    /**
-    * get open-status
-    *
-    * returns true, if module is opened
-    * @access public
-    * @return boolean open-status
-    */
-    function isOpen()
-    {
-        if ($this->view_mode == "open")
-            return true;
-        else
-            return false;
-    }
-
-    /**
-    * set view-mode
-    *
-    * sets view-mode
-    * @access public
-    * @param boolean $module_mode view-mode
-    */
-    function setViewMode($module_mode)
-    {
-        $this->view_mode = $module_mode;
-    }
-
-    /**
-    * set changedate
-    *
-    * sets changedate for view
-    * @access public
-    * @param string $module_chdate changedate
-    */
-    function setChangeDate($module_chdate)
-    {
-        $this->change_date = $module_chdate;
-
-        if (object_get_visit(Context::getId(), "elearning_interface") < $this->change_date)
-            $this->module_new = true;
-        else
-            $this->module_new = false;
-    }
-}
-?>
diff --git a/lib/elearning/ELearningUtils.php b/lib/elearning/ELearningUtils.php
deleted file mode 100644
index 806cff91168..00000000000
--- a/lib/elearning/ELearningUtils.php
+++ /dev/null
@@ -1,612 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-/**
-* class with several forms and tools for the elearning interface
-*
-* This class contains Utilities for the elearning-interface.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @package  ELearning-Interface
-*/
-
-use Studip\Button, Studip\LinkButton;
-
-class ELearningUtils
-{
-    /**
-     * loads class ConnectedCMS for given system-type and creates an instance
-     *
-     * @param string $cms system-type
-     */
-    public static function loadClass($cms)
-    {
-        global $connected_cms, $ELEARNING_INTERFACE_MODULES;
-
-        if (!isset($connected_cms[$cms]) || !is_object($connected_cms[$cms])) {
-            require_once "lib/elearning/{$ELEARNING_INTERFACE_MODULES[$cms]['CLASS_PREFIX']}ConnectedCMS.php";
-            $classname = "{$ELEARNING_INTERFACE_MODULES[$cms]['CLASS_PREFIX']}ConnectedCMS";
-            $connected_cms[$cms] = new $classname($cms);
-            $connected_cms[$cms]->initSubclasses();
-        }
-    }
-
-    public static function initElearningInterfaces()
-    {
-        global $ELEARNING_INTERFACE_MODULES, $connected_cms;
-        if (is_array($ELEARNING_INTERFACE_MODULES)) {
-            foreach (array_keys($ELEARNING_INTERFACE_MODULES) as $cms) {
-                if (self::isCMSActive($cms)) {
-                    self::loadClass($cms);
-                }
-            }
-        }
-        return is_array($connected_cms) ? count($connected_cms) : false;
-    }
-
-    /**
-     * gets config-value with given name from globals
-     *
-     * @param string $name entry-name
-     * @param string $cms system-type
-     * @return boolean returns false if no cms is given
-     */
-    public static function getConfigValue($name, $cms)
-    {
-        if (!$cms) {
-            return false;
-        }
-        return Config::get()->getValue("ELEARNING_INTERFACE_{$cms}_{$name}");
-    }
-
-    /**
-     * set config-value
-     *
-     * writes config-value with given name and value to database
-     *
-     * @param string $name entry-name
-     * @param string $value value
-     * @param string $cms system-type
-     */
-    public static function setConfigValue($name, $value, $cms)
-    {
-        if (!$cms) {
-            return;
-        }
-
-        try {
-            Config::get()->store("ELEARNING_INTERFACE_{$cms}_{$name}", $value);
-        } catch (InvalidArgumentException $e) {
-            Config::get()->create("ELEARNING_INTERFACE_{$cms}_{$name}", [
-                'value' => $value,
-                'type'  => 'string',
-            ]);
-        }
-    }
-
-    /**
-     * check cms-status
-     *
-     * checks if connected content-management-system is activated
-     *
-     * @param string $cms system-type
-     */
-    public static function isCMSActive($cms)
-    {
-        return self::getConfigValue('ACTIVE', $cms);
-    }
-
-    /**
-     * get cms-selectbox
-     *
-     * returns a form to select a cms
-     *
-     * @param string $message description-text
-     * @param boolean $check_active show only activated systems
-     * @return string returns html-code
-     */
-    public static function getCMSSelectbox($message, $check_active = true)
-    {
-        global $ELEARNING_INTERFACE_MODULES, $cms_select, $search_key, $view;
-        if (!is_array($ELEARNING_INTERFACE_MODULES)) {
-            $msg = sprintf(_("Die ELearning-Schnittstelle ist nicht korrekt konfiguriert. Die Variable \"%s\" "
-                            ."muss in der Konfigurationsdatei von Stud.IP erst mit den Verbindungsdaten angebundener "
-                            ."Learning-Content-Management-Systeme aufgefüllt werden. Solange dies nicht geschehen "
-                            ."ist, setzen Sie die Variable \"%s\" auf FALSE!"), "\$ELEARNING_INTERFACE_MODULES", "\$ELEARNING_INTERFACE_ENABLE");
-            PageLayout::postError($msg);
-            return false;
-        }
-        $options = [];
-        foreach ($ELEARNING_INTERFACE_MODULES as $cms => $cms_preferences) {
-            if (!$check_active || self::isCMSActive($cms)) {
-                $options[$cms] = $cms_preferences['name'];
-            }
-        }
-        $template = $GLOBALS['template_factory']->open('elearning/_cms_selectbox.php');
-        $template->cms_select = $cms_select;
-        $template->options    = $options;
-        $template->search_key = $search_key;
-        $template->view       = $view;
-        $template->message    = $message;
-        return $template->render();
-    }
-
-     /**
-     * get moduletype-selectbox
-     *
-     * returns a form to select type for new contentmodule
-     *
-     * @param string $cms system-type
-     * @return string returns html-code
-     */
-    public static function getTypeSelectbox($cms)
-    {
-        global $ELEARNING_INTERFACE_MODULES;
-        $options = [];
-        foreach ($ELEARNING_INTERFACE_MODULES[$cms]['types'] as $type => $info) {
-            $options[$type] = $info['name'];
-            if (Request::get("module_type_{$cms}") === $type) {
-                $selected = $type;
-            }
-        }
-        $template = $GLOBALS['template_factory']->open('elearning/_type_selectbox.php');
-        $template->options  = $options;
-        $template->selected = $selected;
-        $template->cms      = $cms;
-        return $template->render();
-    }
-
-    /**
-    * get searchfield
-    *
-    * returns a form to search for modules
-    *
-    * @param string $message description-text
-    * @return string returns html-code
-    */
-    public static function getSearchfield($message)
-    {
-        global $cms_select, $search_key, $view;
-        $template = $GLOBALS['template_factory']->open('elearning/_searchfield.php');
-        $template->cms_select = $cms_select;
-        $template->search_key = $search_key;
-        $template->view       = $view;
-        $template->message    = $message;
-        return $template->render();
-    }
-
-    /**
-    * get form for new content-module
-    *
-    * returns a form to choose module-type and to create a new content-module
-    *
-    * @param string $cms system-type
-    * @return string returns html-code
-    */
-    public static function getNewModuleForm($cms)
-    {
-        global $ELEARNING_INTERFACE_MODULES, $connected_cms;
-        if (sizeof($ELEARNING_INTERFACE_MODULES[$cms]["types"]) == 1)
-            foreach($ELEARNING_INTERFACE_MODULES[$cms]["types"] as $type => $info)
-                Request::set("module_type_" . $cms, $type);
-        $link = $connected_cms[$cms]->link->getNewModuleLink();
-
-        if ($link == false)
-            return false;
-        $types = [];
-        $cms_types = [];
-        foreach ($ELEARNING_INTERFACE_MODULES as $cms_type => $cms_data)
-            $cms_types["module_type_" . $cms_type] = Request::option("module_type_" . $cms_type);
-        $template = $GLOBALS['template_factory']->open('elearning/_new_module_form.php');
-        $template->set_attribute('link', $link);
-        $template->set_attribute('cms', $cms);
-        $template->set_attribute('cms_types', $cms_types);
-        $template->set_attribute('types', $ELEARNING_INTERFACE_MODULES[$cms]["types"]);
-        return $template->render();
-    }
-
-    /**
-    * get form for external user-account
-    *
-    * returns a form for administration of external user-account
-    *
-    * @param string message message-string
-    * @param string my_account_cms cms-type
-    * @return string returns html-code
-    */
-    public static function getMyAccountForm($message, $my_account_cms)
-    {
-        global $connected_cms;
-        $template = $GLOBALS['template_factory']->open('elearning/_my_account_form.php');
-        if ($connected_cms[$my_account_cms]->user->isConnected()) {
-            $template->set_attribute('login', $connected_cms[$my_account_cms]->user->getUsername());
-            $template->set_attribute('is_connected', 1);
-        }
-        $template->set_attribute('my_account_cms', $my_account_cms);
-        $template->set_attribute('message', $message);
-        return $template->render();
-    }
-
-    /**
-    * get form for new user
-    *
-    * returns a form to add a user-account to connected cms
-    *
-    * @param string $new_account_cms system-type
-    * @return string returns html-code
-    */
-    public static function getNewAccountForm(&$new_account_cms)
-    {
-        global $connected_cms, $cms_select, $view, $current_module, $messages,
-             $ELEARNING_INTERFACE_MODULES;
-
-        $new_account_step = Request::int('new_account_step');
-        $ext_password = Request::get('ext_password');
-        $ext_password_2 = Request::get('ext_password_2');
-        $ext_username = Request::get('ext_username');
-        $ref_id = Request::get('ref_id');
-        $module_type = Request::get('module_type');
-
-        self::loadClass($new_account_cms);
-
-        //Password was sent, but is to short
-        if (isset($ext_password_2) && !Request::submitted('go_back') && Request::submitted('next') && mb_strlen($ext_password_2) < 6) {
-            PageLayout::postError(_('Das Passwort muss mindestens 6 Zeichen lang sein!'));
-            $new_account_step--;
-        } elseif (isset($ext_password_2) && ! Request::submitted('go_back') && Request::submitted('next') && $ext_password != $ext_password_2) {
-            //Passwords doesn't match password repeat
-            PageLayout::postError(_('Das Passwort entspricht nicht der Passwort-Wiederholung!'));
-            $new_account_step--;
-        }
-
-        // Benutzername was sent
-        if ($ext_username && !Request::submitted('go_back') && Request::submitted('assign')) {
-            $caching_status = $connected_cms[$new_account_cms]->soap_client->getCachingStatus();
-            $connected_cms[$new_account_cms]->soap_client->setCachingStatus(false);
-            if ($connected_cms[$new_account_cms]->user->verifyLogin($ext_username, $ext_password)) {
-                $is_verified = true;
-                PageLayout::postInfo(_('Der Account wurde zugeordnet.'));
-                $connected_cms[$new_account_cms]->user->setCategory("");
-                $connected_cms[$new_account_cms]->user->setUsername($ext_username);
-                $connected_cms[$new_account_cms]->user->setPassword($ext_password);
-                $connected_cms[$new_account_cms]->user->setConnection(USER_TYPE_ORIGINAL);
-                if ($ref_id) {
-                    $connected_cms[$new_account_cms]->newContentModule($ref_id, $module_type, true);
-                    $module_title = $connected_cms[$new_account_cms]->content_module[$current_module]->getTitle();
-                    $module_links = $connected_cms[$new_account_cms]->link->getUserModuleLinks();
-                }
-            } else {
-                $new_account_step = 1;
-                PageLayout::postError(_('Die eingegebenen Login-Daten sind nicht korrekt.'));
-            }
-            $connected_cms[$new_account_cms]->soap_client->setCachingStatus($caching_status);
-        }
-
-        if (Request::submitted('start')) {
-            $new_account_step = 1;
-        }
-        if (Request::submitted('go_back')) {
-            $new_account_step--;
-            if ($new_account_step < 1) {
-                $new_account_cms = '';
-                return false;
-            }
-        } elseif (Request::submitted('next') || Request::submitted('assign')) {
-            $new_account_step++;
-        }
-
-        if ($new_account_step == 2 && Request::submitted('assign')) {
-            // Assign existing Account
-            $step = 'assign';
-        } elseif ($new_account_step == 2 && Request::submitted('next')) {
-            // Create new Account: ask for new password
-            $step = 'new_account';
-        } elseif ($new_account_step == 3 && Request::submitted('next')) {
-            // Create new Account
-            $connected_cms[$new_account_cms]->user->setPassword($ext_password);
-            if ($connected_cms[$new_account_cms]->user->newUser()) {
-                $is_verified = true;
-                PageLayout::postInfo(sprintf(_("Der Account wurde erzeugt und zugeordnet. Ihr Loginname ist %s."), "<b>" . htmlReady($connected_cms[$new_account_cms]->user->getUsername()) . "</b>"));
-                if ($ref_id) {
-                    $connected_cms[$new_account_cms]->newContentModule($ref_id, $module_type, true);
-                    $module_title = $connected_cms[$new_account_cms]->content_module[$current_module]->getTitle();
-                    $module_links = $connected_cms[$new_account_cms]->link->getUserModuleLinks();
-                }
-            }
-        } elseif (!$is_verified) {
-            if (Request::submitted('start')) {
-                $messages["info"] = sprintf(_("Sie versuchen zum erstem Mal ein Lernmodul des angebundenen Systems %s zu starten. Bevor Sie das Modul nutzen können, muss Ihrem Stud.IP-Benutzeraccount ein Account im angebundenen System zugeordnet werden."), htmlReady($connected_cms[$new_account_cms]->getName())) . "<br><br>\n\n";
-            }
-        }
-        $template = $GLOBALS['template_factory']->open('elearning/_new_account_form.php');
-        $template->cms_title        = htmlReady($connected_cms[$new_account_cms]->getName());
-        $template->cms_select       = $cms_select;
-        $template->module_title     = $module_title;
-        $template->module_links     = $module_links;
-        $template->module_type      = $module_type;
-        $template->ref_id           = $ref_id;
-        $template->ext_username     = $ext_username;
-        $template->new_account_cms  = $new_account_cms;
-        $template->new_account_step = $new_account_step;
-        $template->is_connected     = $connected_cms[$new_account_cms]->user->isConnected();
-        $template->is_verified      = $is_verified;
-        $template->step             = $step;
-
-        // TODO: Should this really be below the assignment?
-        if ($is_verified) {
-            $new_account_cms = "";
-        }
-
-        return $template->render();
-    }
-
-    /**
-     * get table-header for connected cms
-     *
-     * returns a table-header for connected cms
-     *
-     * @param string $title table-title
-     * @return string returns html-code
-     */
-    public static function getCMSHeader($title)
-    {
-        $template = $GLOBALS['template_factory']->open('elearning/_cms_header.php');
-        $template->title = $title;
-        return $template->render();
-    }
-
-    /**
-     * get table-footer for connected cms
-     *
-     * returns a table-footer for connected cms
-     *
-     * @param string $logo system-logo
-     * @return string returns html-code
-     */
-    public static function getCMSFooter($logo)
-    {
-        $template = $GLOBALS['template_factory']->open('elearning/_cms_footer.php');
-        $template->logo = $logo;
-        return $template->render();
-    }
-
-    /**
-     * get headline for modules
-     *
-     * returns a table with a headline
-     *
-     * @param string $title headline
-     * @return string returns html-code
-     */
-    public static function getModuleHeader($title)
-    {
-        global $view, $cms_select, $search_key;
-        $template = $GLOBALS['template_factory']->open('elearning/_module_header.php');
-        $template->title      = $title;
-        $template->view       = $view;
-        $template->cms_select = $cms_select;
-        $template->search_key = $search_key;
-        $template->all_open   = $_SESSION['elearning_open_close']['all open'];
-        return $template->render();
-    }
-
-    /**
-    * get Headline
-    *
-    * returns a table with a headline
-    *
-    * @param string $title headline
-    * @return string returns html-code
-    */
-    public static function getHeader($title)
-    {
-        $template = $GLOBALS['template_factory']->open('elearning/_header.php');
-        $template->title = $title;
-        return $template->render();
-    }
-
-    /**
-     * save timestamp
-     *
-     * saves a timestamp for debugging and performance-check
-     *
-     * @param string $stri description
-     */
-    public static function bench($stri)
-    {
-        $GLOBALS['timearray'][] = [
-            'zeit' => microtime(true),
-            'name' => $stri,
-        ];
-    }
-
-    /**
-     * show benchmark
-     *
-     * shows saved timestamps with descriptions
-     *
-     * @param string $stri description
-     */
-    public static function showbench()
-    {
-        global $timearray;
-        echo "<table><tr><td>Zeit (".$timearray[0]["name"].")</td><td align=\"right\"></td></tr>";
-        for ($i = 0; $i < count($timearray); $i++) {
-            echo "<tr><td>".$timearray[$i]["name"].": </td><td align=\"right\">" . number_format(($timearray[$i]["zeit"]-$timearray[$i-1]["zeit"])*1000,2) . " msek</td></tr>";
-        }
-        echo "<tr><td>Gesamtzeit: </td><td align=\"right\">" . number_format(($timearray[$i-1]["zeit"]-$timearray[0]["zeit"])*1000,2)." msek</td></tr></table>";
-    }
-
-    /**
-     * delete cms-data
-     *
-     * deletes all data belonging to the specified cms from stud.ip database
-     */
-    public static function deleteCMSData($cms_type)
-    {
-        $db = DBManager::get();
-        $db->execute("DELETE FROM auth_extern WHERE external_user_system_type = ?", [$cms_type]);
-        $db->execute("DELETE FROM object_contentmodules WHERE system_type = ?", [$cms_type]);
-
-        $config = Config::get();
-        foreach ($config->getFields('global' ,null , "ELEARNING_INTERFACE_{$cms_type}") as $key) {
-            $config->delete($key);
-        }
-    }
-
-    /**
-     * get ilias courses
-     *
-     * creates output of ilias courses linked to the chosen seminar. also updates object-connections.
-     *
-     * @return array
-     */
-    public static function getIliasCourses($sem_id)
-    {
-        global  $connected_cms, $messages, $view, $cms_select;
-        $db = DBManager::get();
-
-        $rs = $db->query("SELECT DISTINCT system_type, module_id
-                          FROM object_contentmodules
-                          WHERE module_type = 'crs' AND object_id = " . $db->quote($sem_id))
-                        ->fetchAll(PDO::FETCH_ASSOC);
-        $courses = [];
-        foreach ($rs as $row) {
-            $courses[$row['system_type']] = $row['module_id'];
-        }
-
-        $connected_courses = [
-            'courses' => [],
-        ];
-        if (is_array($courses)) {
-            foreach ($courses as $system_type => $crs_id) {
-                if (self::isCMSActive($system_type)) {
-                    self::loadClass($system_type);
-                    $connected_courses['courses'][$system_type] = [
-                        'url'      => URLHelper::getLink($connected_cms[$system_type]->link->cms_link . '?client_id=' . $connected_cms[$system_type]->getClientId() . '&cms_select=' . $system_type . '&ref_id=' . $crs_id . '&type=crs&target=start'),
-                        'cms_name' => $connected_cms[$system_type]->getName()
-                    ];
-                    // gegebenenfalls zugeordnete Module aktualisieren
-                    if (Request::option('update')) {
-                        if ((method_exists($connected_cms[$system_type], "updateConnections"))) {
-                            $connected_cms[$system_type]->updateConnections($crs_id);
-                        }
-                    }
-                    if (method_exists($connected_cms[$system_type]->permissions, 'CheckUserPermissions')) {
-                        $connected_cms[$system_type]->permissions->CheckUserPermissions($crs_id);
-                    }
-                }
-            }
-        }
-
-        if ($connected_courses['courses']) {
-            if (count($connected_courses['courses']) > 1) {
-                $connected_courses['text'] = _("Diese Veranstaltung ist mit folgenden Ilias-Kursen verknüpft. Hier gelangen Sie direkt in den jeweiligen Kurs: ");
-            } else {
-                $connected_courses['text'] = _("Diese Veranstaltung ist mit einem Ilias-Kurs verknüpft. Hier gelangen Sie direkt in den Kurs: ");
-            }
-        }
-
-        return $connected_courses;
-    }
-
-    /**
-    * check db-integrity
-    *
-    * checks if there are broken links in the database
-    *
-    * @return boolean successful
-    */
-    public static function checkIntegrity()
-    {
-        global $ELEARNING_INTERFACE_MODULES, $messages;
-        $db = DBManager::get();
-
-        foreach ($ELEARNING_INTERFACE_MODULES as $cms_type =>$data) $cmsystems[$cms_type] = [];
-
-        $config = Config::get();
-        foreach ($config->getFields('global' ,null , 'ELEARNING_INTERFACE_') as $key) {
-            $parts = explode("_", $key);
-            $cmsystems[$parts[2]]["config"]++;
-        }
-
-        $rs = $db->query("SELECT external_user_system_type, COUNT(*) as c FROM auth_extern GROUP BY external_user_system_type");
-        while ($row = $rs->fetch())
-            $cmsystems[$row["external_user_system_type"]]["accounts"] = $row['c'];
-        $rs = $db->query("SELECT system_type, COUNT(*) FROM object_contentmodules GROUP BY system_type");
-        while ($row = $rs->fetch())
-            $cmsystems[$row["system_type"]]["modules"] = $row['c'];
-
-        if (Request::submitted('delete')) {
-            $messages["info"] .= "<form method=\"POST\" action=\"" . URLHelper::getLink() . "\">";
-            $messages["info"] .= CSRFProtection::tokenTag();
-            $messages["info"] .= "<table>";
-            $messages["info"] .= "<tr><td>&nbsp;</td></tr>";
-            $messages["info"] .= "<tr><td>" . sprintf(_("Durch das Löschen der Daten zum System mit dem Index \"%s\" werden %s Konfigurationseinträge und Verknüpfungen von Stud.IP-Veranstaltungen und -User-Accounts unwiederbringlich aus der Stud.IP-Datenbank entfernt. Wollen Sie diese Daten jetzt löschen?"), Request::quoted('delete_cms'), $cmsystems[Request::quoted('delete_cms')]["accounts"]+$cmsystems[Request::quoted('delete_cms')]["modules"]+$cmsystems[Request::quoted('delete_cms')]["config"] ) . "</td></tr>";
-            $messages["info"] .= "<tr><td align=\"center\"><input type=\"hidden\" name=\"delete_cms\" value=\"".Request::quoted('delete_cms')."\">";
-            $messages["info"] .= '<div class="button-group">' . Button::create(_('Alle löschen'), 'confirm_delete') . Button::createCancel(_('Abbrechen'), 'abbruch') . '<div></td></tr>';
-            $messages["info"] .= "<tr><td align=\"center\"></td></tr>";
-            $messages["info"] .= "</table>";
-            $messages["info"] .= "</form>";
-        }
-
-        if (Request::submitted('confirm_delete')) {
-            unset($cmsystems[Request::quoted('delete_cms')]);
-//          deleteCMSData(Request::quoted('delete_cms'));
-            $messages["info"] .= _("Daten wurden gelöscht.");
-        }
-
-        foreach ($cmsystems as $cms_type =>$data) {
-            if ($ELEARNING_INTERFACE_MODULES[$cms_type]) {
-                $output .= self::getCMSHeader($ELEARNING_INTERFACE_MODULES[$cms_type]["name"]);
-                $output .= "<table>";
-                $output .= "<tr><td colspan=\"2\">&nbsp;</td></tr>";
-                if (self::isCMSActive($cms_type)) {
-                    $output .= "<tr><td>" .  Icon::create('checkbox-checked', 'clickable')->asImg(['class' => 'text-top']) . "</td><td><b>". sprintf(_("Die Schnittstelle zum System %s ist aktiv."), $ELEARNING_INTERFACE_MODULES[$cms_type]["name"]) . "</b></td></tr>";
-                    $output .= "<tr><td colspan=\"2\">&nbsp;</td></tr>";
-                }
-                elseif ($data["config"] < 1)
-                    $output .= "<tr><td>" .  Icon::create('checkbox-unchecked', 'clickable')->asImg(['class' => 'text-top']) . "</td><td><i>". sprintf(_("Die Schnittstelle für das System %s wurde noch nicht eingerichtet."), $ELEARNING_INTERFACE_MODULES[$cms_type]["name"]) . "</i></td></tr>";
-                elseif ($data["config"] < 1)
-                    $output .= "<tr><td>" .  Icon::create('checkbox-unchecked', 'clickable')->asImg(['class' => 'text-top']) . "</td><td><i>". sprintf(_("Die Schnittstelle wurde noch nicht aktiviert."), $ELEARNING_INTERFACE_MODULES[$cms_type]["name"]) . "</i></td></tr>";
-
-                if ($data["accounts"])
-                    $output .= "<tr><td colspan=\"2\">". sprintf(_("%s Stud.IP-User-Accounts sind mit Accounts im System %s verknüpft."), $data["accounts"], $ELEARNING_INTERFACE_MODULES[$cms_type]["name"]) . "</td></tr>";
-                if ($data["modules"])
-                    $output .= "<tr><td colspan=\"2\">". sprintf(_("%s Objekte sind Stud.IP-Veranstaltungen oder -Einrichtungen zugeordnet."), $data["modules"]) . "</td></tr>";
-                if ($data["config"])
-                    $output .= "<tr><td colspan=\"2\">". sprintf(_("%s Einträge in der config-Tabelle der Stud.IP-Datenbank."), $data["config"]) . "</td></tr>";
-                $output .= "<tr><td colspan=\"2\">&nbsp;</td></tr>";
-                $output .= "</table>";
-                $output .= self::getCMSFooter(($ELEARNING_INTERFACE_MODULES[$cms_type]["logo_file"] ? "<img src=\"".$ELEARNING_INTERFACE_MODULES[$cms_type]["logo_file"]."\" border=\"0\">" : $cms_type));
-            }
-            else {
-                $output .= self::getCMSHeader("<font color=FF0000> Unbekanntes System: " . $cms_type . "</font>");
-                $output .= "<form method=\"POST\" action=\"" . URLHelper::getLink() . "\">";
-                $output .= CSRFProtection::tokenTag();
-                $output .= "<table>";
-                $output .= "<tr><td colspan=\"2\">&nbsp;</td></tr>";
-                $output .= "<tr><td>" . Icon::create('decline', 'attention')->asImg(['class' => 'text-top']) . "</td><td><i>".sprintf(_("Für das System mit dem Index \"%s\" existieren keine Voreinstellungen in den Konfigurationsdateien mehr."), $cms_type) . "</i></td></tr>";
-                $output .= "<tr><td colspan=\"2\">&nbsp;</td></tr>";
-                $output .= "<tr><td colspan=\"2\"><b>". _("In der Stud.IP-Datenbank sind noch folgende Informationen zu diesem System gespeichert:") . "</b></td></tr>";
-                if ($data["accounts"])
-                    $output .= "<tr><td colspan=\"2\">". sprintf(_("%s Stud.IP-User-Accounts sind mit externen Accounts mit dem Index \"%s\" verknüpft."), $data["accounts"], $cms_type) . "</td></tr>";
-                if ($data["modules"])
-                    $output .= "<tr><td colspan=\"2\">". sprintf(_("%s Objekte sind Stud.IP-Veranstaltungen oder -Einrichtungen zugeordnet."), $data["modules"]) . "</td></tr>";
-                if ($data["config"])
-                    $output .= "<tr><td colspan=\"2\">". sprintf(_("%s Einträge in der config-Tabelle der Stud.IP-Datenbank."), $data["config"]) . "</td></tr>";
-                $output .= "<tr><td colspan=\"2\">&nbsp;</td></tr>";
-                $output .= "<tr><td align=\"center\" colspan=\"2\"><input type=\"hidden\" name=\"delete_cms\" value=\"".$cms_type."\">" . Button::create(_('Löschen'), 'delete') . "</td></tr>";
-                $output .= "<tr><td colspan=\"2\">&nbsp;</td></tr>";
-                $output .= "</table>";
-                $output .= "</form>";
-                $output .= self::getCMSFooter('');
-            }
-            $output .= "<br>";
-        }
-
-        return $output;
-    }
-}
diff --git a/lib/elearning/Ilias3ConnectedCMS.php b/lib/elearning/Ilias3ConnectedCMS.php
deleted file mode 100644
index 759880afc92..00000000000
--- a/lib/elearning/Ilias3ConnectedCMS.php
+++ /dev/null
@@ -1,350 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-use Studip\Button, Studip\LinkButton;
-
-/**
-* main-class for connection to ILIAS 3
-*
-* This class contains the main methods of the elearning-interface to connect to ILIAS 3. Extends ConnectedCMS.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       Ilias3ConnectedCMS
-* @package  ELearning-Interface
-*/
-class Ilias3ConnectedCMS extends ConnectedCMS
-{
-    var $client_id;
-    var $root_user_sid;
-    var $main_category_node_id;
-    var $user_role_template_id;
-    var $user_skin;
-    var $user_style;
-    var $crs_roles;
-    var $global_roles;
-    var $soap_client;
-    var $encrypt_passwords;
-    var $is_first_call = true;
-
-    /**
-    * constructor
-    *
-    * init class.
-    * @access public
-    * @param string $cms system-type
-    */
-    function __construct($cms)
-    {
-        global $ELEARNING_INTERFACE_MODULES;
-
-        parent::__construct($cms);
-
-        require_once($this->CLASS_PREFIX . "Soap.php");
-        $classname = $this->CLASS_PREFIX . "Soap";
-        $this->soap_client = new $classname($this->cms_type);
-        $this->soap_client->setCachingStatus(true);
-
-        $this->main_category_node_id = ELearningUtils::getConfigValue("category_id", $cms);
-
-        if ((ELearningUtils::getConfigValue("user_role_template_id", $cms) == "") AND ($GLOBALS["role_template_name"] == ""))
-            $GLOBALS["role_template_name"] = "Author";
-        $this->user_role_template_id = ELearningUtils::getConfigValue("user_role_template_id", $cms);
-        $this->user_skin = ELearningUtils::getConfigValue("user_skin", $cms);
-        $this->user_style = ELearningUtils::getConfigValue("user_style", $cms);
-        $this->encrypt_passwords = ELearningUtils::getConfigValue("encrypt_passwords", $cms);
-
-        $this->crs_roles = $ELEARNING_INTERFACE_MODULES[$cms]["crs_roles"];
-        $this->client_id = $ELEARNING_INTERFACE_MODULES[$cms]["soap_data"]["client"];
-        $this->global_roles = $ELEARNING_INTERFACE_MODULES[$cms]["global_roles"];
-    }
-
-    /**
-    * get preferences
-    *
-    * shows additional settings.
-    */
-    public function getPreferences()
-    {
-        $role_template_name = Request::get('role_template_name');
-        $cat_name = Request::get('cat_name');
-        $style_setting = Request::option('style_setting');
-        $encrypt_passwords = Request::option('encrypt_passwords');
-
-        $this->soap_client->setCachingStatus(false);
-
-        $messages = ['error' => ''];
-
-        if ($cat_name) {
-            $cat = $this->soap_client->getReferenceByTitle( trim( $cat_name ), "cat");
-            if (!$cat) {
-                $messages["error"] .= sprintf(_("Das Objekt mit dem Namen \"%s\" wurde im System %s nicht gefunden."), htmlReady($cat_name), htmlReady($this->getName())) . "<br>\n";
-            } else {
-                ELearningUtils::setConfigValue("category_id", $cat, $this->cms_type);
-                $this->main_category_node_id = $cat;
-            }
-        }
-
-        if ($role_template_name) {
-            $role_template = $this->soap_client->getObjectByTitle( trim( $role_template_name ), "rolt" );
-            if (!$role_template) {
-                $messages["error"] .= sprintf(_("Das Rollen-Template mit dem Namen \"%s\" wurde im System %s nicht gefunden."), htmlReady($role_template_name), htmlReady($this->getName())) . "<br>\n";
-            } elseif (is_array($role_template)) {
-                ELearningUtils::setConfigValue("user_role_template_id", $role_template["obj_id"], $this->cms_type);
-                ELearningUtils::setConfigValue("user_role_template_name", $role_template["title"], $this->cms_type);
-                $this->user_role_template_id = $role_template["obj_id"];
-            }
-        }
-
-        if (Request::submitted('submit')) {
-            ELearningUtils::setConfigValue("user_style", $style_setting, $this->cms_type);
-            ELearningUtils::setConfigValue("user_skin", $style_setting, $this->cms_type);
-            ELearningUtils::setConfigValue("encrypt_passwords", $encrypt_passwords, $this->cms_type);
-        } else {
-            if (ELearningUtils::getConfigValue("user_style", $this->cms_type)) {
-                $style_setting = ELearningUtils::getConfigValue("user_style", $this->cms_type);
-            }
-            if (ELearningUtils::getConfigValue("encrypt_passwords", $this->cms_type)) {
-                $encrypt_passwords = ELearningUtils::getConfigValue("encrypt_passwords", $this->cms_type);
-            }
-        }
-
-
-        if ($messages['error']) {
-            echo "<b>" . Icon::create('decline', 'attention')->asImg(['class' => 'text-top', 'title' => _('Fehler')]) . " " . $messages["error"] . "</b><br><br>";
-        }
-
-        echo "<table>";
-        echo "<tr valign=\"top\"><td width=30% align=\"left\"><font size=\"-1\">";
-        echo "<b>" . _("SOAP-Verbindung: ") . "</b>";
-        echo "</td><td><font size=\"-1\">";
-        $error = $this->soap_client->getError();
-        if ($error != false)
-            echo sprintf(_("Beim Herstellen der SOAP-Verbindung trat folgender Fehler auf:")) . "<br><br>" . $error;
-        else
-            echo sprintf(_("Die SOAP-Verbindung zum Klienten \"%s\" wurde hergestellt, der Name des Administrator-Accounts ist \"%s\"."), htmlReady($this->soap_data["client"]), htmlReady($this->soap_data["username"]));
-        echo "<br>\n";
-        echo "<br>\n";
-        echo "</td></tr><tr><td  width=30% align=\"left\"><font size=\"-1\">";
-
-        $cat = $this->soap_client->getObjectByReference( $this->main_category_node_id );
-        echo '<b>' . _('Kategorie') . ':</b>';
-        echo "</td><td>";
-        echo "<input type=\"text\" size=\"20\" border=0 value=\"" . $cat["title"] . "\" name=\"cat_name\">&nbsp;";
-        echo Icon::create('info-circle', 'inactive', ['title' => _('Geben Sie hier den Namen einer bestehenden ILIAS 3 - Kategorie ein, in der die Lernmodule und User-Kategorien abgelegt werden sollen.')])->asImg();
-        echo "</td></tr><tr><td></td><td><font size=\"-1\">";
-        echo " (ID " . $this->main_category_node_id;
-        if ($cat["description"] != "")
-            echo ", " . _("Beschreibung: ") . htmlReady($cat["description"]);
-        echo ")";
-        echo "<br>\n";
-        echo "<br>\n";
-        echo "</td></tr><tr><td  width=30% align=\"left\"><font size=\"-1\">";
-
-
-        echo "<b>" . _("Rollen-Template für die persönliche Kategorie: ") . "</b>";
-        echo "</td><td>";
-        echo "<input type=\"text\" size=\"20\" border=0 value=\"" . ELearningUtils::getConfigValue("user_role_template_name", $this->cms_type) . "\" name=\"role_template_name\">&nbsp;";
-        echo Icon::create('info-circle', 'inactive', ['title' => _('Geben Sie den Namen des Rollen-Templates ein, das für die persönliche Kategorie von Lehrenden verwendet werden soll (z.B. \"Author\").')])->asImg();
-        echo "</td></tr><tr><td></td><td><font size=\"-1\">";
-        echo " (ID " . $this->user_role_template_id;
-        echo ")";
-        echo "<br>\n";
-        echo "<br>\n";
-        echo "</td></tr><tr><td  width=30% align=\"left\"><font size=\"-1\">";
-
-        echo "<b>" . _("Passwörter: ") . "</b>";
-        echo "</td><td><font size=\"-1\">";
-        echo "<input type=\"checkbox\" border=0 value=\"md5\" name=\"encrypt_passwords\"";
-        if ($encrypt_passwords == "md5")
-            echo " checked";
-        echo ">&nbsp;" . _("ILIAS-Passwörter verschlüsselt speichern.");
-        echo Icon::create('info-circle', 'inactive', ['title' => _('Wählen Sie diese Option, wenn die ILIAS-Passwörter der zugeordneten Accounts verschlüsselt in der Stud.IP-Datenbank abgelegt werden sollen.')])->asImg();
-        echo "</td></tr><tr><td></td><td><font size=\"-1\">";
-        echo "<br>\n";
-        echo "<br>\n";
-        echo "</td></tr><tr><td  width=30% align=\"left\"><font size=\"-1\">";
-
-        echo "<b>" . _("Style / Skin: ") . "</b>";
-        echo "</td><td><font size=\"-1\">";
-        echo "<input type=\"checkbox\" border=0 value=\"studip\" name=\"style_setting\"";
-        if ($style_setting == "studip")
-            echo " checked";
-        echo ">&nbsp;" . _("Stud.IP-Style für neue Nutzer-Accounts voreinstellen.");
-        echo Icon::create('info-circle', 'inactive', ['title' => _('Wählen Sie diese Option, wenn für alle von Stud.IP angelegten ILIAS-Accounts das Stud.IP-Layout als System-Style eingetragen werden soll. ILIAS-seitig angelegte Accounts erhalten weiterhin den Standard-Style.')])->asImg();
-        echo "</td></tr><tr><td></td><td><font size=\"-1\">";
-        echo "<br>\n";
-        echo "<br>\n";
-
-
-
-
-        echo "</td></tr>";
-        echo "</table>";
-        echo "<center>" . Button::create(_('übernehmen'), 'submit') . "</center><br>";
-        echo "<br>\n";
-
-        parent::getPreferences();
-
-        echo "<br>\n";
-    }
-
-    function setContentModule($data, $is_connected = false)
-    {
-        parent::setContentModule($data, $is_connected);
-
-        if ($data["owner"] != "")
-        {
-            $user_data = $this->soap_client->getUser($data["owner"]);
-            $user_name = trim($user_data["title"] . " " . $user_data["firstname"] . " " . $user_data["lastname"]);
-            $this->content_module[$data["ref_id"]]->setAuthors($user_name);
-        }
-        $this->content_module[$data["ref_id"]]->setPermissions($data["accessInfo"], $data["operations"]);
-    }
-
-    /**
-    * create new instance of subclass content-module
-    *
-    * creates new instance of subclass content-module and gets permissions
-    * @access public
-    * @param string $module_id module-id
-    * @param string $module_type module-type
-    * @param string $is_connected is module connected to seminar?
-    */
-    function newContentModule($module_id, $module_type, $is_connected = false)
-    {
-        global $seminar_id, $current_module, $caching_active;
-
-        $current_module = $module_id;
-//      echo "call module $module_id";
-
-        if ($this->is_first_call  AND ($seminar_id != "") AND ($is_connected == true))
-        {
-            $id = ObjectConnections::getConnectionModuleId( $seminar_id, "crs", $this->cms_type );
-            if ($id != false)
-            {
-                if ($this->user->isConnected())
-                    $this->permissions->checkUserPermissions($id);
-                $this->is_first_call = false;
-            }
-//          echo "first call, ref_id $id";
-        }
-
-        parent::newContentModule($module_id, $module_type, $is_connected);
-    }
-
-    /**
-    * get user modules
-    *
-    * returns user content modules
-    * @access public
-    * @return array list of content modules
-    */
-    function getUserContentModules()
-    {
-        global $connected_cms;
-
-        $types = [];
-        foreach ($this->types as $type => $name)
-        {
-            $types[] = $type;
-        }
-        if ($this->user->getCategory() == false)
-            return false;
-        $result = $this->soap_client->getTreeChilds($this->user->getCategory(), $types, $connected_cms[$this->cms_type]->user->getId());
-        $obj_ids = [];
-        if (is_array($result))
-            foreach($result as $key => $object_data){
-                if (is_array($object_data["operations"])){
-                    if ((!in_array($object_data["obj_id"], $obj_ids) && in_array(OPERATION_READ, $object_data["operations"]))
-                    || in_array(OPERATION_WRITE, $object_data["operations"]))
-                    {
-                        if (is_array($user_modules[$object_data["obj_id"]]["operations"])){
-                            if (in_array(OPERATION_WRITE, $user_modules[$object_data["obj_id"]]["operations"])){
-                                continue;
-                            }
-                        }
-                        $user_modules[$object_data["obj_id"]] = $object_data;
-                        $obj_ids[] = $result[$key]["obj_id"];
-                    }
-                }
-            }
-        return $user_modules;
-    }
-
-    /**
-    * search for content modules
-    *
-    * returns found content modules
-    * @access public
-    * @param string $key keyword
-    * @return array list of content modules
-    */
-    function searchContentModules($key)
-    {
-        global $connected_cms;
-
-        $types = [];
-        foreach ($this->types as $type => $name)
-        {
-            $types[] = $type;
-        }
-
-        $result = $this->soap_client->searchObjects($types, $key,"and", $connected_cms[$this->cms_type]->user->getId());
-        return $result;
-    }
-
-
-    /**
-    * get client-id
-    *
-    * returns client-id
-    * @access public
-    * @return string client-id
-    */
-    function getClientId()
-    {
-        return $this->client_id;
-    }
-
-    /**
-    * get session-id
-    *
-    * returns soap-session-id
-    * @access public
-    * @return string session-id
-    */
-    function getSID()
-    {
-        return $this->root_user_sid;
-    }
-
-    /**
-    * terminate
-    *
-    * terminates connection.
-    */
-    public function terminate()
-    {
-//      $this->soap_client->logout();
-        $this->soap_client->saveCacheData();
-    }
-
-    //we have to delete the course only
-    function deleteConnectedModules($object_id){
-        global $connected_cms;
-        $connected_cms[$this->cms_type]->soap_client->setCachingStatus(false);
-        $connected_cms[$this->cms_type]->soap_client->clearCache();
-        $connected_cms[$this->cms_type]->soap_client->user_type == "admin";
-        $crs_id = ObjectConnections::getConnectionModuleId($object_id, "crs", $this->cms_type);
-        if($crs_id && $connected_cms[$this->cms_type]->soap_client->checkReferenceById($crs_id)){
-            $connected_cms[$this->cms_type]->soap_client->deleteObject($crs_id);
-        }
-        return parent::deleteConnectedModules($object_id);
-    }
-}
-?>
diff --git a/lib/elearning/Ilias3ConnectedLink.php b/lib/elearning/Ilias3ConnectedLink.php
deleted file mode 100644
index f50fd533eb8..00000000000
--- a/lib/elearning/Ilias3ConnectedLink.php
+++ /dev/null
@@ -1,188 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-use Studip\Button, Studip\LinkButton;
-
-/**
-* class to generate links to ILIAS 3
-*
-* This class contains methods to generate links to ILIAS 3.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       Ilias3ConnectedLink
-* @package  ELearning-Interface
-*/
-class Ilias3ConnectedLink extends ConnectedLink
-{
-    /**
-    * constructor
-    *
-    * init class.
-    * @access
-    * @param string $cms system-type
-    */
-    function __construct($cms)
-    {
-        parent::__construct($cms);
-        $this->cms_link = "ilias3_referrer.php";
-    }
-
-    /**
-    * get user module links
-    *
-    * returns content module links for user
-    * @return string html-code
-    */
-    public function getUserModuleLinks()
-    {
-        global $connected_cms, $current_module;
-
-        $output = '';
-
-        if ($connected_cms[$this->cms_type]->isAuthNecessary() && !$connected_cms[$this->cms_type]->user->isConnected()) {
-            $output .= $this->getNewAccountLink();
-        } elseif (!$connected_cms[$this->cms_type]->content_module[$current_module]->isDummy()) {
-            if ($connected_cms[$this->cms_type]->content_module[$current_module]->isAllowed(OPERATION_READ)) {
-                $output .= LinkButton::create(
-                    _('Starten'),
-                    URLHelper::getURL($this->cms_link, [
-                        'client_id'  => $connected_cms[$this->cms_type]->getClientId(),
-                        'cms_select' => $this->cms_type,
-                        // 'sess_id'    => $connected_cms[$this->cms_type]->user->getSessionId(),
-                        'ref_id'     => $connected_cms[$this->cms_type]->content_module[$current_module]->getId(),
-                        'type'       => $connected_cms[$this->cms_type]->content_module[$current_module]->getModuleType(),
-                        'target'     => 'start',
-                    ]),
-                    [
-                        'target' => '_blank',
-                        'rel'    => 'noopener noreferrer',
-                    ]
-                );
-                $output .= "&nbsp;";
-            }
-            if ($connected_cms[$this->cms_type]->content_module[$current_module]->isAllowed(OPERATION_WRITE)) {
-                $output .= LinkButton::create(
-                    _('Bearbeiten'),
-                    URLHelper::getURL($this->cms_link, [
-                        'client_id'  => $connected_cms[$this->cms_type]->getClientId(),
-                        'cms_select' => $this->cms_type,
-                        // 'sess_id'    => $connected_cms[$this->cms_type]->user->getSessionId(),
-                        'ref_id'     => $connected_cms[$this->cms_type]->content_module[$current_module]->getId(),
-                        'type'       => $connected_cms[$this->cms_type]->content_module[$current_module]->getModuleType(),
-                        'target'     => 'edit',
-                    ]),
-                    [
-                        'target' => '_blank',
-                        'rel'    => 'noopener noreferrer',
-                    ]
-                );
-                $output .= "&nbsp;";
-            }
-        }
-
-        return $output;
-    }
-
-    /**
-    * get admin module links
-    *
-    * returns links add or remove a module from course
-    * @return string returns html-code
-    */
-    public function getAdminModuleLinks()
-    {
-        global $connected_cms, $view, $search_key, $cms_select, $current_module;
-
-        $output = "<form method=\"POST\" action=\"" . URLHelper::getLink() . "\">\n";
-        $output .= CSRFProtection::tokenTag();
-        $output .= "<input type=\"HIDDEN\" name=\"view\" value=\"" . htmlReady($view) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"search_key\" value=\"" . htmlReady($search_key) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"cms_select\" value=\"" . htmlReady($cms_select) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"module_type\" value=\"" . htmlReady($connected_cms[$this->cms_type]->content_module[$current_module]->getModuleType()) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"module_id\" value=\"" . htmlReady($connected_cms[$this->cms_type]->content_module[$current_module]->getId()) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"module_system_type\" value=\"" . htmlReady($this->cms_type) . "\">\n";
-
-        if ($connected_cms[$this->cms_type]->content_module[$current_module]->isConnected()) {
-            $output .= "&nbsp;" . Button::create(_('Entfernen'), 'remove');
-        } elseif ($connected_cms[$this->cms_type]->content_module[$current_module]->isAllowed(OPERATION_WRITE)) {
-            $output .= "<div align=\"left\"><input type=\"CHECKBOX\" value=\"1\" name=\"write_permission\" style=\"vertical-align:middle\">";
-            $output .= _("Mit Schreibrechten für alle Lehrenden/Tutoren und Tutorinnen dieser Veranstaltung") . "<br>";
-            $output .= "<input type=\"CHECKBOX\" value=\"1\" style=\"vertical-align:middle\" name=\"write_permission_autor\">";
-            $output .= _("Mit Schreibrechten für alle Teilnehmenden dieser Veranstaltung") . "</div>";
-            $output .=  Button::create(_('Hinzufügen'), 'add') . "<br>";
-        } else {
-            $output .= "&nbsp;" . Button::create(_('Hinzufügen'), 'add');
-        }
-        $output .= "</form>";
-
-        return $output;
-    }
-
-    /**
-    * get new module link
-    *
-    * returns link to create a new module if allowed
-    * @return string|false returns html-code or false
-    */
-    public function getNewModuleLink()
-    {
-        global $connected_cms, $auth;
-        $output = "\n";
-        if (Request::get("module_type_" . $this->cms_type)) {
-            if (!$connected_cms[$this->cms_type]->user->category) {
-                $connected_cms[$this->cms_type]->user->newUserCategory();
-                if ($connected_cms[$this->cms_type]->user->category == false) {
-                    return $output;
-                }
-            }
-            $output  = "&nbsp;";
-            $output .= LinkButton::create(
-                _('Neu anlegen'),
-                URLHelper::getURL($this->cms_link, [
-                    'client_id'  => $connected_cms[$this->cms_type]->getClientId(),
-                    'cms_select' => $this->cms_type,
-//                    'sess_id'    => $connected_cms[$this->cms_type]->user->getSessionId(),
-                    'ref_id'     => $connected_cms[$this->cms_type]->user->category,
-                    'type'       => Request::option("module_type_" . $this->cms_type),
-                    'target'     => 'new',
-                ]),
-                [
-                    'target' => '_blank',
-                    'rel'    => 'noopener noreferrer',
-                ]
-            );
-        }
-        $user_crs_role = $connected_cms[$this->cms_type]->crs_roles[$auth->auth['perm']];
-        if ($user_crs_role === 'admin') {
-            return $output;
-        }
-
-        return false;
-    }
-
-    /**
-    * get start page link
-    *
-    * returns link to ilias start-page
-    * @access public
-    * @return string returns url or false
-    */
-    function getStartpageLink()
-    {
-        global $connected_cms;
-
-        if ($connected_cms[$this->cms_type]->user->isConnected()) {
-            $output = $this->cms_link . "?"
-                . "client_id=" . $connected_cms[$this->cms_type]->getClientId()
-                . "&cms_select=" . $this->cms_type
-                . "&target=login";
-        }
-        return $output;
-    }
-}
-?>
diff --git a/lib/elearning/Ilias3ConnectedPermissions.php b/lib/elearning/Ilias3ConnectedPermissions.php
deleted file mode 100644
index 5ac5f59c24c..00000000000
--- a/lib/elearning/Ilias3ConnectedPermissions.php
+++ /dev/null
@@ -1,256 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-DEFINE ("CRS_NOTIFICATION", "1");
-DEFINE ("CRS_NO_NOTIFICATION", "2");
-DEFINE ("CRS_ADMIN_ROLE", "1");
-DEFINE ("CRS_MEMBER_ROLE", "2");
-DEFINE ("CRS_TUTOR_ROLE", "3");
-DEFINE ("CRS_PASSED_VALUE", "0");
-
-DEFINE ("OPERATION_VISIBLE", "visible");
-DEFINE ("OPERATION_READ", "read");
-DEFINE ("OPERATION_WRITE", "write");
-DEFINE ("OPERATION_DELETE", "delete");
-DEFINE ("OPERATION_CREATE_LM", "create_lm");
-DEFINE ("OPERATION_CREATE_TEST", "create_tst");
-DEFINE ("OPERATION_CREATE_QUESTIONS", "create_qps");
-DEFINE ("OPERATION_CREATE_FILE", "create_file");
-
-/**
-* class to handle ILIAS 3 access controls
-*
-* This class contains methods to handle permissions on connected objects.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       Ilias3ConnectedPermission
-* @package  ELearning-Interface
-*/
-class Ilias3ConnectedPermissions extends ConnectedPermissions
-{
-    var $operations;
-    var $allowed_operations;
-    var $tree_allowed_operations;
-
-    var $USER_OPERATIONS;
-    var $AUTHOR_OPERATIONS;
-
-    /**
-    * constructor
-    *
-    * init class.
-    * @access
-    * @param string $cms system-type
-    */
-    function __construct($cms)
-    {
-        global $connected_cms;
-
-        parent::__construct($cms);
-        $this->readData();
-
-        if ($connected_cms[$this->cms_type]->user->isConnected())
-        {
-            $roles = $this->getUserRoles();
-            $connected_cms[$this->cms_type]->user->setRoles( $roles );
-        }
-        $this->USER_OPERATIONS = [OPERATION_VISIBLE, OPERATION_READ];
-//      $this->AUTHOR_OPERATIONS = array(OPERATION_VISIBLE, OPERATION_READ, OPERATION_CREATE_LM, OPERATION_CREATE_TEST, OPERATION_CREATE_QUESTIONS, OPERATION_CREATE_FILE);
-    }
-
-    /**
-    * read data
-    *
-    * reads acces control data from database
-    * @access public
-    */
-    function readData()
-    {
-        global $connected_cms;
-
-        $this->operations = $connected_cms[$this->cms_type]->soap_client->getOperations();
-    }
-
-    /**
-    * check user permissions
-    *
-    * checks user permissions for connected course and changes setting if necessary
-    * @access public
-    * @param string $course_id course-id
-    * @return boolean returns false on error
-    */
-    function checkUserPermissions($course_id)
-    {
-        global $connected_cms, $messages;
-
-        if (!$course_id) {
-            return false;
-        }
-        if (!$connected_cms[$this->cms_type]->user->getId()) {
-            return false;
-        }
-
-        // get course role folder and local roles
-        $local_roles = $connected_cms[$this->cms_type]->soap_client->getLocalRoles($course_id);
-        $active_role = "";
-        $proper_role = "";
-        $user_crs_role = $connected_cms[$this->cms_type]->crs_roles[$GLOBALS['perm']->get_studip_perm(Context::getId())];
-        if (is_array($local_roles)) {
-            foreach ($local_roles as $key => $role_data) { // check only if local role is il_crs_member, -tutor or -admin
-                if (mb_strpos($role_data["title"], "_crs_") !== false) {
-                    if (in_array($role_data["obj_id"], $connected_cms[$this->cms_type]->user->getRoles())) {
-                        $active_role = $role_data["obj_id"];
-                    }
-                    if (mb_strpos($role_data["title"], $user_crs_role) > 0) {
-                        $proper_role = $role_data["obj_id"];
-                    }
-                }
-            }
-        }
-
-        // is user already course-member? otherwise add member with proper role
-        $is_member = $connected_cms[$this->cms_type]->soap_client->isMember( $connected_cms[$this->cms_type]->user->getId(), $course_id);
-        if (!$is_member) {
-            $member_data["usr_id"] = $connected_cms[$this->cms_type]->user->getId();
-            $member_data["ref_id"] = $course_id;
-            $member_data["status"] = CRS_NO_NOTIFICATION;
-            $type = "";
-            switch ($user_crs_role) {
-                case "admin":
-                    $member_data["role"] = CRS_ADMIN_ROLE;
-                    $type = "Admin";
-                    break;
-                case "tutor":
-                    $member_data["role"] = CRS_TUTOR_ROLE;
-                    $type = "Tutor";
-                    break;
-                case "member":
-                    $member_data["role"] = CRS_MEMBER_ROLE;
-                    $type = "Member";
-                    break;
-                default:
-            }
-            $member_data["passed"] = CRS_PASSED_VALUE;
-            if ($type != "")
-            {
-                $connected_cms[$this->cms_type]->soap_client->addMember( $connected_cms[$this->cms_type]->user->getId(), $type, $course_id );
-                if ($GLOBALS["debug"] == true)
-                    echo "addMember";
-            }
-        }
-
-        // check if user has proper local role
-        // if not, change it
-        if ($active_role != $proper_role)
-        {
-            if ($active_role != "")
-            {
-                $connected_cms[$this->cms_type]->soap_client->deleteUserRoleEntry( $connected_cms[$this->cms_type]->user->getId(), $active_role);
-                if ($GLOBALS["debug"] == true)
-                    echo "Role $active_role deleted.";
-            }
-
-            if ($proper_role != "")
-            {
-                $connected_cms[$this->cms_type]->soap_client->addUserRoleEntry( $connected_cms[$this->cms_type]->user->getId(), $proper_role);
-                if ($GLOBALS["debug"] == true)
-                    echo "Role $proper_role added.";
-            }
-
-        }
-        if (!$this->getContentModulePerms($course_id)) {
-            $messages["info"] .= _("Für den zugeordneten ILIAS-Kurs konnten keine Berechtigungen ermittelt werden.") . "<br>";
-        }
-
-        return true;
-    }
-
-    /**
-    * get user roles
-    *
-    * returns roles for current user
-    * @access public
-    * @return array role-ids
-    */
-    function getUserRoles()
-    {
-        global $connected_cms;
-
-        return $connected_cms[$this->cms_type]->soap_client->getUserRoles($connected_cms[$this->cms_type]->user->getId());
-    }
-
-    /**
-    * get permissions for content module
-    *
-    * returns allowed operations for given user and module
-    * @access public
-    * @param string $module_id module-id
-    * @return boolean returns false on error
-    */
-    function getContentModulePerms($module_id)
-    {
-        global $connected_cms, $current_module;
-
-        if (is_array($connected_cms[$this->cms_type]->content_module[$current_module]->allowed_operations))
-            return true;
-        $this->allowed_operations = [];
-        $this->tree_allowed_operations = $connected_cms[$this->cms_type]->soap_client->getObjectTreeOperations(
-                    $module_id,
-                    $connected_cms[$this->cms_type]->user->getId()
-                    );
-        if (!is_array($this->tree_allowed_operations)) {
-            return false;
-        }
-
-        $no_permission = false;
-        if (isset($current_module)) { //TODO: fixes Warning:Creating default object from empty value - possible side effects
-            if ((! in_array($this->operations[OPERATION_READ], $this->tree_allowed_operations)) OR (! in_array($this->operations[OPERATION_VISIBLE], $this->tree_allowed_operations)))
-                $no_permission = true;
-
-            if ($no_permission == false)
-                $connected_cms[$this->cms_type]->content_module[$current_module]->allowed_operations = $this->tree_allowed_operations;
-            else
-                $connected_cms[$this->cms_type]->content_module[$current_module]->allowed_operations = false;
-        }
-        return true;
-    }
-
-    /**
-    * get operation
-    *
-    * returns id for given operation-string
-    * @access public
-    * @param string $operation operation
-    * @return integer operation-id
-    */
-    function getOperation($operation)
-    {
-        return $this->operations[$operation];
-    }
-
-    /**
-    * get operation-ids
-    *
-    * returns an array of operation-ids
-    * @param array $operation operation
-    * @return array|false operation-ids
-    */
-    public function getOperationArray($operation)
-    {
-        if (!is_array($operation)) {
-            return false;
-        }
-
-        return array_map(
-            function ($operation_name) {
-                return $this->operations[$operation_name];
-            },
-            $operation
-        );
-    }
-}
diff --git a/lib/elearning/Ilias3ConnectedUser.php b/lib/elearning/Ilias3ConnectedUser.php
deleted file mode 100644
index ef985295e0e..00000000000
--- a/lib/elearning/Ilias3ConnectedUser.php
+++ /dev/null
@@ -1,345 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/**
-* class to handle ILIAS 3 user-accounts
-*
-* This class contains methods to handle connected ILIAS 3 user-accounts.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       Ilias3ConnectedUser
-* @package  ELearning-Interface
-*/
-class Ilias3ConnectedUser extends ConnectedUser
-{
-    var $roles;
-    var $user_sid;
-    /**
-    * constructor
-    *
-    * init class.
-    * @access
-    * @param string $cms system-type
-    */
-    function __construct($cms, $user_id = false)
-    {
-        global $connected_cms, $perm;
-
-        parent::__construct($cms, $user_id);
-        // create account automatically if it doesn't exist
-        if (! $this->isConnected() AND ($connected_cms[$this->cms_type]->USER_AUTO_CREATE == true))
-        {
-            $this->setPassword(md5(uniqid("4dfmjsnll")));
-            $this->newUser(true);
-            $this->readData();
-        }
-        $this->roles = [$connected_cms[$cms]->roles[$perm->get_perm($this->studip_id)]];
-    }
-
-    function readData()
-    {
-        global $connected_cms;
-        parent::readData();
-        if($this->is_connected){
-            $user_id = $connected_cms[$this->cms_type]->soap_client->lookupUser($this->login);
-            if (!$user_id) {
-                //do not delete in case of error
-                if($user_id !== false) {
-                    $query = "DELETE FROM auth_extern WHERE studip_user_id = ? LIMIT 1";
-                    $statement = DBManager::get()->prepare($query);
-                    $statement->execute([$this->studip_id]);
-                }
-                $this->id = '';
-                $this->login = '';
-                $this->external_password = '';
-                $this->category = '';
-                $this->type = '';
-                $this->is_connected = false;
-            } elseif($this->category != ''){
-                $cat = $connected_cms[$this->cms_type]->soap_client->checkReferenceById($this->category);
-                if(!$cat){
-                    $query = "UPDATE auth_extern SET external_user_category = '' WHERE studip_user_id = ? LIMIT 1";
-                    $statement = DBManager::get()->prepare($query);
-                    $statement->execute([$this->studip_id]);
-
-                    $this->category = '';
-                }
-            }
-        }
-        return $this->is_connected;
-    }
-
-    /**
-    * get login-data
-    *
-    * gets login-data from database
-    * @access public
-    * @param string $username username
-    * @return boolean returns false, if no data was found
-    */
-    function getLoginData($username)
-    {
-        global $connected_cms;
-
-        if (!$username) {
-            return false;
-        }
-        $user_id = $connected_cms[$this->cms_type]->soap_client->lookupUser($username);
-
-        if ($user_id == false)
-            return false;
-
-        $user_data = $connected_cms[$this->cms_type]->soap_client->getUser($user_id);
-
-        if ($user_data == false)
-            return false;
-
-        $this->id = $user_data["usr_id"];
-        $this->login = $user_data["login"];
-        $this->external_password = $user_data["passwd"];
-        return true;
-    }
-
-    /**
-    * get crypted password
-    *
-    * returns ILIAS 3 password
-    * @access public
-    * @param string $password password
-    * @return string password
-    */
-    function getCryptedPassword($password)
-    {
-        return md5($password);
-    }
-
-    /**
-    * set roles
-    *
-    * sets roles
-    * @access public
-    * @param array $role_array role-array
-    */
-    function setRoles($role_array)
-    {
-        $this->roles = $role_array;
-    }
-
-    /**
-    * get roles
-    *
-    * returns roles
-    * @access public
-    * @return array roles
-    */
-    function getRoles()
-    {
-        return $this->roles;
-    }
-
-    /**
-    * create new user category
-    *
-    * create new user category
-    * @access public
-    * @return boolean returns false on error
-    */
-    function newUserCategory()
-    {
-        global $connected_cms, $messages;
-
-        $connected_cms[$this->cms_type]->soap_client->setCachingStatus(false);
-
-        // data for user-category in ILIAS 3
-        $object_data["title"] = sprintf(_("Eigene Daten von %s (%s)."), $this->getName(), $this->getId());
-        $object_data["description"] = sprintf(_("Hier befinden sich die persönlichen Lernmodule des Benutzers %s."), $this->getName());
-        $object_data["type"] = "cat";
-        $object_data["owner"] = $this->getId();
-
-        $cat = $connected_cms[$this->cms_type]->soap_client->getReferenceByTitle($object_data["title"]);
-        if ($cat != false && $connected_cms[$this->cms_type]->soap_client->checkReferenceById($cat) )
-        {
-            $messages["info"] .= sprintf(_("Ihre persönliche Kategorie wurde bereits angelegt."), $this->login) . "<br>\n";
-            $this->category = $cat;
-        }
-        else
-        {
-            $this->category = $connected_cms[$this->cms_type]->soap_client->addObject($object_data, $connected_cms[$this->cms_type]->main_category_node_id);
-        }
-        if ($this->category != false)
-            parent::setConnection( $this->getUserType() );
-        else
-        {
-            echo "CATEGORY_ERROR".$connected_cms[$this->cms_type]->main_category_node_id ."-";
-            return false;
-        }
-        // data for personal user-role in ILIAS 3
-        $role_data["title"] = "studip_usr" . $this->getId() . "_cat" . $this->category;
-        $role_data["description"] = sprintf(_("User-Rolle von %s. Diese Rolle wurde von Stud.IP generiert."), $this->getName());
-        $role_id = $connected_cms[$this->cms_type]->soap_client->getObjectByTitle($role_data["title"], "role");
-        if ($role_id != false)
-            $messages["info"] .= sprintf(_("Ihre persönliche Userrolle wurde bereits angelegt."), $this->login) . "<br>\n";
-        else
-            $role_id = $connected_cms[$this->cms_type]->soap_client->addRoleFromTemplate($role_data, $this->category, $connected_cms[$this->cms_type]->user_role_template_id);
-        $connected_cms[$this->cms_type]->soap_client->addUserRoleEntry($this->getId(), $role_id);
-        // delete permissions for all global roles for this category
-        foreach ($connected_cms[$this->cms_type]->global_roles as $key => $role)
-            $connected_cms[$this->cms_type]->soap_client->revokePermissions($role, $this->category);
-        return true;
-    }
-
-    /**
-    * new user
-    *
-    * save new user
-    * @access public
-    * @return boolean returns false on error
-    */
-    function newUser($ignore_encrypt_passwords = false)
-    {
-        global $connected_cms, $auth, $messages;
-
-        if ($this->getLoginData($this->login))
-        {
-            $messages["error"] .= sprintf(_("Es existiert bereits ein Account mit dem Benutzernamen \"%s\"."), $this->login) . "<br>\n";
-            return false;
-        }
-
-        // data for user-account in ILIAS 3
-        $user_data["login"] = $this->login;
-        $user_data["passwd"] = $this->external_password;
-        $user_data["firstname"] = $this->firstname;
-        $user_data["lastname"] = $this->lastname;
-        $user_data["title"] = $this->title;
-        $user_data["gender"] = $this->gender;
-        $user_data["email"] = $this->email;
-        $user_data["street"] = $this->street;
-        $user_data["phone_home"] = $this->phone_home;
-        $user_data["time_limit_unlimited"] = 1;
-        $user_data["active"] = 1;
-        $user_data["approve_date"] = date('Y-m-d H:i:s');
-        $user_data["accepted_agreement"] = true;
-
-        if ($connected_cms[$this->cms_type]->user_style != "")
-            $user_data["user_style"] = $connected_cms[$this->cms_type]->user_style;
-        if ($connected_cms[$this->cms_type]->user_skin != "")
-            $user_data["user_skin"] = $connected_cms[$this->cms_type]->user_skin;
-
-        $role_id = $connected_cms[$this->cms_type]->roles[$auth->auth["perm"]];
-
-        $user_id = $connected_cms[$this->cms_type]->soap_client->addUser($user_data, $role_id);
-
-        if ($user_id != false)
-        {
-            $this->id = $user_id;
-
-//          $connected_cms[$this->cms_type]->soap_client->updatePassword($user_id, $user_data["passwd"]);
-
-//          $this->newUserCategory();
-
-            $this->setConnection(USER_TYPE_CREATED, $ignore_encrypt_passwords);
-            return true;
-        }
-        echo $connected_cms[$this->cms_type]->soap_client->getError();
-        return false;
-    }
-
-    /**
-     * update user-account
-     */
-    public function updateUser()
-    {
-    }
-
-    /**
-    * delete user
-    *
-    * delete user-account
-    * @access public
-    * @return boolean returns false on error
-    */
-    function deleteUser()
-    {
-        global $connected_cms;
-        $ret = null;
-        $connected_cms[$this->cms_type]->soap_client->user_type == "admin";
-        $connected_cms[$this->cms_type]->soap_client->caching_active = false;
-        if($this->category){
-            $ret['cat_deleted'] = $connected_cms[$this->cms_type]->soap_client->deleteObject($this->category);
-        }
-        if($this->type == 0 && $this->id){
-            $ret['iliasuser_deleted'] = $connected_cms[$this->cms_type]->soap_client->deleteUser($this->id);
-        }
-        $query = "DELETE FROM auth_extern WHERE studip_user_id = ? LIMIT 1";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([$this->studip_id]);
-
-        $ret['auth_extern_deleted'] = $statement->rowCount();
-        return $ret;
-    }
-
-    /**
-     * set connection
-     *
-     * set user connection
-     * @access public
-     * @param string user_type user-type
-     */
-    public function setConnection($user_type, $ignore_encrypt_passwords = false)
-    {
-        global $connected_cms;
-
-        if (!$ignore_encrypt_passwords && $connected_cms[$this->cms_type]->encrypt_passwords === "md5")
-        {
-//          echo "PASSWORD-ENCRYPTION";
-            $this->external_password = $this->getCryptedPassword( $this->external_password );
-        }
-
-        $connected_cms[$this->cms_type]->soap_client->setCachingStatus(false);
-        parent::setConnection($user_type);
-    }
-
-    /**
-    * get sid
-    *
-    * returns soap-sid
-    * @access public
-    * @return string soap-sid
-    */
-    function getSID()
-    {
-        global $connected_cms;
-
-        $caching_status = $connected_cms[$this->cms_type]->soap_client->getCachingStatus();
-        $connected_cms[$this->cms_type]->soap_client->setCachingStatus(false);
-
-        $connected_cms[$this->cms_type]->soap_client->setUserType("user");
-        $this->user_sid = $connected_cms[$this->cms_type]->soap_client->login();
-
-        $connected_cms[$this->cms_type]->soap_client->setCachingStatus($caching_status);
-        $connected_cms[$this->cms_type]->soap_client->setUserType("admin");
-        return $this->user_sid;
-    }
-
-    /**
-    * get session-id
-    *
-    * returns soap-session-id
-    * @access public
-    * @return string soap-session-id
-    */
-    function getSessionId()
-    {
-        $sid = $this->getSID();
-        if ($sid == false)
-            return false;
-        $arr = explode("::", $sid);
-        return $arr[0];
-    }
-}
-?>
diff --git a/lib/elearning/Ilias3ContentModule.php b/lib/elearning/Ilias3ContentModule.php
deleted file mode 100644
index 3067575779b..00000000000
--- a/lib/elearning/Ilias3ContentModule.php
+++ /dev/null
@@ -1,292 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/**
-* class to handle ILIAS 3 learning modules and tests
-*
-* This class contains methods to handle ILIAS 3 learning modules and tests.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       Ilias3ContentModule
-* @package  ELearning-Interface
-*/
-class Ilias3ContentModule extends ContentModule
-{
-    var $object_id;
-
-    /**
-    * constructor
-    *
-    * init class.
-    * @access public
-    * @param string $module_id module-id
-    * @param string $module_type module-type
-    * @param string $cms_type system-type
-    */
-    function __construct($module_id, $module_type, $cms_type)
-    {
-        parent::__construct($module_id, $module_type, $cms_type);
-        if ($module_id != "")
-            $this->readData();
-    }
-
-    /**
-    * read data
-    *
-    * get module data from database.
-    * @access public
-    */
-    function readData()
-    {
-        global $connected_cms;
-
-        $object_data = $connected_cms[$this->cms_type]->soap_client->getObjectByReference($this->id, $connected_cms[$this->cms_type]->user->getId());
-        if ( (! ($object_data == false)) AND ($connected_cms[$this->cms_type]->types[$object_data["type"]] != "") )
-        {
-            // If User has no external Account, show module and link to user-assignment
-            if (! $connected_cms[$this->cms_type]->user->isConnected())
-                $this->allowed_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray([OPERATION_VISIBLE, OPERATION_READ] );
-
-            //set module data
-            $this->setObjectId($object_data["obj_id"]);
-            $this->setTitle($object_data["title"]);
-            $this->setDescription($object_data["description"]);
-            if ($object_data["owner"] != "")
-            {
-                $user_data = $connected_cms[$this->cms_type]->soap_client->getUser($object_data["owner"]);
-                $user_name = trim($user_data["title"] . " " . $user_data["firstname"] . " " . $user_data["lastname"]);
-                $this->setAuthors($user_name);
-            }
-            $this->setPermissions($object_data["accessInfo"], $object_data["operations"]);
-        }
-        else
-        {
-            // If module doesn't exist, show errormessage
-            $this->createDummyForErrormessage("not found");
-            $this->allowed_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray([OPERATION_VISIBLE, OPERATION_READ, OPERATION_DELETE] );
-        }
-    }
-
-    /**
-    * set permissions
-    *
-    * sets permissions for content-module
-    * @access public
-    * @param string $acces_info access-status
-    * @param array $operations array of operations
-    * @return boolean successful
-    */
-    function setPermissions($access_info, $operations)
-    {
-        global $connected_cms;
-
-        switch ($access_info) {
-            case "granted":
-                $this->allowed_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray($operations);
-                break;
-            case "no_permission":
-                $this->allowed_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray($operations);
-                $this->setDescription("<i>" . _("Sie haben keine Leseberechtigung für dieses Modul.") . "</i>");
-                return false;
-            case "missing_precondition":
-                $this->allowed_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray($operations );
-                $this->setDescription("<i>" . _("Sie haben zur Zeit noch keinen Zugriff auf deses Modul (fehlende Vorbedingungen).") . "</i>");
-                break;
-            case "no_object_access":
-                $this->allowed_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray($operations );
-                $this->setDescription("<i>" . _("Dieses Modul ist momentan offline oder durch Payment-Regeln gesperrt.") . "</i>");
-                break;
-            case "no_parent_access":
-                $this->allowed_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray($operations );
-                $this->setDescription("<i>" . _("Sie haben keinen Zugriff auf die übergeordneten Objekte dieses Moduls.") . "</i>");
-                return false;
-            case "object_deleted":
-                $this->createDummyForErrormessage("deleted");
-                return false;
-        }
-        if ($connected_cms[$this->cms_type]->isAuthNecessary() && $connected_cms[$this->cms_type]->user->isConnected()) {
-            // If User has no permission, don't show module data
-            if (!$this->isAllowed(OPERATION_VISIBLE) && !$this->isDummy() && $connected_cms[$this->cms_type]->user->isConnected()) {
-                $this->createDummyForErrormessage("no permission");
-            }
-        }
-
-        return true;
-    }
-
-    /**
-    * set connection
-    *
-    * sets connection with seminar
-    * @access public
-    * @param string $seminar_id seminar-id
-    * @return boolean successful
-    */
-    function setConnection($seminar_id)
-    {
-        global $connected_cms, $messages;
-
-        $write_permission = Request::option("write_permission");
-        $write_permission_autor = Request::option("write_permission_autor");
-
-        $crs_id = ObjectConnections::getConnectionModuleId($seminar_id, "crs", $this->cms_type);
-//      echo "SET?".$this->cms_type;
-        $connected_cms[$this->cms_type]->soap_client->setCachingStatus(false);
-        $connected_cms[$this->cms_type]->soap_client->clearCache();
-
-        // Check, ob Kurs in ILIAS gelöscht wurde
-        if (($crs_id != false) AND ($connected_cms[$this->cms_type]->soap_client->getObjectByReference($crs_id) == false))
-        {
-            ObjectConnections::unsetConnection($seminar_id, $crs_id, "crs", $this->cms_type);
-//          echo "deleted: ".ObjectConnections::getConnectionModuleId($seminar_id, "crs", $this->cms_type);
-//          echo "Der zugeordnete ILIAS-Kurs (ID $crs_id) existiert nicht mehr. Ein neuer Kurs wird angelegt.";
-            $messages["info"] .= _("Der zugeordnete ILIAS-Kurs (ID $crs_id) existiert nicht mehr. Ein neuer Kurs wird angelegt.") . "<br>";
-            $crs_id = false;
-        }
-
-        if ($crs_id == false)
-        {
-
-            $lang_array = explode("_",Config::get()->DEFAULT_LANGUAGE);
-            $course_data["language"] = $lang_array[0];
-            $course_data["title"] = "Stud.IP-Kurs " . Context::get()->Name;
-            $course_data["description"] = "";
-            $ref_id = $connected_cms[$this->cms_type]->main_category_node_id;
-            $crs_id = $connected_cms[$this->cms_type]->soap_client->addCourse($course_data, $ref_id);
-
-            if ($crs_id == false)
-            {
-                $messages["error"] .= _("Zuordnungs-Fehler: Kurs konnte nicht angelegt werden.");
-                return false;
-             }
-            ObjectConnections::setConnection($seminar_id, $crs_id, "crs", $this->cms_type);
-
-            // Rollen zuordnen
-            $connected_cms[$this->cms_type]->permissions->CheckUserPermissions($crs_id);
-//          $messages["info"] .= "Neue Kurs-ID: $crs_id. <br>";
-        }
-
-
-        $ref_id = $this->getId();
-        $ref_id = $connected_cms[$this->cms_type]->soap_client->addReference($this->id, $crs_id);
-        $local_roles = $connected_cms[$this->cms_type]->soap_client->getLocalRoles($crs_id);
-        $member_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray([OPERATION_VISIBLE, OPERATION_READ]);
-        $admin_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray([OPERATION_VISIBLE, OPERATION_READ, OPERATION_WRITE]);
-        foreach ($local_roles as $key => $role_data){
-            // check only if local role is il_crs_member, -tutor or -admin
-            if (mb_strpos($role_data["title"], "il_crs_") === 0) {
-                if(mb_strpos($role_data["title"], 'il_crs_member') === 0){
-                    $operations = $write_permission_autor ? $admin_operations : $member_operations;
-                } else if(mb_strpos($role_data["title"], 'il_crs_tutor') === 0){
-                    $operations = $write_permission_autor || $write_permission ? $admin_operations : $member_operations;
-                } else {
-                    continue;
-                }
-                $connected_cms[$this->cms_type]->soap_client->revokePermissions($role_data["obj_id"], $ref_id);
-                $connected_cms[$this->cms_type]->soap_client->grantPermissions($operations, $role_data["obj_id"], $ref_id);
-            }
-        }
-        if ($ref_id)
-        {
-            $this->setId($ref_id);
-            return parent::setConnection($seminar_id);
-        }
-        else
-            $messages["error"] .= _("Die Zuordnung konnte nicht gespeichert werden.");
-        return false;
-    }
-
-    /**
-    * unset connection
-    *
-    * unsets connection with seminar
-    * @access public
-    * @param string $seminar_id seminar-id
-    * @return boolean successful
-    */
-    function unsetConnection($seminar_id)
-    {
-        global $connected_cms, $messages;
-
-        $connected_cms[$this->cms_type]->soap_client->setCachingStatus(false);
-        {
-            if ( $this->getObjectId() != false)
-                $connected_cms[$this->cms_type]->soap_client->deleteObject($this->getId());
-            return parent::unsetConnection($seminar_id);
-        }
-        $messages["error"] .= _("Die Zuordnung konnte nicht entfernt werden.");
-        return false;
-    }
-
-    /**
-    * set object id
-    *
-    * sets object id
-    * @access public
-    * @param string $module_object_id object id
-    */
-    function setObjectId($module_object_id)
-    {
-        $this->object_id = $module_object_id;
-    }
-
-    /**
-    * get object id
-    *
-    * returns object id
-    * @access public
-    * @return string object id
-    */
-    function getObjectId()
-    {
-        return $this->object_id;
-    }
-
-    /**
-    * set allowed operations
-    *
-    * sets allowed operations
-    * @access public
-    * @param array $operation_array operation-ids
-    */
-    function setAllowedOperations( $operation_array )
-    {
-        global $connected_cms;
-
-        $this->allowed_operations = [];
-        foreach($operation_array as $key => $operation)
-        {
-//          echo "O$operation = I".$connected_cms[$this->cms_type]->permissions->getOperation[$operation]."<br>";
-            $this->allowed_operations[] = $connected_cms[$this->cms_type]->permissions->getOperation[$operation];
-        }
-    }
-
-    /**
-    * get permission-status
-    *
-    * returns true, if operation is allowed
-    * @access public
-    * @param string $operation operation
-    * @return boolean allowed
-    */
-    function isAllowed($operation)
-    {
-        global $connected_cms;
-
-        if (is_array($this->allowed_operations))
-        {
-            if (in_array($connected_cms[$this->cms_type]->permissions->getOperation($operation), $this->allowed_operations))
-                return true;
-            else
-                return false;
-        }
-        else
-            return false;
-    }
-}
-?>
diff --git a/lib/elearning/Ilias3ObjectXMLParser.php b/lib/elearning/Ilias3ObjectXMLParser.php
deleted file mode 100644
index 172ca2ae5ae..00000000000
--- a/lib/elearning/Ilias3ObjectXMLParser.php
+++ /dev/null
@@ -1,236 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-/*
-    +-----------------------------------------------------------------------------+
-    | ILIAS open source                                                           |
-    +-----------------------------------------------------------------------------+
-    | Copyright (c) 1998-2001 ILIAS open source, University of Cologne            |
-    |                                                                             |
-    | This program is free software; you can redistribute it and/or               |
-    | modify it under the terms of the GNU General Public License                 |
-    | as published by the Free Software Foundation; either version 2              |
-    | of the License, or (at your option) any later version.                      |
-    |                                                                             |
-    | This program is distributed in the hope that it will be useful,             |
-    | but WITHOUT ANY WARRANTY; without even the implied warranty of              |
-    | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               |
-    | GNU General Public License for more details.                                |
-    |                                                                             |
-    | You should have received a copy of the GNU General Public License           |
-    | along with this program; if not, write to the Free Software                 |
-    | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. |
-    +-----------------------------------------------------------------------------+
-*/
-
-
-/**
-* Object XML Parser
-*
-* @author Stefan Meyer <smeyer@databay.de>
-*
-* @extends ilSaxParser
-* @package common
-*/
-
-class Ilias3ObjectXMLParser extends Ilias3SaxParser
-{
-    var $object_data = [];
-    var $curr_obj;
-    var $reference_count;
-    var $cdata = '';
-
-    /**
-     * Constructor
-     *
-     * @param object $a_content_object           must be of type ilObjContentObject
-     *                                           ilObjTest or ilObjQuestionPool
-     * @param string $a_xml_file                 xml data
-     * @param string $a_subdir                   subdirectory in import directory
-     *
-     * @access   public
-     */
-    function __construct($a_xml_data = '')
-    {
-        parent::__construct();
-        $this->setXMLContent($a_xml_data);
-    }
-
-    function getObjectData()
-    {
-        return $this->object_data ? $this->object_data : [];
-    }
-
-    /**
-     * set event handlers
-     *
-     * @param resource    reference to the xml parser
-     *
-     * @access   private
-     */
-    function setHandlers($a_xml_parser)
-    {
-        xml_set_object($a_xml_parser, $this);
-        xml_set_element_handler($a_xml_parser, 'handlerBeginTag', 'handlerEndTag');
-        xml_set_character_data_handler($a_xml_parser, 'handlerCharacterData');
-    }
-
-
-    /**
-     * handler for begin of element
-     *
-     * @param resource $a_xml_parser xml parser
-     * @param string   $a_name       element name
-     * @param array    $a_attribs    element attributes array
-     */
-    function handlerBeginTag($a_xml_parser, $a_name, $a_attribs)
-    {
-
-        switch ($a_name) {
-            case 'Objects':
-                $this->curr_obj = -1;
-                break;
-
-            case 'Object':
-                ++$this->curr_obj;
-                $this->reference_count = -1;
-
-                $this->addProperty__('type', $a_attribs['type']);
-                $this->addProperty__('obj_id', $a_attribs['obj_id']);
-                break;
-
-            case 'Title':
-                break;
-
-            case 'Description':
-                break;
-
-            case 'Owner':
-                break;
-
-            case 'CreateDate':
-                break;
-
-            case 'LastUpdate':
-                break;
-
-            case 'ImportId':
-                break;
-
-            case 'References':
-                ++$this->reference_count;
-                $this->addReference__($a_attribs['ref_id'], $a_attribs['accessInfo']);
-                break;
-
-            case 'Operation':
-                break;
-        }
-    }
-
-
-    /**
-     * handler for end of element
-     *
-     * @param resource $a_xml_parser xml parser
-     * @param string   $a_name       element name
-     */
-    function handlerEndTag($a_xml_parser, $a_name)
-    {
-        switch ($a_name) {
-            case 'Objects':
-                break;
-
-            case 'Object':
-                break;
-
-            case 'Title':
-                $this->addProperty__('title', trim($this->cdata));
-                break;
-
-            case 'Description':
-                $this->addProperty__('description', trim($this->cdata));
-                break;
-
-            case 'Owner':
-                $this->addProperty__('owner', trim($this->cdata));
-                break;
-
-            case 'CreateDate':
-                $this->addProperty__('create_date', trim($this->cdata));
-                break;
-
-            case 'LastUpdate':
-                $this->addProperty__('last_update', trim($this->cdata));
-                break;
-
-            case 'ImportId':
-                $this->addProperty__('import_id', trim($this->cdata));
-                break;
-
-            case 'References':
-                $this->addReference__(trim($this->cdata));
-                break;
-
-            case 'Operation':
-                $this->addOperation__(trim($this->cdata));
-                break;
-        }
-
-        $this->cdata = '';
-
-        return;
-    }
-
-    /**
-     * handler for character data
-     *
-     * @param resource $a_xml_parser xml parser
-     * @param string   $a_data       character data
-     */
-    function handlerCharacterData($a_xml_parser, $a_data)
-    {
-        if ($a_data != "\n") {
-            // Replace multiple tabs with one space
-            $a_data = preg_replace("/\t+/", " ", $a_data);
-
-            $this->cdata .= $a_data;
-        }
-
-
-    }
-
-    // PRIVATE
-    function addProperty__($a_name, $a_value)
-    {
-        $this->object_data[$this->curr_obj][$a_name] = $a_value;
-        /*/
-            if (is_array($this->object_data[$this->curr_obj][$a_name]))
-                $this->object_data[$this->curr_obj][$a_name][] = $a_value;
-            elseif ($this->object_data[$this->curr_obj][$a_name] != "")
-            {
-                $old_value = $this->object_data[$this->curr_obj][$a_name];
-                $this->object_data[$this->curr_obj][$a_name] = array($old_value);
-                $this->object_data[$this->curr_obj][$a_name][] = $a_value;
-            }
-            else
-                $this->object_data[$this->curr_obj][$a_name] = $a_value;
-            /**/
-    }
-
-    function addReference__($a_value, $a_accessinfo = "")
-    {
-        if ($a_value) {
-            $this->object_data[$this->curr_obj]['references'][$this->reference_count]["ref_id"] = $a_value;
-            $this->object_data[$this->curr_obj]['references'][$this->reference_count]["accessInfo"] = $a_accessinfo;
-        }
-    }
-
-    function addOperation__($a_value)
-    {
-        if ($a_value) {
-            $this->object_data[$this->curr_obj]['references'][$this->reference_count]["operations"][] = $a_value;
-        }
-    }
-}
diff --git a/lib/elearning/Ilias3SaxParser.php b/lib/elearning/Ilias3SaxParser.php
deleted file mode 100644
index 92d247dd274..00000000000
--- a/lib/elearning/Ilias3SaxParser.php
+++ /dev/null
@@ -1,230 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-/*
-    +-----------------------------------------------------------------------------+
-    | ILIAS open source                                                           |
-    +-----------------------------------------------------------------------------+
-    | Copyright (c) 1998-2001 ILIAS open source, University of Cologne            |
-    |                                                                             |
-    | This program is free software; you can redistribute it and/or               |
-    | modify it under the terms of the GNU General Public License                 |
-    | as published by the Free Software Foundation; either version 2              |
-    | of the License, or (at your option) any later version.                      |
-    |                                                                             |
-    | This program is distributed in the hope that it will be useful,             |
-    | but WITHOUT ANY WARRANTY; without even the implied warranty of              |
-    | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               |
-    | GNU General Public License for more details.                                |
-    |                                                                             |
-    | You should have received a copy of the GNU General Public License           |
-    | along with this program; if not, write to the Free Software                 |
-    | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. |
-    +-----------------------------------------------------------------------------+
-*/
-
-
-/**
-* Base class for sax-based expat parsing
-* extended classes need to overwrite the method setHandlers and implement their own handler methods
-* 
-*
-* @author Stefan Meyer <smeyer@databay>
-*
-* @package ilias-core
-*/
-class Ilias3SaxParser
-{
-    /**
-     * XML-Content type 'file' or 'string'
-     * If you choose file set the filename in constructor
-     * If you choose 'String' call the constructor with no argument and use setXMLContent()
-     * @var string
-     * @access private
-     */
-    var $input_type = null;
-
-    /**
-     * XML-Content in case of content type 'string'
-
-     * @var string 
-     * @access private
-     */
-    var $xml_content = '';
-
-    /**
-     * ilias object
-     * @var object ilias
-     * @access private
-     */
-    var $ilias;
-
-    /**
-     * language object
-     * @var object language
-     * @access private
-     */
-    var $lng;
-
-    /**
-     * xml filename
-     * @var filename
-     * @access private
-     */
-    var $xml_file;
-
-    /**
-    * Constructor
-    * setup ILIAS global object
-    * @access   public
-    */
-    function __construct($a_xml_file = '')
-    {
-        global $ilias, $lng;
-
-        if($a_xml_file)
-        {
-            $this->xml_file = $a_xml_file;
-            $this->input_type = 'file';
-        }
-        
-        $this->ilias = &$ilias;
-        $this->lng = &$lng;
-    }
-
-    function setXMLContent($a_xml_content)
-    {
-        $this->xml_content = $a_xml_content;
-        $this->input_type = 'string';
-    }
-    
-    function getXMLContent()
-    {
-        return $this->xml_content;
-    }
-
-    function getInputType()
-    {
-        return $this->input_type;
-    }
-
-    /**
-    * stores xml data in array
-    * 
-    * @access   private
-    */
-    function startParsing()
-    {
-        $xml_parser = $this->createParser();
-        $this->setOptions($xml_parser);
-        $this->setHandlers($xml_parser);
-
-        switch($this->getInputType())
-        {
-            case 'file':
-                $fp = $this->openXMLFile();
-                $this->parse($xml_parser,$fp);
-                break;
-
-            case 'string':
-                $this->parse($xml_parser);
-                break;
-
-            default:
-                echo "No input type given. Set filename in constructor or choose setXMLContent()";
-                break;
-        }
-        $this->freeParser($xml_parser);
-    }
-    /**
-    * create parser
-    * 
-    * @access   private
-    */
-    function createParser()
-    {
-        $xml_parser = xml_parser_create("UTF-8");
-
-        if($xml_parser == false)
-        {
-            echo "Cannot create an XML parser handle";
-        }
-        return $xml_parser;
-    }
-    /**
-    * set parser options
-    * 
-    * @access   private
-    */
-    function setOptions($a_xml_parser)
-    {
-        xml_parser_set_option($a_xml_parser,XML_OPTION_CASE_FOLDING,false);
-    }
-    /**
-    * set event handler
-    * should be overwritten by inherited class
-    * @access   private
-    */
-    function setHandlers($a_xml_parser)
-    {
-        echo 'ilSaxParser::setHandlers() must be overwritten';
-    }
-    /**
-    * open xml file
-    * 
-    * @access   private
-    */
-    function openXMLFile()
-    {
-        if(!($fp = fopen($this->xml_file,'r')))
-        {
-            echo "Cannot open xml file";
-        }
-        return $fp;
-    }
-    /**
-    * parse xml file
-    * 
-    * @access   private
-    */
-    function parse($a_xml_parser,$a_fp = null)
-    {
-        switch($this->getInputType())
-        {
-            case 'file':
-
-                while($data = fread($a_fp,4096))
-                {
-                    $parseOk = xml_parse($a_xml_parser,$data,feof($a_fp));
-                }
-                break;
-                
-            case 'string':
-                $parseOk = xml_parse($a_xml_parser,$this->getXMLContent());
-                break;
-        }
-        if(!$parseOk
-           && (xml_get_error_code($a_xml_parser) != XML_ERROR_NONE))
-        {
-            echo $this->getXMLContent();
-            echo "XML Parse Error: ".xml_get_error_code($a_xml_parser);
-        }
-        return true;
-                
-    }
-    /**
-    * free xml parser handle
-    * 
-    * @access   private
-    */
-    function freeParser($a_xml_parser)
-    {
-        if(!xml_parser_free($a_xml_parser))
-        {
-            echo "Error freeing xml parser handle ";
-        }
-    }
-}
-?>
diff --git a/lib/elearning/Ilias3Soap.php b/lib/elearning/Ilias3Soap.php
deleted file mode 100644
index 4fc5a65f3d5..00000000000
--- a/lib/elearning/Ilias3Soap.php
+++ /dev/null
@@ -1,1069 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/**
-* class to use ILIAS-3-Webservices
-*
-* This class contains methods to connect to the ILIAS-3-Soap-Server.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       Ilias3Soap
-* @package  ELearning-Interface
-*/
-class Ilias3Soap extends StudipSoapClient
-{
-    var $cms_type;
-    var $admin_sid;
-    var $user_sid;
-    var $user_type;
-    var $soap_cache;
-    var $caching_active = false;
-
-    /**
-    * constructor
-    *
-    * init class.
-    * @access
-    * @param string $cms system-type
-    */
-    function __construct($cms)
-    {
-        global $ELEARNING_INTERFACE_MODULES, $connected_cms;
-        $this->cms_type = $cms;
-
-        parent::__construct($ELEARNING_INTERFACE_MODULES[$cms]["ABSOLUTE_PATH_SOAP"]);
-        $this->user_type = "admin";
-
-        $this->loadCacheData($cms);
-    }
-
-
-
-    /**
-    * set usertype
-    *
-    * sets usertype fpr soap-calls
-    * @access public
-    * @param string user_type usertype (admin or user)
-    */
-    function setUserType($user_type)
-    {
-        $this->user_type = $user_type;
-    }
-
-    /**
-    * get sid
-    *
-    * returns soap-session-id
-    * @access public
-    * @return string session-id
-    */
-    function getSID()
-    {
-        if ($this->user_type == "admin")
-        {
-            if ($this->admin_sid == false)
-                $this->login();
-//          echo "a";
-            return $this->admin_sid;
-        }
-        if ($this->user_type == "user")
-        {
-            if ($this->user_sid == false)
-                $this->login();
-//            echo "u";
-            return $this->user_sid;
-        }
-        return false;
-    }
-
-    /**
-    * call soap-function
-    *
-    * calls soap-function with given parameters
-    * @access public
-    * @param string method method-name
-    * @param string params parameters
-    * @return mixed result
-    */
-    function call($method, $params)
-    {
-        $index = md5($method . ":" . implode('-', $params));
-        // return false if no session_id is given
-        if (($method != "login") AND ($params["sid"] == ""))
-            return false;
-//      echo $this->caching_active;
-        if (($this->caching_active == true) AND (isset($this->soap_cache[$index])))
-        {
-//          echo $index;
-//          echo " from Cache<br>";
-            $result = $this->soap_cache[$index];
-        }
-        else
-        {
-            $result = $this->_call($method, $params);
-            // if Session is expired, re-login and try again
-            if (($method != "login") AND $this->soap_client->fault AND in_array(mb_strtolower($this->faultstring), ["session not valid","session invalid", "session idled"]) )
-            {
-//              echo "LOGIN AGAIN.";
-                $caching_status = $this->caching_active;
-                $this->caching_active = false;
-                $params["sid"] = $this->login();
-                $result = $this->_call($method, $params);
-                $this->caching_active = $caching_status;
-            }
-            elseif (! $this->soap_client->fault)
-                $this->soap_cache[$index] = $result;
-        }
-        return $result;
-    }
-
-    /**
-    * load cache
-    *
-    * load soap-cache
-    * @access public
-    * @param string cms cms-type
-    */
-    function loadCacheData($cms)
-    {
-        $this->soap_cache = (array)$_SESSION["cache_data"][$cms];
-    }
-
-    /**
-    * get caching status
-    *
-    * gets caching-status
-    * @access public
-    * @return boolean status
-    */
-    function getCachingStatus()
-    {
-        return $this->caching_active;
-    }
-
-    /**
-    * set caching status
-    *
-    * sets caching-status
-    * @access public
-    * @param boolean bool_value status
-    */
-    function setCachingStatus($bool_value)
-    {
-        $this->caching_active = $bool_value;
-//      echo "SET:".$this->caching_active."<br>";
-    }
-
-    /**
-    * clear cache
-    *
-    * clears cache
-    * @access public
-    */
-    function clearCache()
-    {
-        $this->soap_cache = [];
-        $_SESSION["cache_data"][$this->cms_type] = [];
-
-    }
-
-    /**
-    * save cache
-    *
-    * saves soap-cache in session-variable
-    * @access public
-    */
-    function saveCacheData()
-    {
-       $_SESSION["cache_data"][$this->cms_type] = $this->soap_cache;
-
-    }
-
-    /**
-    * parse xml
-    *
-    * use xml-parser
-    * @access public
-    * @param string data xml-data
-    * @return array object
-    */
-    function ParseXML($data)
-    {
-        $xml_parser = new Ilias3ObjectXMLParser($data);
-        $xml_parser->startParsing();
-        return $xml_parser->getObjectData();
-    }
-
-    /**
-    * login
-    *
-    * login to soap-webservice
-    * @access public
-    * @return string result
-    */
-    function login()
-    {
-        global $ELEARNING_INTERFACE_MODULES, $connected_cms;
-        if ($this->user_type == "admin")
-            $param = [
-                'client' => $ELEARNING_INTERFACE_MODULES[$this->cms_type]["soap_data"]["client"],
-                'username' => $ELEARNING_INTERFACE_MODULES[$this->cms_type]["soap_data"]["username"],
-                'password' => $ELEARNING_INTERFACE_MODULES[$this->cms_type]["soap_data"]["password"]
-                ];
-        elseif ($this->user_type == "user")
-            $param = [
-                'client' => $ELEARNING_INTERFACE_MODULES[$this->cms_type]["soap_data"]["client"],
-                'username' => $connected_cms[$this->cms_type]->user->getUsername(),
-                'password' => $connected_cms[$this->cms_type]->user->getPassword()
-                ];
-        $result = $this->call('login', $param);
-        if ($this->user_type == "admin")
-            $this->admin_sid = $result;
-        if ($this->user_type == "user")
-            $this->user_sid = $result;
-//      if ($this->user_type == "user") echo "SID".$this->call('login', $param).$param["username"];
-        return $result;
-    }
-
-    /**
-    * logout
-    *
-    * logout from soap-webservice
-    * @access public
-    * @return boolean result
-    */
-    function logout()
-    {
-        $param = [
-            'sid' => $this->getSID()
-            ];
-        return $this->call('logout', $param);
-    }
-
-
-///////////////////////////
-// OBJECT-FUNCTIONS //
-//////////////////////////
-
-    /**
-    * search objects
-    *
-    * search for ilias-objects
-    * @access public
-    * @param array types types
-    * @param string key keyword
-    * @param string combination search-combination
-    * @param string user_id ilias-user-id
-    * @return array objects
-    */
-    function searchObjects($types, $key, $combination, $user_id = "")
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'types' => $types,
-            'key' => $key,
-            'combination' => $combination
-            ];
-         if ($user_id != "")
-            $param["user_id"] = $user_id;
-        $result = $this->call('searchObjects', $param);
-        if ($result != false)
-        {
-            $objects = $this->parseXML($result);
-            $all_objects = [];
-            foreach($objects as $count => $object_data){
-                if (is_array($object_data["references"]))
-                {
-                    foreach($object_data["references"] as $ref_data)
-                        if ($ref_data["accessInfo"] == "granted"
-                        && (count($all_objects[$object_data["obj_id"]]["operations"]) < count($ref_data["operations"])))
-                        {
-                            $all_objects[$object_data["obj_id"]] = $object_data;
-                            unset($all_objects[$object_data["obj_id"]]["references"]);
-                            $all_objects[$object_data["obj_id"]]["ref_id"] = $ref_data["ref_id"];
-                            $all_objects[$object_data["obj_id"]]["accessInfo"] = $ref_data["accessInfo"];
-                            $all_objects[$object_data["obj_id"]]["operations"] = $ref_data["operations"];
-                        }
-                }
-            }
-            if (count($all_objects)){
-                foreach($all_objects as $one_object){
-                    $ret[$one_object['ref_id']] = $one_object;
-                }
-                return $ret;
-            }
-        }
-        return false;
-
-    }
-
-    /**
-    * get object by reference
-    *
-    * gets object by reference-id
-    * @access public
-    * @param ref reference_id
-    * @param string user_id ilias-user-id
-    * @return array object
-    */
-    function getObjectByReference($ref, $user_id = "")
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'reference_id' => $ref
-            ];
-         if ($user_id != "")
-            $param["user_id"] = $user_id;
-        $result = $this->call('getObjectByReference', $param);
-        if ($result != false)
-        {
-
-            $objects = $this->parseXML($result);
-            foreach($objects as $count => $object_data)
-                if (is_array($object_data["references"]))
-                {
-                    foreach($object_data["references"] as $ref_data)
-                        if ($ref_data["accessInfo"] != "object_deleted" && $ref == $ref_data["ref_id"])
-                        {
-                            $all_objects[$ref_data["ref_id"]] = $object_data;
-                            unset($all_objects[$ref_data["ref_id"]]["references"]);
-                            $all_objects[$ref_data["ref_id"]]["ref_id"] = $ref_data["ref_id"];
-                            $all_objects[$ref_data["ref_id"]]["accessInfo"] = $ref_data["accessInfo"];
-                            $all_objects[$ref_data["ref_id"]]["operations"] = $ref_data["operations"];
-                        }
-                }
-            return $all_objects[$ref];
-        }
-        return false;
-    }
-
-    /**
-    * get object by title
-    *
-    * gets object by title
-    * @access public
-    * @param string key keyword
-    * @param string type object-type
-    * @return array object
-    */
-    function getObjectByTitle($key, $type = "")
-    {
-        $param = [
-            'sid'   => $this->getSID(),
-            'title' => $key
-        ];
-        $result = $this->call('getObjectsByTitle', $param);
-        if ($result != false)
-        {
-            $objects = $this->parseXML($result);
-            foreach($objects as $index => $object_data)
-            {
-                if (($type != "") AND ($object_data["type"] != $type))
-                    unset($objects[$index]);
-                elseif (! (mb_strpos(mb_strtolower($object_data["title"]), mb_strtolower(trim($key)) ) === 0))
-                    unset($objects[$index]);
-            }
-            reset($objects);
-            if (sizeof($objects) > 0)
-                return current($objects);
-        }
-        return false;
-    }
-
-    /**
-    * get reference by title
-    *
-    * gets reference-id by object-title
-    * @access public
-    * @param string key keyword
-    * @param string type object-type
-    * @return string reference-id
-    */
-    function getReferenceByTitle($key, $type = "")
-    {
-        $param = [
-            'sid'   => $this->getSID(),
-            'title' => $key
-        ];
-        $result = $this->call('getObjectsByTitle', $param);
-        if ($result != false)
-        {
-            $objects = $this->parseXML($result);
-            foreach($objects as $index => $object_data)
-            {
-                if (($type != "") AND ($object_data["type"] != $type))
-                    unset($objects[$index]);
-                elseif (mb_strpos(mb_strtolower($object_data["title"]), mb_strtolower(trim($key)) ) === false)
-                    unset($objects[$index]);
-            }
-            if (sizeof($objects) > 0)
-                foreach($objects as $object_data)
-                    if (sizeof($object_data["references"]) > 0)
-                    {
-                        return $object_data["references"][0]["ref_id"];
-                    }
-        }
-        return false;
-    }
-
-    /**
-    * add object
-    *
-    * adds new ilias-object
-    * @access public
-    * @param array object_data object-data
-    * @param string ref_id reference-id
-    * @return string result
-    */
-    function addObject($object_data, $ref_id)
-    {
-    $type = $object_data["type"];
-    $title = htmlReady($object_data["title"]);
-    $description = htmlReady($object_data["description"]);
-
-    $xml = "<!DOCTYPE Objects SYSTEM \"http://www.ilias.uni-koeln.de/download/dtd/ilias_object_0_1.dtd\">
-<Objects>
-  <Object type=\"$type\">
-    <Title>
-    $title
-    </Title>
-    <Description>
-    $description
-    </Description>
-  </Object>
-</Objects>";
-
-        $param = [
-            'sid' => $this->getSID(),
-            'target_id' => $ref_id,
-            'object_xml' => $xml
-            ];
-        return $this->call('addObject', $param);
-    }
-
-    /**
-    * delete object
-    *
-    * deletes ilias-object
-    * @access public
-    * @param string ref_id reference-id
-    * @return boolean result
-    */
-    function deleteObject($reference_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'reference_id' => $reference_id
-            ];
-        return $this->call('deleteObject', $param);
-    }
-
-    /**
-    * add reference
-    *
-    * add a new reference to an existing ilias-object
-    * @access public
-    * @param string object_id source-object-id
-    * @param string ref_id target-id
-    * @return string created reference-id
-    */
-    function addReference($object_id, $ref_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'source_id' => $object_id,
-            'target_id' => $ref_id
-            ];
-        return $this->call('addReference', $param);
-    }
-
-    /**
-    * get tree childs
-    *
-    * gets child-objects of the given tree node
-    * @access public
-    * @param string ref_id reference-id
-    * @param array types show only childs with these types
-    * @param string user_id user-id for permissions
-    * @return array objects
-    */
-    function getTreeChilds($ref_id, $types = "", $user_id = "")
-    {
-        if ($types == "")
-            $types = [];
-        $param = [
-            'sid' => $this->getSID(),
-            'ref_id' => $ref_id,
-            'types' => $types
-            ];
-         if ($user_id != "")
-            $param["user_id"] = $user_id;
-        $result = $this->call('getTreeChilds', $param);
-        if ($result != false)
-        {
-
-            $objects = $this->parseXML($result);
-            foreach($objects as $count => $object_data)
-                if (is_array($object_data["references"]))
-                    foreach($object_data["references"] as $ref_data)
-                        if ($ref_data["accessInfo"] != "object_deleted")
-                        {
-                            $all_objects[$ref_data["ref_id"]] = $object_data;
-//                          unset($all_objects[$ref_id]["references"]);
-                            $all_objects[$ref_data["ref_id"]]["ref_id"] = $ref_data["ref_id"];
-                            $all_objects[$ref_data["ref_id"]]["accessInfo"] = $ref_data["accessInfo"];
-                            $all_objects[$ref_data["ref_id"]]["operations"] = $ref_data["operations"];
-                        }
-            if (sizeof($all_objects) > 0) {
-                return $all_objects;
-            } else {
-                return [];
-            }
-        }
-        return false;
-    }
-
-/////////////////////////
-// RBAC-FUNCTIONS //
-///////////////////////
-    /**
-    * get operation
-    *
-    * gets all ilias operations
-    * @access public
-    * @return array operations
-    */
-    function getOperations()
-    {
-        $param = [
-            'sid' => $this->getSID()
-            ];
-        $result = $this->call('getOperations', $param);
-        if (is_array($result))
-            foreach ($result as $operation_set)
-                $operations[$operation_set["operation"]] = $operation_set["ops_id"];
-        return $operations;
-    }
-
-    /**
-    * get object tree operations
-    *
-    * gets permissions for object at given tree-node
-    * @access public
-    * @param string ref_id reference-id
-    * @param string user_id user-id for permissions
-    * @return array operation-ids
-    */
-    function getObjectTreeOperations($ref_id, $user_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'ref_id' => $ref_id,
-            'user_id' => $user_id
-            ];
-        $result = $this->call('getObjectTreeOperations', $param);
-        if ($result != false)
-        {
-            $ops_ids = [];
-            foreach ($result as $operation_set)
-                $ops_ids[] = $operation_set["ops_id"];
-            return $ops_ids;
-        }
-        return false;
-    }
-
-    /**
-    * get user roles
-    *
-    * gets user roles
-    * @access public
-    * @param string user_id user-id
-    * @return array role-ids
-    */
-    function getUserRoles($user_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'user_id' => $user_id
-           ];
-        $result = $this->call('getUserRoles', $param);
-        if ($result != false)
-        {
-            $objects = $this->parseXML($result);
-            $roles = [];
-            foreach ($objects as $count => $role) {
-                $roles[$count] = $role["obj_id"];
-            }
-            return $roles;
-        }
-        return false;
-    }
-
-    /**
-    * get local roles
-    *
-    * gets local roles for given object
-    * @access public
-    * @param string course_id object-id
-    * @return array role-objects
-    */
-    function getLocalRoles($course_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'ref_id' => $course_id
-           ];
-        $result = $this->call('getLocalRoles', $param);
-        if ($result != false)
-        {
-            $objects = $this->parseXML($result);
-            return $objects;
-        }
-        return false;
-    }
-
-    /**
-    * add role
-    *
-    * adds a new role
-    * @access public
-    * @param array role_data data for role-object
-    * @param string ref_id reference-id
-    * @return string role-id
-    */
-    function addRole($role_data, $ref_id)
-    {
-    $type = "role";
-    $title = htmlReady($role_data["title"]);
-    $description = htmlReady($role_data["description"]);
-
-    $xml = "<!DOCTYPE Objects SYSTEM \"http://www.ilias.uni-koeln.de/download/dtd/ilias_object_0_1.dtd\">
-<Objects>
-  <Object type=\"$type\">
-    <Title>
-    $title
-    </Title>
-    <Description>
-    $description
-    </Description>
-  </Object>
-</Objects>";
-
-        $param = [
-            'sid' => $this->getSID(),
-            'target_id' => $ref_id,
-            'obj_xml' => $xml
-            ];
-        $result = $this->call('addRole', $param);
-        if (is_array($result))
-            return current($result);
-        else
-            return false;
-    }
-
-    /**
-    * add role from tremplate
-    *
-    * adds a new role and adopts properties of the given role template
-    * @access public
-    * @param array role_data data for role-object
-    * @param string ref_id reference-id
-    * @param string role_id role-template-id
-    * @return string role-id
-    */
-    function addRoleFromTemplate($role_data, $ref_id, $role_id)
-    {
-    $type = "role";
-    $title = htmlReady($role_data["title"]);
-    $description = htmlReady($role_data["description"]);
-
-    $xml = "<!DOCTYPE Objects SYSTEM \"http://www.ilias.uni-koeln.de/download/dtd/ilias_object_0_1.dtd\">
-<Objects>
-  <Object type=\"$type\">
-    <Title>
-    $title
-    </Title>
-    <Description>
-    $description
-    </Description>
-  </Object>
-</Objects>";
-
-        $param = [
-            'sid' => $this->getSID(),
-            'target_id' => $ref_id,
-            'obj_xml' => $xml,
-            'role_template_id' => $role_id
-            ];
-        $result = $this->call('addRoleFromTemplate', $param);
-        if (is_array($result))
-            return current($result);
-        else
-            return false;
-    }
-
-    /**
-    * delete user role entry
-    *
-    * deletes a role entry from the given user
-    * @access public
-    * @param string user_id user-id
-    * @param string role_id role-id
-    * @return boolean result
-    */
-    function deleteUserRoleEntry($user_id, $role_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'user_id' => $user_id,
-            'role_id' => $role_id
-           ];
-        return $this->call('deleteUserRoleEntry', $param);
-    }
-
-    /**
-    * add user role entry
-    *
-    * adds a role entry for the given user
-    * @access public
-    * @param string user_id user-id
-    * @param string role_id role-id
-    * @return boolean result
-    */
-    function addUserRoleEntry($user_id, $role_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'user_id' => $user_id,
-            'role_id' => $role_id
-           ];
-        return $this->call('addUserRoleEntry', $param);
-    }
-
-    /**
-    * grant permissions
-    *
-    * grants permissions for given operations at role-id and ref-id
-    * @access public
-    * @param array operations operation-array
-    * @param string role_id role-id
-    * @param string ref_id reference-id
-    * @return boolean result
-    */
-    function grantPermissions($operations, $role_id, $ref_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'ref_id' => $ref_id,
-            'role_id' => $role_id,
-            'operations' => $operations,
-           ];
-        return $this->call('grantPermissions', $param);
-    }
-
-    /**
-    * revoke permissions
-    *
-    * revokes all permissions role-id and ref-id
-    * @access public
-    * @param string role_id role-id
-    * @param string ref_id reference-id
-    * @return boolean result
-    */
-    function revokePermissions($role_id, $ref_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'ref_id' => $ref_id,
-            'role_id' => $role_id,
-           ];
-        return $this->call('revokePermissions', $param);
-    }
-
-/////////////////////////
-// USER-FUNCTIONS //
-///////////////////////
-
-    /**
-    * lookup user
-    *
-    * gets user-id for given username
-    * @access public
-    * @param string username username
-    * @return string user-id
-    */
-    function lookupUser($username)
-    {
-        $param = [
-            'sid'       => $this->getSID(),
-            'user_name' => $username,
-        ];
-        return $this->call('lookupUser', $param); // returns user_id
-    }
-
-    /**
-    * get user
-    *
-    * gets user-data for given user-id
-    * @access public
-    * @param string user_id user-id
-    * @return array user-data
-    */
-    function getUser($user_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'user_id'         => $user_id,
-            ];
-        $result = $this->call('getUser', $param); // returns user-data-array
-        return $result;
-    }
-
-    /**
-    * add user
-    *
-    * adds new user and sets role-id
-    * @access public
-    * @param array user_data user-data
-    * @param string role_id global role-id for new user
-    * @return string user-id
-    */
-    function addUser($user_data, $role_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'user_data' => $user_data,
-            'global_role_id' => $role_id
-            ];
-        return $this->call('addUser', $param); // returns user_id
-    }
-
-    /**
-    * update user
-    *
-    * update user-data
-    * @access public
-    * @param array user_data user-data
-    * @return string result
-    */
-    function updateUser($user_data)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'user_data' => $user_data
-        ];
-        return $this->call('updateUser', $param); // returns boolean
-    }
-
-    /**
-    * update password
-    *
-    * update password with given string and write it uncrypted to the ilias-database
-    * @access public
-    * @param string user_id user-id
-    * @param string password password
-    * @return string result
-    */
-    function updatePassword($user_id, $password)
-    {
-        $param = [
-            'sid'          => $this->getSID(),
-            'user_id'      => $user_id,
-            'new_password' => $password
-        ];
-        return $this->call('updatePassword', $param); // returns boolean
-    }
-
-    /**
-    * delete user
-    *
-    * deletes user-account
-    * @access public
-    * @param string user_id user-id
-    * @return string result
-    */
-    function deleteUser($user_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'user_id'         => $user_id
-            ];
-        return $this->call('deleteUser', $param);   // returns boolean
-    }
-
-////////////////////////////
-// COURSE-FUNCTIONS //
-//////////////////////////
-
-    /**
-    * is course member
-    *
-    * checks if user is course-member
-    * @access public
-    * @param string user_id user-id
-    * @param string course_id course-id
-    * @return boolean result
-    */
-    function isMember($user_id, $course_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'course_id'         => $course_id,
-            'user_id'         => $user_id
-            ];
-        $status = $this->call('isAssignedToCourse', $param);    // returns 0 if not assigned, 1 => course admin, 2 => course member or 3 => course tutor
-        if ($status == 0)
-            return false;
-        else
-            return true;
-    }
-
-    /**
-    * add course member
-    *
-    * adds user to course
-    * @access public
-    * @param string user_id user-id
-    * @param string type member-type (Admin, Tutor or Member)
-    * @param string course_id course-id
-    * @return boolean result
-    */
-    function addMember($user_id, $type, $course_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'course_id'         => $course_id,
-            'user_id'         => $user_id,
-            'type'         => $type
-            ];
-        return $this->call('assignCourseMember', $param);
-    }
-
-    /**
-    * add course
-    *
-    * adds course
-    * @access public
-    * @param array course_data course-data
-    * @param string ref_id target-id
-    * @return string course-id
-    */
-    function addCourse($course_data, $ref_id)
-    {
-        foreach($course_data as $key => $value) {
-            $course_data[$key] = htmlReady($course_data[$key]);
-        }
-
-        $xml = $this->getCourseXML($course_data);
-        $param = [
-            'sid' => $this->getSID(),
-            'target_id'         => $ref_id,
-            'crs_xml' => $xml
-            ];
-        $crs_id = $this->call('addCourse', $param);
-        return $crs_id;
-    }
-
-    /**
-    * get course-xml
-    *
-    * gets course xml-object for given course-data
-    * @access public
-    * @param array course_data course-data
-    * @return string course-xml
-    */
-    function getCourseXML($course_data)
-    {
-    $crs_language = $course_data["language"];
-    $crs_admin_id = $course_data["admin_id"];
-    $crs_title = $course_data["title"];
-    $crs_desc = $course_data["description"];
-
-    $xml = "<!DOCTYPE Course SYSTEM \"http://www.ilias.uni-koeln.de/download/dtd/ilias_course_0_1.dtd\">
-<Course>
-  <MetaData>
-    <General Structure=\"Hierarchical\">
-      <Identifier Catalog=\"ILIAS\"/>
-      <Title Language=\"$crs_language\">
-      $crs_title
-      </Title>
-      <Language Language=\"$crs_language\"/>
-      <Description Language=\"$crs_language\">
-      $crs_desc
-      </Description>
-      <Keyword Language=\"$crs_language\">
-      </Keyword>
-    </General>
-  </MetaData>
-  <Admin id=\"$crs_admin_id\" notification=\"Yes\" passed=\"No\">
-  </Admin>
-  <Settings>
-    <Availability>
-      <Unlimited/>
-    </Availability>
-    <Syllabus>
-    </Syllabus>
-    <Contact>
-      <Name>
-      </Name>
-      <Responsibility>
-      </Responsibility>
-      <Phone>
-      </Phone>
-      <Email>
-      </Email>
-      <Consultation>
-      </Consultation>
-    </Contact>
-    <Registration registrationType=\"Password\" maxMembers=\"0\" notification=\"No\">
-      <Disabled/>
-    </Registration>
-    <Sort type=\"Manual\"/>
-    <Archive Access=\"Disabled\">
-    </Archive>
-  </Settings>
-</Course>";
-    return $xml;
-    }
-
-    /**
-    * check reference by title
-    *
-    * gets reference-id by object-title
-    * @access public
-    * @param string key keyword
-    * @param string type object-type
-    * @return string reference-id
-    */
-    function checkReferenceById($id)
-    {
-        $param = [
-            'sid'          => $this->getSID(),
-            'reference_id' => $id
-        ];
-
-        $result = $this->call('getObjectByReference', $param);
-        if ($result != false)
-        {
-            $objects = $this->parseXML($result);
-            //echo "<pre><hr>".print_r($objects,1);
-            //echo "\n</pre><hr>";
-            if(is_array($objects)){
-                foreach($objects as $index => $object_data){
-                    if(is_array($object_data['references'])){
-                        foreach($object_data['references'] as $reference){
-                            if($reference['ref_id'] == $id && $reference['accessInfo'] != 'object_deleted') return $object_data['obj_id'];
-                        }
-                    }
-                }
-            }
-        }
-        return false;
-    }
-}
diff --git a/lib/elearning/Ilias4ConnectedCMS.php b/lib/elearning/Ilias4ConnectedCMS.php
deleted file mode 100644
index 8db483bb217..00000000000
--- a/lib/elearning/Ilias4ConnectedCMS.php
+++ /dev/null
@@ -1,271 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/**
- * main-class for connection to ILIAS 4
- *
- * This class contains the main methods of the elearning-interface to connect to ILIAS 4. Extends Ilias3ConnectedCMS.
- *
- * @author   Arne Schröder <schroeder@data-quest.de>
- * @access   public
- * @modulegroup  elearning_interface_modules
- * @module       Ilias4ConnectedCMS
- * @package  ELearning-Interface
- */
-class Ilias4ConnectedCMS extends Ilias3ConnectedCMS
-{
-    var $user_category_node_id;
-    var $ldap_enable;
-    /**
-     * constructor
-     *
-     * init class.
-     * @access public
-     * @param string $cms system-type
-     */
-    function __construct($cms)
-    {
-        global $messages;
-        parent::__construct($cms);
-        if (ELearningUtils::getConfigValue("user_category_id", $cms)) {
-            $this->user_category_node_id = ELearningUtils::getConfigValue("user_category_id", $cms);
-        } else {
-            $this->user_category_node_id = $this->main_category_node_id;
-        }
-        if (ELearningUtils::getConfigValue("ldap_enable", $cms)) {
-            $this->ldap_enable = ELearningUtils::getConfigValue("ldap_enable", $cms);
-        }
-    }
-
-    /**
-     * Helper function to fetch children including objects in folders
-     * The typo in the function name, 'childs', is intentional to reflect the name of the ILIAS-SOAP call.
-     *
-     * @access public
-     * @param string $parent_id
-     * @return array result
-     */
-    function getChilds($parent_id) {
-        $types[] = 'fold';
-        foreach ($this->types as $type => $name) {
-            $types[] = $type;
-        }
-
-        $result = $this->soap_client->getTreeChilds($parent_id, $types, $this->user->getId());
-        if ($result) {
-            $parent_path = $this->soap_client->getRawPath($parent_id) . '_' . $parent_id;
-            foreach($result as $ref_id => $data) {
-                // Workaround: getTreeChilds() liefert ALLE Referenzen der beteiligten Objekte, hier sollen aber nur die aus dem Kurs geprüft werden. Deshalb Abgleich der Pfade aller gefundenen Objekt-Referenzen.
-                if (($data["accessInfo"] != "granted") OR ($this->soap_client->getRawPath($ref_id) != $parent_path))
-                    unset($result[$ref_id]);
-                elseif ($data['type'] == 'fold') {
-                    unset($result[$ref_id]);
-                    $result = $result + $this->getChilds($ref_id);
-                }
-            }
-        }
-
-        if (is_array($result))
-            return $result;
-        else
-            return [];
-    }
-
-    /**
-     * check connected modules and update connections
-     *
-     * checks if there are modules in the course that are not connected to the seminar
-     * @access public
-     * @param string $course_id course-id
-     */
-    function updateConnections($course_id)
-    {
-        global $connected_cms, $messages, $object_connections;
-
-        $db = DBManager::get();
-
-        $result = $this->soap_client->getObjectByReference($course_id);
-        if ($result) {
-            $course_path = $this->soap_client->getRawPath($course_id) . '_' . $result["ref_id"];
-        }
-        $this->soap_client->setCachingStatus(false);
-        // fetch childs
-        $result = $this->getChilds($course_id);
-
-        if (is_array($result)) {
-            $check = $db->prepare("SELECT 1 FROM object_contentmodules WHERE object_id = ? AND module_id = ? AND system_type = ? AND module_type = ?");
-            $found = [];
-            $added = 0;
-            $deleted = 0;
-            $messages["info"] .= "<b>".sprintf(_("Aktualisierung der Zuordnungen zum System \"%s\":"), $this->getName()) . "</b><br>";
-            foreach($result as $ref_id => $data) {
-                $check->execute([Context::getId(), $ref_id, $this->cms_type, $data["type"]]);
-                if (!$check->fetch()) {
-                    $messages["info"] .= sprintf(_("Zuordnung zur Lerneinheit \"%s\" wurde hinzugefügt."), ($data["title"])) . "<br>";
-                    ObjectConnections::setConnection(Context::getId(), $ref_id, $data["type"], $this->cms_type);
-                    $added++;
-                }
-                $found[] = $ref_id . '_' . $data["type"];
-            }
-            $to_delete = $db->prepare("SELECT module_id,module_type FROM object_contentmodules WHERE module_type <> 'crs' AND object_id = ? AND system_type = ? AND CONCAT_WS('_', module_id,module_type) NOT IN (?)");
-            $to_delete->execute([Context::getId(), $this->cms_type, count($found) ? $found : ['']]);
-            while ($row = $to_delete->fetch(PDO::FETCH_ASSOC)) {
-                ObjectConnections::unsetConnection(Context::getId(), $row["module_id"], $row["module_type"], $this->cms_type);
-                $deleted++;
-                $messages["info"] .= sprintf(_("Zuordnung zu \"%s\" wurde entfernt."), $row["module_id"]  . '_' . $row["module_type"]) . "<br>";
-            }
-            if (($added + $deleted) < 1) {
-                $messages["info"] .= _("Die Zuordnungen sind bereits auf dem aktuellen Stand.") . "<br>";
-            }
-        }
-        ELearningUtils::bench("update connections");
-    }
-
-    /**
-     * create course
-     *
-     * creates new ilias course
-     * @access public
-     * @param string $seminar_id seminar-id
-     * @return boolean successful
-     */
-    function createCourse($seminar_id)
-    {
-        global $messages, $ELEARNING_INTERFACE_MODULES;
-
-        $crs_id = ObjectConnections::getConnectionModuleId($seminar_id, "crs", $this->cms_type);
-        $this->soap_client->setCachingStatus(false);
-        $this->soap_client->clearCache();
-
-        if ($crs_id == false) {
-            $course = Course::find($seminar_id);
-            if ($course->home_institut) {
-                $ref_id = ObjectConnections::getConnectionModuleId($course->institut_id, 'cat', $this->cms_type);
-            }
-            if ($ref_id < 1) {
-                // Kategorie für Heimateinrichtung anlegen
-                $object_data['title'] = $course->home_institut->name;
-                $object_data['description'] = sprintf(_('Hier befinden sich die Veranstaltungsdaten zur Stud.IP-Einrichtung "%s".'), $course->home_institut->name);
-                $object_data['type'] = 'cat';
-                $object_data['owner'] =  $this->soap_client->LookupUser($ELEARNING_INTERFACE_MODULES[$this->cms_type]['soap_data']['username']);
-                $ref_id = $this->soap_client->addObject($object_data, $this->main_category_node_id);
-                ObjectConnections::setConnection($course->institut_id, $ref_id, 'cat', $this->cms_type);
-            }
-            if ($ref_id < 1) {
-                $ref_id = $this->main_category_node_id;
-            }
-
-            // Kurs anlegen
-            $lang_array = explode('_', Config::get()->DEFAULT_LANGUAGE);
-            $course_data['language'] = $lang_array[0];
-            $course_data['title'] = 'Stud.IP-Kurs ' . $course->name;
-            $course_data['description'] = '';
-            $crs_id = $this->soap_client->addCourse($course_data, $ref_id);
-            if ($crs_id == false) {
-                $messages["error"] .= _("Zuordnungs-Fehler: Kurs konnte nicht angelegt werden.");
-                return false;
-            }
-            ObjectConnections::setConnection($seminar_id, $crs_id, "crs", $this->cms_type);
-
-            // Rollen zuordnen
-            $this->permissions->CheckUserPermissions($crs_id);
-        }
-        return $crs_id;
-    }
-
-    /**
-     * get preferences
-     *
-     * shows additional settings.
-     * @access public
-     */
-    function getPreferences()
-    {
-        global $connected_cms;
-
-        $role_template_name = Request::get('role_template_name');
-        $cat_name = Request::get('cat_name');
-
-        $this->soap_client->setCachingStatus(false);
-
-        $messages = ['error' => ''];
-
-        if ($cat_name) {
-            $cat = $this->soap_client->getReferenceByTitle( trim( $cat_name ), "cat");
-            if (!$cat) {
-                $messages["error"] .= sprintf(_('Das Objekt mit dem Namen "%s" wurde im System %s nicht gefunden.'), htmlReady($cat_name), htmlReady($this->getName())) . "<br>\n";
-            } else {
-                ELearningUtils::setConfigValue("category_id", $cat, $this->cms_type);
-                $this->main_category_node_id = $cat;
-            }
-        }
-
-        if (($this->main_category_node_id != false) AND (ELearningUtils::getConfigValue("user_category_id", $this->cms_type) == "")) {
-            $object_data["title"] = _("User-Daten");
-            $object_data["description"] = _("Hier befinden sich die persönlichen Ordner der Stud.IP-User.");
-            $object_data["type"] = "cat";
-            $object_data["owner"] = $this->user->getId();
-            $user_cat = $connected_cms[$this->cms_type]->soap_client->addObject($object_data, $connected_cms[$this->cms_type]->main_category_node_id);
-            if ($user_cat) {
-                $this->user_category_node_id = $user_cat;
-                ELearningUtils::setConfigValue("user_category_id", $user_cat, $this->cms_type);
-            } else {
-                $messages["error"] .= _("Die Kategorie für User-Daten konnte nicht angelegt werden.") . "<br>\n";
-            }
-        }
-
-        if ($role_template_name != "") {
-            $role_template = $this->soap_client->getObjectByTitle( trim( $role_template_name ), "rolt" );
-            if ($role_template == false) {
-                $messages["error"] .= sprintf(_("Das Rollen-Template mit dem Namen \"%s\" wurde im System %s nicht gefunden."), htmlReady($role_template_name), htmlReady($this->getName())) . "<br>\n";
-            }
-            if (is_array($role_template)) {
-                ELearningUtils::setConfigValue("user_role_template_id", $role_template["obj_id"], $this->cms_type);
-                ELearningUtils::setConfigValue("user_role_template_name", $role_template["title"], $this->cms_type);
-                $this->user_role_template_id = $role_template["obj_id"];
-            }
-        }
-
-        if (Request::submitted('submit')) {
-            ELearningUtils::setConfigValue("encrypt_passwords", Request::option("encrypt_passwords"), $this->cms_type);
-            $encrypt_passwords = Request::option("encrypt_passwords");
-            ELearningUtils::setConfigValue("ldap_enable", Request::option("ldap_enable"), $this->cms_type);
-            $this->ldap_enable = Request::option("ldap_enable");
-        } else {
-            if (ELearningUtils::getConfigValue("encrypt_passwords", $this->cms_type) != "")
-            $encrypt_passwords = ELearningUtils::getConfigValue("encrypt_passwords", $this->cms_type);
-        }
-
-        $cat = $this->soap_client->getObjectByReference( $this->main_category_node_id );
-        $user_cat = $this->soap_client->getObjectByReference( $this->user_category_node_id );
-        $title = $this->link->getModuleLink($user_cat["title"], $this->user_category_node_id, "cat");
-        $ldap_options = [];
-        foreach (StudipAuthAbstract::GetInstance() as $plugin) {
-            if ($plugin instanceof StudipAuthLdap) {
-                $ldap_options[] = '<option '.($plugin->plugin_name == $this->ldap_enable ? 'selected' : '').'>' . $plugin->plugin_name . '</option>';
-            }
-        }
-        ob_start();
-        ConnectedCMS::getPreferences();
-        $module_types = ob_get_clean();
-
-        $template = $GLOBALS['template_factory']->open('elearning/ilias4_connected_cms_preferences.php');
-        $template->set_attribute('messages', $messages);
-        $template->set_attribute('soap_error', $this->soap_client->getError());
-        $template->set_attribute('soap_data', $this->soap_data);
-        $template->set_attribute('main_category_node_id',  $this->main_category_node_id);
-        $template->set_attribute('main_category_node_id_title', $cat['title']);
-        $template->set_attribute('user_category_node_id',  $this->user_category_node_id);
-        $template->set_attribute('user_category_node_id_title', $title);
-        $template->set_attribute('user_role_template_name', ELearningUtils::getConfigValue("user_role_template_name", $this->cms_type));
-        $template->set_attribute('user_role_template_id', $this->user_role_template_id);
-        $template->set_attribute('encrypt_passwords', $encrypt_passwords);
-        $template->set_attribute('ldap_options', count($ldap_options) ? join("\n", array_merge(['<option></option>'], $ldap_options)) : '');
-        $template->set_attribute('module_types', $module_types);
-        echo $template->render();
-    }
-
-}
diff --git a/lib/elearning/Ilias4ConnectedLink.php b/lib/elearning/Ilias4ConnectedLink.php
deleted file mode 100644
index a2bdb14123d..00000000000
--- a/lib/elearning/Ilias4ConnectedLink.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-use Studip\Button, Studip\LinkButton;
-
-/**
- * class to generate links to ILIAS 4
- *
- * This class contains methods to generate links to ILIAS 4.
- *
- * @author    Arne Schröder <schroeder@data-quest.de>
- * @access    public
- * @modulegroup    elearning_interface_modules
- * @module        Ilias4ConnectedLink
- * @package    ELearning-Interface
- */
-class Ilias4ConnectedLink extends Ilias3ConnectedLink
-{
-    /**
-     * constructor
-     *
-     * init class.
-     * @access
-     * @param string $cms system-type
-     */
-    function __construct($cms)
-    {
-        parent::__construct($cms);
-        $this->cms_link = "ilias3_referrer.php";
-    }
-
-    /**
-     * get module link
-     *
-     * returns link to the specified ilias object. works without initializing module-class.
-     * @access public
-     * @return string html-code
-     */
-    function getModuleLink($title, $module_id, $module_type)
-    {
-        global $connected_cms, $view, $search_key, $cms_select, $current_module;
-
-        if ($connected_cms[$this->cms_type]->isAuthNecessary() AND (! $connected_cms[$this->cms_type]->user->isConnected())) {
-            return false;
-        }
-        $output = "<a href=\"" . URLHelper::getLink($this->cms_link . "?"
-        . "client_id=" . $connected_cms[$this->cms_type]->getClientId()
-        . "&cms_select=" . $this->cms_type
-        . "&ref_id=" . $module_id
-        . "&type=" . $module_type
-        . "&target=start"). "\" target=\"_blank\" rel=\"noopener noreferrer\">";
-        $output .= $title;
-        $output .= "</a>&nbsp;";
-
-        return $output;
-    }
-
-    /**
-     * get admin module links
-     *
-     * returns links add or remove a module from course
-     * @access public
-     * @return string returns html-code
-     */
-    function getAdminModuleLinks()
-    {
-        global $connected_cms, $view, $search_key, $cms_select, $current_module;
-
-        $output = '';
-
-        $result = false;
-        if (!$connected_cms[$this->cms_type]->content_module[$current_module]->isDummy()) {
-            $result = $connected_cms[$this->cms_type]->soap_client->getPath($connected_cms[$this->cms_type]->content_module[$current_module]->getId());
-        }
-        if ($result) {
-            $output .= "<i>Pfad: ". htmlReady($result) . "</i><br><br>";
-        }
-        $output .= "<form method=\"POST\" action=\"" . URLHelper::getLink() . "\">\n";
-        $output .= CSRFProtection::tokenTag();
-        $output .= "<input type=\"HIDDEN\" name=\"view\" value=\"" . htmlReady($view) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"search_key\" value=\"" . htmlReady($search_key) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"cms_select\" value=\"" . htmlReady($cms_select) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"module_type\" value=\"" . htmlReady($connected_cms[$this->cms_type]->content_module[$current_module]->getModuleType()) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"module_id\" value=\"" . htmlReady($connected_cms[$this->cms_type]->content_module[$current_module]->getId()) . "\">\n";
-        $output .= "<input type=\"HIDDEN\" name=\"module_system_type\" value=\"" . htmlReady($this->cms_type) . "\">\n";
-
-        if ($connected_cms[$this->cms_type]->content_module[$current_module]->isConnected()) {
-            $output .= "&nbsp;" . Button::create(_('Entfernen'), 'remove');
-        } elseif ($connected_cms[$this->cms_type]->content_module[$current_module]->isAllowed(OPERATION_WRITE)) {
-            $output .= "<div align=\"left\">";
-            if ($connected_cms[$this->cms_type]->content_module[$current_module]->isAllowed(OPERATION_COPY) AND (! in_array($connected_cms[$this->cms_type]->content_module[$current_module]->module_type, ["lm", "htlm", "sahs", "cat", "crs", "dbk"]))) {
-                $output .= "<input type=\"CHECKBOX\" name=\"copy_object\" value=\"1\">";
-                $output .= _("Als Kopie anlegen") . "&nbsp;";
-                $output .= Icon::create('info-circle', 'inactive', ['title' => _('Wenn Sie diese Option wählen, wird eine identische Kopie als eigenständige Instanz des Lernmoduls erstellt. Anderenfalls wird ein Link zum Lernmodul gesetzt.')])->asImg();
-                $output .= "<br>";
-            }
-            $output .= "<input type=\"RADIO\" name=\"write_permission\" value=\"none\" checked>";
-            $output .= _("Keine Schreibrechte") . "&nbsp;";
-            $output .= Icon::create('info-circle', 'inactive', ['title' => _('Nur der/die BesitzerIn des Lernmoduls hat Schreibzugriff für Inhalte und Struktur des Lernmoduls. Tutor/-innen und Lehrende können die Verknüpfung zur Veranstaltung wieder löschen.')])->asImg();
-            $output .= "<br>";
-            $output .= "<input type=\"RADIO\" name=\"write_permission\" value=\"dozent\">";
-            $output .= _("Mit Schreibrechten für alle Lehrenden dieser Veranstaltung") . "&nbsp;";
-            $output .= Icon::create('info-circle', 'inactive', ['title' => _('Lehrende haben Schreibzugriff für Inhalte und Struktur des Lernmoduls. Tutor/-innen und Lehrende können die Verknüpfung zur Veranstaltung wieder löschen.')])->asImg();
-            $output .= "<br>";
-            $output .= "<input type=\"RADIO\" name=\"write_permission\" value=\"tutor\">";
-            $output .= _("Mit Schreibrechten für alle Lehrenden und Tutor/-innen dieser Veranstaltung") . "&nbsp;";
-            $output .= Icon::create('info-circle', 'inactive', ['title' => _('Lehrende und Tutor/-innen haben Schreibzugriff für Inhalte und Struktur des Lernmoduls. Tutor/-innen und Lehrende können die Verknüpfung zur Veranstaltung wieder löschen.')])->asImg();
-            $output .= "<br>";
-            $output .= "<input type=\"RADIO\" name=\"write_permission\" value=\"autor\">";
-            $output .= _("Mit Schreibrechten für alle Personen dieser Veranstaltung") . "&nbsp;";
-            $output .= Icon::create('info-circle', 'inactive', ['title' => _('Lehrende, Tutor/-innen und Teilnehmende haben Schreibzugriff für Inhalte und Struktur des Lernmoduls. Tutor/-innen und Lehrende können die Verknüpfung zur Veranstaltung wieder löschen.')])->asImg();
-            $output .= "</div>";
-            $output .= "</div><br>" . Button::create(_('Hinzufügen'), 'add') . "<br>";
-        } else {
-            $output .= "&nbsp;" . Button::create(_('Hinzufügen'), 'add');
-        }
-        $output .= "</form>";
-
-        return $output;
-    }
-}
diff --git a/lib/elearning/Ilias4ConnectedPermissions.php b/lib/elearning/Ilias4ConnectedPermissions.php
deleted file mode 100644
index af70ba75d7f..00000000000
--- a/lib/elearning/Ilias4ConnectedPermissions.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-DEFINE ("OPERATION_COPY", "copy");
-
-/**
- * class to handle ILIAS 4 access controls
- *
- * This class contains methods to handle permissions on connected objects.
- *
- * @author    Arne Schröder <schroeder@data-quest.de>
- * @access    public
- * @modulegroup    elearning_interface_modules
- * @module        Ilias4ConnectedPermission
- * @package    ELearning-Interface
- */
-class Ilias4ConnectedPermissions extends Ilias3ConnectedPermissions
-{
-    var $operations;
-    var $allowed_operations;
-    var $tree_allowed_operations;
-
-    var $USER_OPERATIONS;
-    var $AUTHOR_OPERATIONS;
-    /**
-     * constructor
-     *
-     * init class.
-     * @access
-     * @param string $cms system-type
-     */
-    function __construct($cms)
-    {
-        parent::__construct($cms);
-    }
-
-    /**
-     * check user permissions
-     *
-     * checks user permissions for connected course and changes setting if necessary
-     * @access public
-     * @param string $course_id course-id
-     * @return boolean returns false on error
-     */
-    function checkUserPermissions($course_id = "")
-    {
-        global $connected_cms, $messages;
-
-        if ($course_id == "") return false;
-        if ($connected_cms[$this->cms_type]->user->getId() == "") return false;
-
-        // get course role folder and local roles
-        $local_roles = $connected_cms[$this->cms_type]->soap_client->getLocalRoles($course_id);
-        $active_role = "";
-        $proper_role = "";
-        $user_crs_role = $connected_cms[$this->cms_type]->crs_roles[$GLOBALS["perm"]->get_studip_perm(Context::getId())];
-        if (is_array($local_roles)) {
-            foreach ($local_roles as $key => $role_data) {
-                // check only if local role is il_crs_member, -tutor or -admin
-                if (! (mb_strpos($role_data["title"], "_crs_") === false)) {
-                    if ( in_array( $role_data["obj_id"], $connected_cms[$this->cms_type]->user->getRoles() ) ) {
-                        $active_role = $role_data["obj_id"];
-                    }
-                    if ( mb_strpos( $role_data["title"], $user_crs_role) > 0 ) {
-                        $proper_role = $role_data["obj_id"];
-                    }
-                }
-            }
-        }
-
-        // is user already course-member? otherwise add member with proper role
-        $is_member = $connected_cms[$this->cms_type]->soap_client->isMember( $connected_cms[$this->cms_type]->user->getId(), $course_id);
-        if (!$is_member) {
-            $member_data["usr_id"] = $connected_cms[$this->cms_type]->user->getId();
-            $member_data["ref_id"] = $course_id;
-            $member_data["status"] = CRS_NO_NOTIFICATION;
-            $type = "";
-            switch ($user_crs_role)
-            {
-                case "admin":
-                    $member_data["role"] = CRS_ADMIN_ROLE;
-                    $type = "Admin";
-                    break;
-                case "tutor":
-                    $member_data["role"] = CRS_TUTOR_ROLE;
-                    $type = "Tutor";
-                    break;
-                case "member":
-                    $member_data["role"] = CRS_MEMBER_ROLE;
-                    $type = "Member";
-                    break;
-                default:
-            }
-            $member_data["passed"] = CRS_PASSED_VALUE;
-            if ($type != "") {
-                $connected_cms[$this->cms_type]->soap_client->addMember( $connected_cms[$this->cms_type]->user->getId(), $type, $course_id );
-                if ($GLOBALS["debug"] == true) echo "addMember";
-            }
-        }
-
-        // check if user has proper local role
-        // if not, change it
-        if ($active_role != $proper_role) {
-            if ($active_role != "") {
-                $connected_cms[$this->cms_type]->soap_client->deleteUserRoleEntry( $connected_cms[$this->cms_type]->user->getId(), $active_role);
-                if ($GLOBALS["debug"] == true) echo "Role $active_role deleted.";
-            }
-
-            if ($proper_role != "") {
-                $connected_cms[$this->cms_type]->soap_client->addUserRoleEntry( $connected_cms[$this->cms_type]->user->getId(), $proper_role);
-                if ($GLOBALS["debug"] == true) echo "Role $proper_role added.";
-            }
-
-        }
-
-        if (! $this->getContentModulePerms( $course_id )) {
-            $messages["info"] .= _("Für den zugeordneten ILIAS-Kurs konnten keine Berechtigungen ermittelt werden.") . "<br>";
-        }
-
-        return true;
-    }
-}
-?>
diff --git a/lib/elearning/Ilias4ConnectedUser.php b/lib/elearning/Ilias4ConnectedUser.php
deleted file mode 100644
index be8b88c43f5..00000000000
--- a/lib/elearning/Ilias4ConnectedUser.php
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/**
- * class to handle ILIAS 4 user-accounts
- *
- * This class contains methods to handle connected ILIAS 4 user-accounts.
- *
- * @author    Arne Schröder <schroeder@data-quest.de>
- * @access    public
- * @modulegroup    elearning_interface_modules
- * @module        Ilias4ConnectedUser
- * @package    ELearning-Interface
- */
-class Ilias4ConnectedUser extends Ilias3ConnectedUser
-{
-    var $roles;
-    var $user_sid;
-    var $auth_plugin;
-
-    /**
-     * constructor
-     *
-     * init class.
-     * @access
-     * @param string $cms system-type
-     */
-    function __construct($cms, $user_id = false)
-    {
-        // get auth_plugin
-        $user_id = $user_id ? $user_id : $GLOBALS['user']->id;
-        $this->auth_plugin = DBManager::get()->query("SELECT IFNULL(auth_plugin, 'standard') FROM auth_user_md5 WHERE user_id = '" . $user_id . "'")->fetchColumn();
-        parent::__construct($cms, $user_id);
-    }
-
-    /**
-     * new user
-     *
-     * save new user
-     * @access public
-     * @return boolean returns false on error
-     */
-    function newUser($ignore_encrypt_passwords = false)
-    {
-        global $connected_cms, $auth, $messages;
-
-        if ($this->getLoginData($this->login)) {
-            //automatische Zuordnung von bestehenden Ilias Accounts
-            //nur wenn ldap Modus benutzt wird und Stud.IP Nutzer passendes ldap plugin hat
-            if (
-                $connected_cms[$this->cms_type]->USER_AUTO_CREATE
-                && !$connected_cms[$this->cms_type]->USER_PREFIX
-                && $this->auth_plugin
-                && $this->auth_plugin !== 'standard'
-                && $this->auth_plugin === $connected_cms[$this->cms_type]->ldap_enable
-            ) {
-                if (!$this->external_password) {
-                    $this->setPassword(md5(uniqid("4dfmjsnll")));
-                }
-                $ok = $connected_cms[$this->cms_type]->soap_client->updatePassword($this->id, $this->external_password);
-                $this->setConnection($this->getUserType(), true);
-                if ($ok) {
-                    $messages["info"] .= sprintf(_("Verbindung mit Nutzer ID %s wiederhergestellt."), $this->id);
-                }
-                return true;
-            }
-            $messages["error"] .= sprintf(_("Es existiert bereits ein Account mit dem Benutzernamen \"%s\" (Account ID %s)."), $this->login, $this->id) . "<br>\n";
-            return false;
-        }
-
-        // data for user-account in ILIAS 4
-        $user_data["login"] = $this->login;
-        $user_data["passwd"] = $this->external_password;
-        $user_data["firstname"] = $this->firstname;
-        $user_data["lastname"] = $this->lastname;
-        $user_data["title"] = $this->title;
-        $user_data["gender"] = $this->gender;
-        $user_data["email"] = $this->email;
-        $user_data["street"] = $this->street;
-        $user_data["phone_home"] = $this->phone_home;
-        $user_data["time_limit_unlimited"] = 1;
-        $user_data["active"] = 1;
-        $user_data["approve_date"] = date('Y-m-d H:i:s');
-        $user_data["accepted_agreement"] = true;
-        // new values for ILIAS 4
-        $user_data["agree_date"] = date('Y-m-d H:i:s');
-        $user_data["external_account"] = $this->login;
-        if ($this->auth_plugin && $this->auth_plugin != "standard" &&  ($this->auth_plugin  == $connected_cms[$this->cms_type]->ldap_enable)) {
-            $user_data["auth_mode"] = "ldap";
-        } else {
-            $user_data["auth_mode"] = "default";
-        }
-        if ($connected_cms[$this->cms_type]->user_style != "") {
-            $user_data["user_style"] = $connected_cms[$this->cms_type]->user_style;
-        }
-        if ($connected_cms[$this->cms_type]->user_skin != "") {
-            $user_data["user_skin"] = $connected_cms[$this->cms_type]->user_skin;
-        }
-
-        $role_id = $connected_cms[$this->cms_type]->roles[$auth->auth["perm"]];
-
-        $user_id = $connected_cms[$this->cms_type]->soap_client->addUser($user_data, $role_id);
-
-        if ($user_id != false) {
-            $this->id = $user_id;
-
-            //            $connected_cms[$this->cms_type]->soap_client->updatePassword($user_id, $user_data["passwd"]);
-
-            //            $this->newUserCategory();
-
-            $this->setConnection(USER_TYPE_CREATED);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * create new user category
-     *
-     * create new user category
-     * @access public
-     * @return boolean returns false on error
-     */
-    function newUserCategory()
-    {
-        global $connected_cms, $messages;
-
-        $connected_cms[$this->cms_type]->soap_client->setCachingStatus(false);
-
-        // data for user-category in ILIAS 4
-        $object_data["title"] = sprintf(_("Eigene Daten von %s (%s)."), $this->getName(), $this->getId());
-        $object_data["description"] = sprintf(_("Hier befinden sich die persönlichen Lernmodule des Benutzers %s."), $this->getName());
-        $object_data["type"] = "cat";
-        $object_data["owner"] = $this->getId();
-
-        $cat = $connected_cms[$this->cms_type]->soap_client->getReferenceByTitle($object_data["title"]);
-        if ($cat != false && $connected_cms[$this->cms_type]->soap_client->checkReferenceById($cat) ) {
-            $messages["info"] .= sprintf(_("Ihre persönliche Kategorie wurde bereits angelegt."), $this->login) . "<br>\n";
-            $this->category = $cat;
-        } else {
-            $this->category = $connected_cms[$this->cms_type]->soap_client->addObject($object_data, $connected_cms[$this->cms_type]->user_category_node_id);
-        }
-        if ($this->category != false) {
-            parent::setConnection($this->getUserType(), true);
-        } else {
-            echo "CATEGORY_ERROR".$connected_cms[$this->cms_type]->user_category_node_id ."-";
-            return false;
-        }
-        // data for personal user-role in ILIAS 4
-        $role_data["title"] = "studip_usr" . $this->getId() . "_cat" . $this->category;
-        $role_data["description"] = sprintf(_("User-Rolle von %s. Diese Rolle wurde von Stud.IP generiert."), $this->getName());
-        $role_id = $connected_cms[$this->cms_type]->soap_client->getObjectByTitle($role_data["title"], "role");
-        if ($role_id != false) {
-            $messages["info"] .= sprintf(_("Ihre persönliche Userrolle wurde bereits angelegt."), $this->login) . "<br>\n";
-        } else {
-            $role_id = $connected_cms[$this->cms_type]->soap_client->addRoleFromTemplate($role_data, $this->category, $connected_cms[$this->cms_type]->user_role_template_id);
-        }
-        $connected_cms[$this->cms_type]->soap_client->addUserRoleEntry($this->getId(), $role_id);
-        // delete permissions for all global roles for this category
-        foreach ($connected_cms[$this->cms_type]->global_roles as $key => $role) {
-            $connected_cms[$this->cms_type]->soap_client->revokePermissions($role, $this->category);
-        }
-        return true;
-    }
-}
diff --git a/lib/elearning/Ilias4ContentModule.php b/lib/elearning/Ilias4ContentModule.php
deleted file mode 100644
index f8552c3f395..00000000000
--- a/lib/elearning/Ilias4ContentModule.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/**
- * class to handle ILIAS 4 learning modules and tests
- *
- * This class contains methods to handle ILIAS 4 learning modules and tests.
- *
- * @author    Arne Schröder <schroeder@data-quest.de>
- * @access    public
- * @modulegroup    elearning_interface_modules
- * @module        Ilias4ContentModule
- * @package    ELearning-Interface
- */
-class Ilias4ContentModule extends Ilias3ContentModule
-{
-    var $object_id;
-
-    /**
-     * constructor
-     *
-     * init class.
-     * @access public
-     * @param string $module_id module-id
-     * @param string $module_type module-type
-     * @param string $cms_type system-type
-     */
-    function __construct($module_id, $module_type, $cms_type)
-    {
-        parent::__construct($module_id, $module_type, $cms_type);
-    }
-
-    /**
-     * set connection
-     *
-     * sets connection with seminar
-     * @access public
-     * @param string $seminar_id seminar-id
-     * @return boolean successful
-     */
-    function setConnection($seminar_id)
-    {
-        global $connected_cms, $messages;
-
-        $write_permission = Request::option("write_permission");
-
-        $crs_id = ObjectConnections::getConnectionModuleId($seminar_id, "crs", $this->cms_type);
-        $connected_cms[$this->cms_type]->soap_client->setCachingStatus(false);
-        $connected_cms[$this->cms_type]->soap_client->clearCache();
-
-        // Check, ob Kurs in ILIAS gelöscht wurde
-        if (($crs_id != false) AND ($connected_cms[$this->cms_type]->soap_client->getObjectByReference($crs_id) == false)) {
-            ObjectConnections::unsetConnection($seminar_id, $crs_id, "crs", $this->cms_type);
-            $messages["info"] .= _("Der zugeordnete ILIAS-Kurs (ID $crs_id) existiert nicht mehr. Ein neuer Kurs wird angelegt.") . "<br>";
-            $crs_id = false;
-        }
-
-        $crs_id == $connected_cms[$this->cms_type]->createCourse($seminar_id);
-
-        if ($crs_id == false) return false;
-
-        $ref_id = $this->getId();
-        if (Request::get("copy_object") == "1") {
-            $connected_cms[$this->cms_type]->soap_client->user_type = 'user';
-            $ref_id = $connected_cms[$this->cms_type]->soap_client->copyObject($this->id, $crs_id);
-            $connected_cms[$this->cms_type]->soap_client->user_type = 'admin';
-        } else {
-            $ref_id = $connected_cms[$this->cms_type]->soap_client->addReference($this->id, $crs_id);
-        }
-        if (!$ref_id) {
-            $messages["error"] .= _("Zuordnungs-Fehler: Objekt konnte nicht angelegt werden.");
-            return false;
-        }
-        $local_roles = $connected_cms[$this->cms_type]->soap_client->getLocalRoles($crs_id);
-        $member_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray([OPERATION_VISIBLE, OPERATION_READ]);
-        $admin_operations = $connected_cms[$this->cms_type]->permissions->getOperationArray([OPERATION_VISIBLE, OPERATION_READ, OPERATION_WRITE, OPERATION_DELETE]);
-        $admin_operations_no_delete = $connected_cms[$this->cms_type]->permissions->getOperationArray([OPERATION_VISIBLE, OPERATION_READ, OPERATION_WRITE]);
-        $admin_operations_readonly = $connected_cms[$this->cms_type]->permissions->getOperationArray([OPERATION_VISIBLE, OPERATION_READ, OPERATION_DELETE]);
-        foreach ($local_roles as $key => $role_data) {
-            // check only if local role is il_crs_member, -tutor or -admin
-            if (mb_strpos($role_data["title"], "il_crs_") === 0) {
-                if(mb_strpos($role_data["title"], 'il_crs_member') === 0){
-                    $operations = ($write_permission == "autor") ? $admin_operations_no_delete : $member_operations;
-                } elseif(mb_strpos($role_data["title"], 'il_crs_tutor') === 0){
-                    $operations = (($write_permission == "tutor") || ($write_permission == "autor")) ? $admin_operations : $admin_operations_readonly;
-                } elseif(mb_strpos($role_data["title"], 'il_crs_admin') === 0){
-                    $operations = (($write_permission == "dozent") || ($write_permission == "tutor") || ($write_permission == "autor")) ? $admin_operations : $admin_operations_readonly;
-                } else {
-                    continue;
-                }
-                $connected_cms[$this->cms_type]->soap_client->revokePermissions($role_data["obj_id"], $ref_id);
-                $connected_cms[$this->cms_type]->soap_client->grantPermissions($operations, $role_data["obj_id"], $ref_id);
-            }
-        }
-        if ($ref_id) {
-            $this->setId($ref_id);
-            return ContentModule::setConnection($seminar_id);
-        } else {
-            $messages["error"] .= _("Die Zuordnung konnte nicht gespeichert werden.");
-        }
-        return false;
-    }
-}
diff --git a/lib/elearning/Ilias4Soap.php b/lib/elearning/Ilias4Soap.php
deleted file mode 100644
index 27c28fb0f53..00000000000
--- a/lib/elearning/Ilias4Soap.php
+++ /dev/null
@@ -1,181 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/**
- * class to use ILIAS-4-Webservices
- *
- * This class contains methods to connect to the ILIAS-4-Soap-Server.
- *
- * @author    Arne Schröder <schroeder@data-quest.de>
- * @access    public
- * @modulegroup    elearning_interface_modules
- * @module        Ilias4Soap
- * @package    ELearning-Interface
- */
-class Ilias4Soap extends Ilias3Soap
-{
-    var $cms_type;
-    var $admin_sid;
-    var $user_sid;
-    var $user_type;
-    var $soap_cache;
-    var $separator_string;
-
-    /**
-     * constructor
-     *
-     * init class.
-     * @access
-     * @param string $cms system-type
-     */
-    function __construct($cms)
-    {
-        parent::__construct($cms);
-        $this->separator_string = " / ";
-    }
-
-    /**
-     * add user by importUsers
-     *
-     * adds new user and sets role-id
-     * @access public
-     * @param array user_data user-data
-     * @param string role_id global role-id for new user
-     * @return string user-id
-     */
-    function addUser($user_data, $role_id)
-    {
-        foreach($user_data as $key => $value) {
-            $user_data[$key] = htmlReady($user_data[$key]);
-        }
-
-        $usr_xml = "<Users>
-<User>
-<UDFDefinitions></UDFDefinitions>
-<Login>".$user_data["login"]."</Login>
-<Password Type=\"PLAIN\">".$user_data["passwd"]."</Password>
-<Firstname>".$user_data["firstname"]."</Firstname>
-<Lastname>".$user_data["lastname"]."</Lastname>
-<Title>".$user_data["title"]."</Title>
-<Gender>".$user_data["gender"]."</Gender>
-<Email>".$user_data["email"]."</Email>
-<Street>".$user_data["street"]."</Street>
-<PhoneHome>".$user_data["phone_home"]."</PhoneHome>
-<Role Id=\"".$role_id."\" Type=\"Global\"/>
-<Active>true</Active>
-<TimeLimitUnlimited>".$user_data["time_limit_unlimited"]."</TimeLimitUnlimited>
-<TimeLimitMessage>0</TimeLimitMessage>
-<ApproveDate>".$user_data["approve_date"]."</ApproveDate>
-<AgreeDate>".$user_data["agree_date"]."</AgreeDate>";
-        if (($user_data["user_skin"] != "") OR ($user_data["user_style"] != "")) {
-            $usr_xml .= "<Look Skin=\"".$user_data["user_skin"]."\" Style=\"".$user_data["user_style"]."\"/>";
-        }
-        $usr_xml .= "<AuthMode type=\"".$user_data["auth_mode"]."\"/>
-<ExternalAccount>".$user_data["external_account"]."</ExternalAccount>
-</User>
-</Users>";
-
-        $param = [
-            'sid' => $this->getSID(),
-            'folder_id' => -1,
-            'usr_xml' => $usr_xml,
-            'conflict_role' => 1,
-            'send_account_mail' => 0
-        ];
-        $result = $this->call('importUsers', $param);
-
-        $s = simplexml_load_string($result);
-
-        if ((string)$s->rows->row->column[3] == "successful")
-        return (string)$s->rows->row->column[0];
-        else
-        return false;
-    }
-
-    /**
-     * copy object
-     *
-     * copy ilias-object
-     * @access public
-     * @param string source_id reference-id
-     * @param string target_id reference-id
-     * @return string result
-     */
-    function copyObject($source_id, $target_id)
-    {
-        $xml = "<Settings source_id=\"$source_id\" target_id=\"$target_id\" default_action=\"COPY\"/>";
-
-        $param = [
-            'sid' => $this->getSID(),
-            'xml' => $xml
-        ];
-        return $this->call('copyObject', $param);
-    }
-
-    /**
-     * get path
-     *
-     * returns repository-path to ilias-object
-     * @access public
-     * @param string source_id reference-id
-     * @param string target_id reference-id
-     * @return string result
-     */
-    function getPath($ref_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'ref_id' => $ref_id
-        ];
-        $result = $this->call('getPathForRefId', $param);
-
-        if ($result) {
-            $s = simplexml_load_string($result);
-
-            foreach ($s->rows->row as $row) {
-                $path[] = (string)$row->column[2];
-            }
-        }
-
-        if (is_array($path)) {
-            return implode($this->separator_string, $path);
-        } else {
-            return false;
-        }
-    }
-
-     /**
-     *
-     * returns repository-path to ilias-object
-     *
-     * @access public
-     * @param string source_id reference-id
-     * @param string target_id reference-id
-     * @return string result
-     */
-    function getRawPath($ref_id)
-    {
-        $param = [
-            'sid' => $this->getSID(),
-            'ref_id' => $ref_id
-        ];
-        $result = $this->call('getPathForRefId', $param);
-
-        if ($result) {
-            $s = simplexml_load_string($result);
-
-            foreach ($s->rows->row as $row) {
-                $path[] = (string)$row->column[0];
-            }
-        }
-
-        if (is_array($path)) {
-            return implode('_', $path);
-        } else {
-            return false;
-        }
-    }
-}
diff --git a/lib/elearning/Ilias5ConnectedCMS.php b/lib/elearning/Ilias5ConnectedCMS.php
deleted file mode 100644
index 011d046da46..00000000000
--- a/lib/elearning/Ilias5ConnectedCMS.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/**
- * main-class for connection to ILIAS 5.2
- *
- * This class contains the main methods of the elearning-interface to connect to ILIAS 5. Extends Ilias3ConnectedCMS.
- *
- * @author   Arne Schröder <schroeder@data-quest.de>
- * @access   public
- * @modulegroup  elearning_interface_modules
- * @module       Ilias5ConnectedCMS
- * @package  ELearning-Interface
- */
-class Ilias5ConnectedCMS extends Ilias4ConnectedCMS
-{
-
-}
diff --git a/lib/elearning/Ilias5ConnectedLink.php b/lib/elearning/Ilias5ConnectedLink.php
deleted file mode 100644
index 0ce4a0fad2f..00000000000
--- a/lib/elearning/Ilias5ConnectedLink.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-/**
- * class to generate links to ILIAS 5.2
- *
- * This class contains methods to generate links to ILIAS 5.
- *
- * @author    Arne Schröder <schroeder@data-quest.de>
- * @access    public
- * @modulegroup    elearning_interface_modules
- * @module        Ilias5ConnectedLink
- * @package    ELearning-Interface
- */
-class Ilias5ConnectedLink extends Ilias4ConnectedLink
-{
-}
-?>
\ No newline at end of file
diff --git a/lib/elearning/Ilias5ConnectedPermissions.php b/lib/elearning/Ilias5ConnectedPermissions.php
deleted file mode 100644
index 17d6f0d9513..00000000000
--- a/lib/elearning/Ilias5ConnectedPermissions.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-/**
- * class to handle ILIAS 5.2 access controls
- *
- * This class contains methods to handle permissions on connected objects.
- *
- * @author    Arne Schröder <schroeder@data-quest.de>
- * @access    public
- * @modulegroup    elearning_interface_modules
- * @module        Ilias4ConnectedPermission
- * @package    ELearning-Interface
- */
-class Ilias5ConnectedPermissions extends Ilias4ConnectedPermissions
-{
-
-}
-?>
\ No newline at end of file
diff --git a/lib/elearning/Ilias5ConnectedUser.php b/lib/elearning/Ilias5ConnectedUser.php
deleted file mode 100644
index 61729768446..00000000000
--- a/lib/elearning/Ilias5ConnectedUser.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * class to handle ILIAS 5.2 user-accounts
- *
- * This class contains methods to handle connected ILIAS 5 user-accounts.
- *
- * @author    Arne Schröder <schroeder@data-quest.de>
- * @access    public
- * @modulegroup    elearning_interface_modules
- * @module        Ilias5ConnectedUser
- * @package    ELearning-Interface
- */
-class Ilias5ConnectedUser extends Ilias4ConnectedUser
-{
-
-    /**
-    * verify login data
-    *
-    * returns true, if login-data is valid
-    * @access public
-    * @param string $username username
-    * @param string $password password
-    * @return boolean login-validation
-    */
-    function verifyLogin($username, $password)
-    {
-        global $connected_cms, $messages;
-        $result = $connected_cms[$this->cms_type]->soap_client->checkPassword($username, $password);
-        if (strpos($result, '::') > 0) {
-            return $this->getLoginData($username);
-        }
-        return false;
-    }
-
-    function setConnection($user_type, $ignore_encrypted_passwords = false)
-    {
-        $this->external_password = '';
-        parent::setConnection($user_type, true);
-    }
-}
\ No newline at end of file
diff --git a/lib/elearning/Ilias5ContentModule.php b/lib/elearning/Ilias5ContentModule.php
deleted file mode 100644
index 3f50c025d9f..00000000000
--- a/lib/elearning/Ilias5ContentModule.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-/**
- * class to handle ILIAS 5.2 learning modules and tests
- *
- * This class contains methods to handle ILIAS 5 learning modules and tests.
- *
- * @author    Arne Schröder <schroeder@data-quest.de>
- * @access    public
- * @modulegroup    elearning_interface_modules
- * @module        Ilias5ContentModule
- * @package    ELearning-Interface
- */
-class Ilias5ContentModule extends Ilias4ContentModule
-{
-
-}
\ No newline at end of file
diff --git a/lib/elearning/Ilias5Soap.php b/lib/elearning/Ilias5Soap.php
deleted file mode 100644
index cf8bd4c4e5b..00000000000
--- a/lib/elearning/Ilias5Soap.php
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-/**
- * class to use ILIAS-5-Webservices
- *
- * This class contains methods to connect to the ILIAS-5-Soap-Server.
- *
- * @author    Arne Schröder <schroeder@data-quest.de>
- * @access    public
- * @modulegroup    elearning_interface_modules
- * @module        Ilias5Soap
- * @package    ELearning-Interface
- */
-class Ilias5Soap extends Ilias4Soap
-{
-    var $cms_type;
-    var $admin_sid;
-    var $user_sid;
-    var $user_type;
-    var $soap_cache;
-    var $separator_string;
-
-    /**
-     * call soap-function
-     *
-     * calls soap-function with given parameters
-     * @access public
-     * @param string method method-name
-     * @param string params parameters
-     * @return mixed result
-     */
-    function call($method, $params)
-    {
-        $index = md5($method . ":" . implode('-', $params));
-        // return false if no session_id is given
-        if (($method != "login") AND ($params["sid"] == ""))
-            return false;
-//      echo $this->caching_active;
-        if (($this->caching_active == true) AND (isset($this->soap_cache[$index])))
-        {
-//          echo $index;
-//          echo " from Cache<br>";
-            $result = $this->soap_cache[$index];
-        }
-        else
-        {
-            $result = $this->_call($method, $params);
-            // if Session is expired, re-login and try again
-            if (($method != "login") AND $this->soap_client->fault AND in_array(mb_strtolower($this->faultstring), ["session not valid","session invalid", "session idled"]) )
-            {
-                $caching_status = $this->caching_active;
-                $this->caching_active = false;
-                $user_type = $this->user_type;
-                $this->user_type = 'admin';
-                $params["sid"] = $this->login();
-                $result = $this->_call($method, $params);
-                $this->caching_active = $caching_status;
-                $this->user_type = $user_type;
-            }
-            elseif (! $this->soap_client->fault)
-                $this->soap_cache[$index] = $result;
-        }
-        return $result;
-    }
-
-    /**
-    * login
-    *
-    * login to soap-webservice
-    * @access public
-    * @return string result
-    */
-    function login()
-    {
-        global $ELEARNING_INTERFACE_MODULES, $connected_cms;
-        if ($this->user_type == "admin") {
-            $param = [
-                'client' => $ELEARNING_INTERFACE_MODULES[$this->cms_type]["soap_data"]["client"],
-                'username' => $ELEARNING_INTERFACE_MODULES[$this->cms_type]["soap_data"]["username"],
-                'password' => $ELEARNING_INTERFACE_MODULES[$this->cms_type]["soap_data"]["password"]
-                ];
-            $result = $this->call('login', $param);
-        } elseif ($this->user_type == "user") {
-            $param = [
-                'sid' => $this->admin_sid,
-                'user_id' => $connected_cms[$this->cms_type]->user->getId()
-                ];
-            $result = $this->call('loginStudipUser', $param);
-        }
-        if ($this->user_type == "admin")
-            $this->admin_sid = $result;
-        if ($this->user_type == "user")
-            $this->user_sid = $result;
-        return $result;
-    }
-
-    /**
-    * Check Auth
-    *
-    * login to soap-webservice
-    * @access public
-    * @return string result
-    */
-    function checkPassword($username, $password)
-    {
-        global $ELEARNING_INTERFACE_MODULES, $connected_cms;
-        $param = [
-            'client' => $ELEARNING_INTERFACE_MODULES[$this->cms_type]["soap_data"]["client"],
-            'username' => $username,
-            'password' => $password
-        ];
-        $result = $this->call('login', $param);
-        return $result;
-    }
-}
diff --git a/lib/elearning/LonCapaConnectedCMS.php b/lib/elearning/LonCapaConnectedCMS.php
deleted file mode 100644
index 2f86aa8cdbb..00000000000
--- a/lib/elearning/LonCapaConnectedCMS.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * main-class for connection to LonCapa
- *
- * This class contains the main methods of the elearning-interface to connect to
- * LonCapa. Extends ConnectedCMS.
- *
- * @access   public
- * @modulegroup  elearning_interface_modules
- * @module       LonCapaConnectedCMS
- * @package  ELearning-Interface
- */
-class LonCapaConnectedCMS extends ConnectedCMS
-{
-    public $user;
-    protected $seminarId;
-    protected $lcRequest;
-    protected $cmsUrl;
-
-    public function __construct($cms = '')
-    {
-        parent::__construct($cms);
-
-        $this->seminarId = Context::getId();
-        $this->user = User::findCurrent();
-        $this->lcRequest = new LonCapaRequest();
-        $this->cmsUrl = $this->ABSOLUTE_PATH_ELEARNINGMODULES;
-    }
-
-
-    /**
-     * search for content modules
-     *
-     * returns found content modules
-     * @throws AccessDeniedException
-     * @param string $key keyword
-     * @return array list of content modules
-     */
-    public function searchContentModules($key)
-    {
-
-        if (!$GLOBALS['perm']->have_studip_perm('tutor', $this->seminarId)) {
-            throw new AccessDeniedException();
-        }
-
-        $url = $this->cmsUrl . '/courses?search=' . urlencode($key) . '&owner=' . urlencode($this->user->username);
-        $response = $this->lcRequest->request($url);
-
-        if ($response) {
-            $courses = new SimpleXMLElement($response);
-
-            $result = [];
-            foreach ($courses->course as $course) {
-                $temp = explode(':', (string)$course->owner);
-
-                $result[] = [
-                    'ref_id'  => (string)$course->id,
-                    'title'   => (string)$course->description,
-                    'authors' => $temp[0],
-                    'type'    => $this->cms_type
-                ];
-            }
-        }
-
-        return $result;
-    }
-}
diff --git a/lib/elearning/LonCapaConnectedLink.php b/lib/elearning/LonCapaConnectedLink.php
deleted file mode 100644
index c00958b68a6..00000000000
--- a/lib/elearning/LonCapaConnectedLink.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- *
- * This class contains methods to generate links to LonCapa
- *
- * @modulegroup  elearning_interface_modules
- * @module       LonCapaConnectedLink
- * @package  ELearning-Interface
- */
-class LonCapaConnectedLink extends ConnectedLink
-{
-    /**
-     * get user module links
-     *
-     * returns content module links for user
-     * @return string html-code
-     */
-    public function getUserModuleLinks()
-    {
-        global $connected_cms, $current_module;
-
-        $url = URLHelper::getURL('dispatch.php/loncapa/enter', ['cms_type' => $this->cms_type, 'module' => $current_module]);
-
-        return Studip\LinkButton::create(_('Starten'), $url, [
-            'target' => '_blank',
-            'rel'    => 'noopener noreferrer',
-        ]);
-    }
-
-    /**
-     * get admin module links
-     *
-     * returns links add or remove a module from course
-     * @return string returns html-code
-     */
-    public function getAdminModuleLinks()
-    {
-        global $connected_cms, $view, $search_key, $cms_select, $current_module;
-        global $template_factory;
-
-        $template = $template_factory->open('elearning/loncapa_connected_link_edit');
-        $template->current_module = $connected_cms[$this->cms_type]->content_module[$current_module]->getId();
-        $template->connected = $connected_cms[$this->cms_type]->content_module[$current_module]->isConnected();
-        $template->cms_type = $this->cms_type;
-        $template->search_key = $search_key;
-        return $template->render(compact('view', 'search_key', 'cms_select', 'current_module'));
-    }
-
-    /**
-     * returns url for connected LonCapa course
-     *
-     * @param string $module_id LonCapa ID
-     * @param string $course_id Stud.IP course ID
-     * @return string url for LonCapa
-     */
-    public function getRedirectUrl($module_id, $course_id)
-    {
-        return sprintf(
-            '%s/enter/%s?token=%s&courseid=%s&systemid=%s',
-            $this->cms_link,
-            $module_id,
-            Token::create(60),
-            $course_id,
-            $this->cms_type
-        );
-    }
-}
diff --git a/lib/elearning/LonCapaContentModule.php b/lib/elearning/LonCapaContentModule.php
deleted file mode 100644
index 0f16cd09acf..00000000000
--- a/lib/elearning/LonCapaContentModule.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-/**
- *
- * This class contains methods to handle LonCapa learning modules
- *
- * @modulegroup  elearning_interface_modules
- * @module       LonCapaContentModule
- * @package  ELearning-Interface
- */
-
-class LonCapaContentModule extends ContentModule
-{
-    /**
-     * @var LonCapaRequest
-     */
-    public $lcRequest;
-    /**
-     * @var string
-     */
-    public $cmsUrl;
-
-    /**
-     * LonCapaContentModule constructor.
-     * @param string $module_id
-     * @param string $module_type
-     * @param string $cms_type
-     */
-    public function __construct($module_id, $module_type, $cms_type)
-    {
-        $this->lcRequest = new LonCapaRequest();
-        $this->cmsUrl = $GLOBALS['ELEARNING_INTERFACE_MODULES'][$cms_type]['ABSOLUTE_PATH_ELEARNINGMODULES'];
-
-        parent::__construct($module_id, $module_type, $cms_type);
-    }
-
-    /**
-     *fetch data from LonCapa
-     *
-     */
-    public function readData()
-    {
-        $url = $this->cmsUrl . '/course/' . urlencode($this->id);
-        $response = $this->lcRequest->request($url);
-
-        if ($response) {
-            $courses = new SimpleXMLElement($response);
-            $course = $courses->course[0];
-
-            list($author, $dummy) = explode(':', (string)$course->owner);
-
-            $this->id = (string)$course->id;
-            $this->title = (string)$course->description;
-            $this->authors = $author;
-        }
-
-    }
-
-    /**
-     * get permission-status
-     *
-     *
-     * @param string $operation operation
-     * @return boolean allowed
-     */
-    public function isAllowed($operation)
-    {
-        return true;
-    }
-
-    /**
-     * store connection between Stud.IP course and LonCapa course
-     *
-     * @param string $seminar_id
-     * @return bool
-     */
-    public function setConnection($seminar_id)
-    {
-        $this->is_connected = true;
-        return ObjectConnections::setConnection(
-            $seminar_id,
-            $this->id,
-            $this->module_type,
-            $this->cms_type
-        );
-    }
-}
diff --git a/lib/elearning/LonCapaRequest.php b/lib/elearning/LonCapaRequest.php
deleted file mode 100644
index ecf307556eb..00000000000
--- a/lib/elearning/LonCapaRequest.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-/**
- *
- * This class is used to communicate with LonCapa
- *
- * @depends curl
- * @modulegroup  elearning_interface_modules
- * @module       LonCapaContentModule
- * @package  ELearning-Interface
- */
-class LonCapaRequest
-{
-    /**
-     * options for curl
-     * @var array
-     */
-    protected $options;
-    /**
-     * curl resource
-     * @var resource
-     */
-    protected $ch;
-
-    /**
-     * LonCapaRequest constructor.
-     */
-    public function __construct()
-    {
-        $this->ch = curl_init();
-        $this->initOptions();
-    }
-
-    /**
-     * initializes curl options
-     */
-    public function initOptions()
-    {
-        $this->options = [
-            CURLOPT_RETURNTRANSFER => true,
-            CURLOPT_FOLLOWLOCATION => true,
-            //CURLOPT_CAINFO => '',
-            CURLOPT_SSL_VERIFYPEER => false,
-            CURLOPT_SSL_VERIFYHOST => false
-        ];
-    }
-
-    /**
-     * close connection
-     */
-    public function __destruct()
-    {
-        curl_close($this->ch);
-    }
-
-    /**
-     * set curl options
-     * @param $key
-     * @param $value
-     */
-    public function setOption($key, $value)
-    {
-        $this->options[$key] = $value;
-    }
-
-    /**
-     * do a curl request on the given url and return the result if successfull
-     *
-     * @param $url string
-     * @param array $postfields
-     * @return string
-     */
-    public function request($url, $postfields = null)
-    {
-        $result = $this->sendRequest($url, $postfields);
-        if ($result['statusCode'] == 200) {
-            return $result['response'];
-        } else {
-            // TODO: fehlermeldung wäre schöner
-            return null;
-        }
-    }
-
-    /**
-     * do a curl request on the given url and return the result if successfull
-     * @param $url string
-     * @param array $postfields
-     * @return array
-     */
-    protected function sendRequest($url, $postfields = null)
-    {
-        $options = $this->options;
-        $options[CURLOPT_URL] = $url;
-
-        if ($postfields) {
-            $options[CURLOPT_POST] = true;
-            $options[CURLOPT_POSTFIELDS] = $postfields;
-        }
-
-        curl_setopt_array($this->ch, $options);
-        $response = curl_exec($this->ch);
-
-        $statusCode = curl_getinfo($this->ch, CURLINFO_HTTP_CODE);
-
-        if ($response === false) {
-            $last_error = curl_error($this->ch);
-            Log::error(__CLASS__ . ' curl_exec failed: ' . $last_error);
-        }
-        return compact('statusCode', 'response');
-    }
-}
diff --git a/lib/elearning/ObjectConnections.php b/lib/elearning/ObjectConnections.php
deleted file mode 100644
index e360f71759b..00000000000
--- a/lib/elearning/ObjectConnections.php
+++ /dev/null
@@ -1,254 +0,0 @@
-<?php
-# Lifter002: DONE
-# Lifter003: TEST
-# Lifter007: TODO
-# Lifter010: TODO
-/**
-* class to handle object connections
-*
-* This class contains methods to handle connections between stud.ip-objects and external content.
-*
-* @author   Arne Schröder <schroeder@data-quest.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       ObjectConnections
-* @package  ELearning-Interface
-*/
-class ObjectConnections
-{
-    var $id;
-    var $object_connections;
-    /**
-    * constructor
-    *
-    * init class.
-    * @access public
-    * @param string $object_id object-id
-    */
-    function __construct($object_id = "")
-    {
-        $this->id = $object_id;
-        if ($object_id != "")
-            $this->readData();
-    }
-
-    /**
-    * read object connections
-    *
-    * gets object connections from database
-    * @access public
-    */
-    function readData()
-    {
-        global $ELEARNING_INTERFACE_MODULES;
-
-        $this->object_connections = [];
-
-        $query = "SELECT system_type, module_type, module_id, chdate
-                  FROM object_contentmodules
-                  WHERE object_id = ?
-                  ORDER BY chdate DESC";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([$this->id]);
-
-        $module_count = 0;
-        while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
-            // show only connected modules with valid module-type
-            if ($ELEARNING_INTERFACE_MODULES[$row['system_type']]['types'][$row['module_type']] == '') {
-                continue;
-            }
-            $module_count += 1;
-            $d_system_type = $row['system_type'];
-            $d_module_type = $row['module_type'];
-            $d_module_id   = $row['module_id'];
-
-            $reference = $d_system_type . '_' . $d_module_type . '_' . $d_module_id;
-            $this->object_connections[$reference]['cms']    = $d_system_type;
-            $this->object_connections[$reference]['type']   = $d_module_type;
-            $this->object_connections[$reference]['id']     = $d_module_id;
-            $this->object_connections[$reference]['chdate'] = $row['chdate'];
-        }
-
-        if ($module_count == 0) {
-            $this->object_connections = false;
-        }
-    }
-
-    /**
-    * get object connections
-    *
-    * returns object connections
-    * @access public
-    * @return array object connections
-    */
-    function getConnections()
-    {
-        return $this->object_connections;
-    }
-
-    /**
-    * get connection-status
-    *
-    * returns true, if object has connections
-    * @access public
-    * @return boolean connection-status
-    */
-    function isConnected()
-    {
-        return (boolean) $this->object_connections;
-    }
-
-    /**
-     * get connection-status
-     *
-     * returns true, if object has connections
-     * @access public
-     * @param string $object_id object-id (optional)
-     * @return boolean connection-status
-     */
-    public static function isObjectConnected($object_id)
-    {
-        $query = "SELECT 1 FROM object_contentmodules WHERE object_id = ?";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([$object_id]);
-        return (bool)$statement->fetchColumn();
-    }
-
-    /**
-    * get module-id
-    *
-    * returns module-id of given connection
-    * @access public
-    * @param string $connection_object_id object-id
-    * @param string $connection_module_type module-type
-    * @param string $connection_cms system-type
-    * @return string module-id
-    */
-    public static function getConnectionModuleId($connection_object_id, $connection_module_type, $connection_cms)
-    {
-        $query = "SELECT module_id
-                  FROM object_contentmodules
-                  WHERE object_id = ? AND system_type = ? AND module_type = ?";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([
-            $connection_object_id,
-            $connection_cms,
-            $connection_module_type
-        ]);
-        return $statement->fetchColumn() ?: false;
-    }
-
-    /**
-    * set connection
-    *
-    * sets connection with object
-    * @access public
-    * @param string $connection_object_id object-id
-    * @param string $connection_module_id module-id
-    * @param string $connection_module_type module-type
-    * @param string $connection_cms system-type
-    * @return boolean successful
-    */
-    public static function setConnection($connection_object_id, $connection_module_id, $connection_module_type, $connection_cms)
-    {
-        $query = "SELECT 1
-                  FROM object_contentmodules
-                  WHERE object_id = ? AND module_id = ? AND system_type = ?
-                    AND module_type = ?";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([
-            $connection_object_id,
-            $connection_module_id,
-            $connection_cms,
-            $connection_module_type
-        ]);
-        $check = $statement->fetchColumn();
-
-        if ($check) {
-            $query = "UPDATE object_contentmodules
-                      SET module_type = ?, chdate = UNIX_TIMESTAMP()
-                      WHERE object_id = ? AND module_id = ? AND system_type = ?";
-            $statement = DBManager::get()->prepare($query);
-            $statement->execute([
-                $connection_module_type,
-                $connection_object_id,
-                $connection_module_id,
-                $connection_cms
-            ]);
-        } else {
-            $query = "INSERT INTO object_contentmodules
-                        (object_id, module_id, system_type, module_type, mkdate, chdate)
-                      VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP())";
-            $statement = DBManager::get()->prepare($query);
-            $statement->execute([
-                $connection_object_id,
-                $connection_module_id,
-                $connection_cms,
-                $connection_module_type
-            ]);
-        }
-        return true;
-    }
-
-    /**
-    * unset connection
-    *
-    * deletes connection with object
-    * @access public
-    * @param string $connection_object_id object-id
-    * @param string $connection_module_id module-id
-    * @param string $connection_module_type module-type
-    * @param string $connection_cms system-type
-    * @return boolean successful
-    */
-    public static function unsetConnection($connection_object_id, $connection_module_id, $connection_module_type, $connection_cms)
-    {
-        $query = "SELECT 1
-                  FROM object_contentmodules
-                  WHERE object_id = ? AND module_id = ? AND system_type = ?
-                    AND module_type = ?";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([
-            $connection_object_id,
-            $connection_module_id,
-            $connection_cms,
-            $connection_module_type
-        ]);
-        $check = $statement->fetchColumn();
-
-
-        if ($check) {
-            $query = "DELETE FROM object_contentmodules
-                      WHERE object_id = ? AND module_id = ? AND system_type = ?
-                        AND module_type = ?";
-            $statement = DBManager::get()->prepare($query);
-            $statement->execute([
-                $connection_object_id,
-                $connection_module_id,
-                $connection_cms,
-                $connection_module_type
-            ]);
-            return true;
-        }
-        return false;
-    }
-
-    public static function GetConnectedSystems($object_id)
-    {
-        $query = "SELECT DISTINCT system_type
-                  FROM object_contentmodules
-                  WHERE object_id = ?";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([$object_id]);
-        return $statement->fetchAll(PDO::FETCH_COLUMN);
-    }
-
-    public static function DeleteAllConnections($object_id, $cms_type)
-    {
-        $query = "DELETE FROM object_contentmodules
-                  WHERE object_id = ? AND system_type = ?";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([$object_id, $cms_type]);
-        return $statement->rowCount();
-    }
-}
diff --git a/lib/elearning/PmWikiConnectedCMS.php b/lib/elearning/PmWikiConnectedCMS.php
deleted file mode 100644
index d89012699b6..00000000000
--- a/lib/elearning/PmWikiConnectedCMS.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/*
- * PmWikiConnectedCMS.php - Provides search capabilities
- * to search WikiFarm
- *
- * Copyright (C) 2006 - Marco Diedrich (mdiedric@uos.de)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- */
-
-require_once 'clients/xml_rpc_webservice_client.php';
-require_once 'clients/soap_webservice_client.php';
-require_once 'clients/webservice_client.php';
-
-/**
-* main-class for connection to PmWiki
-*
-* This class contains the main methods of the elearning-interface to connect to PmWiki. Extends ConnectedCMS.
-*
-* @author   Marco Diedrich <mdiedric@uos.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       PmWikiConnectedCMS
-* @package  ELearning-Interface
-*/
-
-class PmWikiConnectedCMS extends ConnectedCMS
-{
-    public $client;
-    public $api_key;
-    public $field_script;
-
-    function __construct($cms)
-    {
-        parent::__construct($cms);
-        $this->client = WebserviceClient::instance( $GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_type]['ABSOLUTE_PATH_SOAP'] .
-                                                                                                '?' . $GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_type]['URL_PARAMS'],
-                                                                                                $GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_type]['WEBSERVICE_CLASS']);
-
-        $this->api_key = $GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_type]['soap_data']['api-key'];
-    }
-
-    function init($cms)
-    {
-        parent::init($cms);
-        $this->field_script = $GLOBALS['ELEARNING_INTERFACE_MODULES'][$cms]["field_script"];
-    }
-
-    /**
-    * search for content modules
-    *
-    * returns found content modules
-    * @param string $key keyword
-    * @return array list of content modules
-    */
-    public function searchContentModules($key)
-    {
-        $fields_found = $this->client->call("search_content_modules", [
-            $GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_type]['soap_data']['api-key'],
-            $key
-        ]);
-
-        $result = [];
-        foreach ($fields_found as $field) {
-            $result[$field['field_id']] = [
-                'ref_id'      => $field['field_id'],
-                'type'        => $field['field_type'],
-                'obj_id'      => null,
-                'create_date' => $field['create_date'],
-                'last_update' => $field['change_date'],
-                'title'       => $field['field_title'],
-                'description' => $field['field_description'],
-            ];
-        }
-        return $result;
-    }
-
-}
diff --git a/lib/elearning/PmWikiConnectedLink.php b/lib/elearning/PmWikiConnectedLink.php
deleted file mode 100644
index 973c272d575..00000000000
--- a/lib/elearning/PmWikiConnectedLink.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/*
- * PmWikiConnectedLink.php - Provides links to PmWiki Modules
- *
- * Copyright (C) 2006 - Marco Diedrich (mdiedric@uos.de)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- */
-
-use Studip\Button, Studip\LinkButton;
-
-require_once 'lib/webservices/api/studip_seminar.php';
-
-/**
-*
-* This class contains methods to generate links to PmWiki-Farm
-*
-* @author   Marco Diedrich <mdiedric@uos.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       PmWikiConnectedLink
-* @package  ELearning-Interface
-*/
-
-class PmWikiConnectedLink extends ConnectedLink
-{
-    function __construct($cms)
-    {
-        parent::__construct($cms);
-        $this->cms_link = "pmwiki_referrer.php";
-    }
-
-    /**
-    * get user module links
-    *
-    * returns content module links for user
-    * @access public
-    * @return string html-code
-    */
-
-    function getUserModuleLinks()
-    {
-        $range_id = Context::getId();
-        $username = get_username($GLOBALS['auth']->auth['uid']);
-
-        global $connected_cms, $view, $search_key, $cms_select, $current_module;
-
-        // hier muss die Authentifizierung mit übergeben werden...
-        //
-        if (Context::isCourse()) {
-            $context = 'seminar';
-
-            $status = StudipSeminarHelper::get_user_status($username, $range_id);
-
-        } else if (Context::isInstitute()) {
-            $context = 'institute';
-
-            $status = StudipInstituteHelper::get_user_status($username, $range_id);
-        }
-
-        ob_start(); ?>
-        <form method="post" target="_blank" rel="noopener noreferrer"
-              action="<?= $connected_cms[$this->cms_type]->content_module[$current_module]->link ?>">
-
-            <?= CSRFProtection::tokenTag() ?>
-            <input type='hidden'    name='authid'           value='<?= htmlReady($GLOBALS['auth']->auth['uname']) ?>'>
-            <input type='hidden'    name='authpw'           value='<?= htmlReady(Token::create()) ?>'>
-            <input type='hidden'    name='_permission'  value='<?= htmlReady($status) ?>'>
-            <input type='hidden'    name='_range_id'        value='<?= htmlReady($range_id) ?>'>
-            <input type='hidden'    name='_server'          value='<?= htmlReady(Config::get()->STUDIP_INSTALLATION_ID) ?>'>
-            <input type='hidden'    name='_context'         value='<?= htmlReady($context) ?>'>
-            <?= Button::createAccept(_('Starten')) ?>
-
-        </form>
-
-        <?php
-
-        $output = ob_get_contents();
-        ob_end_clean();
-        return $output;
-    }
-
-    /**
-    * get admin module links
-    *
-    * returns links add or remove a module from course
-    * @access public
-    * @return string returns html-code
-    */
-
-    function getAdminModuleLinks()
-    {
-        global $connected_cms, $view, $search_key, $cms_select, $current_module;
-
-        ob_start(); ?>
-
-        <form method="post" action="<?= URLHelper::getLink() ?>">
-            <?= CSRFProtection::tokenTag() ?>
-            <input type="hidden"    name="view"                             value="<?= htmlReady($view) ?>">
-            <input type="hidden"    name="search_key"               value="<?= htmlReady($search_key) ?>">
-            <input type="hidden"    name="cms_select"               value="<?= htmlReady($cms_select) ?>">
-            <input type="hidden"    name="module_type"              value="wiki">
-            <input type="hidden"    name="module_id"                    value="<?= htmlReady($current_module) ?>">
-            <input type="hidden"    name="module_system_type" value="<?= htmlReady($this->cms_type) ?>">
-
-            <?php if ($connected_cms[$this->cms_type]->content_module[$current_module]->isConnected()) : ?>
-
-                &nbsp;<?= Button::create(_('Entfernen'), 'remove') ?>
-
-            <?php else :?>
-
-                &nbsp;<?= Button::create(_('Hinzufügen'), 'add') ?>
-
-            <?php endif ; ?>
-
-        </form>
-        <?php
-
-        $output = ob_get_contents();
-
-        ob_end_clean();
-
-        return $output;
-    }
-
-}
diff --git a/lib/elearning/PmWikiContentModule.php b/lib/elearning/PmWikiContentModule.php
deleted file mode 100644
index fb3cccd9715..00000000000
--- a/lib/elearning/PmWikiContentModule.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-/*
- * PmWikiContentModule.php - Provides access PmWiki Modules
- *
- * Copyright (C) 2006 - Marco Diedrich (mdiedric@uos.de)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- */
-
-/**
-*
-* This class contains methods to handle PmWiki learning modules
-*
-* @author   Marco Diedrich <mdiedric@uos.de>
-* @access   public
-* @modulegroup  elearning_interface_modules
-* @module       PmWikiContentModule
-* @package  ELearning-Interface
-*/
-
-class PmWikiContentModule extends ContentModule
-{
-    public $link;
-    public $client;
-    public $chdate;
-    public $accepted_users;
-
-    /**
-    * constructor
-    *
-    * init class.
-    * @access public
-    * @param string $module_id module-id
-    * @param string $module_type module-type
-    * @param string $cms_type system-type
-    */
-
-    function __construct($module_id, $module_type, $cms_type)
-    {
-        parent::__construct($module_id, $module_type, $cms_type);
-        $this->link = $GLOBALS['connected_cms'][$this->cms_type]->ABSOLUTE_PATH_ELEARNINGMODULES.$this->id."/";
-        $this->client = WebserviceClient::instance( $this->link. '?' .
-                                                    $GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_type]['URL_PARAMS'],
-                                                    $GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_type]['WEBSERVICE_CLASS']);
-    }
-
-    /**
-    * reads data for content module
-    *
-    */
-
-    function readData()
-    {
-        global $connected_cms, $view, $search_key, $cms_select, $current_module;
-
-        $args = [$GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_type]['soap_data']['api-key'], $this->id];
-
-        $field_data = $connected_cms[$this->cms_type]->client->call('get_field_info', $args);
-
-        $this->title = $field_data['field_title'];
-        $this->authors = $field_data['field_author'];
-        $this->chdate = $field_data['change_date'];
-
-        $this->accepted_users = $field_data['field_accepted_users'];
-
-        return false;
-    }
-
-    /**
-    * get permission-status
-    *
-    * returns true, if operation is allowed
-    * @access public
-    * @param string $operation operation
-    * @return boolean allowed
-    */
-
-    function isAllowed($operation)
-    {
-        global $connected_cms, $view, $search_key, $cms_select, $current_module;
-
-        if (Config::get()->STUDIP_INSTALLATION_ID)
-        {
-            $username = Config::get()->STUDIP_INSTALLATION_ID."#".$GLOBALS['auth']->auth['uname'];
-        } else
-        {
-            $username = $GLOBALS['auth']->auth['uname'];
-        }
-
-        $args = [$GLOBALS['ELEARNING_INTERFACE_MODULES'][$this->cms_type]['soap_data']['api-key'],$this->id, $username];
-
-        $authorized = $connected_cms[$this->cms_type]->client->call('field_accessable_by_user', $args);
-
-        if ($authorized)
-        {
-            return true;
-        } else
-        {
-            # old authorization
-            if (is_array($this->accepted_users) && in_array($username, $this->accepted_users))
-                return true;
-            else
-                return false;
-        }
-
-    }
-}
diff --git a/lib/elearning/clients/soap_webservice_client.php b/lib/elearning/clients/soap_webservice_client.php
deleted file mode 100644
index 9c392a8aaa1..00000000000
--- a/lib/elearning/clients/soap_webservice_client.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-require_once 'webservice_client.php';
-require_once 'vendor/nusoap/nusoap.php';
-
-class Soap_WebserviceClient extends WebserviceClient
-{
-    private $client;
-
-    public function __construct($webservice_url)
-    {
-        $this->client = new soap_client($webservice_url);
-        $this->client->response_timeout = 7600;
-    }
-
-    public function &call($method_name, &$args)
-    {
-        $result = $this->client->call($method_name, $args);
-        return $result;
-    }
-}
diff --git a/lib/elearning/clients/webservice_client.php b/lib/elearning/clients/webservice_client.php
deleted file mode 100644
index a7f97f2cb6b..00000000000
--- a/lib/elearning/clients/webservice_client.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-class WebserviceClient
-{
-    public static function instance($webservice_url, $classname)
-    {
-        static $instances = [];
-
-        if (!isset($instances[$classname . $webservice_url])) {
-            $instances[$classname . $webservice_url] = new $classname($webservice_url);
-        }
-
-        return $instances[$classname . $webservice_url];
-    }
-
-    public function __construct()
-    {
-        trigger_error("this class can't be instantiated");
-    }
-
-    public function &call($method_name, &$args)
-    {
-        trigger_error("WebserviceCaller::WebserviceCaller::  call not defined");
-    }
-}
diff --git a/lib/elearning/clients/xml_rpc_webservice_client.php b/lib/elearning/clients/xml_rpc_webservice_client.php
deleted file mode 100644
index 2e24e412e48..00000000000
--- a/lib/elearning/clients/xml_rpc_webservice_client.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-
-require_once __DIR__ . '/webservice_client.php';
-
-class XML_RPC_WebserviceClient extends WebserviceClient
-{
-    private $client;
-
-    public function __construct($webservice_url)
-    {
-        $this->client = new xmlrpc_client($webservice_url);
-        $this->client->debug = false;
-        $this->client->return_type = 'phpvals';
-
-    }
-
-    public function &call($method_name, &$args)
-    {
-        $xmlrpc_args = [];
-        foreach ($args as $arg)
-        {
-                $xmlrpc_args[] = php_xmlrpc_encode($arg);
-        }
-
-        $xmlrpc_return = $this->client->send(new xmlrpcmsg($method_name, $xmlrpc_args), 300);
-        $xmlrpc_result = $xmlrpc_return->value();
-        return $xmlrpc_result;
-    }
-}
diff --git a/lib/soap/StudipSoapClient_PHP5.php b/lib/ilias_interface/StudipSoapClient.php
similarity index 100%
rename from lib/soap/StudipSoapClient_PHP5.php
rename to lib/ilias_interface/StudipSoapClient.php
diff --git a/lib/elearning/studip_referrer_7x.php b/lib/ilias_interface/studip_referrer_7x.php
similarity index 100%
rename from lib/elearning/studip_referrer_7x.php
rename to lib/ilias_interface/studip_referrer_7x.php
diff --git a/lib/elearning/studip_referrer_8x.php b/lib/ilias_interface/studip_referrer_8x.php
similarity index 100%
rename from lib/elearning/studip_referrer_8x.php
rename to lib/ilias_interface/studip_referrer_8x.php
diff --git a/lib/models/Course.php b/lib/models/Course.php
index b252063120b..25350dbce0b 100644
--- a/lib/models/Course.php
+++ b/lib/models/Course.php
@@ -337,18 +337,6 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe
             $query = 'DELETE FROM `schedule_courses` WHERE `course_id` = ?';
             $statement = DBManager::get()->execute($query, [$course->id]);
 
-            //Remove connections to other e-learning systems:
-            if (Config::get()->ELEARNING_INTERFACE_ENABLE) {
-                $cms_types = ObjectConnections::GetConnectedSystems($course->id);
-                foreach ($cms_types as $system) {
-                    if (empty($GLOBALS['connected_cms'][$system])) {
-                        continue;
-                    }
-                    ELearningUtils::loadClass($system);
-                    $del_cms += $GLOBALS['connected_cms'][$system]->deleteConnectedModules($course->id);
-                }
-            }
-
             //Remove all entries in object_user_vists for the course:
             object_kill_visits(null, $course->id);
 
diff --git a/lib/modules/CoreElearningInterface.php b/lib/modules/CoreElearningInterface.php
deleted file mode 100644
index a5f71196a0c..00000000000
--- a/lib/modules/CoreElearningInterface.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-
-/*
- *  Copyright (c) 2012  Rasmus Fuhse <fuhse@data-quest.de>
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License as
- *  published by the Free Software Foundation; either version 2 of
- *  the License, or (at your option) any later version.
- */
-
-class CoreElearningInterface extends CorePlugin implements StudipModule
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function getIconNavigation($course_id, $last_visit, $user_id)
-    {
-        if (!Config::get()->ELEARNING_INTERFACE_ENABLE) {
-            return null;
-        }
-
-        $sql = "SELECT COUNT(module_id) AS count,
-                       COUNT(IF((chdate > IFNULL(b.visitdate, :threshold) AND a.module_type != 'crs'), module_id, NULL)) AS neue
-                FROM object_contentmodules AS a
-                LEFT JOIN object_user_visits AS b
-                  ON b.object_id = a.object_id
-                     AND b.user_id = :user_id
-                     AND b.plugin_id = :plugin_id
-                WHERE a.object_id = :course_id
-                  AND a.module_type != 'crs'
-                GROUP BY a.object_id";
-
-        $statement = DBManager::get()->prepare($sql);
-        $statement->bindValue(':user_id', $user_id);
-        $statement->bindValue(':course_id', $course_id);
-        $statement->bindValue(':threshold', $last_visit);
-        $statement->bindValue(':plugin_id', $this->getPluginId());
-        $statement->execute();
-        $result = $statement->fetch(PDO::FETCH_ASSOC);
-        if (!empty($result)) {
-            $nav = new Navigation(_('Lernmodule'), 'dispatch.php/course/elearning/show');
-            if ($result['neue']) {
-                $nav->setImage(Icon::create('learnmodule', Icon::ROLE_ATTENTION), [
-                    'title' => sprintf(
-                        ngettext(
-                            '%1$d Lernmodul, %2$d neues',
-                            '%1$d Lernmodule, %2$d neue',
-                            $result['count']
-                        ),
-                        $result['count'],
-                        $result['neue']
-                    )
-                ]);
-            } elseif ($result['count']) {
-                $nav->setImage(Icon::create('learnmodule', Icon::ROLE_CLICKABLE), [
-                    'title' => sprintf(
-                        ngettext(
-                            '%d Lernmodul',
-                            '%d Lernmodule',
-                            $result['count']
-                        ),
-                        $result['count']
-                    )
-                ]);
-            }
-            return $nav;
-        }
-
-        return null;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getTabNavigation($course_id)
-    {
-        if (!Config::get()->ELEARNING_INTERFACE_ENABLE) {
-            return null;
-        }
-
-        $navigation = new Navigation(_('Lernmodule'));
-        $navigation->setImage(Icon::create('learnmodule', Icon::ROLE_INFO_ALT));
-        $navigation->setActiveImage(Icon::create('learnmodule', Icon::ROLE_INFO));
-
-        if (ObjectConnections::isObjectConnected($course_id)) {
-            $elearning_nav = new Navigation(_('Lernmodule dieser Veranstaltung'), 'dispatch.php/course/elearning/show?seminar_id=' . $course_id);
-
-            if (get_object_type($course_id, ['inst'])) {
-                $elearning_nav->setTitle(_('Lernmodule dieser Einrichtung'));
-            }
-
-            $navigation->addSubNavigation('show', $elearning_nav);
-        }
-
-        if ($GLOBALS['perm']->have_studip_perm('tutor', $course_id)) {
-            $navigation->addSubNavigation('edit', new Navigation(_('Lernmodule hinzufügen / entfernen'), 'dispatch.php/course/elearning/edit?seminar_id=' . $course_id));
-        }
-
-        return ['elearning' => $navigation];
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getMetadata()
-    {
-        return [
-            'summary' => _('Zugang zu extern erstellten Lernmodulen'),
-            'description' => _('Über diese Schnittstelle ist es möglich, '.
-                'Selbstlerneinheiten, die in externen Programmen erstellt '.
-                'werden, in Stud.IP zur Verfügung zu stellen. Ein häufig '.
-                'angebundenes System ist ILIAS. Besteht eine Anbindung zu '.
-                'einem ILIAS-System, haben Lehrende die Möglichkeit, in '.
-                'ILIAS Selbstlerneinheiten zu erstellen und in Stud.IP '.
-                'bereit zu stellen.'),
-            'displayname' => _('Lernmodulschnittstelle'),
-            'category' => _('Inhalte und Aufgabenstellungen'),
-            'keywords' => _('Einbindung z. B. von ILIAS-Lerneinheiten;
-                            Zugang zu externen Lernplattformen;
-                            Aufgaben- und Test-Erstellung'),
-            'icon' => Icon::create('learnmodule', Icon::ROLE_INFO),
-            'icon_clickable' => Icon::create('learnmodule', Icon::ROLE_CLICKABLE),
-            'descriptionshort' => _('Zugang zu extern erstellten Lernmodulen'),
-            'descriptionlong' => _('Über diese Schnittstelle ist es möglich, Selbstlerneinheiten, '.
-                                    'die in externen Programmen erstellt werden, in Stud.IP zur Verfügung '.
-                                    'zu stellen. Ein häufig angebundenes System ist ILIAS. Besteht eine '.
-                                    'Anbindung zu einem ILIAS-System, haben Lehrende die Möglichkeit, in '.
-                                    'ILIAS Selbstlerneinheiten zu erstellen und in Stud.IP bereit zu stellen.')
-        ];
-    }
-
-    public function isActivatableForContext(Range $context)
-    {
-        return Config::get()->ELEARNING_INTERFACE_ENABLE && $context->getRangeType() === 'course';
-    }
-
-    public function getInfoTemplate($course_id)
-    {
-        // TODO: Implement getInfoTemplate() method.
-        return null;
-    }
-}
diff --git a/lib/navigation/AdminNavigation.php b/lib/navigation/AdminNavigation.php
index e0782834507..1b86ca11d50 100644
--- a/lib/navigation/AdminNavigation.php
+++ b/lib/navigation/AdminNavigation.php
@@ -193,10 +193,6 @@ class AdminNavigation extends Navigation
             }
             $navigation->addSubNavigation('help_content', new Navigation(_('Hilfe-Texte'), 'dispatch.php/help_content/admin_overview'));
 
-            if (Config::get()->ELEARNING_INTERFACE_ENABLE) {
-                $navigation->addSubNavigation('elearning', new Navigation(_('Lernmodule'), 'admin_elearning_interface.php'));
-            }
-
             if (Config::get()->CRONJOBS_ENABLE) {
                 $navigation->addSubNavigation('cronjobs', new Navigation(_('Cronjobs'), 'dispatch.php/admin/cronjobs/schedules'));
             }
diff --git a/lib/navigation/ContentsNavigation.php b/lib/navigation/ContentsNavigation.php
index a00adb6e07a..0d75b3f19bb 100644
--- a/lib/navigation/ContentsNavigation.php
+++ b/lib/navigation/ContentsNavigation.php
@@ -124,14 +124,6 @@ class ContentsNavigation extends Navigation
             }
         }
 
-        // elearning
-        if (Config::get()->ELEARNING_INTERFACE_ENABLE) {
-            $elearning = new Navigation(_('Lernmodule'), 'dispatch.php/elearning/my_accounts');
-            $elearning->setImage(Icon::create('learnmodule'));
-            $elearning->setDescription(_('Zugang zu externen Lernmaterialien'));
-            $this->addSubNavigation('my_elearning', $elearning);
-        }
-
         if (!$GLOBALS['perm']->have_perm('root') && $GLOBALS['user']->getAuthenticatedUser()->hasRole('Hilfe-Administrator(in)')) {
             $help = new Navigation(_('Hilfe'), 'dispatch.php/help_content/admin_overview');
             $help->setImage(Icon::create('question-circle'));
diff --git a/lib/navigation/StartNavigation.php b/lib/navigation/StartNavigation.php
index 0a6d52afa40..94881c8dc19 100644
--- a/lib/navigation/StartNavigation.php
+++ b/lib/navigation/StartNavigation.php
@@ -232,11 +232,6 @@ class StartNavigation extends Navigation
             $navigation->addSubNavigation('questionnaire', new Navigation(_('Ankündigungen'), 'dispatch.php/news/admin_news'));
         }
 
-        // elearning
-        if (Config::get()->ELEARNING_INTERFACE_ENABLE) {
-            $navigation->addSubNavigation('my_elearning', new Navigation(_('Lernmodule'), 'dispatch.php/elearning/my_accounts'));
-        }
-
         if (!$GLOBALS['perm']->have_perm('root') && $GLOBALS['user']->getAuthenticatedUser()->hasRole('Hilfe-Administrator(in)')) {
             $navigation->addSubNavigation('help_content', new Navigation(_('Hilfe-Texte und Touren'), 'dispatch.php/help_content/admin_overview'));
         }
diff --git a/lib/soap/StudipSoapClient.php b/lib/soap/StudipSoapClient.php
deleted file mode 100644
index f6c0cadcbb0..00000000000
--- a/lib/soap/StudipSoapClient.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-class StudipSoapClient
-{
-    var $soap_client;
-    var $error;
-    var $faultstring;
-
-    function __construct($path)
-    {
-        require_once("vendor/nusoap/nusoap.php");
-
-        $this->soap_client = new soap_client($path, true);
-        $this->soap_client->soap_defencoding = 'UTF-8';
-        $this->soap_client->decode_utf8 = false;
-        $this->soap_client->setDebugLevel(0);
-
-        $err = $this->soap_client->getError();
-        if ($err)
-            $this->error = "<b>Soap Constructor Error</b><br>" . $err . "<br><br>";
-    }
-
-    function _call($method, $params)
-    {
-        $this->faultstring = "";
-        $result = $this->soap_client->call($method, $params);
-
-        if ($this->soap_client->fault)
-        {
-            $this->faultstring = $result["faultstring"];
-            if (!in_array(mb_strtolower($this->faultstring), ["session not valid","session invalid", "session idled"]))
-                $this->error .= "<b>" . sprintf(_("SOAP-Fehler, Funktion \"%s\":"), $method) . "</b> " . $result["faultstring"] . " (" . $result["faultcode"] . ")<br>";
-        } else {
-            $err = $this->soap_client->getError();
-            if ($err) {
-                $this->error .= "<b>" . sprintf(_("SOAP-Fehler, Funktion \"%s\":"), $method) . "</b> " . $err . "<br>";
-            } else {
-                return $result;
-            }
-        }
-        error_log($this->error);
-        return false;
-    }
-
-    function getError()
-    {
-         $error = $this->error;
-         $this->error = "";
-         if ($error != "")
-             return $error;
-        else
-            return false;
-    }
-}
-?>
diff --git a/public/admin_elearning_interface.php b/public/admin_elearning_interface.php
deleted file mode 100644
index 24eb47c833f..00000000000
--- a/public/admin_elearning_interface.php
+++ /dev/null
@@ -1,196 +0,0 @@
-<?
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-// +---------------------------------------------------------------------------+
-// This file is part of Stud.IP
-// admin_elearning_interface.php
-//
-// Copyright (c) 2005 Arne Schroeder <schroeder@data-quest.de>
-// Suchi & Berg GmbH <info@data-quest.de>
-// +---------------------------------------------------------------------------+
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or any later version.
-// +---------------------------------------------------------------------------+
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-// +---------------------------------------------------------------------------+
-
-use Studip\Button, Studip\LinkButton;
-
-require '../lib/bootstrap.php';
-
-page_open(["sess" => "Seminar_Session", "auth" => "Seminar_Auth", "perm" => "Seminar_Perm", 'user' => "Seminar_User"]);
-$GLOBALS['perm']->check("root");
-
-include 'lib/seminar_open.php'; // initialise Stud.IP-Session
-// -- here you have to put initialisations for the current page
-
-PageLayout::setHelpKeyword("Basis.Ilias");
-PageLayout::setTitle(_("Verwaltung der Lernmodul-Schnittstelle"));
-Navigation::activateItem('/admin/config/elearning');
-
-ob_start();
-
-$cms_select = Request::get('cms_select');
-
-if (Config::get()->ELEARNING_INTERFACE_ENABLE)
-{
-    $connection_status = [];
-    $connected_cms = [];
-    if ($cms_select != "" && isset($ELEARNING_INTERFACE_MODULES[$cms_select]))
-    {
-        $connected_cms[$cms_select] = new ConnectedCMS();
-        $connection_status = $connected_cms[$cms_select]->getConnectionStatus($cms_select);
-        if (Request::submitted('activate'))
-        {
-            ELearningUtils::setConfigValue("ACTIVE", "1", $cms_select);
-        }
-        if (Request::submitted('deactivate'))
-        {
-            ELearningUtils::setConfigValue("ACTIVE", "0", $cms_select);
-        }
-        if (!count(array_column($connection_status, 'error')))
-        {
-            require_once ("lib/elearning/" . $ELEARNING_INTERFACE_MODULES[$cms_select]["CLASS_PREFIX"] . "ConnectedCMS.php");
-            $classname = $ELEARNING_INTERFACE_MODULES[$cms_select]["CLASS_PREFIX"] . "ConnectedCMS";
-            $connected_cms[$cms_select] = new $classname($cms_select);
-            $connected_cms[$cms_select]->initSubclasses();
-        }
-    } else {
-        unset($cms_select);
-    }
-
-    if (!empty($messages["error"])) {
-        PageLayout::postError($messages["error"]);
-    }
-    if (!empty($messages["info"])) {
-       PageLayout::postInfo($messages["info"]);
-    }
-
-    echo ELearningUtils::getCMSSelectbox(_("Bitte wählen Sie ein angebundenes System für die Schnittstelle: "), false) . "\n\n<br><br>";
-
-    if (!empty($cms_select)) {
-        echo "<table>";
-        $error_count = 0;
-        foreach ($connection_status as $type => $msg)
-        {
-            if ($msg["error"] != "")
-            {
-                echo "<tr><td valign=\"middle\">" . Icon::create('decline', Icon::ROLE_ATTENTION)->asImg(['class' => 'text-top', 'title' => _('Fehler')]) . $msg["error"] . "</td></tr>";
-                $error_count++;
-            }
-            else
-                echo "<tr><td valign=\"middle\">" . Icon::create('accept', Icon::ROLE_ACCEPT)->asImg(['class' => 'text-top', 'title' => _('OK')]) . $msg["info"] . "</td></tr>";
-        }
-        echo "<tr><td><br></td></tr>";
-        if ($error_count > 0)
-        {
-            $status_info = "error";
-            echo "<tr><td valign=\"middle\">" . Icon::create('decline', Icon::ROLE_ATTENTION)->asImg(['class' => 'text-top', 'title' => _('Fehler')]) . "<b>";
-            echo _("Beim Laden der Schnittstelle sind Fehler aufgetreten. ");
-            if (ELearningUtils::isCMSActive($cms_select))
-            {
-                ELearningUtils::setConfigValue("ACTIVE", "0", $cms_select);
-                echo _("Die Schnittstelle wurde automatisch deaktiviert!");
-            }
-            echo "</b></td></tr>";
-        }
-        else
-            echo "<tr><td valign=\"middle\">" . Icon::create('accept', Icon::ROLE_ACCEPT, ['title' =>  _('OK')])->asImg(['class' => 'text-top']) . "<b>" .sprintf( _("Die Schnittstelle zum %s-System ist korrekt konfiguriert."), $connected_cms[$cms_select]->getName()) . "</b></td></tr>";
-        echo "</table>";
-        echo "<br>\n";
-        echo htmlReady(ELearningUtils::getCMSHeader(isset($connected_cms[$cms_select]) ? $connected_cms[$cms_select]->getName() : ''));
-        echo "<form method=\"POST\" action=\"" . URLHelper::getLink() . "\" class=\"default\">\n";
-        echo CSRFProtection::tokenTag();
-        echo '<fieldset>';
-        if (ELearningUtils::isCMSActive($cms_select))
-        {
-            $status_info = "active";
-            echo ELearningUtils::getHeader(_("Status"));
-            echo "<br>\n";
-            echo _("Die Schnittstelle ist <b>aktiv</b>.");
-            echo "<br><br>\n";
-            echo _("Hier können Sie die Schnittstelle deaktivieren.");
-            echo "<br><br>\n";
-            echo Button::create(_('Deaktivieren'), 'deactivate');
-        }
-        else
-        {
-            echo ELearningUtils::getHeader(_("Status"));
-            echo "<br>\n";
-            echo _("Die Schnittstelle ist nicht aktiv.");
-            echo "<br><br>\n";
-            if ($error_count == 0)
-            {
-                $status_info = "not active";
-                echo _("Hier können Sie die Schnittstelle aktivieren.");
-                echo "<br><br>\n";
-                echo Button::create(_('Aktivieren'), 'activate');
-            }
-        }
-        echo '</fieldset>';
-        echo "<input type=\"HIDDEN\" name=\"cms_select\" value=\"" . $cms_select . "\">\n";
-        echo "</form>";
-        echo "<br>\n";
-
-        echo "<form method=\"POST\" action=\"" . URLHelper::getURL() . "\" class=\"default\">\n";
-        echo CSRFProtection::tokenTag();
-        echo '<fieldset>';
-        if ($error_count == 0)
-        {
-            echo ELearningUtils::getHeader(_("Einstellungen"));
-            echo "<br>\n";
-            $connected_cms[$cms_select]->getPreferences();
-        }
-        echo '</fieldset>';
-        echo "<input type=\"hidden\" name=\"cms_select\" value=\"" . $cms_select . "\">\n";
-        echo "</form>";
-
-        echo ELearningUtils::getCMSFooter($connected_cms[$cms_select]->getLogo());
-    }
-
-    Helpbar::Get()->addPlainText(_('Information'), _('Hier können Sie angebundene Systeme verwalten.'), Icon::create('info'));
-    Helpbar::Get()->addPlainText(_('Aktionen'), _('Nachdem Sie ein angebundenes System ausgewählt haben wird die Verbindung zum System geprüft.'), Icon::create('info'));
-    // Anzeige, wenn noch keine Account-Zuordnung besteht
-
-    switch ($status_info ?? null) {
-        case "active":
-            PageLayout::postSuccess(sprintf(_("Die Verbindung zum System \"%s\" ist <b>aktiv</b>. Sie können die Einbindung des Systems in Stud.IP jederzeit deaktivieren."), htmlReady($connected_cms[$cms_select]->getName())));
-        break;
-        case "not active":
-            PageLayout::postWarning(sprintf(_("Die Verbindung zum System \"%s\" steht, das System ist jedoch nicht aktiviert. Sie können die Einbindung des Systems in Stud.IP jederzeit aktivieren. Solange die Verbindung nicht aktiviert wurde, werden die Module des Systems \"%s\" in Stud.IP nicht angezeigt."), htmlReady($connected_cms[$cms_select]->getName()), htmlReady($connected_cms[$cms_select]->getName())));
-        break;
-        case "error":
-            PageLayout::postError(sprintf(_("Bei der Prüfung der Verbindung sind Fehler aufgetreten. Sie müssen zunächst die Einträge in der Konfigurationsdatei korrigieren, bevor das System angebunden werden kann."), $connected_cms[$cms_select]->getName()));
-        break;
-    }
-
-// terminate objects
-    if (!empty($connected_cms))
-        foreach($connected_cms as $system)
-            $system->terminate();
-
-}
-else
-{
-    PageLayout::postError(_("Die Schnittstelle für die Integration von Lernmodulen ist nicht aktiviert.
-    Damit Lernmodule verwendet werden können, muss die Verbindung zu einem LCM-System in der Konfigurationsdatei von Stud.IP hergestellt werden.
-    Wenden Sie sich bitte an den/die AdministratorIn."), [_("E-Learning-Schnittstelle nicht eingebunden")]);
-
-}
-
-
-$template = $GLOBALS['template_factory']->open('layouts/base.php');
-$template->content_for_layout = ob_get_clean();
-echo $template->render();
-
-page_close();
diff --git a/public/ilias3_referrer.php b/public/ilias3_referrer.php
deleted file mode 100644
index 82d90310d9e..00000000000
--- a/public/ilias3_referrer.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-// +---------------------------------------------------------------------------+
-// This file is part of Stud.IP
-// ilias3_referrer.php
-//
-// Copyright (c) 2005 Arne Schroeder <schroeder@data-quest.de>
-// Suchi & Berg GmbH <info@data-quest.de>
-// +---------------------------------------------------------------------------+
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or any later version.
-// +---------------------------------------------------------------------------+
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-// +---------------------------------------------------------------------------+
-
-require '../lib/bootstrap.php';
-
-ob_start();
-page_open(["sess" => "Seminar_Session", "auth" => "Seminar_Auth", "perm" => "Seminar_Perm", 'user' => "Seminar_User"]);
-$perm->check("autor");
-include 'lib/seminar_open.php'; // initialise Stud.IP-Session
-
-if (Config::get()->ELEARNING_INTERFACE_ENABLE) {
-    ELearningUtils::bench("start");
-    
-    $cms_select = Request::quoted('cms_select');
-    if (isset($ELEARNING_INTERFACE_MODULES[$cms_select]["name"])) {
-        ELearningUtils::loadClass($cms_select);
-        // init session now
-        $sess_id = $connected_cms[$cms_select]->user->getSessionId();
-        $connected_cms[$cms_select]->terminate();
-        ob_end_clean();
-        if (!$sess_id){
-            $message =  _("Login nicht möglich");
-            $details = [];
-            $details[]  = sprintf(_("Automatischer Login für das System <b>%s</b> (Nutzername:%s) fehlgeschlagen."),
-                htmlReady($connected_cms[$cms_select]->getName()),
-                $connected_cms[$cms_select]->user->getUsername());
-            $details[] = _("Dieser Fehler kann dadurch hervorgerufen werden, dass Sie Ihr Passwort geändert haben. In diesem Fall versuchen Sie bitte Ihren Account erneut zu verknüpfen.");
-            $details[] = sprintf(_("%sZurück%s zu Meine Lernmodule"), '<a href="'.URLHelper::getLink("dispatch.php/elearning/my_accounts").'"><b>', '</b></a>');
-
-            PageLayout::postError($message, $details);
-            $template = $GLOBALS['template_factory']->open('layouts/base.php');
-            $template->content_for_layout = ob_get_clean();
-            $template->infobox = $infobox ? ['content' => $infobox] : null;
-            echo $template->render();
-            page_close();
-            die;
-        }
-        $parameters = "?sess_id=$sess_id";
-        $client_id = Request::get('client_id');
-        if (!empty($client_id))
-            $parameters .= "&client_id=$client_id";
-        if (Request::get('target'))
-            $parameters .= "&target=".Request::option('target');
-        if (Request::get('ref_id'))
-            $parameters .= "&ref_id=".Request::option('ref_id');
-        if (Request::get('type'))
-            $parameters .= "&type=".Request::option('type');
-
-        // refer to studip_referrer.php
-        header("Location: ".$ELEARNING_INTERFACE_MODULES[$cms_select]["ABSOLUTE_PATH_ELEARNINGMODULES"] . $ELEARNING_INTERFACE_MODULES[$cms_select]["target_file"] . $parameters);
-        page_close();
-        die;
-    }
-}
-?>
-- 
GitLab