Index: main/waeup.kofa/trunk/CHANGES.txt
===================================================================
--- main/waeup.kofa/trunk/CHANGES.txt	(revision 13896)
+++ main/waeup.kofa/trunk/CHANGES.txt	(revision 13898)
@@ -4,4 +4,6 @@
 1.4.2.dev0 (unreleased)
 =======================
+
+* Add `ExportPDFScoresSlip`.
 
 * Add `DownloadScoresView` which is for lecturers only. Remove
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/viewlets.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/viewlets.py	(revision 13896)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/viewlets.py	(revision 13898)
@@ -551,4 +551,16 @@
     grok.order(1)
 
+class DownloadTicketOverviewActionButton(ManageActionButton):
+    """ 'Download ticket overview' button for courses.
+    """
+    grok.context(ICourse)
+    grok.view(EditScoresPage)
+    grok.name('coursetickets')
+    grok.require('waeup.editScores')
+    icon = 'actionicon_pdf.png'
+    text = _('Download pdf file')
+    target = 'coursetickets.pdf'
+    grok.order(2)
+
 class ManageCertificateActionButton(ManageActionButton):
     """ 'Manage settings' button for certificates.
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 13896)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 13898)
@@ -39,5 +39,6 @@
 from waeup.kofa.browser.breadcrumbs import Breadcrumb
 from waeup.kofa.browser.pages import (
-    ContactAdminFormPage, ExportCSVView, doll_up, exports_not_allowed)
+    ContactAdminFormPage, ExportCSVView, doll_up, exports_not_allowed,
+    LocalRoleAssignmentUtilityView)
 from waeup.kofa.browser.interfaces import ICaptchaManager
 from waeup.kofa.hostels.hostel import NOT_OCCUPIED
@@ -3163,5 +3164,4 @@
     grok.require('waeup.editScores')
     grok.name('download_scores')
-    redirect_target = '@@export'
 
     def update(self):
@@ -3194,4 +3194,45 @@
             'Content-Disposition:', 'attachment; filename="%s' % filename)
         return self.csv
+
+class ExportPDFScoresSlip(UtilityView, grok.View,
+    LocalRoleAssignmentUtilityView):
+    """Deliver a PDF slip of course tickets for a lecturer.
+    """
+    grok.context(ICourse)
+    grok.name('coursetickets.pdf')
+    grok.require('waeup.editScores')
+
+    def table_data(self, session):
+        cat = queryUtility(ICatalog, name='coursetickets_catalog')
+        coursetickets = cat.searchResults(
+            session=(session, session),
+            code=(self.context.code, self.context.code)
+            )
+        result = [[_('Matric No.'),
+                   _('Reg. No.'),
+                   _('Fullname'),
+                   _('Status'),
+                   _('Course of Studies'),
+                   _('Level'),
+                   _('Score') ],]
+        for ticket in list(coursetickets):
+            row = [ticket.student.matric_number,
+                  ticket.student.reg_number,
+                  ticket.student.display_fullname,
+                  ticket.student.translated_state,
+                  ticket.student.certcode,
+                  ticket.level,
+                  ticket.score]
+            result.append(row)
+        return result
+
+    def render(self):
+        session = grok.getSite()['configuration'].current_academic_session
+        lecturers = [i['user_title'] for i in self.getUsersWithLocalRoles()
+                     if i['local_role'] == 'waeup.local.Lecturer']
+        lecturers =  ', '.join(lecturers)
+        students_utils = getUtility(IStudentsUtils)
+        return students_utils.renderPDFCourseticketsOverview(
+            self, session, self.table_data(session), lecturers)
 
 class ExportJobContainerOverview(KofaPage):
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 13896)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 13898)
@@ -1889,4 +1889,14 @@
         self.assertTrue('mrslecturer - students.browser.EditScoresPage - '
                         'K1000000 100/COURSE1 score updated (None)' in logcontent)
+        # A course ticket slip can be downloaded
+        self.browser.open(
+            "http://localhost/app/faculties/fac1/dep1/courses/COURSE1/coursetickets.pdf")
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.headers['Content-Type'],
+                         'application/pdf')
+        path = os.path.join(samples_dir(), 'coursetickets.pdf')
+        open(path, 'wb').write(self.browser.contents)
+        print "Sample PDF coursetickets.pdf written to %s" % path
+
 
     def test_change_current_mode(self):
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py	(revision 13896)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py	(revision 13898)
@@ -55,5 +55,4 @@
     ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
     ('BOX', (0,0), (-1,-1), 1, colors.black),
-
     ]
 
@@ -936,4 +935,27 @@
         return pdf_stream
 
+    def renderPDFCourseticketsOverview(
+            self, view, session, table_data, lecturers):
+        filename = 'coursetickets_%s_%s_%s.pdf' % (
+            view.context.code, session, view.request.principal.id)
+        session = academic_sessions_vocab.getTerm(session).title
+        creator = getUtility(IPDFCreator)
+        style = getSampleStyleSheet()
+        pdf_data = [Table(table_data, style=CONTENT_STYLE)]
+        doc_title = translate(
+            _('${a} - Session ${b}\n'
+              'Lecturer(s): ${c}',
+            mapping = {'a':view.context.code, 'b':session, 'c':lecturers}))
+        author = '%s (%s)' % (view.request.principal.title,
+                              view.request.principal.id)
+        view.response.setHeader(
+            'Content-Type', 'application/pdf')
+        view.response.setHeader(
+            'Content-Disposition:', 'attachment; filename="%s' % filename)
+        pdf_stream = creator.create_pdf(
+            pdf_data, None, doc_title, author, doc_title + ' -'
+            )
+        return pdf_stream
+
     def maxCredits(self, studylevel):
         """Return maximum credits.
