Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8412)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8420)
@@ -591,13 +591,11 @@
             'b':self.context.p_id})
 
-class OnlinePaymentCallbackPage(UtilityView, grok.View):
-    """ Callback view
+class OnlinePaymentApprovePage(UtilityView, grok.View):
+    """ Approval view
     """
     grok.context(IApplicantOnlinePayment)
-    grok.name('simulate_callback')
-    grok.require('waeup.payApplicant')
-
-    # This update method simulates a valid callback und must be
-    # neutralized in the customization package.
+    grok.name('approve')
+    grok.require('waeup.managePortal')
+
     def update(self):
         self.wf_info = IWorkflowInfo(self.context.__parent__)
@@ -607,8 +605,5 @@
             self.flash('Error: %s' % sys.exc_info()[1])
             return
-        self.context.r_amount_approved = self.context.amount_auth
-        self.context.r_code = u'00'
-        self.context.p_state = 'paid'
-        self.context.payment_date = datetime.utcnow()
+        self.context.approve()
         ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
         self.context.__parent__.loggerInfo(
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 8412)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 8420)
@@ -696,13 +696,12 @@
         #self.assertMatches('...Ticket not yet paid...',
         #                   self.browser.contents)
-        # Request callback
-        self.browser.getLink("Request callback").click()
-        self.assertMatches('...Valid callback received...',
-                          self.browser.contents)
-        # Callback can't be applied twice
-        self.browser.open(payment_url + '/simulate_callback')
-        self.assertMatches(
-            "...Transition 'pay' requires 'started' as source state...",
-            self.browser.contents)
+        # Approve payment
+        # Applicants can't approve payments
+        self.assertRaises(
+            Unauthorized, self.browser.open, payment_url + '/approve')
+        # We approve the payment by bypassing the view
+        payment_id = self.applicant.keys()[0]
+        payment = self.applicant[payment_id]
+        payment.approve()
         # The payment slip can be downloaded now
         self.browser.open(payment_url)
@@ -711,10 +710,28 @@
         self.assertEqual(self.browser.headers['Content-Type'],
                          'application/pdf')
-        # Applicant is is in state 'paid'
+        # Applicant is is not yet in state 'paid' because it was only
+        # the payment which we set to paid
         self.browser.open(self.view_path)
-        self.assertMatches('...paid...',
+        self.assertMatches('...started...',
                            self.browser.contents)
         state = IWorkflowState(self.applicant).getState()
+        self.assertTrue(state == 'started')
+        # Let's logout and approve the payment as manager
+        self.browser.getLink("Logout").click()
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        # First we reset the payment
+        payment.r_amount_approved = 0.0
+        payment.r_code = u''
+        payment.p_state = 'unpaid'
+        payment.r_desc = u''
+        payment.payment_date = None
+        self.browser.open(payment_url)
+        self.browser.getLink("Approve payment").click()
+        self.assertEqual(payment.p_state, 'paid')
+        self.assertEqual(payment.r_amount_approved, 200.0)
+        self.assertEqual(payment.r_code, 'AP')
+        state = IWorkflowState(self.applicant).getState()
         self.assertTrue(state == 'paid')
+        return
 
     def test_final_submit(self):
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/viewlets.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/viewlets.py	(revision 8412)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/viewlets.py	(revision 8420)
@@ -185,15 +185,13 @@
         return self.view.url(self.view.context, self.target)
 
-class RequestCallbackActionButton(ManageActionButton):
+class ApprovePaymentActionButton(ManageActionButton):
     grok.order(2)
     grok.context(IApplicantOnlinePayment)
     grok.view(OnlinePaymentDisplayFormPage)
-    grok.require('waeup.payApplicant')
+    grok.require('waeup.managePortal')
     icon = 'actionicon_call.png'
-    text = _('Request callback')
-    target = 'simulate_callback'
-
-    # This button must be neutralized
-    # in the customization package.
+    text = _('Approve payment')
+    target = 'approve'
+
     @property
     def target_url(self):
