Index: main/waeup.kofa/trunk/src/waeup/kofa/students/accommodation.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/accommodation.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/accommodation.py	(revision 8735)
@@ -51,4 +51,7 @@
         return self.__parent__
 
+    def writeLogMessage(self, view, message):
+        return self.__parent__.writeLogMessage(view, message)
+
 StudentAccommodation = attrs_to_fields(StudentAccommodation)
 
@@ -68,4 +71,7 @@
     def getStudent(self):
         return self.__parent__.__parent__
+
+    def writeLogMessage(self, view, message):
+        return self.__parent__.__parent__.writeLogMessage(view, message)
 
     def getSessionString(self):
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 8735)
@@ -62,26 +62,5 @@
 from waeup.kofa.browser.resources import toggleall
 from waeup.kofa.hostels.hostel import NOT_OCCUPIED
-from waeup.kofa.utils.helpers import get_current_principal, to_timezone
-
-def write_log_message(view, message):
-    ob_class = view.__implemented__.__name__.replace('waeup.kofa.','')
-    view.context.getStudent().loggerInfo(ob_class, message)
-    return
-
-# Save function used for save methods in pages
-def msave(view, **data):
-    changed_fields = view.applyData(view.context, **data)
-    # Turn list of lists into single list
-    if changed_fields:
-        changed_fields = reduce(lambda x,y: x+y, changed_fields.values())
-    # Inform catalog if certificate has changed
-    # (applyData does this only for the context)
-    if 'certificate' in changed_fields:
-        notify(grok.ObjectModifiedEvent(view.context.getStudent()))
-    fields_string = ' + '.join(changed_fields)
-    view.flash(_('Form has been saved.'))
-    if fields_string:
-        write_log_message(view, 'saved: %s' % fields_string)
-    return
+from waeup.kofa.utils.helpers import get_current_principal, to_timezone, msave
 
 def emit_lock_message(view):
@@ -394,5 +373,5 @@
         self.flash(_('Form has been saved.'))
         if fields_string:
-            write_log_message(self, 'saved: % s' % fields_string)
+            self.context.writeLogMessage(self, 'saved: % s' % fields_string)
         return
 
@@ -1030,5 +1009,6 @@
             self.flash(_('Successfully removed: ${a}',
                 mapping = {'a': ', '.join(deleted)}))
-            write_log_message(self,'removed: % s' % ', '.join(deleted))
+            self.context.writeLogMessage(
+                self,'removed: % s' % ', '.join(deleted))
         self.redirect(self.url(self.context))
         return
@@ -1101,5 +1081,5 @@
         success, msg, log = self.context.approveStudentPayment()
         if log is not None:
-            write_log_message(self,log)
+            self.context.writeLogMessage(self,log)
         self.flash(msg)
         return
@@ -1202,5 +1182,6 @@
             self.flash(_('Successfully removed: ${a}',
                 mapping = {'a':', '.join(deleted)}))
-            write_log_message(self,'removed: % s' % ', '.join(deleted))
+            self.context.writeLogMessage(
+                self,'removed: % s' % ', '.join(deleted))
         self.redirect(self.url(self.context))
         return
@@ -1498,5 +1479,5 @@
             if not errors:
                 IUserAccount(self.context).setPassword(password)
-                write_log_message(self, 'saved: password')
+                self.context.writeLogMessage(self, 'saved: password')
                 self.flash(_('Password changed.'))
             else:
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 8735)
@@ -129,9 +129,14 @@
 
 class IStudentNavigation(IKofaObject):
-    """Interface needed for student navigation.
+    """Interface needed for student navigation, logging, etc.
 
     """
     def getStudent():
         """Return student object.
+
+        """
+
+    def writeLogMessage(view, message):
+        """Write a view specific log message into students.log.
 
         """
@@ -152,9 +157,4 @@
     display_fullname = Attribute('The fullname of an applicant')
 
-    def loggerInfo(ob_class, comment):
-        """Adds an INFO message to the log file.
-
-        """
-
     student_id = schema.TextLine(
         title = _(u'Student Id'),
@@ -383,8 +383,4 @@
     def addCourseTicket(courseticket):
         """Add a course ticket object.
-        """
-
-    def getStudent():
-        """Return student
         """
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py	(revision 8735)
@@ -43,4 +43,7 @@
         return self.__parent__
 
+    def writeLogMessage(self, view, message):
+        return self.__parent__.writeLogMessage(view, message)
+
 StudentPaymentsContainer = attrs_to_fields(StudentPaymentsContainer)
 
@@ -60,4 +63,7 @@
         except AttributeError:
             return None
+
+    def writeLogMessage(self, view, message):
+        return self.__parent__.__parent__.writeLogMessage(view, message)
 
     def _createActivationCodes(self):
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/student.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/student.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/student.py	(revision 8735)
@@ -61,7 +61,7 @@
         return
 
-    def loggerInfo(self, ob_class, comment=None):
-        target = self.__name__
-        return grok.getSite()['students'].logger_info(ob_class,target,comment)
+    def writeLogMessage(self, view, message):
+        ob_class = view.__implemented__.__name__.replace('waeup.kofa.','')
+        return self.__parent__.logger_info(ob_class,self.__name__,comment=None)
 
     @property
@@ -139,4 +139,5 @@
             self.get('studycourse', None), 'is_postgrad', False)
         return is_postgrad
+
 
 # Set all attributes of Student required in IStudent as field
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/studycourse.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/studycourse.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/studycourse.py	(revision 8735)
@@ -42,4 +42,7 @@
     def getStudent(self):
         return self.__parent__
+
+    def writeLogMessage(self, view, message):
+        return self.__parent__.writeLogMessage(view, message)
 
     @property
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py	(revision 8735)
@@ -43,4 +43,7 @@
     def getStudent(self):
         return getattr(getattr(self, '__parent__', None), '__parent__', None)
+
+    def writeLogMessage(self, view, message):
+        return self.__parent__.__parent__.writeLogMessage(view, message)
 
     @property
@@ -107,4 +110,7 @@
             return None
 
+    def writeLogMessage(self, view, message):
+        return self.__parent__.__parent__.__parent__.writeLogMessage(view, message)
+
     def getLevel(self):
         """Returns the id of the level the ticket has been added to.
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_student.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_student.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_student.py	(revision 8735)
@@ -36,5 +36,6 @@
 from waeup.kofa.students.interfaces import (
     IStudent, IStudentStudyCourse, IStudentPaymentsContainer,
-    IStudentAccommodation, IStudentStudyLevel, ICourseTicket, IBedTicket)
+    IStudentAccommodation, IStudentStudyLevel, ICourseTicket, IBedTicket,
+    IStudentNavigation)
 from waeup.kofa.students.tests.test_batching import StudentImportExportSetup
 from waeup.kofa.testing import FunctionalLayer, FunctionalTestCase
@@ -86,15 +87,37 @@
     def test_interfaces(self):
         verify.verifyClass(IStudent, Student)
+        verify.verifyClass(IStudentNavigation, Student)
         verify.verifyObject(IStudent, self.student)
+        verify.verifyObject(IStudentNavigation, self.student)
+
         verify.verifyClass(IStudentStudyCourse, StudentStudyCourse)
+        verify.verifyClass(IStudentNavigation, StudentStudyCourse)
         verify.verifyObject(IStudentStudyCourse, self.studycourse)
+        verify.verifyObject(IStudentNavigation, self.studycourse)
+
+        verify.verifyClass(IStudentStudyLevel, StudentStudyLevel)
+        verify.verifyClass(IStudentNavigation, StudentStudyLevel)
         verify.verifyObject(IStudentStudyLevel, self.studylevel)
+        verify.verifyObject(IStudentNavigation, self.studylevel)
+
+        verify.verifyClass(ICourseTicket, CourseTicket)
+        verify.verifyClass(IStudentNavigation, CourseTicket)
         verify.verifyObject(ICourseTicket, self.courseticket)
+        verify.verifyObject(IStudentNavigation, self.courseticket)
+
         verify.verifyClass(IStudentPaymentsContainer, StudentPaymentsContainer)
+        verify.verifyClass(IStudentNavigation, StudentPaymentsContainer)
         verify.verifyObject(IStudentPaymentsContainer, self.payments)
+        verify.verifyObject(IStudentNavigation, self.payments)
+
         verify.verifyClass(IStudentAccommodation, StudentAccommodation)
+        verify.verifyClass(IStudentNavigation, StudentAccommodation)
         verify.verifyObject(IStudentAccommodation, self.accommodation)
+        verify.verifyObject(IStudentNavigation, self.accommodation)
+
         verify.verifyClass(IBedTicket, BedTicket)
+        verify.verifyClass(IStudentNavigation, BedTicket)
         verify.verifyObject(IBedTicket, self.bedticket)
+        verify.verifyObject(IStudentNavigation, self.bedticket)
         return
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 8735)
@@ -35,5 +35,5 @@
     VALIDATED)
 from waeup.kofa.students.browser import (
-    StudentClearanceManageFormPage, write_log_message,
+    StudentClearanceManageFormPage,
     StudentBaseManageFormPage, StudentFilesUploadPage,
     ExportPDFClearanceSlipPage, StudentsContainerPage,
@@ -568,5 +568,5 @@
     store = getUtility(IExtFileStore)
     store.deleteFileByContext(context, attr=download_name)
-    write_log_message(view, 'deleted: %s' % download_name)
+    context.writeLogMessage(view, 'deleted: %s' % download_name)
     view.flash(_('${a} deleted.', mapping = {'a':download_name}))
     return
@@ -607,5 +607,5 @@
     file_id = IFileStoreNameChooser(context).chooseName(attr=download_name)
     store.createFile(file_id, upload)
-    write_log_message(view, 'uploaded: %s (%s)' % (
+    context.writeLogMessage(view, 'uploaded: %s (%s)' % (
         download_name,upload.filename))
     view.flash(_('File ${a} uploaded.', mapping = {'a':download_name}))
Index: main/waeup.kofa/trunk/src/waeup/kofa/university/certificate.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/university/certificate.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/university/certificate.py	(revision 8735)
@@ -151,5 +151,6 @@
         studycourse.certificate = None
         notify(grok.ObjectModifiedEvent(student))
-        student.loggerInfo('ObjectRemovedEvent', 'removed: certificate')
+        student.__parent__.logger_info(
+            'ObjectRemovedEvent',student.__name__,'removed: certificate')
     return
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/utils/helpers.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/utils/helpers.py	(revision 8734)
+++ main/waeup.kofa/trunk/src/waeup/kofa/utils/helpers.py	(revision 8735)
@@ -38,4 +38,5 @@
 from zope.security.management import getInteraction
 from zope.pluggableauth.interfaces import IAuthenticatorPlugin
+from waeup.kofa.interfaces import MessageFactory as _
 
 BUFSIZE = 8 * 1024
@@ -682,2 +683,18 @@
         writer.writerow(row)
     return tmp_path
+
+# Save function used for save methods in pages
+def msave(view, **data):
+    changed_fields = view.applyData(view.context, **data)
+    # Turn list of lists into single list
+    if changed_fields:
+        changed_fields = reduce(lambda x,y: x+y, changed_fields.values())
+    # Inform catalog if certificate has changed
+    # (applyData does this only for the context)
+    if 'certificate' in changed_fields:
+        notify(grok.ObjectModifiedEvent(view.context.getStudent()))
+    fields_string = ' + '.join(changed_fields)
+    view.flash(_('Form has been saved.'))
+    if fields_string:
+        view.context.writeLogMessage(view, 'saved: %s' % fields_string)
+    return
