Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py	(revision 12214)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py	(revision 12215)
@@ -811,4 +811,6 @@
     pnav = 4
 
+    form_fields = grok.AutoFields(ICustomerDocument)
+
     @property
     def selectable_doctypes(self):
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/documentaddform.pt
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/documentaddform.pt	(revision 12214)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/documentaddform.pt	(revision 12215)
@@ -18,4 +18,5 @@
       </tr>
     </tbody>
+    <tal:widgets content="structure provider:widgets" />
   </table>
   <div tal:condition="view/availableActions">
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 12214)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py	(revision 12215)
@@ -828,4 +828,5 @@
         self.browser.getControl("Add document").click()
         self.browser.getControl(name="doctype").value = ['CustomerPDFDocument']
+        self.browser.getControl(name="form.title").value = 'My PDF Document'
         self.browser.getControl("Add document").click()
         self.assertTrue('PDF Document added.' in self.browser.contents)
@@ -899,4 +900,5 @@
         self.browser.getControl("Add document").click()
         self.browser.getControl(name="doctype").value = ['CustomerSampleDocument']
+        self.browser.getControl(name="form.title").value = 'My Sample Document'
         self.browser.getControl("Add document").click()
         self.assertTrue('Sample Document added.' in self.browser.contents)
@@ -1037,4 +1039,5 @@
         self.browser.getControl("Add document").click()
         self.browser.getControl(name="doctype").value = ['CustomerPDFDocument']
+        self.browser.getControl(name="form.title").value = 'My PDF Document'
         self.browser.getControl("Add document").click()
         self.browser.open(self.documents_path + '/d102/manage')
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/documents/browser.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/documents/browser.py	(revision 12214)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/documents/browser.py	(revision 12215)
@@ -24,4 +24,6 @@
 from urllib import urlencode
 from datetime import datetime
+from hurry.workflow.interfaces import (
+    IWorkflowInfo, IWorkflowState, InvalidTransitionError)
 from zope.event import notify
 from zope.i18n import translate
@@ -116,4 +118,6 @@
     pnav = 2
 
+    form_fields = grok.AutoFields(IPublicDocument)
+
     @property
     def selectable_doctypes(self):
@@ -149,5 +153,5 @@
     grok.name('index')
     grok.require('waeup.viewDocuments')
-    #grok.template('basepage')
+    grok.template('documentpage')
     pnav = 2
 
@@ -198,2 +202,40 @@
     def delLocalRoles(self, **data):
         return del_local_roles(self,2,**data)
+
+
+class DocumentTriggerTransitionFormPage(IkobaEditFormPage):
+    """ View to trigger public document transitions
+    """
+    grok.context(IPublicDocument)
+    grok.name('trigtrans')
+    grok.require('waeup.triggerTransition')
+    grok.template('trigtrans')
+    label = _('Trigger document transition')
+    pnav = 2
+
+    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)
+            try:
+                wf_info.fireTransition(transition_id)
+            except InvalidTransitionError, error:
+                self.flash(error, type="warning")
+        return
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/documents/browser_templates/documentaddform.pt
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/documents/browser_templates/documentaddform.pt	(revision 12214)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/documents/browser_templates/documentaddform.pt	(revision 12215)
@@ -17,4 +17,5 @@
         </td>
       </tr>
+      <tal:widgets content="structure provider:widgets" />
     </tbody>
   </table>
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/documents/viewlets.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/documents/viewlets.py	(revision 12214)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/documents/viewlets.py	(revision 12215)
@@ -27,5 +27,5 @@
 
 from waeup.ikoba.documents.interfaces import (
-    IDocumentsContainer, IDocument)
+    IDocumentsContainer, IPublicDocument)
 from waeup.ikoba.documents.browser import (
     DocumentsContainerManageFormPage, DocumentsContainerPage,
@@ -64,5 +64,5 @@
 class DocumentViewActionButton(ManageActionButton):
     grok.order(1)
-    grok.context(IDocument)
+    grok.context(IPublicDocument)
     grok.view(DocumentManageFormPage)
     grok.require('waeup.manageDocuments')
@@ -74,7 +74,19 @@
 class DocumentManageActionButton(ManageActionButton):
     grok.order(1)
-    grok.context(IDocument)
+    grok.context(IPublicDocument)
     grok.view(DocumentDisplayFormPage)
     grok.require('waeup.manageDocuments')
     text = _('Manage')
     target = 'manage'
+
+
+class DocumentTrigTransActionButton(ManageActionButton):
+    grok.order(2)
+    grok.context(IPublicDocument)
+    grok.view(DocumentDisplayFormPage)
+    grok.require('waeup.manageDocuments')
+    icon = 'actionicon_trigtrans.png'
+    text = _(u'Transition')
+    target = 'trigtrans'
+
+
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/documents/workflow.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/documents/workflow.py	(revision 12214)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/documents/workflow.py	(revision 12215)
@@ -40,4 +40,12 @@
         msg = _('Document created'),
         destination = CREATED),
+
+    Transition(
+        transition_id = 'publish',
+        title = _('Publish document'),
+        source = CREATED,
+        condition = NullCondition,
+        msg = _('Document published'),
+        destination = PUBLISHED),
     )
 
