diff --git a/app/controllers/course/room_requests.php b/app/controllers/course/room_requests.php
index 79758d6fa5c0c899bdd4cbdf4749a65617d8cd6e..97fed5048929750b9a5c78fda9fb3496a728aeca 100644
--- a/app/controllers/course/room_requests.php
+++ b/app/controllers/course/room_requests.php
@@ -20,9 +20,6 @@ class Course_RoomRequestsController extends AuthenticatedController
 {
     /**
      * Common tasks for all actions
-     *
-     * @param string $action Called action
-     * @param array  $args   Possible arguments
      */
     public function before_filter(&$action, &$args)
     {
@@ -36,21 +33,22 @@ class Course_RoomRequestsController extends AuthenticatedController
             'admin'
         );
         $this->course_id = Request::option('cid', $args[0] ?? null);
-        $pagetitle = '';
+
         //Navigation in der Veranstaltung:
         if (Navigation::hasItem('/course/admin/room_requests')) {
             Navigation::activateItem('/course/admin/room_requests');
         }
 
-        if (!get_object_type($this->course_id, ['sem']) ||
-            SeminarCategories::GetBySeminarId($this->course_id)->studygroup_mode ||
-            !$GLOBALS['perm']->have_studip_perm("tutor", $this->course_id)
+        if (
+            !get_object_type($this->course_id, ['sem'])
+            || SeminarCategories::GetBySeminarId($this->course_id)->studygroup_mode
+            || !$GLOBALS['perm']->have_studip_perm('tutor', $this->course_id)
         ) {
             throw new Trails\Exception(400);
         }
 
         PageLayout::setHelpKeyword('Basis.VeranstaltungenVerwaltenAendernVonZeitenUndTerminen');
-        $pagetitle .= Course::find($this->course_id)->getFullName() . ' - ';
+        $pagetitle = Course::find($this->course_id)->getFullName() . ' - ';
         $pagetitle .= _('Verwalten von Raumanfragen');
         PageLayout::setTitle($pagetitle);
 
@@ -105,9 +103,8 @@ class Course_RoomRequestsController extends AuthenticatedController
      */
     public function info_action($request_id)
     {
-        $request = RoomRequest::find($request_id);
-        $this->request = $request;
-        $this->render_template('course/room_requests/_request.php', null);
+        $this->request = RoomRequest::find($request_id);
+        $this->render_template('course/room_requests/_request.php');
     }
 
     /**
@@ -126,31 +123,24 @@ class Course_RoomRequestsController extends AuthenticatedController
             _('Hier können Sie Angaben zu gewünschten Raumeigenschaften machen.')
         );
 
-        $this->request_id = $request_id;
-
-        if (Request::submitted('request_id')) {
-            $this->request_id = Request::get('request_id');
-        }
-        if (!$this->request_id) {
-            $this->request_id = md5(uniqid('RoomRequest'));
-        }
+        $this->request_id = Request::option(
+            'request_id',
+            $request_id ?: md5(uniqid(RoomRequest::class))
+        );
 
         // e.g. cycle, course, date
         $this->request_range = Request::get('range_str');
 
         // multiple dates
-        $this->request_range_ids = Request::getArray('range_ids') ?: $_SESSION[$this->request_id]['range_ids'] ?? [];
+        $this->request_range_ids = Request::getArray('range_ids') ?: $this->fromSession('range_ids') ?? [];
         // a single date or whole course
         $this->request_range_id = Request::get('range_id', Context::getId());
 
-        $this->init_session();
-        $_SESSION[$this->request_id]['range'] = $this->request_range ?: $_SESSION[$this->request_id]['range'] ?? null;
-        $_SESSION[$this->request_id]['range_ids'] = $this->request_range_ids ?: [$this->request_range_id];
+        $this->toSession('range', $this->request_range ?: $this->fromSession('range') ?? null);
+        $this->toSession('range_ids', $this->request_range_ids ?: [$this->request_range_id]);
 
         // look for existing request or create a new one
-        $this->request = new RoomRequest($this->request_id);
-        // time ranges (start date, end date)
-        $this->request->setRangeFields($_SESSION[$this->request_id]['range'], $_SESSION[$this->request_id]['range_ids']);
+        $this->request = $this->getRequestObject($this->request_id);
         $this->request_time_intervals = $this->request->getTimeIntervals();
     }
 
@@ -175,23 +165,20 @@ class Course_RoomRequestsController extends AuthenticatedController
 
             $this->category_id = Request::get('category_id');
             $this->search_by_category = Request::submitted('search_by_category');
-            if (!isset($_SESSION[$request_id])) {
-                $_SESSION[$request_id] = [];
-            }
-            $_SESSION[$request_id]['room_category_id'] = $this->category_id;
+            $this->toSession('room_category_id', $this->category_id);
 
             $this->room_name = Request::get('room_name');
             $this->search_by_roomname = Request::submitted('search_by_name');
-            $_SESSION[$request_id]['room_name'] = $this->room_name;
+            $this->toSession('room_name', $this->room_name);
 
             // user selects a room category OR enters a room name
             if ($this->category_id !== null && $this->search_by_category) {
-                $_SESSION[$request_id]['search_by'] = 'category';
+                $this->toSession('search_by', 'category');
                 $this->redirect(
-                    'course/room_requests/request_find_available_properties/' . $this->request_id . '/' . $this->step . '/category'
+                    'course/room_requests/request_find_available_properties/' . $this->request_id . '/' . $this->step
                 );
             } elseif ($this->room_name && $this->search_by_roomname) {
-                $_SESSION[$request_id]['search_by'] = 'roomname';
+                $this->toSession('search_by', 'roomname');
                 $this->redirect(
                     'course/room_requests/request_find_matching_rooms/' . $this->request_id . '/' . $this->step . '/roomname'
                 );
@@ -218,15 +205,14 @@ class Course_RoomRequestsController extends AuthenticatedController
         }
         $this->request_id = $request_id;
         $this->step = (int)$step;
-        $this->room_name = $_SESSION[$request_id]['room_name'];
+        $this->room_name = $this->fromSession('room_name');
 
-        $this->request = new RoomRequest($this->request_id);
-        $this->request->setRangeFields($_SESSION[$this->request_id]['range'], $_SESSION[$this->request_id]['range_ids'] ?? []);
+        $this->request = $this->getRequestObject($this->request_id);
 
-        $search_properties = $_SESSION[$request_id]['selected_properties'] ?? [];
+        $search_properties = $this->fromSession('selected_properties');
 
-        if (!empty($_SESSION[$request_id]['room_category_id'])) {
-            $search_properties['room_category_id'] = $_SESSION[$request_id]['room_category_id'];
+        if ($this->fromSession('room_category_id')) {
+            $search_properties['room_category_id'] = $this->fromSession('room_category_id');
         }
 
         if (!empty($search_properties['seats'])) {
@@ -251,20 +237,23 @@ class Course_RoomRequestsController extends AuthenticatedController
         $this->available_room_icons = $this->getRoomBookingIcons($this->available_rooms);
 
         // selected room and its category
-        $this->selected_room = Resource::find($_SESSION[$request_id]['room_id'] ?: $this->request->resource_id);
+        $this->selected_room = Resource::find($this->fromSession('room_id') ?: $this->request->resource_id);
 
-        $this->selected_room_category_id = $this->selected_room->category_id ?? $_SESSION[$request_id]['room_category_id'] ?? null;
+        $this->selected_room_category_id = $this->selected_room->category_id ?? $this->fromSession('room_category_id');
         $this->category = $this->selected_room_category_id ? ResourceCategory::find($this->selected_room_category_id) : null;
 
-        $_SESSION[$request_id]['room_category_id'] = $_SESSION[$request_id]['room_category_id'] ?? $this->selected_room->category_id ?? null;
+        $this->toSession('room_category_id', $this->fromSession('room_category_id') ?? $this->selected_room->category_id ?? null);
 
         // after selecting a room, go to next step or stay here if no room was selected at all
         if (Request::submitted('select_room')) {
             $this->selected_room_id = Request::get('selected_room_id');
             $room = Room::find($this->selected_room_id);
-            $_SESSION[$request_id]['room_id'] = $this->selected_room_id;
-            $_SESSION[$request_id]['room_category_id'] = $room->category_id;
-            $_SESSION[$request_id]['select_room'] = true;
+
+            $this->toSession([
+                'room_id' => $this->selected_room_id,
+                'room_category_id' => $room->category_id,
+                'select_room' => true,
+            ]);
             $this->redirect(
                 'course/room_requests/request_check_properties/' . $this->request_id
             );
@@ -273,21 +262,23 @@ class Course_RoomRequestsController extends AuthenticatedController
 
         // we might also search for new rooms and stay within step 1
         else if (Request::get('room_name') && Request::submitted('search_by_name')) {
-            $_SESSION[$request_id]['room_name'] = Request::get('room_name');
+            $this->toSession('room_name', Request::get('room_name'));
             $this->redirect(
                 'course/room_requests/request_find_matching_rooms/' . $this->request_id . '/' . $this->step
             );
             return;
         }
         else if (Request::get('category_id') && Request::submitted('select_properties')) {
-            $_SESSION[$request_id]['search_by'] = 'category';
-            $_SESSION[$request_id]['room_category_id'] = Request::get('category_id');
+            $this->toSession([
+                'search_by'        => 'category',
+                'room_category_id' => Request::get('category_id'),
+            ]);
             $this->redirect(
                 'course/room_requests/request_find_available_properties/' . $this->request_id . '/' . $this->step
             );
             return;
         } else if (Request::submitted('reset_category')) {
-            $this->init_session();
+            $this->clearSession();
             $this->redirect('course/room_requests/new_request');
             return;
         }
@@ -297,36 +288,38 @@ class Course_RoomRequestsController extends AuthenticatedController
             if (!empty(Request::getArray('selected_properties'))) {
                 $this->selected_properties = Request::getArray('selected_properties');
             } else {
-                $this->selected_properties =  $_SESSION[$request_id]['selected_properties'];
+                $this->selected_properties =  $this->fromSession('selected_properties');
             }
-            $_SESSION[$request_id]['selected_properties'] = $this->selected_properties;
-            if ($_SESSION[$request_id]['search_by'] === 'roomname') {
-                $this->selected_properties = $_SESSION[$request_id]['selected_properties'] ?? null;
-                $this->room = Room::find($_SESSION[$request_id]['room_id']);
-                if (!isset($_SESSION[$request_id]['selected_properties']['seats'])) {
+            $this->toSession('selected_properties', $this->selected_properties);
+            if ($this->fromSession('search_by') === 'roomname') {
+                $this->selected_properties = $this->fromSession('selected_properties');
+                $this->room = Room::find($this->fromSession('room_id'));
+                if (!isset($this->selected_properties['seats'])) {
                     $this->selected_properties['seats'] = $this->course->admission_turnout ?? Config::get()->RESOURCES_ROOM_REQUEST_DEFAULT_SEATS;
                 }
-                $_SESSION[$request_id]['selected_properties']['seats'] = $this->selected_properties['seats'];
-                $_SESSION[$request_id]['room_category_id'] = $this->selected_room_category_id;
+                $this->toSession([
+                    'selected_properties' => $this->selected_properties,
+                    'room_category_id' => $this->selected_room_category_id,
+                ]);
             } else {
                 // let's find all the properties belonging to the selected category
-                $this->room_category_id = $_SESSION[$request_id]['room_category_id'];
+                $this->room_category_id = $this->fromSession('room_category_id');
             }
 
             if ($this->category) {
                 $this->available_properties = $this->category->getRequestableProperties();
             }
-            $this->preparation_time = $_SESSION[$request_id]['preparation_time'] ?? null;
-            $this->comment = $_SESSION[$request_id]['comment'] ?? null;
-            $this->request->category_id = $_SESSION[$request_id]['room_category_id'];
+            $this->preparation_time = $this->fromSession('preparation_time');
+            $this->comment = $this->fromSession('comment');
+            $this->request->category_id = $this->fromSession('room_category_id');
 
             // finally we want to show a summary
             if (Request::submitted('show_summary')) {
                 $this->selected_room_id = Request::get('selected_room_id');
-                $_SESSION[$request_id]['room_id'] = $this->selected_room_id;
+                $this->toSession('room_id', $this->selected_room_id);
                 $room = Room::find($this->selected_room_id);
                 if ($room) {
-                    $_SESSION[$request_id]['room_category_id'] = $room->category_id;
+                    $this->toSession('room_category_id', $room->category_id);
                 }
                 $this->redirect('course/room_requests/request_show_summary/' . $this->request_id );
             }
@@ -349,33 +342,27 @@ class Course_RoomRequestsController extends AuthenticatedController
         $this->request_id = $request_id;
         $this->step = (int)$step;
 
-        $this->request = new RoomRequest($this->request_id);
-        $this->request->setRangeFields(
-            $_SESSION[$this->request_id]['range'] ?? null,
-            $_SESSION[$this->request_id]['range_ids'] ?? null
-        );
+        $this->request = $this->getRequestObject($this->request_id);
 
         // let's find all the properties belonging to the selected category
-        $this->room_category_id = $_SESSION[$request_id]['room_category_id'] ?: $this->request->category_id;
-        $this->room_name = $_SESSION[$request_id]['room_name'] ?? '';
-        $this->selected_room = Resource::find($_SESSION[$request_id]['room_id'] ?: $this->request->resource_id);
+        $this->room_category_id = $this->fromSession('room_category_id') ?? $this->request->category_id;
+        $this->room_name = $this->fromSession('room_name');
+        $this->selected_room = Resource::find($this->fromSession('room_id') ?? $this->request->resource_id ?? null);
         $this->category = $this->room_category_id ? ResourceCategory::find($this->room_category_id) : '';
         $this->available_properties = $this->room_category_id ? $this->category->getRequestableProperties() : '';
-        $this->selected_properties = $_SESSION[$request_id]['selected_properties'] ?? [];
+        $this->selected_properties = $this->fromSession('selected_properties');
 
         $this->course = Course::find($this->course_id);
-        $this->selected_properties['seats'] = $_SESSION[$request_id]['selected_properties']['seats']
+        $this->selected_properties['seats'] = $this->fromSession('selected_properties')['seats']
             ?? $this->course->admission_turnout
             ?: Config::get()->RESOURCES_ROOM_REQUEST_DEFAULT_SEATS;
 
-        $this->preparation_time = $_SESSION[$request_id]['preparation_time'] ?? null;
-        $this->comment = $_SESSION[$request_id]['comment'] ?? null;
+        $this->preparation_time = $this->fromSession('preparation_time');
+        $this->comment = $this->fromSession('comment');
+
 
         // when searching for a room name, list found room
-        if (
-            isset($_SESSION[$request_id]['room_name'])
-            && $_SESSION[$request_id]['room_name'] !== ''
-        ) {
+        if ($this->room_name) {
             $search_properties['room_category_id'] = $this->room_category_id;
             $search_properties['seats'] = [
                 1,
@@ -417,79 +404,86 @@ class Course_RoomRequestsController extends AuthenticatedController
         if (Request::submitted('select_room')) {
             $this->selected_room_id = Request::get('selected_room_id');
             $room = Room::find($this->selected_room_id);
-            $_SESSION[$request_id]['room_id'] = $this->selected_room_id;
-            $_SESSION[$request_id]['room_category_id'] = $room->category_id;
-            $_SESSION[$request_id]['select_room'] = true;
-            $this->step = 2;
-            $this->request = new RoomRequest($this->request_id);
+            $this->toSession([
+                'room_id' => $this->selected_room_id,
+                'room_category_id' => $room->category_id,
+                'select_room' => true,
+            ]);
+
             $this->redirect(
-                'course/room_requests/request_find_matching_rooms/' . $this->request_id . '/' . $this->step
+                'course/room_requests/request_find_matching_rooms/' . $this->request_id . '/2'
             );
         } else if (Request::get('room_name') && Request::submitted('search_by_name')) {
             $this->category_id = Request::get('category_id');
-            $_SESSION[$request_id]['selected_properties'] = $this->selected_properties;
-            $_SESSION[$request_id]['room_category_id'] = $this->category_id;
-            $_SESSION[$request_id]['comment'] = $this->comment;
-            $_SESSION[$request_id]['room_name'] = Request::get('room_name');
-            $this->request = new RoomRequest($this->request_id);
+
+            $this->toSession([
+                'selected_properties' => $this->selected_properties,
+                'room_category_id' => $this->category_id,
+                'room_name' => Request::get('room_name'),
+            ]);
             $this->redirect(
-                'course/room_requests/request_find_available_properties/' . $this->request_id . '/1/category'
+                'course/room_requests/request_find_available_properties/' . $this->request_id . '/1'
             );
 
         } else if (Request::submitted('search_rooms')) {
             $this->category_id = Request::get('category_id');
-            $_SESSION[$request_id]['room_category_id'] = $this->category_id;
-            $_SESSION[$request_id]['selected_properties'] = $this->selected_properties;
-            $_SESSION[$request_id]['room_name'] = '';
+
+            $this->toSession([
+                'room_category_id' => $this->category_id,
+                'selected_properties' => $this->selected_properties,
+                'room_name' => '',
+            ]);
 
             // no min number of seats
             if (
-                (!$_SESSION[$request_id]['selected_properties']['seats'] || $_SESSION[$request_id]['selected_properties']['seats'] < 1)
-                && $_SESSION[$request_id]['search_by'] === 'category'
+                (
+                    !isset($this->selected_properties['seats'])
+                    || $this->selected_properties['seats'] < 1
+                )
+                && $this->fromSession('search_by') === 'category'
             ) {
                 PageLayout::postError(
                     _('Die Mindestanzahl der Sitzplätze beträgt 1!')
                 );
 
                 $this->redirect(
-                    'course/room_requests/request_find_available_properties/' . $request_id . '/1/category'
+                    'course/room_requests/request_find_available_properties/' . $this->request_id . '/1'
                 );
             } else {
-                $this->step = 2;
-                $this->request = new RoomRequest($this->request_id);
                 $this->redirect(
-                        'course/room_requests/request_find_matching_rooms/' . $this->request_id . '/' . $this->step
+                        'course/room_requests/request_find_matching_rooms/' . $this->request_id . '/2'
                     );
             }
         } else if (Request::submitted('reset_category')) {
             //Delete all selected properties from the session since the category is reset
-            $this->init_session();
+            $this->clearSession();
             $this->redirect('course/room_requests/request_find_available_properties/' . $this->request_id . '/1');
         } else if (Request::submitted('search_by_category')) {
             if (Request::get('category_id') === '0') {
-                $_SESSION[$request_id]['room_category_id'] = '';
+                $this->clearSession('room_category_id');
             } else {
-                $_SESSION[$request_id]['room_category_id'] = Request::get('category_id');
+                $this->toSession('room_category_id', Request::get('category_id'));
             }
-
             $this->redirect(
-                'course/room_requests/request_find_available_properties/' . $this->request_id . '/1'  . '/category'
+                'course/room_requests/request_find_available_properties/' . $this->request_id . '/1'
             );
         } else if (Request::submitted('show_summary')) {
-            $this->request = new RoomRequest($this->request_id);
             $this->selected_room_id = Request::get('selected_room_id');
             $room = Room::find($this->selected_room_id);
-            $_SESSION[$request_id]['room_id'] = $this->selected_room_id;
-            $_SESSION[$request_id]['room_category_id'] = $room->category_id ?? $_SESSION[$request_id]['room_category_id'];
-            $_SESSION[$request_id]['selected_properties'] = $this->selected_properties;
+
+            $this->toSession([
+                'room_id' => $this->selected_room_id,
+                'room_category_id' => $room->category_id ?? $this->fromSession('room_category_id'),
+                'selected_properties' => $this->selected_properties,
+            ]);
+
             $this->redirect('course/room_requests/request_show_summary/' . $this->request_id  );
         } else {
-            $room = Room::find($_SESSION[$request_id]['room_id']);
-            $this->step = 2;
-            $this->request = new RoomRequest($this->request_id);
-            $_SESSION[$request_id]['room_category_id'] = $room->category_id;
+            $room = Room::find($this->fromSession('room_id'));
+            $this->toSession('room_category_id', $room->category_id);
+
             $this->redirect(
-                'course/room_requests/request_find_matching_rooms/' . $this->request_id . '/' . $this->step
+                'course/room_requests/request_find_matching_rooms/' . $this->request_id . '/2'
             );
         }
 
@@ -499,8 +493,6 @@ class Course_RoomRequestsController extends AuthenticatedController
      * Show a summary of all request properties before storing; we have the possibility of going back and
      * editing if necessary. This action is also used for editing a request via action menu
      * @param String $request_id ID of the request
-     * @return void
-     *
      */
     public function request_show_summary_action($request_id)
     {
@@ -514,39 +506,40 @@ class Course_RoomRequestsController extends AuthenticatedController
         $this->step = 3;
 
         if (Request::submitted('clear_cache')) {
-            $_SESSION[$request_id] = [];
+            $this->clearSession();
         }
 
-        $this->request = new RoomRequest($this->request_id);
-        $this->request->setRangeFields(
-            $_SESSION[$this->request_id]['range'] ?? '',
-            $_SESSION[$this->request_id]['range_ids'] ?? []
-        );
+        $this->request = $this->getRequestObject($request_id);
 
-        $this->selected_room_category = ResourceCategory::find($_SESSION[$request_id]['room_category_id'] ?? $this->request->category_id);
-        $this->selected_room = Resource::find($_SESSION[$request_id]['room_id'] ?? $this->request->resource_id);
+        $this->selected_room_category = ResourceCategory::find($this->fromSession('room_category_id') ?? $this->request->category_id);
+        $this->selected_room = Resource::find($this->fromSession('room_id') ?? $this->request->resource_id);
 
-        $this->room_id = $_SESSION[$request_id]['room_id'] ?? $this->request->resource_id;
+        $this->room_id = $this->fromSession('room_id') ?? $this->request->resource_id;
         $this->available_properties = $this->selected_room_category->getRequestableProperties();
 
-        $this->selected_properties = $_SESSION[$request_id]['selected_properties'] ?? [];
+        $this->selected_properties = $this->fromSession('selected_properties');
         $this->request_properties = $this->request->properties;
 
         // either properties from stored request or those from session
-        if ($this->request_properties && empty($_SESSION[$request_id]['selected_properties'])) {
+        if (
+            count($this->request_properties) > 0
+            && count($this->fromSession('selected_properties')) === 0
+        ) {
             foreach ($this->request_properties as $property) {
                 $this->selected_properties[$property->name] = $property->state;
             }
-            $_SESSION[$request_id]['selected_properties'] = $this->selected_properties;
+            $this->toSession('selected_properties', $this->selected_properties);
         }
 
         $this->preparation_time = intval($this->request->preparation_time / 60);
         $this->reply_lecturers = $this->request->reply_recipients === ResourceRequest::REPLY_LECTURER;
         $this->comment = $this->request->comment;
 
-        $_SESSION[$request_id]['search_by'] = $this->selected_room ? 'roomname' : 'category';
-        $_SESSION[$request_id]['room_category_id'] = $this->selected_room_category->id;
-        $_SESSION[$request_id]['room_id'] = $this->selected_room ? $this->selected_room->id : '';
+        $this->toSession([
+            'search_by' => $this->selected_room ? 'roomname' : 'category',
+            'room_category_id' => $this->selected_room_category->id,
+            'room_id' => $this->selected_room->id ?? null,
+        ]);
     }
 
     public function store_request_action($request_id)
@@ -558,16 +551,11 @@ class Course_RoomRequestsController extends AuthenticatedController
         }
 
         $this->request_id = $request_id;
-        $this->request = new RoomRequest($this->request_id);
-        $this->request->setRangeFields($_SESSION[$this->request_id]['range'], $_SESSION[$this->request_id]['range_ids']);
+        $this->request = $this->getRequestObject($this->request_id);
 
         if (Request::isPost()) {
             CSRFProtection::verifyUnsafeRequest();
 
-            if ($this->request->isNew()) {
-                $this->request->user_id = $this->current_user->id;
-            }
-
             $this->preparation_time = Request::int('preparation_time', 0);
             $this->request->preparation_time = $this->preparation_time * 60;
             $this->request->comment = Request::get('comment');
@@ -577,11 +565,10 @@ class Course_RoomRequestsController extends AuthenticatedController
             } else {
                 $this->request->reply_recipients = ResourceRequest::REPLY_REQUESTER;
             }
-            $this->request->category_id = $_SESSION[$request_id]['room_category_id'] ?: $this->request->category_id;
+            $this->request->category_id = $this->fromSession('room_category_id') ?? $this->request->category_id;
 
-            $this->request->resource_id = $_SESSION[$request_id]['room_id'] ?: $this->request->resource_id;
+            $this->request->resource_id = $this->fromSession('room_id') ?? $this->request->resource_id;
             $this->request->course_id = Context::getId();
-            $this->request->last_modified_by = $this->current_user->id;
 
             if ($this->request->closed != ResourceRequest::STATE_OPEN) {
                 PageLayout::postInfo(_('Die Raumanfrage wurde wieder geöffnet und damit erneut gestellt.'));
@@ -591,16 +578,14 @@ class Course_RoomRequestsController extends AuthenticatedController
             $this->request->store();
 
             //Store the properties:
-            if (isset($_SESSION[$request_id]['selected_properties'])) {
-                foreach ($_SESSION[$request_id]['selected_properties'] as $name => $state) {
-                    if (!empty($state)) {
-                        $this->request->setProperty($name, $state);
-                    }
+            foreach ($this->fromSession('selected_properties') as $name => $state) {
+                if (!empty($state)) {
+                    $this->request->setProperty($name, $state);
                 }
             }
 
             // once stored, we can delete the session data for this request
-            $_SESSION[$this->request_id] = [];
+            $this->clearSession();
 
             PageLayout::postSuccess(_('Die Anfrage wurde gespeichert!'));
             $this->relocate('course/timesrooms/');
@@ -651,39 +636,77 @@ class Course_RoomRequestsController extends AuthenticatedController
     /**
      * delete one room request
      */
-    public function delete_action($request_id)
+    public function delete_action(RoomRequest $request)
     {
-        $request = RoomRequest::find($request_id);
-        if (!$request) {
-            throw new Trails\Exception(403);
-        }
         if (Request::isGet()) {
-            PageLayout::postQuestion(sprintf(
-                _('Möchten Sie die Raumanfrage "%s" löschen?'),
-                htmlReady($request->getTypeString())), $this->url_for('course/room_requests/delete/' . $request_id));
+            PageLayout::postQuestion(
+                sprintf(
+                    _('Möchten Sie die Raumanfrage "%s" löschen?'),
+                    htmlReady($request->getTypeString())
+                ),
+                $this->url_for('course/room_requests/delete/' . $request->id)
+            );
         } else {
             CSRFProtection::verifyUnsafeRequest();
-            if (Request::submitted('yes')) {
-                if ($request->delete()) {
-                    PageLayout::postSuccess("Die Raumanfrage wurde gelöscht.");
-                }
+            if (Request::submitted('yes') && $request->delete()) {
+                PageLayout::postSuccess("Die Raumanfrage wurde gelöscht.");
             }
         }
         $this->redirect('course/timesrooms/index');
     }
 
-    private function init_session()
+
+    private function fromSession(string $key): mixed
     {
-        $_SESSION[$this->request_id] = array_merge(
-            $_SESSION[$this->request_id] ?? [],
-            [
-                'search_by'           => '',
-                'room_category_id'    => '',
-                'room_id'             => '',
-                'room_name'           => '',
-                'select_room'         => false,
-                'selected_properties' => [],
-            ]
+        if (!isset($this->request_id)) {
+            throw new RuntimeException('Request ID not set.');
+        }
+
+        $defaults = [
+            'range_ids'           => [],
+            'select_room'         => false,
+            'selected_properties' => [],
+        ];
+        return $_SESSION[$this->request_id][$key] ?? $defaults[$key] ?? null;
+    }
+
+    private function toSession(array|string $data, mixed $value = null): void
+    {
+        if (!isset($this->request_id)) {
+            throw new RuntimeException('Request ID not set.');
+        }
+
+        if (!is_array($data) && func_num_args() === 2) {
+            $data = [$data => $value];
+        }
+
+        foreach ($data as $key => $value) {
+            $_SESSION[$this->request_id][$key] = $value;
+        }
+    }
+
+    private function clearSession(string $key = null): void
+    {
+        if (!isset($this->request_id)) {
+            throw new RuntimeException('Request ID not set.');
+        }
+
+        if ($key === null) {
+            unset($_SESSION[$this->request_id]);
+        } elseif (isset($_SESSION[$this->request_id][$key])) {
+            unset($_SESSION[$this->request_id][$key]);
+        }
+    }
+
+    private function getRequestObject(?string $request_id): RoomRequest
+    {
+        $request = new RoomRequest($request_id);
+
+        $request->setRangeFields(
+            $this->fromSession('range'),
+            $this->fromSession('range_ids')
         );
+
+        return $request;
     }
 }
diff --git a/app/controllers/resources/room_request.php b/app/controllers/resources/room_request.php
index 7f7cdbe2b3ea11f5a5bfb070afc2393e1d617375..113c5d3176b71d091a19216a1cc96fe1247dc861 100644
--- a/app/controllers/resources/room_request.php
+++ b/app/controllers/resources/room_request.php
@@ -1816,7 +1816,6 @@ class Resources_RoomRequestController extends AuthenticatedController
                 $this->reply_comment = Request::get('reply_comment');
                 $this->request->reply_comment = $this->reply_comment;
                 $this->request->closed = '3';
-                $this->request->last_modified_by = $this->current_user->id;
                 if ($this->request->isDirty()) {
                     if ($this->request->store()) {
                         $this->show_form = false;
diff --git a/app/views/course/room_requests/request_find_available_properties.php b/app/views/course/room_requests/request_find_available_properties.php
index 0b434ed4bf2ec3e8f075fccf3a2b78457fb426c8..b2b3a9cbc4226f300eec4e97637af75af175d03e 100644
--- a/app/views/course/room_requests/request_find_available_properties.php
+++ b/app/views/course/room_requests/request_find_available_properties.php
@@ -1,3 +1,16 @@
+<?php
+/**
+ * @var Course_RoomRequestsController $controller
+ * @var string $request_id
+ * @var int $step
+ * @var ResourceCategory[] $available_room_categories
+ * @var string $room_category_id
+ * @var ResourceCategory|null $category
+ * @var ResourcePropertyDefinition[] $available_properties
+ * @var string $room_name
+ * @var Icon[] $available_room_icons
+ */
+?>
 <form method="post" name="room_request" class="default"
       action="<?= $controller->link_for('course/room_requests/request_check_properties/' . $request_id . '/' . $this->step) ?>"
     <?= Request::isXhr() ? 'data-dialog="size=big"' : ''?>>
@@ -92,26 +105,26 @@
             <? if (!empty($available_rooms)) : ?>
                 <label>
                     <strong><?= _('Passende Räume') ?></strong>
-                    <section class="selectbox" id="room_select">
-                        <? foreach ($available_rooms as $room): ?>
-                            <div class="flex-row">
-                                <label class="horizontal">
-                                    <?= $available_room_icons[$room->id] ?>
-                                    <input type="radio" name="selected_room_id"
-                                           data-activates="button[type='submit'][name='select_room']"
-                                           value="<?= htmlReady($room->id) ?>"
-                                        <? if ($_SESSION[$request_id]['room_id'] === $room->id) echo 'checked' ?>>
-                                    <?= htmlReady(mila($room->name, 50)) . ' (' . $room['category']->name . ')'?>
-                                    <? if ($room->properties): ?>
-                                        <? $property_names = $room->getInfolabelProperties()
-                                            ->pluck('fullname') ?>
-                                        <?= tooltipIcon(implode("\n", $property_names)) ?>
-                                    <? endif ?>
-                                </label>
-                            </div>
-                        <? endforeach ?>
-                    </section>
                 </label>
+                <section class="selectbox" id="room_select">
+                <? foreach ($available_rooms as $room): ?>
+                    <div class="flex-row">
+                        <label class="horizontal">
+                            <?= $available_room_icons[$room->id] ?>
+                            <input type="radio" name="selected_room_id"
+                                   data-activates="button[type='submit'][name='select_room']"
+                                   value="<?= htmlReady($room->id) ?>"
+                                <? if (isset($_SESSION[$request_id]['room_id']) && $_SESSION[$request_id]['room_id'] === $room->id) echo 'checked' ?>>
+                            <?= htmlReady(mila($room->name, 50)) . ' (' . $room['category']->name . ')'?>
+                            <? if ($room->properties): ?>
+                                <? $property_names = $room->getInfolabelProperties()
+                                    ->pluck('fullname') ?>
+                                <?= tooltipIcon(implode("\n", $property_names)) ?>
+                            <? endif ?>
+                        </label>
+                    </div>
+                <? endforeach ?>
+                </section>
                 <?= \Studip\Button::create(_('Raum auswählen'), 'select_room') ?>
             <? endif ?>
             </fieldset>
diff --git a/lib/models/resources/ResourceRequest.php b/lib/models/resources/ResourceRequest.php
index ed10e6912e633077f55bde346dd61b77e684fe8b..b0334a4097886062d9438608325b0bac041ffdc8 100644
--- a/lib/models/resources/ResourceRequest.php
+++ b/lib/models/resources/ResourceRequest.php
@@ -134,6 +134,7 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen
             $config['registered_callbacks']['before_store'][] = 'validate';
         }
         $config['registered_callbacks']['after_create'][] = 'cbLogNewRequest';
+        $config['registered_callbacks']['before_store'][] = 'cbBeforeStore';
         $config['registered_callbacks']['after_store'][] = 'cbAfterStore';
         $config['registered_callbacks']['after_delete'][] = 'cbAfterDelete';
 
@@ -546,6 +547,18 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen
         StudipLog::log('RES_REQUEST_NEW', $this->course_id, $this->resource_id, $this->getLoggingInfoText());
     }
 
+    /**
+     * A callback method that sets the users connection before store.
+     */
+    public function cbBeforeStore()
+    {
+        if ($this->isNew() && !$this->user_id) {
+            $this->user_id = User::findCurrent()->id;
+        }
+
+        $this->last_modified_by = User::findCurrent()->id;
+    }
+
     /**
      * A callback method that send a mail
      * when a new request has been udpated.