Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 16119)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 16120)
@@ -1663,7 +1663,7 @@
     buttonname = _('Check status now')
     pnav = 8
-    websites = (('DemoPortal', 'http://localhost:8080/app/'),)
-    appl_url1 = 'http://localhost:8080/app/applicants'
-    appl_url2 = 'http://localhost:8080/app/applicants'
+    websites = (('DemoPortal', 'https://kofa-demo.waeup.org/'),)
+    appl_url1 = 'https://kofa-demo.waeup.org/applicants'
+    appl_url2 = 'https://kofa-demo.waeup.org/applicants'
 
     def update(self, SUBMIT=None):
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 16119)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 16120)
@@ -1546,15 +1546,6 @@
         self.browser.getControl(name="email").value = 'aa@aa.aa'
         self.browser.getControl("Check status now").click()
-        # Here the test fails because it seems that
-        # xmlrpclib.ServerProxy can't be
-        # used in tests even if we use
-        # zope.app.testing.xmlrpc import ServerProxy with correct
-        # URL. Any idea Uli?
         self.assertTrue('No student record was found in Kofa'
             in self.browser.contents)
-        self.browser.getControl(
-          name="unique_id").value = self.applicant.applicant_id
-        self.browser.getControl(name="email").value = 'aa@aa.aa'
-        self.browser.getControl("Check status now").click()
 
 class ApplicantsExportTests(ApplicantsFullSetup, FunctionalAsyncTestCase):
Index: /main/waeup.kofa/trunk/src/waeup/kofa/browser/layout.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/browser/layout.py	(revision 16119)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/browser/layout.py	(revision 16120)
@@ -206,4 +206,6 @@
         if self.widgets.get('transcript_comment'):
             self.widgets['transcript_comment'].height = 12
+        if self.widgets.get('transcript_remark'):
+            self.widgets['transcript_remark'].height = 6
         if self.widgets.get('jamb_subjects'):
             self.widgets['jamb_subjects'].height = 6
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 16119)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 16120)
@@ -1150,5 +1150,5 @@
     notice = ''
     pnav = 4
-    buttonname = _('Submit')
+    buttonname = _('Request now')
     with_ac = True
 
@@ -1215,4 +1215,14 @@
         return
 
+class TOStudentTranscriptRequestPage(StudentTranscriptRequestPage):
+    """ Page to request transcript by student
+    """
+    grok.context(IStudent)
+    grok.name('request_transcript_for_student')
+    grok.require('waeup.processTranscript')
+    grok.template('transcriptrequest')
+    label = _('Request transcript for student')
+    with_ac = False
+
 class StudentTranscriptSignView(UtilityView, grok.View):
     """ View to sign transcript
@@ -1263,5 +1273,6 @@
     grok.template('transcriptprocess')
     label = _('Validate transcript')
-    buttonname = _('Save comment and validate transcript')
+    buttonname1 = _('Save comment')
+    buttonname2 = _('Save comment and validate transcript')
     pnav = 4
 
@@ -1287,5 +1298,5 @@
         return levelremarks
 
-    def update(self, SUBMIT=None):
+    def update(self, SUBMIT=None, SAVE=None):
         super(StudentTranscriptValidateFormPage, self).update()
         if self.context.student.state != TRANSREQ:
@@ -1303,24 +1314,26 @@
         else:
             self.signees = ''
-        if SUBMIT is None:
-            return
-        # Fire transition
-        IWorkflowInfo(self.context.student).fireTransition('validate_transcript')
-        self.flash(_('Transcript validated.'))
-        comment = self.request.form.get('comment', '').replace('\r', '')
-        tz = getattr(queryUtility(IKofaUtils), 'tzinfo', pytz.utc)
-        today = now(tz).strftime('%d/%m/%Y %H:%M:%S %Z')
-        old_transcript_comment = getattr(
-            self.context, 'transcript_comment', None)
-        if old_transcript_comment == None:
-            old_transcript_comment = ''
-        self.context.transcript_comment = '''On %s %s wrote:
+        if SUBMIT is None and SAVE is None:
+            return
+        if SAVE or SUBMIT:
+            # Save comment and append old comment
+            comment = self.request.form.get('comment', '').replace('\r', '')
+            tz = getattr(queryUtility(IKofaUtils), 'tzinfo', pytz.utc)
+            today = now(tz).strftime('%d/%m/%Y %H:%M:%S %Z')
+            old_transcript_comment = getattr(
+                self.context, 'transcript_comment', None)
+            if old_transcript_comment == None:
+                old_transcript_comment = ''
+            self.context.transcript_comment = '''On %s %s wrote:
 
 %s
 
-%s''' % (today, self.request.principal.id, comment,
-         old_transcript_comment)
-        self.context.writeLogMessage(
-            self, 'comment: %s' % comment.replace('\n', '<br>'))
+%s''' % (today, self.request.principal.id, comment, old_transcript_comment)
+            self.context.writeLogMessage(
+                self, 'comment: %s' % comment.replace('\n', '<br>'))
+        if SUBMIT:
+            # Fire transition
+            IWorkflowInfo(self.context.student).fireTransition('validate_transcript')
+            self.flash(_('Transcript validated.'))
         self.redirect(self.url(self.context) + '/transcript')
         return
@@ -1334,5 +1347,6 @@
     grok.template('transcriptprocess')
     label = _('Release transcript')
-    buttonname = _('Save comment and release transcript')
+    buttonname1 = None
+    buttonname2 = _('Save comment and release transcript')
     pnav = 4
 
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcriptprocess.pt
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcriptprocess.pt	(revision 16119)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcriptprocess.pt	(revision 16120)
@@ -40,6 +40,20 @@
             <td colspan="2">
               <br />
-              <input type="submit" name="SUBMIT" class="btn btn-primary"
-                     tal:attributes="value view/buttonname" />
+              <input
+                data-toggle="tooltip"
+                title="Comments will be added to the correspondence.
+                  They can't be edited or removed after saving."
+                onclick="return window.confirm('Are you really sure?')"
+                type="submit" name="SAVE" class="btn btn-primary"
+                tal:condition="view/buttonname1"
+                tal:attributes="value view/buttonname1" />
+              <input
+                data-toggle="tooltip"
+                title="Comments will be added to the correspondence.
+                  They can't be edited or removed after saving and
+                  transcript validation."
+                onclick="return window.confirm('Are you really sure?')"
+                type="submit" name="SUBMIT" class="btn btn-primary"
+                     tal:attributes="value view/buttonname2" />
             </td>
           </tr>
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 16119)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 16120)
@@ -637,5 +637,5 @@
         )
 
-    transcript_remark = schema.TextLine(
+    transcript_remark = schema.Text(
         title = _(u'Transcript Remark'),
         required = False,
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 16119)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 16120)
@@ -2125,5 +2125,5 @@
 
     def test_process_transcript(self):
-        IWorkflowState(self.student).setState('transcript requested')
+        IWorkflowState(self.student).setState('graduated')
         notify(grok.ObjectModifiedEvent(self.student))
         self.student['studycourse'].transcript_comment = (
@@ -2145,4 +2145,9 @@
         self.browser.getControl("Login").click()
         self.assertMatches('...You logged in...', self.browser.contents)
+        # Officer can request transcript for students
+        self.browser.open(self.student_path)
+        self.browser.getLink("Request transcript for student").click()
+        self.browser.getControl("Request now").click()
+        self.assertEqual(self.student.state, 'transcript requested')
         # Officer can see his roles
         self.browser.getLink("My Roles").click()
@@ -3621,5 +3626,5 @@
         self.browser.getControl(name="comment").value = 'Comment line 1 \nComment line2'
         self.browser.getControl(name="address").value = 'Address line 1 \nAddress line2'
-        self.browser.getControl("Submit").click()
+        self.browser.getControl("Request now").click()
         self.assertMatches('...Transcript processing has been started...',
                           self.browser.contents)
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 16119)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 16120)
@@ -764,4 +764,9 @@
         return self.view.url(self.view.context, self.target)
 
+class TORequestTranscriptActionButton(RequestTranscriptActionButton):
+    grok.require('waeup.processTranscript')
+    text = _('Request transcript for student')
+    target = 'request_transcript_for_student'
+
 
 class ValidateTranscriptActionButton(ManageActionButton):
