Index: main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 7124)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 7127)
@@ -1505,5 +1505,5 @@
     def update(self):
         super(StudentPasswordFormPage, self).update()
-        self.wf_info = IWorkflowInfo(self.context)
+        #self.wf_info = IWorkflowInfo(self.context)
         return
 
@@ -1537,5 +1537,5 @@
     grok.context(IStudent)
     grok.name('change_portrait')
-    grok.require('waeup.handleStudent')
+    grok.require('waeup.uploadStudentFile')
     grok.template('filesuploadpage')
     label = 'Upload portrait'
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/filesuploadpage.pt
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/filesuploadpage.pt	(revision 7124)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/filesuploadpage.pt	(revision 7127)
@@ -3,7 +3,10 @@
     tal:content="view/label">Label</h2>
 
-<table class="zebra">
-  <tbody>
-    <tal:files content="structure provider:files" />
-  </tbody>
-</table>
+<form action="." tal:attributes="action request/URL" method="post"
+      class="edit-form" enctype="multipart/form-data">
+  <table class="zebra">
+    <tbody>
+      <tal:files content="structure provider:files" />
+    </tbody>
+  </table>
+</form>
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/fileupload.pt
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/fileupload.pt	(revision 7124)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/fileupload.pt	(revision 7127)
@@ -7,22 +7,23 @@
   <td class="field">
     <span class="widget">
+
       <tal:file tal:condition="viewlet/file_exists">
         <a tal:attributes="href viewlet/download_name"
-           tal:content="viewlet/download_name"
+           tal:content="viewlet/title"
            target="image">
           LINK
         </a>
-        <input type="submit"
-               tal:attributes="id python:('delete_%s' % viewlet.input_name);
-                  name python:('delete_%s' % viewlet.input_name)"
-               value="Delete" class="button" />
-        <br />
       </tal:file>
+      <br />
       <input type="file" tal:attributes="name viewlet/input_name"/>
+      <br />
+      <input type="submit" tal:condition="viewlet/file_exists"
+             tal:attributes="id python:('delete_%s' % viewlet.input_name);
+                name python:('delete_%s' % viewlet.input_name)"
+             value="Delete attachment" class="button" />
       <input type="submit"
                tal:attributes="id python:('upload_%s' % viewlet.input_name);
                   name python:('upload_%s' % viewlet.input_name)"
-               value="Upload" class="button" />
-      <br />
+               value="Upload new file" class="button" />
       <span i18n:translate="">
         Max. file size:
@@ -30,4 +31,5 @@
       </span>
     </span>
+    <br />
   </td>
 </tr>
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/permissions.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/permissions.py	(revision 7124)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/permissions.py	(revision 7127)
@@ -30,4 +30,7 @@
     grok.name('waeup.payStudent')
 
+class UploadStudentFile(grok.Permission):
+    grok.name('waeup.uploadStudentFile')
+
 class ManageStudents(grok.Permission):
     grok.name('waeup.manageStudents')
@@ -37,5 +40,5 @@
     grok.name('waeup.local.StudentRecordOwner')
     grok.title(u'Student Record Owner')
-    grok.permissions('waeup.handleStudent',
+    grok.permissions('waeup.handleStudent', 'waeup.uploadStudentFile',
                      'waeup.viewStudent', 'waeup.payStudent')
 
@@ -50,3 +53,3 @@
     grok.permissions('waeup.View', 'waeup.Public',
                      'waeup.viewStudent', 'waeup.manageStudents',
-                     'waeup.payStudent')
+                     'waeup.payStudent', 'waeup.uploadStudentFile')
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py	(revision 7124)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py	(revision 7127)
@@ -357,5 +357,5 @@
         return
 
-    def test_upload_file(self):
+    def test_manage_upload_file(self):
         # Managers can upload a file via the StudentClearanceManageFormPage
         # The image is stored even if form has errors
@@ -372,5 +372,5 @@
         self.browser.open(self.edit_clearance_student_path)
         pseudo_image = StringIO('I pretend to be a graphics file')
-        ctrl = self.browser.getControl(name='birthcertificateuploadmanage')
+        ctrl = self.browser.getControl(name='birthcertificateupload')
         file_ctrl = ctrl.mech_control
         file_ctrl.add_file(pseudo_image, filename='my_birth_certificate.jpg')
@@ -382,9 +382,9 @@
         # ... but the correct upload submit button does
         pseudo_image = StringIO('I pretend to be a graphics file')
-        ctrl = self.browser.getControl(name='birthcertificateuploadmanage')
+        ctrl = self.browser.getControl(name='birthcertificateupload')
         file_ctrl = ctrl.mech_control
         file_ctrl.add_file(pseudo_image, filename='my_birth_certificate.jpg')
         self.browser.getControl(
-            name='upload_birthcertificateuploadmanage').click()
+            name='upload_birthcertificateupload').click()
         # There is a correct <img> link included
         self.assertTrue(
@@ -401,35 +401,35 @@
         photo_content = 'A' * 1024 * 151  # A string of 21 KB size
         pseudo_image = StringIO(photo_content)
-        ctrl = self.browser.getControl(name='birthcertificateuploadmanage')
+        ctrl = self.browser.getControl(name='birthcertificateupload')
         file_ctrl = ctrl.mech_control
         file_ctrl.add_file(pseudo_image, filename='my_birth_certificate.jpg')
         self.browser.getControl(
-            name='upload_birthcertificateuploadmanage').click()
+            name='upload_birthcertificateupload').click()
         self.assertTrue(
             'Uploaded file is too big' in self.browser.contents)
         # File names must meet several conditions
         pseudo_image = StringIO('I pretend to be a graphics file')
-        ctrl = self.browser.getControl(name='birthcertificateuploadmanage')
+        ctrl = self.browser.getControl(name='birthcertificateupload')
         file_ctrl = ctrl.mech_control
         file_ctrl.add_file(pseudo_image, filename='my.photo.jpg')
         self.browser.getControl(
-            name='upload_birthcertificateuploadmanage').click()
+            name='upload_birthcertificateupload').click()
         self.assertTrue('File name contains more than one dot'
             in self.browser.contents)
-        ctrl = self.browser.getControl(name='birthcertificateuploadmanage')
+        ctrl = self.browser.getControl(name='birthcertificateupload')
         file_ctrl = ctrl.mech_control
         file_ctrl.add_file(pseudo_image, filename='my_birth_certificate')
         self.browser.getControl(
-            name='upload_birthcertificateuploadmanage').click()
+            name='upload_birthcertificateupload').click()
         self.assertTrue('File name has no extension' in self.browser.contents)
-        ctrl = self.browser.getControl(name='birthcertificateuploadmanage')
+        ctrl = self.browser.getControl(name='birthcertificateupload')
         file_ctrl = ctrl.mech_control
         file_ctrl.add_file(pseudo_image, filename='my_birth_certificate.bmp')
         self.browser.getControl(
-            name='upload_birthcertificateuploadmanage').click()
+            name='upload_birthcertificateupload').click()
         self.assertTrue('Only the following extension are allowed'
             in self.browser.contents)
         # Managers can delete files
-        self.browser.getControl(name='delete_birthcertificateuploadmanage').click()
+        self.browser.getControl(name='delete_birthcertificateupload').click()
         self.assertTrue(
             'birth_certificate deleted' in self.browser.contents)
@@ -437,22 +437,22 @@
         self.browser.open(self.edit_clearance_student_path)
         pseudo_image = StringIO('I pretend to be a graphics file')
-        ctrl = self.browser.getControl(name='birthcertificateuploadmanage')
+        ctrl = self.browser.getControl(name='birthcertificateupload')
         file_ctrl = ctrl.mech_control
         file_ctrl.add_file(pseudo_image, filename='my_acceptance_letter.jpg')
         self.browser.getControl(
-            name='upload_acceptanceletteruploadmanage').click()
+            name='upload_acceptanceletterupload').click()
         self.assertFalse(
             '<a target="image" href="acceptance_letter">'
             in self.browser.contents)
-        ctrl = self.browser.getControl(name='acceptanceletteruploadmanage')
+        ctrl = self.browser.getControl(name='acceptanceletterupload')
         file_ctrl = ctrl.mech_control
         file_ctrl.add_file(pseudo_image, filename='my_acceptance_letter.jpg')
         self.browser.getControl(
-            name='upload_acceptanceletteruploadmanage').click()
+            name='upload_acceptanceletterupload').click()
         self.assertTrue(
             '<a target="image" href="acceptance_letter">'
             in self.browser.contents)
         self.browser.getControl(
-            name='delete_acceptanceletteruploadmanage').click()
+            name='delete_acceptanceletterupload').click()
         self.assertTrue(
             'acceptance_letter deleted'
@@ -738,4 +738,15 @@
         self.browser.getControl(name="form.password").value = 'spwd'
         self.browser.getControl("Login").click()
+        # Student can upload a passport picture
+        self.browser.open(self.student_path + '/change_portrait')
+        pseudo_image = StringIO('I pretend to be a graphics file')
+        ctrl = self.browser.getControl(name='passportuploadedit')
+        file_ctrl = ctrl.mech_control
+        file_ctrl.add_file(pseudo_image, filename='my_photo.jpg')
+        self.browser.getControl(
+            name='upload_passportuploadedit').click()
+        self.assertTrue(
+            '<img align="middle" height="125px" src="passport.jpg" />'
+            in self.browser.contents)
         # Student can view the clearance data
         self.browser.getLink("Clearance Data").click()
Index: main/waeup.sirp/trunk/src/waeup/sirp/students/viewlets.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/students/viewlets.py	(revision 7124)
+++ main/waeup.sirp/trunk/src/waeup/sirp/students/viewlets.py	(revision 7127)
@@ -265,4 +265,5 @@
     grok.require('waeup.viewStudent')
     label = u'File:'
+    title = u'Scan'
     download_name = u'filename.jpg'
 
@@ -284,5 +285,5 @@
     grok.view(StudentClearanceManageFormPage)
     grok.template('fileupload')
-    grok.require('waeup.manageStudents')
+    grok.require('waeup.uploadStudentFile')
     mus = 1024 * 150
 
@@ -345,5 +346,5 @@
     """
     grok.view(StudentFilesUploadPage)
-    grok.require('waeup.handleStudent')
+    grok.require('waeup.uploadStudentFile')
 
 class BirthCertificateDisplay(FileDisplay):
@@ -352,11 +353,13 @@
     grok.order(1)
     label = u'Birth Certificate:'
+    title = u'Birth Certificate Scan'
     download_name = u'birth_certificate'
 
-class BirthCertificateUploadManage(FileUpload):
+class BirthCertificateUpload(FileUpload):
     """Birth Certificate upload viewlet.
     """
     grok.order(1)
     label = u'Birth Certificate:'
+    title = u'Birth Certificate Scan'
     mus = 1024 * 150
     download_name = u'birth_certificate'
@@ -367,23 +370,15 @@
     grok.order(1)
     label = u'Acceptance Letter:'
+    title = u'Acceptance Letter Scan'
     download_name = u'acceptance_letter'
 
-class AcceptanceLetterUploadManage(FileUpload):
+class AcceptanceLetterUpload(FileUpload):
     """AcceptanceLetter upload viewlet.
     """
     grok.order(2)
     label = u'Acceptance Letter:'
+    title = u'Acceptance Letter Scan'
     mus = 1024 * 150
     download_name = u'acceptance_letter'
-
-class BirthCertificateUploadEdit(BirthCertificateUploadManage):
-    """Birth Certificate upload viewlet for student.
-    """
-    grok.require('waeup.handleStudent')
-
-class AcceptanceLetterUploadEdit(AcceptanceLetterUploadManage):
-    """AcceptanceLetter upload viewlet for student.
-    """
-    grok.require('waeup.handleStudent')
 
 class Image(grok.View):
