diff --git a/app/controllers/activityfeed.php b/app/controllers/activityfeed.php
index 2f93aa103d6932782d5f766dae3961df78f1c371..8e81912b32fd95716f8226868534b3852a8dced3 100644
--- a/app/controllers/activityfeed.php
+++ b/app/controllers/activityfeed.php
@@ -53,7 +53,7 @@ class ActivityfeedController extends AuthenticatedController
         unset($modules[Context::INSTITUTE]['participants']);
         unset($modules[Context::INSTITUTE]['schedule']);
 
-        $standard_plugins = PluginManager::getInstance()->getPlugins("StandardPlugin");
+        $standard_plugins = PluginManager::getInstance()->getPlugins(StandardPlugin::class);
         foreach ($standard_plugins as $plugin) {
             if ($plugin instanceof ActivityProvider) {
                 $modules[Context::COURSE][$plugin->getPluginName()] = $plugin->getPluginName();
@@ -67,7 +67,7 @@ class ActivityfeedController extends AuthenticatedController
             'blubber'      => _('Blubber'),
         ];
 
-        $homepage_plugins = PluginEngine::getPlugins('HomepagePlugin');
+        $homepage_plugins = PluginEngine::getPlugins(HomepagePlugin::class);
         foreach ($homepage_plugins as $plugin) {
             if ($plugin->isActivated($GLOBALS['user']->id, 'user')) {
                 if ($plugin instanceof ActivityProvider) {
diff --git a/app/controllers/admin/courses.php b/app/controllers/admin/courses.php
index 8de1b7984998b8e402495b64207061b473daf8c1..82c389b7a4d7055cda6025f15c0a584683124cb7 100644
--- a/app/controllers/admin/courses.php
+++ b/app/controllers/admin/courses.php
@@ -490,7 +490,7 @@ class Admin_CoursesController extends AuthenticatedController
                     ]);
                 break;
             default:
-                foreach (PluginManager::getInstance()->getPlugins('AdminCourseAction') as $plugin) {
+                foreach (PluginManager::getInstance()->getPlugins(AdminCourseAction::class) as $plugin) {
                     if ($GLOBALS['user']->cfg->MY_COURSES_ACTION_AREA === get_class($plugin)) {
                         $multimode = $plugin->useMultimode();
                         if ($multimode) {
@@ -711,7 +711,7 @@ class Admin_CoursesController extends AuthenticatedController
             $d['last_activity_raw'] = $last_activity;
         }
 
-        foreach (PluginManager::getInstance()->getPlugins('AdminCourseContents') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(AdminCourseContents::class) as $plugin) {
             foreach ($plugin->adminAvailableContents() as $index => $label) {
                 if (in_array($plugin->getPluginId() . '_' . $index, $activated_fields)) {
                     $content = $plugin->adminAreaGetCourseContent($course, $index);
@@ -837,7 +837,7 @@ class Admin_CoursesController extends AuthenticatedController
                 $d['action'] = $template->render();
                 break;
             default:
-                foreach (PluginManager::getInstance()->getPlugins('AdminCourseAction') as $plugin) {
+                foreach (PluginManager::getInstance()->getPlugins(AdminCourseAction::class) as $plugin) {
                     if ($GLOBALS['user']->cfg->MY_COURSES_ACTION_AREA === get_class($plugin)) {
                         $output = $plugin->getAdminCourseActionTemplate($course->getId());
                         $d['action'] = $output instanceof Flexi_Template ? $output->render() : (string) $output;
@@ -1029,7 +1029,7 @@ class Admin_CoursesController extends AuthenticatedController
                     $row['institute'] = $course->home_institut ? (string) $course->home_institut['name'] : $course['institut_id'];
                 }
 
-                foreach (PluginManager::getInstance()->getPlugins('AdminCourseContents') as $plugin) {
+                foreach (PluginManager::getInstance()->getPlugins(AdminCourseContents::class) as $plugin) {
                     foreach ($plugin->adminAvailableContents() as $index => $label) {
                         if (in_array($plugin->getPluginId() . "_" . $index, $filter_config)) {
                             $content = $plugin->adminAreaGetCourseContent($course, $index);
@@ -1048,7 +1048,7 @@ class Admin_CoursesController extends AuthenticatedController
             foreach ($filter_config as $index) {
                 $captions[$index] = $view_filters[$index];
             }
-            foreach (PluginManager::getInstance()->getPlugins('AdminCourseContents') as $plugin) {
+            foreach (PluginManager::getInstance()->getPlugins(AdminCourseContents::class) as $plugin) {
                 foreach ($plugin->adminAvailableContents() as $index => $label) {
                     if (in_array($plugin->getPluginId() . "_" . $index, $filter_config)) {
                         $captions[$plugin->getPluginId() . "_" . $index] = $label;
@@ -1446,7 +1446,7 @@ class Admin_CoursesController extends AuthenticatedController
 
         ksort($actions);
 
-        foreach (PluginManager::getInstance()->getPlugins('AdminCourseAction') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(AdminCourseAction::class) as $plugin) {
             $actions[get_class($plugin)] = [
                 'name'      => $plugin->getPluginName(),
                 'title'     => $plugin->getPluginName(),
@@ -1486,7 +1486,7 @@ class Admin_CoursesController extends AuthenticatedController
             'contents'      => _('Inhalt'),
             'last_activity' => _('Letzte Aktivität'),
         ];
-        foreach (PluginManager::getInstance()->getPlugins('AdminCourseContents') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(AdminCourseContents::class) as $plugin) {
             foreach ($plugin->adminAvailableContents() as $index => $label) {
                 $views[$plugin->getPluginId() . "_" . $index] = $label;
             }
diff --git a/app/controllers/admin/extern.php b/app/controllers/admin/extern.php
index 559868e3351ec66cde90222ac9256240b801ab7f..732b58611332a46f3b566508db5adf3ccbb5d47b 100644
--- a/app/controllers/admin/extern.php
+++ b/app/controllers/admin/extern.php
@@ -440,7 +440,7 @@ class Admin_ExternController extends AuthenticatedController
      */
     protected function fetchPlugins(bool $is_system): void
     {
-        $plugins = PluginEngine::getPlugins('ExternPagePlugin');
+        $plugins = PluginEngine::getPlugins(ExternPagePlugin::class);
         foreach ($plugins as $plugin) {
             if (
                 $is_system === $plugin->isSystemPage()
diff --git a/app/controllers/admin/sem_classes.php b/app/controllers/admin/sem_classes.php
index c0b098f89d873c4cf4d194bab1408efdfafe4809..7993c4b308d8ebfd3034fd8b6e52cf2add0cd509 100644
--- a/app/controllers/admin/sem_classes.php
+++ b/app/controllers/admin/sem_classes.php
@@ -65,7 +65,7 @@ class Admin_SemClassesController extends AuthenticatedController
     {
         Navigation::activateItem("/admin/locations/sem_classes");
 
-        $plugins = PluginManager::getInstance()->getPlugins("StudipModule");
+        $plugins = PluginManager::getInstance()->getPlugins(StudipModule::class);
         $this->sem_class = SemClass::getClasses()[Request::get("id")];
         $modules = [];
         foreach ($this->sem_class->getModuleObjects() as $plugin) {
diff --git a/app/controllers/admin/user.php b/app/controllers/admin/user.php
index 214c2908b640eb45531dd9470382354453bb33bb..54aa0c489f7faae0f4d797a82b80c1ea65866d83 100644
--- a/app/controllers/admin/user.php
+++ b/app/controllers/admin/user.php
@@ -1474,7 +1474,7 @@ class Admin_UserController extends AuthenticatedController
             'details' => "files",
         ];
 
-        foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
             $table     = $plugin->getEntryTableInfo();
             $queries[] = [
                 'desc'  => $plugin->getPluginName() . ' - ' . _("Anzahl der Postings"),
diff --git a/app/controllers/blubber.php b/app/controllers/blubber.php
index 6588014be44208be81ff1e8d515f7c62a21f5124..aedf9b64081e3ec3444a9e3101c6b225ed6242bb 100644
--- a/app/controllers/blubber.php
+++ b/app/controllers/blubber.php
@@ -419,7 +419,7 @@ class BlubberController extends AuthenticatedController
 
             PluginManager::getInstance()->setPluginActivated(
                 PluginManager::getInstance()
-                    ->getPlugin('Blubber')
+                    ->getPlugin(Blubber::class)
                     ->getPluginId(),
                 $course->getId(),
                 true
diff --git a/app/controllers/contents/courseware.php b/app/controllers/contents/courseware.php
index f0d502320f67e01ddc1a631729e877997c73c201..c1d807f314d71aa22f2434db3b5ba7317f9d4220 100644
--- a/app/controllers/contents/courseware.php
+++ b/app/controllers/contents/courseware.php
@@ -262,7 +262,7 @@ class Contents_CoursewareController extends CoursewareController
      */
     private function isCoursewareEnabled($course_id): bool
     {
-        $studip_module = PluginManager::getInstance()->getPlugin('CoursewareModule');
+        $studip_module = PluginManager::getInstance()->getPlugin(CoursewareModule::class);
 
         if (!$studip_module || !$studip_module->isActivated($course_id)) {
             return false;
diff --git a/app/controllers/course/contentmodules.php b/app/controllers/course/contentmodules.php
index df397cdf42fac99909c43e7168da6bb0d1ae9f14..d37d1bb050aea1d76ea2eab34f8bc2322120cb86 100644
--- a/app/controllers/course/contentmodules.php
+++ b/app/controllers/course/contentmodules.php
@@ -273,7 +273,7 @@ class Course_ContentmodulesController extends AuthenticatedController
     {
         $list = [];
 
-        foreach (PluginEngine::getPlugins('StudipModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(StudipModule::class) as $plugin) {
             if (!$plugin->isActivatableForContext($context)) {
                 continue;
             }
diff --git a/app/controllers/course/overview.php b/app/controllers/course/overview.php
index 402137e9a4941868bc974e8f49153da7ccdb0e90..876de5ada18f4a17a4d91e33633726766e967402 100644
--- a/app/controllers/course/overview.php
+++ b/app/controllers/course/overview.php
@@ -111,7 +111,7 @@ class Course_OverviewController extends AuthenticatedController
             $this->avatar   = StudygroupAvatar::getAvatar($this->course_id);
         }
 
-        $this->plugins = PluginEngine::getPlugins('StandardPlugin', $this->course_id);
+        $this->plugins = PluginEngine::getPlugins(StandardPlugin::class, $this->course_id);
 
         $sidebar = Sidebar::get();
 
diff --git a/app/controllers/course/wiki.php b/app/controllers/course/wiki.php
index cbd63cf5c0f28dae9b61ca16bc3418f81bd88c52..0bb6c717b25057551cc7082536d4f5aee9f4e999 100644
--- a/app/controllers/course/wiki.php
+++ b/app/controllers/course/wiki.php
@@ -18,7 +18,7 @@ class Course_WikiController extends AuthenticatedController
         parent::before_filter($action, $args);
         object_set_visit_module('wiki');
         $this->range = Context::get();
-        $this->plugin = PluginManager::getInstance()->getPlugin('CoreWiki');
+        $this->plugin = PluginManager::getInstance()->getPlugin(CoreWiki::class);
 
         PageLayout::setTitle(Navigation::getItem('/course/wiki')->getTitle());
     }
diff --git a/app/controllers/file.php b/app/controllers/file.php
index bebfe70ebf8253214244f45aaad40e3c48f11dbe..11b1949f7d09062fe33ae1f500cb73874b3e1f2c 100644
--- a/app/controllers/file.php
+++ b/app/controllers/file.php
@@ -1103,7 +1103,7 @@ class FileController extends AuthenticatedController
                     return;
                 }
 
-                $this->library_plugins = $plugin_manager->getPlugins('LibraryPlugin');
+                $this->library_plugins = $plugin_manager->getPlugins(LibraryPlugin::class);
 
                 //Build the query parameter array:
                 $search_parameters = [];
@@ -1182,7 +1182,7 @@ class FileController extends AuthenticatedController
                 );
             }
         } elseif (Request::get('search_id')) {
-            $this->library_plugins = $plugin_manager->getPlugins('LibraryPlugin');
+            $this->library_plugins = $plugin_manager->getPlugins(LibraryPlugin::class);
 
             $this->search_id = Request::get('search_id');
             $this->page = Request::get('page');
@@ -1462,7 +1462,7 @@ class FileController extends AuthenticatedController
                 $this->current_folder = $this->to_folder_type;
                 $this->marked_element_ids = [];
 
-                $plugins = PluginManager::getInstance()->getPlugins('FileUploadHook');
+                $plugins = PluginManager::getInstance()->getPlugins(FileUploadHook::class);
 
                 $redirects = [];
                 foreach ($plugins as $plugin) {
@@ -1685,7 +1685,7 @@ class FileController extends AuthenticatedController
                         );
                     }
 
-                    $plugins = PluginManager::getInstance()->getPlugins('FileUploadHook');
+                    $plugins = PluginManager::getInstance()->getPlugins(FileUploadHook::class);
                     $redirect = null;
                     foreach ($plugins as $upload_hook_plugin) {
                         $url = $upload_hook_plugin->getAdditionalUploadWizardPage($file_ref);
@@ -1820,7 +1820,7 @@ class FileController extends AuthenticatedController
 
                     $payload['html'][] = FilesystemVueDataManager::getFileVueData($this->file, $this->top_folder);
 
-                    $plugins = PluginManager::getInstance()->getPlugins('FileUploadHook');
+                    $plugins = PluginManager::getInstance()->getPlugins(FileUploadHook::class);
 
                     $redirects = [];
                     foreach ($plugins as $plugin) {
diff --git a/app/controllers/files.php b/app/controllers/files.php
index 3c77f4e50d77b3d2762ccb3778da1735ebd4c4d1..2d4de4e1593e1ed4cb01ded418c69d70584f2d53 100644
--- a/app/controllers/files.php
+++ b/app/controllers/files.php
@@ -68,7 +68,7 @@ class FilesController extends AuthenticatedController
             $this->url_for("files/index"),
             Icon::create("files", "clickable")
         );
-        foreach (PluginManager::getInstance()->getPlugins('FilesystemPlugin') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(FilesystemPlugin::class) as $plugin) {
             if ($plugin->isPersonalFileArea()) {
                 $subnav = $plugin->getFileSelectNavigation();
                 $sources->addLink(
@@ -110,7 +110,7 @@ class FilesController extends AuthenticatedController
         }
 
         $config_urls = [];
-        foreach (PluginManager::getInstance()->getPlugins('FilesystemPlugin') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(FilesystemPlugin::class) as $plugin) {
             $url = $plugin->filesystemConfigurationURL();
             if ($url) {
                 $navigation = $plugin->getFileSelectNavigation();
@@ -647,7 +647,7 @@ class FilesController extends AuthenticatedController
         PageLayout::setTitle(_('Dateibereich zur Konfiguration auswählen'));
 
         $this->configure_urls = [];
-        foreach (PluginManager::getInstance()->getPlugins('FilesystemPlugin') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(FilesystemPlugin::class) as $plugin) {
             $url = $plugin->filesystemConfigurationURL();
             if ($url) {
                 $navigation = $plugin->getFileSelectNavigation();
diff --git a/app/controllers/institute/basicdata.php b/app/controllers/institute/basicdata.php
index fb1ce9652b9505da893c630efaf13342103aab88..9c800fdbbaa335d182d257f3f6d231b578182cfa 100644
--- a/app/controllers/institute/basicdata.php
+++ b/app/controllers/institute/basicdata.php
@@ -435,7 +435,7 @@ class Institute_BasicdataController extends AuthenticatedController
             }
 
             // delete all contents in forum-modules
-            foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+            foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
                 $plugin->deleteContents($i_id);  // delete content irrespective of plugin-activation in the seminar
                 if ($plugin->isActivated($i_id)) {   // only show a message, if the plugin is activated, to not confuse the user
                     $details[] = sprintf(_('Einträge in %s gelöscht.'), $plugin->getPluginName());
diff --git a/app/controllers/privacy.php b/app/controllers/privacy.php
index ba8e6f1a004fe2338ec54180ad5f26d6c81aee0b..d50b1f1bd1d89f0b38e50366df33c57e140582b3 100644
--- a/app/controllers/privacy.php
+++ b/app/controllers/privacy.php
@@ -305,7 +305,7 @@ class PrivacyController extends AuthenticatedController
             $storage->addFileRef($fileref);
         }
 
-        foreach (PluginEngine::getPlugins('PrivacyPlugin') as $plugin) {
+        foreach (PluginEngine::getPlugins(PrivacyPlugin::class) as $plugin) {
             $plugin->exportUserData($storage);
         }
 
diff --git a/app/controllers/profile.php b/app/controllers/profile.php
index 3fa377728369965b0f43cce1ecbf52e8ab6f6106..b9a7cf737109dc20cf58619f7300aecaf2e23e07 100644
--- a/app/controllers/profile.php
+++ b/app/controllers/profile.php
@@ -210,7 +210,7 @@ class ProfileController extends AuthenticatedController
         }
 
         // Hompageplugins
-        $homepageplugins = PluginEngine::getPlugins('HomepagePlugin');
+        $homepageplugins = PluginEngine::getPlugins(HomepagePlugin::class);
 
         $render = '';
         $layout = $GLOBALS['template_factory']->open('shared/content_box');
diff --git a/app/controllers/profilemodules.php b/app/controllers/profilemodules.php
index 201c4ffaab2ad975445ea8617ad43c80a0889f4f..c24d4f413bb20785cec3a0887f3dcdfd92fb6d08 100644
--- a/app/controllers/profilemodules.php
+++ b/app/controllers/profilemodules.php
@@ -106,7 +106,7 @@ class ProfileModulesController extends AuthenticatedController
         $plugins = [];
 
         // Get homepage plugins from database.
-        foreach (PluginEngine::getPlugins('HomepagePlugin') as $plugin) {
+        foreach (PluginEngine::getPlugins(HomepagePlugin::class) as $plugin) {
             if ($plugin->isActivatableForContext($this->user)) {
                 $plugins[$plugin->getPluginId()] = $plugin;
             }
diff --git a/app/controllers/questionnaire.php b/app/controllers/questionnaire.php
index 6f805260300349cef016c1adad0c1fb60f94177a..4016b9dd04e5602369e28406c2ac550fd73cdf39 100644
--- a/app/controllers/questionnaire.php
+++ b/app/controllers/questionnaire.php
@@ -493,7 +493,7 @@ class QuestionnaireController extends AuthenticatedController
                 $course_assignment['user_id'] = $GLOBALS['user']->id;
                 $course_assignment->store();
             }
-            foreach (PluginManager::getInstance()->getPlugins("QuestionnaireAssignmentPlugin") as $plugin) {
+            foreach (PluginManager::getInstance()->getPlugins(QuestionnaireAssignmentPlugin::class) as $plugin) {
                 $plugin->storeQuestionnaireAssignments($this->questionnaire);
             }
 
diff --git a/app/controllers/quickselection.php b/app/controllers/quickselection.php
index 1899e539d9b38a2482b6781683265c4b7be791a6..a53eb080666bec8d4fb6e5046a427fdfa7ad6a7d 100644
--- a/app/controllers/quickselection.php
+++ b/app/controllers/quickselection.php
@@ -27,7 +27,7 @@ class QuickselectionController extends AuthenticatedController
 
         UserConfig::get($GLOBALS['user']->id)->store('QUICK_SELECTION', $names);
 
-        $template = PluginEngine::getPlugin('QuickSelection')->getPortalTemplate();
+        $template = PluginEngine::getPlugin(QuickSelection::class)->getPortalTemplate();
 
         $this->response->add_header('X-Dialog-Close', 1);
         $this->response->add_header('X-Dialog-Execute', 'STUDIP.QuickSelection.update');
diff --git a/app/controllers/start.php b/app/controllers/start.php
index 53a87dc796ad92cfd51f6191e87d72d14e48795a..87c493e9406586c1f6d427b583d5f6c5a03edd9a 100644
--- a/app/controllers/start.php
+++ b/app/controllers/start.php
@@ -132,7 +132,7 @@ class StartController extends AuthenticatedController
      */
     private function getAvailableWidgets($user_id)
     {
-        $all_widgets = PluginEngine::getPlugins('PortalPlugin');
+        $all_widgets = PluginEngine::getPlugins(PortalPlugin::class);
         $user_widgets = WidgetUser::getWidgets($user_id);
         $used_widgets = array_merge(...$user_widgets);
         $available = [];
@@ -190,7 +190,7 @@ class StartController extends AuthenticatedController
 
         PageLayout::setTitle(sprintf(_('Standard-Startseite für "%s" bearbeiten'), ucfirst($permission)));
 
-        $this->widgets = PluginEngine::getPlugins('PortalPlugin');
+        $this->widgets = PluginEngine::getPlugins(PortalPlugin::class);
         $this->initial_widgets = WidgetDefault::getWidgets($permission);
         $this->permission = $permission;
     }
diff --git a/app/views/course/details/index.php b/app/views/course/details/index.php
index eb7da10f3089ff3c11985d321ea79e4362af12e5..545454a26ac97a54dd8f1e6c3e4cccf286c13f38 100644
--- a/app/views/course/details/index.php
+++ b/app/views/course/details/index.php
@@ -496,7 +496,7 @@ if (!empty($mvv_tree)) : ?>
     </article>
 <? endif ?>
 
-<? foreach (PluginManager::getInstance()->getPlugins('DetailspagePlugin') as $plugin) : ?>
+<? foreach (PluginManager::getInstance()->getPlugins(DetailspagePlugin::class) as $plugin) : ?>
     <? $template = $plugin->getDetailspageTemplate($course) ?>
     <? if ($template) : ?>
         <article class="studip">
diff --git a/app/views/file/add_files_window.php b/app/views/file/add_files_window.php
index 53a7b73f6275093986f5dfdcf7e45713f44720db..c7630c50f0cabf80e0107add873e45022a14482d 100644
--- a/app/views/file/add_files_window.php
+++ b/app/views/file/add_files_window.php
@@ -69,7 +69,7 @@ if ($folder_id) {
                     <?= _('OER Campus') ?>
                 </a>
             <? endif ?>
-            <? foreach (PluginManager::getInstance()->getPlugins('FilesystemPlugin') as $plugin) : ?>
+            <? foreach (PluginManager::getInstance()->getPlugins(FilesystemPlugin::class) as $plugin) : ?>
                 <? if ($plugin->isSource()) : ?>
                     <? $nav = $plugin->getFileSelectNavigation() ?>
                     <? if ($nav): ?>
diff --git a/app/views/file/choose_destination.php b/app/views/file/choose_destination.php
index 49afe8769c3f1593ccf942278b8135eee5144039..9a398837adc2f11eaedb766695c1c8ea50191a90 100644
--- a/app/views/file/choose_destination.php
+++ b/app/views/file/choose_destination.php
@@ -64,7 +64,7 @@ $options = array_filter([
                 </button>
             </div>
 
-        <? foreach (PluginManager::getInstance()->getPlugins('FilesystemPlugin') as $plugin) : ?>
+        <? foreach (PluginManager::getInstance()->getPlugins(FilesystemPlugin::class) as $plugin) : ?>
             <? if ($plugin->isPersonalFileArea()) : ?>
                 <? $nav = $plugin->getFileSelectNavigation() ?>
                 <? if ($nav) : ?>
diff --git a/app/views/institute/overview/index.php b/app/views/institute/overview/index.php
index 3e80f98f481aff1d7ab022530074a36e601b32b7..7ed85460c461b39669fe72a8ef72341946be7866 100644
--- a/app/views/institute/overview/index.php
+++ b/app/views/institute/overview/index.php
@@ -54,7 +54,7 @@
 
 <?
 // display plugins
-$plugins = PluginEngine::getPlugins('StandardPlugin', $institute_id);
+$plugins = PluginEngine::getPlugins(StandardPlugin::class, $institute_id);
 $layout = $GLOBALS['template_factory']->open('shared/index_box');
 
 foreach ($plugins as $plugin) {
diff --git a/app/views/questionnaire/_overview_questionnaire.php b/app/views/questionnaire/_overview_questionnaire.php
index bb7586ef8538d6970d4749e9b9dafa5e6986f969..8b45d422fe873e3ce9747ce47977154a722fb5ec 100644
--- a/app/views/questionnaire/_overview_questionnaire.php
+++ b/app/views/questionnaire/_overview_questionnaire.php
@@ -51,7 +51,7 @@
                 <?= htmlReady(Institute::find($assignment['range_id'])->name) ?>
             <? else : ?>
                 <?
-                foreach (PluginManager::getInstance()->getPlugins("QuestionnaireAssignmentPlugin") as $plugin) {
+                foreach (PluginManager::getInstance()->getPlugins(QuestionnaireAssignmentPlugin::class) as $plugin) {
                     $name = $plugin->getQuestionnaireAssignmentName($assignment);
                     if ($name) {
                         echo htmlReady($name);
diff --git a/app/views/questionnaire/context.php b/app/views/questionnaire/context.php
index 3237101c851451812f9538ea5bcc7be71f5a3279..98e08c0bd90d932427db85d3d477afc7538ef411 100644
--- a/app/views/questionnaire/context.php
+++ b/app/views/questionnaire/context.php
@@ -93,7 +93,7 @@
         <? endif ?>
 
         <?
-        foreach (PluginManager::getInstance()->getPlugins("QuestionnaireAssignmentPlugin") as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(QuestionnaireAssignmentPlugin::class) as $plugin) {
             $template = $plugin->getQuestionnaireAssignmentEditTemplate($this->questionnaire);
             if ($template) {
                 echo $template->render();
diff --git a/db/migrations/1.154_recalculate_score.php b/db/migrations/1.154_recalculate_score.php
index 5568363ea30e9a6283001dcccab7f241e58aa908..9391e7d41094444f74980bf4d30177dbc61e937a 100644
--- a/db/migrations/1.154_recalculate_score.php
+++ b/db/migrations/1.154_recalculate_score.php
@@ -130,7 +130,7 @@ class RecalculateScore extends Migration {
             'date_column' => "chdate"
         ];
 
-        foreach (PluginManager::getInstance()->getPlugins("ScorePlugin") as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(ScorePlugin::class) as $plugin) {
             foreach ((array) $plugin->getPluginActivityTables() as $table) {
                 if ($table['table']) {
                     $tables[] = $table;
diff --git a/db/migrations/1.314_step_00349.php b/db/migrations/1.314_step_00349.php
index a777cc294704e433f5c2790033ae419b0db116d7..a1094d8fc9c97e21de75a3eb292d05f58f0b2e30 100644
--- a/db/migrations/1.314_step_00349.php
+++ b/db/migrations/1.314_step_00349.php
@@ -98,8 +98,8 @@ class Step00349 extends Migration
             'participants' => 'CoreParticipants',
             'courseware' => 'CoursewareModule'
         ];
-        PluginManager::getInstance()->getPlugin('CoreForum');
-        PluginManager::getInstance()->getPlugin('Blubber');
+        PluginManager::getInstance()->getPlugin(CoreForum::class);
+        PluginManager::getInstance()->getPlugin(Blubber::class);
 
         foreach ($core_plugins as $plugin) {
             try {
diff --git a/lib/archiv.inc.php b/lib/archiv.inc.php
index 8fe4bc950e7215b1a005a2d0eae90e6e1b334983..e40685f612e57dd1aeb5dfad3bd539fb9bc6a2cb 100644
--- a/lib/archiv.inc.php
+++ b/lib/archiv.inc.php
@@ -64,7 +64,7 @@ function lastActivity ($sem_id)
                           WHERE `range_id` = :id";
         }
 
-        foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
             $table = $plugin->getEntryTableInfo();
             $queries[] = 'SELECT MAX(`'. $table['chdate'] .'`) AS chdate FROM `'. $table['table'] .'` WHERE `'. $table['seminar_id'] .'` = :id';
         }
diff --git a/lib/classes/JsonApi/RouteMap.php b/lib/classes/JsonApi/RouteMap.php
index 4f441651ba70870a8277e2e5e4c00647b00ef100..d81bbbf100b23db2735d4810e92ad3495e70a00c 100644
--- a/lib/classes/JsonApi/RouteMap.php
+++ b/lib/classes/JsonApi/RouteMap.php
@@ -122,7 +122,7 @@ class RouteMap
         $this->addAuthenticatedContactsRoutes($group);
         $this->addAuthenticatedCoursesRoutes($group);
 
-        if (\PluginManager::getInstance()->getPlugin('CoursewareModule')) {
+        if (\PluginManager::getInstance()->getPlugin(\CoursewareModule::class)) {
             $this->addAuthenticatedCoursewareRoutes($group);
         }
 
@@ -155,7 +155,7 @@ class RouteMap
 
         $group->get('/studip/properties', Routes\Studip\PropertiesIndex::class);
 
-        if (\PluginManager::getInstance()->getPlugin('CoursewareModule')) {
+        if (\PluginManager::getInstance()->getPlugin(\CoursewareModule::class)) {
             $group->get('/public/courseware/{link_id}/courseware-structural-elements/{id}', Routes\Courseware\PublicStructuralElementsShow::class);
             $group->get('/public/courseware/{link_id}/courseware-structural-elements', Routes\Courseware\PublicStructuralElementsIndex::class);
         }
diff --git a/lib/classes/Metrics.php b/lib/classes/Metrics.php
index c3874d5d4a1ab0ffe2e7dbd7a535c805c3982c20..e6a2925df7562293b6d52e52a164c30a6125000f 100644
--- a/lib/classes/Metrics.php
+++ b/lib/classes/Metrics.php
@@ -191,7 +191,7 @@ class Metrics {
 
         // cache the activated MetricsPlugins
         if (!self::$metricPlugins) {
-            self::$metricPlugins = \PluginEngine::getPlugins('MetricsPlugin');
+            self::$metricPlugins = \PluginEngine::getPlugins(MetricsPlugin::class);
         }
 
         // call every MetricPlugin
diff --git a/lib/classes/MyRealmModel.php b/lib/classes/MyRealmModel.php
index ab9aa20877e2574740689a03cfc440ccf4f9073a..8997e780bef971c45fe3b3cbab17c12a98fdbea8 100644
--- a/lib/classes/MyRealmModel.php
+++ b/lib/classes/MyRealmModel.php
@@ -475,7 +475,7 @@ class MyRealmModel
     public static function setObjectVisits($object, $user_id, $timestamp = null)
     {
         // load plugins, so they have a chance to register themselves as observers
-        PluginEngine::getPlugins('StandardPlugin');
+        PluginEngine::getPlugins(StandardPlugin::class);
 
         // Update news and votes
         $query = "INSERT INTO object_user_visits
diff --git a/lib/classes/Privacy.php b/lib/classes/Privacy.php
index 0ba296a52c3f830dc857de3ab1307e22093bdfd6..b38838ccc0d161053f1184f08d10124deca2dd23 100644
--- a/lib/classes/Privacy.php
+++ b/lib/classes/Privacy.php
@@ -114,7 +114,7 @@ class Privacy
         }
 
         if (!$section || $section === 'plugins') {
-            foreach (PluginEngine::getPlugins('PrivacyPlugin') as $plugin) {
+            foreach (PluginEngine::getPlugins(PrivacyPlugin::class) as $plugin) {
                 $plugin->exportUserData($storage);
             }
         }
diff --git a/lib/classes/Score.class.php b/lib/classes/Score.class.php
index f7d8ea34271e927f88a8b61497ce5ef90484ee05..4d114d5d4b547cb2a0b25aa18239b1695d9d89e1 100644
--- a/lib/classes/Score.class.php
+++ b/lib/classes/Score.class.php
@@ -212,7 +212,7 @@ class Score
             'date_column' => 'chdate'
         ];
 
-        foreach (PluginManager::getInstance()->getPlugins('ScorePlugin') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(ScorePlugin::class) as $plugin) {
             foreach ((array) $plugin->getPluginActivityTables() as $table) {
                 if ($table['table']) {
                     $tables[] = $table;
diff --git a/lib/classes/Seminar.class.php b/lib/classes/Seminar.class.php
index dda25ee0ffd59a515756b4f9f404e69d4566e66c..8aa3d412b7594899be3c54a1d5e12e1656cb2265 100644
--- a/lib/classes/Seminar.class.php
+++ b/lib/classes/Seminar.class.php
@@ -1565,7 +1565,7 @@ class Seminar
         SeminarCycleDate::deleteBySQL('seminar_id = ' . DBManager::get()->quote($s_id));
 
         // Alle weiteren Postings zu diesem Seminar in den Forums-Modulen löschen
-        foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
             $plugin->deleteContents($s_id);  // delete content irrespective of plugin-activation in the seminar
 
             if ($plugin->isActivated($s_id)) {   // only show a message, if the plugin is activated, to not confuse the user
diff --git a/lib/classes/Siteinfo.php b/lib/classes/Siteinfo.php
index 9043ce36db8962773bf84babe56afce21f68dcbe..0d849ca07d962ca2710e0c45e80bbe8ac1a6bb8e 100644
--- a/lib/classes/Siteinfo.php
+++ b/lib/classes/Siteinfo.php
@@ -480,7 +480,7 @@ class SiteinfoMarkupEngine {
                 // get TopTen of seminars from all ForumModules and add up the
                 // count for seminars with more than one active ForumModule
                 // to get a combined toplist
-                foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+                foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
                     $new_seminars = $plugin->getTopTenSeminars();
                     foreach ($new_seminars as $sem) {
                         if (!isset($seminars[$sem['seminar_id']])) {
@@ -589,7 +589,7 @@ class SiteinfoMarkupEngine {
             $count = 0;
 
             // sum up number of postings for all availabe ForumModules
-            foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+            foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
                 $count += $plugin->getNumberOfPostings();
             }
 
diff --git a/lib/classes/StudipKing.class.php b/lib/classes/StudipKing.class.php
index 3a61c577f987ddd01dd9aa2542f9a258444e5b71..ae5a14e76865a5ce6bb7b6b96c66da6c56a90a0c 100644
--- a/lib/classes/StudipKing.class.php
+++ b/lib/classes/StudipKing.class.php
@@ -118,7 +118,7 @@ class StudipKing {
         $kings = [];
 
         // sum up postings for all users from all ForumModules available
-        foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
             $table = $plugin->getEntryTableInfo();
             $query = "SELECT user_id AS id, COUNT(*) AS num FROM ". $table['table'] ." GROUP BY user_id";
             $new_kings = self::select_kings($query);
diff --git a/lib/classes/UserManagement.class.php b/lib/classes/UserManagement.class.php
index 780559415e4aca5ff7c437ac7d880150f897677b..015e6cd491a8c76c759b8e62c177b92fbc8749b3 100644
--- a/lib/classes/UserManagement.class.php
+++ b/lib/classes/UserManagement.class.php
@@ -898,7 +898,7 @@ class UserManagement
 
         // Load privacy plugins to ensure all event handlers can react to the
         // UserDataDidRemove event
-        PluginEngine::getPlugins('PrivacyPlugin');
+        PluginEngine::getPlugins(PrivacyPlugin::class);
 
         // delete user from instituts
         $this->logInstUserDel($this->user_data['auth_user_md5.user_id']);
diff --git a/lib/classes/Visibility.php b/lib/classes/Visibility.php
index 1b8723011523852c6c1269117b08035befa0bc49..99b3907e4fd6866178d88f616b3c9dfc5381be0d 100644
--- a/lib/classes/Visibility.php
+++ b/lib/classes/Visibility.php
@@ -614,7 +614,7 @@ class Visibility
     private function createHomepagePluginEntries($user)
     {
         self::getUser($user);
-        $homepageplugins = PluginEngine::getPlugins('HomepagePlugin');
+        $homepageplugins = PluginEngine::getPlugins(HomepagePlugin::class);
         foreach ($homepageplugins as $plugin) {
             self::addPrivacySetting($plugin->getPluginName(), ("plugin".$plugin->getPluginId()), 'plugins', 1, $user, null, $plugin->getPluginId());
         }
diff --git a/lib/classes/WidgetHelper.php b/lib/classes/WidgetHelper.php
index ba82ee9a1dc590e23b007cd6ac46d53e3d39aecf..ff4d7a61268e663f4a33fe43e1f2eab50489a21f 100644
--- a/lib/classes/WidgetHelper.php
+++ b/lib/classes/WidgetHelper.php
@@ -348,7 +348,7 @@ class WidgetHelper
      */
     public static function getAvailableWidgets($user_id = null)
     {
-        $all_widgets = PluginEngine::getPlugins('PortalPlugin');
+        $all_widgets = PluginEngine::getPlugins(PortalPlugin::class);
 
         $used_widgets = is_null($user_id)
                 ? []
diff --git a/lib/extern/ExternPage.php b/lib/extern/ExternPage.php
index 308caebad8b82624f9af234acc1f508050487f3e..d3c5ec2cdf6a9bdaf0ce96fb168879538fe8832b 100644
--- a/lib/extern/ExternPage.php
+++ b/lib/extern/ExternPage.php
@@ -110,7 +110,7 @@ abstract class ExternPage
         $page_name = 'ExternPage' . $config->type;
         if (!class_exists($page_name)) {
             // lookup plugins
-            $plugins = PluginEngine::getPlugins('ExternPagePlugin');
+            $plugins = PluginEngine::getPlugins(ExternPagePlugin::class);
             foreach ($plugins as $plugin) {
                 if ($config->type === $plugin->getExternPageName()) {
                     return $plugin->getExternPage($config);
diff --git a/lib/extern/ExternPagePersonDetails.php b/lib/extern/ExternPagePersonDetails.php
index 49c754c16a178796710ec23c417680b00beb930a..8fb654044044173fec6ebd457205d940761af2ca 100644
--- a/lib/extern/ExternPagePersonDetails.php
+++ b/lib/extern/ExternPagePersonDetails.php
@@ -439,7 +439,7 @@ class ExternPagePersonDetails extends ExternPage
     private function getContentHomepagePlugins(User $user)
     {
         $content = [];
-        $plugins = PluginEngine::getPlugins('HomepagePlugin');
+        $plugins = PluginEngine::getPlugins(HomepagePlugin::class);
         foreach ($plugins as $plugin) {
             $template = $plugin->getHomepageTemplate($user->id);
             if ($template) {
diff --git a/lib/filesystem/LibraryFile.class.php b/lib/filesystem/LibraryFile.class.php
index 0c2bcb68b89323b0a7ff9448f0800ae48cb1bc13..c9524e32caea5e2563a656a59336011526a87fad 100644
--- a/lib/filesystem/LibraryFile.class.php
+++ b/lib/filesystem/LibraryFile.class.php
@@ -212,7 +212,7 @@ class LibraryFile extends StandardFile
         );
         if (Config::get()->LITERATURE_ENABLE && Context::get() && $GLOBALS['perm']->have_studip_perm('tutor', Context::getId())) {
             $plugin_manager = PluginManager::getInstance();
-            $library_plugins = $plugin_manager->getPlugins('LibraryPlugin');
+            $library_plugins = $plugin_manager->getPlugins(LibraryPlugin::class);
             if (count($library_plugins)) {
                 $plugin = $library_plugins[0];
                 $action_menu->addLink(
diff --git a/lib/models/BlubberThread.php b/lib/models/BlubberThread.php
index aa6016fc4615b4dbf321eaeb00da6c4936ac58fd..590a600e4a884dd7d51563c49e6a6b1acfb456b7 100644
--- a/lib/models/BlubberThread.php
+++ b/lib/models/BlubberThread.php
@@ -1081,7 +1081,7 @@ class BlubberThread extends SimpleORMap implements PrivacyObject
                   FROM user_inst
                   WHERE user_id = ?";
         $institut_ids = DBManager::get()->fetchFirst($query, [$user_id]);
-        $blubberplugin = PluginManager::getInstance()->getPlugin("Blubber");
+        $blubberplugin = PluginManager::getInstance()->getPlugin(Blubber::class);
         if (!$blubberplugin) {
             return [];
         }
diff --git a/lib/models/Questionnaire.php b/lib/models/Questionnaire.php
index f29a2de7f1b005bb19ba730913ccdd9b1fd6e62e..777182d4733ab7b30f581bbc22627ceb20edca8c 100644
--- a/lib/models/Questionnaire.php
+++ b/lib/models/Questionnaire.php
@@ -129,7 +129,7 @@ class Questionnaire extends SimpleORMap implements PrivacyObject
                 return true;
             } else {
                 //now look through all plugin if this assignment is related to plugin contents:
-                foreach (PluginManager::getInstance()->getPlugins("QuestionnaireAssignmentPlugin") as $plugin) {
+                foreach (PluginManager::getInstance()->getPlugins(QuestionnaireAssignmentPlugin::class) as $plugin) {
                     if ($plugin->isQuestionnaireViewable($assignment)) {
                         return true;
                     }
@@ -172,7 +172,7 @@ class Questionnaire extends SimpleORMap implements PrivacyObject
                     return true;
                 } else {
                     //now look through all plugin if this assignment is related to plugin contents:
-                    foreach (PluginManager::getInstance()->getPlugins("QuestionnaireAssignmentPlugin") as $plugin) {
+                    foreach (PluginManager::getInstance()->getPlugins(QuestionnaireAssignmentPlugin::class) as $plugin) {
                         if ($plugin->isQuestionnaireEditable($assignment)) {
                             return true;
                         }
diff --git a/lib/models/User.class.php b/lib/models/User.class.php
index b71464cf3d2e79dc9ba48ed4cf6bcf0ef79ce9d8..a9dbc14d4a3cd21fda004cb70305a42b78d2113a 100644
--- a/lib/models/User.class.php
+++ b/lib/models/User.class.php
@@ -1189,7 +1189,7 @@ class User extends AuthUserMd5 implements Range, PrivacyObject, Studip\Calendar\
         // Restliche Daten übertragen
 
         // ForumsModule migrieren
-        foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
             $plugin->migrateUser($old_id, $new_id);
         }
 
diff --git a/lib/navigation/AdminNavigation.php b/lib/navigation/AdminNavigation.php
index a1762c6742522be7db7b97682007c8ea77cef950..a72508228c1d4fa66bd6eda787ed6b1452f41c84 100644
--- a/lib/navigation/AdminNavigation.php
+++ b/lib/navigation/AdminNavigation.php
@@ -126,7 +126,7 @@ class AdminNavigation extends Navigation
                 $navigation->addSubNavigation('banner', new Navigation(_('Werbebanner'), 'dispatch.php/admin/banner'));
             }
 
-            if (PluginManager::getInstance()->getPlugin('CoursewareModule')) {
+            if (PluginManager::getInstance()->getPlugin(CoursewareModule::class)) {
                 $navigation->addSubNavigation(
                     'courseware',
                     new Navigation(
diff --git a/lib/navigation/ContentsNavigation.php b/lib/navigation/ContentsNavigation.php
index f6190e2f3e90cf10c2bd0ce690ea3b33df8e830d..a00adb6e07a7a7318a0da10f0ea5e2c414fccc8a 100644
--- a/lib/navigation/ContentsNavigation.php
+++ b/lib/navigation/ContentsNavigation.php
@@ -42,7 +42,7 @@ class ContentsNavigation extends Navigation
 
         $this->addSubNavigation('overview', $overview);
 
-        if (PluginManager::getInstance()->getPlugin('CoursewareModule')) {
+        if (PluginManager::getInstance()->getPlugin(CoursewareModule::class)) {
             $courseware = new Navigation(_('Courseware'));
             $courseware->setDescription(_('Erstellen und Sammeln von Lernmaterialien'));
             $courseware->setImage(Icon::create('courseware'));
diff --git a/lib/navigation/ProfileNavigation.php b/lib/navigation/ProfileNavigation.php
index 50dcfec2d9be15ea866398994d3ed8913e4a8ece..4827fe4db356aa50ac7e476a011ca5ba432dba0c 100644
--- a/lib/navigation/ProfileNavigation.php
+++ b/lib/navigation/ProfileNavigation.php
@@ -139,7 +139,7 @@ class ProfileNavigation extends Navigation
 
         // Add consultations if appropriate
         if (Config::get()->CONSULTATION_ENABLED) {
-            $plugin = PluginEngine::getPlugin('ConsultationModule');
+            $plugin = PluginEngine::getPlugin(ConsultationModule::class);
             if ($current_user && $plugin && PluginManager::getInstance()->isPluginActivatedForUser($plugin->getPluginId(), $current_user->id)) {
                 $this->addSubNavigation('consultation', new ConsultationNavigation($current_user));
             }
diff --git a/lib/navigation/StartNavigation.php b/lib/navigation/StartNavigation.php
index acd5ee32d607e19af3da9bcdae17bf19f5abf7f6..0a6d52afa402e4a9b7d177badc669b2ea1207806 100644
--- a/lib/navigation/StartNavigation.php
+++ b/lib/navigation/StartNavigation.php
@@ -222,7 +222,7 @@ class StartNavigation extends Navigation
         // contents
         $navigation = new Navigation(_('Mein Arbeitsplatz'), 'dispatch.php/contents/overview');
 
-        if (PluginManager::getInstance()->getPlugin('CoursewareModule')) {
+        if (PluginManager::getInstance()->getPlugin(CoursewareModule::class)) {
             $navigation->addSubNavigation('courseware',
                 new Navigation(_('Courseware'), 'dispatch.php/contents/courseware'));
         }
diff --git a/lib/plugins/engine/PluginEngine.class.php b/lib/plugins/engine/PluginEngine.class.php
index ecf00cff7903a8dd29ff731cf107a2ce53159004..25974c5063127789c6a595445d8f5d1384330974 100644
--- a/lib/plugins/engine/PluginEngine.class.php
+++ b/lib/plugins/engine/PluginEngine.class.php
@@ -3,8 +3,7 @@
 /**
  * Factory Class for the plugin engine
  * @author Dennis Reil, <dennis.reil@offis.de>
- * @package pluginengine
- * @subpackage engine
+ * @template P of StudIPPlugin
  */
 
 class PluginEngine
@@ -38,27 +37,28 @@ class PluginEngine
         global $user, $perm;
 
         // load system plugins
-        self::getPlugins('SystemPlugin');
+        self::getPlugins(SystemPlugin::class);
 
         // load homepage plugins
-        self::getPlugins('HomepagePlugin');
+        self::getPlugins(HomepagePlugin::class);
 
         // load course plugins
         if (Context::getId()) {
-            self::getPlugins('StudipModule');
-            self::getPlugins('StandardPlugin');
+            self::getPlugins(StudipModule::class);
+            self::getPlugins(StandardPlugin::class);
         }
 
         // load admin plugins
         if (is_object($user) && $perm->have_perm('admin')) {
-            self::getPlugins('AdministrationPlugin');
+            self::getPlugins(AdministrationPlugin::class);
         }
     }
 
     /**
      * Get instance of the plugin specified by plugin class name.
      *
-     * @param string $class class name of plugin
+     * @param class-string<P> $class class name of plugin
+     * @return P
      */
     public static function getPlugin ($class)
     {
@@ -70,10 +70,9 @@ class PluginEngine
      * returns all enabled plugins. The optional context parameter can be
      * used to get only plugins that are activated in the given context.
      *
-     * @template T
-     * @param T $type plugin type or null (all types)
+     * @param class-string<P>|null $type plugin type or null (all types)
      * @param string $context context range id (optional)
-     * @return T[] all plugins of the specified type
+     * @return P[]|StudIPPlugin[] all plugins of the specified type
      */
     public static function getPlugins ($type, $context = null)
     {
diff --git a/lib/plugins/engine/PluginManager.class.php b/lib/plugins/engine/PluginManager.class.php
index f08b5fa4064acb711de9f4b4b98f7714a709c727..fc81d7f36efef9ee632b2375136a9d0a481df080 100644
--- a/lib/plugins/engine/PluginManager.class.php
+++ b/lib/plugins/engine/PluginManager.class.php
@@ -1,14 +1,11 @@
 <?php
-# Lifter010: TODO
-/*
+/**
  * PluginManager.class.php - plugin manager for Stud.IP
  *
- * Copyright (c) 2009  Elmar Ludwig
+ * @copyright  2009  Elmar Ludwig
+ * @license GPL2 or any later version
  *
- * 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.
+ * @template P of StudIPPlugin
  */
 
 class PluginManager
@@ -576,7 +573,7 @@ class PluginManager
      * Get instance of the plugin specified by plugin meta data.
      *
      * @param array $plugin_info plugin meta data
-     * @return object
+     * @return P
      */
     protected function getCachedPlugin ($plugin_info)
     {
@@ -603,8 +600,8 @@ class PluginManager
     /**
      * Get instance of the plugin specified by plugin class name.
      *
-     * @param string $class class name of plugin
-     * @return object
+     * @param class-string<P> $class class name of plugin
+     * @return P|null
      */
     public function getPlugin ($class)
     {
@@ -623,7 +620,7 @@ class PluginManager
      * Get instance of the plugin specified by plugin id.
      *
      * @param int $id id of the plugin
-     * @return object $plugin
+     * @return P|null $plugin
      */
     public function getPluginById ($id)
     {
@@ -643,8 +640,9 @@ class PluginManager
      * returns all enabled plugins. The optional context parameter can be
      * used to get only plugins that are activated in the given context.
      *
-     * @param string $type plugin type or null (all types)
+     * @param class-string<P>|null $type plugin type or null (all types)
      * @param string $context context range id (optional)
+     * @return P[]|StudIPPlugin[]
      */
     public function getPlugins ($type, $context = null)
     {
diff --git a/public/api.php b/public/api.php
index b2d30fa23510f09bdb35d0413802f1e4d30e85fa..9f7863c60ed09a8579169979e10649cc529a57f2 100644
--- a/public/api.php
+++ b/public/api.php
@@ -43,7 +43,7 @@ namespace RESTAPI {
         require 'lib/bootstrap-api.php';
 
         // Initialize RESTAPI plugins
-        \PluginEngine::getPlugins('RESTAPIPlugin');
+        \PluginEngine::getPlugins(RESTAPIPlugin::class);
 
         $uri = \Request::pathInfo();