diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/META-INF/MANIFEST.MF b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/META-INF/MANIFEST.MF
index 56cf082ab07baa92dc99e8af328a287026615e94..dac8dd9add433edaaccfe98590d7f63370852cbb 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/META-INF/MANIFEST.MF
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/META-INF/MANIFEST.MF
@@ -24,5 +24,7 @@ Export-Package: org.eclipse.wtp.releng.tools.component,
  org.eclipse.wtp.releng.tools.component.violation,
  org.eclipse.wtp.releng.tools.component.xsl
 Require-Bundle: org.eclipse.jdt.core,
- org.eclipse.core.runtime
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.jface.text
 Eclipse-AutoStart: true
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 5f9c830fe265e4c4aa28d5847709bfae4b25d2b0..fbe8c71623c7f322deb090346596abc595349786 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
@@ -44,32 +44,45 @@ import org.eclipse.wtp.releng.tools.component.xsl.XSLUtil;
 
 public class API2ComponentAPI implements IClassVisitor
 {
-  private String api;
-  private String src;
+  private Collection api;
+  private Collection src;
   private String outputDir;
   private Collection includes;
   private Collection excludes;
   private boolean html;
-  private boolean readInterface = false;
+  private boolean readInterface = true;
   private boolean skipAPIGen = false;
   private Map interface2ImplClasses = new HashMap(0);
+  private Map super2SubClasses = new HashMap(0);
 
-  public String getApi()
+  public Collection getApi()
   {
     return api;
   }
 
   public void setApi(String api)
+  {
+    this.api = new ArrayList(1);
+    this.api.add(api);
+  }
+
+  public void setApi(Collection api)
   {
     this.api = api;
   }
 
-  public String getSrc()
+  public Collection getSrc()
   {
     return src;
   }
 
   public void setSrc(String src)
+  {
+    this.src = new ArrayList(1);
+    this.src.add(src);
+  }
+
+  public void setSrc(Collection src)
   {
     this.src = src;
   }
@@ -136,32 +149,55 @@ public class API2ComponentAPI implements IClassVisitor
 
   public List getImplClasses(String interfaceName)
   {
+    List list = new ArrayList();
     List implClasses = (List)interface2ImplClasses.get(interfaceName);
-    return implClasses != null ? new ArrayList(implClasses) : new ArrayList(0);
+    if (implClasses != null)
+    {
+      list.addAll(implClasses);
+      for (Iterator it = implClasses.iterator(); it.hasNext();)
+        getSubClasses((String)it.next(), list);
+    }
+    return list;
   }
 
+  private void getSubClasses(String superClassName, List list)
+  {
+    List subClasses = (List)super2SubClasses.get(superClassName);
+    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()
   {
     // Collection component.xml files
-    ILocation apiLocation = Location.createLocation(new File(api));
-    ComponentXMLVisitor compXMLVisitor = new ComponentXMLVisitor();
-    apiLocation.accept(compXMLVisitor);
-    for (Iterator it = compXMLVisitor.getCompXMLs().iterator(); it.hasNext();)
+    for (Iterator i = api.iterator(); i.hasNext();)
     {
-      ComponentXML compXML = (ComponentXML)it.next();
-      for (Iterator it2 = compXML.getPlugins().iterator(); it2.hasNext();)
+      ILocation apiLocation = Location.createLocation(new File((String)i.next()));
+      ComponentXMLVisitor compXMLVisitor = new ComponentXMLVisitor();
+      apiLocation.accept(compXMLVisitor);
+      for (Iterator it = compXMLVisitor.getCompXMLs().iterator(); it.hasNext();)
       {
-        pluginId2CompXML.put(((Plugin)it2.next()).getId(), compXML);
+        ComponentXML compXML = (ComponentXML)it.next();
+        for (Iterator it2 = compXML.getPlugins().iterator(); it2.hasNext();)
+        {
+          pluginId2CompXML.put(((Plugin)it2.next()).getId(), compXML);
+        }
       }
     }
     // Generate api-info.xml files
-    ILocation srcLocation = Location.createLocation(new File(src));
-    LibVisitor libVisitor = new LibVisitor();
-    srcLocation.accept(libVisitor);
-    libVisitor.setClassVisitor(this);
-    srcLocation.accept(libVisitor);
+    for (Iterator it = src.iterator(); it.hasNext();)
+    {
+      ILocation srcLocation = Location.createLocation(new File((String)it.next()));
+      LibVisitor libVisitor = new LibVisitor();
+      srcLocation.accept(libVisitor);
+      libVisitor.setClassVisitor(this);
+      srcLocation.accept(libVisitor);
+    }
     try
     {
       if (cachedCompAPI != null)
@@ -199,13 +235,7 @@ public class API2ComponentAPI implements IClassVisitor
     summary.append("</root>");
     try
     {
-      XSLUtil.transform
-      (
-        ClassLoader.getSystemResourceAsStream("org/eclipse/wtp/releng/tools/component/xsl/api-info-summary.xsl"),
-        new ByteArrayInputStream(summary.toString().getBytes()),
-        new FileOutputStream(new File(outputDir + "/api-info-summary.html")),
-        outputDir
-      );
+      XSLUtil.transform(ClassLoader.getSystemResourceAsStream("org/eclipse/wtp/releng/tools/component/xsl/api-info-summary.xsl"), new ByteArrayInputStream(summary.toString().getBytes()), new FileOutputStream(new File(outputDir + "/api-info-summary.html")), outputDir);
     }
     catch (Throwable e)
     {
@@ -215,54 +245,58 @@ public class API2ComponentAPI implements IClassVisitor
 
   public boolean visit(String pluginId, ILocation classLoc)
   {
-    String className = classLoc.getName();
-    className = className.substring(0, className.length() - ".class".length());
-    className = className.replace('/', '.');
-    className = className.replace('\\', '.');
-    if (include(className))
+    try
     {
-      int i = className.lastIndexOf('.');
-      String packageName = (i != -1) ? className.substring(0, i) : "";
-      String localName = (i != -1) ? className.substring(i + 1) : className;
-      boolean isAPI;
-      ComponentXML compXML = (ComponentXML)pluginId2CompXML.get(pluginId);
-      if (compXML != null)
+      IClassFileReader reader = read(classLoc);
+      String className = new String(reader.getClassName()).replace('/', '.');
+      if (include(className))
       {
-        Package pkg = compXML.getPackage(packageName);
-        if (pkg != null)
+        int i = className.lastIndexOf('.');
+        String packageName = (i != -1) ? className.substring(0, i) : "";
+        String localName = (i != -1) ? className.substring(i + 1) : className;
+        boolean isAPI;
+        ComponentXML compXML = (ComponentXML)pluginId2CompXML.get(pluginId);
+        if (compXML != null)
         {
-          Type type = pkg.getType(localName);
-          if (type != null)
+          Package pkg = compXML.getPackage(packageName);
+          if (pkg != null)
           {
-            if (!type.isReference() && !type.isSubclass() && !type.isImplement() && !type.isInstantiate())
+            Type type = pkg.getType(localName);
+            if (type != null)
             {
-              isAPI = false;
+              if (!type.isReference() && !type.isSubclass() && !type.isImplement() && !type.isInstantiate())
+              {
+                isAPI = false;
+              }
+              else
+              {
+                isAPI = true;
+              }
             }
             else
             {
-              isAPI = true;
+              isAPI = pkg.isApi();
             }
           }
           else
           {
-            isAPI = pkg.isApi();
+            isAPI = false;
           }
         }
         else
         {
           isAPI = false;
         }
-      }
-      else
-      {
-        isAPI = false;
-      }
-      IClassFileReader reader = null;
-      if (readInterface)
-      {
-        try
+        if (readInterface)
         {
-          reader = read(classLoc);
+          String superClassName = new String(reader.getSuperclassName()).replace('/', '.');
+          List subClasses = (List)super2SubClasses.get(superClassName);
+          if (subClasses == null)
+          {
+            subClasses = new ArrayList(1);
+            super2SubClasses.put(superClassName, subClasses);
+          }
+          subClasses.add(className);
           if (!reader.isInterface())
           {
             char[][] names = reader.getInterfaceNames();
@@ -279,78 +313,78 @@ public class API2ComponentAPI implements IClassVisitor
             }
           }
         }
-        catch (IOException ioe)
+        if (!isSkipAPIGen() && isAPI)
         {
-          ioe.printStackTrace();
-        }
-        catch (ClassFormatException cfe)
-        {
-          cfe.printStackTrace();
-        }
-      }
-      if (!isSkipAPIGen() && isAPI)
-      {
-        try
-        {
-          ComponentAPI compAPI = getComponentAPI(pluginId);
-          PackageAPI pkgAPI = (PackageAPI)compAPI.getPackageAPI(packageName);
-          if (pkgAPI == null)
+          try
           {
-            pkgAPI = new PackageAPI();
-            pkgAPI.setName(packageName);
-            compAPI.addPackageAPI(pkgAPI);
-          }
-          ClassAPI classAPI = pkgAPI.getClassAPI(localName);
-          if (classAPI == null)
-          {
-            if (reader == null)
-              reader = read(classLoc);
-            classAPI = new ClassAPI();
-            classAPI.setName(localName);
-            classAPI.setAccess(reader.getAccessFlags());
-            classAPI.setSuperClass(new String(reader.getSuperclassName()).replace('/', '.'));
-            pkgAPI.addClassAPI(classAPI);
-            IMethodInfo[] methods = reader.getMethodInfos();
-            for (int j = 0; j < methods.length; j++)
+            ComponentAPI compAPI = getComponentAPI(pluginId);
+            PackageAPI pkgAPI = (PackageAPI)compAPI.getPackageAPI(packageName);
+            if (pkgAPI == null)
+            {
+              pkgAPI = new PackageAPI();
+              pkgAPI.setName(packageName);
+              compAPI.addPackageAPI(pkgAPI);
+            }
+            ClassAPI classAPI = pkgAPI.getClassAPI(localName);
+            if (classAPI == null)
             {
-              MethodAPI methodAPI = new MethodAPI();
-              methodAPI.setName(new String(methods[j].getName()));
-              methodAPI.setAccess(methods[j].getAccessFlags());
-              methodAPI.setDescriptor(new String(methods[j].getDescriptor()));
-              IExceptionAttribute exceptionAttr = methods[j].getExceptionAttribute();
-              if (exceptionAttr != null)
+              if (reader == null)
+                reader = read(classLoc);
+              classAPI = new ClassAPI();
+              classAPI.setName(localName);
+              classAPI.setAccess(reader.getAccessFlags());
+              classAPI.setSuperClass(new String(reader.getSuperclassName()).replace('/', '.'));
+              pkgAPI.addClassAPI(classAPI);
+              IMethodInfo[] methods = reader.getMethodInfos();
+              for (int j = 0; j < methods.length; j++)
               {
-                char[][] exceptionNames = exceptionAttr.getExceptionNames();
-                List exceptions = new ArrayList(exceptionNames.length);
-                for (int k = 0; k < exceptionNames.length; k++)
+                MethodAPI methodAPI = new MethodAPI();
+                methodAPI.setName(new String(methods[j].getName()));
+                methodAPI.setAccess(methods[j].getAccessFlags());
+                methodAPI.setDescriptor(new String(methods[j].getDescriptor()));
+                IExceptionAttribute exceptionAttr = methods[j].getExceptionAttribute();
+                if (exceptionAttr != null)
                 {
-                  exceptions.add(new String(exceptionNames[k]).replace('/', '.'));
+                  char[][] exceptionNames = exceptionAttr.getExceptionNames();
+                  List exceptions = new ArrayList(exceptionNames.length);
+                  for (int k = 0; k < exceptionNames.length; k++)
+                  {
+                    exceptions.add(new String(exceptionNames[k]).replace('/', '.'));
+                  }
+                  methodAPI.addThrows(exceptions);
                 }
-                methodAPI.addThrows(exceptions);
+                classAPI.addMethodAPI(methodAPI);
+              }
+              IFieldInfo[] fields = reader.getFieldInfos();
+              for (int j = 0; j < fields.length; j++)
+              {
+                FieldAPI fieldAPI = new FieldAPI();
+                fieldAPI.setName(new String(fields[j].getName()));
+                fieldAPI.setAccess(fields[j].getAccessFlags());
+                fieldAPI.setDescriptor(new String(fields[j].getDescriptor()));
+                classAPI.addFieldAPI(fieldAPI);
               }
-              classAPI.addMethodAPI(methodAPI);
-            }
-            IFieldInfo[] fields = reader.getFieldInfos();
-            for (int j = 0; j < fields.length; j++)
-            {
-              FieldAPI fieldAPI = new FieldAPI();
-              fieldAPI.setName(new String(fields[j].getName()));
-              fieldAPI.setAccess(fields[j].getAccessFlags());
-              fieldAPI.setDescriptor(new String(fields[j].getDescriptor()));
-              classAPI.addFieldAPI(fieldAPI);
             }
           }
-        }
-        catch (IOException e)
-        {
-          throw new RuntimeException(e);
-        }
-        catch (ClassFormatException e)
-        {
-          throw new RuntimeException(e);
+          catch (IOException e)
+          {
+            throw new RuntimeException(e);
+          }
+          catch (ClassFormatException e)
+          {
+            throw new RuntimeException(e);
+          }
         }
       }
     }
+    catch (IOException ioe)
+    {
+      ioe.printStackTrace();
+    }
+    catch (ClassFormatException cfe)
+    {
+      cfe.printStackTrace();
+    }
     return true;
   }
 
@@ -470,8 +504,8 @@ public class API2ComponentAPI implements IClassVisitor
       System.exit(-1);
     }
     API2ComponentAPI api2CompAPI = new API2ComponentAPI();
-    api2CompAPI.setApi((String)api.iterator().next());
-    api2CompAPI.setSrc((String)src.iterator().next());
+    api2CompAPI.setApi(api);
+    api2CompAPI.setSrc(src);
     api2CompAPI.setOutputDir((String)outputDir.iterator().next());
     api2CompAPI.setIncludes(includes);
     api2CompAPI.setExcludes(excludes);
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/ComponentAPI.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/ComponentAPI.java
index 270135da0bee1fb7854f61fc0790f21c3d99e891..d8229bfaa866b4402c1f6e59d0801047087dc5d9 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/ComponentAPI.java
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/ComponentAPI.java
@@ -54,6 +54,7 @@ public class ComponentAPI extends ComponentObject
   private static final String ELEMENT_THROW = "throw";
   private static final String ATTR_ACCESS = "access";
   private static final String ATTR_NAME = "name";
+  private static final String ATTR_SUPER = "super";
   private static final String ATTR_TIMESTAMP = "timestamp";
   private static final String ATTR_DESCRIPTOR = "descriptor";
   private static final String ATTR_REFERENCE = "reference";
@@ -282,6 +283,9 @@ public class ComponentAPI extends ComponentObject
         {
           classAPI = new ClassAPI();
           classAPI.setName(attributes.getValue(ATTR_NAME));
+          String attrSuper = attributes.getValue(ATTR_SUPER);
+          if (attrSuper != null)
+            classAPI.setSuperClass(attrSuper);
           String attrAccess = attributes.getValue(ATTR_ACCESS);
           if (attrAccess != null)
             classAPI.setAccess(Integer.parseInt(attrAccess));
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/compatibility/APICompatibilityScanner.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/compatibility/APICompatibilityScanner.java
index 3d08bdf7b6be43d87748a67ef5059a8ff5a885d0..c9ff959c5b246df9f10574c42905bcec1ced972f 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/compatibility/APICompatibilityScanner.java
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/compatibility/APICompatibilityScanner.java
@@ -331,15 +331,15 @@ public class APICompatibilityScanner
     String currOutputDir = od + "1/";
     String refOutputDir = od + "2/";
     API2ComponentAPI api2CompAPI = new API2ComponentAPI();
-    api2CompAPI.setApi((String)api.iterator().next());
-    api2CompAPI.setSrc((String)src.iterator().next());
+    api2CompAPI.setApi(api);
+    api2CompAPI.setSrc(src);
     api2CompAPI.setOutputDir(currOutputDir);
     api2CompAPI.setIncludes(includes);
     api2CompAPI.setExcludes(excludes);
     api2CompAPI.execute();
     api2CompAPI = new API2ComponentAPI();
-    api2CompAPI.setApi((String)refapi.iterator().next());
-    api2CompAPI.setSrc((String)refsrc.iterator().next());
+    api2CompAPI.setApi(refapi);
+    api2CompAPI.setSrc(refsrc);
     api2CompAPI.setOutputDir(refOutputDir);
     api2CompAPI.setIncludes(includes);
     api2CompAPI.setExcludes(excludes);
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/violation/NonAPIDependencyScanner.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/violation/NonAPIDependencyScanner.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec3e2365e65b1433ad4678bbf34dfa30f9c55beb
--- /dev/null
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/violation/NonAPIDependencyScanner.java
@@ -0,0 +1,489 @@
+/**********************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+  *
+ * Contributors:
+ *    IBM - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.wtp.releng.tools.component.api.violation;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jdt.core.util.IModifierConstants;
+import org.eclipse.wtp.releng.tools.component.ILocation;
+import org.eclipse.wtp.releng.tools.component.ILocationVisitor;
+import org.eclipse.wtp.releng.tools.component.api.API2ComponentAPI;
+import org.eclipse.wtp.releng.tools.component.api.ClassAPI;
+import org.eclipse.wtp.releng.tools.component.api.ComponentAPI;
+import org.eclipse.wtp.releng.tools.component.api.ComponentXMLVisitor;
+import org.eclipse.wtp.releng.tools.component.api.FieldAPI;
+import org.eclipse.wtp.releng.tools.component.api.MethodAPI;
+import org.eclipse.wtp.releng.tools.component.api.PackageAPI;
+import org.eclipse.wtp.releng.tools.component.images.ImagesUtil;
+import org.eclipse.wtp.releng.tools.component.internal.ComponentEntry;
+import org.eclipse.wtp.releng.tools.component.internal.ComponentSummary;
+import org.eclipse.wtp.releng.tools.component.internal.Location;
+import org.eclipse.wtp.releng.tools.component.model.ComponentXML;
+import org.eclipse.wtp.releng.tools.component.model.Package;
+import org.eclipse.wtp.releng.tools.component.model.Plugin;
+import org.eclipse.wtp.releng.tools.component.model.Type;
+import org.eclipse.wtp.releng.tools.component.util.CommandOptionParser;
+import org.eclipse.wtp.releng.tools.component.xsl.XSLUtil;
+
+public class NonAPIDependencyScanner implements ILocationVisitor
+{
+  private Collection src;
+  private Collection api;
+  private String outputDir;
+  private Collection includes;
+  private Collection excludes;
+  private Collection refapi;
+  private boolean skipAPIGen;
+
+  public Collection getApi()
+  {
+    return api;
+  }
+
+  public void setApi(Collection api)
+  {
+    this.api = api;
+  }
+
+  public String getOutputDir()
+  {
+    return outputDir;
+  }
+
+  public void setOutputDir(String outputDir)
+  {
+    this.outputDir = addTrailingSeperator(outputDir);
+  }
+
+  public Collection getIncludes()
+  {
+    return includes;
+  }
+
+  public void setIncludes(Collection includes)
+  {
+    this.includes = includes;
+  }
+
+  public Collection getExcludes()
+  {
+    return excludes;
+  }
+
+  public void setExcludes(Collection excludes)
+  {
+    this.excludes = excludes;
+  }
+
+  public Collection getRefapi()
+  {
+    return refapi;
+  }
+
+  public void setRefapi(Collection refapi)
+  {
+    this.refapi = refapi;
+  }
+
+  public Collection getSrc()
+  {
+    return src;
+  }
+
+  public void setSrc(Collection src)
+  {
+    this.src = src;
+  }
+
+  public boolean isSkipAPIGen()
+  {
+    return skipAPIGen;
+  }
+
+  public void setSkipAPIGen(boolean skipAPIGen)
+  {
+    this.skipAPIGen = skipAPIGen;
+  }
+
+  private API2ComponentAPI api2CompXML;
+  private ComponentSummary summary;
+
+  public void execute()
+  {
+    // Collect component.xml files
+    cacheCompXML(api);
+    cacheCompXML(refapi);
+
+    // Generate api-info.xml
+    api2CompXML = new API2ComponentAPI();
+    api2CompXML.setApi(api);
+    api2CompXML.setSrc(src);
+    api2CompXML.setOutputDir(outputDir);
+    api2CompXML.setReadInterface(true);
+    api2CompXML.setSkipAPIGen(skipAPIGen);
+    api2CompXML.execute();
+
+    // Generate non-API dependency report
+    summary = new ComponentSummary();
+    ILocation out = Location.createLocation(new File(outputDir));
+    out.accept(this);
+
+    // Generate HTML report
+    try
+    {
+      ImagesUtil.copyAll(outputDir);
+      XSLUtil.transform
+      (
+        ClassLoader.getSystemResourceAsStream("org/eclipse/wtp/releng/tools/component/xsl/component-api-violation.xsl"),
+        new ByteArrayInputStream(summary.toString().getBytes()),
+        new FileOutputStream(new File(outputDir + "component-api-violation-all.html")),
+        outputDir
+      );
+    }
+    catch (Throwable e)
+    {
+      try
+      {
+        XSLUtil.transform
+        (
+          Platform.getBundle("org.eclipse.wtp.releng.tools.component.core").getResource("org/eclipse/wtp/releng/tools/component/xsl/component-api-violation.xsl").openStream(),
+          new ByteArrayInputStream(summary.toString().getBytes()),
+          new FileOutputStream(new File(outputDir + "component-api-violation-all.html")),
+          outputDir
+        );
+      }
+      catch (Throwable e2)
+      {
+        e2.printStackTrace();
+      }
+    }
+  }
+
+  private Map pluginId2CompXML = new HashMap();
+
+  private void cacheCompXML(Collection locations)
+  {
+    for (Iterator i = locations.iterator(); i.hasNext();)
+    {
+      ILocation apiLocation = Location.createLocation(new File((String)i.next()));
+      ComponentXMLVisitor compXMLVisitor = new ComponentXMLVisitor();
+      apiLocation.accept(compXMLVisitor);
+      for (Iterator it = compXMLVisitor.getCompXMLs().iterator(); it.hasNext();)
+      {
+        ComponentXML compXML = (ComponentXML)it.next();
+        for (Iterator it2 = compXML.getPlugins().iterator(); it2.hasNext();)
+        {
+          pluginId2CompXML.put(((Plugin)it2.next()).getId(), compXML);
+        }
+      }
+    }
+  }
+
+  public boolean accept(ILocation location)
+  {
+    if (location.getName().equals("api-info.xml"))
+    {
+      try
+      {
+        ComponentAPI compAPI = new ComponentAPI();
+        compAPI.setLocation(location);
+        compAPI.load();
+        ComponentAPIViolation violation = getViolations(compAPI);
+        String compName = compAPI.getName();
+        StringBuffer sb = new StringBuffer(outputDir);
+        sb.append(compName);
+        sb.append("/component-api-violation.xml");
+        File file = new File(sb.toString());
+        file.getParentFile().mkdirs();
+        FileOutputStream fos = new FileOutputStream(file);
+        String content = violation.toString();
+        fos.write(content.getBytes());
+        fos.close();
+        ComponentEntry entry = new ComponentEntry();
+        entry.setCompName(compName);
+        entry.setRef(sb.toString());
+        summary.add(entry);
+      }
+      catch (IOException ioe)
+      {
+        ioe.printStackTrace();
+      }
+    }
+    return true;
+  }
+
+  private ComponentAPIViolation getViolations(ComponentAPI compAPI)
+  {
+    ComponentAPIViolation v = new ComponentAPIViolation();
+    v.setName(compAPI.getName());
+    for (Iterator it = compAPI.getPackageAPIs().iterator(); it.hasNext();)
+      v.addAllViolations(genAPIViolation((PackageAPI)it.next()));
+    return v;
+  }
+
+  private List genAPIViolation(PackageAPI pkgAPI)
+  {
+    List classViolations = new ArrayList();
+    for (Iterator it = pkgAPI.getClassAPIs().iterator(); it.hasNext();)
+    {
+      ClassViolation classViolation = getViolations((ClassAPI)it.next());
+      if (classViolation != null)
+        classViolations.add(classViolation);
+    }
+    return classViolations;
+  }
+
+  private ClassViolation getViolations(ClassAPI classAPI)
+  {
+    ClassViolation classViolation = new ClassViolation();
+    classViolation.setName(classAPI.getName());
+    boolean isSuperClassAPI;
+    String superClassName = classAPI.getSuperClass();
+    if (isInterface(classAPI.getAccess()))
+      isSuperClassAPI = isAPI(superClassName, false, false, true, false);
+    else
+      isSuperClassAPI = isAPI(superClassName, false, true, false, false);
+    if (!isSuperClassAPI)
+    {
+      SuperViolation superViolation = new SuperViolation();
+      superViolation.setName(superClassName);
+      classViolation.addViolation(superViolation);
+    }
+    for (Iterator it = classAPI.getMethodAPIs().iterator(); it.hasNext();)
+    {
+      MethodAPI methodAPI = (MethodAPI)it.next();
+      MethodViolation methodViolation = new MethodViolation();
+      methodViolation.setName(methodAPI.getName());
+      String desc = methodAPI.getDescriptor();
+      String returnTypeDesc = Signature.getReturnType(desc);
+      String returnType = toFullyQualifiedName(returnTypeDesc);
+      if (Signature.getTypeSignatureKind(returnTypeDesc) != Signature.BASE_TYPE_SIGNATURE && !isAPI(returnType, true, false, false, false))
+      {
+        ReturnViolation returnViolation = new ReturnViolation();
+        returnViolation.setName(returnType);
+        methodViolation.addViolation(returnViolation);
+      }
+      String[] params = Signature.getParameterTypes(desc);
+      for (int j = 0; j < params.length; j++)
+      {
+        String param = toFullyQualifiedName(params[j]);
+        if (Signature.getTypeSignatureKind(params[j]) != Signature.BASE_TYPE_SIGNATURE && !isAPI(param, true, false, false, false))
+        {
+          ParamViolation paramViolation = new ParamViolation();
+          paramViolation.setName(param);
+          methodViolation.addViolation(paramViolation);
+        }
+      }
+      String[] throwTypes = Signature.getThrownExceptionTypes(desc);
+      for (int j = 0; j < throwTypes.length; j++)
+      {
+        String throwType = toFullyQualifiedName(throwTypes[j]);
+        if (Signature.getTypeSignatureKind(throwTypes[j]) != Signature.BASE_TYPE_SIGNATURE && !isAPI(throwType, true, false, false, false))
+        {
+          ThrowViolation throwViolation = new ThrowViolation();
+          throwViolation.setName(throwType);
+          methodViolation.addViolation(throwViolation);
+        }
+      }
+      if (methodViolation.countViolations() > 0)
+        classViolation.addViolation(methodViolation);
+    }
+    for (Iterator it = classAPI.getFieldAPIs().iterator(); it.hasNext();)
+    {
+      FieldAPI fieldAPI = (FieldAPI)it.next();
+      String desc = new String(fieldAPI.getDescriptor());
+      String field = toFullyQualifiedName(desc);
+      if (Signature.getTypeSignatureKind(desc) != Signature.BASE_TYPE_SIGNATURE && !isAPI(field, true, false, false, false))
+      {
+        FieldViolation fieldViolation = new FieldViolation();
+        fieldViolation.setName(fieldAPI.getName());
+        fieldViolation.setType(field);
+        classViolation.addViolation(fieldViolation);
+      }
+    }
+    if (classViolation.countViolations() > 0)
+      return classViolation;
+    else
+      return null;
+  }
+
+  private String toFullyQualifiedName(String descriptor)
+  {
+    StringBuffer sb = new StringBuffer();
+    descriptor = descriptor.replace('/', '.');
+    sb.append(Signature.getSignatureQualifier(descriptor));
+    sb.append('.');
+    sb.append(Signature.getSignatureSimpleName(descriptor).replace('.', '$'));
+    return sb.toString();
+  }
+
+  private boolean isInterface(int access)
+  {
+    return ((access & IModifierConstants.ACC_INTERFACE) == IModifierConstants.ACC_INTERFACE);
+  }
+
+  protected boolean include(String name)
+  {
+    name = name.replace('/', '.');
+    name = name.replace('\\', '.');
+    if (excludes != null && !excludes.isEmpty())
+      for (Iterator it = excludes.iterator(); it.hasNext();)
+        if (name.matches((String)it.next()))
+          return false;
+    if (includes != null && !includes.isEmpty())
+    {
+      for (Iterator it = includes.iterator(); it.hasNext();)
+        if (name.matches((String)it.next()))
+          return true;
+      return false;
+    }
+    return true;
+  }
+
+  private boolean isAPI(String className, boolean ref, boolean subclass, boolean implement, boolean instantiate)
+  {
+    if (include(className))
+    {
+      String pkgName = null;
+      String typeName = null;
+      int dot = className.lastIndexOf('.');
+      if (dot != -1)
+      {
+        pkgName = className.substring(0, dot);
+        typeName = className.substring(dot + 1);
+      }
+      if (pkgName != null && typeName != null)
+      {
+        for (Iterator it = pluginId2CompXML.values().iterator(); it.hasNext();)
+        {
+          ComponentXML compXML = (ComponentXML)it.next();
+          for (Iterator pkgIt = compXML.getPackages().iterator(); pkgIt.hasNext();)
+          {
+            Package pkg = (Package)pkgIt.next();
+            if (pkgName.equals(pkg.getName()))
+            {
+              // if not overwritten, inner class inherits usages from base class
+              int index = typeName.indexOf('$');
+              String baseTypeName = (index != -1) ? typeName.substring(0, index) : null;
+              Type baseType = null;
+              for (Iterator typeIt = pkg.getTypes().iterator(); typeIt.hasNext();)
+              {
+                Type type = (Type)typeIt.next();
+                String name = type.getName();
+                if (typeName.equals(name))
+                {
+                  if (ref && !type.isReference())
+                    return false;
+                  if (subclass && !type.isSubclass())
+                    return false;
+                  if (implement && !type.isImplement())
+                    return false;
+                  if (instantiate && !type.isInstantiate())
+                    return false;
+                  return true;
+                }
+                if (baseTypeName != null && baseType == null && baseTypeName.equals(name))
+                {
+                  baseType = type;
+                }
+              }
+              if (baseType != null)
+              {
+                if (ref && !baseType.isReference())
+                  return false;
+                if (subclass && !baseType.isSubclass())
+                  return false;
+                if (implement && !baseType.isImplement())
+                  return false;
+                if (instantiate && !baseType.isInstantiate())
+                  return false;
+                return true;
+              }
+              return pkg.isApi();
+            }
+          }
+        }
+      }
+      return false;
+    }
+    else
+    {
+      return true;
+    }
+  }
+
+  protected String addTrailingSeperator(String s)
+  {
+    if (s != null && !s.endsWith("/") && !s.endsWith("\\"))
+    {
+      StringBuffer sb = new StringBuffer(s);
+      sb.append('/');
+      return sb.toString();
+    }
+    else
+    {
+      return s;
+    }
+  }
+
+  public static void main(String[] args)
+  {
+    CommandOptionParser optionParser = new CommandOptionParser(args);
+    Map options = optionParser.getOptions();
+    Collection src = (Collection)options.get("src");
+    Collection api = (Collection)options.get("api");
+    Collection outputDir = (Collection)options.get("outputDir");
+    Collection includes = (Collection)options.get("includes");
+    Collection excludes = (Collection)options.get("excludes");
+    Collection refapi = (Collection)options.get("refapi");
+    Collection skipAPIGen = (Collection)options.get("skipAPIGen");
+    if (src == null || api == null || outputDir == null || src.size() < 1 || api.size() < 1 || outputDir.size() < 1)
+    {
+      printUsage();
+      System.exit(-1);
+    }
+    NonAPIDependencyScanner scanner = new NonAPIDependencyScanner();
+    scanner.setSrc(src);
+    scanner.setApi(api);
+    scanner.setOutputDir((String)outputDir.iterator().next());
+    scanner.setIncludes(includes);
+    scanner.setExcludes(excludes);
+    scanner.setRefapi(refapi);
+    scanner.setSkipAPIGen(skipAPIGen != null);
+    scanner.execute();
+  }
+
+  private static void printUsage()
+  {
+    System.out.println("Usage: java org.eclipse.wtp.releng.tools.component.api.violation.NonAPIDependencyScanner -src <src> -api <api> -outputDir <outputDir> [-options]");
+    System.out.println("");
+    System.out.println("\t-src\t\t<src>\t\tlocation of a Eclipse-based product (requires SDK build)");
+    System.out.println("\t-api\t\t<api>\t\tlocation of your component.xml");
+    System.out.println("\t-outputDir\t<outputDir>\toutput directory of component.xml files");
+    System.out.println("");
+    System.out.println("where options include:");
+    System.out.println("");
+    System.out.println("\t-includes\t<includes>\tspace seperated packages to include");
+    System.out.println("\t-excludes\t<excludes>\tspace seperated packages to exclude");
+    System.out.println("\t-refapi\t<refapi>\tlocation of component.xml being referenced");
+    System.out.println("\t-skipAPIGen\t\t\tskip api-info.xml generation and use existing ones");
+  }
+}
\ No newline at end of file
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/classes/Class2Reference.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/classes/Class2Reference.java
index 5cf71adc291cde572c8de6e5177b0de1a58f3c39..e37515003560058db78c84932101e3882662c78d 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/classes/Class2Reference.java
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/classes/Class2Reference.java
@@ -29,6 +29,7 @@ import org.eclipse.jdt.core.util.ICodeAttribute;
 import org.eclipse.jdt.core.util.IConstantPool;
 import org.eclipse.jdt.core.util.IConstantPoolConstant;
 import org.eclipse.jdt.core.util.IConstantPoolEntry;
+import org.eclipse.jdt.core.util.IFieldInfo;
 import org.eclipse.jdt.core.util.ILineNumberAttribute;
 import org.eclipse.jdt.core.util.IMethodInfo;
 import org.eclipse.jdt.internal.core.util.ClassFileReader;
@@ -174,6 +175,8 @@ public class Class2Reference implements IClassVisitor
         setClassUse(source, refClassName, Boolean.TRUE, null, null, null, null);
       }
     }
+    // method info & field info
+    setMethodAndFieldInfoUses(reader, source);
     // method ref & field ref
     if (!isClassRefOnly())
     {
@@ -228,13 +231,10 @@ public class Class2Reference implements IClassVisitor
       }
       fieldRefs = null;
       // use: subclass
-      if (reader.isInterface())
+      String superClass = new String(reader.getSuperclassName()).replace('/', '.');
+      if (superClass != null && include(superClass))
       {
-        String superClass = new String(reader.getSuperclassName()).replace('/', '.');
-        if (superClass != null && include(superClass))
-        {
-          setClassUse(source, superClass, null, Boolean.TRUE, null, null, null);
-        }
+        setClassUse(source, superClass, null, Boolean.TRUE, null, null, null);
       }
       // use: implement
       char[][] interfaceNames = reader.getInterfaceNames();
@@ -381,6 +381,60 @@ public class Class2Reference implements IClassVisitor
     }
   }
 
+  private void setMethodAndFieldInfoUses(IClassFileReader reader, Source source)
+  {
+    String className = new String(reader.getClassName()).replace('/', '.');
+    IMethodInfo[] methodInfos = reader.getMethodInfos();
+    for (int i = 0; i < methodInfos.length; i++)
+    {
+      String desc = new String(methodInfos[i].getDescriptor());
+      String returnTypeDesc = Signature.getReturnType(desc);
+      String returnType = toFullyQualifiedName(returnTypeDesc);
+      if (Signature.getTypeSignatureKind(returnTypeDesc) != Signature.BASE_TYPE_SIGNATURE && !className.equals(returnType) && include(returnType))
+      {
+        setClassUse(source, returnType, Boolean.TRUE, null, null, null, null);
+      }
+      String[] params = Signature.getParameterTypes(desc);
+      for (int j = 0; j < params.length; j++)
+      {
+        String param = toFullyQualifiedName(params[j]);
+        if (Signature.getTypeSignatureKind(params[j]) != Signature.BASE_TYPE_SIGNATURE && !className.equals(param) && include(param))
+        {
+          setClassUse(source, param, Boolean.TRUE, null, null, null, null);
+        }
+      }
+      String[] throwTypes = Signature.getThrownExceptionTypes(desc);
+      for (int j = 0; j < throwTypes.length; j++)
+      {
+        String throwType = toFullyQualifiedName(throwTypes[j]);
+        if (Signature.getTypeSignatureKind(throwTypes[j]) != Signature.BASE_TYPE_SIGNATURE && !className.equals(throwType) && include(throwType))
+        {
+          setClassUse(source, throwType, Boolean.TRUE, null, null, null, null);
+        }
+      }
+    }
+    IFieldInfo[] fieldInfos = reader.getFieldInfos();
+    for (int i = 0; i < fieldInfos.length; i++)
+    {
+      String desc = new String(fieldInfos[i].getDescriptor());
+      String field = toFullyQualifiedName(desc);
+      if (Signature.getTypeSignatureKind(desc) != Signature.BASE_TYPE_SIGNATURE && !className.equals(field) && include(field))
+      {
+        setClassUse(source, field, Boolean.TRUE, null, null, null, null);
+      }
+    }
+  }
+
+  private String toFullyQualifiedName(String descriptor)
+  {
+    StringBuffer sb = new StringBuffer();
+    descriptor = descriptor.replace('/', '.');
+    sb.append(Signature.getSignatureQualifier(descriptor));
+    sb.append('.');
+    sb.append(Signature.getSignatureSimpleName(descriptor).replace('.', '$'));
+    return sb.toString();
+  }
+
   private IConstantPoolEntry[] getConstantPoolEntries(IClassFileReader reader, int kind)
   {
     List entries = new Vector();
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/classes/LibVisitor.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/classes/LibVisitor.java
index 262a481d1afd3a96586b33389ce4597c6a19a177..69a321574cce5a3b2e97122884d270949ad7fd79 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/classes/LibVisitor.java
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/classes/LibVisitor.java
@@ -64,7 +64,7 @@ public class LibVisitor implements ILocationVisitor
       }
       else if (Location.isArchive(locationName))
       {
-        acceptSingleJar(location);
+        return acceptSingleJar(location);
       }
       else if (locationName.endsWith(".classpath"))
       {
@@ -137,6 +137,8 @@ public class LibVisitor implements ILocationVisitor
               if (path != null && path.length() > 0)
               {
                 StringBuffer sb = new StringBuffer();
+                if (locationName.equalsIgnoreCase("plugin.xml"))
+                  locationName = location.getAbsolutePath();
                 sb.append(locationName.substring(0, locationName.length() - "plugin.xml".length() - 1));
                 sb.append("/");
                 sb.append(path);
@@ -178,6 +180,8 @@ public class LibVisitor implements ILocationVisitor
               if (path != null && path.length() > 0)
               {
                 StringBuffer sb = new StringBuffer();
+                if (locationName.equalsIgnoreCase("fragment.xml"))
+                  locationName = location.getAbsolutePath();
                 sb.append(locationName.substring(0, locationName.length() - "fragment.xml".length() - 1));
                 sb.append("/");
                 sb.append(path);
@@ -214,6 +218,8 @@ public class LibVisitor implements ILocationVisitor
             if (path != null && path.length() > 0)
             {
               StringBuffer sb = new StringBuffer();
+              if (locationName.equalsIgnoreCase("MANIFEST.MF"))
+                locationName = location.getAbsolutePath();
               sb.append(locationName.substring(0, locationName.length() - "META-INF/MANIFEST.MF".length() - 1));
               sb.append("/");
               sb.append(path);
@@ -228,13 +234,13 @@ public class LibVisitor implements ILocationVisitor
     }
   }
 
-  private void acceptSingleJar(ILocation location)
+  private boolean acceptSingleJar(ILocation location)
   {
     ILocationChildrenIterator it = location.childIterator();
     for (ILocation child = it.next(); child != null; child = it.next())
     {
       String name = child.getName();
-      if (name.endsWith("MANIFEST.MF"))
+      if (name.equalsIgnoreCase("META-INF/MANIFEST.MF"))
       {
         try
         {
@@ -245,7 +251,7 @@ public class LibVisitor implements ILocationVisitor
           {
             bundleName = (new StringTokenizer(bundleName, ";")).nextToken().trim();
             lib2pluginId.put(location.getName().replace('\\', '/'), bundleName);
-            return;
+            return false;
           }
         }
         catch (IOException e)
@@ -266,7 +272,7 @@ public class LibVisitor implements ILocationVisitor
             if (id != null && id.length() > 0)
             {
               lib2pluginId.put(location.getName().replace('\\', '/'), id);
-              return;
+              return false;
             }
           }
         }
@@ -288,7 +294,7 @@ public class LibVisitor implements ILocationVisitor
             if (id != null && id.length() > 0)
             {
               lib2pluginId.put(location.getName().replace('\\', '/'), id);
-              return;
+              return false;
             }
           }
         }
@@ -297,6 +303,7 @@ public class LibVisitor implements ILocationVisitor
         }
       }
     }
+    return true;
   }
 
   private void acceptDotClasspath(ILocation location)
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/java/JavadocVisitor.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/java/JavadocVisitor.java
index f5806051c2198a800727fc56b70cf4126280a9d7..4c7407f18b623e6a6dd177975505edebe2b40eb5 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/java/JavadocVisitor.java
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/java/JavadocVisitor.java
@@ -134,9 +134,9 @@ public class JavadocVisitor extends ASTVisitor
       descriptor.append(Signature.C_PARAM_END);
 
       // return type
-      boolean hasReturn = false;
+      boolean hasReturn = node.isConstructor();
       org.eclipse.jdt.core.dom.Type returnType = node.getReturnType2();
-      if (returnType instanceof PrimitiveType)
+      if (!hasReturn && returnType instanceof PrimitiveType)
         if (((PrimitiveType)returnType).getPrimitiveTypeCode() == PrimitiveType.VOID)
           hasReturn = true;
       descriptor.append(getDescriptor(returnType));
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/tptp/CodeCoverageScanner.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/tptp/CodeCoverageScanner.java
index 45aa25a8e6cd12093e3b97ec445724795e2e7fc7..95f5f5af78d1be97f0500a296b721d7e04e1e32a 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/tptp/CodeCoverageScanner.java
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/tptp/CodeCoverageScanner.java
@@ -44,7 +44,7 @@ import org.xml.sax.helpers.DefaultHandler;
 public class CodeCoverageScanner implements ILocationVisitor
 {
   private String api;
-  private String src;
+  private Collection src;
   private String trcxml;
   private String outputDir;
   private boolean skipAPIGen;
@@ -73,12 +73,12 @@ public class CodeCoverageScanner implements ILocationVisitor
     this.api = api;
   }
 
-  public String getSrc()
+  public Collection getSrc()
   {
     return src;
   }
 
-  public void setSrc(String src)
+  public void setSrc(Collection src)
   {
     this.src = src;
   }
@@ -440,10 +440,8 @@ public class CodeCoverageScanner implements ILocationVisitor
       System.exit(-1);
     }
     CodeCoverageScanner scanner = new CodeCoverageScanner();
-    if (api != null)
-      scanner.setApi((String)api.iterator().next());
-    if (src != null)
-      scanner.setSrc((String)src.iterator().next());
+    scanner.setApi((String)api.iterator().next());
+    scanner.setSrc(src);
     scanner.setTRCXML((String)trcxml.iterator().next());
     scanner.setOutputDir((String)outputDir.iterator().next());
     scanner.setSkipAPIGen(skipAPIGen != null);
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/xsl/api-violation.xsl b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/xsl/api-violation.xsl
index 1bb6bc109f36d3baaf3da50b6f16429ee450377b..f7cb12d18ecfc869ffa63614038e4927b36cb996 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/xsl/api-violation.xsl
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/xsl/api-violation.xsl
@@ -108,7 +108,7 @@
 				<xsl:value-of select="@name"/>
 				<p>
 					<div id="source::{@name}">
-						<xsl:if test="class-use/@subclass">
+						<xsl:if test="class-use/@subclass = 'true'">
 							<p>
 							<img src="../space.gif"/>
 							<b>Cannot subclass:</b><br/>
@@ -123,7 +123,7 @@
 							</p>
 						</xsl:if>
 
-						<xsl:if test="class-use/@implement">
+						<xsl:if test="class-use/@implement = 'true'">
 							<p>
 							<img src="../space.gif"/>
 							<b>Cannot implement:</b><br/>
@@ -138,7 +138,7 @@
 							</p>
 						</xsl:if>
 
-						<xsl:if test="class-use/@instantiate">
+						<xsl:if test="class-use/@instantiate = 'true'">
 							<p>
 							<img src="../space.gif"/>
 							<b>Cannot instantiate:</b><br/>
@@ -159,7 +159,7 @@
 							</p>
 						</xsl:if>
 
-						<xsl:if test="class-use/@reference">
+						<xsl:if test="class-use/@reference = 'true'">
 							<p>
 							<img src="../space.gif"/>
 							<b>Cannot reference:</b><br/>
@@ -168,28 +168,28 @@
 								<xsl:if test="@reference">
 									<img src="../space.gif"/>
 									<img src="../space.gif"/>
-									<xsl:value-of select="@name"/><br/>
+									<xsl:value-of select="@name"/>
 									<xsl:for-each select="method-use">
 										<xsl:if test="@name!='&lt;init&gt;'">
-											<i>
+											<br/><i>
 											<img src="../space.gif"/>
 											<img src="../space.gif"/>
 											<img src="../space.gif"/>
 											<xsl:value-of select="@name"/>(...)
 											<img src="../space.gif"/>
-											<xsl:value-of select="@lines"/><br/>
+											<xsl:value-of select="@lines"/>
 											</i>
 										</xsl:if>
 									</xsl:for-each>
 									<xsl:for-each select="field-use">
 										<xsl:sort select="@name"/>
-										<i>
+										<br/><i>
 										<img src="../space.gif"/>
 										<img src="../space.gif"/>
 										<img src="../space.gif"/>
 										<xsl:value-of select="@name"/>
 										<img src="../space.gif"/>
-										<xsl:value-of select="@lines"/><br/>
+										<xsl:value-of select="@lines"/>
 										</i>
 									</xsl:for-each>
 									<br/>
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/plugin.properties b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/plugin.properties
index 4651d9137d2b351e9b16b4fa1d219d9ae3a464e5..53c455bfc609c1f2c9af51cadecc9d8f8e96df58 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/plugin.properties
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/plugin.properties
@@ -1,4 +1,5 @@
 LABEL_POPUP_MENU_API=API
 LABEL_POPUP_ACTION_API_VIOLATION=Scan for API Violation
 LABEL_POPUP_ACTION_SCAN_4_MISSING_JAVADOC=Scan for Missing javadoc
+LABEL_POPUP_ACTION_SCAN_4_NON_API_DEPS=Scan for Non-API dependencies
 EDITOR_COMPONENT_XML=Component.xml Editor
\ No newline at end of file
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/plugin.xml b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/plugin.xml
index 3cc5c5c616cba56945f5af37132e2087f0719e6e..5a79b00eae46618142d0832059532e84f513ba3c 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/plugin.xml
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/plugin.xml
@@ -34,6 +34,11 @@
             class="org.eclipse.wtp.releng.tools.component.ui.internal.action.Scan4MissingJavadoc"
             menubarPath="org.eclipse.wtp.releng.tools.component.ui.popupMenu/popupActions"
             id="org.eclipse.wtp.releng.tools.component.ui.internal.action.Scan4MissingJavadoc"/> 
+		<action
+            label="%LABEL_POPUP_ACTION_SCAN_4_NON_API_DEPS"
+            class="org.eclipse.wtp.releng.tools.component.ui.internal.action.Scan4NonAPIDependency"
+            menubarPath="org.eclipse.wtp.releng.tools.component.ui.popupMenu/popupActions"
+            id="org.eclipse.wtp.releng.tools.component.ui.internal.action.Scan4NonAPIDependency"/> 
       </objectContribution>
    </extension>
 
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4APIViolation.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4APIViolation.java
index 23e8f5c6cd4e885fc1bc034f428bbea1e84cc007..d46d946d25dccb34834224bcd0f9be522aa9e857 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4APIViolation.java
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4APIViolation.java
@@ -114,12 +114,12 @@ public class Scan4APIViolation extends Action implements IActionDelegate
                 srcs.add(workspace.append(project.getFullPath()).toFile().toURL().toString().substring(6));
             }
             String violationOutputDir = outputDir.append("_output_").toString();
+            delete(new File(violationOutputDir));
             StringBuffer sb = new StringBuffer();
             sb.append(violationOutputDir);
             sb.append('/');
             sb.append(selectedCompXML.getName());
             reportDir = sb.toString();
-            (new File(reportDir + "/api-violation.xml")).delete();
             String[] args = new String[srcs.size() + 13];
             int i = 0;
             args[i++] = "-src";
@@ -169,4 +169,22 @@ public class Scan4APIViolation extends Action implements IActionDelegate
   public void selectionChanged(IAction action, ISelection selection)
   {
   }
+
+  private boolean delete(File file)
+  {
+    String name = file.getName();
+    if (name.endsWith(".gif") || name.endsWith(".jpg") || name.endsWith(".html"))
+      return true;
+    else if (file.isDirectory())
+    {
+      boolean b = true;
+      File[] children = file.listFiles();
+      for (int i = 0; i < children.length; i++)
+        if (!delete(children[i]))
+          b = false;
+      return b;
+    }
+    else
+      return file.delete();
+  }
 }
\ No newline at end of file
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4MissingJavadoc.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4MissingJavadoc.java
index fa17ad802191ee1ae20a87f0aa924e43cc2ea37d..ccb5c5107bdad3850536bebbdf468624c7cf2594 100644
--- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4MissingJavadoc.java
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4MissingJavadoc.java
@@ -44,6 +44,7 @@ public class Scan4MissingJavadoc extends Action implements IActionDelegate
   public void run()
   {
     String outputDir = Platform.getPluginStateLocation(ComponentUIPlugin.getDefault()).append("_output_").toString();
+    delete(new File(outputDir));
     IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
     if (window != null)
     {
@@ -70,12 +71,6 @@ public class Scan4MissingJavadoc extends Action implements IActionDelegate
               IProject project = workspaceRoot.getProject(plugin.getId());
               if (project.exists())
               {
-                StringBuffer sb = new StringBuffer();
-                sb.append(outputDir);
-                sb.append('/');
-                sb.append(project.getName());
-                sb.append("/api-info.xml");
-                new File(sb.toString()).delete();
                 srcs.add(workspace.append(project.getFullPath()).toFile().toURL().toString().substring(6));
               }
             }
@@ -121,4 +116,22 @@ public class Scan4MissingJavadoc extends Action implements IActionDelegate
   public void selectionChanged(IAction action, ISelection selection)
   {
   }
+
+  private boolean delete(File file)
+  {
+    String name = file.getName();
+    if (name.endsWith(".gif") || name.endsWith(".jpg") || name.endsWith(".html"))
+      return true;
+    else if (file.isDirectory())
+    {
+      boolean b = true;
+      File[] children = file.listFiles();
+      for (int i = 0; i < children.length; i++)
+        if (!delete(children[i]))
+          b = false;
+      return b;
+    }
+    else
+      return file.delete();
+  }
 }
\ No newline at end of file
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4NonAPIDependency.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4NonAPIDependency.java
new file mode 100644
index 0000000000000000000000000000000000000000..781eb2af17d8aee74f3789af6f96bf0c7f1b216b
--- /dev/null
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4NonAPIDependency.java
@@ -0,0 +1,183 @@
+/**********************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+  *
+ * Contributors:
+ *    IBM - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.wtp.releng.tools.component.ui.internal.action;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+import org.eclipse.wtp.releng.tools.component.ILocation;
+import org.eclipse.wtp.releng.tools.component.api.ComponentXMLVisitor;
+import org.eclipse.wtp.releng.tools.component.api.violation.NonAPIDependencyScanner;
+import org.eclipse.wtp.releng.tools.component.internal.Location;
+import org.eclipse.wtp.releng.tools.component.java.Java2API;
+import org.eclipse.wtp.releng.tools.component.model.ComponentXML;
+import org.eclipse.wtp.releng.tools.component.model.Plugin;
+import org.eclipse.wtp.releng.tools.component.ui.internal.ComponentUIPlugin;
+import org.eclipse.wtp.releng.tools.component.ui.internal.WorkspaceFileLocation;
+import org.osgi.service.prefs.Preferences;
+
+public class Scan4NonAPIDependency extends Action implements IActionDelegate
+{
+  public void run()
+  {
+    // Get src
+    IPreferencesService prefService = Platform.getPreferencesService();
+    IEclipsePreferences eclipsePref = prefService.getRootNode();
+    Preferences pdePref = eclipsePref.node("/instance/org.eclipse.pde.core");
+    String platformPath = pdePref.get("platform_path", null);
+    String src = platformPath != null ? platformPath : Platform.getInstallLocation().toString();
+
+    // Get outputDir
+    IPath outputDir = Platform.getPluginStateLocation(ComponentUIPlugin.getDefault());
+    String compXMLOutputDir = outputDir.addTrailingSeparator().append(src.replace(':', '_').replace('/', '_').replace('\\', '_')).toString();
+    if (!(new File(compXMLOutputDir).exists()))
+    {
+      // Get existing component.xml
+      List excludePlugins = new ArrayList();
+      ComponentXMLVisitor compXMLVisitor = new ComponentXMLVisitor();
+      Location.createLocation(new File(src)).accept(compXMLVisitor);
+      for (Iterator it = compXMLVisitor.getCompXMLs().iterator(); it.hasNext();)
+      {
+        ComponentXML compXML = (ComponentXML)it.next();
+        for (Iterator it2 = compXML.getPlugins().iterator(); it2.hasNext();)
+        {
+          Plugin plugin = (Plugin)it2.next();
+          excludePlugins.add(plugin.getId());
+        }
+      }
+      // Generate missing component.xml
+      List excludes = new ArrayList(1);
+      excludes.add(".*internal.*");
+      Java2API java2api = new Java2API();
+      java2api.setSrc(src);
+      java2api.setOutputDir(compXMLOutputDir);
+      java2api.setExcludes(excludes);
+      java2api.setExcludePlugins(excludePlugins);
+      java2api.execute();
+    }
+
+    // Generate Non-API dependency report
+    String reportOutputDir = null;
+    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+    if (window != null)
+    {
+      IStructuredSelection selection = (IStructuredSelection)window.getSelectionService().getSelection();
+      if (selection != null && !selection.isEmpty())
+      {
+        Object firstElement = selection.getFirstElement();
+        if (firstElement != null && firstElement instanceof IFile)
+        {
+          try
+          {
+            IFile file = (IFile)firstElement;
+            ILocation compXMLLoc = new WorkspaceFileLocation(file);
+            ComponentXML selectedCompXML = new ComponentXML();
+            selectedCompXML.setLocation(compXMLLoc);
+            selectedCompXML.load();
+            Collection plugins = selectedCompXML.getPlugins();
+            List srcs = new ArrayList(plugins.size());
+            IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
+            IPath workspace = workspaceRoot.getLocation();
+            for (Iterator it = plugins.iterator(); it.hasNext();)
+            {
+              Plugin plugin = (Plugin)it.next();
+              IProject project = workspaceRoot.getProject(plugin.getId());
+              if (project.exists())
+                srcs.add(workspace.append(project.getFullPath()).toFile().toURL().toString().substring(6));
+            }
+            reportOutputDir = outputDir.append("_output_").toString();
+            delete(new File(reportOutputDir));
+            String[] args = new String[srcs.size() + 13];
+            int i = 0;
+            args[i++] = "-src";
+            for (Iterator it = srcs.iterator(); it.hasNext();)
+              args[i++] = (String)it.next();
+            args[i++] = "-api";
+            args[i++] = compXMLLoc.getAbsolutePath();
+            args[i++] = "-outputDir";
+            args[i++] = reportOutputDir;
+            args[i++] = "-refapi";
+            args[i++] = compXMLOutputDir;
+            args[i++] = "-includes";
+            args[i++] = "org.eclipse.*";
+            NonAPIDependencyScanner.main(args);
+          }
+          catch (Throwable ioe)
+          {
+            ioe.printStackTrace();
+          }
+        }
+      }
+    }
+
+    // Open report
+    try
+    {
+      IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
+      IWebBrowser browser = browserSupport.createBrowser("org.eclipse.wtp.releng.tools.component.ui.internal.action.Scan4APIViolation");
+      browser.openURL(new File(reportOutputDir + "/component-api-violation-all.html").toURL());
+    }
+    catch (PartInitException e)
+    {
+    }
+    catch (MalformedURLException e)
+    {
+    }
+  }
+
+  public void run(IAction action)
+  {
+    run();
+  }
+
+  public void selectionChanged(IAction action, ISelection selection)
+  {
+  }
+
+  private boolean delete(File file)
+  {
+    String name = file.getName();
+    if (name.endsWith(".gif") || name.endsWith(".jpg") || name.endsWith(".html"))
+      return true;
+    else if (file.isDirectory())
+    {
+      boolean b = true;
+      File[] children = file.listFiles();
+      for (int i = 0; i < children.length; i++)
+        if (!delete(children[i]))
+          b = false;
+      return b;
+    }
+    else
+      return file.delete();
+  }
+}
\ No newline at end of file
diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4UnitTestCoverage.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4UnitTestCoverage.java
new file mode 100644
index 0000000000000000000000000000000000000000..46a6fd8a6f9455fb5bf3bec3d6fbfc2423cf7e24
--- /dev/null
+++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.ui/src/org/eclipse/wtp/releng/tools/component/ui/internal/action/Scan4UnitTestCoverage.java
@@ -0,0 +1,124 @@
+/**********************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+  *
+ * Contributors:
+ *    IBM - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.wtp.releng.tools.component.ui.internal.action;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+import org.eclipse.wtp.releng.tools.component.ILocation;
+import org.eclipse.wtp.releng.tools.component.model.ComponentXML;
+import org.eclipse.wtp.releng.tools.component.model.Plugin;
+import org.eclipse.wtp.releng.tools.component.ui.internal.ComponentUIPlugin;
+import org.eclipse.wtp.releng.tools.component.ui.internal.WorkspaceFileLocation;
+
+public class Scan4UnitTestCoverage extends Action implements IActionDelegate
+{
+  public void run()
+  {
+    String outputDir = Platform.getPluginStateLocation(ComponentUIPlugin.getDefault()).append("_output_").toString();
+    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+    if (window != null)
+    {
+      IStructuredSelection selection = (IStructuredSelection)window.getSelectionService().getSelection();
+      if (selection != null && !selection.isEmpty())
+      {
+        Object firstElement = selection.getFirstElement();
+        if (firstElement != null && firstElement instanceof IFile)
+        {
+          try
+          {
+            IFile file = (IFile)firstElement;
+            ILocation compXMLLoc = new WorkspaceFileLocation(file);
+            ComponentXML selectedCompXML = new ComponentXML();
+            selectedCompXML.setLocation(compXMLLoc);
+            selectedCompXML.load();
+            Collection plugins = selectedCompXML.getPlugins();
+            List srcs = new ArrayList(plugins.size());
+            IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
+            IPath workspace = workspaceRoot.getLocation();
+            for (Iterator it = plugins.iterator(); it.hasNext();)
+            {
+              Plugin plugin = (Plugin)it.next();
+              IProject project = workspaceRoot.getProject(plugin.getId());
+              if (project.exists())
+              {
+                StringBuffer sb = new StringBuffer();
+                sb.append(outputDir);
+                sb.append('/');
+                sb.append(project.getName());
+                sb.append("/api-info.xml");
+                new File(sb.toString()).delete();
+                srcs.add(workspace.append(project.getFullPath()).toFile().toURL().toString().substring(6));
+              }
+            }
+            String[] args = new String[srcs.size() + 6];
+            int i = 0;
+            args[i++] = "-src";
+            for (Iterator it = srcs.iterator(); it.hasNext();)
+              args[i++] = (String)it.next();
+            args[i++] = "-api";
+            args[i++] = compXMLLoc.getAbsolutePath();
+            args[i++] = "-outputDir";
+            args[i++] = outputDir;
+            args[i++] = "-html";
+            JavadocScanner2.main(args);
+          }
+          catch (IOException ioe)
+          {
+            ioe.printStackTrace();
+          }
+        }
+      }
+    }
+    // Open report
+    try
+    {
+      IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
+      IWebBrowser browser = browserSupport.createBrowser("org.eclipse.wtp.releng.tools.component.ui.internal.action.Scan4MissingJavadoc");
+      browser.openURL(new File(outputDir + "/api-javadoc-summary.html").toURL());
+    }
+    catch (PartInitException e)
+    {
+    }
+    catch (MalformedURLException e)
+    {
+    }
+  }
+
+  public void run(IAction action)
+  {
+    run();
+  }
+
+  public void selectionChanged(IAction action, ISelection selection)
+  {
+  }
+}
\ No newline at end of file