Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 16061)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 16064)
@@ -1664,6 +1664,6 @@
 
 class ExportJobContainerJobStart(UtilityView, grok.View):
-    """View that starts two export jobs, one for applicants and a second
-    one for applicant payments.
+    """View that starts three export jobs, one for applicants, a second
+    one for applicant payments and a third for referee reports.
     """
     grok.context(VirtualApplicantsExportJobContainer)
@@ -1683,22 +1683,15 @@
         container_code = self.context.__parent__.code
         # Start first exporter
-        exporter = 'applicants'
-        job_id = self.context.start_export_job(exporter,
-                                      self.request.principal.id,
-                                      container=container_code)
-        self.context.logger.info(
-            '%s - exported: %s (%s), job_id=%s'
-            % (ob_class, exporter, container_code, job_id))
-        # Commit transaction so that job is stored in the ZODB
-        transaction.commit()
-        # Start second exporter
-        exporter = 'applicantpayments'
-        job_id = self.context.start_export_job(exporter,
-                                      self.request.principal.id,
-                                      container=container_code)
-        self.context.logger.info(
-            '%s - exported: %s (%s), job_id=%s'
-            % (ob_class, exporter, container_code, job_id))
-
+        for exporter in ('applicants',
+                         'applicantpayments',
+                         'applicantrefereereports'):
+            job_id = self.context.start_export_job(exporter,
+                                          self.request.principal.id,
+                                          container=container_code)
+            self.context.logger.info(
+                '%s - exported: %s (%s), job_id=%s'
+                % (ob_class, exporter, container_code, job_id))
+            # Commit transaction so that job is stored in the ZODB
+            transaction.commit()
         self.flash(_('Exports started.'))
         self.redirect(self.url(self.context))
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/export.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/export.py	(revision 16061)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/export.py	(revision 16064)
@@ -22,5 +22,6 @@
 from zope.component import queryUtility
 from waeup.kofa.applicants.interfaces import (
-    IApplicantBaseData, IApplicantsContainer, IApplicantOnlinePayment)
+    IApplicantBaseData, IApplicantsContainer, IApplicantOnlinePayment,
+    IApplicantRefereeReport)
 from waeup.kofa.interfaces import ICSVExporter
 from waeup.kofa.interfaces import MessageFactory as _
@@ -145,5 +146,5 @@
 
 class ApplicantPaymentExporter(grok.GlobalUtility, ExporterBase):
-    """The Applicant Payments Exporter exports all payments made by applicants.
+    """The Applicant Payment Exporter exports all payments made by applicants.
     In other words, it exports payment tickets in state 'paid'. The exporter
     searches :class:`ApplicantsCatalog` and iterates over all payment tickets
@@ -219,2 +220,72 @@
                     payments.append(payment)
         return self.export(payments, filepath=filepath)
+
+class ApplicantRefereeReportExporter(grok.GlobalUtility, ExporterBase):
+    """The Applicant Referee Report Exporter exports all referee reports.
+    The exportersearches :class:`ApplicantsCatalog` and iterates over all 
+    referee reports which are stored in an applicant (container).
+
+    The exporter exports all referee reports if started in the Data Center
+    which means in the context of the `DataCenter` object. The exporter can also
+    be started 'locally' which means in the context of an
+    `ApplicantsContainer` container, see `ApplicantExporter` above.
+    """
+    grok.implements(ICSVExporter)
+    grok.name('applicantrefereereports')
+
+    fields = tuple(sorted(iface_names(
+        IApplicantRefereeReport,
+        exclude_attribs=False,
+        omit=['display_item']))) + (
+              'applicant_id',
+              'reg_number',
+              'display_fullname',)
+    title = _(u'Applicant Referee Reports')
+
+    def mangle_value(self, value, name, context=None):
+        """The mangler determines the applicant's id.
+        """
+        if name in ('applicant_id', 'reg_number',
+            'display_fullname',) and context is not None:
+            applicant = context.__parent__
+            value = getattr(applicant, name, None)
+        return super(
+            ApplicantRefereeReportExporter, self).mangle_value(
+            value, name, context=context)
+
+    def export(self, payments, filepath=None):
+        """
+        """
+        writer, outfile = self.get_csv_writer(filepath)
+        for payment in payments:
+            self.write_item(payment, writer)
+        return self.close_outfile(filepath, outfile)
+
+    def export_all(self, site, filepath=None):
+        """
+        """
+        catalog = queryUtility(
+            ICatalog, context=site, name='applicants_catalog', default=None)
+        if catalog is None:
+            return self.export([], filepath)
+        applicants = catalog.searchResults(
+            # reg_num might not be set and then would not be found.
+            # We therefore search for applicant_id.
+            applicant_id=(None, None))
+        refereereports = []
+        for applicant in applicants:
+            for refereereport in applicant.refereereports:
+                refereereports.append(refereereport)
+            return self.export(refereereports, filepath=filepath)
+
+    def export_filtered(self, site, filepath=None, **kw):
+        """
+        """
+        container = grok.getSite()['applicants'][kw['container']]
+        container_values = container.values()
+        refereereports = []
+        for applicant in container_values:
+            for refereereport in applicant.refereereports:
+                refereereports.append(refereereport)
+            return self.export(refereereports, filepath=filepath)
+        return self.export(refereereports, filepath=filepath)
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 16061)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 16064)
@@ -1562,6 +1562,6 @@
         self.browser.getControl("Start new exports").click()
         job_ids = self.wait_for_export_jobs_completed()
-        # Two exports were created
-        self.assertEqual(len(self.app['datacenter'].running_exports), 2)
+        # Three exports were created
+        self.assertEqual(len(self.app['datacenter'].running_exports), 3)
        # When the jobs are finished and we reload the page...
         self.browser.open(container_path + '/exports')
@@ -1580,6 +1580,15 @@
             'filename="WAeUP.Kofa_applicantpayments_%s.csv' % job_ids[1] in
             self.browser.headers['content-disposition'])
+        self.browser.open(container_path + '/exports')
+        self.browser.getLink("Download", index=2).click()
+        self.assertEqual(self.browser.headers['content-type'],
+            'text/csv; charset=UTF-8')
+        self.assertTrue(
+            'filename="WAeUP.Kofa_applicantrefereereports_%s.csv' % job_ids[2] in
+            self.browser.headers['content-disposition'])
         # ... and discarded
         self.browser.open(container_path + '/exports')
+        self.browser.getControl("Discard", index=0).click()
+        self.assertEqual(len(self.app['datacenter'].running_exports), 2)
         self.browser.getControl("Discard", index=0).click()
         self.assertEqual(len(self.app['datacenter'].running_exports), 1)
@@ -1617,4 +1626,18 @@
             'zope.mgr - applicants.browser.ExportJobContainerOverview '
             '- discarded: job_id=%s' % job_ids[1] in logcontent
+            )
+        self.assertTrue(
+            'zope.mgr - applicants.browser.ExportJobContainerJobStart - '
+            'exported: applicantrefereereports (%s), job_id=%s'
+            % (container_name_1, job_ids[2]) in logcontent
+            )
+        self.assertTrue(
+            'zope.mgr - applicants.browser.ExportJobContainerDownload '
+            '- downloaded: WAeUP.Kofa_applicantrefereereports_%s.csv, job_id=%s'
+            % (job_ids[2], job_ids[2]) in logcontent
+            )
+        self.assertTrue(
+            'zope.mgr - applicants.browser.ExportJobContainerOverview '
+            '- discarded: job_id=%s' % job_ids[2] in logcontent
             )
 
