diff -upr ../../api/api.module ./api.module
--- ../../api/api.module	2010-04-30 01:08:26.000000000 +0200
+++ ./api.module	2010-05-03 01:27:09.000000000 +0200
@@ -367,6 +367,22 @@ function api_menu() {
         'type' => $is_default ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
       );
       if ($is_default) {
+        $items['api/' . $branch->project . '/classes'] = array(
+          'title' => 'Classes',
+          'page callback' => 'api_page_listing',
+          'access arguments' => array('access API reference'),
+          'page arguments' => array($branch, 'class'),
+          'type' => MENU_CALLBACK,
+        );
+      }
+      $items['api/' . $branch->project . '/classes/'. $branch->branch_name] = array(
+        'title' => $branch->title,
+        'page callback' => 'api_page_listing',
+        'page arguments' => array($branch, 'class'),
+        'access arguments' => array('access API reference'),
+        'type' => $is_default ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
+      );
+      if ($is_default) {
         $items['api/' . $branch->project . '/groups'] = array(
           'title' => 'Topics',
           'page callback' => 'api_page_listing',
@@ -830,6 +846,7 @@ function api_block($op, $delta = NULL, $
             $links = array();
             $links[] = l($branch->title, 'api/' . $branch->project . '/' . $branch->branch_name);
             $links[] = l(t('Constants'), 'api/' . $branch->project . '/constants/' . $branch->branch_name);
+            $links[] = l(t('Classes'), 'api/' . $branch->project . '/classes/' . $branch->branch_name);
             $links[] = l(t('Files'), 'api/' . $branch->project . '/files/' . $branch->branch_name);
             $links[] = l(t('Functions'), 'api/' . $branch->project . '/functions/' . $branch->branch_name);
             $links[] = l(t('Globals'), 'api/' . $branch->project . '/globals/' . $branch->branch_name);
@@ -1439,17 +1456,19 @@ function api_page_class($branch, $class)
   $see = api_link_documentation($class->see, $branch);
 
   // builds up class hierarchy
-  $children = api_class_children($class);
-  $self = theme('item_list', array('<strong>' . $class->title . '</strong>' . $children));
-  $hierarchy = api_class_parents($class, $self);
+  $class = api_class_children($class);
+  $parents = api_class_parents($class);
+  if (count($class->children) || count($parents->children) || count($class->interface)) {
+    $hierarchy = theme('item_list', array(api_render_class_hierarchy($parents, $class->did)));
+  }
 
   // builds up methods and constants lists
   $rows = array(
-    'constant' => array(),
+    'const' => array(),
     'function' => array(),
   );
 
-  $result = db_query("SELECT branch_id, title, object_name, summary, object_type, file_name FROM {api_documentation} WHERE class_did = %d AND branch_id = %d AND object_type IN ('constant', 'function') ORDER BY title", $class->did, $class->branch_id);
+  $result = db_query("SELECT branch_id, title, object_name, summary, object_type, file_name FROM {api_documentation} WHERE class_did = %d AND branch_id = %d AND object_type IN ('const', 'function') ORDER BY title", $class->did, $class->branch_id);
   while ($object = db_fetch_object($result)) {
     $rows[$object->object_type][] = array(
       l($object->title, api_url($object)),
@@ -1462,15 +1481,9 @@ function api_page_class($branch, $class)
     t('Description'),
   );
 
-  if (count($rows)) {
-    foreach ($rows as $type => $row) {
-      if (count($row) > 0) {
-        $list[$type] = theme('table', $header, $row);
-      }
-    }
-  }
+  $list = api_render_tables($rows, $header);
 
-  $output = theme('api_class_page', $branch, $class, $documentation, $hierarchy, $list['function'], $list['constant'], $code, $related_topics, $see);
+  $output = theme('api_class_page', $branch, $class, $documentation, $hierarchy, $list['function'], $list['const'], $code, $related_topics, $see);
   $output .= _api_add_comments($class);
 
   return $output;
@@ -1501,25 +1514,11 @@ function api_page_file($branch, $file) {
     t('Name'),
     t('Description'),
   );
-  $classes = '';
-  if (count($rows['class']) > 0) {
-    $classes = theme('table', $header, $rows['class']);
-  }
-  $constants = '';
-  if (count($rows['constant']) > 0) {
-    $constants = theme('table', $header, $rows['constant']);
-  }
-  $globals = '';
-  if (count($rows['global']) > 0) {
-    $globals = theme('table', $header, $rows['global']);
-  }
-  $functions = '';
-  if (count($rows['function']) > 0) {
-    $functions = theme('table', $header, $rows['function']);
-  }
+
+  $list = api_render_tables($rows, $header);
   $related_topics = api_related_topics($file->did, $branch);
 
-  $output = theme('api_file_page', $file, $documentation, $classes, $constants, $globals, $functions, $see, $related_topics);
+  $output = theme('api_file_page', $file, $documentation, $list['class'], $list['constant'], $list['global'], $list['function'], $see, $related_topics);
   $output .= _api_add_comments($file);
   return $output;
 }
@@ -1596,24 +1595,10 @@ function api_page_group($branch, $group)
     t('Location'),
     t('Description'),
   );
-  $constants = '';
-  if (count($rows['constant']) > 0) {
-    $constants = theme('table', $header, $rows['constant']);
-  }
-  $globals = '';
-  if (count($rows['global']) > 0) {
-    $globals = theme('table', $header, $rows['global']);
-  }
-  $functions = '';
-  if (count($rows['function']) > 0) {
-    $functions = theme('table', $header, $rows['function']);
-  }
-  $files = '';
-  if (count($rows['file']) > 0) {
-    $files = theme('table', $header, $rows['file']);
-  }
+  
+  $list = api_render_tables($rows, $header);
 
-  $output = theme('api_group_page', $branch, $group, $documentation, $constants, $globals, $functions, $files, $see);
+  $output = theme('api_group_page', $branch, $group, $documentation, $list['constant'], $list['global'], $list['function'], $list['file'], $see);
   $output .= _api_add_comments($group);
   return $output;
 }
@@ -1947,40 +1932,97 @@ function api_link_link($name, $branch, $
 }
 
 /**
- * Returns class parents (recursive)
+ * Returns class parents and interfaces (recursive)
+ *
+ * Get all interfaces first so we can return the recursive call after if needed
  *
  * @param $class
  *   The class to look for parents.
- * @param $text
- *   sub classes text.
  *
  * @return
- *   The list as html.
+ *   object class with
+ *     children = array(object class)
+ *     interfaces = array(object interface).
  */
-function api_class_parents($class, $text = '') {
-  $tree = array();
-  $result = db_query("SELECT DISTINCT rs.to_did as did, rs.branch_id as branch_id, d.title as title, d.object_type as object_type, d.file_name as file_name, d.object_name as object_name FROM {api_reference_storage} rs INNER JOIN {api_documentation} d ON d.did = rs.to_did WHERE rs.from_did = %d AND rs.branch_id = %d AND rs.object_type IN ('class', 'interface')", $class->did, $class->branch_id);
-  $object = db_fetch_object($result);
-  if (isset($object->did)) {
-    return api_class_parents($object, theme('item_list', array(l($object->title, api_url($object)) . $text)));
+function api_class_parents($class, $recursive = true) {
+  $result = db_query("SELECT DISTINCT d.did as did, d.branch_id as branch_id, d.title as title, d.object_type as object_type, d.file_name as file_name, d.object_name as object_name FROM {api_reference_storage} rs INNER JOIN {api_documentation} d ON d.did = rs.to_did WHERE rs.from_did = %d AND rs.branch_id = %d AND rs.object_type IN ('interface'" . ($recursive ? ", 'class'" : '') . ") ORDER BY d.object_type DESC", $class->did, $class->branch_id);
+  while ($object = db_fetch_object($result)) {
+    if ($object->object_type == 'interface') {
+      $class->interfaces[] = $object;
+    }
+    else {
+      $object->children[] = $class;
+      return api_class_parents($object);
+    }
   }
-  return $text;
+  return $class;
 }
 
 /**
- * Returns class children (recursive)
+ * Returns class children with interfaces (recursive)
  *
  * @param $class
  *   The class to look for children.
  *
  * @return
- *   The list as html.
+ *   object class with
+ *     children = array(object class)
+ *     interfaces = array(object interface).
  */
 function api_class_children($class) {
-  $rows = array();
-  $result = db_query("SELECT DISTINCT rs.from_did as did, rs.branch_id as branch_id, d.title as title, d.object_type as object_type, d.file_name as file_name, d.object_name as object_name FROM {api_reference_storage} rs INNER JOIN {api_documentation} d ON d.did = rs.from_did WHERE rs.to_did = %d AND rs.branch_id = %d AND rs.object_type IN ('class', 'interface')", $class->did, $class->branch_id);
+  $result = db_query("SELECT DISTINCT d.did as did, d.branch_id as branch_id, d.title as title, d.object_type as object_type, d.file_name as file_name, d.object_name as object_name FROM {api_documentation} d INNER JOIN {api_reference_storage} rs ON d.did = rs.from_did WHERE rs.to_did = %d AND d.branch_id = %d AND d.object_type = 'class'", $class->did, $class->branch_id);
   while ($object = db_fetch_object($result)) {
-    $rows[] = l($object->title, api_url($object)) . api_class_children($object);
+    // found a child : gather its interfaces, builds its possible children list, and adds it to the children list
+    $class->children[] = api_class_children(api_class_parents($object, false));
   }
-  return theme('item_list', $rows);
+  return $class;
 }
+
+/**
+ * Render class hierarchy (recursive)
+ *
+ * @param $object
+ *   Object hierarchy.
+ * @param $selected_did
+ *   Selected class did.
+ *
+ * @return
+ *   Themed hierarchy in html unordered list.
+ */
+function api_render_class_hierarchy($object, $selected_did = '') {
+  if (count($object->interfaces)) {
+    foreach ($object->interfaces as $interface) {
+      $interface_text = (empty($interface_text) ? '' : ',') . ' ' . l($interface->title, api_url($interface));
+    }
+    $interface_text = ' implements' . $interface_text;
+  }
+  if (count($object->children)) {
+    foreach ($object->children as $child) {
+      $children[] .= api_render_class_hierarchy($child, $selected_did);
+    }
+  }
+  $object_text = ( $object->did == $selected_did ? '<strong>' . $object->title . '</strong>' : l($object->title, api_url($object)) );
+  return $object_text . $interface_text . theme('item_list', $children);
+}
+
+/**
+ * Render lists of tables with the same header
+ *
+ * @param $rows
+ *   An array of data to render with theme_table.
+ *
+ * @return
+ *   List of themed html tables.
+ */
+function api_render_tables($tables, $header) {
+  $list = array();
+  if (count($tables)) {
+    foreach ($tables as $type => $row) {
+      if (count($row)) {
+        $list[$type] = theme('table', $header, $row);
+      }
+    }
+  }
+  return $list;
+}
+
diff -upr ../../api/tests/sample/classes.php ./tests/sample/classes.php
--- ../../api/tests/sample/classes.php	2010-04-10 07:38:26.000000000 +0200
+++ ./tests/sample/classes.php	2010-05-03 01:21:44.000000000 +0200
@@ -37,6 +37,23 @@ interface SampleInterface {
 
 /**
  * Subclass.
+ *
+ * @see Sample::foo() should be link
  */
-class SubSample extends Sample {
+class SubSample extends Sample implements SampleInterfaceTwo {
+  /**
+   * Metasyntatic member function.
+   */
+  public function bar() {
+  }
+}
+
+/**
+ * Sample interface.
+ */
+interface SampleInterfaceTwo {
+  /**
+   * Implement this API.
+   */
+  public function bar();
 }
