diff --git a/product/ERP5/Document/Document.py b/product/ERP5/Document/Document.py
index 5c41655245dba8e843b00f1fb14fcaee08965865..471c209801beff589a9c217bafcfb1552125f225 100644
--- a/product/ERP5/Document/Document.py
+++ b/product/ERP5/Document/Document.py
@@ -60,9 +60,11 @@ from Products.ERP5.mixin.text_convertable import TextConvertableMixin
 from Products.ERP5.mixin.downloadable import DownloadableMixin
 from Products.ERP5.mixin.document import DocumentMixin
 from Products.ERP5.mixin.extensible_traversable import DocumentExtensibleTraversableMixIn
+from Products.ERP5.mixin.crawable import CrawableMixin
 
 _MARKER = []
 VALID_ORDER_KEY_LIST = ('user_login', 'content', 'file_name', 'input')
+
 # these property ids are unchangable
 FIXED_PROPERTY_IDS = ('id', 'uid', 'rid', 'sid')
 
@@ -129,61 +131,8 @@ class DocumentProxyError(Exception):pass
 class NotConvertedError(Exception):pass
 allow_class(NotConvertedError)
 
-class UpdateMixIn:
-  """
-    Provides an API to compute a date index based on the update
-    frequency of the document.
-  """
-
-  # Declarative security
-  security = ClassSecurityInfo()
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'getFrequencyIndex')
-  def getFrequencyIndex(self):
-    """
-      Returns the document update frequency as an integer
-      which is used by alamrs to decide which documents
-      must be updates at which time. The index represents
-      a time slot (ex. all days in a month, all hours in a week).
-    """
-    try:
-      return self.getUpdateFrequencyValue().getIntIndex()
-    except AttributeError:
-      # Catch Attribute error or Key error - XXX not beautiful
-      return 0
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'getCreationDateIndex')
-  def getCreationDateIndex(self, at_date = None):
-    """
-    Returns the document Creation Date Index which is the creation
-    date converted into hours modulo the Frequency Index.
-    """
-    frequency_index = self.getFrequencyIndex()
-    if not frequency_index: return -1 # If not update frequency is provided, make sure we never update
-    hour = convertDateToHour(date=self.getCreationDate())
-    creation_date_index = hour % frequency_index
-    # in the case of bisextile year, we substract 24 hours from the creation date,
-    # otherwise updating documents (frequency=yearly update) created the last
-    # 24 hours of bissextile year will be launched once every 4 years.
-    if creation_date_index >= number_of_hours_in_year:
-      creation_date_index = creation_date_index - number_of_hours_in_day
-
-    return creation_date_index
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'isUpdatable')
-  def isUpdatable(self):
-    """
-      This method is used to decide which document can be updated
-      in the crawling process. This can depend for example on
-      workflow states (publication state,
-      validation state) or on roles on the document.
-    """
-    method = self._getTypeBasedMethod('isUpdatable',
-        fallback_script_id = 'Document_isUpdatable')
-    return method()
-
 class Document(DocumentExtensibleTraversableMixIn, XMLObject, UrlMixIn, CachedConvertableMixin,
-               SnapshotMixin, UpdateMixIn, TextConvertableMixin,
+               SnapshotMixin, CrawableMixin, TextConvertableMixin,
                DownloadableMixin, DocumentMixin):
   """Document is an abstract class with all methods related to document
   management in ERP5. This includes searchable text, explicit relations,
diff --git a/product/ERP5/Document/ExternalSource.py b/product/ERP5/Document/ExternalSource.py
index 54952221dcd04b079d72aea8157a9d8df7d54f10..eb3e4cc845e27e73093c02f63563a42e17d37889 100644
--- a/product/ERP5/Document/ExternalSource.py
+++ b/product/ERP5/Document/ExternalSource.py
@@ -29,9 +29,9 @@ from AccessControl import ClassSecurityInfo
 from Products.ERP5Type import Permissions, PropertySheet
 from Products.ERP5Type.XMLObject import XMLObject
 from Products.ERP5.Document.Url import UrlMixIn
-from Products.ERP5.Document.Document import UpdateMixIn
+from Products.ERP5.mixin.crawable import CrawableMixin
 
-class ExternalSource(XMLObject, UrlMixIn, UpdateMixIn):
+class ExternalSource(XMLObject, UrlMixIn, CrawableMixin):
   """
   An External Source consists of single URL which defines the
   root of a collection of documents, each of which can be accessed
diff --git a/product/ERP5/interfaces/crawlable.py b/product/ERP5/interfaces/crawlable.py
index 057acbeab934d1e5f0831809448b88c3a1d1a7fc..898d5dd4089444b70e5cde856e9a5545b565008f 100644
--- a/product/ERP5/interfaces/crawlable.py
+++ b/product/ERP5/interfaces/crawlable.py
@@ -91,3 +91,25 @@ class ICrawlable(Interface):
     but with a different signature. This is probably inconsistent
     and the interface must be revised. XXX
     """
+
+  def isUpdatable(self):
+    """
+    This method is used to decide if document can be updated 
+    in the crawling process.
+    """
+
+  def getFrequencyIndex():
+    """
+    Returns the document update frequency as an integer
+    which is used by alamrs to decide which documents
+    must be updates at which time. The index represents
+    a time slot (ex. all days in a month, all hours in a week).
+    Note (ivan): not sure about this if needs to be part interface or not
+    """
+
+  def getCreationDateIndex(at_date):
+    """
+    Returns the document Creation Date Index which is the creation
+    date converted into hours modulo the Frequency Index.
+    Note (ivan): not sure about this if needs to be part interface or not
+    """
diff --git a/product/ERP5/mixin/crawable.py b/product/ERP5/mixin/crawable.py
new file mode 100644
index 0000000000000000000000000000000000000000..2b010b99a5f06d14fa2592cae6c7ea3f2a0fc01d
--- /dev/null
+++ b/product/ERP5/mixin/crawable.py
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved.
+#                    Ivan Tyagov <ivan@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 AccessControl import ClassSecurityInfo, getSecurityManager
+from Products.ERP5Type import Permissions
+
+class CrawableMixin:
+  """
+  Generic implementation of ICrawlable interface
+  """
+  # Declarative security
+  security = ClassSecurityInfo()
+
+  security.declareProtected(Permissions.AccessContentsInformation, 'getFrequencyIndex')
+  def getFrequencyIndex(self):
+    """
+      Returns the document update frequency as an integer
+      which is used by alamrs to decide which documents
+      must be updates at which time. The index represents
+      a time slot (ex. all days in a month, all hours in a week).
+    """
+    try:
+      return self.getUpdateFrequencyValue().getIntIndex()
+    except AttributeError:
+      # Catch Attribute error or Key error - XXX not beautiful
+      return 0
+
+  security.declareProtected(Permissions.AccessContentsInformation, 'getCreationDateIndex')
+  def getCreationDateIndex(self, at_date = None):
+    """
+    Returns the document Creation Date Index which is the creation
+    date converted into hours modulo the Frequency Index.
+    """
+    frequency_index = self.getFrequencyIndex()
+    if not frequency_index: return -1 # If not update frequency is provided, make sure we never update
+    hour = convertDateToHour(date=self.getCreationDate())
+    creation_date_index = hour % frequency_index
+    # in the case of bisextile year, we substract 24 hours from the creation date,
+    # otherwise updating documents (frequency=yearly update) created the last
+    # 24 hours of bissextile year will be launched once every 4 years.
+    if creation_date_index >= number_of_hours_in_year:
+      creation_date_index = creation_date_index - number_of_hours_in_day
+
+    return creation_date_index
+
+  security.declareProtected(Permissions.AccessContentsInformation, 'isUpdatable')
+  def isUpdatable(self):
+    """
+      This method is used to decide which document can be updated
+      in the crawling process. This can depend for example on
+      workflow states (publication state,
+      validation state) or on roles on the document.
+    """
+    method = self._getTypeBasedMethod('isUpdatable',
+        fallback_script_id = 'Document_isUpdatable')
+    return method()
\ No newline at end of file