diff --git a/product/ERP5/mixin/document.py b/product/ERP5/mixin/document.py
new file mode 100644
index 0000000000000000000000000000000000000000..8772a07a431d853914d1da4ff55b5415d48b0525
--- /dev/null
+++ b/product/ERP5/mixin/document.py
@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2010 Nexedi SA and Contributors. All Rights Reserved.
+#                    Nicolas Delaby <nicolas@nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+from Products.CMFCore.utils import getToolByName
+from AccessControl import ClassSecurityInfo
+from Products.ERP5Type import Permissions
+from OFS.Image import Pdata
+from cStringIO import StringIO
+_MARKER = []
+
+class DocumentMixin:
+  """
+  Implementation of IDocument interface
+   convert must not be overloaded as it checks conversion
+   format permission
+
+   isSupportBaseDataConversion can be overriden, if base_conversion
+   is supported (eg. OOoDocuments, TextDocument).
+
+
+  """
+  security = ClassSecurityInfo()
+
+  security.declareProtected(Permissions.AccessContentsInformation, 'convert')
+  def convert(self, format, **kw):
+    """
+      Main content conversion function, returns result which should
+      be returned and stored in cache.
+
+      If format is not allowed for download, Unauthorized exception is raised.
+
+      format - the format specied in the form of an extension
+      string (ex. jpeg, html, text, txt, etc.)
+      **kw can be various things - e.g. resolution
+    """
+    self._checkConversionFormatPermission(format, **kw)
+    return self._convert(format, **kw)
+
+  def _convert(self, format, **kw):
+    """Private method which make the transformation.
+    Must be overriden !!!
+    """
+    raise NotImplementedError
+
+  security.declareProtected(Permissions.AccessContentsInformation,
+                                             'checkConversionFormatPermission')
+  def checkConversionFormatPermission(self, format, **kw):
+    """Public version of _checkConversionFormatPermission
+    Without raising return just True or False.
+    """
+    try:
+      self._checkConversionFormatPermission(format, **kw)
+    except Unauthorized:
+      return False
+    else:
+      return True
+
+  def _checkConversionFormatPermission(self, format, **kw):
+    """Private method to check permission when access specified format.
+    This method raises
+    """
+    # XXX cache result in TV
+    method = self._getTypeBasedMethod('checkConversionFormatPermission',
+                 fallback_script_id='Document_checkConversionFormatPermission')
+    if not method(format=format, **kw):
+      raise Unauthorized('Document: user does not have enough permission'\
+                         ' to access document in %s format' %\
+                                                        (format or 'original'))
+
+  security.declareProtected(Permissions.AccessContentsInformation,
+                                                 'isSupportBaseDataConversion')
+  def isSupportBaseDataConversion(self):
+    """Tell if document implement IBaseConvertable Interface.
+    By default it doens't
+    """
+    return False