 +
 +        def notFound(f):
 +            f.trap(http.HTTPError)
-+            if f.response.code != responsecode.NOT_FOUND:
+             if f.response.code != responsecode.NOT_FOUND:
+-                raise f
 +                return f
-+            return None
-+
+             return None
+ 
+-        return defer.maybeDeferred(self._getChild, None, self.site.resource, segments, updatepaths=False)
 +        d = defer.maybeDeferred(self._getChild, None, parent, [segment], updatepaths=False)
 +        d.addCallback(self._rememberResource, url)
 +        d.addErrback(notFound)
 +        return d
-+
+ 
      def _processingFailed(self, reason):
          if reason.check(http.HTTPError) is not None:
-             # If the exception was an HTTPError, leave it alone

 
         def notFound(f):
             f.trap(http.HTTPError)
             if f.response.code != responsecode.NOT_FOUND:
-                raise f
+                return f
             return None
 
-        return defer.maybeDeferred(self._getChild, None, self.site.resource, segments, updatepaths=False)
+        d = defer.maybeDeferred(self._getChild, None, self.site.resource, segments, updatepaths=False)
+        d.addCallback(self._rememberResource, path)
+        d.addErrback(notFound)
+        return d
 
+    def locateChildResource(self, parent, child_name):
+        """
+        Looks up the child resource with the given name given the parent

         #
         # Parse the URL
         #
@@ -406,18 +422,65 @@
                 "URL is not on this site (%s://%s/): %s" % (scheme, self.headers.getHeader("host"), url)
             ))
 
