Index: /main/waeup.kofa/trunk/CHANGES.txt
===================================================================
--- /main/waeup.kofa/trunk/CHANGES.txt	(revision 15971)
+++ /main/waeup.kofa/trunk/CHANGES.txt	(revision 15972)
@@ -4,4 +4,6 @@
 1.6.1.dev0 (unreleased)
 =======================
+
+* Add `AccommodationDisplayFormPage`.
 
 * Don't allow students to add former courses in course lists.
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 15971)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 15972)
@@ -2221,4 +2221,34 @@
             omit_fields=self.omit_fields)
 
+class AccommodationDisplayFormPage(KofaDisplayFormPage):
+    """ Page to view bed tickets.
+    This manage form page is for both students and students officers.
+    """
+    grok.context(IStudentAccommodation)
+    grok.name('index')
+    grok.require('waeup.viewStudent')
+    form_fields = grok.AutoFields(IStudentAccommodation)
+    grok.template('accommodationpage')
+    pnav = 4
+    with_hostel_selection = True
+
+    @property
+    def label(self):
+        return _('${a}: Accommodation',
+            mapping = {'a':self.context.__parent__.display_fullname})
+
+    @property
+    def desired_hostel(self):
+        if self.context.desired_hostel == 'no':
+            return _('No favoured hostel')
+        if self.context.desired_hostel:
+            hostel = grok.getSite()['hostels'].get(self.context.desired_hostel)
+            if hostel is not None:
+                return hostel.hostel_name
+        return
+
+    def update(self):
+        if checkPermission('waeup.handleAccommodation', self.context):
+            self.redirect(self.url(self.context, 'manage'))
 
 class AccommodationManageFormPage(KofaEditFormPage):
@@ -2228,5 +2258,5 @@
     """
     grok.context(IStudentAccommodation)
-    grok.name('index')
+    grok.name('manage')
     grok.require('waeup.handleAccommodation')
     form_fields = grok.AutoFields(IStudentAccommodation)
@@ -2482,5 +2512,5 @@
     grok.context(IBedTicket)
     grok.name('index')
-    grok.require('waeup.handleAccommodation')
+    grok.require('waeup.viewStudent')
     form_fields = grok.AutoFields(IBedTicket).omit('bed_coordinates')
     form_fields['booking_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
@@ -2497,5 +2527,5 @@
     grok.context(IBedTicket)
     grok.name('bed_allocation_slip.pdf')
-    grok.require('waeup.handleAccommodation')
+    grok.require('waeup.viewStudent')
     form_fields = grok.AutoFields(IBedTicket).omit('bed_coordinates')
     form_fields['booking_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/accommodationpage.pt
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/accommodationpage.pt	(revision 15972)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/accommodationpage.pt	(revision 15972)
@@ -0,0 +1,29 @@
+<tal:choice condition="python: view.desired_hostel and view.with_hostel_selection">
+<p>
+  <strong i18n:translate="">Favoured Hostel:</strong>
+  <span tal:replace="view/desired_hostel"></span>
+</p>
+</tal:choice>
+
+<h3 i18n:domain="waeup.kofa" i18n:translate="">Bookings</h3>
+<br />
+
+<table class="kofa-data-table dataTable">
+  <thead>
+  <tr>
+    <th i18n:translate="">Session</th>
+    <th i18n:translate="">Booking Date</th>
+    <th i18n:translate="">Bed Coordinates</th>
+    <th i18n:translate="">Bed Type</th>
+  </tr>
+  </thead>
+  <tbody>
+    <tr tal:repeat="cl context/values">
+      <td> <a tal:attributes="href python: view.url(cl)">
+      <span tal:content="python: cl.getSessionString()">PID</span></a></td>
+      <td tal:content="python: layout.formatDatetime(cl.booking_date)">DATE</td>
+      <td tal:content="cl/display_coordinates">COORDINATES</td>
+      <td tal:content="cl/bed_type">TYPE</td>
+    </tr>
+  </tbody>
+</table>
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 15971)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 15972)
@@ -561,5 +561,6 @@
         self.browser.getLink("Accommodation").click()
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
-        self.assertEqual(self.browser.url, self.acco_path)
+        # We have been redirected to the manage page
+        self.assertEqual(self.browser.url, self.acco_path + '/manage')
         self.browser.open(self.student_path)
         self.browser.getLink("History").click()
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 15971)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 15972)
@@ -131,5 +131,5 @@
     grok.order(7)
     grok.name('studentmanageaccommodationlink')
-    grok.require('waeup.handleAccommodation')
+    grok.require('waeup.viewStudent')
     link = 'accommodation'
     text = _(u'Accommodation')
@@ -549,5 +549,5 @@
     grok.context(IBedTicket)
     grok.view(BedTicketDisplayFormPage)
-    grok.require('waeup.handleAccommodation')
+    grok.require('waeup.viewStudent')
     icon = 'actionicon_pdf.png'
     text = _('Download bed allocation slip')
