diff --git a/src/lib/legacy/viewplugins/function.adminpanelmenu.php b/src/lib/legacy/viewplugins/function.adminpanelmenu.php
index 307b8cb31e..fb28ad7f54 100644
--- a/src/lib/legacy/viewplugins/function.adminpanelmenu.php
+++ b/src/lib/legacy/viewplugins/function.adminpanelmenu.php
@@ -43,6 +43,7 @@ function smarty_function_adminpanelmenu($params, Zikula_View $view)
     // add override for panel width created from .scss file
     PageUtil::addVar('stylesheet', '@ZikulaAdminModule/Resources/public/css/mmenu-hiddenpanel-customwidth.css');
 
+    $router = $view->getContainer()->get('router');
     $modules = ModUtil::getModulesCapableOf('admin');
     // sort modules by displayname
     $moduleNames = array();
@@ -60,11 +61,9 @@ function smarty_function_adminpanelmenu($params, Zikula_View $view)
         if (SecurityUtil::checkPermission("module[name]::", '::', ACCESS_EDIT)) {
             // first-level list - list modules with general 'index' link
             $img = ModUtil::getModuleImagePath($module['name']);
-            try {
-                $url = ModUtil::url($module['name'], 'admin', 'index');
-            } catch (\Exception $e) {
-                $url = '#';
-            }
+            $url = isset($module['capabilities']['admin']['url'])
+                ? $module['capabilities']['admin']['url']
+                : $router->generate($module['capabilities']['admin']['route']);
             $moduleSelected = empty($moduleSelected) && strpos($view->getRequest()->getUri(), $module['url']) ? " class='Selected'" : "";
             $htmlContent .= "<li{$moduleSelected}><a href=\"" . DataUtil::formatForDisplay($url) . "\"><img src=\"$img\" alt=\"\" style=\"height: 18px\" /> " . $module['displayname'] . "</a>";
             try {
@@ -72,7 +71,7 @@ function smarty_function_adminpanelmenu($params, Zikula_View $view)
             } catch (\Exception $e) {
                 $links = array();
             }
-            if (count($links) > 0) {
+            if ((count($links) > 0) && ($links[0] != false)) {
                 // create second-level list from module adminLinks
                 $htmlContent .= '<ul class="text-left">';
                 foreach ($links as $link) {
diff --git a/src/system/Zikula/Module/AdminModule/Controller/AdminController.php b/src/system/Zikula/Module/AdminModule/Controller/AdminController.php
index a84e2d4187..f4678e74ae 100644
--- a/src/system/Zikula/Module/AdminModule/Controller/AdminController.php
+++ b/src/system/Zikula/Module/AdminModule/Controller/AdminController.php
@@ -362,7 +362,7 @@ public function adminpanelAction($acid = null)
         $displayNameType = $this->getVar('displaynametype', 1);
 
         // get admin capable modules
-        $adminmodules = ModUtil::getAdminMods();
+        $adminmodules = ModUtil::getModulesCapableOf('admin');
         $adminlinks = array();
         foreach ($adminmodules as $adminmodule) {
             if (SecurityUtil::checkPermission("{$adminmodule['name']}::", 'ANY', ACCESS_EDIT)) {
@@ -371,26 +371,27 @@ public function adminpanelAction($acid = null)
                 $order = ModUtil::apiFunc('ZikulaAdminModule', 'admin', 'getSortOrder',
                         array('mid' => ModUtil::getIdFromName($adminmodule['name'])));
                 if (($catid == $acid) || (($catid == false) && ($acid == $this->getVar('defaultcategory')))) {
-                    $modinfo = ModUtil::getInfoFromName($adminmodule['name']);
-                    $menutexturl = ModUtil::url($modinfo['name'], 'admin', 'index');
+                    $menutexturl = isset($adminmodule['capabilities']['admin']['url'])
+                        ? $adminmodule['capabilities']['admin']['url']
+                        : $this->get('router')->generate($adminmodule['capabilities']['admin']['route']);
 
                     if ($displayNameType == 1) {
-                        $menutext = $modinfo['displayname'];
+                        $menutext = $adminmodule['displayname'];
                     } elseif ($displayNameType == 2) {
-                        $menutext = $modinfo['name'];
+                        $menutext = $adminmodule['name'];
                     } elseif ($displayNameType == 3) {
-                        $menutext = $modinfo['displayname'] . ' (' . $modinfo['name'] . ')';
+                        $menutext = $adminmodule['displayname'] . ' (' . $adminmodule['name'] . ')';
                     }
-                    $menutexttitle = $modinfo['description'];
+                    $menutexttitle = $adminmodule['description'];
 
                     $adminicon = ModUtil::getModuleImagePath($adminmodule['name']);
 
                     $adminlinks[] = array('menutexturl' => $menutexturl,
                             'menutext' => $menutext,
                             'menutexttitle' => $menutexttitle,
-                            'modname' => $modinfo['name'],
+                            'modname' => $adminmodule['name'],
                             'adminicon' => $adminicon,
-                            'id' => $modinfo['id'],
+                            'id' => $adminmodule['id'],
                             'order'=> $order);
                 }
             }
@@ -557,7 +558,7 @@ public function categorymenuAction($acid = null)
         }
 
         // get admin capable modules
-        $adminmodules = ModUtil::getAdminMods();
+        $adminmodules = ModUtil::getModulesCapableOf('admin');
         $adminlinks = array();
 
         foreach ($adminmodules as $adminmodule) {
@@ -565,7 +566,9 @@ public function categorymenuAction($acid = null)
                 $catid = ModUtil::apiFunc('ZikulaAdminModule', 'admin', 'getmodcategory', array('mid' => $adminmodule['id']));
                 $order = ModUtil::apiFunc('ZikulaAdminModule', 'admin', 'getSortOrder',
                                           array('mid' => ModUtil::getIdFromName($adminmodule['name'])));
-                $menutexturl = ModUtil::url($adminmodule['name'], 'admin', 'index');
+                $menutexturl = isset($adminmodule['capabilities']['admin']['url'])
+                    ? $adminmodule['capabilities']['admin']['url']
+                    : $this->get('router')->generate($adminmodule['capabilities']['admin']['route']);
                 $menutext = $adminmodule['displayname'];
                 $menutexttitle = $adminmodule['description'];
                 $adminlinks[$catid][] = array('menutexturl' => $menutexturl,
diff --git a/src/system/Zikula/Module/AdminModule/Controller/AjaxController.php b/src/system/Zikula/Module/AdminModule/Controller/AjaxController.php
index 75aada85da..3c0bc3a6f8 100644
--- a/src/system/Zikula/Module/AdminModule/Controller/AjaxController.php
+++ b/src/system/Zikula/Module/AdminModule/Controller/AjaxController.php
@@ -59,6 +59,9 @@ public function changeModuleCategoryAction()
 
         //get the module name
         $displayname = DataUtil::formatForDisplay($module['displayname']);
+        $url = isset($module['capabilities']['admin']['url'])
+            ? $module['capabilities']['admin']['url']
+            : $this->get('router')->generate($module['capabilities']['admin']['route']);
         $module = $module['name'];
         $oldcid = ModUtil::apiFunc('ZikulaAdminModule', 'admin', 'getmodcategory', array('mid' => $moduleID));
 
@@ -71,7 +74,7 @@ public function changeModuleCategoryAction()
         $output = array(
             'id' => $moduleID,
             'name' => $displayname,
-            'url' => ModUtil::url($module, 'admin', 'index'),
+            'url' => $url,
             'parentCategory' => $newParentCat,
             'oldCategory' => $oldcid,
         );
diff --git a/src/system/Zikula/Module/BlocksModule/Api/MenutreeApi.php b/src/system/Zikula/Module/BlocksModule/Api/MenutreeApi.php
index a1909b6f0f..6b9b7be099 100644
--- a/src/system/Zikula/Module/BlocksModule/Api/MenutreeApi.php
+++ b/src/system/Zikula/Module/BlocksModule/Api/MenutreeApi.php
@@ -132,7 +132,7 @@ public function adminlinks($args)
         }
 
         // Now work on admin capable modules
-        $adminmodules    = ModUtil::getAdminMods();
+        $adminmodules    = ModUtil::getModulesCapableOf('admin');
         $displayNameType = ModUtil::getVar('ZikulaAdminModule', 'displaynametype', 1);
         $default_cid     = ModUtil::getVar('ZikulaAdminModule', 'startcategory');
         $adminlinks      = array();
@@ -143,20 +143,20 @@ public function adminlinks($args)
                         array('mid' => ModUtil::getIdFromName($adminmodule['name'])));
                 $cid = (isset($catinfo[$cid])) ? $cid : $default_cid;  // make sure each module is assigned a category
 
-                $modinfo = ModUtil::getInfo(ModUtil::getIdFromName($adminmodule['name']));
-
-                if ($modinfo['type'] == 2 || $modinfo['type'] == 3) {
-                    $menutexturl = ModUtil::url($modinfo['name'], 'admin', 'index');
+                if ($adminmodule['type'] == 2 || $adminmodule['type'] == 3) {
+                    $menutexturl = isset($adminmodule['capabilities']['admin']['url'])
+                        ? $adminmodule['capabilities']['admin']['url']
+                        : $this->get('router')->generate($adminmodule['capabilities']['admin']['route']);
                 } else {
-                    $menutexturl = 'admin.php?module=' . $modinfo['name'];
+                    $menutexturl = 'admin.php?module=' . $adminmodule['name'];
                 }
 
                 if ($displayNameType == 1) {
-                    $menutext = $modinfo['displayname'];
+                    $menutext = $adminmodule['displayname'];
                 } elseif ($displayNameType == 2) {
-                    $menutext = $modinfo['name'];
+                    $menutext = $adminmodule['name'];
                 } elseif ($displayNameType == 3) {
-                    $menutext = $modinfo['displayname'] . ' (' . $modinfo['name'] . ')';
+                    $menutext = $adminmodule['displayname'] . ' (' . $adminmodule['name'] . ')';
                 }
 
                 $adminlinks[] = array(
@@ -164,7 +164,7 @@ public function adminlinks($args)
                                 'id'        => $idoffset++,
                                 'name'      => $menutext,
                                 'href'      => $menutexturl,
-                                'title'     => $modinfo['description'],
+                                'title'     => $adminmodule['description'],
                                 'className' => '',
                                 'state'     => 1,
                                 'lang'      => $lang,