Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/browser.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/browser.py	(revision 12529)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/browser.py	(revision 12534)
@@ -18,5 +18,5 @@
 
 from zope.component import getUtility
-from waeup.ikoba.interfaces import IIkobaUtils
+from waeup.ikoba.interfaces import IIkobaUtils, IExtFileStore
 from waeup.ikoba.customers.browser import (
     PDFContractSlipPage, CustomerBaseEditFormPage)
@@ -38,5 +38,11 @@
 
     def dataNotComplete(self):
-        """To be implemented in the customization package.
-        """
-        return False
+        store = getUtility(IExtFileStore)
+        error = ''
+        if not store.getFileByContext(self.context, attr=u'birth_certificate.pdf'):
+            error += _('Birth certificate is missing. ')
+        if not store.getFileByContext(self.context, attr=u'passport.jpg'):
+            error += _('Passport picture is missing.')
+        if error:
+            return error
+        return
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/fileviewlets.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/fileviewlets.py	(revision 12529)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/fileviewlets.py	(revision 12534)
@@ -19,5 +19,5 @@
 import grok
 from waeup.ikoba.interfaces import MessageFactory as _
-
+from waeup.ikoba.customers.interfaces import ICustomer
 from waeup.ikoba.browser.fileviewlets import (
     FileDisplay, FileUpload, Image)
@@ -27,10 +27,57 @@
 
 from waeup.ikoba.customers.browser import (
+    CustomerBaseDisplayFormPage,
+    CustomerBaseManageFormPage,
+    CustomerFilesUploadPage,
     DocumentDisplayFormPage,
     DocumentManageFormPage,
     DocumentEditFormPage,
-    PDFDocumentSlipPage,)
+    PDFDocumentSlipPage)
 
 grok.templatedir('browser_templates')
+
+# File viewlets for customer base page
+
+class BirthCertificateDisplay(FileDisplay):
+    """Birth certificate display viewlet.
+    """
+    grok.order(2)
+    grok.context(ICustomer)
+    grok.view(CustomerBaseDisplayFormPage)
+    grok.require('waeup.viewCustomer')
+    label = _(u'Birth Certificate')
+    download_name = u'birth_certificate.pdf'
+    download_filename = u'birth_certificate.pdf'
+
+
+class BirthCertificateManageUpload(FileUpload):
+    """Birth Certificate upload viewlet for officers.
+    """
+    grok.order(2)
+    grok.context(ICustomer)
+    grok.view(CustomerBaseManageFormPage)
+    grok.require('waeup.manageCustomer')
+    label = _(u'Birth Certificate (pdf only)')
+    mus = 1024 * 200
+    download_name = u'birth_certificate.pdf'
+    download_filename = u'birth_certificate.pdf'
+    tab_redirect = '#tab2'
+
+
+class BirthCertificateEditUpload(BirthCertificateManageUpload):
+    """Birth certificate upload viewlet for customers.
+    """
+    grok.view(CustomerFilesUploadPage)
+    grok.require('waeup.handleCustomer')
+
+
+class BirthCertificate(Image):
+    """Renders pdf.
+    """
+    grok.name('birth_certificate.pdf')
+    download_name = u'birth_certificate.pdf'
+    grok.context(ICustomer)
+    grok.require('waeup.viewCustomer')
+    download_filename = u'birth_certificate.pdf'
 
 # File viewlets for customer documents
Index: main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_browser.py
===================================================================
--- main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_browser.py	(revision 12529)
+++ main/ikobacustom.pcn/trunk/src/ikobacustom/pcn/customers/tests/test_browser.py	(revision 12534)
@@ -332,4 +332,71 @@
         return
 
+
+class CustomerUITests(CustomersFullSetup):
+
+    layer = FunctionalLayer
+
+    def setup_customizable_params(self):
+        self._contract_category = u'ron'
+        self._document_factory = 'waeup.PCNCustomerPDFDocument'
+        self._contract_factory = 'waeup.RONContract'
+        return
+
+    def test_customer_edit_upload_upload_and_request(self):
+        # Customer cant login if their password is not set
+        self.browser.open(self.login_path)
+        self.browser.getControl(name="form.login").value = self.customer_id
+        self.browser.getControl(name="form.password").value = 'cpwd'
+        self.browser.getControl("Login").click()
+        self.assertMatches(
+            '...You logged in...', self.browser.contents)
+        self.browser.getLink("Edit").click()
+        self.browser.getControl(name="form.email").value = 'new_email@aa.ng'
+        self.browser.getControl("Save", index=0).click()
+        self.assertMatches('...Form has been saved...',
+                           self.browser.contents)
+        self.browser.getControl("Save and request registration").click()
+        self.assertMatches('...Passport picture is missing...',
+                           self.browser.contents)
+        self.assertEqual(self.customer.state, 'started')
+        # Customer must upload a passport picture. We are already on
+        # the upload page.
+        ctrl = self.browser.getControl(name='passporteditupload')
+        file_obj = open(SAMPLE_IMAGE, 'rb')
+        file_ctrl = ctrl.mech_control
+        file_ctrl.add_file(file_obj, filename='my_photo.jpg')
+        self.browser.getControl(
+            name='upload_passporteditupload').click()
+        self.assertTrue(
+            'src="http://localhost/app/customers/K1000000/passport.jpg"'
+            in self.browser.contents)
+        self.browser.getControl(name="CANCEL").click()
+        self.assertEqual(self.browser.url, self.customer_path)
+        self.browser.getLink("Edit").click()
+        self.browser.getControl("Save and request registration").click()
+        self.assertMatches('...Birth certificate is missing...',
+                           self.browser.contents)
+        self.assertEqual(self.customer.state, 'started')
+        ctrl = self.browser.getControl(name='birthcertificateeditupload')
+        file_obj = open(SAMPLE_PDF, 'rb')
+        file_ctrl = ctrl.mech_control
+        file_ctrl.add_file(file_obj, filename='my_bc.pdf')
+        self.browser.getControl(
+            name='upload_birthcertificateeditupload').click()
+        self.assertTrue(
+            'href="http://localhost/app/customers/K1000000/birth_certificate.pdf"'
+            in self.browser.contents)
+        self.browser.getControl(name="CANCEL").click()
+        self.browser.getLink("Edit").click()
+        self.browser.getControl("Save and request registration").click()
+        self.assertMatches('...Registration form has been submitted...',
+                           self.browser.contents)
+        self.assertEqual(self.customer.state, 'requested')
+        # Customer can view history
+        self.browser.getLink("History").click()
+        self.assertMatches('...Customer created by system...',
+            self.browser.contents)
+
+
 class DocumentUITests(CustomersFullSetup):
     # Tests for customer document related views and pages
@@ -388,4 +455,5 @@
             'attachment; filename="%s.pdf' % docid[:9])
 
+
 class ContractUITests(CustomersFullSetup):
     # Tests for contract related views and pages
