--- a/Allura/allura/model/project.py
+++ b/Allura/allura/model/project.py
@@ -116,6 +116,24 @@
         while trove.trove_parent_id != 0:
             trove = trove.parent_category
         return trove.shortname
+
+    @LazyProperty
+    def ancestors(self):
+        ancestors = []
+        trove = self
+        while trove:
+            ancestors.append(trove)
+            trove = trove.parent_category
+        return ancestors
+
+    @LazyProperty
+    def breadcrumbs(self):
+        url = '/directory/'
+        crumbs = []
+        for trove in reversed(self.ancestors[:-1]):
+            url += trove.shortname + '/'
+            crumbs.append((trove.fullname, url))
+        return crumbs
 
 class ProjectMapperExtension(MapperExtension):
     def after_insert(self, obj, st, sess):