OK try this (well don't unless you want undeletable objects) create something that is CatalogAware, than have it index itself "index_object" (when being created, inside a factory I think?), now clear your catalog and use "Find Items to ZCatalog" to index the same object. Lastly try to delete the object, Zope complains can't uncatalog the object and it won't delete it. The uid or rid or data_record_id_ (can somebody make up their "minds"?) is first indexed WITHOUT the leading '/' and than with it if we "Find Items ..." Would: url='%s/%s' % (self.DestinationURL(), self.id) not return a leading '/'? If so, would url='/%s/%s' % (self.DestinationURL(), self.id) fix it? Else could somebody add a test to see if 'uri' has a '/' in the front and ignore the problem... relevant CatalogAwareness.py: def url(self, ftype=urllib.splittype, fhost=urllib.splithost): """Return a SCRIPT_NAME-based url for an object.""" if hasattr(self, 'DestinationURL') and \ callable(self.DestinationURL): url='%s/%s' % (self.DestinationURL(), self.id) else: url=self.absolute_url() type, uri=ftype(url) host, uri=fhost(uri) script_name=self.REQUEST['SCRIPT_NAME'] __traceback_info__=(`uri`, `script_name`) if script_name: uri=filter(None, string.split(uri, script_name))[0] uri=uri or '/' if uri[0]=='/': uri=uri[1:] return uri def index_object(self): """A common method to allow Findables to index themselves.""" if hasattr(self, self.default_catalog): getattr(self, self.default_catalog).catalog_object(self, self.url()) Maybe relevant FactoryDispatcher.py class FactoryDispatcher(Acquisition.Implicit): " " def __init__(self, product, dest, REQUEST=None): if hasattr(product,'aq_base'): product=product.aq_base self._product=product self._d=dest if REQUEST is not None: v=REQUEST['URL'] v=v[:rfind(v,'/')] self._u=v[:rfind(v,'/')] def DestinationURL(self): "Return the URL for the destination for factory output" return self._u