Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8433)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8434)
@@ -730,5 +730,6 @@
         transition.
         """
-        allowed_transitions = self.wf_info.getManualTransitions()
+        allowed_transitions = [t for t in self.wf_info.getManualTransitions()
+            if not t[0] == 'pay']
         return [dict(name='', title=_('No transition'))] +[
             dict(name=x, title=y) for x, y in allowed_transitions]
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/payment.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/payment.py	(revision 8433)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/payment.py	(revision 8434)
@@ -45,5 +45,5 @@
         wf_info = IWorkflowInfo(self.__parent__)
         try:
-            wf_info.fireTransition('pay')
+            wf_info.fireTransition('approve')
         except InvalidTransitionError:
             msg = log = 'Error: %s' % sys.exc_info()[1]
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/workflow.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/workflow.py	(revision 8433)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/workflow.py	(revision 8434)
@@ -65,5 +65,12 @@
         transition_id = 'pay',
         title = _('Pay application fee'),
-        msg = _('Fee paid'),
+        msg = _('Payment made'),
+        source = STARTED,
+        destination = PAID),
+
+    Transition(
+        transition_id = 'approve',
+        title = _('Approve payment'),
+        msg = _('Payment approved'),
         source = STARTED,
         destination = PAID),
Index: /main/waeup.kofa/trunk/src/waeup/kofa/payments/payment.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/payments/payment.py	(revision 8433)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/payments/payment.py	(revision 8434)
@@ -83,5 +83,11 @@
         self.p_state = 'paid'
         user = get_current_principal()
-        r_desc = _('Payment approved by ${a}', mapping = {'a': user.id})
+        user = get_current_principal()
+        if user is None:
+            # in tests
+            usertitle = 'system'
+        else:
+            usertitle = user.title
+        r_desc = _('Payment approved by ${a}', mapping = {'a': usertitle})
         portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
         self.r_desc = translate(r_desc, 'waeup.kofa',
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 8433)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 8434)
@@ -362,5 +362,6 @@
         transition.
         """
-        allowed_transitions = self.wf_info.getManualTransitions()
+        allowed_transitions = [t for t in self.wf_info.getManualTransitions()
+            if not t[0].startswith('pay')]
         return [dict(name='', title=_('No transition'))] +[
             dict(name=x, title=y) for x, y in allowed_transitions]
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 8433)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 8434)
@@ -725,6 +725,8 @@
         self.browser.getControl(name="transition").value = ['clear']
         self.browser.getControl("Save").click()
+        # Managers approve payment, they do not pay
+        self.assertFalse('pay_first_school_fee' in self.browser.contents)
         self.browser.getControl(
-            name="transition").value = ['pay_first_school_fee']
+            name="transition").value = ['approve_first_school_fee']
         self.browser.getControl("Save").click()
         self.browser.getControl(name="transition").value = ['reset6']
@@ -732,5 +734,5 @@
         # In state returning the pay_school_fee transition triggers some 
         # changes of attributes
-        self.browser.getControl(name="transition").value = ['pay_school_fee']
+        self.browser.getControl(name="transition").value = ['approve_school_fee']
         self.browser.getControl("Save").click()
         self.assertEqual(student['studycourse'].current_session, 2005) # +1
@@ -1399,5 +1401,5 @@
         self.assertEqual(payment.r_amount_approved, 3456.0)
         self.assertEqual(payment.r_code, 'AP')
-        self.assertEqual(payment.r_desc, u'Payment approved by K1000000')
+        self.assertEqual(payment.r_desc, u'Payment approved by Anna Tester')
         # The new CLR-0 pin has been created
         self.assertEqual(len(self.app['accesscodes']['CLR-0']),1)
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py	(revision 8433)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py	(revision 8434)
@@ -90,4 +90,11 @@
 
     Transition(
+        transition_id = 'approve_first_school_fee',
+        title = _('Approve payment'),
+        msg = _('School fee payment approved'),
+        source = CLEARED,
+        destination = PAID),
+
+    Transition(
         transition_id = 'reset5',
         title = _('Reset to cleared'),
@@ -100,4 +107,11 @@
         title = _('Pay school fee'),
         msg = _('School fee paid'),
+        source = RETURNING,
+        destination = PAID),
+
+    Transition(
+        transition_id = 'approve_school_fee',
+        title = _('Approve payment'),
+        msg = _('School fee payment approved'),
         source = RETURNING,
         destination = PAID),
@@ -193,10 +207,8 @@
     if event.transition.transition_id in UNLOCK_CLEARANCE_TRANS:
         obj.clearance_locked = False
-    # Student data don't change after first-time payment
-    if event.transition.transition_id == 'pay_first_school_fee':
-        pass
     # School fee payment of returning students triggers the change of
     # current session, current level, and current verdict
-    if event.transition.transition_id == 'pay_school_fee':
+    if event.transition.transition_id in (
+        'pay_school_fee', 'approve_school_fee'):
         getUtility(IStudentsUtils).setReturningData(obj)
     # In some tests we don't have a students container
