diff --git a/app/views/resources/_common/_request_info.php b/app/views/resources/_common/_request_info.php
index 11ff253984a5b4b0c0da0282799c23365b719b06..6d339ca46d6245a43bbd81e9ffb19375ec559414 100644
--- a/app/views/resources/_common/_request_info.php
+++ b/app/views/resources/_common/_request_info.php
@@ -1,3 +1,8 @@
+<?php
+/**
+ * @var ResourceRequest $request
+ */
+?>
 <dl>
     <dt><?= _('Termine') ?>:</dt>
     <dd><?= $request->getDateString() ?></dd>
diff --git a/lib/models/resources/ResourceRequest.php b/lib/models/resources/ResourceRequest.php
index 06a5e79cbe57152c6d64677cfb09574887b63c0d..b0334a4097886062d9438608325b0bac041ffdc8 100644
--- a/lib/models/resources/ResourceRequest.php
+++ b/lib/models/resources/ResourceRequest.php
@@ -1452,17 +1452,31 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen
         $now = time();
         $strings = [];
         $resource_name = '';
-        if (count($this->appointments)) {
-            $parts  = [];
-            foreach ($this->appointments as $rra) {
-                if (!$with_past_intervals && $rra->appointment->end_time < $now) {
-                    continue;
+        if (count($this->appointments) > 0) {
+            // Filter invalid/not matching items
+            $appointments = $this->appointments->filter(
+                function (ResourceRequestAppointment $appointment) use ($with_past_intervals, $now): bool {
+                    if (!$appointment->appointment) {
+                        return false;
+                    }
+                    return $with_past_intervals
+                        || $appointment->appointment->end_time > $now;
                 }
-                if ($rra->appointment) {
-                    $parts[] = $rra->appointment->getFullName('include-room');
+            );
+
+            // Sort by appointment date
+            $appointments->uasort(
+                function (ResourceRequestAppointment $a, ResourceRequestAppointment $b): int {
+                    return $a->appointment->date - $b->appointment->date;
                 }
-            }
-            $strings[] = implode('; ', $parts);
+            );
+
+            // Get readable string for each appointment
+            $strings = $appointments->map(
+                function (ResourceRequestAppointment $appointment): string {
+                    return $appointment->appointment->getFullName('include-room');
+                },
+            );
         } elseif ($this->termin_id) {
             if ($this->date) {
                 if ($with_past_intervals || $this->date->end_time >= $now) {
@@ -1471,10 +1485,10 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen
             }
         } elseif ($this->metadate_id) {
             if ($this->cycle) {
-                $this->cycle->dates->filter(function($date) use($with_past_intervals, $now) {
+                $strings = $this->cycle->dates->filter(function ($date) use($with_past_intervals, $now) {
                     return $with_past_intervals || $date->end_time >= $now;
-                })->map(function($date) use(&$strings) {
-                    $strings[] = $date->getFullName('include-room');
+                })->map(function($date) {
+                    return $date->getFullName('include-room');
                 });
             }
         } elseif ($this->course_id) {