update to 3.8M2 using v_C10.
diff --git a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
index 058af29..ec64bbe 100644
--- a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
+++ b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
@@ -1,7 +1,7 @@
 #Format: compiler.name = word1 word2 word3
 compiler.name = Eclipse Compiler for Java(TM)
 #Format: compiler.version = 0.XXX[, other words (don't forget the comma if adding other words)]
-compiler.version = 0.C07, 3.8.0 M2
+compiler.version = 0.C10, 3.8.0 M2
 compiler.copyright = Copyright IBM Corp 2000, 2011. All rights reserved.
 
 ###{ObjectTeams:
diff --git a/org.eclipse.jdt.core/buildnotes_jdt-core.html b/org.eclipse.jdt.core/buildnotes_jdt-core.html
index 49a8e63..f1baf89 100644
--- a/org.eclipse.jdt.core/buildnotes_jdt-core.html
+++ b/org.eclipse.jdt.core/buildnotes_jdt-core.html
@@ -42,11 +42,64 @@
 	</td>
   </tr>
 </table>
+<a name="v_C10"></a>
+<hr><h1>
+Eclipse Platform Build Notes<br>
+Java development tools core</h1>
+Eclipse SDK 3.8.0 - September 13, 2011 - 3.8.0 M2
+<br>Project org.eclipse.jdt.core v_C10
+(<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jdt.core/?only_with_tag=v_C10">cvs</a>).
+<h2>What's new in this drop</h2>
+
+<h3>Problem Reports Fixed</h3>
+<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=357259">357259</a>
+[dom] AST#newArrayType(Type, int) should allow array type as argument
+
+<a name="v_C09"></a>
+<hr><h1>
+Eclipse Platform Build Notes<br>
+Java development tools core</h1>
+Eclipse SDK 3.8.0 - September 9, 2011
+<br>Project org.eclipse.jdt.core v_C09
+(<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jdt.core/?only_with_tag=v_C09">cvs</a>).
+<h2>What's new in this drop</h2>
+
+<h3>Problem Reports Fixed</h3>
+<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=354332">354332</a>
+DeltaProcessor exhibits O(N&and;2) behavior
+<br><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=355605">355605</a>
+NPE in HierarchyResolver
+<br><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=347396">347396</a>
+ASTParser returns empty or partial AST if we parse the the body contains empty for loop
+<br><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=356746">356746</a>
+ECJ accepts illegal unicode escape sequences
+<br><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=337935">337935</a>
+Test failures when run as an IDE (org.eclipse.sdk.ide)
+
+<a name="v_C08"></a>
+<hr><h1>
+Eclipse Platform Build Notes<br>
+Java development tools core</h1>
+Eclipse SDK 3.8.0 - September 6, 2011
+<br>Project org.eclipse.jdt.core v_C08
+(<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jdt.core/?only_with_tag=v_C08">cvs</a>).
+<h2>What's new in this drop</h2>
+
+<h3>Problem Reports Fixed</h3>
+<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=356325">356325</a>
+[select] Open declaration on a constructor of a local class with type parameters doesn't work
+<br><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=24804">24804</a>
+Organize imports wipes comments between statements [code manipulation]
+<br><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=356363">356363</a>
+Many links to java.sun.com are broken
+<br><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=346529">346529</a>
+Don't show &quot;The method * from the type * is never used locally&quot; warning for private methods annotated with standard annotations like @PostConstruct
+
 <a name="v_C07"></a>
 <hr><h1>
 Eclipse Platform Build Notes<br>
 Java development tools core</h1>
-Eclipse SDK 3.8.0 - August 30, 2011 - 3.8.0 M2
+Eclipse SDK 3.8.0 - August 30, 2011
 <br>Project org.eclipse.jdt.core v_C07
 (<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jdt.core/?only_with_tag=v_C07">cvs</a>).
 <h2>What's new in this drop</h2>
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java
index bd74371..3e2cdd3 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java
@@ -556,13 +556,13 @@
 							}
 						}
 
-						if ((c1 = ScannerHelper.getNumericValue(source[pos++])) > 15
+						if ((c1 = ScannerHelper.getHexadecimalValue(source[pos++])) > 15
 							|| c1 < 0
-							|| (c2 = ScannerHelper.getNumericValue(source[pos++])) > 15
+							|| (c2 = ScannerHelper.getHexadecimalValue(source[pos++])) > 15
 							|| c2 < 0
-							|| (c3 = ScannerHelper.getNumericValue(source[pos++])) > 15
+							|| (c3 = ScannerHelper.getHexadecimalValue(source[pos++])) > 15
 							|| c3 < 0
-							|| (c4 = ScannerHelper.getNumericValue(source[pos++])) > 15
+							|| (c4 = ScannerHelper.getHexadecimalValue(source[pos++])) > 15
 							|| c4 < 0) {
 							return false;
 						} else {
@@ -1984,9 +1984,7 @@
 	
 	/**
 	 * Implements the "Algorithm for Inheriting Method Comments" as specified for
-	 * <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/solaris/javadoc.html#inheritingcomments">1.4.2</a>,
-	 * <a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javadoc.html#inheritingcomments">1.5</a>, and
-	 * <a href="http://java.sun.com/javase/6/docs/technotes/tools/windows/javadoc.html#inheritingcomments">1.6</a>.
+	 * <a href="http://download.oracle.com/javase/6/docs/technotes/tools/windows/javadoc.html#inheritingcomments">1.6</a>.
 	 *
 	 * <p>
 	 * Unfortunately, the implementation is broken in Javadoc implementations since 1.5, see
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.java
index c4d1f9a..88a632d 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.java
@@ -589,13 +589,13 @@
 									while (this.source[this.currentPosition] == 'u') {
 										this.currentPosition++;
 									}
-									if ((c1 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+									if ((c1 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
 										|| c1 < 0
-										|| (c2 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+										|| (c2 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
 										|| c2 < 0
-										|| (c3 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+										|| (c3 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
 										|| c3 < 0
-										|| (c4 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+										|| (c4 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
 										|| c4 < 0) {
 										throw new InvalidInputException(INVALID_UNICODE_ESCAPE);
 									} else {
@@ -622,13 +622,13 @@
 										while (this.source[this.currentPosition] == 'u') {
 											this.currentPosition++;
 										}
-										if ((c1 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+										if ((c1 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
 											|| c1 < 0
-											|| (c2 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+											|| (c2 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
 											|| c2 < 0
-											|| (c3 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+											|| (c3 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
 											|| c3 < 0
-											|| (c4 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+											|| (c4 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
 											|| c4 < 0) {
 											throw new InvalidInputException(INVALID_UNICODE_ESCAPE);
 										} else {
@@ -660,13 +660,13 @@
 										}
 										//-------------unicode traitement ------------
 										int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
-										if ((c1 = ScannerHelper.getNumericValue(this.source[index++])) > 15
+										if ((c1 = ScannerHelper.getHexadecimalValue(this.source[index++])) > 15
 											|| c1 < 0
-											|| (c2 = ScannerHelper.getNumericValue(this.source[index++])) > 15
+											|| (c2 = ScannerHelper.getHexadecimalValue(this.source[index++])) > 15
 											|| c2 < 0
-											|| (c3 = ScannerHelper.getNumericValue(this.source[index++])) > 15
+											|| (c3 = ScannerHelper.getHexadecimalValue(this.source[index++])) > 15
 											|| c3 < 0
-											|| (c4 = ScannerHelper.getNumericValue(this.source[index++])) > 15
+											|| (c4 = ScannerHelper.getHexadecimalValue(this.source[index++])) > 15
 											|| c4 < 0) {
 											this.currentPosition = index;
 											throw new InvalidInputException(INVALID_UNICODE_ESCAPE);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Annotation.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Annotation.java
index 4d9b543..669eccb 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Annotation.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Annotation.java
@@ -179,6 +179,12 @@
 				tagBits |= TagBits.AnnotationInstantiation;
 				break;
 // SH}
+			case TypeIds.T_JavaxAnnotationPostConstruct :
+				tagBits |= TagBits.AnnotationPostConstruct;
+				break;
+			case TypeIds.T_JavaxAnnotationPreDestroy :
+				tagBits |= TagBits.AnnotationPreDestroy;
+				break;
 		}
 		return tagBits;
 	}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java
index fe316fa..5b171fc 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java
@@ -135,8 +135,8 @@
 	 * Switch on String code generation
 	 * This assumes that hashCode() specification for java.lang.String is API
 	 * and is stable.
-	 * @see "http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html"
-	 * @see "http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/lang/String.html"
+	 *
+	 * @see "http://download.oracle.com/javase/6/docs/api/java/lang/String.html"
 	 *
 	 * @param currentScope org.eclipse.jdt.internal.compiler.lookup.BlockScope
 	 * @param codeStream org.eclipse.jdt.internal.compiler.codegen.CodeStream
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.java
index d81ec1c..3357d7d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.java
@@ -303,6 +303,10 @@
 					currentOffset += 2;
 					return readTargetValue(currentOffset);
 				}
+				if (CharOperation.equals(typeName, ConstantPool.JAVAX_ANNOTATION_PREDESTROY)) {
+					this.standardAnnotationTagBits |= TagBits.AnnotationPreDestroy;
+					return currentOffset;
+				}
 				break;
 			case 32:
 				if (CharOperation.equals(typeName, ConstantPool.JAVA_LANG_ANNOTATION_RETENTION)) {
@@ -313,6 +317,10 @@
 					this.standardAnnotationTagBits |= TagBits.AnnotationInherited;
 					return currentOffset;
 				}
+				if (CharOperation.equals(typeName, ConstantPool.JAVAX_ANNOTATION_POSTCONSTRUCT)) {
+					this.standardAnnotationTagBits |= TagBits.AnnotationPostConstruct;
+					return currentOffset;
+				}
 				break;
 			case 33:
 				if (CharOperation.equals(typeName, ConstantPool.JAVA_LANG_ANNOTATION_DOCUMENTED)) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java
index aca35f6..c875c9b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java
@@ -248,6 +248,8 @@
 	public static final char[] JAVA_LANG_SAFEVARARGS = "Ljava/lang/SafeVarargs;".toCharArray(); //$NON-NLS-1$
 	// java 7 java.lang.invoke.MethodHandle.invokeExact(..)/invokeGeneric(..)
 	public static final char[] JAVA_LANG_INVOKE_METHODHANDLE_POLYMORPHICSIGNATURE = "Ljava/lang/invoke/MethodHandle$PolymorphicSignature;".toCharArray(); //$NON-NLS-1$
+	public static final char[] JAVAX_ANNOTATION_POSTCONSTRUCT = "Ljavax/annotation/PostConstruct;".toCharArray(); //$NON-NLS-1$
+	public static final char[] JAVAX_ANNOTATION_PREDESTROY = "Ljavax/annotation/PreDestroy;".toCharArray(); //$NON-NLS-1$
 
 	public static final char[] HashCode = "hashCode".toCharArray(); //$NON-NLS-1$
 	public static final char[] HashCodeSignature = "()I".toCharArray(); //$NON-NLS-1$; 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java
index 6fe4141..c88c4a1 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java
@@ -32,6 +32,9 @@
 public static AnnotationBinding[] addStandardAnnotations(AnnotationBinding[] recordedAnnotations, long annotationTagBits, LookupEnvironment env) {
 	// NOTE: expect annotations to be requested just once so there is no need to store the standard annotations
 	// and all of the standard annotations created by this method are fully resolved since the sender is expected to use them immediately
+	if ((annotationTagBits & TagBits.AllStandardAnnotationsMask) == 0) {
+		return recordedAnnotations;
+	}
 	int count = 0;
 	if ((annotationTagBits & TagBits.AnnotationTargetMASK) != 0)
 		count++;
@@ -51,8 +54,11 @@
 		count++;
 	if ((annotationTagBits & TagBits.AnnotationSafeVarargs) != 0)
 		count++;
-	if (count == 0)
-		return recordedAnnotations;
+	if ((annotationTagBits & TagBits.AnnotationPostConstruct) != 0)
+		count++;
+	if ((annotationTagBits & TagBits.AnnotationPreDestroy) != 0)
+		count++;
+	// count must be different from 0
 
 	int index = recordedAnnotations.length;
 	AnnotationBinding[] result = new AnnotationBinding[index + count];
@@ -75,6 +81,10 @@
 		result[index++] = buildMarkerAnnotationForMemberType(TypeConstants.JAVA_LANG_INVOKE_METHODHANDLE_$_POLYMORPHICSIGNATURE, env);
 	if ((annotationTagBits & TagBits.AnnotationSafeVarargs) != 0)
 		result[index++] = buildMarkerAnnotation(TypeConstants.JAVA_LANG_SAFEVARARGS, env);
+	if ((annotationTagBits & TagBits.AnnotationPostConstruct) != 0)
+		result[index++] = buildMarkerAnnotation(TypeConstants.JAVAX_ANNOTATION_POSTCONSTRUCT, env);
+	if ((annotationTagBits & TagBits.AnnotationPreDestroy) != 0)
+		result[index++] = buildMarkerAnnotation(TypeConstants.JAVAX_ANNOTATION_PREDESTROY, env);
 	return result;
 }
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
index 053735d..c2d4e4f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
@@ -296,7 +296,7 @@
 		// attempt to find the enclosing type if it exists in the cache (otherwise - resolve it when requested)
 		this.enclosingType = environment.getTypeFromConstantPoolName(enclosingTypeName, 0, -1, true, null /* could not be missing */); // pretend parameterized to avoid raw
 		this.tagBits |= TagBits.MemberTypeMask;   // must be a member type not a top-level or local type
-		this.tagBits |= 	TagBits.HasUnresolvedEnclosingType;
+		this.tagBits |= TagBits.HasUnresolvedEnclosingType;
 		if (enclosingType().isStrictfp())
 			this.modifiers |= ClassFileConstants.AccStrictfp;
 		if (enclosingType().isDeprecated())
@@ -443,10 +443,11 @@
 			int size = memberTypeStructures.length;
 			if (size > 0) {
 				this.memberTypes = new ReferenceBinding[size];
-				for (int i = 0; i < size; i++)
+				for (int i = 0; i < size; i++) {
 					// attempt to find each member type if it exists in the cache (otherwise - resolve it when requested)
 					this.memberTypes[i] = this.environment.getTypeFromConstantPoolName(memberTypeStructures[i].getName(), 0, -1, false, null /* could not be missing */);
-				this.tagBits |= 	TagBits.HasUnresolvedMemberTypes;
+				}
+				this.tagBits |= TagBits.HasUnresolvedMemberTypes;
 			}
 		}
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
index 1698cc3..a427a23 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
@@ -543,14 +543,28 @@
 				return;
 			}
 // SH}
-			if (!CharOperation.equals(TypeConstants.JAVA, this.compoundName[0]))
+			if (!CharOperation.equals(TypeConstants.JAVA, this.compoundName[0])
+					&& !CharOperation.equals(TypeConstants.JAVAX, this.compoundName[0]))
 				return;
-
+			
 			char[] packageName = this.compoundName[1];
 			if (packageName.length == 0) return; // just to be safe
 			char[] typeName = this.compoundName[2];
 			if (typeName.length == 0) return; // just to be safe
 			// remaining types MUST be in java.*.*
+			if (CharOperation.equals(TypeConstants.JAVAX, this.compoundName[0])) {
+				if (CharOperation.equals(TypeConstants.ANNOTATION, this.compoundName[1])) {
+					switch (typeName[0]) {
+						case 'P' :
+							if (CharOperation.equals(typeName, TypeConstants.JAVAX_ANNOTATION_POSTCONSTRUCT[2]))
+								this.id = TypeIds.T_JavaxAnnotationPostConstruct;
+							if (CharOperation.equals(typeName, TypeConstants.JAVAX_ANNOTATION_PREDESTROY[2]))
+								this.id = TypeIds.T_JavaxAnnotationPreDestroy;
+							return;
+					}
+				}
+				return;
+			}
 			if (!CharOperation.equals(TypeConstants.LANG, this.compoundName[1])) {
 				switch (packageName[0]) {
 					case 'i' :
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TagBits.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TagBits.java
index ad67306..2654ff6 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TagBits.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TagBits.java
@@ -133,12 +133,17 @@
 	long AnnotationSafeVarargs = ASTNode.Bit52L;
 	/** @since 3.7 - java 7 MethodHandle.invokeExact(..)/invokeGeneric(..)*/
 	long AnnotationPolymorphicSignature = ASTNode.Bit53L;
+	/** @since 3.8 */
+	long AnnotationPreDestroy = ASTNode.Bit54L;
+	/** @since 3.8 */
+	long AnnotationPostConstruct = ASTNode.Bit55L;
 
 //{ObjectTeams: one more standard annotation:
 	long AnnotationInstantiation = ASTNode.Bit21;
 // SH}
 
-	long AllStandardAnnotationsMask = AnnotationTargetMASK
+	long AllStandardAnnotationsMask =
+				  AnnotationTargetMASK
 				| AnnotationRetentionMASK
 				| AnnotationDeprecated
 				| AnnotationDocumented
@@ -149,17 +154,18 @@
 				| AnnotationInstantiation
 // SH}
 				| AnnotationSafeVarargs
-				| AnnotationPolymorphicSignature;
+				| AnnotationPolymorphicSignature
+				| AnnotationPostConstruct
+				| AnnotationPreDestroy;
 
-	long DefaultValueResolved = ASTNode.Bit54L;
+	long DefaultValueResolved = ASTNode.Bit56L;
 
 	// set when type contains non-private constructor(s)
-	long HasNonPrivateConstructor = ASTNode.Bit55L;
+	long HasNonPrivateConstructor = ASTNode.Bit57L;
 
 //{ObjectTeams:
 	// is parameterized type instantiated via tsuper-link?
-	long IsViewedAsTSuper = ASTNode.Bit57L;					// for role type bindings
-	long IsCopyOfParameterized = ASTNode.Bit57L;			// for method bindings
+	long IsViewedAsTSuper = ASTNode.Bit56L;					// for role type bindings
 	
     // is it a wrapped role type?
     long IsWrappedRole = ASTNode.Bit58L;					// for role type bindings
@@ -170,6 +176,7 @@
     
     // is it a dependent type?
     long IsDependentType = ASTNode.Bit59L;					// for type bindings
+    long IsCopyOfParameterized = ASTNode.Bit59L;			// for method bindings
 
     // had the baseclass field/playedBy problems?
     long BaseclassHasProblems = ASTNode.Bit60L;				// for type bindings (role)
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java
index e75db5c..9a62cc0 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java
@@ -14,6 +14,7 @@
 public interface TypeConstants {
 
 	char[] JAVA = "java".toCharArray(); //$NON-NLS-1$
+	char[] JAVAX = "javax".toCharArray(); //$NON-NLS-1$
 	char[] LANG = "lang".toCharArray(); //$NON-NLS-1$
 	char[] IO = "io".toCharArray(); //$NON-NLS-1$
 	char[] UTIL = "util".toCharArray(); //$NON-NLS-1$
@@ -129,7 +130,7 @@
 	char[][] JAVA_IO_OBJECTINPUTSTREAM = new char[][] { JAVA, IO, "ObjectInputStream".toCharArray()}; //$NON-NLS-1$
 	// javax.rmi.CORBA.Stub
 	char[][] JAVAX_RMI_CORBA_STUB = new char[][] {
-			"javax".toCharArray(), //$NON-NLS-1$
+			JAVAX,
 			"rmi".toCharArray(), //$NON-NLS-1$
 			"CORBA".toCharArray(), //$NON-NLS-1$
 			"Stub".toCharArray(), //$NON-NLS-1$
@@ -173,6 +174,18 @@
 	char[] SYNTHETIC_ACCESS_METHOD_PREFIX =  "access$".toCharArray(); //$NON-NLS-1$
 	char[] SYNTHETIC_ENUM_CONSTANT_INITIALIZATION_METHOD_PREFIX =  " enum constant initialization$".toCharArray(); //$NON-NLS-1$
 	char[] SYNTHETIC_STATIC_FACTORY =  "<factory>".toCharArray(); //$NON-NLS-1$
+	char[][] JAVAX_ANNOTATION_POSTCONSTRUCT =
+			new char[][] {
+				JAVAX,
+				ANNOTATION,
+				"PostConstruct".toCharArray() //$NON-NLS-1$
+			};
+	char[][] JAVAX_ANNOTATION_PREDESTROY =
+			new char[][] {
+				JAVAX,
+				ANNOTATION,
+				"PreDestroy".toCharArray() //$NON-NLS-1$
+			};
 
 	// synthetic package-info name
 	public static final char[] PACKAGE_INFO_NAME = "package-info".toCharArray(); //$NON-NLS-1$
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeIds.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeIds.java
index 6bb684a..8e3a647 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeIds.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeIds.java
@@ -97,6 +97,11 @@
 	// java 7 java.lang.AutoCloseable
 	final int T_JavaLangAutoCloseable = 62;
 
+	// new in 3.8
+	final int T_JavaxAnnotationPostConstruct = 63;
+
+	final int T_JavaxAnnotationPreDestroy = 64;
+
 	final int NoId = Integer.MAX_VALUE;
 
 	public static final int IMPLICIT_CONVERSION_MASK = 0xFF;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
index b64591e..8eae081 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
@@ -1358,9 +1358,10 @@
 			idx++;
 			while (this.source[idx] == 'u')
 				idx++;
-			if (!(((c1 = ScannerHelper.getNumericValue(this.source[idx++])) > 15 || c1 < 0)
-					|| ((c2 = ScannerHelper.getNumericValue(this.source[idx++])) > 15 || c2 < 0)
-					|| ((c3 = ScannerHelper.getNumericValue(this.source[idx++])) > 15 || c3 < 0) || ((c4 = ScannerHelper.getNumericValue(this.source[idx++])) > 15 || c4 < 0))) {
+			if (!(((c1 = ScannerHelper.getHexadecimalValue(this.source[idx++])) > 15 || c1 < 0)
+					|| ((c2 = ScannerHelper.getHexadecimalValue(this.source[idx++])) > 15 || c2 < 0)
+					|| ((c3 = ScannerHelper.getHexadecimalValue(this.source[idx++])) > 15 || c3 < 0)
+					|| ((c4 = ScannerHelper.getHexadecimalValue(this.source[idx++])) > 15 || c4 < 0))) {
 				c = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
 			}
 		}
@@ -1477,9 +1478,10 @@
 			this.index++;
 			while (this.source[this.index] == 'u')
 				this.index++;
-			if (!(((c1 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c1 < 0)
-					|| ((c2 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c2 < 0)
-					|| ((c3 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c3 < 0) || ((c4 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c4 < 0))) {
+			if (!(((c1 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c1 < 0)
+					|| ((c2 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c2 < 0)
+					|| ((c3 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c3 < 0)
+					|| ((c4 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c4 < 0))) {
 				c = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
 			} else {
 				// TODO (frederic) currently reset to previous position, perhaps signal a syntax error would be more appropriate
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java
index 7fd1f08..639cd9a 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java
@@ -386,9 +386,10 @@
 			this.index++;
 			while (this.source[this.index] == 'u')
 				this.index++;
-			if (!(((c1 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c1 < 0)
-					|| ((c2 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c2 < 0)
-					|| ((c3 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c3 < 0) || ((c4 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c4 < 0))) {
+			if (!(((c1 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c1 < 0)
+					|| ((c2 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c2 < 0)
+					|| ((c3 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c3 < 0)
+					|| ((c4 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c4 < 0))) {
 				first = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
 			} else {
 				this.index = pos;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
index 271692d..62e2908 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
@@ -3879,13 +3879,13 @@
 				pos--;
 			}
 			if (source[pos] == '\\' &&
-					!((c1 = ScannerHelper.getNumericValue(source[this.endStatementPosition - 3])) > 15
+					!((c1 = ScannerHelper.getHexadecimalValue(source[this.endStatementPosition - 3])) > 15
 						|| c1 < 0
-						|| (c2 = ScannerHelper.getNumericValue(source[this.endStatementPosition - 2])) > 15
+						|| (c2 = ScannerHelper.getHexadecimalValue(source[this.endStatementPosition - 2])) > 15
 						|| c2 < 0
-						|| (c3 = ScannerHelper.getNumericValue(source[this.endStatementPosition - 1])) > 15
+						|| (c3 = ScannerHelper.getHexadecimalValue(source[this.endStatementPosition - 1])) > 15
 						|| c3 < 0
-						|| (c4 = ScannerHelper.getNumericValue(source[this.endStatementPosition])) > 15
+						|| (c4 = ScannerHelper.getHexadecimalValue(source[this.endStatementPosition])) > 15
 						|| c4 < 0) &&
 					((char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4)) == ';'){
 				// we have a Unicode for the ';' (/u003B)
@@ -11250,11 +11250,11 @@
 				int c1, c2, c3, c4;
 				index[0]++;
 				while (comment[index[0]] == 'u') index[0]++;
-				if (!(((c1 = ScannerHelper.getNumericValue(comment[index[0]++])) > 15
+				if (!(((c1 = ScannerHelper.getHexadecimalValue(comment[index[0]++])) > 15
 					|| c1 < 0)
-					|| ((c2 = ScannerHelper.getNumericValue(comment[index[0]++])) > 15 || c2 < 0)
-					|| ((c3 = ScannerHelper.getNumericValue(comment[index[0]++])) > 15 || c3 < 0)
-					|| ((c4 = ScannerHelper.getNumericValue(comment[index[0]++])) > 15 || c4 < 0))) {
+					|| ((c2 = ScannerHelper.getHexadecimalValue(comment[index[0]++])) > 15 || c2 < 0)
+					|| ((c3 = ScannerHelper.getHexadecimalValue(comment[index[0]++])) > 15 || c3 < 0)
+					|| ((c4 = ScannerHelper.getHexadecimalValue(comment[index[0]++])) > 15 || c4 < 0))) {
 						nextCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
 				}
 				break;
@@ -12238,6 +12238,8 @@
 	boolean oldMethodRecoveryActivated = this.methodRecoveryActivated;
 	if(this.options.performMethodsFullRecovery) {
 		this.methodRecoveryActivated = true;
+		// we should not relocate bodyStart if there is a block within the statements
+		this.ignoreNextOpeningBrace = true;
 	}
 
 	initialize();
@@ -12535,6 +12537,8 @@
 
 	boolean oldMethodRecoveryActivated = this.methodRecoveryActivated;
 	if(this.options.performMethodsFullRecovery) {
+		// we should not relocate bodyStart if there is a block within the statements
+		this.ignoreNextOpeningBrace = true;
 		this.methodRecoveryActivated = true;
 		this.rParenPos = md.sourceEnd;
 	}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java
index 610ee71..4085f4d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java
@@ -1979,13 +1979,13 @@
 		this.currentPosition += (this.eofPosition - this.currentPosition);
 		throw new InvalidInputException(INVALID_UNICODE_ESCAPE);
 	}
-	if ((c1 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+	if ((c1 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
     		|| c1 < 0
-    		|| (c2 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+    		|| (c2 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
     		|| c2 < 0
-    		|| (c3 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+    		|| (c3 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
     		|| c3 < 0
-    		|| (c4 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+    		|| (c4 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
     		|| c4 < 0){
 		throw new InvalidInputException(INVALID_UNICODE_ESCAPE);
 	}
@@ -3269,18 +3269,18 @@
 			// OctalDigit OctalDigit
 			// ZeroToThree OctalDigit OctalDigit
 
-			int number = ScannerHelper.getNumericValue(this.currentCharacter);
+			int number = ScannerHelper.getHexadecimalValue(this.currentCharacter);
 			if (number >= 0 && number <= 7) {
 				boolean zeroToThreeNot = number > 3;
 				if (ScannerHelper.isDigit(this.currentCharacter = this.source[this.currentPosition++])) {
-					int digit = ScannerHelper.getNumericValue(this.currentCharacter);
+					int digit = ScannerHelper.getHexadecimalValue(this.currentCharacter);
 					if (digit >= 0 && digit <= 7) {
 						number = (number * 8) + digit;
 						if (ScannerHelper.isDigit(this.currentCharacter = this.source[this.currentPosition++])) {
 							if (zeroToThreeNot) {// has read \NotZeroToThree OctalDigit Digit --> ignore last character
 								this.currentPosition--;
 							} else {
-								digit = ScannerHelper.getNumericValue(this.currentCharacter);
+								digit = ScannerHelper.getHexadecimalValue(this.currentCharacter);
 								if (digit >= 0 && digit <= 7){ // has read \ZeroToThree OctalDigit OctalDigit
 									number = (number * 8) + digit;
 								} else {// has read \ZeroToThree OctalDigit NonOctalDigit --> ignore last character
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java
index 69c1107..4ee486e 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java
@@ -475,6 +475,50 @@
 	}
 	return Character.getNumericValue(c);
 }
+public static int getHexadecimalValue(char c) {
+	switch(c) {
+		case '0' :
+			return 0;
+		case '1' :
+			return 1;
+		case '2' :
+			return 2;
+		case '3' :
+			return 3;
+		case '4' :
+			return 4;
+		case '5' :
+			return 5;
+		case '6' :
+			return 6;
+		case '7' :
+			return 7;
+		case '8' :
+			return 8;
+		case '9' :
+			return 9;
+		case 'A' :
+		case 'a' :
+			return 10;
+		case 'B' :
+		case 'b' :
+			return 11;
+		case 'C' :
+		case 'c' :
+			return 12;
+		case 'D' :
+		case 'd' :
+			return 13;
+		case 'E' :
+		case 'e' :
+			return 14;
+		case 'F' :
+		case 'f' :
+			return 15;
+		default:
+			return -1;
+	}
+}
 public static char toUpperCase(char c) {
 	if (c < MAX_OBVIOUS) {
 		if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[c] & ScannerHelper.C_UPPER_LETTER) != 0) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
index 7c009af..206854e 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
@@ -8341,6 +8341,10 @@
 			&& CharOperation.equals(method.selector, TypeConstants.WRITEREPLACE)) {
 		return;
 	}
+	if ((method.tagBits & (TagBits.AnnotationPostConstruct | TagBits.AnnotationPreDestroy)) != 0) {
+		// PostConstruct and PreDestroy method are ignored
+		return;
+	}
 	this.handle(
 			IProblem.UnusedPrivateMethod,
 		new String[] {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java
index 50beb8f..25e66af 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java
@@ -1099,7 +1099,6 @@
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
 	 * <li>the node already has a parent</li>
-	 * <li>a cycle in would be created</li>
 	 * </ul>
 	 */
 	public ArrayType newArrayType(Type componentType) {
@@ -1110,28 +1109,26 @@
 
 	/**
 	 * Creates and returns a new unparented array type node with the given
-	 * element type and number of dimensions.
+	 * element type and number of (additional) dimensions.
 	 * <p>
 	 * Note that if the element type passed in is an array type, the
 	 * element type of the result will not be the same as what was passed in.
 	 * </p>
 	 *
-	 * @param elementType the element type (never an array type)
+	 * @param elementType the element type (can be an array type)
 	 * @param dimensions the number of dimensions, a positive number
 	 * @return a new unparented array type node
 	 * @exception IllegalArgumentException if:
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
 	 * <li>the node already has a parent</li>
-	 * <li>a cycle in would be created</li>
 	 * <li>the element type is null</li>
-	 * <li>the element type is an array type</li>
 	 * <li>the number of dimensions is lower than 1</li>
 	 * <li>the number of dimensions is greater than 1000</li>
 	 * </ul>
 	 */
 	public ArrayType newArrayType(Type elementType, int dimensions) {
-		if (elementType == null || elementType.isArrayType()) {
+		if (elementType == null) {
 			throw new IllegalArgumentException();
 		}
 		if (dimensions < 1 || dimensions > 1000) {
@@ -1481,7 +1478,6 @@
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
 	 * <li>the node already has a parent</li>
-	 * <li>a cycle in would be created</li>
 	 * </ul>
 	 */
 	public ExpressionStatement newExpressionStatement(Expression expression) {
@@ -1521,7 +1517,6 @@
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
 	 * <li>the node already has a parent</li>
-	 * <li>a cycle in would be created</li>
 	 * <li>the given fragment is null</li>
 	 * </ul>
 	 */
@@ -2487,7 +2482,6 @@
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
 	 * <li>the node already has a parent</li>
-	 * <li>a cycle in would be created</li>
 	 * </ul>
 	 * @since 3.0
 	 */
@@ -2518,7 +2512,6 @@
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
 	 * <li>the node already has a parent</li>
-	 * <li>a cycle in would be created</li>
 	 * </ul>
 	 */
 	public TypeDeclarationStatement
@@ -2571,9 +2564,7 @@
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
 	 * <li>the node already has a parent</li>
-	 * <li>a cycle in would be created</li>
 	 * <li>the given fragment is null</li>
-	 * <li>a cycle in would be created</li>
 	 * </ul>
 	 */
 	public VariableDeclarationExpression
@@ -2618,7 +2609,6 @@
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
 	 * <li>the node already has a parent</li>
-	 * <li>a cycle in would be created</li>
 	 * <li>the variable declaration fragment is null</li>
 	 * </ul>
 	 */
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ListRewrite.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ListRewrite.java
index e74b3b0..a7ef8aa 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ListRewrite.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ListRewrite.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2009 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * 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
@@ -164,7 +164,7 @@
 
 	/**
 	 * Inserts the given node into the list after the given element.
-	 * The existing node must be in the list, either as an original or as a new
+	 * The existing node <code>previousElement</code> must be in the list, either as an original or as a new
 	 * node that has been inserted.
 	 * The inserted node must either be brand new (not part of the original AST)
 	 * or a placeholder node (for example, one created by
@@ -175,20 +175,20 @@
      * a note that this node has been inserted into the list.
 	 *
 	 * @param node the node to insert
-	 * @param element the element after which the given node is to be inserted
+	 * @param previousElement the element after which the given node is to be inserted
 	 * @param editGroup the edit group in which to collect the corresponding
 	 * text edits, or <code>null</code> if ungrouped
 	 * @throws IllegalArgumentException if the node or element is null,
 	 * or if the node is not part of this rewriter's AST, or if the inserted node
-	 * is not a new node (or placeholder), or if <code>element</code> is not a member
+	 * is not a new node (or placeholder), or if <code>previousElement</code> is not a member
 	 * of the list (original or new), or if the described modification is
 	 * otherwise invalid
 	 */
-	public void insertAfter(ASTNode node, ASTNode element, TextEditGroup editGroup) {
-		if (node == null || element == null) {
+	public void insertAfter(ASTNode node, ASTNode previousElement, TextEditGroup editGroup) {
+		if (node == null || previousElement == null) {
 			throw new IllegalArgumentException();
 		}
-		int index= getEvent().getIndex(element, ListRewriteEvent.BOTH);
+		int index= getEvent().getIndex(previousElement, ListRewriteEvent.BOTH);
 		if (index == -1) {
 			throw new IllegalArgumentException("Node does not exist"); //$NON-NLS-1$
 		}
@@ -197,7 +197,7 @@
 
 	/**
 	 * Inserts the given node into the list before the given element.
-	 * The existing node must be in the list, either as an original or as a new
+	 * The existing node <code>nextElement</code> must be in the list, either as an original or as a new
 	 * node that has been inserted.
 	 * The inserted node must either be brand new (not part of the original AST)
 	 * or a placeholder node (for example, one created by
@@ -208,20 +208,20 @@
      * a note that this node has been inserted into the list.
 	 *
 	 * @param node the node to insert
-	 * @param element the element before which the given node is to be inserted
+	 * @param nextElement the element before which the given node is to be inserted
 	 * @param editGroup the edit group in which to collect the corresponding
 	 * text edits, or <code>null</code> if ungrouped
-	 * @throws IllegalArgumentException if the node or element is null,
+	 * @throws IllegalArgumentException if the node or next element is null,
 	 * or if the node is not part of this rewriter's AST, or if the inserted node
-	 * is not a new node (or placeholder), or if <code>element</code> is not a member
+	 * is not a new node (or placeholder), or if <code>nextElement</code> is not a member
 	 * of the list (original or new), or if the described modification is
 	 * otherwise invalid
 	 */
-	public void insertBefore(ASTNode node, ASTNode element, TextEditGroup editGroup) {
-		if (node == null || element == null) {
+	public void insertBefore(ASTNode node, ASTNode nextElement, TextEditGroup editGroup) {
+		if (node == null || nextElement == null) {
 			throw new IllegalArgumentException();
 		}
-		int index= getEvent().getIndex(element, ListRewriteEvent.BOTH);
+		int index= getEvent().getIndex(nextElement, ListRewriteEvent.BOTH);
 		if (index == -1) {
 			throw new IllegalArgumentException("Node does not exist"); //$NON-NLS-1$
 		}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.java
index 2c5d21e..cfa0657 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
  * 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
@@ -12,6 +12,9 @@
 package org.eclipse.jdt.internal.core.dom.rewrite;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -27,8 +30,10 @@
 import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.compiler.CharOperation;
 import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.dom.Comment;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.ImportDeclaration;
+import org.eclipse.jdt.core.dom.LineComment;
 import org.eclipse.jdt.core.dom.PackageDeclaration;
 import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
 import org.eclipse.jdt.core.search.IJavaSearchConstants;
@@ -60,6 +65,8 @@
 	private boolean useContextToFilterImplicitImports;
 	private boolean findAmbiguousImports;
 
+	private IRegion[] preserveExistingCommentsRanges;
+
 	private int flags= 0;
 
 	private static final int F_NEEDS_LEADING_DELIM= 2;
@@ -91,6 +98,9 @@
 		this.replaceRange= evaluateReplaceRange(root);
 		if (restoreExistingImports) {
 			addExistingImports(root);
+		} else {
+			// collect all existing comments inside imports and concatenate them
+			this.preserveExistingCommentsRanges = retrieveExistingCommentsInImports(root);
 		}
 
 		PackageEntry[] order= new PackageEntry[importOrder.length];
@@ -117,7 +127,7 @@
 		}
 		return 1;
 	}
-
+	
 	private boolean insertSpaceBeforeSemicolon() {
 		return JavaCore.INSERT.equals(this.compilationUnit.getJavaProject().getOption(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_SEMICOLON, true));
 	}
@@ -228,8 +238,8 @@
 					return testedName;
 				}
 			}
-		} while (index >= 0);
-		return name;
+			} while (index >= 0); 
+	return name;
 	}
 
 	private static String getFullName(ImportDeclaration decl) {
@@ -266,12 +276,30 @@
 			int nextLength= next.getLength();
 			int nextOffsetLine= root.getLineNumber(nextOffset);
 
+			int extendedStart = root.getExtendedStartPosition(next);
+			int extendedLength = root.getExtendedLength(next);
 			// if next import is on a different line, modify the end position to the next line begin offset
 			if (currEndLine < nextOffsetLine) {
 				currEndLine++;
 				nextOffset= root.getPosition(currEndLine, 0);
 			}
-			currPackage.add(new ImportDeclEntry(packName.length(), name, isStatic, new Region(currOffset, nextOffset - currOffset)));
+			// retrieve preceding and trailing comments if any
+			IRegion rangeBefore = null;
+			IRegion rangeAfter = null;
+			if (nextOffset != extendedStart) {
+				rangeBefore = new Region(extendedStart, extendedStart - nextOffset + 1);
+			}
+			if (nextLength != extendedLength) {
+				rangeAfter = new Region(nextOffset + nextLength, extendedLength - nextLength + 1);
+			}
+			currPackage.add(
+					new ImportDeclEntry(
+							packName.length(), 
+							name, 
+							isStatic, 
+							new Region(currOffset, nextOffset - currOffset),
+							rangeBefore,
+							rangeAfter));
 //{ObjectTeams: base import
 			if (isBase)
 				currPackage.getLast().setIsBase(true);
@@ -314,6 +342,102 @@
 //SH}
 	}
 
+	private IRegion[] retrieveExistingCommentsInImports(CompilationUnit root) {
+		List/*ImportDeclaration*/ decls= root.imports();
+		if (decls.isEmpty()) {
+			return null;
+		}
+		
+		List commentList = root.getCommentList();
+		int numberOfComments = commentList.size();
+		List regions = null;
+		int currentExtendedEnd = -1;
+		int currEndLine= -1;
+
+		/* for the first comment, we only take the trailing comment if any and the replace range doesn't 
+		 * include the preceding comment
+		 */
+		for (int i= 0; i < decls.size(); i++) {
+			ImportDeclaration next= (ImportDeclaration) decls.get(i);
+			int nextOffset= next.getStartPosition();
+			int nextLength= next.getLength();
+
+			int extendedStart = root.getExtendedStartPosition(next);
+			int extendedLength = root.getExtendedLength(next);
+			int nextOffsetLine= root.getLineNumber(nextOffset);
+
+			if (nextOffset != extendedStart) {
+				// preceding comment
+				int lengthOfPrecedingComment = nextOffset - extendedStart;
+				if (i != 0) {
+					if (regions == null) {
+						regions = new ArrayList();
+					}
+					regions.add(new Region(extendedStart, lengthOfPrecedingComment));
+				}
+				
+				if (extendedLength != (nextLength + lengthOfPrecedingComment)) {
+					// Preceding and trailing comments 
+					int regionLength = extendedLength - (nextLength + lengthOfPrecedingComment);
+					if (regions == null) {
+						regions = new ArrayList();
+					}
+					regions.add(new Region(nextOffset + nextLength, regionLength));
+				}
+			} else if (nextLength != extendedLength) {
+				// no extended start - only trailing comment
+				int regionLength = extendedLength - nextLength;
+				if (regions == null) {
+					regions = new ArrayList();
+				}
+				regions.add(new Region(nextOffset + nextLength, regionLength));
+			}
+			if (i > 0) {
+				// record comments between the previous comment and the current one that are not part
+				// of any comment extended range.
+				if ((nextOffsetLine - currEndLine) > 1) {
+					// check for comments between the two imports
+					LineComment comment = root.getAST().newLineComment();
+					comment.setSourceRange(currentExtendedEnd + 1, 0);
+					int index = Collections.binarySearch(commentList, comment, new Comparator() {
+						public int compare(Object o1, Object o2) {
+							return ((Comment) o1).getStartPosition() - ((Comment) o2).getStartPosition();
+						}
+					});
+					// index = -(insertion point) - 1. 
+					if (index < 0) {
+						loop: for (int j = -(index + 1); j < numberOfComments; j++) {
+							Comment currentComment = (Comment) commentList.get(j);
+							int commentStartPosition = currentComment.getStartPosition();
+							int commentLength = currentComment.getLength();
+							if ((commentStartPosition > currentExtendedEnd)
+									&& ((commentStartPosition + commentLength - 1) < extendedStart)) {
+								if (regions == null) {
+									regions = new ArrayList();
+								}
+								regions.add(new Region(commentStartPosition, commentLength));
+							} else {
+								break loop;
+							}
+						}
+					}
+				}
+			}
+			currentExtendedEnd = extendedStart + extendedLength - 1;
+			currEndLine = root.getLineNumber(currentExtendedEnd);
+		}
+		if (regions == null) {
+			return null;
+		}
+		// sort regions according to their positions to restore comments in the same order
+		IRegion[] result = (IRegion[]) regions.toArray(new IRegion[regions.size()]);
+		Arrays.sort(result, new Comparator() {
+			public int compare(Object o1, Object o2) {
+				return ((IRegion) o1).getOffset() - ((IRegion) o2).getOffset();
+			}
+		});
+		return result;
+	}
 	/**
 	 * Specifies that implicit imports (for types in <code>java.lang</code>, types in the same package as the rewrite
 	 * compilation unit and types in the compilation unit's main type) should not be created, except if necessary to
@@ -325,10 +449,10 @@
 	 * Note: {@link #ImportRewriteAnalyzer(ICompilationUnit, CompilationUnit, String[], int, int, boolean, boolean)} with true as the last
 	 * parameter can be used to filter implicit imports when a context is used.
 	 * </p>
-	 *
+	 * 
 	 * @param filterImplicitImports
 	 *            if <code>true</code>, implicit imports will be filtered
-	 *
+	 * 
 	 * @see #ImportRewriteAnalyzer(ICompilationUnit, CompilationUnit, String[], int, int, boolean, boolean)
 	 */
 	public void setFilterImplicitImports(boolean filterImplicitImports) {
@@ -712,7 +836,7 @@
 
 				boolean doStarImport= pack.hasStarImport(threshold, onDemandConflicts);
 				if (doStarImport && (pack.find("*") == null)) { //$NON-NLS-1$
-					String[] imports = getNewImportStrings(pack, isStatic, lineDelim);
+					String[] imports = getNewImportStrings(buffer, pack, isStatic, lineDelim);
 					for (int j = 0, max = imports.length; j < max; j++) {
 						stringsToInsert.add(imports[j]);
 					}
@@ -756,8 +880,17 @@
 					} else if (doStarImport && !currDecl.isOnDemand()) {
 						String simpleName = currDecl.getTypeQualifiedName();
 						if (simpleName.indexOf('.') != -1) {
+							IRegion rangeBefore = currDecl.getPrecedingCommentRange();
+							if (rangeBefore != null) {
+								stringsToInsert.add(buffer.getText(rangeBefore.getOffset(), rangeBefore.getLength()));
+							}
+							IRegion rangeAfter = currDecl.getTrailingCommentRange();
+							String trailingComment = null;
+							if (rangeAfter != null) {
+								trailingComment = buffer.getText(rangeAfter.getOffset(), rangeAfter.getLength());
+							}
 //{ObjectTeams: new 3. param:
-							String str= getNewImportString(currDecl.getElementName(), isStatic, currDecl.isBase(), lineDelim);
+							String str= getNewImportString(currDecl.getElementName(), isStatic, currDecl.isBase(), trailingComment, lineDelim);
 // SH}
 							if (stringsToInsert.indexOf(str) == -1) {
 								stringsToInsert.add(str);
@@ -767,6 +900,30 @@
 				}
 			}
 
+			// insert back all existing imports comments since existing imports were not preserved
+			if (this.preserveExistingCommentsRanges != null) {
+				for (int i = 0, max = this.preserveExistingCommentsRanges.length; i < max; i++) {
+					IRegion region = this.preserveExistingCommentsRanges[i];
+					String text = buffer.getText(region.getOffset(), region.getLength());
+					// remove preceding whitespaces
+					int index = 0;
+					int length = text.length();
+					loop: while (index < length) {
+						if (Character.isWhitespace(text.charAt(index))) {
+							index++;
+						} else {
+							break loop;
+						}
+					}
+					if (index != 0) {
+						text = text.substring(index);
+					}
+					if (!text.endsWith(lineDelim)) {
+						text += lineDelim;
+					}
+					stringsToInsert.add(text);
+				}
+			}
 			int end= importsStart + importsLen;
 			removeAndInsertNew(buffer, currPos, end, stringsToInsert, resEdit);
 
@@ -898,6 +1055,10 @@
 
 //{ObjectTeams: added 3. parameter
 	private String getNewImportString(String importName, boolean isStatic, boolean isBase, String lineDelim) {
+		return getNewImportString(importName, isStatic, isBase, null, lineDelim);
+	}
+	
+	private String getNewImportString(String importName, boolean isStatic, boolean isBase, String trailingComment, String lineDelim) {
 // SH}
 		StringBuffer buf= new StringBuffer();
 		buf.append("import "); //$NON-NLS-1$
@@ -911,6 +1072,9 @@
 		buf.append(importName);
 		if (insertSpaceBeforeSemicolon()) buf.append(' ');
 		buf.append(';');
+		if (trailingComment != null) {
+			buf.append(trailingComment);
+		}
 		buf.append(lineDelim);
 
 		if (isStatic) {
@@ -920,25 +1084,54 @@
 		}
 		return buf.toString();
 	}
-
-	private String[] getNewImportStrings(PackageEntry packageEntry, boolean isStatic, String lineDelim) {
+	
+	private String[] getNewImportStrings(IBuffer buffer, PackageEntry packageEntry, boolean isStatic, String lineDelim) {
 		boolean isStarImportAdded = false;
 		List allImports = new ArrayList();
 		int nImports = packageEntry.getNumberOfImports();
+		StringBuffer allComments = null;
 		for (int i= 0; i < nImports; i++) {
 			ImportDeclEntry curr= packageEntry.getImportAt(i);
 			String simpleName = curr.getTypeQualifiedName();
 			if (simpleName.indexOf('.') != -1) {
 				// member type imports - we preserve it
+				IRegion rangeBefore = curr.getPrecedingCommentRange();
+				if (rangeBefore != null) {
+					allImports.add(buffer.getText(rangeBefore.getOffset(), rangeBefore.getLength()));
+				}
+				IRegion rangeAfter = curr.getTrailingCommentRange();
+				String trailingComment = null;
+				if (rangeAfter != null) {
+					trailingComment = buffer.getText(rangeAfter.getOffset(), rangeAfter.getLength());
+				}
 //{ObjectTeams: added isBase(false) (2 occur)
-				allImports.add(getNewImportString(curr.getElementName(), isStatic, false, lineDelim));
+				allImports.add(getNewImportString(curr.getElementName(), isStatic, false, trailingComment, lineDelim));
 			} else if (!isStarImportAdded) {
 				String starImportString= packageEntry.getName() + ".*"; //$NON-NLS-1$
 				allImports.add(getNewImportString(starImportString, isStatic, false, lineDelim));
 // SH}
 				isStarImportAdded = true;
+			} else {
+				// collect all comments
+				IRegion rangeBefore = curr.getPrecedingCommentRange();
+				if (rangeBefore != null) {
+					if (allComments == null) {
+						allComments = new StringBuffer();
+					}
+					allComments.append(buffer.getText(rangeBefore.getOffset(), rangeBefore.getLength())).append(lineDelim);
+				}
+				IRegion rangeAfter = curr.getTrailingCommentRange();
+				if (rangeAfter != null) {
+					if (allComments == null) {
+						allComments = new StringBuffer();
+					}
+					allComments.append(buffer.getText(rangeAfter.getOffset(), rangeAfter.getLength())).append(lineDelim);
+				}
 			}
 		}
+		if (allComments != null) {
+			allImports.add(0, String.valueOf(allComments));
+		}
 		return (String[]) allImports.toArray(new String[allImports.size()]);
 	}
 
@@ -1000,6 +1193,20 @@
 		private boolean isBase = false;
 // SH}
 		private int containerNameLength;
+		private IRegion precedingCommentRange;
+		private IRegion trailingCommentRange;
+
+		public ImportDeclEntry(
+				int containerNameLength,
+				String elementName,
+				boolean isStatic,
+				IRegion sourceRange,
+				IRegion precedingCommentRange,
+				IRegion trailingCommentRange) {
+			this(containerNameLength, elementName, isStatic, sourceRange);
+			this.precedingCommentRange = precedingCommentRange;
+			this.trailingCommentRange = trailingCommentRange;
+		}
 
 		public ImportDeclEntry(int containerNameLength, String elementName, boolean isStatic, IRegion sourceRange) {
 			this.elementName= elementName;
@@ -1030,7 +1237,7 @@
 		public String getTypeQualifiedName() {
 			return this.elementName.substring(this.containerNameLength + 1);
 		}
-
+		
 		public boolean isOnDemand() {
 			return this.elementName != null && this.elementName.endsWith(".*"); //$NON-NLS-1$
 		}
@@ -1050,6 +1257,14 @@
 		public IRegion getSourceRange() {
 			return this.sourceRange;
 		}
+		
+		public IRegion getPrecedingCommentRange() {
+			return this.precedingCommentRange;
+		}
+
+		public IRegion getTrailingCommentRange() {
+			return this.trailingCommentRange;
+		}
 
 //{ObjectTeams: base import:
 		public void setIsBase(boolean flag) {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.java
index a1f18cd..a26e75d 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
  * 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
@@ -72,32 +72,32 @@
 	 * @return Returns a place holder node.
 	 */
 	public final ASTNode newPlaceholderNode(int nodeType) {
-	    try {
-		    ASTNode node= this.ast.createInstance(nodeType);
-		    switch (node.getNodeType()) {
+		try {
+			ASTNode node= this.ast.createInstance(nodeType);
+			switch (node.getNodeType()) {
 				case ASTNode.FIELD_DECLARATION:
-				    ((FieldDeclaration) node).fragments().add(this.ast.newVariableDeclarationFragment());
-				    break;
+					((FieldDeclaration) node).fragments().add(this.ast.newVariableDeclarationFragment());
+					break;
 				case ASTNode.MODIFIER:
-				    ((Modifier) node).setKeyword(Modifier.ModifierKeyword.ABSTRACT_KEYWORD);
+					((Modifier) node).setKeyword(Modifier.ModifierKeyword.ABSTRACT_KEYWORD);
 					break;
 				case ASTNode.TRY_STATEMENT :
 					((TryStatement) node).setFinally(this.ast.newBlock()); // have to set at least a finally block to be legal code
 					break;
 				case ASTNode.VARIABLE_DECLARATION_EXPRESSION :
-				    ((VariableDeclarationExpression) node).fragments().add(this.ast.newVariableDeclarationFragment());
-			    	break;
+					((VariableDeclarationExpression) node).fragments().add(this.ast.newVariableDeclarationFragment());
+					break;
 				case ASTNode.VARIABLE_DECLARATION_STATEMENT :
-				    ((VariableDeclarationStatement) node).fragments().add(this.ast.newVariableDeclarationFragment());
-		    		break;
+					((VariableDeclarationStatement) node).fragments().add(this.ast.newVariableDeclarationFragment());
+					break;
 				case ASTNode.PARAMETERIZED_TYPE :
-				    ((ParameterizedType) node).typeArguments().add(this.ast.newWildcardType());
-		    		break;
+					((ParameterizedType) node).typeArguments().add(this.ast.newWildcardType());
+					break;
 			}
-		    return node;
-	    } catch (IllegalArgumentException e) {
-	        return null;
-	    }
+			return node;
+		} catch (IllegalArgumentException e) {
+			return null;
+		}
  	}
 
 
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
index 37afb4b..fb5424b 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
@@ -1184,7 +1184,7 @@
 	 * <p>The severity of the problem is controlled with option {@link #COMPILER_PB_INVALID_JAVADOC}.
 	 * <p>It does not depend on option {@link #COMPILER_PB_INVALID_JAVADOC_TAGS}.
 	 * <p>When this option is valued to {@link #COMPILER_PB_MISSING_JAVADOC_TAG_DESCRIPTION_ALL_STANDARD_TAGS},
-	 *       a subset of the standard <a href="http://java.sun.com/javase/6/docs/technotes/tools/windows/javadoc.html#javadoctags">Javadoc tags</a>
+	 *       a subset of the standard <a href="http://download.oracle.com/javase/6/docs/technotes/tools/windows/javadoc.html#javadoctags">Javadoc tags</a>
 	 *       that have a description, text or label are checked. While this set may grow in the future, note that user-defined tags are not and will not be checked.
 	 * <dl>
 	 * <dt>Option id:</dt><dd><code>"org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription"</code></dd>
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/SourceJavadocParser.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/SourceJavadocParser.java
index 6f96497..00461e7 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/SourceJavadocParser.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/SourceJavadocParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
  * 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
@@ -93,10 +93,10 @@
 		this.index++;
 		while (this.source[this.index] == 'u')
 			this.index++;
-		if (!(((c1 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c1 < 0)
-				|| ((c2 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c2 < 0)
-				|| ((c3 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c3 < 0)
-				|| ((c4 = ScannerHelper.getNumericValue(this.source[this.index++])) > 15 || c4 < 0))) {
+		if (!(((c1 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c1 < 0)
+				|| ((c2 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c2 < 0)
+				|| ((c3 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c3 < 0)
+				|| ((c4 = ScannerHelper.getHexadecimalValue(this.source[this.index++])) > 15 || c4 < 0))) {
 			first = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
 		} else {
 			this.index = pos;
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMember.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMember.java
index 60300ca..94e6db1 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMember.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMember.java
@@ -87,6 +87,12 @@
 	if ((tagBits & TagBits.AnnotationSafeVarargs) != 0) {
 		annotations.add(getAnnotation(TypeConstants.JAVA_LANG_SAFEVARARGS));
 	}
+	if ((tagBits & TagBits.AnnotationPostConstruct) != 0) {
+		annotations.add(getAnnotation(TypeConstants.JAVAX_ANNOTATION_POSTCONSTRUCT));
+	}
+	if ((tagBits & TagBits.AnnotationPreDestroy) != 0) {
+		annotations.add(getAnnotation(TypeConstants.JAVAX_ANNOTATION_PREDESTROY));
+	}
 	// note that JAVA_LANG_SUPPRESSWARNINGS and JAVA_LANG_OVERRIDE cannot appear in binaries
 	return (IAnnotation[]) annotations.toArray(new IAnnotation[annotations.size()]);
 }
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileInfo.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileInfo.java
index b340526..0feff2c 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileInfo.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileInfo.java
@@ -126,6 +126,12 @@
 	if ((tagBits & TagBits.AnnotationSafeVarargs) != 0) {
 		generateStandardAnnotation(javaElement, TypeConstants.JAVA_LANG_SAFEVARARGS, Annotation.NO_MEMBER_VALUE_PAIRS, newElements);
 	}
+	if ((tagBits & TagBits.AnnotationPostConstruct) != 0) {
+		generateStandardAnnotation(javaElement, TypeConstants.JAVAX_ANNOTATION_POSTCONSTRUCT, Annotation.NO_MEMBER_VALUE_PAIRS, newElements);
+	}
+	if ((tagBits & TagBits.AnnotationPreDestroy) != 0) {
+		generateStandardAnnotation(javaElement, TypeConstants.JAVAX_ANNOTATION_PREDESTROY, Annotation.NO_MEMBER_VALUE_PAIRS, newElements);
+	}
 	// note that JAVA_LANG_SUPPRESSWARNINGS and JAVA_LANG_OVERRIDE cannot appear in binaries
 }
 
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileWorkingCopy.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileWorkingCopy.java
index d1027f2..4c085ce 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileWorkingCopy.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileWorkingCopy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
  * 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
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for Bug 337935 - Test failures when run as an IDE (org.eclipse.sdk.ide)
  *******************************************************************************/
 package org.eclipse.jdt.internal.core;
 
@@ -81,21 +82,18 @@
 protected IBuffer openBuffer(IProgressMonitor pm, Object info) throws JavaModelException {
 
 	// create buffer
-	IBuffer buffer = this.owner.createBuffer(this);
-	if (buffer == null) return null;
+	IBuffer buffer = BufferManager.createBuffer(this);
 
 	// set the buffer source
-	if (buffer.getCharacters() == null) {
-		IBuffer classFileBuffer = this.classFile.getBuffer();
-		if (classFileBuffer != null) {
-			buffer.setContents(classFileBuffer.getCharacters());
-		} else {
-			// Disassemble
-			IClassFileReader reader = ToolFactory.createDefaultClassFileReader(this.classFile, IClassFileReader.ALL);
-			Disassembler disassembler = new Disassembler();
-			String contents = disassembler.disassemble(reader, Util.getLineSeparator("", getJavaProject()), ClassFileBytesDisassembler.WORKING_COPY); //$NON-NLS-1$
-			buffer.setContents(contents);
-		}
+	IBuffer classFileBuffer = this.classFile.getBuffer();
+	if (classFileBuffer != null) {
+		buffer.setContents(classFileBuffer.getCharacters());
+	} else {
+		// Disassemble
+		IClassFileReader reader = ToolFactory.createDefaultClassFileReader(this.classFile, IClassFileReader.ALL);
+		Disassembler disassembler = new Disassembler();
+		String contents = disassembler.disassemble(reader, Util.getLineSeparator("", getJavaProject()), ClassFileBytesDisassembler.WORKING_COPY); //$NON-NLS-1$
+		buffer.setContents(contents);
 	}
 
 	// add buffer to buffer cache
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java
index b15d3c8..f7a0c1c 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Terry Parker <tparker@google.com> - DeltaProcessor exhibits O(N^2) behavior, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=354332
  *******************************************************************************/
 package org.eclipse.jdt.internal.core;
 
@@ -953,6 +954,7 @@
 				// project does not exist -> ignore
 				continue;
 			}
+			boolean hasChainedJar = false;
 			for (int j = 0; j < entries.length; j++){
 				if (entries[j].getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
 					IPath entryPath = entries[j].getPath();
@@ -1022,7 +1024,7 @@
 								System.out.println("- External JAR ADDED, affecting root: "+root.getElementName()); //$NON-NLS-1$
 							}
 							elementAdded(root, null, null);
-							javaProject.resetResolvedClasspath(); // in case it contains a chained jar
+							hasChainedJar |= !this.manager.isNonChainingJar(entryPath);
 							this.state.addClasspathValidation(javaProject); // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=185733
 							hasDelta = true;
 						} else if (status == EXTERNAL_JAR_CHANGED) {
@@ -1031,7 +1033,7 @@
 								System.out.println("- External JAR CHANGED, affecting root: "+root.getElementName()); //$NON-NLS-1$
 							}
 							contentChanged(root);
-							javaProject.resetResolvedClasspath(); // in case it contains a chained jar
+							hasChainedJar |= !this.manager.isNonChainingJar(entryPath);
 							hasDelta = true;
 						} else if (status == EXTERNAL_JAR_REMOVED) {
 							PackageFragmentRoot root = (PackageFragmentRoot) javaProject.getPackageFragmentRoot(entryPath.toString());
@@ -1039,13 +1041,17 @@
 								System.out.println("- External JAR REMOVED, affecting root: "+root.getElementName()); //$NON-NLS-1$
 							}
 							elementRemoved(root, null, null);
-							javaProject.resetResolvedClasspath(); // in case it contains a chained jar
+							hasChainedJar |= !this.manager.isNonChainingJar(entryPath);
 							this.state.addClasspathValidation(javaProject); // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=185733
 							hasDelta = true;
 						}
 					}
 				}
 			}
+			
+			if (hasChainedJar) {
+				javaProject.resetResolvedClasspath();
+			}
 		}
 		// ensure the external file cache is reset so that if a .jar file is deleted but no longer on the classpath, it won't appear as changed next time it is added
 		JavaModel.flushExternalFileCache();
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SelectionRequestor.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SelectionRequestor.java
index 191af72..1f18e01 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SelectionRequestor.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SelectionRequestor.java
@@ -351,7 +351,7 @@
 	}
 }
 public void acceptLocalMethod(MethodBinding methodBinding) {
-	IJavaElement res = findLocalElement(methodBinding.sourceStart());
+	IJavaElement res = findLocalElement(methodBinding.original().sourceStart());
 	if(res != null) {
 		if(res.getElementType() == IJavaElement.METHOD) {
 			IMethod method = (IMethod) res;
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java
index aef9537..0555b43 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java
@@ -1047,6 +1047,8 @@
 					char[][] memberTypeNames = CharOperation.splitOn('$', typeName, firstDollar+1, typeName.length);
 					for (int i = 0; i < memberTypeNames.length; i++) {
 						this.focusType = this.focusType.getMemberType(memberTypeNames[i]);
+						if (this.focusType == null)
+							return null;
 					}
 				}
 			}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/PublicScanner.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/PublicScanner.java
index 7e9aa85..12579ef 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/PublicScanner.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/PublicScanner.java
@@ -1959,13 +1959,13 @@
 		this.currentPosition += (this.eofPosition - this.currentPosition);
 		throw new InvalidInputException(INVALID_UNICODE_ESCAPE);
 	}
-	if ((c1 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+	if ((c1 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
     		|| c1 < 0
-    		|| (c2 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+    		|| (c2 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
     		|| c2 < 0
-    		|| (c3 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+    		|| (c3 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
     		|| c3 < 0
-    		|| (c4 = ScannerHelper.getNumericValue(this.source[this.currentPosition++])) > 15
+    		|| (c4 = ScannerHelper.getHexadecimalValue(this.source[this.currentPosition++])) > 15
     		|| c4 < 0){
 		throw new InvalidInputException(INVALID_UNICODE_ESCAPE);
 	}
@@ -2865,18 +2865,18 @@
 			// OctalDigit OctalDigit
 			// ZeroToThree OctalDigit OctalDigit
 
-			int number = ScannerHelper.getNumericValue(this.currentCharacter);
+			int number = ScannerHelper.getHexadecimalValue(this.currentCharacter);
 			if (number >= 0 && number <= 7) {
 				boolean zeroToThreeNot = number > 3;
 				if (ScannerHelper.isDigit(this.currentCharacter = this.source[this.currentPosition++])) {
-					int digit = ScannerHelper.getNumericValue(this.currentCharacter);
+					int digit = ScannerHelper.getHexadecimalValue(this.currentCharacter);
 					if (digit >= 0 && digit <= 7) {
 						number = (number * 8) + digit;
 						if (ScannerHelper.isDigit(this.currentCharacter = this.source[this.currentPosition++])) {
 							if (zeroToThreeNot) {// has read \NotZeroToThree OctalDigit Digit --> ignore last character
 								this.currentPosition--;
 							} else {
-								digit = ScannerHelper.getNumericValue(this.currentCharacter);
+								digit = ScannerHelper.getHexadecimalValue(this.currentCharacter);
 								if (digit >= 0 && digit <= 7){ // has read \ZeroToThree OctalDigit OctalDigit
 									number = (number * 8) + digit;
 								} else {// has read \ZeroToThree OctalDigit NonOctalDigit --> ignore last character
diff --git a/org.eclipse.jdt.core/notes/R31_buildnotes_jdt-core.html b/org.eclipse.jdt.core/notes/R31_buildnotes_jdt-core.html
index 7a64b2a..c2a9d6a 100644
--- a/org.eclipse.jdt.core/notes/R31_buildnotes_jdt-core.html
+++ b/org.eclipse.jdt.core/notes/R31_buildnotes_jdt-core.html
@@ -3219,8 +3219,8 @@
 <ul>
 <li>Compiler is now able to parse 1.5 syntax in Javadoc comments (see bugs <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70891">70891</a>
 and <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70892">70892</a>).<br>
-Note: these changes only apply to <a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/javadoc.html#@param">@param</a> and
-<a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/javadoc.html#{@value}">{@value}</a> tags.
+Note: these changes only apply to <a href="http://download.oracle.com/javase/6/docs/technotes/tools/windows/javadoc.html#@param">@param</a> and
+<a href="http://download.oracle.com/javase/6/docs/technotes/tools/windows/javadoc.html#@value">{@value}</a> tags.
 </li>
 <li>Batch AST creation API was finalized. See <code>ASTParser#createASTs(ICompilationUnit[],String[],ASTRequestor,IProgressMonitor)</code>
      and <code>ASTRequestor</code>.
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.java
index 162d123..8aeb580 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.java
@@ -86,6 +86,14 @@
 					TypeConstants.JAVA_LANG_INVOKE_METHODHANDLE_$_POLYMORPHICSIGNATURE;
 			addAnnotationTypeReference(compoundName[compoundName.length-1]);
 		}
+		if ((annotationTagBits & TagBits.AnnotationPostConstruct) != 0) {
+			char[][] compoundName = TypeConstants.JAVAX_ANNOTATION_POSTCONSTRUCT;
+			addAnnotationTypeReference(compoundName[compoundName.length-1]);
+		}
+		if ((annotationTagBits & TagBits.AnnotationPreDestroy) != 0) {
+			char[][] compoundName = TypeConstants.JAVAX_ANNOTATION_PREDESTROY;
+			addAnnotationTypeReference(compoundName[compoundName.length-1]);
+		}
 	}
 	private void addBinaryTargetAnnotation(long bits) {
 		char[][] compoundName = null;
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/ClassFileMatchLocator.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/ClassFileMatchLocator.java
index 1124075..f6c1039 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/ClassFileMatchLocator.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/ClassFileMatchLocator.java
@@ -149,6 +149,18 @@
 			return true;
 		}
 	}
+	if ((annotationTagBits & TagBits.AnnotationPostConstruct) != 0) {
+		char[][] compoundName = TypeConstants.JAVAX_ANNOTATION_POSTCONSTRUCT;
+		if (checkAnnotationTypeReference(CharOperation.concatWith(compoundName, '.'), pattern)) {
+			return true;
+		}
+	}
+	if ((annotationTagBits & TagBits.AnnotationPreDestroy) != 0) {
+		char[][] compoundName = TypeConstants.JAVAX_ANNOTATION_PREDESTROY;
+		if (checkAnnotationTypeReference(CharOperation.concatWith(compoundName, '.'), pattern)) {
+			return true;
+		}
+	}
 	return false;
 }
 private boolean checkTypeName(char[] simpleName, char[] qualification, char[] fullyQualifiedTypeName, boolean isCaseSensitive, boolean isCamelCase) {