Index: /main/kofacustom.dspg/trunk/src/kofacustom/dspg/locales/en/LC_MESSAGES/waeup.kofa.po
===================================================================
--- /main/kofacustom.dspg/trunk/src/kofacustom/dspg/locales/en/LC_MESSAGES/waeup.kofa.po	(revision 14881)
+++ /main/kofacustom.dspg/trunk/src/kofacustom/dspg/locales/en/LC_MESSAGES/waeup.kofa.po	(revision 14882)
@@ -29,2 +29,5 @@
 msgid "Foreigner Returning School Fee"
 msgstr "Returning School Fee (Non-Deltan)"
+
+msgid "Birth Certificate"
+msgstr "Birth Certificate / Age Declaration"
Index: /main/kofacustom.dspg/trunk/src/kofacustom/dspg/students/browser.py
===================================================================
--- /main/kofacustom.dspg/trunk/src/kofacustom/dspg/students/browser.py	(revision 14881)
+++ /main/kofacustom.dspg/trunk/src/kofacustom/dspg/students/browser.py	(revision 14882)
@@ -46,2 +46,23 @@
 from kofacustom.dspg.interfaces import MessageFactory as _
 
+class CustomStudentClearanceEditFormPage(NigeriaStudentClearanceEditFormPage):
+    """ View to edit student clearance data by student
+    """
+
+    def dataNotComplete(self):
+        store = getUtility(IExtFileStore)
+        if not store.getFileByContext(self.context, attr=u'birth_certificate.jpg'):
+            return _('No birth certificate uploaded.')
+        if not store.getFileByContext(self.context, attr=u'lga_ident.jpg'):
+            return _('No LGA identification letter uploaded.')
+        if not store.getFileByContext(self.context, attr=u'o_level_result.jpg'):
+            return _('No O Level result uploaded.')
+        if self.context.current_mode.startswith('nd'):
+            if not store.getFileByContext(self.context, attr=u'jamb_result.jpg'):
+                return _('No JAMB result uploaded.')
+        elif self.context.current_mode.startswith('hnd'):
+            if not store.getFileByContext(self.context, attr=u'nd_result.jpg'):
+                return _('No ND result uploaded.')
+            if not store.getFileByContext(self.context, attr=u'it_letter.jpg'):
+                return _('No IT letter uploaded.')
+        return False
Index: /main/kofacustom.dspg/trunk/src/kofacustom/dspg/students/utils.py
===================================================================
--- /main/kofacustom.dspg/trunk/src/kofacustom/dspg/students/utils.py	(revision 14881)
+++ /main/kofacustom.dspg/trunk/src/kofacustom/dspg/students/utils.py	(revision 14882)
@@ -180,2 +180,18 @@
         payment.amount_auth = amount
         return None, payment
+
+    #: A tuple containing names of file upload viewlets which are not shown
+    #: on the `StudentClearanceManageFormPage`. Nothing is being skipped
+    #: in the base package. This attribute makes only sense, if intermediate
+    #: custom packages are being used, like we do for all Nigerian portals.
+    SKIP_UPLOAD_VIEWLETS = ('acceptanceletterupload',
+                            'higherqualificationresultupload',
+                            'advancedlevelresultupload',
+                            'evidencenameupload',
+                            'refereeletterupload',
+                            'statutorydeclarationupload',
+                            'firstsittingresultupload',
+                            'secondsittingresultupload',
+                            'certificateupload',
+                            'resultstatementupload',
+                            )
Index: /main/kofacustom.dspg/trunk/src/kofacustom/dspg/students/viewlets.py
===================================================================
--- /main/kofacustom.dspg/trunk/src/kofacustom/dspg/students/viewlets.py	(revision 14881)
+++ /main/kofacustom.dspg/trunk/src/kofacustom/dspg/students/viewlets.py	(revision 14882)
@@ -18,6 +18,8 @@
 
 import grok
+from zope.component import getUtility
 from waeup.kofa.interfaces import REQUESTED
 from waeup.kofa.browser.viewlets import ManageActionButton
+from waeup.kofa.students.interfaces import IStudentsUtils
 from kofacustom.dspg.students.interfaces import (
     ICustomStudentStudyCourse, ICustomStudentStudyLevel)
@@ -29,2 +31,134 @@
 
 from kofacustom.nigeria.interfaces import MessageFactory as _
+
+# ND Result
+
+class NDResultDisplay(StudentFileDisplay):
+    """ND Result display viewlet.
+    """
+    grok.order(19)
+    label = _(u'ND Result')
+    title = _(u'ND Result')
+    download_name = u'nd_result'
+
+class NDResultSlip(NDResultDisplay):
+    grok.view(ExportPDFClearanceSlip)
+
+class NDResultUpload(StudentFileUpload):
+    """ND Result upload viewlet.
+    """
+    grok.order(19)
+    label = _(u'ND Result')
+    title = _(u'ND Result Scan')
+    mus = 1024 * 250
+    download_name = u'nd_result'
+
+    @property
+    def show_viewlet(self):
+        students_utils = getUtility(IStudentsUtils)
+        if self.__name__ in students_utils.SKIP_UPLOAD_VIEWLETS:
+            return False
+        return self.context.current_mode.startswith('hnd')
+
+class NDResultImage(StudentImage):
+    """Renders ND Result scan.
+    """
+    grok.name('nd_result')
+    download_name = u'nd_result'
+
+# O Level Result
+
+class OLevelResultDisplay(StudentFileDisplay):
+    """O Level Result display viewlet.
+    """
+    grok.order(19)
+    label = _(u'O Level Result')
+    title = _(u'O Level Result')
+    download_name = u'o_level_result'
+
+class OLevelResultSlip(OLevelResultDisplay):
+    grok.view(ExportPDFClearanceSlip)
+
+class OLevelResultUpload(StudentFileUpload):
+    """O Level Result upload viewlet.
+    """
+    grok.order(19)
+    label = _(u'O Level Result')
+    title = _(u'O Level Result Scan')
+    mus = 1024 * 250
+    download_name = u'o_level_result'
+
+class OLevelResultImage(StudentImage):
+    """Renders O Level Result scan.
+    """
+    grok.name('o_level_result')
+    download_name = u'o_level_result'
+
+# IT Letter
+
+class ITLetterDisplay(StudentFileDisplay):
+    """IT Letter display viewlet.
+    """
+    grok.order(19)
+    label = _(u'IT Letter')
+    title = _(u'IT Letter')
+    download_name = u'it_letter'
+
+class ITLetterSlip(ITLetterDisplay):
+    grok.view(ExportPDFClearanceSlip)
+
+class ITLetterUpload(StudentFileUpload):
+    """IT Letter upload viewlet.
+    """
+    grok.order(19)
+    label = _(u'IT Letter')
+    title = _(u'IT Letter Scan')
+    mus = 1024 * 250
+    download_name = u'it_letter'
+
+    @property
+    def show_viewlet(self):
+        students_utils = getUtility(IStudentsUtils)
+        if self.__name__ in students_utils.SKIP_UPLOAD_VIEWLETS:
+            return False
+        return self.context.current_mode.startswith('hnd')
+
+class ITLetterImage(StudentImage):
+    """Renders IT Letter scan.
+    """
+    grok.name('it_letter')
+    download_name = u'it_letter'
+
+# JAMB Result
+
+class JAMBResultDisplay(StudentFileDisplay):
+    """JAMB Result display viewlet.
+    """
+    grok.order(19)
+    label = _(u'JAMB Result')
+    title = _(u'JAMB Result')
+    download_name = u'jamb_result'
+
+class JAMBResultSlip(JAMBResultDisplay):
+    grok.view(ExportPDFClearanceSlip)
+
+class JAMBResultUpload(StudentFileUpload):
+    """JAMB Result upload viewlet.
+    """
+    grok.order(19)
+    title = _(u'JAMB Result Scan')
+    mus = 1024 * 250
+    download_name = u'jamb_result'
+
+    @property
+    def label(self):
+        if self.context.current_mode.startswith('hnd'):
+            return u'JAMB Result / ND Admission Letter (optional)'
+        else:
+            return u'JAMB Result'
+
+class JAMBResultImage(StudentImage):
+    """Renders JAMB Result scan.
+    """
+    grok.name('jamb_result')
+    download_name = u'jamb_result'
