Index: /main/waeup.sirp/trunk/src/waeup/sirp/README.txt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/README.txt	(revision 6621)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/README.txt	(revision 6622)
@@ -33,7 +33,4 @@
   >>> u['students']
   <waeup.sirp.students.container.StudentsContainer object at 0x...>
-
-  >>> u['hostels']
-  <waeup.sirp.hostel.hostelcontainer.HostelContainer object at 0x...>
 
 We can export universities. For this we lookup an appropriate exporter
Index: /main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser.py	(revision 6621)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser.py	(revision 6622)
@@ -458,5 +458,5 @@
 
 class ApplicantAddFormPage(WAeUPAddFormPage):
-    """Add-form to add certificate to a department.
+    """Add-form to add an applicant.
     """
     grok.context(IApplicantsContainer)
Index: /main/waeup.sirp/trunk/src/waeup/sirp/permissions.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/permissions.py	(revision 6621)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/permissions.py	(revision 6622)
@@ -40,4 +40,7 @@
     grok.name('waeup.viewStudents')
 
+class ManageStudents(grok.Permission):
+    grok.name('waeup.manageStudents')
+
 # Local Roles
 class DepartmentOfficer(grok.Role):
@@ -58,5 +61,6 @@
                      'waeup.View', 'waeup.Public','waeup.manageACBatches',
                      'waeup.manageDataCenter','waeup.managePortalSettings',
-                     'waeup.manageApplications', 'waeup.handleApplication')
+                     'waeup.manageApplications', 'waeup.handleApplication',
+                     'waeup.viewStudents', 'waeup.manageStudents')
 
 def getRoles():
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 6621)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 6622)
@@ -24,4 +24,6 @@
 from zope.securitypolicy.interfaces import IPrincipalRoleManager
 from zope.traversing.browser import absoluteURL
+from zope.component import (
+    createObject,)
 
 from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
@@ -60,5 +62,8 @@
     MultiListWidget, MultiListDisplayWidget)
 from waeup.sirp.students.interfaces import (
-    IStudentsContainer,
+    IStudentsContainer, IStudent,
+    )
+from waeup.sirp.students.students import (
+    Student,
     )
 
@@ -86,7 +91,6 @@
     grok.require('waeup.viewStudents')
     grok.template('studentscontainerpage')
-    pnav = 3
 
-    form_fields = grok.AutoFields(IStudentsContainer).omit('title')
+    form_fields = grok.AutoFields(IStudentsContainer)
     #form_fields['description'].custom_widget = ReSTDisplayWidget
 
@@ -98,2 +102,71 @@
     def label(self):
         return self.title
+
+class StudentssContainerManageActionButton(ManageActionButton):
+    grok.order(1)
+    grok.context(IStudentsContainer)
+    grok.view(StudentsContainerPage)
+    grok.require('waeup.manageStudents')
+    text = 'Manage students'
+
+class StudentsContainerManagePage(WAeUPDisplayFormPage):
+    """The standard view for regular student containers.
+    """
+    grok.context(IStudentsContainer)
+    grok.name('manage')
+    grok.require('waeup.manageStudents')
+    grok.template('studentscontainerpage')
+
+    form_fields = grok.AutoFields(IStudentsContainer)
+
+    @property
+    def title(self):
+        return "Students"
+
+    @property
+    def label(self):
+        return self.title
+
+    @grok.action('Add student', validator=NullValidator)
+    def addStudent(self, **data):
+        self.redirect(self.url(self.context, 'addstudent'))
+        return
+
+class StudentAddFormPage(WAeUPAddFormPage):
+    """Add-form to add a student.
+    """
+    grok.context(IStudentsContainer)
+    grok.require('waeup.manageStudents')
+    grok.name('addstudent')
+    grok.template('studentaddpage')
+    form_fields = grok.AutoFields(IStudent)
+    title = 'Students'
+    label = 'Add student'
+
+    @grok.action('Create student record')
+    def addStudent(self, **data):
+        student_id = self.request.form.get('form.student_id')
+        student = createObject(u'waeup.Student')
+        self.applyData(student, **data)
+        #import pdb; pdb.set_trace()
+        try:
+            self.context[student_id] = student
+        except KeyError:
+            self.flash('The student id chosen already exists.')
+            return
+        self.redirect(self.url(self.context[student_id], 'index'))
+        return
+
+class DisplayStudent(WAeUPDisplayFormPage):
+    grok.context(IStudent)
+    grok.name('index')
+    grok.require('waeup.viewStudents')
+    form_fields = grok.AutoFields(IStudent)
+
+    @property
+    def title(self):
+        return 'Student: %s' % self.context.name
+
+    @property
+    def label(self):
+        return self.context.name
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studentaddpage.pt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studentaddpage.pt	(revision 6622)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studentaddpage.pt	(revision 6622)
@@ -0,0 +1,33 @@
+<h2 i18n:translate=""
+    tal:condition="view/label"
+    tal:content="view/label">Label</h2>
+
+<form method="POST">
+  <table>
+    <tbody>
+      <tr>
+    	<td><label for="form.student_id">Student Id:</label></td>
+    	<td>
+         <input name="form.student_id" type="text" size="10" maxlength="10"
+                value="" />
+    	</td>
+      </tr>
+      <tr>
+    	<td><label for="form.name">Name:</label></td>
+    	<td>
+         <input name="form.name" type="text" size="10" maxlength="10"
+                value="" />
+    	</td>
+      </tr>
+      <tr>
+        <td>
+            <div class="actionButtons" tal:condition="view/availableActions">
+                <span tal:repeat="action view/actions" tal:omit-tag="">
+                    <input tal:replace="structure action/render"/>
+                </span>
+            </div>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+</form>
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studentscontainerpage.pt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studentscontainerpage.pt	(revision 6621)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studentscontainerpage.pt	(revision 6622)
@@ -1,4 +1,5 @@
 <h2 tal:content="view/label">Title</h2>
 
+<form method="POST">
 <table class="zebra" tal:condition="layout/isAuthenticated">
   <tbody>
@@ -13,4 +14,14 @@
       </tr>
     </tal:block>
+      <tr>
+        <td>
+            <div class="actionButtons" tal:condition="view/availableActions">
+                <span tal:repeat="action view/actions" tal:omit-tag="">
+                    <input tal:replace="structure action/render"/>
+                </span>
+            </div>
+        </td>
+      </tr>
   </tbody>
 </table>
+</form>
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py	(revision 6621)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py	(revision 6622)
@@ -8,4 +8,10 @@
     """Representation of a student.
     """
+    student_id = schema.TextLine(
+        title = u'Student Id',
+        default = u'None',
+        required = True,
+        )
+
     name = schema.TextLine(
         title = u'Name of student',
@@ -13,4 +19,5 @@
         required = True,
         )
+
 
 class IStudentsContainer(IWAeUPObject):
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 6621)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py	(revision 6622)
@@ -104,4 +104,6 @@
         # Anonymous users can't access students containers
         self.assertRaises(
+            Unauthorized, self.browser.open, self.container_path)
+        self.assertRaises(
             Unauthorized, self.browser.open, self.manage_container_path)
         return
@@ -114,3 +116,19 @@
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.url, self.container_path)
+        self.browser.getLink("Manage students").click()
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.url, self.manage_container_path)
         return
+
+    def test_add_students(self):
+        # Managers can add students
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        self.add_student_path = self.container_path + '/addstudent'
+        self.container_manage_path = self.container_path + '/@@manage'
+        self.browser.open(self.container_manage_path)
+        self.browser.getControl("Add student").click()
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.url, self.add_student_path)
+        self.browser.getControl(name="form.student_id").value = 'A123456'
+        self.browser.getControl(name="form.name").value = 'Bob Tester'
+        self.browser.getControl("Create student record").click()
