diff --git a/product/ERP5OOo/tests/testDms.py b/product/ERP5OOo/tests/testDms.py
index 84e9419bd8386dd9265d6d21491fbd3661a8807c..af21117bfae30eafda3d3539748bfabae487e7a8 100644
--- a/product/ERP5OOo/tests/testDms.py
+++ b/product/ERP5OOo/tests/testDms.py
@@ -29,7 +29,7 @@
 """
   A test suite for Document Management System functionality.
   This will test:
-  - creating text documents
+  - creating Text Document objects
   - setting properties of a document, assigning local roles
   - setting relations between documents (explicit and implicity)
   - searching in basic and advanced modes
@@ -51,15 +51,6 @@
 
 from random import randint
 
-import os, sys
-if __name__ == '__main__':
-    execfile(os.path.join(sys.path[0], 'framework.py'))
-
-
-# Needed in order to have a log file inside the current folder
-os.environ['EVENT_LOG_FILE'] = os.path.join(os.getcwd(), 'zLOG.log')
-os.environ['EVENT_LOG_SEVERITY'] = '-300'
-
 from Testing import ZopeTestCase
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
 from AccessControl.SecurityManagement import newSecurityManager, noSecurityManager
@@ -70,21 +61,68 @@ import os
 from Products.ERP5Type import product_path
 from Products.ERP5OOo.Document.OOoDocument import ConversionError
 
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+
+# Needed in order to have a log file inside the current folder
+os.environ['EVENT_LOG_FILE'] = os.path.join(os.getcwd(), 'zLOG.log')
+os.environ['EVENT_LOG_SEVERITY'] = '-300'
+
+QUIET = 0
+RUN_ALL_TEST = 0
+
+# Define the conversion server host
+conversion_server_host = ('127.0.0.1', 8008)
+
+
+def printAndLog(msg):
+  """
+  A utility function to print a message
+  to the standard output and to the LOG
+  at the same time
+  """
+  if not QUIET:
+    msg = str(msg)
+    ZopeTestCase._print('\n ' + msg)
+    LOG('Testing... ', 0, msg)
+
+
+class FileUploadTest(file):
+
+  __allow_access_to_unprotected_subobjects__=1
+
+  def __init__(self, path, name):
+    self.filename = name
+    file.__init__(self, path)
+    self.headers = {}
+
+
+def makeFilePath(name):
+  return os.getenv('INSTANCE_HOME') + '/../Products/ERP5OOo/tests/test_document/' + name
+
+
+def makeFileUpload(name):
+  path = makeFilePath(name)
+  return FileUploadTest(path, name)
+
+
 class TestDocument(ERP5TypeTestCase):
   """
   """
 
   # Different variables used for this test
-  run_all_test = 1
 
   def getTitle(self):
     return "DMS"
 
   ## setup
 
-  def afterSetUp(self, quiet=1, run=1):
-    self.createCategories()
-    self.createObjects()
+  def afterSetUp(self, quiet=QUIET, run=1):
+    self.createCategoryList()
+    self.createObjectList()
+    self.setSystemPreference()
     self.login()
     portal = self.getPortal()
 
@@ -97,7 +135,7 @@ class TestDocument(ERP5TypeTestCase):
   def getNeededCategoryList(self):
     return ('function/publication/reviewer','function/project/director','function/hq')
 
-  def createCategories(self):
+  def createCategoryList(self):
     """Create the categories for our test. """
     # create categories
     for cat_string in self.getNeededCategoryList():
@@ -108,54 +146,72 @@ class TestDocument(ERP5TypeTestCase):
           path = path.newContent(
             portal_type='Category',
             id=cat,
+            title=cat,
             immediate_reindex=1)
         else:
           path = path[cat]
 
+  def setSystemPreference(self):
+    default_pref = self.portal.portal_preferences.default_site_preference
+    default_pref.setPreferredOoodocServerAddress(conversion_server_host[0])
+    default_pref.setPreferredOoodocServerPortNumber(conversion_server_host[1])
+    default_pref.setPreferredDocumentFileNameRegularExpression(
+           "(?P<reference>[A-Z]{3,6})-(?P<language>[a-z]{2})-(?P<version>[0-9]{3})")
+    default_pref.setPreferredReferenceLookupRegularExpression(
+           "(?P<reference>[A-Z]{3,6})(-(?P<language>[a-z]{2}))?(-(?P<version>[0-9]{3}))?")
+    default_pref.enable()
+
   ## helper methods
 
   def getUserFolder(self):
     return self.getPortal().acl_users
 
-  def createObjects(self):
-    if not hasattr(self.getPortal().person_module,'1'):
-      p1=self.getPortal().person_module.newContent(portal_type='Person',id='1',first_name='John',last_name='McCartney',reference='john',career_role='internal')
-      get_transaction().commit()
-      self.tic()
-
-  def getTestUser(self):
-    user = self.getUserFolder().getUserById('john')
-    self.failIf(user is None)
-    return user
-
-  def login(self, quiet=0, run=run_all_test):
-    uf = self.getPortal().acl_users
-    uf._doAddUser('seb', '', ['Manager'], [])
-    user = uf.getUserById('seb').__of__(uf)
+  def login(self, quiet=QUIET, run=RUN_ALL_TEST):
+    """
+      Create a new manager user and login.
+    """
+    user_name = 'dms_user'
+    user_folder = self.portal.acl_users
+    user_folder._doAddUser(user_name, '', ['Manager', 'Owner', 'Assignor'], [])
+    user = user_folder.getUserById(user_name).__of__(user_folder)
     newSecurityManager(None, user)
 
-  def _addRoleToDoc(self,doc):
-    role=doc.newContent(portal_type='Role Definition')
-    role._edit(agent='person_module/1',role_name='Assignor')
-
-  def createTestDocument(self):
+  def createTestDocument(self, file_name=None, reference='TEST', version='002', language='en'):
+    """
+      Creates a text document
+    """
     dm=self.getPortal().document_module
-    doctext=dm.newContent(portal_type='Text')
-    doctext._getServerCoordinate=lambda:('127.0.0.1',8080)
-    f=FileObject(os.getenv('INSTANCE_HOME')+'/../Products/ERP5OOo/tests/test.doc')
-    f.filename='test.doc'
-    doctext._edit(file=f)
-    f.close()
-    doctext.convert()
+    doctext=dm.newContent(portal_type='Text Document')
+    if file_name is not None:
+      f = open(makeFilePath(file_name))
+      doctext.setTextContent(f.read())
+      f.close()
+    doctext.setReference(reference)
+    doctext.setVersion(version)
+    doctext.setLanguage(language)
     return doctext
 
+  def getDocument(self, id):
+    """
+      Returns a document with given ID in the
+      document module.
+    """
+    document_module = self.portal.document_module
+    return getattr(document_module, id)
+
+  ## steps
+  
+  def stepTic(self, sequence=None, sequence_list=None, **kw):
+    self.tic()
+
   ## tests
 
-  def test_01_HasEverything(self, quiet=0, run=run_all_test):
+  def test_01_HasEverything(self, quiet=QUIET, run=RUN_ALL_TEST):
+    """
+      Standard test to make sure we have everything we need - all the tools etc
+    """
     if not run: return
-    if not quiet:
-      ZopeTestCase._print('\nTest Has Everything ')
-      LOG('Testing... ',0,'testHasEverything')
+    printAndLog('\nTest Has Everything ')
     self.failUnless(self.getCategoryTool()!=None)
     self.failUnless(self.getSimulationTool()!=None)
     self.failUnless(self.getTypeTool()!=None)
@@ -163,18 +219,119 @@ class TestDocument(ERP5TypeTestCase):
     self.failUnless(self.getCatalogTool()!=None)
     self.failUnless(self.getWorkflowTool()!=None)
 
-  def test_02_ObjectCreation(self,quiet=0,run=run_all_test):
-    if not quiet:
-      ZopeTestCase._print('\nTest Object Creation')
-      LOG('Testing... ',0,'test_02_ObjectCreation')
-    dm=self.getPortal().document_module
-    doctext=dm.newContent(portal_type='Text')
-    self._addRoleToDoc(doctext)
-    get_transaction().commit()
-    doctext.updateLocalRolesOnSecurityGroups()
-    self.tic()
-    u=self.getTestUser()
-    self.failUnless('Assignor' in u.getRolesInContext(doctext))
+  def test_02_RevisionSystem(self,quiet=QUIET,run=RUN_ALL_TEST):
+    """
+      Test revision mechanism
+    """
+    if not run: return
+    printAndLog('\nTest Revision System')
+    # create a test document
+    # revision should be 1
+    # upload file (can be the same) into it
+    # revision should now be 2
+    # edit the document with any value or no values
+    # revision should now be 3
+    # contribute the same file through portal_contributions
+    # there should still be only one document, with revision 4 (because it should have done mergeRevision)
+    # getRevisionList should return (1, 2, 3, 4)
+
+  def test_03_Versioning(self,quiet=QUIET,run=RUN_ALL_TEST):
+    """
+      Test versioning
+    """
+    if not run: return
+    printAndLog('\nTest Versioning System')
+    # create a test document, set coordinates (reference=TEST, version=002, language=en)
+    # create a second test document, set coordinates (reference=TEST, version=002, language=en)
+    # create a third test document, set its reference to ANOTHER
+    # run isVersionUnique on all three (should return False, False, True)
+    # change version of the second doc to 003
+    # run isVersionUnique on all three (should return True)
+    # run getLatestVersionValue on first and second (should return the second)
+    # run getVersionValueList on first and second (should return the two)
+    # run getVersionValueList on third (should return the third)
+
+  def test_04_VersioningWithLanguage(self,quiet=QUIET,run=RUN_ALL_TEST):
+    """
+      Test versioning with multi-language support
+    """
+    if not run: return
+    printAndLog('\nTest Versioning With Language')
+    # create empty test documents, set their coordinates as follows:
+    # (1) TEST, 002, en
+    # (2) TEST, 002, fr
+    # (3) TEST, 002, pl
+    # (4) TEST, 003, en
+    # (5) TEST, 003, sp
+    # the following calls should produce the following output:
+    # getOriginalLanguage() = 'en'
+    # getLanguageList = ('en', 'fr', 'pl', 'sp')
+    # getLatestVersionValue() = 4
+    # getLatestVersionValue('en') = 4
+    # getLatestVersionValue('fr') = 2
+    # getLatestVersionValue('pl') = 3
+    # getLatestVersionValue('ru') = None
+    # Set user language with Localizer to 'sp'
+    # getLatestVersionValue() = 5
+
+  def test_05_UniqueReference(self,quiet=QUIET,run=RUN_ALL_TEST):
+    """
+      Test automatic setting of unique reference
+    """
+    if not run: return
+    printAndLog('\nTest Automatic Setting Unique Reference')
+    # create three empty test documents
+    # run setUniqueReference on the second
+    # reference of the second doc should now be TEST-auto-2
+    # run setUniqueReference('uniq') on the third
+    # reference of the third doc should now be TEST-uniq-1
+
+  def test_06_testExplicitRelations(self,quiet=QUIET,run=RUN_ALL_TEST):
+    """
+      Test explicit relations.
+      Explicit relations are just like any other relation, so no need to test them here
+      except for similarity cloud which we test.
+    """
+    if not run: return
+    printAndLog('\nTest Explicit Relations')
+    # create test documents:
+    # (1) TEST, 002, en
+    # (2) TEST, 003, en
+    # (3) ONE, 001, en
+    # (4) TWO, 001, en
+    # (5) THREE, 001, en
+    # set 3 similar to 1, 4 to 3, 5 to 4
+    # getSimilarCloudValueList on 4 should return 2, 3 and 5
+    # getSimilarCloudValueList(depth=1) on 4 should return 3 and 5
+
+  def test_07_testImplicitRelations(self,quiet=QUIET,run=RUN_ALL_TEST):
+    """
+      Test implicit (wiki-like) relations.
+    """
+    # XXX this test should be extended to check more elaborate language selection
+    if not run: return
+    printAndLog('\nTest Implicit Relations')
+    # create docs to be referenced:
+    # (1) TEST, 002, en
+    # (2) TEST, 002, fr
+    # (3) TEST, 003, en
+    # create docs to contain references in text_content:
+    # REF, 001, en; "I use reference to look up TEST"
+    # REF, 002, en; "I use reference to look up TEST"
+    # REFLANG, 001, en: "I use reference and language to look up TEST-fr"
+    # REFVER, 001, en: "I use reference and version to look up TEST-002"
+    # REFVERLANG, 001, en: "I use reference, version and language to look up TEST-002-en"
+    printAndLog('\nTesting Implicit Predecessors')
+    # the implicit predecessors should be:
+    # for (1): REF-002, REFVER, REFVERLANG
+    # for (2): REF-002, REFLANG, REFVER
+    # for (3): REF-002
+    printAndLog('\nTesting Implicit Successors')
+    # the implicit successors should be:
+    # for REF: (3)
+    # for REFLANG: (2)
+    # for REFVER: (3)
+    # for REFVERLANG: (3)
 
 if __name__ == '__main__':
     framework()