Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8420)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8422)
@@ -599,15 +599,10 @@
 
     def update(self):
-        self.wf_info = IWorkflowInfo(self.context.__parent__)
-        try:
-            self.wf_info.fireTransition('pay')
-        except InvalidTransitionError:
-            self.flash('Error: %s' % sys.exc_info()[1])
-            return
-        self.context.approve()
-        ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
-        self.context.__parent__.loggerInfo(
-            ob_class, 'valid callback: %s' % self.context.p_id)
-        self.flash(_('Valid callback received.'))
+        success, msg = self.context.approveApplicantPayment()
+        if success:
+            ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
+            self.context.__parent__.loggerInfo(
+                ob_class, 'valid callback: %s' % self.context.p_id)
+        self.flash(msg)
         return
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py	(revision 8420)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py	(revision 8422)
@@ -517,2 +517,12 @@
 
     """
+
+    def doAfterApplicantPayment():
+        """Process applicant after payment was made.
+
+        """
+
+    def approveApplicantPayment():
+        """Approve payment and process applicant.
+
+        """
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/payment.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/payment.py	(revision 8420)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/payment.py	(revision 8422)
@@ -20,6 +20,8 @@
 """
 import grok
+from hurry.workflow.interfaces import IWorkflowInfo
 from zope.component.interfaces import IFactory
 from zope.interface import implementedBy
+from waeup.kofa.interfaces import MessageFactory as _
 from waeup.kofa.payments import OnlinePayment
 from waeup.kofa.applicants.interfaces import IApplicantOnlinePayment
@@ -35,4 +37,22 @@
         super(ApplicantOnlinePayment, self).__init__()
         return
+
+    def doAfterApplicantPayment(self):
+        """Process applicant after payment was made.
+        """
+        wf_info = IWorkflowInfo(self.__parent__)
+        try:
+            wf_info.fireTransition('pay')
+        except InvalidTransitionError:
+            return False, 'Error: %s' % sys.exc_info()[1]
+        return True, _('Valid callback received.')
+
+    def approveApplicantPayment(self):
+        """Approve payment and process applicant.
+        """
+        if self.p_state == 'paid':
+            return False, _('This ticket has already been paid.')
+        self.approve()
+        return self.doAfterApplicantPayment()
 
 ApplicantOnlinePayment = attrs_to_fields(ApplicantOnlinePayment)
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 8420)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 8422)
@@ -510,6 +510,11 @@
         )
 
+    def doAfterStudentPayment():
+        """Process student after payment was made.
+
+        """
+
     def approveStudentPayment():
-        """Approve payment and create respective activation codes.
+        """Approve payment and process student.
 
         """
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py	(revision 8420)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py	(revision 8422)
@@ -60,11 +60,8 @@
             return None
 
-    def approveStudentPayment(self):
-        """Approve payment and create respective activation code.
+    def doAfterStudentPayment(self):
+        """Process student after payment was made.
         """
-        if self.p_state == 'paid':
-            return False, _('This ticket has already been paid.')
         student = self.getStudent()
-        self.approve()
         if self.p_category == 'clearance':
             # Create CLR access code
@@ -93,4 +90,13 @@
         return True, _('Valid callback received.')
 
+    def approveStudentPayment(self):
+        """Approve payment and process student.
+        """
+        if self.p_state == 'paid':
+            return False, _('This ticket has already been paid.')
+        self.approve()
+        return self.doAfterStudentPayment()
+
+
 StudentOnlinePayment = attrs_to_fields(StudentOnlinePayment)
 
