diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/API2ComponentAPI.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/API2ComponentAPI.java
index ff6b4b6939d59cb5e6d589e288fd65be647ebfae..a842646f9cda8eed3c8d1397ff471ce28e15a883 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/API2ComponentAPI.java
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/API2ComponentAPI.java
@@ -151,26 +151,62 @@ public class API2ComponentAPI implements IClassVisitor
   public List getImplClasses(String interfaceName)
   {
     List list = new ArrayList();
+    getImplClasses(interfaceName, list);
+    return list;
+  }
+
+  private void getImplClasses(String interfaceName, List list)
+  {
     List implClasses = (List)interface2ImplClasses.get(interfaceName);
     if (implClasses != null)
     {
       list.addAll(implClasses);
       for (Iterator it = implClasses.iterator(); it.hasNext();)
-        getSubClasses((String)it.next(), list);
+      {
+        String className = (String)it.next();
+        if (interface2ImplClasses.get(className) != null)
+          getImplClasses(className, list);
+        else
+        {
+          getSubClasses(className, list);
+          getSuperClasses(className, list);
+        }
+      }
     }
-    return list;
   }
 
-  private void getSubClasses(String superClassName, List list)
+  private void getSuperClasses(String className, List list)
   {
-    List subClasses = (List)super2SubClasses.get(superClassName);
-    if (subClasses != null)
+    ClassHierarchyInfo info = (ClassHierarchyInfo)super2SubClasses.get(className);
+    if (info != null)
     {
-      list.addAll(subClasses);
-      for (Iterator it = subClasses.iterator(); it.hasNext();)
-        getSubClasses((String)it.next(), list);
+      String superClassName = info.getSuperClass();
+      while (superClassName != null)
+      {
+        list.add(superClassName);
+        superClassName = null;
+        info = (ClassHierarchyInfo)super2SubClasses.get(superClassName);
+        if (info != null)
+          superClassName = info.getSuperClass();
+      }
+    }
+  }
+
+  private void getSubClasses(String className, List list)
+  {
+    ClassHierarchyInfo info = (ClassHierarchyInfo)super2SubClasses.get(className);
+    if (info != null)
+    {
+      List subClasses = info.getSubClass();
+      if (subClasses != null)
+      {
+        list.addAll(subClasses);
+        for (Iterator it = subClasses.iterator(); it.hasNext();)
+          getSubClasses((String)it.next(), list);
+      }
     }
   }
+
   private Map pluginId2CompXML = new HashMap();
 
   public void execute()
@@ -259,27 +295,27 @@ public class API2ComponentAPI implements IClassVisitor
         if (readInterface)
         {
           String superClassName = new String(reader.getSuperclassName()).replace('/', '.');
-          List subClasses = (List)super2SubClasses.get(superClassName);
-          if (subClasses == null)
+          ClassHierarchyInfo info = new ClassHierarchyInfo();
+          info.setSuperClass(superClassName);
+          super2SubClasses.put(className, info);
+          info = (ClassHierarchyInfo)super2SubClasses.get(superClassName);
+          if (info == null)
           {
-            subClasses = new ArrayList(1);
-            super2SubClasses.put(superClassName, subClasses);
+            info = new ClassHierarchyInfo();
+            super2SubClasses.put(superClassName, info);
           }
-          subClasses.add(className);
-          if (!reader.isInterface())
+          info.addSubClass(className);
+          char[][] names = reader.getInterfaceNames();
+          for (int j = 0; j < names.length; j++)
           {
-            char[][] names = reader.getInterfaceNames();
-            for (int j = 0; j < names.length; j++)
+            String interfaceName = new String(names[j]).replace('/', '.');
+            List implClasses = (List)interface2ImplClasses.get(interfaceName);
+            if (implClasses == null)
             {
-              String interfaceName = new String(names[j]).replace('/', '.');
-              List implClasses = (List)interface2ImplClasses.get(interfaceName);
-              if (implClasses == null)
-              {
-                implClasses = new ArrayList(1);
-                interface2ImplClasses.put(interfaceName, implClasses);
-              }
-              implClasses.add(className);
+              implClasses = new ArrayList(1);
+              interface2ImplClasses.put(interfaceName, implClasses);
             }
+            implClasses.add(className);
           }
         }
         if (!isSkipAPIGen() && isAPI)
@@ -545,6 +581,34 @@ public class API2ComponentAPI implements IClassVisitor
     }
   }
 
+  private class ClassHierarchyInfo
+  {
+    private String superClass;
+    private List subClass;
+
+    public List getSubClass()
+    {
+      return subClass;
+    }
+
+    public void addSubClass(String subClass)
+    {
+      if (this.subClass == null)
+        this.subClass = new ArrayList(1);
+      this.subClass.add(subClass);
+    }
+
+    public String getSuperClass()
+    {
+      return superClass;
+    }
+
+    public void setSuperClass(String superClass)
+    {
+      this.superClass = superClass;
+    }
+  }
+
   public static void main(String[] args)
   {
     CommandOptionParser optionParser = new CommandOptionParser(args);