Index: main/waeup.ikoba/trunk/src/waeup/ikoba/documents/document.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/documents/document.py	(revision 12168)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/documents/document.py	(revision 12200)
@@ -32,5 +32,6 @@
 from waeup.ikoba.utils.helpers import attrs_to_fields, get_current_principal
 from waeup.ikoba.documents.interfaces import (
-    IDocument, IDocument, IDocumentsUtils)
+    IDocument, IDocument, IDocumentsUtils,
+    IPDFDocument, IHTMLDocument)
 from waeup.ikoba.documents.utils import generate_document_id
 
@@ -100,4 +101,22 @@
 
 
+class PDFDocument(Document):
+    """This is a  document for a single pdf upload file.
+    """
+    grok.implements(IPDFDocument)
+    grok.provides(IPDFDocument)
+
+PDFDocument = attrs_to_fields(PDFDocument)
+
+
+class HTMLDocument(Document):
+    """This is a  document to render html-coded text.
+    """
+    grok.implements(IHTMLDocument)
+    grok.provides(IHTMLDocument)
+
+HTMLDocument = attrs_to_fields(HTMLDocument)
+
+
 class DocumentFactory(grok.GlobalUtility):
     """A factory for documents.
@@ -114,4 +133,35 @@
         return implementedBy(Document)
 
+
+class PDFDocumentFactory(grok.GlobalUtility):
+    """A factory for documents.
+    """
+    grok.implements(IFactory)
+    grok.name(u'waeup.PDFDocument')
+    title = u"Create a new PDF document.",
+    description = u"This factory instantiates new PDF documents."
+
+    def __call__(self, *args, **kw):
+        return PDFDocument(*args, **kw)
+
+    def getInterfaces(self):
+        return implementedBy(PDFDocument)
+
+
+class HTMLDocumentFactory(grok.GlobalUtility):
+    """A factory for HTML documents.
+    """
+    grok.implements(IFactory)
+    grok.name(u'waeup.HTMLDocument')
+    title = u"Create a new HTML document.",
+    description = u"This factory instantiates new HTML documents."
+
+    def __call__(self, *args, **kw):
+        return HTMLDocument(*args, **kw)
+
+    def getInterfaces(self):
+        return implementedBy(HTMLDocument)
+
+
 @grok.subscribe(IDocument, grok.IObjectAddedEvent)
 def handle_document_added(document, event):
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/documents/interfaces.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/documents/interfaces.py	(revision 12168)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/documents/interfaces.py	(revision 12200)
@@ -24,11 +24,4 @@
 
 
-class DocumentTypeSource(ContextualDictSourceFactoryBase):
-    """A document type source delivers all types of documents.
-
-    """
-    #: name of dict to deliver from ikoba utils.
-    DICT_NAME = 'DOCUMENT_TYPES'
-
 class IDocumentsContainer(IIkobaObject):
     """A container for all kind of document objects.
@@ -39,4 +32,5 @@
         """Add a document.
         """
+
 
 class IDocument(IIkobaObject):
@@ -71,4 +65,15 @@
         """
 
+class IPDFDocument(IDocument):
+    """A base representation of PDF documents.
+
+    """
+
+
+class IHTMLDocument(IDocument):
+    """A base representation of HTML documents.
+
+    """
+
 
 class IDocumentsUtils(Interface):
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/documents/tests.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/documents/tests.py	(revision 12168)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/documents/tests.py	(revision 12200)
@@ -24,8 +24,9 @@
     IWorkflowInfo, IWorkflowState, InvalidTransitionError)
 from waeup.ikoba.documents.interfaces import (
-    IDocumentsContainer, IDocument)
+    IDocumentsContainer, IDocument, IPDFDocument, IHTMLDocument)
 from waeup.ikoba.interfaces import IObjectHistory
 from waeup.ikoba.documents.container import DocumentsContainer
-from waeup.ikoba.documents.document import Document
+from waeup.ikoba.documents.document import (
+    Document, PDFDocument, HTMLDocument)
 from waeup.ikoba.testing import (FunctionalLayer, FunctionalTestCase)
 
@@ -52,9 +53,27 @@
                 IDocument, Document())
             )
+
+        self.assertTrue(
+            verifyClass(
+                IPDFDocument, PDFDocument)
+            )
+        self.assertTrue(
+            verifyObject(
+                IPDFDocument, PDFDocument())
+            )
+
+        self.assertTrue(
+            verifyClass(
+                IHTMLDocument, HTMLDocument)
+            )
+        self.assertTrue(
+            verifyObject(
+                IHTMLDocument, HTMLDocument())
+            )
         return
 
     def test_addDocument(self):
         container = DocumentsContainer()
-        document = createObject(u'waeup.Document')
+        document = createObject(u'waeup.HTMLDocument')
         document_id = document.document_id
         container.addDocument(document)
@@ -65,5 +84,5 @@
 
     def test_document_workflow(self):
-        document = createObject(u'waeup.Document')
+        document = createObject(u'waeup.HTMLDocument')
         IWorkflowInfo(document).fireTransition('create')
         self.assertEqual(IWorkflowState(document).getState(), 'created')
@@ -79,8 +98,10 @@
         IWorkflowInfo(document).fireTransition('reset3')
         self.assertEqual(IWorkflowState(document).getState(), 'created')
+        IWorkflowInfo(document).fireTransition('publish')
+        self.assertEqual(IWorkflowState(document).getState(), 'published')
         return
 
     def test_document_history(self):
-        doc = createObject(u'waeup.Document')
+        doc = createObject(u'waeup.HTMLDocument')
         IWorkflowInfo(doc).fireTransition('create')
         messages = ' '.join(doc.history.messages)
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/documents/workflow.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/documents/workflow.py	(revision 12168)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/documents/workflow.py	(revision 12200)
@@ -27,5 +27,5 @@
     IObjectHistory, IIkobaWorkflowInfo,
     SimpleIkobaVocabulary,
-    CREATED, SUBMITTED, VERIFIED, REJECTED, EXPIRED)
+    CREATED, SUBMITTED, VERIFIED, REJECTED, EXPIRED, PUBLISHED)
 from waeup.ikoba.interfaces import MessageFactory as _
 from waeup.ikoba.workflow import IkobaWorkflow, IkobaWorkflowInfo
@@ -99,4 +99,11 @@
         source = EXPIRED,
         destination = CREATED),
+
+    Transition(
+        transition_id = 'publish',
+        title = _('Publish'),
+        msg = _('Published'),
+        source = CREATED,
+        destination = PUBLISHED),
     )
 
