Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py	(revision 12027)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py	(revision 12028)
@@ -378,5 +378,5 @@
 
 class CustomerTriggerTransitionFormPage(IkobaEditFormPage):
-    """ View to manage customer base data
+    """ View to trigger customer workflow transitions
     """
     grok.context(ICustomer)
@@ -793,12 +793,10 @@
         return
 
+
 class DocumentEditFormPage(DocumentManageFormPage):
     """ Page to edit a document
     """
-    grok.context(ICustomerDocument)
     grok.name('edit')
     grok.require('waeup.handleCustomer')
-    form_fields = grok.AutoFields(ICustomerDocument)
-    pnav = 4
 
     def update(self):
@@ -807,2 +805,37 @@
             return
         return super(DocumentEditFormPage, self).update()
+
+
+class DocumentTriggerTransitionFormPage(IkobaEditFormPage):
+    """ View to trigger customer document transitions
+    """
+    grok.context(ICustomerDocument)
+    grok.name('trigtrans')
+    grok.require('waeup.triggerTransition')
+    grok.template('trigtrans')
+    label = _('Trigger document transition')
+    pnav = 4
+
+    def update(self):
+        return super(IkobaEditFormPage, self).update()
+
+    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()]
+        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 'transition' in form and form['transition']:
+            transition_id = form['transition']
+            wf_info = IWorkflowInfo(self.context)
+            wf_info.fireTransition(transition_id)
+        return
Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/trigtrans.pt
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/trigtrans.pt	(revision 12027)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/trigtrans.pt	(revision 12028)
@@ -3,4 +3,5 @@
       autocomplete="off">
 
+    <br />
 
     <select id="transition" name="transition" class="form-control half">
Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py	(revision 12027)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py	(revision 12028)
@@ -294,5 +294,5 @@
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertEqual(self.browser.url, self.customer_path)
-        self.browser.getLink("Trigger").click()
+        self.browser.getLink("Transition").click()
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         # Managers can trigger transitions
@@ -800,4 +800,12 @@
         self.assertEqual(self.browser.url, self.documents_path + '/d102/index')
 
+        # Transitions can be performed
+        self.browser.getLink("Transition").click()
+        self.browser.getControl(name="transition").value = ['submit']
+        self.browser.getControl("Save").click()
+        self.browser.getControl(name="transition").value = ['verify']
+        self.browser.getControl("Save").click()
+        self.assertEqual(document.state, 'verified')
+
         # Documents can be removed
         self.browser.getLink("Documents").click()
Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/viewlets.py
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/viewlets.py	(revision 12027)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/viewlets.py	(revision 12028)
@@ -202,5 +202,5 @@
     grok.require('waeup.triggerTransition')
     icon = 'actionicon_trigtrans.png'
-    text = _(u'Trigger transition')
+    text = _(u'Transition')
     target = 'trigtrans'
 
@@ -323,4 +323,14 @@
 
 
+class DocumentTrigTransActionButton(ManageActionButton):
+    grok.order(2)
+    grok.context(ICustomerDocument)
+    grok.view(DocumentDisplayFormPage)
+    grok.require('waeup.triggerTransition')
+    icon = 'actionicon_trigtrans.png'
+    text = _(u'Transition')
+    target = 'trigtrans'
+
+
 class DocumentViewActionButton(ManageActionButton):
     grok.order(1)
