Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/facultycontainerpage.pt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/facultycontainerpage.pt	(revision 5935)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/facultycontainerpage.pt	(revision 5936)
@@ -30,2 +30,6 @@
   </tbody>
 </table>
+
+<div tal:content="structure provider:subobjectlist">
+  List of subobjects
+</div>
Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/subobjectlist.pt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/subobjectlist.pt	(revision 5936)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/subobjectlist.pt	(revision 5936)
@@ -0,0 +1,19 @@
+<table>
+  <thead>
+    <tr tal:repeat="viewlet viewletmanager/viewlets">
+      <th tal:replace="structure viewlet/render">
+	viewlet
+      </th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr tal:repeat="row viewletmanager/rows"
+	tal:attributes="class python: repeat['row'].odd() and 'odd' or 'even'">
+      <td tal:repeat="viewlet row">
+	<div tal:replace="structure viewlet/render">
+	  viewlet
+	</div>
+      </td>
+    </tr>
+  </tbody>
+</table>
Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/viewlets.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/viewlets.py	(revision 5935)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/viewlets.py	(revision 5936)
@@ -588,2 +588,75 @@
     link_title = 'Data Center'
     target_viewname = 'datacenter'
+
+class SubobjectLister(grok.ViewletManager):
+    """Very special viewlet manager that displays lists of subobjects.
+    """
+    grok.name('subobjectlist')
+    grok.template('subobjectlist')
+
+    def update(self):
+        # The default implementation of update() sets self.viewlets to
+        # a list of viewlets for the current context
+        # (self.context). We make use of that fact by retrieving all
+        # viewlets for all items in our context container by simply
+        # setting these items as context while we call the default
+        # update() method. So we get a list of lists of viewlets for
+        # each item in a 'row' (where a single item is a row).
+        rows = []
+        orig_context = self.context
+        for name, value in self.context.items():
+            # Retrieve all viewlets for the current item (not the context)
+            self.context = value
+            super(SubobjectLister, self).update() # sets self.viewlets
+            rows.append(self.viewlets)
+            self.context = orig_context
+        self.rows = rows
+        # Finally, set the viewlets we would retrieve normally...
+        super(SubobjectLister, self).update()
+        return
+
+
+class FacultyContainerListHead(grok.Viewlet):
+    """The header line of faculty container subobject lists.
+    """
+    grok.order(1)
+    grok.viewletmanager(SubobjectLister)
+    grok.context(IFacultyContainer)
+    grok.require('waeup.View')
+
+    def render(self):
+        return u'<th>Code</th><th>Title</th><th></th>'
+
+class FacultyListName(grok.Viewlet):
+    """Display a the title of a faculty as link in a list.
+    """
+    grok.order(1)
+    grok.viewletmanager(SubobjectLister)
+    grok.context(IFaculty)
+    grok.require('waeup.View')
+
+    def render(self):
+        return u'<a href="%s">%s</a>' % (
+            self.view.url(self.context), self.context.__name__)
+
+class FacultyListTitle(grok.Viewlet):
+    """Display the title of a faculty in a list.
+    """
+    grok.order(2)
+    grok.viewletmanager(SubobjectLister)
+    grok.context(IFaculty)
+    grok.require('waeup.View')
+
+    def render(self):
+        return self.context.title
+
+class FacultyRemoveButton(grok.Viewlet):
+    """Render a remove button for faculty lists.
+    """
+    grok.order(3)
+    grok.viewletmanager(SubobjectLister)
+    grok.context(IFaculty)
+    grok.require('waeup.manageUniversity')
+
+    def render(self):
+        return u'<div class="text-right"><form method="POST"><input class="text-right" type="submit" value="remove" /></form></div>'
