Index: main/waeup.aaue/trunk/src/waeup/aaue/applicants/applicant.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/applicants/applicant.py	(revision 16779)
+++ main/waeup.aaue/trunk/src/waeup/aaue/applicants/applicant.py	(revision 16786)
@@ -22,4 +22,6 @@
 from waeup.kofa.interfaces import IExtFileStore
 from waeup.kofa.applicants.applicant import ApplicantFactory
+from waeup.kofa.applicants.refereereport import (
+    ApplicantRefereeReport, ApplicantRefereeReportFactory)
 from waeup.kofa.utils.helpers import attrs_to_fields
 from kofacustom.nigeria.applicants.applicant import NigeriaApplicant
@@ -27,5 +29,5 @@
     ICustomApplicant, ICustomUGApplicantEdit, ICustomPGApplicantEdit,
     IPUTMEApplicantEdit, ITranscriptApplicant, ICertificateRequest,
-    IFedexRequest, IRecruitment)
+    IFedexRequest, IRecruitment, ICustomApplicantRefereeReport)
 
 class CustomApplicant(NigeriaApplicant):
@@ -64,2 +66,20 @@
     def getInterfaces(self):
         return implementedBy(CustomApplicant)
+
+class CustomApplicantRefereeReport(ApplicantRefereeReport):
+    """This is a custom referee report.
+    """
+    grok.implements(ICustomApplicantRefereeReport)
+    grok.provides(ICustomApplicantRefereeReport)
+
+CustomApplicantRefereeReport = attrs_to_fields(CustomApplicantRefereeReport)
+
+class CustomApplicantRefereeReportFactory(ApplicantRefereeReportFactory):
+    """A factory for applicant online payments.
+    """
+
+    def __call__(self, *args, **kw):
+        return CustomApplicantRefereeReport()
+
+    def getInterfaces(self):
+        return implementedBy(CustomApplicantRefereeReport)
Index: main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser.py	(revision 16779)
+++ main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser.py	(revision 16786)
@@ -31,5 +31,9 @@
 from waeup.kofa.applicants.browser import (
     ApplicantCheckStatusPage,
-    AdditionalFile)
+    AdditionalFile,
+    RefereeReportAddFormPage,
+    RefereeReportDisplayFormPage,
+    ExportPDFReportSlipPage,
+    ExportPDFReportSlipPage2)
 from waeup.kofa.applicants.workflow import STARTED, PAID
 from waeup.kofa.applicants.viewlets import PDFActionButton
@@ -62,4 +66,5 @@
     IRecruitment,
     ICustomApplicantOnlinePayment,
+    ICustomApplicantRefereeReport,
     )
 
@@ -781,4 +786,28 @@
             self.context, applicantview, note=self.note)
 
+class CustomRefereeReportAddFormPage(RefereeReportAddFormPage):
+    """Add-form to add an referee report. This form
+    is protected by a mandate.
+    """
+    form_fields = grok.AutoFields(
+        ICustomApplicantRefereeReport).omit('creation_date')
+
+class CustomRefereeReportDisplayFormPage(RefereeReportDisplayFormPage):
+    """A display view for referee reports.
+    """
+    form_fields = grok.AutoFields(ICustomApplicantRefereeReport)
+    form_fields[
+        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
+
+class CustomExportPDFReportSlipPage(ExportPDFReportSlipPage):
+    form_fields = grok.AutoFields(ICustomApplicantRefereeReport)
+    form_fields[
+        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
+
+class CustomExportPDFReportSlipPage2(ExportPDFReportSlipPage2):
+    form_fields = grok.AutoFields(ICustomApplicantRefereeReport)
+    form_fields[
+        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
+
 class StateResult(AdditionalFile):
     """Renders the pdf form extension for applicants.
Index: main/waeup.aaue/trunk/src/waeup/aaue/applicants/export.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/applicants/export.py	(revision 16779)
+++ main/waeup.aaue/trunk/src/waeup/aaue/applicants/export.py	(revision 16786)
@@ -21,9 +21,11 @@
 from waeup.kofa.applicants.interfaces import IApplicantBaseData
 from waeup.kofa.utils.helpers import iface_names
+from waeup.kofa.applicants.export import ApplicantRefereeReportExporter
 from kofacustom.nigeria.applicants.export import NigeriaApplicantExporter
 from kofacustom.nigeria.applicants.interfaces import (
     INigeriaUGApplicant, INigeriaPGApplicant)
 from waeup.aaue.applicants.interfaces import (
-    ICustomUGApplicant, ITranscriptApplicant, ICertificateRequest)
+    ICustomUGApplicant, ITranscriptApplicant, ICertificateRequest,
+    ICustomApplicantRefereeReport)
 
 class CustomApplicantExporter(NigeriaApplicantExporter):
@@ -41,2 +43,12 @@
         'password', 'state', 'history', 'container_code', 'application_number',
         'display_fullname', 'application_date')
+
+class CustomApplicantRefereeReportExporter(ApplicantRefereeReportExporter):
+
+    fields = tuple(sorted(iface_names(
+        ICustomApplicantRefereeReport,
+        exclude_attribs=False))) + (
+              'applicant_id',
+              'reg_number',
+              'display_fullname',)
+
Index: main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py	(revision 16779)
+++ main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py	(revision 16786)
@@ -33,5 +33,6 @@
 from waeup.kofa.applicants.interfaces import (
     contextual_reg_num_source,
-    IApplicantBaseData)
+    IApplicantBaseData,
+    IApplicantRefereeReport)
 from waeup.kofa.refereeentries import RefereeEntryField
 from waeup.kofa.university.vocabularies import StudyModeSource
@@ -81,4 +82,23 @@
     (_('Proficiency in English Language'), 'english'),
     )
+
+rating_vocab = SimpleKofaVocabulary(
+    (_('Excellent'), 'e'),
+    (_('Very good'), 'vg'),
+    (_('Good'), 'g'),
+    (_('Slightly above average'), 'saa'),
+    (_('Average'), 'a'),
+    (_('Below average'), 'ba'),
+    (_('Unable to assess'), 'unable'),
+    )
+
+overallpromise_vocab = SimpleKofaVocabulary(
+    (_('Very good (highest 10%)'), 'vg'),
+    (_('Good (next 15%)'), 'g'),
+    (_('Above average (next 15%)'), 'aa'),
+    (_('Average (middle 20%)'), 'a'),
+    (_('Below average (lower 10%)'), 'ba'),
+    )
+
 
 class ICustomUGApplicant(IApplicantBaseData):
@@ -1647,5 +1667,80 @@
         )
 
-
-
-
+class ICustomApplicantRefereeReport(IApplicantRefereeReport):
+    """A referee report.
+    """
+
+    duration = schema.Text(
+        title = _(u'How long and in what capacity have you known the candidate?'),
+        required = False,
+        )
+
+    itellectual = schema.Choice(
+        title = _(u'Intellectual Capacity'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    persistent = schema.Choice(
+        title = _(u'Capacity for Persistent and Independent Academic Study'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    imaginative = schema.Choice(
+        title = _(u'Ability for Imaginative Thought'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    productive = schema.Choice(
+        title = _(u'Promise of Productive Scholarship'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    previous = schema.Choice(
+        title = _(u'Quality of Previous Work'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    expression = schema.Choice(
+        title = _(u'Oral and Written Expression in English'),
+        required = False,
+        readonly = False,
+        vocabulary = rating_vocab,
+        )
+
+    personality = schema.Text(
+        title = _(u'Please comment on the candidate\'s personality '
+            'with particular reference to his/her moral character, emotional '
+            'and physical stabilty'),
+        required = False,
+        )
+
+    promise = schema.Choice(
+        title = _(u'Candidate\'s overall promise'),
+        required = False,
+        readonly = False,
+        vocabulary = overallpromise_vocab,
+        )
+
+    report = schema.Text(
+        title = _(u'Any other relevant information which would help '
+            'in determining the candidate\'s suitability?'),
+        required = False,
+        )
+
+    objection = schema.Text(
+        title = _(u'Have you any objection to the contents of this '
+            'evaluation being disclosed to any award-given body if '
+            'the need arises?'),
+        required = False,
+        )
+
