Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/container.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/container.py	(revision 6837)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/container.py	(revision 6838)
@@ -20,12 +20,6 @@
 import os
 from zope.component.interfaces import IFactory
-from zope.securitypolicy.interfaces import IPrincipalRoleManager
-from hurry.workflow.interfaces import IWorkflowInfo
-from waeup.sirp.interfaces import IUserAccount
 from waeup.sirp.students.interfaces import (
-    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
+    IStudentsContainer, IStudent)
 from waeup.sirp.utils.helpers import get_current_principal
 from waeup.sirp.utils.logger import Logger
@@ -50,21 +44,6 @@
             raise TypeError(
                 'StudentsContainers contain only IStudent instances')
-        student.clearance_locked = True
         self[student.student_id] = student
-        studycourse = StudentStudyCourse()
-        self[student.student_id]['studycourse'] = studycourse
-        payments = StudentPayments()
-        self[student.student_id]['payments'] = payments
-        accommodation = StudentAccommodation()
-        self[student.student_id]['accommodation'] = accommodation
-        # Assign global student role for new student
-        account = IUserAccount(student)
-        account.roles = ['waeup.Student']
-        # Assign local StudentRecordOwner role
-        role_manager = IPrincipalRoleManager(self[student.student_id])
-        role_manager.assignRoleToPrincipal(
-            'waeup.local.StudentRecordOwner', student.student_id)
         # Return student_id (only needed in tests)
-        IWorkflowInfo(self[student.student_id]).fireTransition('create')
         return student.student_id
 
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/student.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/student.py	(revision 6837)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/student.py	(revision 6838)
@@ -21,9 +21,13 @@
 from zope.component.interfaces import IFactory
 from zope.interface import implementedBy
-from hurry.workflow.interfaces import IWorkflowState
-from waeup.sirp.interfaces import IObjectHistory
+from hurry.workflow.interfaces import IWorkflowState, IWorkflowInfo
+from zope.securitypolicy.interfaces import IPrincipalRoleManager
+from waeup.sirp.interfaces import IObjectHistory, IUserAccount
 from waeup.sirp.students.interfaces import (
     IStudent, IStudentNavigation, IStudentClearanceEdit,
     IStudentPersonalEdit)
+from waeup.sirp.students.studycourse import StudentStudyCourse
+from waeup.sirp.students.payments import StudentPayments
+from waeup.sirp.students.accommodation import StudentAccommodation
 from waeup.sirp.utils.helpers import attrs_to_fields, get_current_principal
 from waeup.sirp.students.utils import generate_student_id
@@ -91,4 +95,26 @@
         return implementedBy(Student)
 
+@grok.subscribe(IStudent, grok.IObjectAddedEvent)
+def addStudentHandler(student, event):
+    """If a student is added all subcontainers are automatically added
+    and the transition create is fired. The latter produces a logging message.
+    """
+    student.clearance_locked = True
+    studycourse = StudentStudyCourse()
+    student['studycourse'] = studycourse
+    payments = StudentPayments()
+    student['payments'] = payments
+    accommodation = StudentAccommodation()
+    student['accommodation'] = accommodation
+    # Assign global student role for new student
+    account = IUserAccount(student)
+    account.roles = ['waeup.Student']
+    # Assign local StudentRecordOwner role
+    role_manager = IPrincipalRoleManager(student)
+    role_manager.assignRoleToPrincipal(
+        'waeup.local.StudentRecordOwner', student.student_id)
+    IWorkflowInfo(student).fireTransition('create')
+    return
+
 @grok.subscribe(IStudent, grok.IObjectRemovedEvent)
 def removedStudentHandler(student, event):
@@ -100,2 +126,3 @@
     grok.getSite()['students'].logger.info('%s - %s - %s' % (
         user, target, comment))
+    return
