Index: /main/waeup.aaue/trunk/src/waeup/aaue/applicants/applicant.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/applicants/applicant.py	(revision 14303)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/applicants/applicant.py	(revision 14304)
@@ -24,10 +24,11 @@
 from waeup.aaue.applicants.interfaces import(
     ICustomApplicant, ICustomUGApplicantEdit, ICustomPGApplicantEdit,
-    IPUTMEApplicantEdit, ITranscriptApplicant)
+    IPUTMEApplicantEdit, ITranscriptApplicant, ICertificateRequest)
 
 class CustomApplicant(NigeriaApplicant):
 
     grok.implements(ICustomApplicant, ICustomUGApplicantEdit,
-        ICustomPGApplicantEdit, IPUTMEApplicantEdit, ITranscriptApplicant)
+        ICustomPGApplicantEdit, IPUTMEApplicantEdit,
+        ITranscriptApplicant, ICertificateRequest)
     grok.provides(ICustomApplicant)
 
Index: /main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser.py	(revision 14303)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser.py	(revision 14304)
@@ -49,4 +49,5 @@
     ICustomUGApplicantEdit,
     ITranscriptApplicant,
+    ICertificateRequest,
     ICustomApplicant
     )
@@ -230,4 +231,10 @@
             form_fields['perm_address'].custom_widget = BytesDisplayWidget
             return form_fields
+        if self.target is not None and self.target == 'cert':
+            form_fields = grok.AutoFields(ICertificateRequest).omit(
+                'locked', 'suspended')
+            form_fields['dispatch_address'].custom_widget = BytesDisplayWidget
+            form_fields['perm_address'].custom_widget = BytesDisplayWidget
+            return form_fields
         # AAUE is using the same interface for all regular applications.
         form_fields = grok.AutoFields(ICustomUGApplicant)
@@ -261,5 +268,5 @@
     def target_url(self):
         if self.context.state in ('initialized', 'started', 'paid') \
-            or self.context.special or self.view.target == 'trans':
+            or self.context.special or self.view.target in ('trans', 'cert'):
             return
         return self.view.url(self.view.context, self.target)
@@ -337,4 +344,8 @@
             form_fields['applicant_id'].for_display = True
             return form_fields
+        if self.target is not None and self.target == 'cert':
+            form_fields = grok.AutoFields(ICertificateRequest)
+            form_fields['applicant_id'].for_display = True
+            return form_fields
         # AAUE is using the same interface for all regular applications.
         form_fields = grok.AutoFields(ICustomUGApplicant)
@@ -358,6 +369,4 @@
     """An applicant-centered edit view for applicant data.
     """
-
-    grok.template('applicanteditpage')
 
     def unremovable(self, ticket):
@@ -388,4 +397,9 @@
         if self.target is not None and self.target == 'trans':
             form_fields = grok.AutoFields(ITranscriptApplicant).omit(
+                'locked', 'suspended')
+            form_fields['applicant_id'].for_display = True
+            return form_fields
+        if self.target is not None and self.target == 'cert':
+            form_fields = grok.AutoFields(ICertificateRequest).omit(
                 'locked', 'suspended')
             form_fields['applicant_id'].for_display = True
Index: /main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser_templates/applicantdisplaypage.pt
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser_templates/applicantdisplaypage.pt	(revision 14303)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser_templates/applicantdisplaypage.pt	(revision 14304)
@@ -15,5 +15,6 @@
 </div>
 
-<img src="" height="180px" tal:attributes="src view/passport_url" />
+<img  tal:condition="python: not view.target in ('trans', 'cert')"
+      src="" height="180px" tal:attributes="src view/passport_url" />
 
 <table i18n:domain="waeup.kofa" class="form-table">
Index: /main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser_templates/applicanteditpage.pt
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser_templates/applicanteditpage.pt	(revision 14303)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/applicants/browser_templates/applicanteditpage.pt	(revision 14304)
@@ -22,5 +22,5 @@
     <tbody>
       <tal:widgets content="structure provider:widgets" />
-      <tr>
+      <tr tal:condition="python: not view.target in ('trans', 'cert')">
         <td class="fieldname" i18n:translate="">
           Passport Photo:
@@ -69,5 +69,5 @@
   </table>
 
-  <div tal:condition="python: not view.manage_applications and not view.target == 'trans'">
+  <div tal:condition="python: not view.manage_applications and not view.target in ('trans', 'cert')">
     <input id="confirm_passport" name="confirm_passport"
            type="checkbox" value="True"/>&nbsp;&nbsp;
@@ -82,5 +82,5 @@
     </span>
   </div>
-  <div tal:condition="python: not view.manage_applications and view.target == 'trans'">
+  <div tal:condition="python: not view.manage_applications and view.target in ('trans', 'cert')">
     <input id="confirm_passport" name="confirm_passport"
            type="checkbox" value="True"/>&nbsp;&nbsp;
Index: /main/waeup.aaue/trunk/src/waeup/aaue/applicants/export.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/applicants/export.py	(revision 14303)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/applicants/export.py	(revision 14304)
@@ -25,5 +25,5 @@
     INigeriaUGApplicant, INigeriaPGApplicant)
 from waeup.aaue.applicants.interfaces import (
-    ICustomUGApplicant, ITranscriptApplicant)
+    ICustomUGApplicant, ITranscriptApplicant, ICertificateRequest)
 
 class CustomApplicantExporter(NigeriaApplicantExporter):
@@ -36,5 +36,6 @@
         iface_names(INigeriaPGApplicant) +
         iface_names(IApplicantBaseData) +
-        iface_names(ITranscriptApplicant)
+        iface_names(ITranscriptApplicant) +
+        iface_names(ICertificateRequest)
         ))) + (
         'password', 'state', 'history', 'container_code', 'application_number',
Index: /main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py	(revision 14303)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py	(revision 14304)
@@ -607,7 +607,114 @@
         )
 
+class ICertificateRequest(IKofaObject):
+    """A transcript applicant.
+    """
+
+    suspended = schema.Bool(
+        title = _(u'Account suspended'),
+        default = False,
+        required = False,
+        )
+
+    locked = schema.Bool(
+        title = _(u'Form locked'),
+        default = False,
+        required = False,
+        )
+
+    applicant_id = schema.TextLine(
+        title = _(u'Applicant Id'),
+        required = False,
+        readonly = False,
+        )
+
+    firstname = schema.TextLine(
+        title = _(u'First Name'),
+        required = True,
+        )
+
+    middlename = schema.TextLine(
+        title = _(u'Middle Name'),
+        required = False,
+        )
+
+    lastname = schema.TextLine(
+        title = _(u'Last Name (Surname)'),
+        required = True,
+        )
+
+    matric_number = schema.TextLine(
+        title = _(u'Matriculation Number'),
+        readonly = False,
+        required = False,
+        )
+
+    date_of_birth = FormattedDate(
+        title = _(u'Date of Birth'),
+        required = False,
+        #date_format = u'%d/%m/%Y', # Use grok-instance-wide default
+        show_year = True,
+        )
+
+    place_of_birth = schema.TextLine(
+        title = _(u'Place of Birth'),
+        readonly = False,
+        required = False,
+        )
+
+    nationality = schema.Choice(
+        vocabulary = nats_vocab,
+        title = _(u'Nationality'),
+        required = False,
+        )
+
+    email = schema.ASCIILine(
+        title = _(u'Email Address'),
+        required = True,
+        constraint=validate_email,
+        )
+
+    phone = PhoneNumber(
+        title = _(u'Phone'),
+        description = u'',
+        required = False,
+        )
+
+    perm_address = schema.Text(
+        title = _(u'Current Local Address'),
+        required = False,
+        readonly = False,
+        )
+
+    dispatch_address = schema.Text(
+        title = _(u'Dispatch Address'),
+        description = u'Address to which certificate should be posted.',
+        required = False,
+        readonly = False,
+        )
+
+    entry_session = schema.Choice(
+        title = _(u'Entry Session'),
+        source = academic_sessions_vocab,
+        required = False,
+        readonly = False,
+        )
+
+    end_session = schema.Choice(
+        title = _(u'End Session'),
+        source = academic_sessions_vocab,
+        required = False,
+        readonly = False,
+        )
+
+    course_studied = schema.Choice(
+        title = _(u'Course of Study / Degree'),
+        source = CertificateSource(),
+        required = False,
+        readonly = False,
+        )
 
 class ICustomApplicant(ICustomUGApplicant, ICustomPGApplicant,
-                       ITranscriptApplicant):
+                       ITranscriptApplicant, ICertificateRequest):
     """An interface for all three types of applicants.
 
Index: /main/waeup.aaue/trunk/src/waeup/aaue/applicants/tests/test_browser.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/applicants/tests/test_browser.py	(revision 14303)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/applicants/tests/test_browser.py	(revision 14304)
@@ -142,4 +142,33 @@
         self.assertTrue("Dispatch Address" in self.browser.contents)
 
+    def test_certificate_request_manage(self):
+        # Add cert applicants container
+        self.certcontainer = ApplicantsContainer()
+        self.certcontainer.mode = 'create'
+        self.certcontainer.code = u'cert%s' % session_1
+        self.certcontainer.prefix = u'cert'
+        self.certcontainer.application_category = u'no'
+        self.certcontainer.year = session_1
+        self.certcontainer.application_fee = 300.0
+        self.certcontainer.title = u'This is the cert%s container' % session_1
+        self.app['applicants'][self.certcontainer.code] = self.certcontainer
+        delta = datetime.timedelta(days=10)
+        self.certcontainer.startdate = datetime.datetime.now(pytz.utc) - delta
+        self.certcontainer.enddate = datetime.datetime.now(pytz.utc) + delta
+        # Add applicant
+        certapplicant = createObject(u'waeup.Applicant')
+        certapplicant.firstname = u'Anna'
+        certapplicant.lastname = u'Post'
+        self.app['applicants'][self.certcontainer.code].addApplicant(certapplicant)
+        self.certapplication_number = certapplicant.application_number
+        self.certapplicant = self.app['applicants'][self.certcontainer.code][
+            self.certapplication_number]
+        self.certapplicant_path = ('http://localhost/app/applicants/cert%s/%s'
+            % (session_1, self.certapplication_number))
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        self.browser.open(self.certapplicant_path)
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertTrue("Dispatch Address" in self.browser.contents)
+
     def test_pg_application_manage(self):
         # Add pg applicants container
Index: /main/waeup.aaue/trunk/src/waeup/aaue/applicants/utils.py
===================================================================
--- /main/waeup.aaue/trunk/src/waeup/aaue/applicants/utils.py	(revision 14303)
+++ /main/waeup.aaue/trunk/src/waeup/aaue/applicants/utils.py	(revision 14304)
@@ -36,4 +36,5 @@
         'pgpt': ['Postgraduate Part-Time Programmes', 'PG'],
         'trans': ['Transcript Application', 'TR'],
+        'cert': ['Certificate Request', 'CR'],
         'ioedp': ['Institute of Education Diploma Programmes', 'IOE'],
         }
