diff --git a/plugins/org.eclipse.emf.cdo.releng.apireports/src/org/eclipse/emf/cdo/releng/apireports/ApiReportsActor.java b/plugins/org.eclipse.emf.cdo.releng.apireports/src/org/eclipse/emf/cdo/releng/apireports/ApiReportsActor.java
index 1041fd1..85b788a 100644
--- a/plugins/org.eclipse.emf.cdo.releng.apireports/src/org/eclipse/emf/cdo/releng/apireports/ApiReportsActor.java
+++ b/plugins/org.eclipse.emf.cdo.releng.apireports/src/org/eclipse/emf/cdo/releng/apireports/ApiReportsActor.java
@@ -27,6 +27,7 @@
 import org.eclipse.jdt.core.IPackageFragment;
 import org.eclipse.jdt.core.IPackageFragmentRoot;
 import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.pde.api.tools.internal.ApiBaselineManager;
 import org.eclipse.pde.api.tools.internal.comparator.DeltaXmlVisitor;
@@ -64,31 +65,18 @@
   {
   }
 
-  public static void updateMonitor(IProgressMonitor monitor, int work) throws OperationCanceledException
-  {
-    if (monitor == null)
-    {
-      return;
-    }
-    if (monitor.isCanceled())
-    {
-      throw new OperationCanceledException();
-    }
-    monitor.worked(work);
-  }
-
-  public static void updateMonitor(IProgressMonitor monitor) throws OperationCanceledException
-  {
-    updateMonitor(monitor, 0);
-  }
-
   @Override
   protected IStatus internalPerform(IActionContext context, IProgressMonitor monitor) throws CoreException
   {
-    Map<String, ? extends Object> properties = context.getProperties();
-    String baselineName = (String)properties.get("baseline.name");
-    String reportFileName = (String)properties.get("reportfile.name");
-    String exclusionPatterns = (String)properties.get("exclusion.patterns");
+    Map<String, ? extends Object> properties = context.getAction().getActorProperties();
+    String baselineName = (String)properties.get("baseline");
+    if (baselineName == null || baselineName.length() == 0)
+    {
+      return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Baseline name not specified");
+    }
+
+    String exclusionPatterns = (String)properties.get("exclude");
+    String reportFileName = System.getProperty("api.report", new File("api.xml").getAbsolutePath());
 
     SubMonitor progress = SubMonitor.convert(monitor, 100);
     progress.subTask("Collecting elements to compare");
@@ -185,20 +173,32 @@
 
   private List<Object> collectProjects(String exclusionPatterns)
   {
-    Pattern[] patterns = new Pattern[exclusionPatterns.length()];
-    String[] split = exclusionPatterns.split(",");
-    for (int i = 0; i < split.length; i++)
+    Pattern[] patterns = new Pattern[0];
+    if (exclusionPatterns != null)
     {
-      patterns[i] = Pattern.compile(split[i]);
+      String[] split = exclusionPatterns.split(",");
+      patterns = new Pattern[split.length];
+      for (int i = 0; i < split.length; i++)
+      {
+        Pattern pattern = Pattern.compile(split[i]);
+        patterns[i] = pattern;
+      }
     }
 
     List<Object> result = new ArrayList<Object>();
     for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects())
     {
-      String name = project.getName();
-      if (!isExcluded(patterns, name))
+      if (project.isAccessible())
       {
-        result.add(project);
+        String name = project.getName();
+        if (!isExcluded(patterns, name))
+        {
+          IJavaProject javaProject = JavaCore.create(project);
+          if (javaProject != null)
+          {
+            result.add(javaProject);
+          }
+        }
       }
     }
 
@@ -396,4 +396,24 @@
       }
     }
   }
+
+  private static void updateMonitor(IProgressMonitor monitor, int work) throws OperationCanceledException
+  {
+    if (monitor == null)
+    {
+      return;
+    }
+
+    if (monitor.isCanceled())
+    {
+      throw new OperationCanceledException();
+    }
+
+    monitor.worked(work);
+  }
+
+  private static void updateMonitor(IProgressMonitor monitor) throws OperationCanceledException
+  {
+    updateMonitor(monitor, 0);
+  }
 }
diff --git a/plugins/org.eclipse.emf.cdo.releng/buckminster.cspex b/plugins/org.eclipse.emf.cdo.releng/buckminster.cspex
index ce6f97e..d9b158d 100644
--- a/plugins/org.eclipse.emf.cdo.releng/buckminster.cspex
+++ b/plugins/org.eclipse.emf.cdo.releng/buckminster.cspex
@@ -48,10 +48,10 @@
 	</cs:dependencies>
 
 	<cs:actions>
-		<cs:public name="generate.api.reports" actor="ant" always="true">
+		<cs:public name="generate.api.reports" actor="apireports" always="true">
 			<cs:actorProperties>
-				<cs:property key="buildFile" value="${releng}/hudson/api_reports.ant"/>
-				<cs:property key="targets" value="main"/>
+				<cs:property key="baseline" value="CDO Baseline"/>
+				<cs:property key="exclude" value=".*\.doc.*,.*\.tests.*,.*\.releng.*,.*\.examples.*,.*\.jms.*,.*\.buddies.*,.*\.gastro.*"/>
 			</cs:actorProperties>
 		</cs:public>
 	</cs:actions>
diff --git a/plugins/org.eclipse.emf.cdo.releng/build.xml b/plugins/org.eclipse.emf.cdo.releng/build.xml
index 052685d..8d70e19 100644
--- a/plugins/org.eclipse.emf.cdo.releng/build.xml
+++ b/plugins/org.eclipse.emf.cdo.releng/build.xml
@@ -667,26 +667,14 @@
 
 	<target name="-generate.api">
 		<echo message="Generating API reports" />
-		<copy todir="${temp.dropins}/plugins" overwrite="false">
-			<fileset dir="${tp}/plugins">
-				<include name="**" />
-			</fileset>
-		</copy>
+		<!--
 		<buckminster command="perform">
 			<cmdargs>
 				<arg value="-D" />
-				<arg value="api.profile=${temp.dropins}" />
-				<arg value="-D" />
-				<arg value="api.report=${hudson.WORKSPACE}" />
+				<arg value="api.report=${hudson.WORKSPACE}/api.xml" />
 				<arg value="org.eclipse.emf.cdo.releng#generate.api.reports" />
 			</cmdargs>
 		</buckminster>
-		<delete includeemptydirs="true" quiet="true">
-			<fileset dir="${buckminster.temp.root}">
-				<include name="_dropins/**" />
-			</fileset>
-		</delete>
-		<move file="${hudson.WORKSPACE}/compare.xml" tofile="${hudson.WORKSPACE}/api.xml" verbose="false" />
 		<java classname="org.eclipse.emf.cdo.releng.Api2Html">
 			<classpath>
 				<pathelement location="${releng}/bin/" />
@@ -698,6 +686,7 @@
 			<arg value="${tp}/plugins" />
 		</java>
 		<copy file="${releng}/hudson/api.css" todir="${hudson.WORKSPACE}" overwrite="true" />
+		-->
 	</target>
 
 	<!-- ================= -->
