Index: main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 15996)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 15998)
@@ -180,4 +180,9 @@
         """
 
+    def updateCourseTickets(course):
+        """Udate registered course tickets if course
+        attributes were changed.
+        """
+
 class IStudentsContainer(IKofaObject):
     """A students container contains university students.
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 15996)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 15998)
@@ -2375,4 +2375,46 @@
             in self.browser.contents)
 
+    def test_update_coursetickets(self):
+        IWorkflowState(self.student).setState('school fee paid')
+        studylevel = createObject(u'waeup.StudentStudyLevel')
+        studylevel.level = 100
+        studylevel.level_session = 2015
+        self.student['studycourse'].entry_mode = 'ug_ft'
+        self.student['studycourse'].addStudentStudyLevel(
+            self.certificate, studylevel)
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        self.browser.open(
+            'http://localhost/app/faculties/fac1/dep1/courses/COURSE1/')
+        self.assertFalse(
+            'Update session 2015/2016 credits' in self.browser.contents)
+        self.app['configuration'].current_academic_session = 2015
+        self.browser.open(
+            'http://localhost/app/faculties/fac1/dep1/courses/COURSE1/')
+        self.browser.getLink("Update session 2015/2016 credits").click()
+        self.assertTrue(
+            'No course ticket found.' in self.browser.contents)
+        logfile = os.path.join(
+            self.app['datacenter'].storage, 'logs', 'main.log')
+        logcontent = open(logfile).read()
+        self.assertTrue(
+            'zope.mgr - browser.pages.UpdateCourseTicketsView - '
+            'course tickets updated: COURSE1' in logcontent)
+        studylevel['COURSE1'].credits = 12
+        self.browser.getLink("Update session 2015/2016 credits").click()
+        self.assertTrue(
+            'No course ticket found.' in self.browser.contents)
+        studylevel.level_session = 2015
+        self.student['studycourse'].current_session = 2015
+        self.browser.getLink("Update session 2015/2016 credits").click()
+        self.assertTrue(
+            '1 course ticket(s) updated.' in self.browser.contents)
+        logfile = os.path.join(
+            self.app['datacenter'].storage, 'logs', 'students.log')
+        logcontent = open(logfile).read()
+        self.assertTrue(
+            'zope.mgr - students.utils.StudentsUtils - '
+            'K1000000 100/COURSE1 credits updated (10->12)' in logcontent)
+        return
+
 
 class StudentUITests(StudentsFullSetup):
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py	(revision 15996)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py	(revision 15998)
@@ -32,5 +32,6 @@
 from zope.event import notify
 from zope.schema.interfaces import ConstraintNotSatisfied
-from zope.component import getUtility, createObject
+from zope.component import getUtility, createObject, queryUtility
+from zope.catalog.interfaces import ICatalog
 from zope.formlib.form import setUpEditWidgets
 from zope.i18n import translate
@@ -1148,4 +1149,33 @@
         return pdf_stream
 
+    def updateCourseTickets(self, course):
+        """Udate course tickets if course attributes were changed.
+        """
+        current_academic_session = grok.getSite()[
+            'configuration'].current_academic_session
+        if not current_academic_session:
+            return
+        cat = queryUtility(ICatalog, name='coursetickets_catalog')
+        coursetickets = cat.searchResults(
+            code=(course.code, course.code),
+            session=(current_academic_session,current_academic_session))
+        number = 0
+        ob_class = self.__implemented__.__name__.replace('waeup.kofa.', '')
+        for ticket in coursetickets:
+            if ticket.credits == course.credits:
+                continue
+            if ticket.student.current_session != current_academic_session:
+                continue
+            if ticket.student.state not in (PAID,):
+                continue
+            number += 1
+            ticket.student.__parent__.logger.info(
+                '%s - %s %s/%s credits updated (%s->%s)' % (
+                    ob_class, ticket.student.student_id,
+                    ticket.level, ticket.code, course.credits,
+                    ticket.credits))
+            ticket.credits = course.credits
+        return number
+
     #: A dictionary which maps widget names to headlines. The headline
     #: is rendered in forms and on pdf slips above the respective
