Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9272)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9273)
@@ -407,19 +407,4 @@
         return
 
-    def getTransitions(self):
-        """Return a list of dicts of allowed transition ids and titles.
-
-        Each list entry provides keys ``name`` and ``title`` for
-        internal name and (human readable) title of a single
-        transition.
-        """
-        allowed_transitions = [t for t in self.wf_info.getManualTransitions()
-            if not t[0].startswith('pay')]
-        if self.context.is_postgrad:
-            allowed_transitions = [t for t in allowed_transitions
-                if not t[0] in FORBIDDEN_POSTGRAD_TRANS]
-        return [dict(name='', title=_('No transition'))] +[
-            dict(name=x, title=y) for x, y in allowed_transitions]
-
     @action(_('Save'), style='primary')
     def save(self, **data):
@@ -440,15 +425,46 @@
             changed_fields = []
         if password:
-            # Now we know that the form has no errors and can set password ...
+            # Now we know that the form has no errors and can set password
             IUserAccount(self.context).setPassword(password)
             changed_fields.append('password')
-        # ... and execute transition
-        if form.has_key('transition') and form['transition']:
-            transition_id = form['transition']
-            self.wf_info.fireTransition(transition_id)
         fields_string = ' + '.join(changed_fields)
         self.flash(_('Form has been saved.'))
         if fields_string:
             self.context.writeLogMessage(self, 'saved: % s' % fields_string)
+        return
+
+class StudentTriggerTransitionFormPage(KofaEditFormPage):
+    """ View to manage student base data
+    """
+    grok.context(IStudent)
+    grok.name('trigtrans')
+    grok.require('waeup.triggerTransition')
+    grok.template('trigtrans')
+    label = _('Trigger registration transition')
+    pnav = 4
+
+    def getTransitions(self):
+        """Return a list of dicts of allowed transition ids and titles.
+
+        Each list entry provides keys ``name`` and ``title`` for
+        internal name and (human readable) title of a single
+        transition.
+        """
+        wf_info = IWorkflowInfo(self.context)
+        allowed_transitions = [t for t in wf_info.getManualTransitions()
+            if not t[0].startswith('pay')]
+        if self.context.is_postgrad:
+            allowed_transitions = [t for t in allowed_transitions
+                if not t[0] in FORBIDDEN_POSTGRAD_TRANS]
+        return [dict(name='', title=_('No transition'))] +[
+            dict(name=x, title=y) for x, y in allowed_transitions]
+
+    @action(_('Save'), style='primary')
+    def save(self, **data):
+        form = self.request.form
+        if form.has_key('transition') and form['transition']:
+            transition_id = form['transition']
+            wf_info = IWorkflowInfo(self.context)
+            wf_info.fireTransition(transition_id)
         return
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/basemanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/basemanagepage.pt	(revision 9272)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/basemanagepage.pt	(revision 9273)
@@ -27,15 +27,4 @@
             </td>
           </tr>
-          <tr>
-            <td class="fieldname" i18n:translate="">Registration Transition:</td>
-            <td>
-              <select id="transition" name="transition">
-                <option tal:repeat="transition view/getTransitions"
-                        tal:attributes="value transition/name">
-                  <span tal:replace="transition/title">TRANSITIONTITLE</span>
-                </option>
-              </select>
-            </td>
-          </tr>
 
         </tbody>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/trigtrans.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/trigtrans.pt	(revision 9273)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/trigtrans.pt	(revision 9273)
@@ -0,0 +1,18 @@
+<form action="." tal:attributes="action request/URL" method="post"
+      i18n:domain="waeup.kofa" enctype="multipart/form-data"
+      autocomplete="off">
+
+
+    <select id="transition" name="transition">
+      <option tal:repeat="transition view/getTransitions"
+              tal:attributes="value transition/name">
+        <span tal:replace="transition/title">TRANSITIONTITLE</span>
+      </option>
+    </select>
+    <br /><br />
+    <div tal:condition="view/availableActions">
+      <input tal:repeat="action view/actions"
+             tal:replace="structure action/render"
+             />
+    </div>
+</form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/permissions.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/permissions.py	(revision 9272)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/permissions.py	(revision 9273)
@@ -56,4 +56,7 @@
     grok.name('waeup.validateStudent')
 
+class TriggerTransition(grok.Permission):
+    grok.name('waeup.triggerTransition')
+
 # Local role
 class StudentRecordOwner(grok.Role):
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 9272)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 9273)
@@ -113,4 +113,5 @@
         self.student_path = self.container_path + '/' + self.student_id
         self.manage_student_path = self.student_path + '/manage_base'
+        self.trigtrans_path = self.student_path + '/trigtrans'
         self.clearance_path = self.student_path + '/view_clearance'
         self.personal_path = self.student_path + '/view_personal'
@@ -435,9 +436,14 @@
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.url, self.student_path)
+        self.browser.getLink("Trigger").click()
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        # Managers can trigger transitions
+        self.browser.getControl(name="transition").value = ['admit']
+        self.browser.getControl("Save").click()
+        # Managers can edit base
+        self.browser.open(self.student_path)
         self.browser.getLink("Manage").click()
-        self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.url, self.manage_student_path)
-        # Managers can edit base data and fire transitions
-        self.browser.getControl(name="transition").value = ['admit']
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.browser.getControl(name="form.firstname").value = 'John'
         self.browser.getControl(name="form.lastname").value = 'Tester'
@@ -720,5 +726,5 @@
         self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
         student = self.app['students'][self.student_id]
-        self.browser.open(self.manage_student_path)
+        self.browser.open(self.trigtrans_path)
         self.assertTrue(student.clearance_locked)
         self.browser.getControl(name="transition").value = ['admit']
@@ -761,10 +767,10 @@
         self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
         student = self.app['students'][self.student_id]
-        self.browser.open(self.manage_student_path)
+        self.browser.open(self.trigtrans_path)
         self.assertTrue('<option value="reset6">' in self.browser.contents)
         self.assertTrue('<option value="register_courses">' in self.browser.contents)
         self.assertTrue('<option value="reset5">' in self.browser.contents)
         self.certificate.study_mode = 'pg_ft'
-        self.browser.open(self.manage_student_path)
+        self.browser.open(self.trigtrans_path)
         self.assertFalse('<option value="reset6">' in self.browser.contents)
         self.assertFalse('<option value="register_courses">' in 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 9272)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 9273)
@@ -166,4 +166,13 @@
     target = 'manage_base'
 
+class StudentTrigTransActionButton(ManageActionButton):
+    grok.order(2)
+    grok.context(IStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    grok.require('waeup.triggerTransition')
+    icon = 'actionicon_trigtrans.png'
+    text = _(u'Trigger transition')
+    target = 'trigtrans'
+
 class AdmissionSlipActionButton(ManageActionButton):
     grok.order(4)
