diff --git a/app/controllers/admission/userlist.php b/app/controllers/admission/userlist.php
index 4c86185cddf375bf8f3110c3103535f392050c2b..683f1e272b86e78d06756cd6264d190c24187f05 100644
--- a/app/controllers/admission/userlist.php
+++ b/app/controllers/admission/userlist.php
@@ -15,7 +15,7 @@
  * @category    Stud.IP
  */
 
-class Admission_UserListController extends AuthenticatedController
+class Admission_UserlistController extends AuthenticatedController
 {
     /**
      * @see AuthenticatedController::before_filter
@@ -28,16 +28,18 @@ class Admission_UserListController extends AuthenticatedController
         Navigation::activateItem('/browse/coursesets/userlists');
         PageLayout::addScript('studip-admission.js');
 
-        $views = new ViewsWidget();
-        $views->setTitle(_('Aktionen'));
-        $views->addLink(_('Personenliste anlegen'),$this->url_for('admission/userlist/configure'))->setActive($action == 'configure');
-        Sidebar::Get()->addWidget($views);
+        Sidebar::get()->addWidget(new ActionsWidget())->addLink(
+            _('Personenliste anlegen'),
+            $this->configureURL(),
+            Icon::create('add')
+        );
     }
 
     /**
      * Show the user lists the current user has access to.
      */
-    public function index_action() {
+    public function index_action()
+    {
         $this->userlists = [];
         foreach (AdmissionUserList::getUserLists($GLOBALS['user']->id) as $list) {
             $this->userlists[$list->getId()] = $list;
@@ -50,7 +52,8 @@ class Admission_UserListController extends AuthenticatedController
      * @param String $userlistId user list to load settings from (or empty
      * if it is a new user list)
      */
-    public function configure_action($userlistId='') {
+    public function configure_action($userlistId = '')
+    {
         if ($userlistId) {
             $this->userlist = new AdmissionUserList($userlistId);
             $this->userlist_id = $userlistId;
@@ -100,7 +103,8 @@ class Admission_UserListController extends AuthenticatedController
      *
      * @param String $userlistId user list to save
      */
-    public function save_action($userlistId='') {
+    public function save_action($userlistId = '')
+    {
         CSRFProtection::verifyUnsafeRequest();
         $userlist = new AdmissionUserList($userlistId);
         $userlist->setName(Request::get('name'))
@@ -120,15 +124,13 @@ class Admission_UserListController extends AuthenticatedController
      *
      * @param String $userlistId the user list to delete
      */
-    public function delete_action($userlistId) {
-        $this->userlist = new AdmissionUserList($userlistId);
-        if (Request::int('really')) {
-            $this->userlist->delete();
-            $this->redirect($this->url_for('admission/userlist'));
-        }
-        if (Request::int('cancel')) {
-            $this->redirect($this->url_for('admission/userlist'));
-        }
+    public function delete_action($userlistId)
+    {
+        CSRFProtection::verifyUnsafeRequest();
+
+        $userlist = new AdmissionUserList($userlistId);
+        $userlist->delete();
+        $this->redirect($this->indexURL());
     }
 
     /**
diff --git a/app/views/admission/user_list/delete.php b/app/views/admission/user_list/delete.php
deleted file mode 100644
index b921e9e72eaf9df56569d1981537792fdbf3eb0e..0000000000000000000000000000000000000000
--- a/app/views/admission/user_list/delete.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-/**
- * @var AdmissionUserList $userlist
- * @var Admission_UserListController $controller
- */
-?>
-<?= QuestionBox::create(
-    sprintf(
-        _('Soll die Nutzerliste %s wirklich gelöscht werden?'),
-        htmlReady($list->getName())
-    ),
-    $controller->deleteURL($userlist->getId(), ['really' => true]),
-    $controller->deleteURL($userlist->getId(), ['cancel' => true])
-)
-?>
diff --git a/app/views/admission/user_list/index.php b/app/views/admission/user_list/index.php
deleted file mode 100644
index 645ad19bfca698d8338d73a2fc204d7085a6d39e..0000000000000000000000000000000000000000
--- a/app/views/admission/user_list/index.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * @var AdmissionUserList[] $userlists
- * @var Admission_UserListController $controller
- */
-Helpbar::get()->addPlainText(_('Info'),"Personenlisten erfassen eine Menge von Personen, die ".
-                                       "mit modifizierten Chancen in die Platzverteilung bei ".
-                                       "Anmeldeverfahren eingehen. Dies können z.B. ".
-                                       "Härtefälle sein, die bevorzugt einen Platz in ".
-                                       "Veranstaltungen erhalten sollen.");
-Helpbar::get()->addPlainText(_('Info'), "Hier sehen Sie alle Personenlisten, auf die Sie Zugriff ".
-                                        "haben.");
-?>
-
-<?php
-if ($userlists) {
-?>
-<div id="userlists">
-    <?php foreach ($userlists as $list) { ?>
-    <div id="userlist_<?= $list->getId() ?>">
-        <a href="#" onclick="return STUDIP.Admission.toggleDetails('userlist_arrow_<?= $list->getId() ?>', 'userlist_details_<?= $list->getId() ?>')">
-            <?= Icon::create('arr_1right', 'clickable')->asImg(20, ["id" => 'userlist_arrow_'.$list->getId(), "align" => 'top', "rel" => Icon::create('arr_1down', 'clickable')->asImagePath(20)]) ?>
-            <?= htmlReady($list->getName()) ?>
-        </a>
-        <a class="userlist-action"
-           href="<?= URLHelper::getURL('dispatch.php/admission/userlist/configure/'.$list->getId()); ?>">
-            <?= Icon::create('edit', 'clickable', ['title' => _('Nutzerliste bearbeiten')])->asImg(20, ["alt" => _('Nutzerliste bearbeiten')]); ?>
-        </a>
-        <a class="userlist-action" href="<?= $controller->link_for('admission/userlist/delete', $list->getId(), ['really' => true]) ?>"
-           data-confirm="<?= htmlReady(sprintf(_('Soll die Nutzerliste %s wirklich gelöscht werden?'), $list->getName())) ?>">
-            <?= Icon::create('trash', 'clickable', ['title' => _('Personenliste löschen')])->asImg(20) ?>
-        </a>
-    </div>
-    <div id="userlist_details_<?= $list->getId() ?>" style="display: none; margin-left: 20px;">
-        <?= $list->toString() ?>
-    </div>
-    <?php } ?>
-</div>
-<?php
-} else {
-?>
-<?= MessageBox::info(sprintf(_('Es wurden keine Personenlisten gefunden. Sie können eine '.
-    'neue %sPersonenliste anlegen%s.'), '<a href="'.
-    $controller->url_for('admission/userlist/configure').'">',
-    '</a>')); ?>
-<?php
-}
-?>
diff --git a/app/views/admission/user_list/configure.php b/app/views/admission/userlist/configure.php
similarity index 96%
rename from app/views/admission/user_list/configure.php
rename to app/views/admission/userlist/configure.php
index a35fd5171f18af01fc4d18c745424e1eda361487..4e5df2525ea223691f5bb4301577e352d727341a 100644
--- a/app/views/admission/user_list/configure.php
+++ b/app/views/admission/userlist/configure.php
@@ -19,12 +19,12 @@ Helpbar::get()->addPlainText(_('Info'), "Stellen Sie hier ein, wie die Chancen b
                                         "bevorzugt.");
 ?>
 <?= $error ?? '' ?>
-<form class="default" action="<?= $controller->url_for('admission/userlist/save', $userlist_id) ?>" method="post">
+<form class="default" action="<?= $controller->link_for('admission/userlist/save', $userlist_id) ?>" method="post">
     <?= CSRFProtection::tokenTag() ?>
 
     <fieldset>
         <legend>
-            <?= ($userlist_id) ? _('Personenliste bearbeiten') : _('Personenliste anlegen') ?>
+            <?= $userlist_id ? _('Personenliste bearbeiten') : _('Personenliste anlegen') ?>
         </legend>
         <label>
             <span class="required">
diff --git a/app/views/admission/userlist/index.php b/app/views/admission/userlist/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c87fdfa4615c28f1f792b017dfbded95b4fb464
--- /dev/null
+++ b/app/views/admission/userlist/index.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * @var AdmissionUserList[] $userlists
+ * @var Admission_UserListController $controller
+ */
+Helpbar::get()->addPlainText(_('Info'),"Personenlisten erfassen eine Menge von Personen, die ".
+                                       "mit modifizierten Chancen in die Platzverteilung bei ".
+                                       "Anmeldeverfahren eingehen. Dies können z.B. ".
+                                       "Härtefälle sein, die bevorzugt einen Platz in ".
+                                       "Veranstaltungen erhalten sollen.");
+Helpbar::get()->addPlainText(_('Info'), "Hier sehen Sie alle Personenlisten, auf die Sie Zugriff ".
+                                        "haben.");
+?>
+<form action="#" method="post">
+    <?= CSRFProtection::tokenTag() ?>
+
+    <table class="default">
+        <colgroup>
+            <col>
+            <col>
+            <col>
+            <col style="width: 48px">
+        </colgroup>
+        <thead>
+            <tr>
+                <th><?= _('Name') ?></th>
+                <th><?= _('Beschreibung') ?></th>
+                <th><?= _('Personen') ?></th>
+                <th></th>
+            </tr>
+        </thead>
+        <tbody>
+        <? if (empty($userlists)): ?>
+            <tr>
+                <td colspan="4" style="text-align: center;">
+                    <?= _('Es sind noch keine Personenlisten vorhanden.') ?><br>
+                    <?= Studip\LinkButton::create(
+                        _('Neue Personenliste anlegen'),
+                        $controller->configureURL()
+                    ) ?>
+                </td>
+            </tr>
+        <? endif; ?>
+        <? foreach ($userlists as $list): ?>
+            <tr id="userlist_<?= htmlReady($list->getId()) ?>">
+                <td><?= htmlReady($list->getName()) ?></td>
+                <td><?= htmlReady($list->describe()) ?></td>
+                <td><?= count($list->getUsers()) ?></td>
+                <td class="actions">
+                    <a href="<?= $controller->configure($list->getId()) ?>">
+                        <?= Icon::create('edit')->asImg(tooltip2(_('Nutzerliste bearbeiten'))) ?>
+                    </a>
+                    <?= Icon::create('trash')->asInput(tooltip2(_('Personenliste löschen')) + [
+                       'formaction' => $controller->deleteURL($list->getId()),
+                       'data-confirm' => sprintf(_('Soll die Nutzerliste %s wirklich gelöscht werden?'), $list->getName()),
+                    ]) ?>
+                </td>
+            </tr>
+        <? endforeach; ?>
+        </tbody>
+    </table>
+</form>
diff --git a/lib/classes/admission/AdmissionUserList.class.php b/lib/classes/admission/AdmissionUserList.class.php
index f45e1954e40b8454b81e4e883d4527d6313d41de..570bc62b697e1fb1e827f814538c927bedc44603 100644
--- a/lib/classes/admission/AdmissionUserList.class.php
+++ b/lib/classes/admission/AdmissionUserList.class.php
@@ -181,11 +181,23 @@ class AdmissionUserList
     /**
      * Gets all assigned user IDs.
      *
-     * @return String
+     * @param bool $as_objects Whether the users should be returned as objects
+     * @return array|User[]
      */
-    public function getUsers()
+    public function getUsers(bool $as_objects = false)
     {
-        return $this->users;
+        if (!$as_objects) {
+            return $this->users;
+        }
+
+        $result = $this->users;
+        User::findEachMany(
+            function (User $user) use (&$result) {
+                $result[$user->id] = $user;
+            },
+            array_keys($this->users)
+        );
+        return array_values($result);
     }
 
     /**
@@ -313,6 +325,26 @@ class AdmissionUserList
         return $this;
     }
 
+    public function describe(array $wrapper = ['', '']): string
+    {
+        if ($this->getFactor() == 0) {
+            return _('Bei der Platzverteilung zu Veranstaltungen werden die '
+                   . 'betreffenden Personen nur nachrangig berücksichtigt.');
+        }
+
+        if ($this->getFactor() == PHP_INT_MAX) {
+            return _('Bei der Platzverteilung zu Veranstaltungen werden die '
+                   . 'betreffenden Personen vor allen anderen einen Platz erhalten.');
+        }
+
+        return sprintf(
+            _('Bei der Platzverteilung zu Veranstaltungen haben die betreffenden '
+            . 'Personen gegenüber Anderen eine %s-fache Chance darauf, einen Platz zu '
+            . 'erhalten.'),
+            $wrapper[0] . $this->getFactor() . $wrapper[1]
+        );
+    }
+
     /**
      * Function for storing the data to DB. Is not called automatically on
      * changing object values.
@@ -353,7 +385,8 @@ class AdmissionUserList
     /**
      * String representation of this object.
      */
-    public function toString() {
+    public function toString()
+    {
         $tpl = $GLOBALS['template_factory']->open('admission/userlist');
         $tpl->set_attribute('userlist', $this);
         return $tpl->render();
@@ -364,9 +397,9 @@ class AdmissionUserList
      *
      * @return String
      */
-    public function __toString() {
+    public function __toString()
+    {
         return $this->toString();
     }
 
-} /* end of class AdmissionUserList */
-?>
+}
diff --git a/templates/admission/userlist.php b/templates/admission/userlist.php
index df4dfcf11e9d7c114e4c0c8b7ac51bdd44dcb235..872d69110cb9a88a1c933aa1f878f362515d7e40 100644
--- a/templates/admission/userlist.php
+++ b/templates/admission/userlist.php
@@ -1,23 +1,20 @@
-<?php if ($userlist->getFactor() == 0) : ?>
-    <?= _('Bei der Platzverteilung zu Veranstaltungen werden die betreffenden '.
-        'Personen nur nachrangig berücksichtigt.') ?>
-<?php elseif ($userlist->getFactor() == PHP_INT_MAX) : ?>
-    <?= _('Bei der Platzverteilung zu Veranstaltungen werden die betreffenden '.
-        'Personen vor allen anderen einen Platz erhalten.') ?>
-<?php else : ?>
-    <?= sprintf(_('Bei der Platzverteilung zu Veranstaltungen haben die betreffenden '.
-        'Personen gegenüber Anderen eine %s-fache Chance darauf, einen Platz zu '.
-        'erhalten.'), '<b>'.$userlist->getFactor().'</b>'); ?>
-<?php endif ?>
-<br>
+<?php
+/**
+ * @var AdmissionUserList $userlist
+ */
+?>
+<?= $userlist->describe(['<b>', '</b>']) ?><br>
 <?= _('Personen auf dieser Liste:') ?>
-<?php if ($userlist->getUsers()) { ?>
+<? if ($userlist->getUsers()): ?>
 <ul>
-    <?php foreach ($userlist->getUsers() as $userId => $assigned) { ?>
-    <li><?= get_fullname($userId, 'full_rev', true).' ('.get_username($userId).')' ?></li>
-    <?php } ?>
+<? foreach ($userlist->getUsers(true) as $user): ?>
+    <li>
+        <?= htmlReady($user->getFullname('full_rev')) ?>
+        (<?= htmlReady($user->username) ?>)
+    </li>
+<? endforeach; ?>
 </ul>
-<?php } else { ?>
+<? else: ?>
 <br>
 <i><?= _('Es wurde noch niemand zugeordnet.'); ?></i>
-<?php } ?>    
+<? endif; ?>