diff --git a/src/tree.c b/src/tree.c
index a3bfe21..ca91cc0 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -191,14 +191,26 @@ Tree_len(Tree *self)
 int
 Tree_contains(Tree *self, PyObject *py_name)
 {
-    int result = 0;
+	int err;
+    git_tree_entry *entry;
     char *name = py_path_to_c_str(py_name);
     if (name == NULL)
         return -1;
 
-    result = git_tree_entry_byname(self->tree, name) ? 1 : 0;
+    err = git_tree_entry_bypath(&entry, self->tree, name);
     free(name);
-    return result;
+
+    if (err == GIT_ENOTFOUND)
+        return 0;
+
+    if (err < 0) {
+        Error_set(err);
+        return -1;
+    }
+
+    git_tree_entry_free(entry);
+
+    return 1;
 }
 
 TreeEntry *
diff --git a/test/test_tree.py b/test/test_tree.py
index d1fc0de..507a22b 100644
--- a/test/test_tree.py
+++ b/test/test_tree.py
@@ -120,6 +120,13 @@ class TreeTest(utils.BareRepoTestCase):
         for tree_entry in tree:
             self.assertEqual(tree_entry, tree[tree_entry.name])
 
+    def test_deep_contains(self):
+        tree = self.repo[TREE_SHA]
+        self.assertTrue('a' in tree)
+        self.assertTrue('c' in tree)
+        self.assertTrue('c/d' in tree)
+        self.assertFalse('c/e' in tree)
+        self.assertFalse('d' in tree)
 
 if __name__ == '__main__':
     unittest.main()