Index: main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/actionbutton.pt
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/actionbutton.pt	(revision 6633)
+++ main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/actionbutton.pt	(revision 6635)
@@ -4,5 +4,5 @@
        tal:attributes="href viewlet/target_url">
       <img src="" alt="edit"
-	   tal:attributes="src viewlet/icon_url; 
+	   tal:attributes="src viewlet/icon_url;
 			   alt viewlet/alt"/>
     <span tal:content="viewlet/text">TEXT</span></a>
Index: main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/plainactionbutton.pt
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/plainactionbutton.pt	(revision 6635)
+++ main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/plainactionbutton.pt	(revision 6635)
@@ -0,0 +1,7 @@
+<span class="yui-button">
+  <span class="first-child">
+    <a href=""
+       tal:attributes="href viewlet/target_url">
+    <span tal:content="viewlet/text">TEXT</span></a>
+  </span>
+</span>
Index: main/waeup.sirp/trunk/src/waeup/sirp/browser/viewlets.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/browser/viewlets.py	(revision 6633)
+++ main/waeup.sirp/trunk/src/waeup/sirp/browser/viewlets.py	(revision 6635)
@@ -114,4 +114,10 @@
         """
         return self.view.url(self.view.context, self.target)
+
+class PlainActionButton(ActionButton):
+    """A base for action buttons without image
+    """
+    grok.baseclass()
+    template = grok.PageTemplateFile('templates/plainactionbutton.pt')
 
     
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/accommodation.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/accommodation.py	(revision 6635)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/accommodation.py	(revision 6635)
@@ -0,0 +1,36 @@
+## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+"""
+Container which contains the (student) accommodation objects.
+"""
+import grok
+from grok import index
+from zope.component.interfaces import IFactory
+from zope.interface import implementedBy
+from waeup.sirp.students.interfaces import IStudentAccommodation
+from waeup.sirp.utils.helpers import attrs_to_fields
+
+class StudentAccommodation(grok.Container):
+    """This is a container for accommodation objects.
+    """
+    grok.implements(IStudentAccommodation)
+    grok.provides(IStudentAccommodation)
+
+    def __init__(self):
+        super(StudentAccommodation, self).__init__()
+        return
+
+StudentAccommodation = attrs_to_fields(StudentAccommodation)
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 6633)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 6635)
@@ -46,5 +46,5 @@
 from waeup.sirp.browser.viewlets import (
     ManageActionButton, PrimaryNavTab, LeftSidebarLink,
-    AddActionButton, ActionButton,
+    AddActionButton, ActionButton, PlainActionButton,
     )
 from waeup.sirp.image.browser.widget import (
@@ -64,5 +64,6 @@
 from waeup.sirp.students.interfaces import (
     IStudentsContainer, IStudent, IStudentClearance,
-    IStudentPersonal, IStudentBase
+    IStudentPersonal, IStudentBase, IStudentStudyCourse,
+    IStudentPayments, IStudentAccommodation
     )
 from waeup.sirp.students.student import (
@@ -92,4 +93,22 @@
     grok.context(IStudentsContainer)
     title = u'Students'
+
+class SudyCourseBreadcrumb(Breadcrumb):
+    """A breadcrumb for the student study course.
+    """
+    grok.context(IStudentStudyCourse)
+    title = u'Study Course'
+
+class PaymentsBreadcrumb(Breadcrumb):
+    """A breadcrumb for the student payments folder.
+    """
+    grok.context(IStudentPayments)
+    title = u'Payments'
+
+class AccommodationBreadcrumb(Breadcrumb):
+    """A breadcrumb for the student accommodation folder.
+    """
+    grok.context(IStudentAccommodation)
+    title = u'Accommodation'
 
 class StudentsContainerPage(WAeUPPage):
@@ -229,4 +248,5 @@
     grok.name('index')
     grok.require('waeup.viewStudents')
+    grok.template('studentpage')
     form_fields = grok.AutoFields(IStudentBase)
 
@@ -244,24 +264,46 @@
     grok.view(StudentBaseDisplayFormPage)
     grok.require('waeup.manageStudents')
-    text = 'Edit base data'
+    text = 'Edit'
     target = 'edit_base'
 
-class StudentClearanceViewActionButton(ActionButton):
+class StudentClearanceViewActionButton(PlainActionButton):
     grok.order(2)
-    icon = 'actionicon_view.png'
-    grok.context(IStudent)
-    grok.view(StudentBaseDisplayFormPage)
-    grok.require('waeup.viewStudents')
-    text = 'View clearance data'
+    grok.context(IStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    grok.require('waeup.viewStudents')
+    text = 'Clearance Data'
     target = 'view_clearance'
 
-class StudentPersonalViewActionButton(ActionButton):
+class StudentPersonalViewActionButton(PlainActionButton):
     grok.order(3)
-    icon = 'actionicon_view.png'
-    grok.context(IStudent)
-    grok.view(StudentBaseDisplayFormPage)
-    grok.require('waeup.viewStudents')
-    text = 'View personal data'
+    grok.context(IStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    grok.require('waeup.viewStudents')
+    text = 'Personal Data'
     target = 'view_personal'
+
+class StudyCourseViewActionButton(PlainActionButton):
+    grok.order(4)
+    grok.context(IStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    grok.require('waeup.viewStudents')
+    text = 'Study Course'
+    target = 'studycourse'
+
+class PaymentsViewActionButton(PlainActionButton):
+    grok.order(5)
+    grok.context(IStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    grok.require('waeup.viewStudents')
+    text = 'Payments'
+    target = 'payments'
+
+class AccommodationViewActionButton(PlainActionButton):
+    grok.order(6)
+    grok.context(IStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    grok.require('waeup.viewStudents')
+    text = 'Accommodation'
+    target = 'accommodation'
 
 class StudentBaseManageFormPage(WAeUPEditFormPage):
@@ -300,5 +342,5 @@
     grok.view(StudentClearanceDisplayFormPage)
     grok.require('waeup.manageStudents')
-    text = 'Edit clearance data'
+    text = 'Edit'
     target = 'edit_clearance'
 
@@ -337,5 +379,5 @@
     grok.view(StudentPersonalDisplayFormPage)
     grok.require('waeup.manageStudents')
-    text = 'Edit personal data'
+    text = 'Edit'
     target = 'edit_personal'
 
@@ -352,2 +394,53 @@
     def title(self):
         return 'Student: %s' % self.context.name
+
+class StudyCourseDisplayFormPage(WAeUPDisplayFormPage):
+    """ Page to display the student study course data
+    """
+    grok.context(IStudentStudyCourse)
+    grok.name('index')
+    grok.require('waeup.viewStudents')
+    form_fields = grok.AutoFields(IStudentStudyCourse)
+    #grok.template('studycoursepage')
+
+    @property
+    def title(self):
+        return 'Student: %s' % self.context.__parent__.name
+
+    @property
+    def label(self):
+        return '%s: Study Course Data' % self.context.__parent__.name
+
+class PaymentsDisplayFormPage(WAeUPDisplayFormPage):
+    """ Page to display the student payments
+    """
+    grok.context(IStudentPayments)
+    grok.name('index')
+    grok.require('waeup.viewStudents')
+    form_fields = grok.AutoFields(IStudentPayments)
+    #grok.template('paymentspage')
+
+    @property
+    def title(self):
+        return 'Student: %s' % self.context.__parent__.name
+
+    @property
+    def label(self):
+        return '%s: Payments' % self.context.__parent__.name
+
+class AccommodationDisplayFormPage(WAeUPDisplayFormPage):
+    """ Page to display the student accommodation data
+    """
+    grok.context(IStudentAccommodation)
+    grok.name('index')
+    grok.require('waeup.viewStudents')
+    form_fields = grok.AutoFields(IStudentAccommodation)
+    #grok.template('accommodationpage')
+
+    @property
+    def title(self):
+        return 'Student: %s' % self.context.__parent__.name
+
+    @property
+    def label(self):
+        return '%s: Accommodation Data' % self.context.__parent__.name
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studentpage.pt
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studentpage.pt	(revision 6635)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studentpage.pt	(revision 6635)
@@ -0,0 +1,29 @@
+<h2 i18n:translate=""
+    tal:condition="view/label"
+    tal:content="view/label">Label</h2>
+
+<table class="zebra">
+  <tbody>
+    <tal:block repeat="widget view/widgets">
+      <tr>
+        <td class="fieldname">
+          <tal:block content="widget/label"/>:
+        </td>
+        <td>
+          <input tal:replace="structure widget" />
+        </td>
+      </tr>
+    </tal:block>
+  </tbody>
+  <tfoot>
+    <tr class="controls">
+      <td colspan="2" class="align-right">
+        <input tal:repeat="action view/actions"
+               tal:replace="structure action/render" />
+      </td>
+    </tr>
+  </tfoot>
+
+</table>
+
+
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/container.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/container.py	(revision 6633)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/container.py	(revision 6635)
@@ -22,6 +22,8 @@
 from zope.interface import implementedBy
 from waeup.sirp.students.interfaces import (
-    IStudentsContainer, IStudent)
+    IStudentsContainer, IStudent, IStudentPayments, IStudentAccommodation)
 from waeup.sirp.students.studycourse import StudentStudyCourse
+from waeup.sirp.students.payments import StudentPayments
+from waeup.sirp.students.accommodation import StudentAccommodation
 
 class StudentsContainer(grok.Container):
@@ -46,3 +48,7 @@
         studycourse = StudentStudyCourse()
         self[student.student_id]['studycourse'] = studycourse
+        payments = StudentPayments()
+        self[student.student_id]['payments'] = payments
+        accommodation = StudentAccommodation()
+        self[student.student_id]['accommodation'] = accommodation
         return
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py	(revision 6633)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py	(revision 6635)
@@ -92,2 +92,13 @@
         required = True,
         )
+
+class IStudentAccommodation(IWAeUPObject):
+    """A container for student accommodation objects.
+
+    """
+
+class IStudentPayments(IWAeUPObject):
+    """A container for student payment objects.
+
+    """
+
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/payments.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/payments.py	(revision 6635)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/payments.py	(revision 6635)
@@ -0,0 +1,36 @@
+## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+"""
+Container which contains the (student) payments objects.
+"""
+import grok
+from grok import index
+from zope.component.interfaces import IFactory
+from zope.interface import implementedBy
+from waeup.sirp.students.interfaces import IStudentPayments
+from waeup.sirp.utils.helpers import attrs_to_fields
+
+class StudentPayments(grok.Container):
+    """This is a container for student payments.
+    """
+    grok.implements(IStudentPayments)
+    grok.provides(IStudentPayments)
+
+    def __init__(self):
+        super(StudentPayments, self).__init__()
+        return
+
+StudentPayments = attrs_to_fields(StudentPayments)
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py	(revision 6633)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py	(revision 6635)
@@ -72,9 +72,9 @@
 
 
-        # Add student
+        # Add student with subobjects (done by addStudent)
         student = Student()
         student.name = u'Anna Tester'
         student.student_id = u'Z654321'
-        self.app['students'][student.student_id] = student
+        self.app['students'].addStudent(student)
 
         self.container_path = 'http://localhost/app/students'
@@ -88,4 +88,8 @@
         self.edit_personal_student_path = self.student_path + '/edit_personal'
 
+        self.studycourse_student_path = self.student_path + '/studycourse'
+        self.payments_student_path = self.student_path + '/payments'
+        self.accommodation_student_path = self.student_path + '/accommodation'
+
         # Populate university
         certificate = createObject('waeup.Certificate')
@@ -188,23 +192,42 @@
         # and can perform actions
         self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+
         self.browser.open(self.student_path)
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.url, self.student_path)
-        self.browser.getLink("Edit base data").click()
+        self.browser.getLink("Edit").click()
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.url, self.manage_student_path)
-        self.browser.open(self.student_path)
-        self.browser.getLink("View clearance data").click()
+
+        self.browser.open(self.student_path)
+        self.browser.getLink("Clearance Data").click()
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.url, self.clearance_student_path)
-        self.browser.getLink("Edit clearance data").click()
+        self.browser.getLink("Edit").click()
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.url, self.edit_clearance_student_path)
-        self.browser.open(self.student_path)
-        self.browser.getLink("View personal data").click()
+
+        self.browser.open(self.student_path)
+        self.browser.getLink("Personal Data").click()
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.url, self.personal_student_path)
-        self.browser.getLink("Edit personal data").click()
+        self.browser.getLink("Edit").click()
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.url, self.edit_personal_student_path)
+
+        self.browser.open(self.student_path)
+        self.browser.getLink("Study Course").click()
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.url, self.studycourse_student_path)
+
+        self.browser.open(self.student_path)
+        self.browser.getLink("Payments").click()
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.url, self.payments_student_path)
+
+        self.browser.open(self.student_path)
+        self.browser.getLink("Accommodation").click()
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.url, self.accommodation_student_path)
+
         return
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_student.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_student.py	(revision 6633)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_student.py	(revision 6635)
@@ -30,9 +30,9 @@
     Student, StudentFactory,
     )
-from waeup.sirp.students.studycourse import (
-    StudentStudyCourse,
-    )
+from waeup.sirp.students.studycourse import StudentStudyCourse
+from waeup.sirp.students.payments import StudentPayments
+from waeup.sirp.students.accommodation import StudentAccommodation
 from waeup.sirp.students.interfaces import (
-    IStudent, IStudentStudyCourse,
+    IStudent, IStudentStudyCourse, IStudentPayments, IStudentAccommodation,
     )
 from waeup.sirp.testing import FunctionalLayer
@@ -46,4 +46,6 @@
         self.student = Student()
         self.studycourse = StudentStudyCourse()
+        self.payments = StudentPayments()
+        self.accommodation = StudentAccommodation()
         return
 
@@ -57,4 +59,8 @@
         verify.verifyClass(IStudentStudyCourse, StudentStudyCourse)
         verify.verifyObject(IStudentStudyCourse, self.studycourse)
+        verify.verifyClass(IStudentPayments, StudentPayments)
+        verify.verifyObject(IStudentPayments, self.payments)
+        verify.verifyClass(IStudentAccommodation, StudentAccommodation)
+        verify.verifyObject(IStudentAccommodation, self.accommodation)
         return
 
