Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py	(revision 12015)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py	(revision 12016)
@@ -752,4 +752,5 @@
     grok.name('index')
     grok.require('waeup.viewCustomer')
+    grok.template('documentpage')
     form_fields = grok.AutoFields(ICustomerDocument)
     pnav = 4
@@ -768,5 +769,5 @@
     grok.context(ICustomerDocument)
     grok.name('manage')
-    grok.require('waeup.viewCustomer')
+    grok.require('waeup.manageCustomer')
     form_fields = grok.AutoFields(ICustomerDocument)
     pnav = 4
@@ -778,2 +779,7 @@
             'b':self.context.document_id})
         return self.context.document_id
+
+    @action(_('Save'), style='primary')
+    def save(self, **data):
+        msave(self, **data)
+        return
Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/documentpage.pt
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/documentpage.pt	(revision 12016)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/documentpage.pt	(revision 12016)
@@ -0,0 +1,18 @@
+<div class="workflow">
+  <div tal:repeat="msg context/history/messages">
+    <span tal:replace="msg">MESSAGE</span><br />
+  </div>
+</div>
+
+<table class="form-table" i18n:domain="waeup.ikoba"
+  tal:define="files provider:files">
+  <tbody>
+    <tal:widgets content="structure provider:widgets" />
+    <tr tal:condition="python: files.replace('\n','')">
+      <td class="separator" colspan=2 i18n:translate="">
+        Uploaded Files
+      </td>
+    </tr>
+    <tal:files content="structure files" />
+  </tbody>
+</table>
Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/documentsmanagepage.pt
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/documentsmanagepage.pt	(revision 12015)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser_templates/documentsmanagepage.pt	(revision 12016)
@@ -7,4 +7,5 @@
       <th>&nbsp;</th>
       <th i18n:translate="">Document Id</th>
+      <th i18n:translate="">Title</th>
     </tr>
     </thead>
@@ -17,6 +18,11 @@
          tal:condition="python: not view.unremovable(cl)" />
         </td>
-        <td> <a tal:attributes="href python: view.url(cl)">
-        <span tal:content="cl/document_id">PDID</span></a></td>
+        <td>
+          <a tal:attributes="href python: view.url(cl)">
+          <span tal:content="cl/document_id">DOCID</span></a>
+        </td>
+        <td>
+          <span tal:content="cl/title">TITLE</span>
+        </td>
       </tr>
     </tbody>
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 12015)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py	(revision 12016)
@@ -790,5 +790,15 @@
         document = self.customer['documents']['d102']
 
+        # Document can be edited
+        self.browser.getLink("d102").click()
+        self.browser.getLink("Manage").click()
+        self.browser.getControl(name="form.title").value = 'My second doc'
+        self.browser.getControl("Save").click()
+        self.assertTrue('Form has been saved.' in self.browser.contents)
+        self.browser.getLink("View").click()
+        self.assertEqual(self.browser.url, self.documents_path + '/d102/index')
+
         # Documents can be removed
+        self.browser.getLink("Documents").click()
         ctrl = self.browser.getControl(name='val_id')
         ctrl.getControl(value=document.document_id).selected = True
@@ -802,4 +812,9 @@
 
         self.assertTrue(
+            'INFO - zope.mgr - customers.browser.DocumentManageFormPage '
+            '- K1000000 - saved: title'
+            in logcontent)
+
+        self.assertTrue(
             'INFO - zope.mgr - customers.browser.DocumentAddFormPage '
             '- K1000000 - added: Generic Document %s'
Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/viewlets.py
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/viewlets.py	(revision 12015)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/viewlets.py	(revision 12016)
@@ -27,9 +27,9 @@
 from waeup.ikoba.customers.interfaces import (
     ICustomer, ICustomersContainer,
-    ICustomerDocumentsContainer)
+    ICustomerDocumentsContainer, ICustomerDocument)
 from waeup.ikoba.customers.browser import (
     CustomersContainerPage, CustomersContainerManagePage,
     CustomerBaseDisplayFormPage,
-    DocumentsManageFormPage)
+    DocumentsManageFormPage, DocumentDisplayFormPage, DocumentManageFormPage)
 
 grok.context(IIkobaObject)  # Make IIkobaObject the default context
@@ -266,4 +266,5 @@
     target = 'edit_base'
 
+
 class CustomerPasswordActionButton(ManageActionButton):
     grok.order(2)
@@ -274,4 +275,5 @@
     text = _('Change password')
     target = 'changepassword'
+
 
 class CustomerPassportActionButton(ManageActionButton):
@@ -295,2 +297,20 @@
     text = _('Add document')
     target = 'adddoc'
+
+
+class DocumentManageActionButton(ManageActionButton):
+    grok.order(1)
+    grok.context(ICustomerDocument)
+    grok.view(DocumentDisplayFormPage)
+    grok.require('waeup.manageCustomer')
+    text = _('Manage')
+    target = 'manage'
+
+class DocumentViewActionButton(ManageActionButton):
+    grok.order(1)
+    grok.context(ICustomerDocument)
+    grok.view(DocumentManageFormPage)
+    grok.require('waeup.manageCustomer')
+    text = _('View')
+    target = 'index'
+    icon = 'actionicon_view.png'
