diff --git a/product/ZSQLCatalog/Extensions/__init__.py b/product/ZSQLCatalog/Extensions/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/product/ZSQLCatalog/Extensions/zsqlbrain.py b/product/ZSQLCatalog/Extensions/zsqlbrain.py
new file mode 100644
index 0000000000000000000000000000000000000000..49f8a330cf35abcf9a858a61c11973c1ea3b99ca
--- /dev/null
+++ b/product/ZSQLCatalog/Extensions/zsqlbrain.py
@@ -0,0 +1,107 @@
+##############################################################################
+#
+# Copyright (c) 2002 Nexedi SARL. All Rights Reserved.
+# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE
+#
+##############################################################################
+
+import string
+import Acquisition
+import sys
+from ZODB.POSException import ConflictError
+
+from AccessControl import ClassSecurityInfo
+from AccessControl.SecurityInfo import allow_class
+
+from zLOG import LOG
+
+class  ZSQLBrain(Acquisition.Implicit):
+  security = ClassSecurityInfo()
+  security.declareObjectPublic()
+
+  def _aq_dynamic(self, name):
+   """Acquire an attribute from a real object.
+   """
+   if name.startswith('__') :
+     return None
+   o = self.getObject()
+   return getattr(o, name, None)
+
+  def getURL(self):
+    return self.path
+
+  def getUrl(self):
+    return self.path
+
+  def getPath(self):
+    return self.path
+
+  def getUid(self):
+    return self.uid
+
+  getRID = getUid
+
+  def getObject(self, REQUEST=None):
+    """Try to return the object for this record"""
+    if 'path' not in dir(self) and 'PATH' not in dir(self):
+      raise ValueError, "Unable to getObject from ZSQLBrain if ZSQL Method "\
+                  "does not retrieves the `path` column from catalog table."
+    try:
+      obj = self.aq_parent.unrestrictedTraverse(self.getPath())
+      if obj is None:
+        if REQUEST is None:
+          REQUEST = self.REQUEST
+        obj = self.aq_parent.portal_catalog.resolve_url(
+                                  self.getPath(), REQUEST)
+      return obj
+    except ConflictError:
+      raise
+    except:
+      LOG("ZCatalog WARNING", 0,
+          "Could not access object path %s" % self.getPath(),
+          error=sys.exc_info() )
+      return None
+
+  def absolute_url(self, relative=0):
+    """
+      Default method used to return the path stored in the Catalog.
+      However, if virtual hosting is implemented, we must return
+      a value which is compatible with the standard absolute_url
+      behaviour
+
+      And if absolute_url is invoked within a Web Site,
+      additional Web Site behaviour is required
+
+      Implementation of absolute_url therefore consists in using
+      physicalPathToURL defined in the REQUEST so that absolute_url
+      is consistent with HTTPRequest implementation.
+    """
+    return self.REQUEST.physicalPathToURL(self.path, relative=relative)
+
+  def resolve_url(self, path, REQUEST):
+    """
+      Taken from ZCatalog
+
+      Attempt to resolve a url into an object in the Zope
+      namespace. The url may be absolute or a catalog path
+      style url. If no object is found, None is returned.
+      No exceptions are raised.
+    """
+    script=REQUEST.script
+    if string.find(path, script) != 0:
+      path='%s/%s' % (script, path)
+    try:
+      return REQUEST.resolve_url(path)
+    except ConflictError:
+      raise
+    except:
+      pass
+
+allow_class(ZSQLBrain)
diff --git a/product/ZSQLCatalog/zsqlbrain.py b/product/ZSQLCatalog/zsqlbrain.py
index 49f8a330cf35abcf9a858a61c11973c1ea3b99ca..e7fc7052ca4086e6a0758a77b5672706b2e23927 100644
--- a/product/ZSQLCatalog/zsqlbrain.py
+++ b/product/ZSQLCatalog/zsqlbrain.py
@@ -1,7 +1,6 @@
 ##############################################################################
 #
-# Copyright (c) 2002 Nexedi SARL. All Rights Reserved.
-# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
+# Copyright (c) 2006 Nexedi SARL. All Rights Reserved.
 #
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
@@ -12,96 +11,8 @@
 #
 ##############################################################################
 
-import string
-import Acquisition
-import sys
-from ZODB.POSException import ConflictError
+# This file is only for backward compatibility. Now the zsqlbrain.py resides
+# in the directory Extensions, but the class ZSQLBrain is referred to based on
+# the Product directory from other Products.
 
-from AccessControl import ClassSecurityInfo
-from AccessControl.SecurityInfo import allow_class
-
-from zLOG import LOG
-
-class  ZSQLBrain(Acquisition.Implicit):
-  security = ClassSecurityInfo()
-  security.declareObjectPublic()
-
-  def _aq_dynamic(self, name):
-   """Acquire an attribute from a real object.
-   """
-   if name.startswith('__') :
-     return None
-   o = self.getObject()
-   return getattr(o, name, None)
-
-  def getURL(self):
-    return self.path
-
-  def getUrl(self):
-    return self.path
-
-  def getPath(self):
-    return self.path
-
-  def getUid(self):
-    return self.uid
-
-  getRID = getUid
-
-  def getObject(self, REQUEST=None):
-    """Try to return the object for this record"""
-    if 'path' not in dir(self) and 'PATH' not in dir(self):
-      raise ValueError, "Unable to getObject from ZSQLBrain if ZSQL Method "\
-                  "does not retrieves the `path` column from catalog table."
-    try:
-      obj = self.aq_parent.unrestrictedTraverse(self.getPath())
-      if obj is None:
-        if REQUEST is None:
-          REQUEST = self.REQUEST
-        obj = self.aq_parent.portal_catalog.resolve_url(
-                                  self.getPath(), REQUEST)
-      return obj
-    except ConflictError:
-      raise
-    except:
-      LOG("ZCatalog WARNING", 0,
-          "Could not access object path %s" % self.getPath(),
-          error=sys.exc_info() )
-      return None
-
-  def absolute_url(self, relative=0):
-    """
-      Default method used to return the path stored in the Catalog.
-      However, if virtual hosting is implemented, we must return
-      a value which is compatible with the standard absolute_url
-      behaviour
-
-      And if absolute_url is invoked within a Web Site,
-      additional Web Site behaviour is required
-
-      Implementation of absolute_url therefore consists in using
-      physicalPathToURL defined in the REQUEST so that absolute_url
-      is consistent with HTTPRequest implementation.
-    """
-    return self.REQUEST.physicalPathToURL(self.path, relative=relative)
-
-  def resolve_url(self, path, REQUEST):
-    """
-      Taken from ZCatalog
-
-      Attempt to resolve a url into an object in the Zope
-      namespace. The url may be absolute or a catalog path
-      style url. If no object is found, None is returned.
-      No exceptions are raised.
-    """
-    script=REQUEST.script
-    if string.find(path, script) != 0:
-      path='%s/%s' % (script, path)
-    try:
-      return REQUEST.resolve_url(path)
-    except ConflictError:
-      raise
-    except:
-      pass
-
-allow_class(ZSQLBrain)
+from Products.ZSQLCatalog.Extensions.zsqlbrain import ZSQLBrain