Merge bug fixes from HEAD, Root_R3_2_maintenance through v20060712-1750, into 3.2 maintenance.  Includes fixes for 143872, 144875, 148321, 148328, 150051, and updates bundle versions to 3.2.1.
diff --git a/org.eclipse.jdt.apt.core/META-INF/MANIFEST.MF b/org.eclipse.jdt.apt.core/META-INF/MANIFEST.MF
index 8055230..29f3702 100644
--- a/org.eclipse.jdt.apt.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.apt.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.apt.core; singleton:=true
-Bundle-Version: 3.2.0.qualifier
+Bundle-Version: 3.2.1.qualifier
 Bundle-Localization: plugin
 Export-Package: com.sun.mirror.apt,
  com.sun.mirror.declaration,
diff --git a/org.eclipse.jdt.apt.core/schema/annotationProcessorFactory.exsd b/org.eclipse.jdt.apt.core/schema/annotationProcessorFactory.exsd
index 2b26473..d2bca17 100644
--- a/org.eclipse.jdt.apt.core/schema/annotationProcessorFactory.exsd
+++ b/org.eclipse.jdt.apt.core/schema/annotationProcessorFactory.exsd
@@ -6,7 +6,7 @@
          <meta.schema plugin="org.eclipse.jdt.apt.core" id="annotationProcessorFactory" name="Annotation Processor Factories"/>
       </appInfo>
       <documentation>
-         [Enter description of this extension point.]
+         Plug-ins which contribute JSR-175 annotation processors should extend this extension point in order to participate in compilation.
       </documentation>
    </annotation>
 
@@ -61,18 +61,24 @@
 
    <element name="factory">
       <complexType>
-         <attribute name="class" type="string">
+         <attribute name="class" type="string" use="required">
             <annotation>
                <documentation>
-                  
+                  Qualified name of a class that implements com.sun.mirror.apt.AnnotationProcessorFactory and has a no-argument constructor.
                </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="com.sun.mirror.apt.AnnotationProcessorFactory"/>
+               </appInfo>
             </annotation>
          </attribute>
          <attribute name="implements" type="string">
             <annotation>
                <documentation>
-                  
+                  Reserved.  Do not use this attribute.
                </documentation>
+               <appInfo>
+                  <meta.attribute deprecated="true"/>
+               </appInfo>
             </annotation>
          </attribute>
       </complexType>
@@ -92,7 +98,19 @@
          <meta.section type="examples"/>
       </appInfo>
       <documentation>
-         [Enter extension point usage example here.]
+         Example of a declaration of an &lt;code&gt;annotationProcessorFactory&lt;/code&gt;:  &lt;pre&gt;                                                                       
+     &lt;extension
+         point=&quot;org.eclipse.jdt.apt.core.annotationProcessorFactory&quot;&gt;
+      &lt;factories enableDefault=&quot;true&quot;&gt;
+       &lt;factory
+          class=&quot;org.xyz.HelloWorldAnnotationProcessorFactory&quot;&gt;
+       &lt;/factory&gt;
+       &lt;factory
+          class=&quot;org.xyz.GoodNightMoonAnnotationProcessorFactory&quot;&gt;
+       &lt;/factory&gt;
+    &lt;/factories&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
       </documentation>
    </annotation>
 
@@ -119,7 +137,11 @@
          <meta.section type="copyright"/>
       </appInfo>
       <documentation>
-         
+         Copyright (c) 2005 BEA Systems, Inc and others.&lt;br&gt;
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Eclipse Public License v1.0
+which accompanies this distribution, and is available at 
+&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
       </documentation>
    </annotation>
 
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/build/JdtApt.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/build/JdtApt.java
index ef194ea..208fcdd 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/build/JdtApt.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/build/JdtApt.java
@@ -23,14 +23,14 @@
  *
  * Sample build.xml:
  * 
- * <project name="test_eclipse" default="build" basedir=".">
+ * &lt;project name="test_eclipse" default="build" basedir="."&gt;
  * 
- *    <taskdef name="apt" classname="org.eclipse.jdt.apt.core.build.JdtApt"/>
+ *    &lt;taskdef name="apt" classname="org.eclipse.jdt.apt.core.build.JdtApt"/&gt;
  *
- *    <target name="build">
- *        <apt workspace="C:\my_workspace" eclipseHome="C:\eclipse"/>
- *    </target>
- * </project>
+ *    &lt;target name="build"&gt;
+ *        &lt;apt workspace="C:\my_workspace" eclipseHome="C:\eclipse"/&gt;
+ *    &lt;/target&gt;
+ * &lt;/project&gt;
  */
 public class JdtApt extends Java {
 
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/AbstractCompilationEnv.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/AbstractCompilationEnv.java
index 5db7e8c..0dcc4b4 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/AbstractCompilationEnv.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/AbstractCompilationEnv.java
@@ -17,14 +17,8 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.regex.Pattern;
 
 import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
 import org.eclipse.jdt.apt.core.env.EclipseAnnotationProcessorEnvironment;
 import org.eclipse.jdt.apt.core.env.Phase;
 import org.eclipse.jdt.apt.core.internal.declaration.EclipseMirrorObject;
@@ -32,13 +26,11 @@
 import org.eclipse.jdt.apt.core.internal.env.MessagerImpl.Severity;
 import org.eclipse.jdt.apt.core.internal.util.Factory;
 import org.eclipse.jdt.apt.core.internal.util.Visitors.AnnotationVisitor;
-import org.eclipse.jdt.apt.core.util.AptConfig;
 import org.eclipse.jdt.apt.core.util.EclipseMessager;
 import org.eclipse.jdt.core.BindingKey;
 import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.compiler.CategorizedProblem;
 import org.eclipse.jdt.core.compiler.BuildContext;
+import org.eclipse.jdt.core.compiler.CategorizedProblem;
 import org.eclipse.jdt.core.compiler.ReconcileContext;
 import org.eclipse.jdt.core.dom.ASTRequestor;
 import org.eclipse.jdt.core.dom.Annotation;
@@ -54,21 +46,9 @@
 	extends BaseProcessorEnv 
 	implements EclipseAnnotationProcessorEnvironment{
 	
-	/** regex to identify substituted token in path variables */
-	private static final String PATHVAR_TOKEN = "^%[^%/\\\\ ]+%.*"; //$NON-NLS-1$
-	/** path variable meaning "workspace root" */
-	private static final String PATHVAR_ROOT = "%ROOT%"; //$NON-NLS-1$
-	/** path variable meaning "project root" */
-	private static final String PATHVAR_PROJECTROOT = "%PROJECT.DIR%"; //$NON-NLS-1$
-
 	private Set<AnnotationProcessorListener> _listeners = null;
 	
 	protected List<APTProblem> _problems = new ArrayList<APTProblem>();
-	/**
-	 * Processor options, including -A options.
-	 * Set in ctor and then not changed.
-	 */
-	private Map<String, String> _options;
 	private boolean _isClosed = false;
 	
 	EnvCallback _callback;
@@ -111,7 +91,6 @@
 			Phase phase)
 	{
 		super(compilationUnit, file, javaProj, phase);
-		initOptions(javaProj);
 	}
 	
 	@Override
@@ -143,94 +122,6 @@
 		return Collections.unmodifiableSet(_listeners);
 	}
 	
-	/**
-     * Set the _options map based on the current project/workspace settings.
-     * There is a bug in Sun's apt implementation: it parses the command line 
-     * incorrectly, such that -Akey=value gets added to the options map as 
-     * key "-Akey=value" and value "".  In order to support processors written 
-     * to run on Sun's apt as well as processors written without this bug
-     * in mind, we populate the map with two copies of every option, one the
-     * expected way ("key" / "value") and the other the Sun way 
-     * ("-Akey=value" / "").  We make exceptions for the non-dash-A options
-     * that we set automatically, such as -classpath, -target, and so forth;
-     * since these wouldn't have come from a -A option we don't construct a
-     * -Akey=value variant.
-     * 
-     * Called from constructor.  A new Env is constructed for each build pass,
-     * so this will always be up to date with the latest settings.
-	 */
-	private void initOptions(IJavaProject jproj) {
-		Map<String, String> procOptions = AptConfig.getProcessorOptions(jproj);
-		_options = new HashMap<String, String>(procOptions.size() * 2);
-		
-		// Add configured options
-		for (Map.Entry<String, String> entry : procOptions.entrySet()) {
-			String value = resolveVarPath(jproj, entry.getValue());
-			String key = entry.getKey();
-			_options.put(key, value);
-			if (!AptConfig.isAutomaticProcessorOption(key)) {
-				String sunStyle;
-				if (value != null) {
-					sunStyle = "-A" + entry.getKey() + "=" + value; //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				else {
-					sunStyle = "-A" + entry.getKey(); //$NON-NLS-1$
-				}
-				_options.put(sunStyle, ""); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * If the value starts with a path variable such as %ROOT%, replace it with
-	 * the absolute path.
-	 * @param value the value of a -Akey=value command option
-	 */
-	private String resolveVarPath(IJavaProject jproj, String value) {
-		if (value == null) {
-			return null;
-		}
-		// is there a token to substitute?
-		if (!Pattern.matches(PATHVAR_TOKEN, value)) {
-			return value;
-		}
-		IPath path = new Path(value);
-		String firstToken = path.segment(0);
-		// If it matches %ROOT%/project, it is a project-relative path.
-		if (PATHVAR_ROOT.equals(firstToken)) {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-			IResource proj = root.findMember(path.segment(1));
-			if (proj == null) {
-				return value;
-			}
-			// all is well; do the substitution
-			IPath relativePath = path.removeFirstSegments(2);
-			IPath absoluteProjPath = proj.getLocation();
-			IPath absoluteResPath = absoluteProjPath.append(relativePath);
-			return absoluteResPath.toOSString();
-		}
-		
-		// If it matches %PROJECT.DIR%/project, the path is relative to the current project.
-		if (jproj != null && PATHVAR_PROJECTROOT.equals(firstToken)) {
-			// all is well; do the substitution
-			IPath relativePath = path.removeFirstSegments(1);
-			IPath absoluteProjPath = jproj.getProject().getLocation();
-			IPath absoluteResPath = absoluteProjPath.append(relativePath);
-			return absoluteResPath.toOSString();
-		}
-		
-		// otherwise it's a classpath-var-based path.
-		String cpvName = firstToken.substring(1, firstToken.length() - 1);
-		IPath cpvPath = JavaCore.getClasspathVariable(cpvName);
-		if (cpvPath != null) {
-			IPath resolved = cpvPath.append(path.removeFirstSegments(1));
-			return resolved.toOSString();
-		}
-		else {
-			return value;
-		}
-	}
-	
 	public Map<String, String> getOptions()
     {
         final HashMap<String, String> options = new HashMap<String, String>(_options);
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/BaseProcessorEnv.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/BaseProcessorEnv.java
index 3764c4f..d458f63 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/BaseProcessorEnv.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/BaseProcessorEnv.java
@@ -31,6 +31,7 @@
 import org.eclipse.jdt.apt.core.internal.util.PackageUtil;
 import org.eclipse.jdt.apt.core.internal.util.TypesUtil;
 import org.eclipse.jdt.apt.core.internal.util.Visitors.AnnotatedNodeVisitor;
+import org.eclipse.jdt.apt.core.util.AptConfig;
 import org.eclipse.jdt.core.BindingKey;
 import org.eclipse.jdt.core.IClassFile;
 import org.eclipse.jdt.core.ICompilationUnit;
@@ -101,6 +102,12 @@
 	protected final AptProject _aptProject;
 	
 	/**
+	 * Unmodifiable map of processor options, including -A options.
+	 * Set in ctor and then not changed.
+	 */
+	protected final Map<String, String> _options;
+
+	/**
      * Mapping model compilation unit to dom compilation unit.
      * The assumption here is that once the client examine some binding from some file, 
      * it will continue to examine other bindings from came from that same file.
@@ -131,12 +138,52 @@
 		_file = file;
 		_javaProject = javaProj;
 		_phase = phase;
-		
+		_options = initOptions(javaProj);
 		_modelCompUnit2astCompUnit = new HashMap<ICompilationUnit, CompilationUnit>();
 		_typeBinding2ModelCompUnit = new HashMap<ITypeBinding, ICompilationUnit>();
 		_aptProject = AptPlugin.getAptProject(javaProj);
 	}
   
+	/**
+     * Set the _options map based on the current project/workspace settings.
+     * There is a bug in Sun's apt implementation: it parses the command line 
+     * incorrectly, such that -Akey=value gets added to the options map as 
+     * key "-Akey=value" and value "".  In order to support processors written 
+     * to run on Sun's apt as well as processors written without this bug
+     * in mind, we populate the map with two copies of every option, one the
+     * expected way ("key" / "value") and the other the Sun way 
+     * ("-Akey=value" / "").  We make exceptions for the non-dash-A options
+     * that we set automatically, such as -classpath, -target, and so forth;
+     * since these wouldn't have come from a -A option we don't construct a
+     * -Akey=value variant.
+     * 
+     * Called from constructor.  A new Env is constructed for each build pass,
+     * so this will always be up to date with the latest settings.
+	 */
+	private Map<String, String> initOptions(IJavaProject jproj) {
+		Map<String, String> procOptions = AptConfig.getProcessorOptions(jproj);
+		// options is large enough to include the translated -A options
+		Map<String, String> options = new HashMap<String, String>(procOptions.size() * 2);
+		
+		// Add configured options
+		for (Map.Entry<String, String> entry : procOptions.entrySet()) {
+			String value = entry.getValue();
+			String key = entry.getKey();
+			options.put(key, value);
+			if (!AptConfig.isAutomaticProcessorOption(key)) {
+				String sunStyle;
+				if (value != null) {
+					sunStyle = "-A" + entry.getKey() + "=" + value; //$NON-NLS-1$ //$NON-NLS-2$
+				}
+				else {
+					sunStyle = "-A" + entry.getKey(); //$NON-NLS-1$
+				}
+				options.put(sunStyle, ""); //$NON-NLS-1$
+			}
+		}
+		return Collections.unmodifiableMap(options);
+	}
+
 	public Types getTypeUtils()
     {
 		return new TypesUtil(this);
@@ -341,7 +388,7 @@
 		return astUnit.findDeclaringNode(binding.getKey());
     }
     
-    public Map<String, String> getOptions(){ return Collections.emptyMap(); }
+    public Map<String, String> getOptions(){ return _options; }
     
     // does not generate dependencies
     public TypeDeclaration getTypeDeclaration(String name)
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/FactoryPathUtil.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/FactoryPathUtil.java
index 78f1d71..ad49ba3 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/FactoryPathUtil.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/FactoryPathUtil.java
@@ -579,7 +579,7 @@
 							pfc.addFactoryName(factoryName);
 						}
 					} catch(CoreException e) {
-							e.printStackTrace();
+						AptPlugin.log(e, "Unable to load annotation factory from plug-in"); //$NON-NLS-1$
 					}
 				}
 			}
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/util/AptConfig.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/util/AptConfig.java
index ca8fe4a..c2a911e 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/util/AptConfig.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/util/AptConfig.java
@@ -19,15 +19,18 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.Map.Entry;
+import java.util.regex.Pattern;
 
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.preferences.DefaultScope;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
@@ -58,6 +61,13 @@
  */
 public class AptConfig {
 	
+	/** regex to identify substituted token in path variables */
+	private static final String PATHVAR_TOKEN = "^%[^%/\\\\ ]+%.*"; //$NON-NLS-1$
+	/** path variable meaning "workspace root" */
+	private static final String PATHVAR_ROOT = "%ROOT%"; //$NON-NLS-1$
+	/** path variable meaning "project root" */
+	private static final String PATHVAR_PROJECTROOT = "%PROJECT.DIR%"; //$NON-NLS-1$
+
 	/*
 	 * Hide constructor; this is a static object
 	 */
@@ -112,8 +122,18 @@
     
 	/**
      * Get the options that are presented to annotation processors by the
-     * AnnotationProcessorEnvironment.  The -A and = are stripped out, so 
-     * (key, value) is the equivalent of -Akey=value.
+     * AnnotationProcessorEnvironment.  Options are key/value pairs which
+     * are set in the project properties.
+     * 
+     * Option values can begin with a percent-delimited token representing
+     * a classpath variable or one of several predefined values.  The token
+     * must either be followed by a path delimiter, or be the entire value.
+     * Such tokens will be replaced with their resolved value.  The predefined
+     * values are <code>%ROOT%</code>, which is replaced by the absolute pathname
+     * of the workspace root directory, and <code>%PROJECT.DIR%</code>, which
+     * will be replaced by the absolute pathname of the project root directory.
+     * For example, a value of <code>%ECLIPSE_HOME%/configuration/config.ini</code>
+     * might be resolved to <code>d:/eclipse/configuration/config.ini</code>. 
      * 
      * This method returns some options which are set programmatically but 
      * are not directly editable, are not displayed in the configuration GUI, 
@@ -121,21 +141,42 @@
      * emulate the behavior of Sun's apt command-line tool, which passes
      * most of its command line options to the processor environment.  The
      * programmatically set options are:
-     *  -classpath [set to Java build path]
-     *  -sourcepath [set to Java source path]
-     *  -s [set to generated src dir]
-     *  -d [set to binary output dir]
-     *  -target [set to compiler target version]
-     *  -source [set to compiler source version]
+     *  <code>-classpath</code> [set to Java build path]
+     *  <code>-sourcepath</code> [set to Java source path]
+     *  <code>-s</code> [set to generated src dir]
+     *  <code>-d</code> [set to binary output dir]
+     *  <code>-target</code> [set to compiler target version]
+     *  <code>-source</code> [set to compiler source version]
+     *  
+     * There are some slight differences between the options returned by this
+     * method and the options returned from this implementation of @see 
+     * AnnotationProcessorEnvironment#getOptions().  First, that method returns 
+     * additional options which are only meaningful during a build, such as 
+     * <code>phase</code>.  Second, that method also adds alternate encodings
+     * of each option, to be compatible with a bug in Sun's apt implementation:
+     * specifically, for each option key="k", value="v", an additional option
+     * is created with key="-Ak=v", value=null.  This includes the user-created
+     * options, but does not include the programmatically defined options listed
+     * above.
      * 
      * @param jproj a project, or null to query the workspace-wide setting.
      * @return a mutable, possibly empty, map of (key, value) pairs.  
-     * The value part of a pair may be null (equivalent to "-Akey").
-     * The value part can contain spaces, if it is quoted: -Afoo="bar baz".
+     * The value part of a pair may be null (equivalent to "-Akey" on the Sun apt
+     * command line).
+     * The value part may contain spaces.
      */
     public static Map<String, String> getProcessorOptions(IJavaProject jproj) {
-    	Map<String,String> options;
-    	options = getRawProcessorOptions(jproj);
+    	Map<String,String> rawOptions = getRawProcessorOptions(jproj);
+    	// map is large enough to also include the programmatically generated options
+    	Map<String, String> options = new HashMap<String, String>(rawOptions.size() + 6);
+    	
+    	// Resolve path metavariables like %ROOT%
+    	for (Map.Entry<String, String> entry : rawOptions.entrySet()) {
+    		String resolvedValue = resolveVarPath(jproj, entry.getValue());
+    		String value = (resolvedValue == null) ? entry.getValue() : resolvedValue;
+    		options.put(entry.getKey(), value);
+    	}
+    	
     	if (jproj == null) {
     		// there are no programmatically set options at the workspace level
     		return options;
@@ -233,7 +274,57 @@
     	return options;
     }
     
-    // We need this as a separate method, as we'll put dependent projects' output
+	/**
+	 * If the value starts with a path variable such as %ROOT%, replace it with
+	 * the absolute path.
+	 * @param value the value of a -Akey=value command option
+	 */
+	private static String resolveVarPath(IJavaProject jproj, String value) {
+		if (value == null) {
+			return null;
+		}
+		// is there a token to substitute?
+		if (!Pattern.matches(PATHVAR_TOKEN, value)) {
+			return value;
+		}
+		IPath path = new Path(value);
+		String firstToken = path.segment(0);
+		// If it matches %ROOT%/project, it is a project-relative path.
+		if (PATHVAR_ROOT.equals(firstToken)) {
+			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+			IResource proj = root.findMember(path.segment(1));
+			if (proj == null) {
+				return value;
+			}
+			// all is well; do the substitution
+			IPath relativePath = path.removeFirstSegments(2);
+			IPath absoluteProjPath = proj.getLocation();
+			IPath absoluteResPath = absoluteProjPath.append(relativePath);
+			return absoluteResPath.toOSString();
+		}
+		
+		// If it matches %PROJECT.DIR%/project, the path is relative to the current project.
+		if (jproj != null && PATHVAR_PROJECTROOT.equals(firstToken)) {
+			// all is well; do the substitution
+			IPath relativePath = path.removeFirstSegments(1);
+			IPath absoluteProjPath = jproj.getProject().getLocation();
+			IPath absoluteResPath = absoluteProjPath.append(relativePath);
+			return absoluteResPath.toOSString();
+		}
+		
+		// otherwise it's a classpath-var-based path.
+		String cpvName = firstToken.substring(1, firstToken.length() - 1);
+		IPath cpvPath = JavaCore.getClasspathVariable(cpvName);
+		if (cpvPath != null) {
+			IPath resolved = cpvPath.append(path.removeFirstSegments(1));
+			return resolved.toOSString();
+		}
+		else {
+			return value;
+		}
+	}
+	
+	// We need this as a separate method, as we'll put dependent projects' output
     // on the classpath
     private static void addProjectClasspath(
     		IWorkspaceRoot root,
diff --git a/org.eclipse.jdt.apt.tests/META-INF/MANIFEST.MF b/org.eclipse.jdt.apt.tests/META-INF/MANIFEST.MF
index 4ded349..c57e8e9 100644
--- a/org.eclipse.jdt.apt.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.apt.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.apt.tests; singleton:=true
-Bundle-Version: 3.2.0.qualifier
+Bundle-Version: 3.2.1.qualifier
 Bundle-ClassPath: apt.jar,
  aptext.jar
 Bundle-Activator: org.eclipse.jdt.apt.tests.plugin.AptTestsPlugin
@@ -11,8 +11,10 @@
  org.eclipse.jdt.apt.tests.annotations,
  org.eclipse.jdt.apt.tests.annotations.apitest,
  org.eclipse.jdt.apt.tests.annotations.aptrounding,
+ org.eclipse.jdt.apt.tests.annotations.exceptionhandling,
  org.eclipse.jdt.apt.tests.annotations.extradependency,
  org.eclipse.jdt.apt.tests.annotations.filegen,
+ org.eclipse.jdt.apt.tests.annotations.generic,
  org.eclipse.jdt.apt.tests.annotations.helloworld,
  org.eclipse.jdt.apt.tests.annotations.messager,
  org.eclipse.jdt.apt.tests.annotations.mirrortest,
@@ -28,12 +30,10 @@
  org.eclipse.jdt.apt.tests.plugin
 Require-Bundle: org.junit,
  org.eclipse.jdt.apt.core,
- org.eclipse.jdt.apt.ui,
  org.eclipse.jdt.core,
  org.eclipse.jdt.core.tests.builder,
  org.eclipse.jdt.core.tests.compiler,
  org.eclipse.jdt.core.tests.model,
- org.eclipse.jdt.core.tests.performance,
  org.eclipse.core.resources,
  org.eclipse.core.runtime,
  org.eclipse.test.performance
diff --git a/org.eclipse.jdt.apt.ui/META-INF/MANIFEST.MF b/org.eclipse.jdt.apt.ui/META-INF/MANIFEST.MF
index e2a8a54..64cc4f1 100644
--- a/org.eclipse.jdt.apt.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.apt.ui/META-INF/MANIFEST.MF
@@ -2,17 +2,19 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.apt.ui; singleton:=true
-Bundle-Version: 3.2.0.qualifier
+Bundle-Version: 3.2.1.qualifier
 Bundle-Activator: org.eclipse.jdt.apt.ui.internal.AptUIPlugin
 Bundle-Localization: plugin
-Require-Bundle:  org.eclipse.jdt.apt.core;bundle-version="[3.2.0,4.0.0)",
+Require-Bundle: org.eclipse.jdt.apt.core;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.help;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.ui.forms;bundle-version="[3.2.0,4.0.0)"
 Eclipse-LazyStart: true
 Bundle-Vendor: Eclipse.org
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.jdt.apt.ui.internal;x-internal:=true,
+ org.eclipse.jdt.apt.ui.internal.preferences;x-internal:=true,
+ org.eclipse.jdt.apt.ui.internal.util;x-internal:=true