Merge branch 'master' into BETA_JAVA9

Conflicts:
	org.eclipse.jdt.compiler.apt.tests/lib/apttestprocessors.jar
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/APTProblem.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/APTProblem.java
index 1eb5b18..ac7043b 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/APTProblem.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/APTProblem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 BEA Systems, Inc.
+ * Copyright (c) 2005, 2015 BEA Systems, Inc.
  * 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
@@ -101,6 +101,10 @@
 	public boolean isWarning() {
 		return _severity == Severity.WARNING;
 	}
+
+	public boolean isInfo() {
+		return _severity == Severity.INFO;
+	}
 	
 	public String toString()
 	{
diff --git a/org.eclipse.jdt.apt.pluggable.core/src/org/eclipse/jdt/internal/apt/pluggable/core/dispatch/IdeAnnotationProcessorManager.java b/org.eclipse.jdt.apt.pluggable.core/src/org/eclipse/jdt/internal/apt/pluggable/core/dispatch/IdeAnnotationProcessorManager.java
index a640b71..12cfc0c 100644
--- a/org.eclipse.jdt.apt.pluggable.core/src/org/eclipse/jdt/internal/apt/pluggable/core/dispatch/IdeAnnotationProcessorManager.java
+++ b/org.eclipse.jdt.apt.pluggable.core/src/org/eclipse/jdt/internal/apt/pluggable/core/dispatch/IdeAnnotationProcessorManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 BEA Systems, Inc. 
+ * Copyright (c) 2007, 2015 BEA Systems, Inc 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:
  *    wharley@bea.com - initial API and implementation
+ *    IBM Corporation - Bug 478427
  *    
  *******************************************************************************/
 
@@ -97,7 +98,7 @@
 				}
 				_processors.add(pi);
 				return pi;
-			} catch (CoreException e) {
+			} catch (CoreException | NoClassDefFoundError e) {
 				Apt6Plugin.log(e, "Unable to create instance of annotation processor " + entry.getKey()); //$NON-NLS-1$
 			}
 		}
diff --git a/org.eclipse.jdt.compiler.apt.tests/lib/apttestprocessors.jar b/org.eclipse.jdt.compiler.apt.tests/lib/apttestprocessors.jar
index 9faff6b..e97fd1d 100644
--- a/org.eclipse.jdt.compiler.apt.tests/lib/apttestprocessors.jar
+++ b/org.eclipse.jdt.compiler.apt.tests/lib/apttestprocessors.jar
Binary files differ
diff --git a/org.eclipse.jdt.compiler.apt.tests/processors/org/eclipse/jdt/compiler/apt/tests/processors/typeutils/TypeUtilsProc.java b/org.eclipse.jdt.compiler.apt.tests/processors/org/eclipse/jdt/compiler/apt/tests/processors/typeutils/TypeUtilsProc.java
index 73130a8..b0b4a36 100644
--- a/org.eclipse.jdt.compiler.apt.tests/processors/org/eclipse/jdt/compiler/apt/tests/processors/typeutils/TypeUtilsProc.java
+++ b/org.eclipse.jdt.compiler.apt.tests/processors/org/eclipse/jdt/compiler/apt/tests/processors/typeutils/TypeUtilsProc.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 - 2012 BEA Systems, Inc. and others
+ * Copyright (c) 2007 - 2015 BEA Systems, Inc. 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:
  *    Walter Harley - initial API and implementation
+ *    IBM Corporation - Bug 382590
  *******************************************************************************/
 
 package org.eclipse.jdt.compiler.apt.tests.processors.typeutils;
@@ -405,10 +406,6 @@
                     return false;
                 }
                 ExecutableType etm = (ExecutableType)tm;
-                if (!etm.getParameterTypes().isEmpty()) {
-                    reportError(method + ": member m() should be void, but it had parameters");
-                    return false;
-                }
                 if (!_typeUtils.isSameType(etm.getReturnType(), longType)) {
                     reportError(method + ": member m() should have Long return type, but found " + etm.getReturnType());
                     return false;
diff --git a/org.eclipse.jdt.compiler.apt.tests/resources/targets/model/pc/AsMemberOf.java b/org.eclipse.jdt.compiler.apt.tests/resources/targets/model/pc/AsMemberOf.java
index 5df21e7..473887c 100644
--- a/org.eclipse.jdt.compiler.apt.tests/resources/targets/model/pc/AsMemberOf.java
+++ b/org.eclipse.jdt.compiler.apt.tests/resources/targets/model/pc/AsMemberOf.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012 Walter Harley and others
+ * Copyright (c) 2015 Walter Harley 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
@@ -15,7 +15,7 @@
  */
 public class AsMemberOf<T> {
     private T f;
-    private T m() { return f; }
+    protected T m(T[] t1, T t2) { return f; }
     E<Integer> e = new E<Integer>();
     
     // Type parameter 'T' of static class is unrelated to 'T' of containing class
@@ -39,7 +39,7 @@
     // even when accesed through a subclass; this is not explicitly specified, but 
     // is true for javac 1.6.
     T publicize() {
-        return (m() == null) ? new C<T>().x() : new D().x();
+        return (m(null, null) == null) ? new C<T>().x() : new D().x();
     }
 }
 
diff --git a/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/model/TypesImpl.java b/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/model/TypesImpl.java
index dabeb0e..820a899 100644
--- a/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/model/TypesImpl.java
+++ b/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/model/TypesImpl.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *    Walter Harley - initial API and implementation
- *    IBM Corporation - fix for 342598
+ *    IBM Corporation - fix for 342598, 382590
  *******************************************************************************/
 
 package org.eclipse.jdt.internal.compiler.apt.model;
@@ -85,8 +85,8 @@
     			MethodBinding methodBinding = (MethodBinding) elementImpl._binding;
     			while (referenceBinding != null) {
                     for (MethodBinding method : referenceBinding.methods()) {
-                        if (CharOperation.equals(method.selector, methodBinding.selector)
-                                && method.areParameterErasuresEqual(methodBinding)) {
+                        if (CharOperation.equals(method.selector, methodBinding.selector) &&
+                                (method.original() == methodBinding || method.areParameterErasuresEqual(methodBinding))) {
                             return this._env.getFactory().newTypeMirror(method);
                         }
                     }
diff --git a/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java b/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java
index 3ebc172..3da8163 100644
--- a/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java
+++ b/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java
@@ -69,6 +69,7 @@
 		public int getSourceLineNumber() { return 1; }
 		public boolean isError() { return true; }
 		public boolean isWarning() { return false; }
+		public boolean isInfo() { return false; }
 		public void setSourceEnd(int sourceEnd) {/* not needed */}
 		public void setSourceLineNumber(int lineNumber)  {/* not needed */}
 		public void setSourceStart(int sourceStart) {/* not needed */}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java
index 69a4f05..f7501d8 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java
@@ -103,14 +103,6 @@
 	long compliance;
 	public static final long EXIT_VALUE_MASK = 0x00000000FFFFFFFFL;
 	public static final long ERROR_LOG_MASK =  0xFFFFFFFF00000000L;
-	private static final String[] jarsNames = new String[] {
-		"/lib/vm.jar",
-		"/lib/rt.jar",
-		"/lib/core.jar",
-		"/lib/security.jar",
-		"/lib/xml.jar",
-		"/lib/graphics.jar"
-	};
 	private String classpath;
 	JavacCompiler(String rootDirectoryPath) throws IOException, InterruptedException {
 		this(rootDirectoryPath, null);
@@ -163,11 +155,6 @@
 		this.minor = minorFromRawVersion(this.version, rawVersion);
 		this.rawVersion = rawVersion;
 		StringBuffer classpathBuffer = new StringBuffer(" -classpath ");
-		for (int i = 0, l = jarsNames.length; i < l; i++) {
-			classpathBuffer.append(rootDirectoryPath);
-			classpathBuffer.append(jarsNames[i]);
-			classpathBuffer.append(File.pathSeparator);
-		}
 		this.classpath = classpathBuffer.toString();
 	}
 	// projects known raw versions to minors; minors should grow with time, so
@@ -206,6 +193,12 @@
 			if ("1.8.0-ea".equals(rawVersion) || ("1.8.0".equals(rawVersion))) {
 				return 0000;
 			}
+			if ("1.8.0_40".equals(rawVersion)) {
+				return 1000; // corresponds to JLS maintenance release 2015-02-13
+			}
+			if ("1.8.0_60".equals(rawVersion)) {
+				return 1500;
+			}
 		}
 		throw new RuntimeException("unknown raw javac version: " + rawVersion);
 	}
@@ -1734,6 +1727,9 @@
 	if (newOptions.indexOf(" -d ") < 0) {
 		options.setCompilerOptions(newOptions.concat(" -d ."));
 	}
+	if (newOptions.indexOf(" -Xlint") < 0) {
+		options.setCompilerOptions(newOptions.concat(" -Xlint"));
+	}
 	String testName = testName();
 	Iterator compilers = javacCompilers.iterator();
 	while (compilers.hasNext()) {
@@ -3011,7 +3007,7 @@
 					version = version.substring(0, eol);
 					cmdLineHeader.append(" -d ");
 					cmdLineHeader.append(JAVAC_OUTPUT_DIR_NAME.indexOf(" ") != -1 ? "\"" + JAVAC_OUTPUT_DIR_NAME + "\"" : JAVAC_OUTPUT_DIR_NAME);
-					cmdLineHeader.append(" -source 1.5 -deprecation -Xlint:unchecked "); // enable recommended warnings
+					cmdLineHeader.append(" -source 1.5 -deprecation -Xlint "); // enable recommended warnings
 					// WORK new javac system does not do that... reconsider
 					// REVIEW consider enabling all warnings instead? Philippe does not see
 					//        this as ez to use (too many changes in logs)
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java
index 2bdac0c..2efbb3e 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java
@@ -11480,4 +11480,174 @@
 		"Type mismatch: cannot convert from RetentionPolicy[] to RetentionPolicy\n" + 
 		"----------\n");
 }
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=472178 
+public void test472178() throws Exception {
+	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
+		return; // Enough to run in 3 levels rather!
+	}
+	String source =
+			"import java.lang.annotation.ElementType;\n" + 
+			"import java.lang.annotation.Retention;\n" + 
+			"import java.lang.annotation.RetentionPolicy;\n" + 
+			"import java.lang.annotation.Target;\n" + 
+			"import java.util.ArrayList;\n" + 
+			"import java.util.Iterator;\n" + 
+			" \n" + 
+			"/**\n" + 
+			" * @author gglab\n" + 
+			" */\n" + 
+			"public class Test<X> extends ArrayList<X> {\n" + 
+			"    public void iterateRemove()\n" + 
+			"    {\n" + 
+			"        for (Iterator<X> iter = this.iterator(); iter.hasNext();) {\n" + 
+			"            Object key = iter.next();\n" + 
+			"            @Flowannotation\n" + 
+			"            Foo<@Flowannotation String> f = new Foo<String>();\n" + 
+			"            @Flowannotation long l = (@Flowannotation long)f.getI(); // this line causes parse error\n" + 
+			"            iter.remove();\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			" \n" + 
+			"    @Flowannotation\n" + 
+			"    class Foo<@Flowannotation T>\n" + 
+			"    {\n" + 
+			"        @Flowannotation\n" + 
+			"        public int getI()\n" + 
+			"        {\n" + 
+			"            return 3;\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			" \n" + 
+			"    @Target({ ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.METHOD, ElementType.LOCAL_VARIABLE,           ElementType.TYPE, ElementType.FIELD,\n" + 
+			"            ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})\n" + 
+			"    @Retention(RetentionPolicy.RUNTIME)\n" + 
+			"    @interface Flowannotation {}\n" + 
+			"    public static void main(String[] args) {}\n" + 
+			"}";
+	String expectedOutput =
+			"  // Method descriptor #6 ()V\n" + 
+			"  // Stack: 3, Locals: 6\n" + 
+			"  public void iterateRemove();\n" + 
+			"     0  aload_0 [this]\n" + 
+			"     1  invokevirtual Test.iterator() : Iterator [17]\n" + 
+			"     4  astore_1 [iter]\n" + 
+			"     5  goto 37\n" + 
+			"     8  aload_1 [iter]\n" + 
+			"     9  invokeinterface Iterator.next() : Object [21] [nargs: 1]\n" + 
+			"    14  astore_2 [key]\n" + 
+			"    15  new Test$Foo [27]\n" + 
+			"    18  dup\n" + 
+			"    19  aload_0 [this]\n" + 
+			"    20  invokespecial Test$Foo(Test) [29]\n" + 
+			"    23  astore_3 [f]\n" + 
+			"    24  aload_3 [f]\n" + 
+			"    25  invokevirtual Test$Foo.getI() : int [32]\n" + 
+			"    28  i2l\n" + 
+			"    29  lstore 4 [l]\n" + 
+			"    31  aload_1 [iter]\n" + 
+			"    32  invokeinterface Iterator.remove() : void [36] [nargs: 1]\n" + 
+			"    37  aload_1 [iter]\n" + 
+			"    38  invokeinterface Iterator.hasNext() : boolean [39] [nargs: 1]\n" + 
+			"    43  ifne 8\n" + 
+			"    46  return\n" + 
+			"      Line numbers:\n" + 
+			"        [pc: 0, line: 14]\n" + 
+			"        [pc: 8, line: 15]\n" + 
+			"        [pc: 15, line: 17]\n" + 
+			"        [pc: 24, line: 18]\n" + 
+			"        [pc: 31, line: 19]\n" + 
+			"        [pc: 37, line: 14]\n" + 
+			"        [pc: 46, line: 21]\n" + 
+			"      Local variable table:\n" + 
+			"        [pc: 0, pc: 47] local: this index: 0 type: Test\n" + 
+			"        [pc: 5, pc: 46] local: iter index: 1 type: Iterator\n" + 
+			"        [pc: 15, pc: 37] local: key index: 2 type: Object\n" + 
+			"        [pc: 24, pc: 37] local: f index: 3 type: Foo\n" + 
+			"        [pc: 31, pc: 37] local: l index: 4 type: long\n" + 
+			"      Local variable type table:\n" + 
+			"        [pc: 0, pc: 47] local: this index: 0 type: Test<X>\n" + 
+			"        [pc: 5, pc: 46] local: iter index: 1 type: Iterator<X>\n" + 
+			"        [pc: 24, pc: 37] local: f index: 3 type: String>\n" + 
+			"      Stack map table: number of frames 2\n" + 
+			"        [pc: 8, append: {Iterator}]\n" + 
+			"        [pc: 37, same]\n" + 
+			"    RuntimeVisibleTypeAnnotations: \n" + 
+			"      #55 @Flowannotation(\n" + 
+			"        target type = 0x47 CAST\n" + 
+			"        offset = 24\n" + 
+			"        type argument index = 0\n" + 
+			"      )\n" + 
+			"      #55 @Flowannotation(\n" + 
+			"        target type = 0x40 LOCAL_VARIABLE\n" + 
+			"        local variable entries:\n" + 
+			"          [pc: 24, pc: 37] index: 3\n" + 
+			"        location = [INNER_TYPE]\n" + 
+			"      )\n" + 
+			"      #55 @Flowannotation(\n" + 
+			"        target type = 0x40 LOCAL_VARIABLE\n" + 
+			"        local variable entries:\n" + 
+			"          [pc: 24, pc: 37] index: 3\n" + 
+			"        location = [INNER_TYPE, TYPE_ARGUMENT(0)]\n" + 
+			"      )\n" + 
+			"      #55 @Flowannotation(\n" + 
+			"        target type = 0x40 LOCAL_VARIABLE\n" + 
+			"        local variable entries:\n" + 
+			"          [pc: 31, pc: 37] index: 4\n" + 
+			"      )\n";
+	checkClassFile("Test", source, expectedOutput, ClassFileBytesDisassembler.DETAILED | ClassFileBytesDisassembler.COMPACT);
+}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=470665
+public void testBug470665() throws Exception {
+	if (this.complianceLevel <= ClassFileConstants.JDK1_7) {
+		return; // Enough to run in the last two levels!
+	}
+	boolean apt = this.enableAPT;
+	String[] sources = new String[] {
+			"A.java",
+			"public final class A {\n" +
+			"	String myString;\n" +
+			"	public interface B {\n" +
+			"		void test();\n" +
+			"	}\n" +
+			"	private final B b = new B() {\n" +
+			"		@Override\n" +
+			"		public void test() {}\n" +
+			"	}\n" +
+			"};\n" +
+			"}",
+			"B.java",
+			"public class B {\n" +
+			"	  private static class X {\n" +
+			"	    static final Object instance1;\n" +
+			"	    static {\n" +
+			"	      try {\n" +
+			"	        instance1 = new Object();\n" +
+			"	      } catch (Throwable e) {\n" +
+			"	        throw new AssertionError(e);\n" +
+			"	      }\n" +
+			"	    }\n" +
+			"	  }\n" +
+			"	  X x = new X();\n" +
+			"	  Object o = X.instance1;\n" +
+			"}"
+	};
+	try {
+		this.enableAPT = true;
+		runNegativeTest(sources,
+				"----------\n" + 
+				"1. ERROR in A.java (at line 10)\n" + 
+				"	};\n" + 
+				"	^\n" + 
+				"Syntax error on token \"}\", delete this token\n" + 
+				"----------\n" + 
+				"----------\n" + 
+				"1. WARNING in B.java (at line 12)\n" + 
+				"	X x = new X();\n" + 
+				"	      ^^^^^^^\n" + 
+				"Access to enclosing constructor B.X() is emulated by a synthetic accessor method\n" + 
+				"----------\n");
+	} finally {
+		this.enableAPT = apt;
+	}
+}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/FieldAccessTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/FieldAccessTest.java
index d8afbee..6953309 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/FieldAccessTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/FieldAccessTest.java
@@ -14,6 +14,7 @@
 
 import junit.framework.Test;
 
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 @SuppressWarnings({ "unchecked", "rawtypes" })
@@ -769,6 +770,26 @@
 		"The field B.field is hiding a field from type Interface\n" + 
 		"----------\n");
 }
+public void testBug361039() {
+	if (this.complianceLevel < ClassFileConstants.JDK1_5) return; // to leverage autounboxing
+	runNegativeTest(
+		new String[] {
+			"Bug361039.java",
+			"public class Bug361039 {\n" + 
+			"	public Bug361039(boolean b) {\n" + 
+			"	}\n" + 
+			"	private Object foo() {\n" + 
+			"		return new Bug361039(!((Boolean)this.f));\n" + 
+			"	}\n" + 
+			"}\n"
+		},
+		"----------\n" + 
+		"1. ERROR in Bug361039.java (at line 5)\n" + 
+		"	return new Bug361039(!((Boolean)this.f));\n" + 
+		"	                                     ^\n" + 
+		"f cannot be resolved or is not a field\n" + 
+		"----------\n");
+}
 public static Class testClass() {
 	return FieldAccessTest.class;
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
index 60fbfd6..c230094 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
@@ -16827,7 +16827,9 @@
 			"6. WARNING in X.java (at line 10)\n" + 
 			"	EnumSet<Enum> eSet = EnumSet.allOf(c);\n" + 
 			"	                                   ^\n" + 
-			"Type safety: The expression of type Class needs unchecked conversion to conform to Class<Enum>\n" + 
+			(this.complianceLevel < ClassFileConstants.JDK1_8
+			? "Type safety: The expression of type Class needs unchecked conversion to conform to Class<Enum>\n"
+			: "Type safety: The expression of type Class needs unchecked conversion to conform to Class<Enum<Enum<E>>>\n") + 
 			"----------\n");
 	}
 	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86838 - variation
@@ -32091,7 +32093,9 @@
 		"5. WARNING in X.java (at line 7)\n" +
 		"	Comparable c = newInstance2(x);\n" +
 		"	                            ^\n" +
-		"Type safety: The expression of type X needs unchecked conversion to conform to X<Comparable>\n" +
+		(this.complianceLevel < ClassFileConstants.JDK1_8
+		? "Type safety: The expression of type X needs unchecked conversion to conform to X<Comparable>\n"
+		: "Type safety: The expression of type X needs unchecked conversion to conform to X<Comparable<Comparable<B>>>\n") +
 		"----------\n" +
 		"6. ERROR in X.java (at line 9)\n" +
 		"	Zork z;\n" +
@@ -33467,7 +33471,9 @@
 			"4. WARNING in X.java (at line 9)\n" + 
 			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
 			"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
-			"Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<Number>[]\n" +
+			(this.complianceLevel < ClassFileConstants.JDK1_8
+			? "Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<Number>[]\n"
+			: "Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<Object>[]\n") +
 			"----------\n" + 
 			"5. ERROR in X.java (at line 14)\n" + 
 			"	Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" + 
@@ -33605,7 +33611,7 @@
 			"4. WARNING in X.java (at line 9)\n" + 
 			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
 			"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<? extends Number>[]\n" + 
+			"Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<? extends Object>[]\n" + 
 			"----------\n" + 
 			"5. WARNING in X.java (at line 14)\n" + 
 			"	Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" + 
@@ -50350,10 +50356,23 @@
 			"	^^^^^^^^^^^\n" + 
 			"Type safety: Unchecked invocation foo(List, IllegalArgumentException) of the generic method foo(List<U>, T) of type X\n" + 
 			"----------\n" +
-			"3. WARNING in X.java (at line 8)\n" + 
-			"	foo(l, iae);\n" + 
-			"	    ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n" + 
+			(this.complianceLevel < ClassFileConstants.JDK1_8
+			?
+				"3. WARNING in X.java (at line 8)\n" + 
+				"	foo(l, iae);\n" + 
+				"	    ^\n" + 
+				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"
+			:
+				"3. ERROR in X.java (at line 8)\n" + 
+				"	foo(l, iae);\n" + 
+				"	^^^^^^^^^^^\n" + 
+				"Unhandled exception type Throwable\n" + // new error since 1.8 (bug 473657)
+				"----------\n" + 
+				"4. WARNING in X.java (at line 8)\n" + 
+				"	foo(l, iae);\n" + 
+				"	    ^\n" + 
+				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"				
+			) +
 			"----------\n");
 }
 //https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
@@ -50385,10 +50404,23 @@
 			"	^^^^^^^^^^^^^\n" + 
 			"Type safety: Unchecked invocation X(List, IllegalArgumentException) of the generic constructor X(List<U>, T) of type X\n" + 
 			"----------\n" +
-			"3. WARNING in X.java (at line 8)\n" + 
-			"	new X(l, iae);\n" + 
-			"	      ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n" + 
+			(this.complianceLevel < ClassFileConstants.JDK1_8
+			?
+				"3. WARNING in X.java (at line 8)\n" + 
+				"	new X(l, iae);\n" + 
+				"	      ^\n" + 
+				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"
+			:
+				"3. ERROR in X.java (at line 8)\n" + 
+				"	new X(l, iae);\n" + 
+				"	^^^^^^^^^^^^^\n" + 
+				"Unhandled exception type Throwable\n" + // new error since 1.8 (bug 473657)
+				"----------\n" + 
+				"4. WARNING in X.java (at line 8)\n" + 
+				"	new X(l, iae);\n" + 
+				"	      ^\n" + 
+				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"				
+			) +
 			"----------\n");
 }
 //https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
@@ -50420,10 +50452,23 @@
 			"	^^^^^^^^^^^^^^^\n" + 
 			"Type safety: Unchecked invocation X(List, IllegalArgumentException) of the generic constructor X(List<U>, T) of type X\n" + 
 			"----------\n" +
-			"3. WARNING in X.java (at line 8)\n" + 
-			"	new X(l, iae){};\n" + 
-			"	      ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n" + 
+			(this.complianceLevel < ClassFileConstants.JDK1_8
+			?
+				"3. WARNING in X.java (at line 8)\n" + 
+				"	new X(l, iae){};\n" + 
+				"	      ^\n" + 
+				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"
+			:
+				"3. ERROR in X.java (at line 8)\n" + 
+				"	new X(l, iae){};\n" + 
+				"	^^^^^^^^^^^^^^^\n" + 
+				"Unhandled exception type Throwable\n" + // new error since 1.8 (bug 473657)
+				"----------\n" + 
+				"4. WARNING in X.java (at line 8)\n" + 
+				"	new X(l, iae){};\n" + 
+				"	      ^\n" + 
+				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"				
+			) +
 			"----------\n");
 }
 //https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
@@ -50446,7 +50491,6 @@
 				"	}\n" + 
 				"}\n",//-----------------------------------------------------------------------
 			},
-			(this.complianceLevel < ClassFileConstants.JDK1_8 ?
 			"----------\n" + 
 			"1. WARNING in X.java (at line 7)\n" + 
 			"	this((List) null, null);\n" + 
@@ -50487,44 +50531,7 @@
 			"	super((List)lu, t);\n" + 
 			"	       ^^^^\n" + 
 			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
-			"----------\n"
-			: // 1.8 infers T in this((List) null, null) to RuntimeException, hence no error here (2. above)
-			"----------\n" + 
-			"1. WARNING in X.java (at line 7)\n" + 
-			"	this((List) null, null);\n" + 
-			"	^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: Unchecked invocation X(List, null) of the generic constructor X(List<U>, T) of type X\n" + 
-			"----------\n" + 
-			"2. WARNING in X.java (at line 7)\n" + 
-			"	this((List) null, null);\n" + 
-			"	     ^^^^^^^^^^^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n" + 
-			"----------\n" + 
-			"3. WARNING in X.java (at line 7)\n" + 
-			"	this((List) null, null);\n" + 
-			"	      ^^^^\n" + 
-			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
-			"----------\n" + 
-			"4. WARNING in X.java (at line 12)\n" + 
-			"	super((List)lu, t);\n" + 
-			"	^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: Unchecked invocation X(List, T) of the generic constructor X(List<U>, T) of type X\n" + 
-			"----------\n" + 
-			"5. ERROR in X.java (at line 12)\n" + 
-			"	super((List)lu, t);\n" + 
-			"	^^^^^^^^^^^^^^^^^^^\n" + 
-			"Unhandled exception type Throwable\n" + 
-			"----------\n" + 
-			"6. WARNING in X.java (at line 12)\n" + 
-			"	super((List)lu, t);\n" + 
-			"	      ^^^^^^^^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n" + 
-			"----------\n" + 
-			"7. WARNING in X.java (at line 12)\n" + 
-			"	super((List)lu, t);\n" + 
-			"	       ^^^^\n" + 
-			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
-			"----------\n"));
+			"----------\n");
 }
 //https://bugs.eclipse.org/bugs/show_bug.cgi?id=260567
 public void test1440() {
@@ -50762,7 +50769,6 @@
 				"\n" + 
 				"}\n",
 			},
-			(this.complianceLevel < ClassFileConstants.JDK1_8 ?
 			"----------\n" + 
 			"1. WARNING in X.java (at line 8)\n" + 
 			"	static void bar(List l) {\n" + 
@@ -50792,12 +50798,16 @@
 			"6. WARNING in X.java (at line 9)\n" + 
 			"	new X(l).foo(l);\n" + 
 			"	      ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<Throwable>\n" + 
+			(this.complianceLevel < ClassFileConstants.JDK1_8
+			? "Type safety: The expression of type List needs unchecked conversion to conform to List<Throwable>\n"
+			: "Type safety: The expression of type List needs unchecked conversion to conform to List<RuntimeException>\n" ) +
 			"----------\n" + 
 			"7. WARNING in X.java (at line 9)\n" + 
 			"	new X(l).foo(l);\n" + 
 			"	             ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<Throwable>\n" + 
+			(this.complianceLevel < ClassFileConstants.JDK1_8
+			? "Type safety: The expression of type List needs unchecked conversion to conform to List<Throwable>\n"
+			: "Type safety: The expression of type List needs unchecked conversion to conform to List<RuntimeException>\n" ) +
 			"----------\n" + 
 			"8. WARNING in X.java (at line 11)\n" + 
 			"	static void baz(List l) throws IOException {\n" + 
@@ -50863,100 +50873,7 @@
 			"	new <IOException> X(l){}. <IOException> foo(l);\n" + 
 			"	                                            ^\n" + 
 			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
-			"----------\n"
-			: // 1.8 infers type parameters in throws clauses to RuntimeException, hence no errors
-			"----------\n" + 
-			"1. WARNING in X.java (at line 8)\n" + 
-			"	static void bar(List l) {\n" + 
-			"	                ^^^^\n" + 
-			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
-			"----------\n" + 
-			"2. WARNING in X.java (at line 9)\n" + 
-			"	new X(l).foo(l);\n" + 
-			"	^^^^^^^^\n" + 
-			"Type safety: Unchecked invocation X(List) of the generic constructor X(List<T>) of type X\n" + 
-			"----------\n" + 
-			"3. WARNING in X.java (at line 9)\n" + 
-			"	new X(l).foo(l);\n" + 
-			"	^^^^^^^^^^^^^^^\n" + 
-			"Type safety: Unchecked invocation foo(List) of the generic method foo(List<T>) of type X\n" + 
-			"----------\n" + 
-			"4. WARNING in X.java (at line 9)\n" + 
-			"	new X(l).foo(l);\n" + 
-			"	      ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<RuntimeException>\n" + 
-			"----------\n" + 
-			"5. WARNING in X.java (at line 9)\n" + 
-			"	new X(l).foo(l);\n" + 
-			"	             ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<RuntimeException>\n" + 
-			"----------\n" + 
-			"6. WARNING in X.java (at line 11)\n" + 
-			"	static void baz(List l) throws IOException {\n" + 
-			"	                ^^^^\n" + 
-			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
-			"----------\n" + 
-			"7. WARNING in X.java (at line 12)\n" + 
-			"	new <IOException> X(l). <IOException> foo(l);\n" + 
-			"	^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: Unchecked invocation X(List) of the generic constructor X(List<T>) of type X\n" + 
-			"----------\n" + 
-			"8. WARNING in X.java (at line 12)\n" + 
-			"	new <IOException> X(l). <IOException> foo(l);\n" + 
-			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: Unchecked invocation foo(List) of the generic method foo(List<T>) of type X\n" + 
-			"----------\n" + 
-			"9. WARNING in X.java (at line 12)\n" + 
-			"	new <IOException> X(l). <IOException> foo(l);\n" + 
-			"	                    ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
-			"----------\n" + 
-			"10. WARNING in X.java (at line 12)\n" + 
-			"	new <IOException> X(l). <IOException> foo(l);\n" + 
-			"	                                          ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
-			"----------\n" + 
-			"11. WARNING in X.java (at line 15)\n" + 
-			"	X(List l, long l2) throws IOException {\n" + 
-			"	  ^^^^\n" + 
-			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
-			"----------\n" + 
-			"12. WARNING in X.java (at line 16)\n" + 
-			"	<IOException> this(l);\n" + 
-			"	              ^^^^^^^^\n" + 
-			"Type safety: Unchecked invocation X(List) of the generic constructor X(List<T>) of type X\n" + 
-			"----------\n" + 
-			"13. WARNING in X.java (at line 16)\n" + 
-			"	<IOException> this(l);\n" + 
-			"	                   ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
-			"----------\n" + 
-			"14. WARNING in X.java (at line 19)\n" + 
-			"	static void baz2(List l) throws IOException {\n" + 
-			"	                 ^^^^\n" + 
-			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
-			"----------\n" + 
-			"15. WARNING in X.java (at line 20)\n" + 
-			"	new <IOException> X(l){}. <IOException> foo(l);\n" + 
-			"	^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: Unchecked invocation X(List) of the generic constructor X(List<T>) of type X\n" + 
-			"----------\n" + 
-			"16. WARNING in X.java (at line 20)\n" + 
-			"	new <IOException> X(l){}. <IOException> foo(l);\n" + 
-			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: Unchecked invocation foo(List) of the generic method foo(List<T>) of type X\n" + 
-			"----------\n" + 
-			"17. WARNING in X.java (at line 20)\n" + 
-			"	new <IOException> X(l){}. <IOException> foo(l);\n" + 
-			"	                    ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
-			"----------\n" + 
-			"18. WARNING in X.java (at line 20)\n" + 
-			"	new <IOException> X(l){}. <IOException> foo(l);\n" + 
-			"	                                            ^\n" + 
-			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
-			"----------\n"
-			));
+			"----------\n");
 }
 //https://bugs.eclipse.org/bugs/show_bug.cgi?id=202393
 public void test1446() {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java
index 30c5d06..3f85381 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java
@@ -5453,7 +5453,7 @@
 		"The method addUnique(Map.Entry) in the type EcoreEMap is not applicable for the arguments (Object)\n" + 
 		"----------\n");
 }
-public void testBug453253() {
+public void testBug454644() {
 	runNegativeTest(
 		new String[] {
 			"example/CollectionFactory.java",
@@ -5561,71 +5561,45 @@
 			"\n" + 
 			"}\n"
 		},
-		(this.complianceLevel < ClassFileConstants.JDK1_8 ?
-			"----------\n" + 
-			"1. WARNING in example\\CollectionFactory.java (at line 42)\n" + 
-			"	@SuppressWarnings({ \"unchecked\", \"cast\" })\n" + 
-			"	                                 ^^^^^^\n" + 
-			"Unnecessary @SuppressWarnings(\"cast\")\n" + 
-			"----------\n" + 
-			"2. WARNING in example\\CollectionFactory.java (at line 55)\n" + 
-			"	return EnumSet.copyOf((EnumSet) collection);\n" + 
-			"	                       ^^^^^^^\n" + 
-			"EnumSet is a raw type. References to generic type EnumSet<E> should be parameterized\n" + 
-			"----------\n" + 
-			"3. WARNING in example\\CollectionFactory.java (at line 87)\n" + 
-			"	return EnumSet.noneOf((Class) elementType);\n" + 
-			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: Unchecked invocation noneOf(Class) of the generic method noneOf(Class<E>) of type EnumSet\n" + 
-			"----------\n" + 
-			"4. WARNING in example\\CollectionFactory.java (at line 87)\n" + 
-			"	return EnumSet.noneOf((Class) elementType);\n" + 
-			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: The expression of type EnumSet needs unchecked conversion to conform to Collection<E>\n" + 
-			"----------\n" + 
-			"5. WARNING in example\\CollectionFactory.java (at line 87)\n" + 
-			"	return EnumSet.noneOf((Class) elementType);\n" + 
-			"	                      ^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: The expression of type Class needs unchecked conversion to conform to Class<E>\n" + 
-			"----------\n" + 
-			"6. WARNING in example\\CollectionFactory.java (at line 87)\n" + 
-			"	return EnumSet.noneOf((Class) elementType);\n" + 
-			"	                       ^^^^^\n" + 
-			"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
-			"----------\n" + 
-			"7. WARNING in example\\CollectionFactory.java (at line 94)\n" + 
-			"	return (Collection<E>) collectionClass.newInstance();\n" + 
-			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: Unchecked cast from capture#13-of ? to Collection<E>\n" + 
-			"----------\n"
-		:
-			"----------\n" + 
-			"1. ERROR in example\\CollectionFactory.java (at line 55)\n" + 
-			"	return EnumSet.copyOf((EnumSet) collection);\n" + 
-			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type mismatch: cannot convert from EnumSet<Enum<Enum<E>>> to Collection<E>\n" + 
-			"----------\n" + 
-			"2. WARNING in example\\CollectionFactory.java (at line 55)\n" + 
-			"	return EnumSet.copyOf((EnumSet) collection);\n" + 
-			"	                       ^^^^^^^\n" + 
-			"EnumSet is a raw type. References to generic type EnumSet<E> should be parameterized\n" + 
-			"----------\n" + 
-			"3. ERROR in example\\CollectionFactory.java (at line 87)\n" + 
-			"	return EnumSet.noneOf((Class) elementType);\n" + 
-			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type mismatch: cannot convert from EnumSet<Enum<Enum<E>>> to Collection<E>\n" + 
-			"----------\n" + 
-			"4. WARNING in example\\CollectionFactory.java (at line 87)\n" + 
-			"	return EnumSet.noneOf((Class) elementType);\n" + 
-			"	                       ^^^^^\n" + 
-			"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
-			"----------\n" + 
-			"5. WARNING in example\\CollectionFactory.java (at line 94)\n" + 
-			"	return (Collection<E>) collectionClass.newInstance();\n" + 
-			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Type safety: Unchecked cast from capture#13-of ? to Collection<E>\n" + 
-			"----------\n"
-			));
+		"----------\n" + 
+		"1. WARNING in example\\CollectionFactory.java (at line 42)\n" + 
+		"	@SuppressWarnings({ \"unchecked\", \"cast\" })\n" + 
+		"	                                 ^^^^^^\n" + 
+		"Unnecessary @SuppressWarnings(\"cast\")\n" + 
+		"----------\n" + 
+		"2. WARNING in example\\CollectionFactory.java (at line 55)\n" + 
+		"	return EnumSet.copyOf((EnumSet) collection);\n" + 
+		"	                       ^^^^^^^\n" + 
+		"EnumSet is a raw type. References to generic type EnumSet<E> should be parameterized\n" + 
+		"----------\n" + 
+		"3. WARNING in example\\CollectionFactory.java (at line 87)\n" + 
+		"	return EnumSet.noneOf((Class) elementType);\n" + 
+		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+		"Type safety: Unchecked invocation noneOf(Class) of the generic method noneOf(Class<E>) of type EnumSet\n" + 
+		"----------\n" + 
+		"4. WARNING in example\\CollectionFactory.java (at line 87)\n" + 
+		"	return EnumSet.noneOf((Class) elementType);\n" + 
+		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+		"Type safety: The expression of type EnumSet needs unchecked conversion to conform to Collection<E>\n" + 
+		"----------\n" + 
+		"5. WARNING in example\\CollectionFactory.java (at line 87)\n" + 
+		"	return EnumSet.noneOf((Class) elementType);\n" + 
+		"	                      ^^^^^^^^^^^^^^^^^^^\n" + 
+		(this.complianceLevel < ClassFileConstants.JDK1_8 
+		? "Type safety: The expression of type Class needs unchecked conversion to conform to Class<E>\n"
+		: "Type safety: The expression of type Class needs unchecked conversion to conform to Class<Enum<Enum<E>>>\n") + 
+		"----------\n" + 
+		"6. WARNING in example\\CollectionFactory.java (at line 87)\n" + 
+		"	return EnumSet.noneOf((Class) elementType);\n" + 
+		"	                       ^^^^^\n" + 
+		"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
+		"----------\n" + 
+		"7. WARNING in example\\CollectionFactory.java (at line 94)\n" + 
+		"	return (Collection<E>) collectionClass.newInstance();\n" + 
+		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+		"Type safety: Unchecked cast from capture#13-of ? to Collection<E>\n" + 
+		"----------\n"
+		);
 }
 // original test case, documenting existing compiler behavior
 public void testBug456459a() {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
index ea993b2..42089e6 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
@@ -5492,4 +5492,168 @@
 		"missing cannot be resolved\n" + 
 		"----------\n");
 }
+public void testBug471280_comment0() {
+	runConformTest(
+		new String[] {
+			"Test0.java",
+			"import java.util.*;\n" + 
+			"import java.util.function.*;\n" + 
+			"import java.util.concurrent.*;\n" + 
+			"\n" + 
+			"public class Test0 {\n" + 
+			"  public CompletableFuture<List<String>> does_not_compile() throws Exception {\n" + 
+			"    CompletableFuture<List<String>> firstAsync = new CompletableFuture<>();\n" + 
+			"    firstAsync.complete(Collections.singletonList(\"test\"));\n" + 
+			"    // The following line gives error \"Type mismatch: cannot convert from CompletableFuture<Object> to CompletableFuture<List<String>>\"\n" + 
+			"    return transform(firstAsync, first -> Collections.singletonList(first.get(0)));\n" + 
+			"  }\n" + 
+			"\n" + 
+			"  public CompletableFuture<List<String>> does_compile() throws Exception {\n" + 
+			"    CompletableFuture<List<String>> firstAsync = new CompletableFuture<>();\n" + 
+			"    firstAsync.complete(Collections.singletonList(\"test\"));\n" + 
+			"    return transform(firstAsync, first -> {\n" + 
+			"      return Collections.singletonList(first.get(0));\n" + 
+			"    });\n" + 
+			"  }\n" + 
+			"\n" + 
+			"  public <T, R> CompletableFuture<R> transform(CompletableFuture<T> future, Function<T, R> fun) throws Exception {\n" + 
+			"    return future.thenApply(fun);\n" + 
+			"  }\n" + 
+			"}\n"
+		});
+}
+public void testBug471280_comment3() {
+	runConformTest(
+		new String[] {
+			"Test3.java",
+			"import java.util.*;\n" + 
+			"import java.util.stream.*;\n" + 
+			"\n" + 
+			"public class Test3 {\n" + 
+			"    public <T> T generic(T value) {\n" + 
+			"        return value;\n" + 
+			"    }\n" + 
+			"\n" + 
+			"    public void mapExample(Map<String, String> input) {\n" + 
+			"        // does not compile with ejc: Type mismatch: cannot convert from Map<Object,Object> to Map<String,String>\n" + 
+			"        Map<String, String> mapped = input.entrySet()\n" + 
+			"            .stream()\n" + 
+			"            .collect(Collectors.toMap(e -> e.getKey(), e -> generic(e.getValue())));\n" + 
+			"    }\n" + 
+			"}\n"
+		});
+}
+public void testBug464496() {
+	runConformTest(
+		new String[] {
+			"Value.java",
+			"public class Value<V> {\n" + 
+			"    private final V value;\n" + 
+			"    public Value(V value) {\n" + 
+			"        this.value = value;\n" + 
+			"    }\n" + 
+			"    public V get() {\n" + 
+			"        return value;\n" + 
+			"    }\n" + 
+			"    public static <V> V getValue(Value<V> value) {\n" + 
+			"        return value.get();\n" + 
+			"    }\n" + 
+			"    public static void main(String[] args) {\n" + 
+			"        Value<Integer> intValue = new Value<>(42);\n" + 
+			"        long longPrimitive = getValue(intValue); // fails in 1.8 compiler \n" + 
+			"        System.out.println(longPrimitive);\n" + 
+			"    }\n" + 
+			"}\n"
+		},
+		"42");
+}
+public void testBug473657() {
+	runConformTest(
+		new String[] {
+			"T2.java",
+			"interface I<T> {\n" + 
+			"}\n" + 
+			"\n" + 
+			"@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n" + 
+			"abstract class T1<T> implements I<T> {\n" + 
+			"    public I<T> t(I<? extends Number> l2) {\n" + 
+			"        return T2.m((I) this, (I) l2);\n" + 
+			"    }\n" + 
+			"    public I<T> t(Number l2) {\n" + 
+			"        return T2.m((I) this, (I) T2.t(l2));\n" + 
+			"    }\n" + 
+			"}\n" + 
+			"\n" + 
+			"public abstract class T2 {\n" + 
+			"    public static <T> I<T> t(T t) {\n" + 
+			"        return null;\n" + 
+			"    }\n" + 
+			"    public static <T extends Number> I<T> m(I<T> l1, I<? extends Number> l2) {\n" + 
+			"        return null;\n" + 
+			"    }\n" + 
+			"    public static <T extends Number> I<T> m(T l1, Number l2) {\n" + 
+			"        return null;\n" + 
+			"    }\n" + 
+			"}\n"
+		});
+}
+public void testBug478848() {
+	runNegativeTest(
+		new String[] {
+			"InferenceBug.java",
+			"import java.util.Optional;\n" + 
+			"public class InferenceBug {\n" + 
+			"    \n" + 
+			"    static class Wrapper<T> {\n" + 
+			"        T value;\n" + 
+			"        public T getValue() {\n" + 
+			"            return null;\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			"    \n" + 
+			"    static class C1 {\n" + 
+			"        //an optional array of String wrappers\n" + 
+			"        public Optional<? extends Wrapper<String>[]> optionalArrayOfStringWrappers() {\n" + 
+			"            return Optional.empty();\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			"    \n" + 
+			"    public static void main(String[] args) {\n" + 
+			"        C1 c1 = new C1();\n" + 
+			"        for (Wrapper<String> attribute: c1.optionalArrayOfStringWrappers().get()) {\n" + 
+			"            // error in previous line:\n" + 
+			"            // Can only iterate over an array or an instance of java.lang.Iterable\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			"}\n"
+		},
+		"----------\n" + 
+		"1. ERROR in InferenceBug.java (at line 20)\n" + 
+		"	for (Wrapper<String> attribute: c1.optionalArrayOfStringWrappers().get()) {\n" + 
+		"	                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+		"Can only iterate over an array or an instance of java.lang.Iterable\n" + 
+		"----------\n");
+}
+public void testBug479167() {
+	runConformTest(
+		new String[] {
+			"ToArray.java",
+			"import java.io.Serializable;\n" + 
+			"interface ArrayFunction<E> {\n" + 
+			"	<S extends E> E[] apply(@SuppressWarnings(\"unchecked\") S... es);\n" + 
+			"}\n" + 
+			"public class ToArray<E extends Cloneable & Serializable> implements ArrayFunction<E> {\n" + 
+			"	public final @SafeVarargs @Override <S extends E> E[] apply(S... es) {\n" + 
+			"		return es;\n" + 
+			"	}\n" + 
+			"\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		ArrayFunction<String[]> toArray = new ToArray<>();\n" + 
+			"		String[][] array = toArray.apply(args);\n" + 
+			"		System.out.print(array.getClass().getName());\n" + 
+			"	}\n" + 
+			"}\n"
+		},
+		"[[Ljava.lang.String;");
+}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InterfaceMethodsTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InterfaceMethodsTest.java
index ca9fc45..bd96e34 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InterfaceMethodsTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InterfaceMethodsTest.java
@@ -2841,4 +2841,170 @@
 				"}"
 			});
 	}
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
+	public void test477891_comment0() throws Exception {
+		this.runNegativeTest(
+			new String[] {
+				"D.java",
+				"interface A {\n" + 
+				"    public default void display() {\n" +
+				"        System.out.println(\"Display from A\");\n" + 
+				"    }\n" + 
+				"}\n" + 
+				"interface B extends A {\n" + 
+				"	@Override\n" +
+				"    public default void display() {\n" + 
+				"        System.out.println(\"Display from B\");\n" + 
+				"    }\n" + 
+				"}\n" + 
+				"interface C extends A {\n" + 
+				"	@Override\n" +
+				"    public void display();\n" + 
+				"}\n" + 
+				"public interface D extends B, C {\n" + 
+				"}\n"
+			},
+			"----------\n" +
+			"1. ERROR in D.java (at line 16)\n" +
+			"	public interface D extends B, C {\n" +
+			"	                 ^\n" +
+			"The default method display() inherited from B conflicts with another method inherited from C\n" +
+			"----------\n");
+	}
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
+	public void test477891_comment0_a() throws Exception {
+		this.runNegativeTest(
+			new String[] {
+				"D.java",
+				"interface A {\n" + 
+				"    public default void display() {\n" + 
+				"        System.out.println(\"Display from A\");\n" + 
+				"    }\n" + 
+				"}\n" + 
+				"interface B extends A {\n" + 
+				"	@Override\n" +
+				"    public default void display() {\n" + 
+				"        System.out.println(\"Display from B\");\n" + 
+				"    }\n" + 
+				"}\n" + 
+				"interface C extends A {\n" + 
+				"	@Override\n" +
+				"    public void display();\n" + 
+				"}\n" + 
+				"public interface D extends C, B {\n" + 
+				"}\n"
+			},
+			"----------\n" +
+			"1. ERROR in D.java (at line 16)\n" +
+			"	public interface D extends C, B {\n" +
+			"	                 ^\n" +
+			"The default method display() inherited from B conflicts with another method inherited from C\n" +
+			"----------\n");
+	}
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
+	public void test477891_comment3_a() throws Exception {
+		this.runNegativeTest(
+			new String[] {
+				"Z.java",
+				"import java.util.*;\n" + 
+				"interface Z<E> extends X<E>, Y<E> {\n" + 
+				"}\n" + 
+				"interface Y<E> extends AB<E> {\n" + 
+				"	@Override\n" +
+				"	default Spliterator<E> spliterator() { return null; };\n" + 
+				"}\n" + 
+				"interface X<E> extends AB<E> {\n" + 
+				"	@Override\n" +
+				"	Spliterator<E> spliterator();\n" + 
+				"}\n" + 
+				"interface AB<E> {\n" + 
+				"	default Spliterator<E> spliterator() { return null; }\n" + 
+				"}\n" 
+			},
+			"----------\n" +
+			"1. ERROR in Z.java (at line 2)\n" +
+			"	interface Z<E> extends X<E>, Y<E> {\n" +
+			"	          ^\n" +
+			"The default method spliterator() inherited from Y<E> conflicts with another method inherited from X<E>\n" +
+			"----------\n");
+	}
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
+	public void test477891_comment3_b() throws Exception {
+		this.runNegativeTest(
+			new String[] {
+				"Z.java",
+				"import java.util.*;\n" + 
+				"interface Z<E> extends Y<E>, X<E> {\n" + 
+				"}\n" + 
+				"interface Y<E> extends AB<E> {\n" + 
+				"	@Override\n" +
+				"	default Spliterator<E> spliterator() { return null; };\n" + 
+				"}\n" + 
+				"interface X<E> extends AB<E> {\n" + 
+				"	@Override\n" +
+				"	Spliterator<E> spliterator();\n" + 
+				"}\n" + 
+				"interface AB<E> {\n" + 
+				"	default Spliterator<E> spliterator() { return null; }\n" + 
+				"}\n" 
+			},
+			"----------\n" +
+			"1. ERROR in Z.java (at line 2)\n" +
+			"	interface Z<E> extends Y<E>, X<E> {\n" +
+			"	          ^\n" +
+			"The default method spliterator() inherited from Y<E> conflicts with another method inherited from X<E>\n" +
+			"----------\n");
+	}
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
+		public void test477891_comment3_c() throws Exception {
+			this.runNegativeTest(
+				new String[] {
+					"Z.java",
+					"import java.util.*;\n" + 
+					"interface Z<E> extends X<E>, Y<E> {\n" + 
+					"}\n" + 
+					"interface Y<E> extends AB<E> {\n" + 
+					"	@Override\n" +
+					"	default Spliterator<E> spliterator() { return null; };\n" + 
+					"}\n" + 
+					"interface X<E> {\n" + 
+					"	Spliterator<E> spliterator();\n" + 
+					"}\n" + 
+					"interface AB<E> {\n" + 
+					"	default Spliterator<E> spliterator() { return null; }\n" + 
+					"}\n" 
+				},
+				"----------\n" +
+				"1. ERROR in Z.java (at line 2)\n" +
+				"	interface Z<E> extends X<E>, Y<E> {\n" +
+				"	          ^\n" +
+				"The default method spliterator() inherited from Y<E> conflicts with another method inherited from X<E>\n" +
+				"----------\n");
+		}
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
+		public void test477891_comment3_d() throws Exception {
+			this.runNegativeTest(
+				new String[] {
+					"Z.java",
+					"import java.util.*;\n" + 
+					"interface Z<E> extends Y<E>, X<E> {\n" + 
+					"}\n" + 
+					"interface Y<E> extends AB<E> {\n" + 
+					"	@Override\n" +
+					"	default Spliterator<E> spliterator() { return null; };\n" + 
+					"}\n" + 
+					"interface X<E> {\n" + 
+					"	Spliterator<E> spliterator();\n" + 
+					"}\n" + 
+					"interface AB<E> {\n" + 
+					"	default Spliterator<E> spliterator() { return null; }\n" + 
+					"}\n" 
+				},
+				"----------\n" +
+				"1. ERROR in Z.java (at line 2)\n" +
+				"	interface Z<E> extends Y<E>, X<E> {\n" +
+				"	          ^\n" +
+				"The default method spliterator() inherited from Y<E> conflicts with another method inherited from X<E>\n" +
+				"----------\n");
+		}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaRegressionTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaRegressionTest.java
index 7e1b888..ea3ac35 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaRegressionTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaRegressionTest.java
@@ -360,6 +360,11 @@
 	"	.forEach(entry -> test() ? bad() : returnType());\n" + 
 	"	 ^^^^^^^\n" + 
 	"The method forEach(Consumer<? super Map.Entry<Object,Object>>) in the type Iterable<Map.Entry<Object,Object>> is not applicable for the arguments ((<no type> entry) -> {})\n" + 
+	"----------\n" + 
+	"2. ERROR in X.java (at line 6)\n" + 
+	"	.forEach(entry -> test() ? bad() : returnType());\n" + 
+	"	                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+	"Invalid expression as statement\n" +
 	"----------\n");
 }
 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=449824, [1.8] Difference in behaviour with method references and lambdas  
@@ -810,6 +815,11 @@
 	"	r.accept((l) -> (doItOnTheClass(new Object())));\n" + 
 	"	  ^^^^^^\n" + 
 	"The method accept(Test.Listener) in the type Test.Receiver is not applicable for the arguments ((<no type> l) -> {})\n" +
+	"----------\n" + 
+	"2. ERROR in Test.java (at line 4)\n" + 
+	"	r.accept((l) -> (doItOnTheClass(new Object())));\n" + 
+	"	                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+	"Invalid expression as statement\n" +
 	"----------\n");
 }
 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=463526
@@ -912,6 +922,85 @@
 	},
 	"");
 }
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477888
+// [1.8][compiler] Compiler silently produces garbage but editor shows no errors
+public void testBug477888() {
+	runNegativeTest(new String [] {
+		"Test.java",
+		"import java.io.IOException;\n" + 
+		"import java.nio.file.Files;\n" + 
+		"import java.nio.file.Paths;\n" + 
+		"import java.util.function.Consumer;\n" + 
+		"public class Test {\n" + 
+		"	public static void main(String[] args) throws IOException {\n" + 
+		"		Files.lines(Paths.get(args[0])).filter(x -> {return !x.startsWith(\".\");}).forEach(printMe());\n" + 
+		"	}\n" + 
+		"	private static Consumer<String> printMe() {\n" + 
+		"		return x -> x.isEmpty() ? System.out.println() : System.out.println(getIndex() + \" \" + x); // error must be reported here!\n" + 
+		"	}\n" + 
+		"	static int idx;\n" + 
+		"\n" + 
+		"	private static int getIndex() {\n" + 
+		"		return ++idx;\n" + 
+		"	}\n" + 
+		"}\n"
+	},
+	"----------\n" + 
+	"1. ERROR in Test.java (at line 10)\n" + 
+	"	return x -> x.isEmpty() ? System.out.println() : System.out.println(getIndex() + \" \" + x); // error must be reported here!\n" + 
+	"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+	"Invalid expression as statement\n" + 
+	"----------\n");
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=472648
+// [compiler][1.8] Lambda expression referencing method with generic type has incorrect compile errors
+public void testBug472648() {
+	runNegativeTest(new String [] {
+		"Test.java",
+		"import java.util.ArrayList;\n" + 
+		"import java.util.List;\n" + 
+		"import java.util.function.Consumer;\n" + 
+		"public class Test {\n" + 
+		"	public static void main(String argv[]) {\n" + 
+		"		new Test();\n" + 
+		"	}\n" + 
+		"	public Test() {\n" + 
+		"		List<Number> numList = new ArrayList<>();\n" + 
+		"		numList.add(1);\n" + 
+		"		numList.add(1.5);\n" + 
+		"		numList.add(2);\n" + 
+		"		numList.add(2.5);\n" + 
+		"		forEachValueOfType(numList, Integer.class, (Integer i) -> (System.out.println(Integer.toString(i))));\n" + 
+		"	}\n" + 
+		"	private <T> void forEachValueOfType(List<?> list, Class<T> type, Consumer<T> action) {\n" + 
+		"		\n" + 
+		"		for (Object o : list) {\n" + 
+		"			if (type.isAssignableFrom(o.getClass())) {\n" + 
+		"				@SuppressWarnings(\"unchecked\")\n" + 
+		"				T convertedObject = (T) o;\n" + 
+		"				action.accept(convertedObject);\n" + 
+		"			}\n" + 
+		"		}\n" + 
+		"	}\n" + 
+		"}"
+	},
+	"----------\n" + 
+	"1. ERROR in Test.java (at line 14)\n" + 
+	"	forEachValueOfType(numList, Integer.class, (Integer i) -> (System.out.println(Integer.toString(i))));\n" + 
+	"	^^^^^^^^^^^^^^^^^^\n" + 
+	"The method forEachValueOfType(List<?>, Class<T>, Consumer<T>) in the type Test is not applicable for the arguments (List<Number>, Class<Integer>, (Integer i) -> {})\n" +
+	"----------\n" + 
+	"2. ERROR in Test.java (at line 14)\n" + 
+	"	forEachValueOfType(numList, Integer.class, (Integer i) -> (System.out.println(Integer.toString(i))));\n" + 
+	"	                                            ^^^^^^^\n" + 
+	"Incompatible type specified for lambda expression's parameter i\n" + 
+	"----------\n" + 
+	"3. ERROR in Test.java (at line 14)\n" + 
+	"	forEachValueOfType(numList, Integer.class, (Integer i) -> (System.out.println(Integer.toString(i))));\n" + 
+	"	                                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+	"Invalid expression as statement\n" + 
+	"----------\n");
+}
 public static Class testClass() {
 	return LambdaRegressionTest.class;
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/MethodParametersAttributeTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/MethodParametersAttributeTest.java
index 2bb7707..dd5e3ea 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/MethodParametersAttributeTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/MethodParametersAttributeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013, 2014 Jesper Steen Moeller and others.
+ * Copyright (c) 2013, 2015 Jesper Steen Moeller 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
@@ -874,6 +874,65 @@
 			"        final synthetic this$1\n";
 		assertSubstring(actualOutput, expectedOutput);
 	}
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=476528
+	public void test016() throws Exception {
+		// Test that the name argument of enum valueOf shows up as mandated
+		
+		this.runParameterNameTest(
+			"Foo.java",
+			"public enum Foo {\n" + 
+			"	BAR;\n" +
+			"   public static Foo valueOf(int intParameter) {\n" + 
+			"		return BAR;\n" +
+			"   }\n" + 
+			"   public static Foo valueOf2(int intParameter) {\n" + 
+			"		return BAR;\n" +
+			"   } \n" + 
+			"}\n");
+
+		ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
+		String path = OUTPUT_DIR + File.separator + "Foo.class";
+		byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(path));
+		String actualOutput =
+			disassembler.disassemble(
+				classFileBytes,
+				"\n",
+				ClassFileBytesDisassembler.DETAILED);
+
+		String expectedOutput =
+			"  // Stack: 1, Locals: 1\n" + 
+			"  public static Foo valueOf(int intParameter);\n" + 
+			"    0  getstatic Foo.BAR : Foo [17]\n" + 
+			"    3  areturn\n" + 
+			"      Line numbers:\n" + 
+			"        [pc: 0, line: 4]\n" + 
+			"      Method Parameters:\n" + 
+			"        intParameter\n" + 
+			"  \n" + 
+			"  // Method descriptor #27 (I)LFoo;\n" + 
+			"  // Stack: 1, Locals: 1\n" + 
+			"  public static Foo valueOf2(int intParameter);\n" + 
+			"    0  getstatic Foo.BAR : Foo [17]\n" + 
+			"    3  areturn\n" + 
+			"      Line numbers:\n" + 
+			"        [pc: 0, line: 7]\n" + 
+			"      Method Parameters:\n" + 
+			"        intParameter\n"; 
+		assertSubstring(actualOutput, expectedOutput);
+		// Test that synthetic method gets the right parameter names
+		expectedOutput =
+				"  public static Foo valueOf(java.lang.String name);\n" + 
+				"     0  ldc <Class Foo> [1]\n" + 
+				"     2  aload_0 [name]\n" + 
+				"     3  invokestatic java.lang.Enum.valueOf(java.lang.Class, java.lang.String) : java.lang.Enum [39]\n" + 
+				"     6  checkcast Foo [1]\n" + 
+				"     9  areturn\n" + 
+				"      Line numbers:\n" + 
+				"        [pc: 0, line: 1]\n" + 
+				"      Method Parameters:\n" + 
+				"        mandated name\n"; 
+			assertSubstring(actualOutput, expectedOutput);
+	}
 
 	private void runParameterNameTest(String fileName, String body) {
 		Map compilerOptions = getCompilerOptions();
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/MethodVerifyTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/MethodVerifyTest.java
index a0f73bc..1c11f10 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/MethodVerifyTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/MethodVerifyTest.java
@@ -14134,4 +14134,75 @@
 		assertEquals("Wrong contents", expectedOutput, result);
 	}
 }
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=469454, The compiler generates wrong code during inheritance
+public void testBug469454() throws Exception {
+	this.runConformTest(
+		new String[] {
+			"TestClass.java",
+			"public class TestClass {\n" + 
+			"    public static class A {\n" + 
+			"        public static A method() {\n" + 
+			"            return null;\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			"    public static class B extends A {\n" + 
+			"        public static B method() {\n" + 
+			"            return null;\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			"    public static void main(String[] args) {\n" + 
+			"        System.out.println(B.class.getDeclaredMethods().length);\n" + 
+			"    }\n" + 
+			"}\n",
+		},
+		"1");
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=469454, The compiler generates wrong code during inheritance
+public void testBug469454a() throws Exception {
+	this.runNegativeTest(
+		new String[] {
+			"TestClass.java",
+			"public class TestClass {\n" + 
+			"    public static class A {\n" + 
+			"        public final A method() {\n" + 
+			"            return null;\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			"    public static class B extends A {\n" + 
+			"        @Override\n" + 
+			"        public B method() {\n" + 
+			"            return null;\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			"    public static void main(String[] args) {\n" + 
+			"        System.out.println(B.class.getDeclaredMethods().length);\n" + 
+			"    }\n" + 
+			"}\n",
+		},
+		"----------\n" + 
+		"1. ERROR in TestClass.java (at line 9)\n" + 
+		"	public B method() {\n" + 
+		"	         ^^^^^^^^\n" + 
+		"Cannot override the final method from TestClass.A\n" + 
+		"----------\n",
+		null,
+		true,
+		null,
+		true,
+		false,
+		false);
+	String expectedOutput = "  public bridge synthetic TestClass.A method();";
+
+	File f = new File(OUTPUT_DIR + File.separator + "TestClass$B.class");
+	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
+	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
+	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
+	int index = result.indexOf(expectedOutput);
+	if (index != -1 || expectedOutput.length() == 0) {
+		System.out.println(Util.displayString(result, 3));
+	}
+	if (index != -1) {
+		assertEquals("Wrong contents", expectedOutput, result);
+	}
+}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java
index 5cc5e96..ef189dd 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java
@@ -8286,4 +8286,226 @@
 		getCompilerOptions(),

 		"");

 }

+public void testBug474239() {

+	Map options = getCompilerOptions();

+	options.put(JavaCore.COMPILER_PB_REDUNDANT_NULL_CHECK, JavaCore.ERROR);

+	options.put(JavaCore.COMPILER_PB_SYNTACTIC_NULL_ANALYSIS_FOR_FIELDS, JavaCore.ENABLED);

+	runConformTestWithLibs(

+		new String[] {

+			"Test.java",

+			"public class Test {\n" + 

+			"	static String s1 = null, s2 = null;\n" + 

+			"\n" + 

+			"	public static void main(String[] args) {\n" + 

+			"		int val = (int) System.currentTimeMillis();\n" + 

+			"		switch (val % 2) {\n" + 

+			"		case 0:\n" + 

+			"			if (s1 != null)\n" + 

+			"				s2 = \"\";\n" + 

+			"			break;\n" + 

+			"		case 1:\n" + 

+			"			if (s1 != null) // compiler thinks s1 is never null at this point\n" + 

+			"				throw new RuntimeException(\"\");\n" + 

+			"			break;\n" + 

+			"		}\n" + 

+			"	}\n" + 

+			"}\n"

+		},

+		options,

+		"");

+}

+public void testBug474239b() {

+	Map options = getCompilerOptions();

+	options.put(JavaCore.COMPILER_PB_REDUNDANT_NULL_CHECK, JavaCore.ERROR);

+	options.put(JavaCore.COMPILER_PB_SYNTACTIC_NULL_ANALYSIS_FOR_FIELDS, JavaCore.ENABLED);

+	runConformTestWithLibs(

+		new String[] {

+			"Test.java",

+			"public class Test {\n" + 

+			"	static String s2 = null;\n" + 

+			"\n" + 

+			"	public static void main(String[] args) {\n" + 

+			"		int val = (int) System.currentTimeMillis();\n" + 

+			"		switch (val % 2) {\n" + 

+			"		case 0:\n" + 

+			"			s2 = \"\";\n" + 

+			"			break;\n" + 

+			"		case 1:\n" + 

+			"			if (s2 != null)\n" + 

+			"				throw new RuntimeException(\"\");\n" + 

+			"			break;\n" + 

+			"		}\n" + 

+			"	}\n" + 

+			"}\n"

+		},

+		options,

+		"");

+}

+public void testBug472663() {

+	runConformTestWithLibs(

+		new String[] {

+			"test/Callee.java",

+			"package test;\n" + 

+			"\n" + 

+			"import org.eclipse.jdt.annotation.NonNullByDefault;\n" + 

+			"\n" + 

+			"@NonNullByDefault\n" + 

+			"public class Callee {\n" + 

+			"	public static String staticOtherClass(String foo) {\n" + 

+			"		return foo;\n" + 

+			"	}\n" + 

+			"\n" + 

+			"	public String instanceOtherClass(String foo) {\n" + 

+			"		return foo;\n" + 

+			"	}\n" + 

+			"}\n"

+		},

+		getCompilerOptions(),

+		"");

+	// and now consume Callee.class:

+	runConformTestWithLibs(

+		new String[] {

+			"test/Caller.java",

+			"package test;\n" + 

+			"\n" + 

+			"import java.util.function.Function;\n" + 

+			"\n" + 

+			"import org.eclipse.jdt.annotation.NonNullByDefault;\n" + 

+			"\n" + 

+			"@NonNullByDefault\n" + 

+			"public class Caller {\n" + 

+			"	public void foo(final Callee callee) {\n" + 

+			"		Function<String, String> function;\n" + 

+			"\n" + 

+			"		// assignments with warnings (wrong):\n" + 

+			"		function = Callee::staticOtherClass;\n" + 

+			"		function = callee::instanceOtherClass;\n" + 

+			"\n" + 

+			"		// assignments with no warnings (ok):\n" + 

+			"		function = foo -> Callee.staticOtherClass(foo);\n" + 

+			"		function = foo -> callee.instanceOtherClass(foo);\n" + 

+			"		function = Caller::staticSameClass;\n" + 

+			"		function = this::instanceSameClass;\n" + 

+			"	}\n" + 

+			"\n" + 

+			"	public static String staticSameClass(String foo) {\n" + 

+			"		return foo;\n" + 

+			"	}\n" + 

+			"\n" + 

+			"	public String instanceSameClass(String foo) {\n" + 

+			"		return foo;\n" + 

+			"	}\n" + 

+			"}\n"

+		},

+		getCompilerOptions(),

+		"");

+}

+public void testBug467094() {

+	runConformTestWithLibs(

+		new String[] {

+			"A.java",

+			"class A {;\n"+

+			"   @org.eclipse.jdt.annotation.NonNull String @org.eclipse.jdt.annotation.Nullable [] x;\n"+

+			"}\n"

+		}, 

+		getCompilerOptions(), 

+		"");

+}

+public void testBug467094_local() {

+	runNegativeTestWithLibs(

+		new String[] {

+			"X.java",

+			"public class X {\n"+

+			"	void foo(@org.eclipse.jdt.annotation.NonNull Object[] o) {\n"+

+			"		o.hashCode();\n"+

+			"		if (o != null) {\n"+

+			"			System.out.print(o.toString());\n"+

+			"		}\n"+

+			"	}\n"+

+			"}\n"

+		},

+		getCompilerOptions(), 

+		"----------\n"+

+		"1. ERROR in X.java (at line 4)\n" +

+		"	if (o != null) {\n" +

+		"	    ^\n" +

+		"Redundant null check: The variable o cannot be null at this location\n" +

+		"----------\n");

+}

+public void testBug467094_method() {

+	runConformTestWithLibs(

+			new String[] {

+				"A.java",

+				"class A {;\n"+

+				"	@org.eclipse.jdt.annotation.NonNull String @org.eclipse.jdt.annotation.Nullable [] m(){\n" +

+				"		return null;\n" +

+				"	}\n" +

+				"	int usage(){\n" +

+				"		if(m() == null) return 1; \n" +

+				"		return 0; \n" +

+				"	}\n"+

+				"}\n"

+			}, getCompilerOptions(), "");

+}

+public void testBug440398() {

+	runConformTestWithLibs(

+		new String[] { 

+			"NullTest.java",

+			"import org.eclipse.jdt.annotation.*;\n" +

+			"@NonNullByDefault({})\r\n" + 

+			"public class NullTest {\r\n" + 

+			"    public static @NonNull Object[] obj = null;\r\n" + 

+			"    public static void main(String[] args) {\r\n" + 

+			"        obj = null;\r\n" + 

+			"        if (obj == null) { // WARNING 1\r\n" + 

+			"            System.out.println(\"NULL\"); // WARNING 2\r\n" + 

+			"        }\r\n" + 

+			"    }\r\n" + 

+			"}\n"

+		},

+		getCompilerOptions(),

+		"",

+		"NULL");

+}

+public void testBug440398_comment2() {

+	runConformTestWithLibs(

+		new String[] { 

+			"MyClass.java",

+			"import org.eclipse.jdt.annotation.*;\n" + 

+			"\n" + 

+			"@NonNullByDefault({DefaultLocation.FIELD})\n" + 

+			"public class MyClass {\n" + 

+			"    private @NonNull String [] names = new @NonNull String[]{\"Alice\", \"Bob\", \"Charlie\"};\n" + 

+			"\n" + 

+			"    public String getName(int index) {\n" + 

+			"        String name = names[index];\n" + 

+			"        return name; /* statement A */\n" + 

+			"    }\n" + 

+			"}",

+		},

+		getCompilerOptions(),

+		"");

+}

+public void testBug440398_comment2a() {

+	runConformTestWithLibs(

+		new String[] { 

+			"p/package-info.java",

+			"@org.eclipse.jdt.annotation.NonNullByDefault({org.eclipse.jdt.annotation.DefaultLocation.FIELD})\n" +

+			"package p;\n",

+			"p/MyClass.java",

+			"package p;\n" +

+			"import org.eclipse.jdt.annotation.*;\n" + 

+			"\n" + 

+			"public class MyClass {\n" + 

+			"    private @NonNull String [] names = new @NonNull String[]{\"Alice\", \"Bob\", \"Charlie\"};\n" + 

+			"\n" + 

+			"    public String getName(int index) {\n" + 

+			"        String name = names[index];\n" + 

+			"        return name; /* statement A */\n" + 

+			"    }\n" + 

+			"}",

+		},

+		getCompilerOptions(),

+		"");

+}

 }

diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/StaticImportTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/StaticImportTest.java
index b7b1910..9f6865c 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/StaticImportTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/StaticImportTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2014 IBM Corporation and others.
+ * Copyright (c) 2000, 2015 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
@@ -3193,5 +3193,38 @@
 						"The type I is ambiguous\n" + 
 						"----------\n");
 	}
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=479287
+	// erroneous compile error using static imports and generics
+	public void testBug479287() {
+		this.runConformTest(
+			new String[] {
+				"joetest/GenericsIssue.java",
+				"package joetest;\n" + 
+				"import static joetest.GenericsIssueCollaborator.takesAnything;\n" + 
+				"import java.util.Collection;\n" + 
+				"import java.util.Collections;\n" + 
+				"public class GenericsIssue {\n" + 
+				"	private void oddCompileError() {\n" + 
+				"		takesAnything(returnThings(\"works without wildcard in return value\"));\n" + 
+				"		GenericsIssueCollaborator.takesAnything(returnThingsWildcard(\"works without static import\"));\n" + 
+				"		takesAnything(returnThingsWildcard(\"doesn\'t work with static import\"));\n" + 
+				"	}\n" + 
+				"	private <T> Collection<T> returnThings(T thing) {\n" + 
+				"		return Collections.singleton(thing);\n" + 
+				"	}\n" + 
+				"		\n" + 
+				"	private <T> Collection<? extends T> returnThingsWildcard(T toReturn) {\n" + 
+				"		return Collections.singleton(toReturn);\n" + 
+				"	}\n" + 
+				"}",
+				"joetest/GenericsIssueCollaborator.java",
+				"package joetest;\n" + 
+				"public class GenericsIssueCollaborator {\n" + 
+				"	public static <T> void takesAnything(T thing) {\n" + 
+				"		System.out.println(\"TOOK IT: \" + thing);\n" + 
+				"	}\n" + 
+				"}"
+			});
+	}
 }
 
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java
index c13eec8..a5410d3 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java
@@ -5191,5 +5191,126 @@
 	IMethodBinding binding = lambdaExpression.resolveMethodBinding();

 	assertTrue("Should be a varargs", binding.isVarargs());

 }

+// 	https://bugs.eclipse.org/bugs/show_bug.cgi?id=463942

+public void testBug463942_001() throws JavaModelException {

+	String contents = 

+			"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_USE)\n" +

+			"@interface Marker {\n" +

+			" 	String value() default \"\";\n" +

+			"}\n" +

+			"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_USE)\n" +

+			"@interface Marker2 {\n" +

+			" 	String value() default \"22\";\n" +

+			"}\n" +

+			"public class X {\n" +

+			"   public String @Marker(\"i0\") @Marker2 [] [] @Marker(\"i1\") [] str = null;\n" +

+			"}";

+

+	this.workingCopy = getWorkingCopy("/Converter18/src/X.java", true);

+	ASTNode node = buildAST(contents, this.workingCopy);

+	assertEquals("Not a compilation unit", ASTNode.COMPILATION_UNIT, node.getNodeType());

+	CompilationUnit compilationUnit = (CompilationUnit) node;

+	assertProblemsSize(compilationUnit, 0);

+

+	/* public String @Marker("i0") @Marker2 [] [] @Marker("i1") [] str = null; */

+	node = getASTNode(compilationUnit, 2, 0);

+	assertTrue("Not a field declaration", node.getNodeType() == ASTNode.FIELD_DECLARATION);

+	FieldDeclaration field = (FieldDeclaration) node;

+	List fragments = field.fragments();

+	assertEquals("Incorrect no of fragments", 1, fragments.size());

+	VariableDeclarationFragment fragment = (VariableDeclarationFragment) fragments.get(0);

+	IVariableBinding variable = fragment.resolveBinding();

+	assertNotNull("Should not be null", variable);

+	ITypeBinding typeBinding = variable.getType();

+	assertNotNull("Should not be null", typeBinding);

+	IAnnotationBinding[][] dimAnnotations = typeBinding.getTypeAnnotationsOnDimensions();

+

+	assertEquals("Incorrect type annotations", 3, dimAnnotations.length);

+	IAnnotationBinding[] annotations = dimAnnotations[0];

+	assertTrue("Incorrect number of annotations", annotations.length == 2);

+	assertEquals("Incorrect type annotations", "@Marker(value = i0)", annotations[0].toString());

+	assertEquals("Incorrect type annotations", "@Marker2()", annotations[1].toString());

+	annotations = dimAnnotations[1];

+	assertTrue("Incorrect number of annotations", annotations.length == 0);

+	annotations = dimAnnotations[2];

+	assertTrue("Incorrect number of annotations", annotations.length == 1);

+	assertEquals("Incorrect type annotations", "@Marker(value = i1)", annotations[0].toString());

+

+}

+

+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399792

+public void testBug470794_001() throws JavaModelException {

+	String content =

+			"public class X {\n" +

+			"      Object o = (I & J) () -> {};" +

+			"      public K main(Object o) {\n" +

+			"    	  K oo = (I & J & K) o;\n" +

+			"    	  return oo;\n" +

+			"      }\n" +

+			"}\n" +

+			"interface I {\n" +

+			"  public void foo();\n" +

+			"}\n" +

+			"interface J {\n" +

+			"  public void foo();\n" +

+			"  public void bar();\n" +

+			"}\n" +

+			"interface K {\n" +

+			"  public void foo();\n" +

+			"  public void bar();\n" +

+			"}\n";

+

+	this.workingCopy = getWorkingCopy("/Converter18/src/X.java", true);

+	ASTNode node = buildAST(content, this.workingCopy, true);

+	assertEquals("Not a compilation unit", ASTNode.COMPILATION_UNIT, node.getNodeType());

+	CompilationUnit unit = (CompilationUnit) node;

+	TypeDeclaration type =  (TypeDeclaration) unit.types().get(0);

+	node = (ASTNode) type.bodyDeclarations().get(0);

+	assertEquals("Not a field Declaration", ASTNode.FIELD_DECLARATION, node.getNodeType());

+	FieldDeclaration field = (FieldDeclaration) node;

+	assertEquals("Field should not be malformed", 0, (field.getFlags() & ASTNode.MALFORMED));

+

+	List fragments = field.fragments();

+	assertEquals("Incorrect no of fragments", 1, fragments.size());

+	VariableDeclarationFragment fragment = (VariableDeclarationFragment) fragments.get(0);

+	CastExpression cast = (CastExpression) fragment.getInitializer();

+	Type castType = cast.getType();

+	assertEquals("Not an intersection cast type", ASTNode.INTERSECTION_TYPE, castType.getNodeType());

+	assertTrue("Not an intersection cast type", castType.isIntersectionType());

+	assertEquals("Type should not be malformed", 0, (castType.getFlags() & ASTNode.MALFORMED));

+	ITypeBinding binding = castType.resolveBinding();

+	assertNotNull("binding is null", binding);

+	assertTrue("Not an intersection type binding", binding.isIntersectionType());

+	{

+		ITypeBinding [] intersectionBindings = binding.getTypeBounds();

+		String[] expectedTypes = new String[]{"I", "J"};

+		assertTrue("Incorrect number of intersection bindings", intersectionBindings.length == expectedTypes.length);

+		for (int i = 0, l = intersectionBindings.length; i < l; ++i) {

+			assertTrue("Unexpected Intersection Type", expectedTypes[i].equals(intersectionBindings[i].getName()));

+		}

+	}

+

+	node = (ASTNode) type.bodyDeclarations().get(1);

+	assertEquals("Not a method Declaration", ASTNode.METHOD_DECLARATION, node.getNodeType());

+	MethodDeclaration method = (MethodDeclaration) node;

+	assertEquals("Method should not be malformed", 0, (method.getFlags() & ASTNode.MALFORMED));

+	

+	List statements = method.getBody().statements();

+	VariableDeclarationStatement statement = (VariableDeclarationStatement) statements.get(0);

+	fragment = (VariableDeclarationFragment) statement.fragments().get(0);

+	cast = (CastExpression) fragment.getInitializer();

+	castType = cast.getType();

+	binding = castType.resolveBinding();

+	assertNotNull("binding is null", binding);

+	assertTrue("Not an intersection type binding", binding.isIntersectionType());

+	{

+		ITypeBinding [] intersectionBindings = binding.getTypeBounds();

+		String[] expectedTypes = new String[]{"I", "J", "K"};

+		assertTrue("Incorrect number of intersection bindings", intersectionBindings.length == expectedTypes.length);

+		for (int i = 0, l = intersectionBindings.length; i < l; ++i) {

+			assertTrue("Unexpected Intersection Type", expectedTypes[i].equals(intersectionBindings[i].getName()));

+		}

+	}

+}

 

 }

diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java
index 4e357e8..9893639 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java
@@ -11174,4 +11174,638 @@
 		"}";

 	formatSource(source);

 }

+/**

+ * https://bugs.eclipse.org/474629 - [save actions][clean up] Exceptions thrown

+ */

+public void testBug474629() {

+	this.formatterPrefs.alignment_for_binary_expression |= Alignment.M_INDENT_ON_COLUMN;

+	String source = "aaaaa + bbbb";

+	formatSource(source, source, CodeFormatter.K_EXPRESSION, 0, true);

 }

+/**

+ * https://bugs.eclipse.org/467618 - [formatter] Empty lines should not affect indentation of wrapped elements

+ */

+public void testBug467618() {

+	this.formatterPrefs.alignment_for_enum_constants = Alignment.M_NEXT_PER_LINE_SPLIT + Alignment.M_INDENT_ON_COLUMN + Alignment.M_FORCE;

+	String source =

+		"public enum E2 {\r\n" + 

+		"\r\n" + 

+		"	FOOBAR,\r\n" + 

+		"\r\n" + 

+		"	FOOBARBAZ,\r\n" + 

+		"\r\n" + 

+		"	FOO;\r\n" + 

+		"}";

+	formatSource(source,

+		"public enum E2 {\r\n" + 

+		"\r\n" + 

+		"				FOOBAR,\r\n" + 

+		"\r\n" + 

+		"				FOOBARBAZ,\r\n" + 

+		"\r\n" + 

+		"				FOO;\r\n" + 

+		"}"

+	);

+}

+/**

+ * @bug 474916: [formatter] Formatting GridBagLayout from Java 8 takes too long

+ * @test test that formatting finishes in reasonable time

+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=474916"

+ */

+public void testBug474916() {

+	String source = 

+			"/**\r\n" + 

+			" * <                                                           \r\n" + 

+			" * >  <p style='color:red'> Test    </p>\r\n" + 

+			" *  <a title=\"I like to 'quote' it\" \r\n" + 

+			"href = 'http://www.eclipse.org'>Toast</a> */\r\n" + 

+			"class A {}";

+	formatSource(source,

+			"/**\r\n" + 

+			" * < >\r\n" + 

+			" * <p style='color:red'>\r\n" + 

+			" * Test\r\n" + 

+			" * </p>\r\n" + 

+			" * <a title=\"I like to 'quote' it\" href = 'http://www.eclipse.org'>Toast</a>\r\n" + 

+			" */\r\n" + 

+			"class A {\r\n" + 

+			"}"

+	);

+}

+/**

+ * https://bugs.eclipse.org/474918 - [formatter] doesn't align fields in declarations of annotations, enums and anonymous classes

+ */

+public void testBug474918() {

+	this.formatterPrefs.align_type_members_on_columns = true;

+	String source = 

+		"import java.util.function.Function;\r\n" + 

+		"\r\n" + 

+		"public class A {\r\n" + 

+		"	private Function mapper = (Object a) -> {\r\n" + 

+		"		return a.toString().equals(\"test\");\r\n" + 

+		"	};\r\n" + 

+		"	String ssssssssssssssss = \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\";   //$NON-NLS-1$ // B // A\r\n" + 

+		"\r\n" + 

+		"	int bb = 4;\r\n" + 

+		"\r\n" + 

+		"	Object c = new Object() {\r\n" + 

+		"		int a = 55;\r\n" + 

+		"		Object cdddddddddddd = null;\r\n" + 

+		"	};\r\n" + 

+		"\r\n" + 

+		"	private enum E {\r\n" + 

+		"		AAA, BBB;\r\n" + 

+		"		int a = 55;\r\n" + 

+		"		String sssss = \"ssssss\";\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	private @interface II {\r\n" + 

+		"		int aaaaaa = 1;\r\n" + 

+		"		String bbbbbbbbb = \"default\";\r\n" + 

+		"	}\r\n" + 

+		"}";

+	formatSource(source,

+		"import java.util.function.Function;\r\n" + 

+		"\r\n" + 

+		"public class A {\r\n" + 

+		"	private Function	mapper				= (Object a) -> {\r\n" + 

+		"												return a.toString().equals(\"test\");\r\n" + 

+		"											};\r\n" + 

+		"	String				ssssssssssssssss	= \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\";		//$NON-NLS-1$ //\r\n" + 

+		"																					// B\r\n" + 

+		"																					// //\r\n" + 

+		"																					// A\r\n" + 

+		"\r\n" + 

+		"	int					bb					= 4;\r\n" + 

+		"\r\n" + 

+		"	Object				c					= new Object() {\r\n" + 

+		"												int			a				= 55;\r\n" + 

+		"												Object		cdddddddddddd	= null;\r\n" + 

+		"											};\r\n" + 

+		"\r\n" + 

+		"	private enum E {\r\n" + 

+		"		AAA, BBB;\r\n" + 

+		"		int		a		= 55;\r\n" + 

+		"		String	sssss	= \"ssssss\";\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	private @interface II {\r\n" + 

+		"		int		aaaaaa		= 1;\r\n" + 

+		"		String	bbbbbbbbb	= \"default\";\r\n" + 

+		"	}\r\n" + 

+		"}"

+	);

+}

+/**

+ * https://bugs.eclipse.org/474918 - [formatter] doesn't align fields in declarations of annotations, enums and anonymous classes

+ */

+public void testBug474918b() {

+	this.formatterPrefs.align_type_members_on_columns = true;

+	this.formatterPrefs.tab_char = DefaultCodeFormatterOptions.SPACE;

+	String source = 

+		"import java.util.function.Function;\r\n" + 

+		"\r\n" + 

+		"public class A {\r\n" + 

+		"	private Function mapper = (Object a) -> {\r\n" + 

+		"		return a.toString().equals(\"test\");\r\n" + 

+		"	};\r\n" + 

+		"	String ssssssssssssssss = \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\";   //$NON-NLS-1$ // B // A\r\n" + 

+		"\r\n" + 

+		"	int bb = 4;\r\n" + 

+		"\r\n" + 

+		"	Object c = new Object() {\r\n" + 

+		"		int a = 55;\r\n" + 

+		"		Object cdddddddddddd = null;\r\n" + 

+		"	};\r\n" + 

+		"\r\n" + 

+		"	private enum E {\r\n" + 

+		"		AAA, BBB;\r\n" + 

+		"		int a = 55;\r\n" + 

+		"		String sssss = \"ssssss\";\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	private @interface II {\r\n" + 

+		"		int aaaaaa = 1;\r\n" + 

+		"		String bbbbbbbbb = \"default\";\r\n" + 

+		"	}\r\n" + 

+		"}";

+	formatSource(source,

+		"import java.util.function.Function;\r\n" + 

+		"\r\n" + 

+		"public class A {\r\n" + 

+		"    private Function mapper           = (Object a) -> {\r\n" + 

+		"                                          return a.toString().equals(\"test\");\r\n" + 

+		"                                      };\r\n" + 

+		"    String           ssssssssssssssss = \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\";     //$NON-NLS-1$ //\r\n" + 

+		"                                                                             // B\r\n" + 

+		"                                                                             // //\r\n" + 

+		"                                                                             // A\r\n" + 

+		"\r\n" + 

+		"    int              bb               = 4;\r\n" + 

+		"\r\n" + 

+		"    Object           c                = new Object() {\r\n" + 

+		"                                          int      a             = 55;\r\n" + 

+		"                                          Object   cdddddddddddd = null;\r\n" + 

+		"                                      };\r\n" + 

+		"\r\n" + 

+		"    private enum E {\r\n" + 

+		"        AAA, BBB;\r\n" + 

+		"        int    a     = 55;\r\n" + 

+		"        String sssss = \"ssssss\";\r\n" + 

+		"    }\r\n" + 

+		"\r\n" + 

+		"    private @interface II {\r\n" + 

+		"        int    aaaaaa    = 1;\r\n" + 

+		"        String bbbbbbbbb = \"default\";\r\n" + 

+		"    }\r\n" + 

+		"}"

+	);

+}

+/**

+ * https://bugs.eclipse.org/474918 - [formatter] doesn't align fields in declarations of annotations, enums and anonymous classes

+ */

+public void testBug474918c() {

+	this.formatterPrefs.align_type_members_on_columns = true;

+	this.formatterPrefs.use_tabs_only_for_leading_indentations = true;

+	String source = 

+		"import java.util.function.Function;\r\n" + 

+		"\r\n" + 

+		"public class A {\r\n" + 

+		"	private Function mapper = (Object a) -> {\r\n" + 

+		"		return a.toString().equals(\"test\");\r\n" + 

+		"	};\r\n" + 

+		"	String ssssssssssssssss = \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\";   //$NON-NLS-1$ // B // A\r\n" + 

+		"\r\n" + 

+		"	int bb = 4;\r\n" + 

+		"\r\n" + 

+		"	Object c = new Object() {\r\n" + 

+		"		int a = 55;\r\n" + 

+		"		Object cdddddddddddd = null;\r\n" + 

+		"	};\r\n" + 

+		"\r\n" + 

+		"	private enum E {\r\n" + 

+		"		AAA, BBB;\r\n" + 

+		"		int a = 55;\r\n" + 

+		"		String sssss = \"ssssss\";\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	private @interface II {\r\n" + 

+		"		int aaaaaa = 1;\r\n" + 

+		"		String bbbbbbbbb = \"default\";\r\n" + 

+		"	}\r\n" + 

+		"}";

+	formatSource(source,

+		"import java.util.function.Function;\r\n" + 

+		"\r\n" + 

+		"public class A {\r\n" + 

+		"	private Function	mapper				= (Object a) -> {\r\n" + 

+		"		                                        return a.toString().equals(\"test\");\r\n" + 

+		"	                                        };\r\n" + 

+		"	String				ssssssssssssssss	= \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\";		//$NON-NLS-1$ //\r\n" + 

+		"	                                                                                // B\r\n" + 

+		"	                                                                                // //\r\n" + 

+		"	                                                                                // A\r\n" + 

+		"\r\n" + 

+		"	int					bb					= 4;\r\n" + 

+		"\r\n" + 

+		"	Object				c					= new Object() {\r\n" + 

+		"		                                        int			a				= 55;\r\n" + 

+		"		                                        Object		cdddddddddddd	= null;\r\n" + 

+		"	                                        };\r\n" + 

+		"\r\n" + 

+		"	private enum E {\r\n" + 

+		"		AAA, BBB;\r\n" + 

+		"		int		a		= 55;\r\n" + 

+		"		String	sssss	= \"ssssss\";\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	private @interface II {\r\n" + 

+		"		int		aaaaaa		= 1;\r\n" + 

+		"		String	bbbbbbbbb	= \"default\";\r\n" + 

+		"	}\r\n" + 

+		"}"

+	);

+}

+/**

+ * https://bugs.eclipse.org/475865 - JDT deletes code

+ */

+public void testBug475865() {

+	String source = 

+		"public class Snippet {\r\n" + 

+		"\r\n" + 

+		"	Runnable disposeRunnable = this::dispose();\r\n" + 

+		"\r\n" + 

+		"	void dispose() {\r\n" + 

+		"	}\r\n" + 

+		"}";

+	formatSource(source);

+}

+/**

+ * https://bugs.eclipse.org/435241 - [1.8][lambda][formatter] if/else within lambda is incorrectly formatted

+ */

+public void testBug435241() {

+	this.formatterPrefs.brace_position_for_block = DefaultCodeFormatterConstants.NEXT_LINE;

+	this.formatterPrefs.insert_new_line_before_else_in_if_statement = true;

+	String source = 

+		"public class Snippet {\r\n" + 

+		"	public static void main(String[] args) {\r\n" + 

+		"		Executors.newSingleThreadExecutor().execute(() -> {\r\n" + 

+		"			if (true)\r\n" + 

+		"			{\r\n" + 

+		"				System.err.println(\"foo\");\r\n" + 

+		"			}\r\n" + 

+		"			else\r\n" + 

+		"			{\r\n" + 

+		"				System.err.println(\"bar\");\r\n" + 

+		"			}\r\n" + 

+		"		});\r\n" + 

+		"	}\r\n" + 

+		"}";

+	formatSource(source);

+}

+/**

+ * https://bugs.eclipse.org/472815 - [formatter] 'Indent Empty lines' option doesn't work inside empty blocks

+ */

+public void testBug472815() {

+	this.formatterPrefs.number_of_empty_lines_to_preserve = 2;

+	String source = 

+		"public class Snippet {\r\n" + 

+		"\r\n" + 

+		"	int[] a1 = { };\r\n" + 

+		"	int[] a2 = {\r\n" + 

+		"	};\r\n" + 

+		"	int[] a3 = {\r\n" + 

+		"\r\n" + 

+		"	};\r\n" + 

+		"	int[] a4 = {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	};\r\n" + 

+		"	int[] a5 = {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	};\r\n" + 

+		"\r\n" + 

+		"	void f1() { }\r\n" + 

+		"	void f2() {\r\n" + 

+		"	}\r\n" + 

+		"	void f3() {\r\n" + 

+		"\r\n" + 

+		"	}\r\n" + 

+		"	void f4() {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	}\r\n" + 

+		"	void f5() {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	}\r\n" + 

+		"}";

+	formatSource(source,

+		"public class Snippet {\r\n" + 

+		"\r\n" + 

+		"	int[] a1 = {};\r\n" + 

+		"	int[] a2 = {};\r\n" + 

+		"	int[] a3 = {\r\n" + 

+		"\r\n" + 

+		"	};\r\n" + 

+		"	int[] a4 = {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	};\r\n" + 

+		"	int[] a5 = {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	};\r\n" + 

+		"\r\n" + 

+		"	void f1() {\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	void f2() {\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	void f3() {\r\n" + 

+		"\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	void f4() {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	void f5() {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	}\r\n" + 

+		"}"

+	);

+}

+/**

+ * https://bugs.eclipse.org/472815 - [formatter] 'Indent Empty lines' option doesn't work inside empty blocks

+ */

+public void testBug472815b() {

+	this.formatterPrefs.number_of_empty_lines_to_preserve = 2;

+	this.formatterPrefs.indent_empty_lines = true;

+	String source = 

+		"public class Snippet {\r\n" + 

+		"\r\n" + 

+		"	int[] a1 = { };\r\n" + 

+		"	int[] a2 = {\r\n" + 

+		"	};\r\n" + 

+		"	int[] a3 = {\r\n" + 

+		"\r\n" + 

+		"	};\r\n" + 

+		"	int[] a4 = {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	};\r\n" + 

+		"	int[] a5 = {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	};\r\n" + 

+		"\r\n" + 

+		"	void f1() { }\r\n" + 

+		"	void f2() {\r\n" + 

+		"	}\r\n" + 

+		"	void f3() {\r\n" + 

+		"\r\n" + 

+		"	}\r\n" + 

+		"	void f4() {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	}\r\n" + 

+		"	void f5() {\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"\r\n" + 

+		"	}\r\n" + 

+		"}";

+	formatSource(source,

+		"public class Snippet {\r\n" + 

+		"	\r\n" + 

+		"	int[] a1 = {};\r\n" + 

+		"	int[] a2 = {};\r\n" + 

+		"	int[] a3 = {\r\n" + 

+		"			\r\n" + 

+		"	};\r\n" + 

+		"	int[] a4 = {\r\n" + 

+		"			\r\n" + 

+		"			\r\n" + 

+		"	};\r\n" + 

+		"	int[] a5 = {\r\n" + 

+		"			\r\n" + 

+		"			\r\n" + 

+		"	};\r\n" + 

+		"	\r\n" + 

+		"	void f1() {\r\n" + 

+		"	}\r\n" + 

+		"	\r\n" + 

+		"	void f2() {\r\n" + 

+		"	}\r\n" + 

+		"	\r\n" + 

+		"	void f3() {\r\n" + 

+		"		\r\n" + 

+		"	}\r\n" + 

+		"	\r\n" + 

+		"	void f4() {\r\n" + 

+		"		\r\n" + 

+		"		\r\n" + 

+		"	}\r\n" + 

+		"	\r\n" + 

+		"	void f5() {\r\n" + 

+		"		\r\n" + 

+		"		\r\n" + 

+		"	}\r\n" + 

+		"}"

+	);

+}

+/**

+ * https://bugs.eclipse.org/472413 - [formatter] Wrap all arguments on new lines and prefer outer expressions result is inconsistent

+ */

+public void testBug472413() {

+	this.formatterPrefs.alignment_for_arguments_in_method_invocation = 

+		DefaultCodeFormatterOptions.Alignment.M_ONE_PER_LINE_SPLIT

+		+ DefaultCodeFormatterOptions.Alignment.M_INDENT_BY_ONE;

+	this.formatterPrefs.page_width = 80;

+	String source = 

+		"class Snippet {\r\n" + 

+		"\r\n" + 

+		"	void foo1() {\r\n" + 

+		"		Other.bar(\r\n" + 

+		"			100,\r\n" + 

+		"			nestedMethod2Arg(\r\n" + 

+		"				nestedMethod1Arg(\r\n" + 

+		"					nestedMethod2Arg(nestedMethod1Arg(nestedMethod2Arg(\r\n" + 

+		"						nestedMethod1Arg(nestedMethod1Arg(nestedMethod1Arg(\r\n" + 

+		"							nested(200, 300, 400, 500, 600, 700, 800, 900)))),\r\n" + 

+		"						null)), null)),\r\n" + 

+		"				null),\r\n" + 

+		"			100);\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	void foo2() {\r\n" + 

+		"		nestedMethodAAAA(\r\n" + 

+		"			nestedMethodBBBB(\r\n" + 

+		"				nestedMethodCCC(dddddd(200, 300, 400, 500, 600, 700, 800, 900)),\r\n" + 

+		"				null));\r\n" + 

+		"		nestedMethodAAAA(nestedMethodBBBB(\r\n" + 

+		"			nestedMethodCCC(dddddd(200, 300, 400, 500, 600, 700, 800, 900)),\r\n" + 

+		"			null));\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	void foo3() {\r\n" + 

+		"		nestedMethodAAAA(\r\n" + 

+		"			nestedMethodBBBB(\r\n" + 

+		"				nestedMethodCCC(dddddd(200, 300, 400, 500, 600, 700, 800, 900)),\r\n" + 

+		"				null),\r\n" + 

+		"			null);\r\n" + 

+		"		nestedMethodAAAA(nestedMethodBBBB(\r\n" + 

+		"			nestedMethodCCC(dddddd(200, 300, 400, 500, 600, 700, 800, 900)),\r\n" + 

+		"			null), null);\r\n" + 

+		"	}\r\n" + 

+		"}";

+	formatSource(source,

+		"class Snippet {\r\n" + 

+		"\r\n" + 

+		"	void foo1() {\r\n" + 

+		"		Other.bar(\r\n" + 

+		"			100,\r\n" + 

+		"			nestedMethod2Arg(\r\n" + 

+		"				nestedMethod1Arg(\r\n" + 

+		"					nestedMethod2Arg(\r\n" + 

+		"						nestedMethod1Arg(\r\n" + 

+		"							nestedMethod2Arg(\r\n" + 

+		"								nestedMethod1Arg(\r\n" + 

+		"									nestedMethod1Arg(\r\n" + 

+		"										nestedMethod1Arg(\r\n" + 

+		"											nested(\r\n" + 

+		"												200,\r\n" + 

+		"												300,\r\n" + 

+		"												400,\r\n" + 

+		"												500,\r\n" + 

+		"												600,\r\n" + 

+		"												700,\r\n" + 

+		"												800,\r\n" + 

+		"												900)))),\r\n" + 

+		"								null)),\r\n" + 

+		"						null)),\r\n" + 

+		"				null),\r\n" + 

+		"			100);\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	void foo2() {\r\n" + 

+		"		nestedMethodAAAA(\r\n" + 

+		"			nestedMethodBBBB(\r\n" + 

+		"				nestedMethodCCC(dddddd(200, 300, 400, 500, 600, 700, 800, 900)),\r\n" + 

+		"				null));\r\n" + 

+		"		nestedMethodAAAA(\r\n" + 

+		"			nestedMethodBBBB(\r\n" + 

+		"				nestedMethodCCC(dddddd(200, 300, 400, 500, 600, 700, 800, 900)),\r\n" + 

+		"				null));\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"	void foo3() {\r\n" + 

+		"		nestedMethodAAAA(\r\n" + 

+		"			nestedMethodBBBB(\r\n" + 

+		"				nestedMethodCCC(dddddd(200, 300, 400, 500, 600, 700, 800, 900)),\r\n" + 

+		"				null),\r\n" + 

+		"			null);\r\n" + 

+		"		nestedMethodAAAA(\r\n" + 

+		"			nestedMethodBBBB(\r\n" + 

+		"				nestedMethodCCC(dddddd(200, 300, 400, 500, 600, 700, 800, 900)),\r\n" + 

+		"				null),\r\n" + 

+		"			null);\r\n" + 

+		"	}\r\n" + 

+		"}"

+	);

+}

+/**

+ * https://bugs.eclipse.org/475793 - [formatter] Incorrect whitespace after lambda block

+ */

+public void testBug475793() {

+	this.formatterPrefs.insert_new_line_in_empty_block = false;

+	String source =

+		"public class C {\r\n" + 

+		"	public void f() {\r\n" + 

+		"		Foo.bar(() -> {} , IllegalArgumentException.class);\r\n" + 

+		"	}\r\n" + 

+		"}";

+	formatSource(source,

+		"public class C {\r\n" + 

+		"	public void f() {\r\n" + 

+		"		Foo.bar(() -> {}, IllegalArgumentException.class);\r\n" + 

+		"	}\r\n" + 

+		"}"

+	);

+}

+/**

+ * https://bugs.eclipse.org/475746 - [formatter] insert-space rules sometimes ignored with anonymous subclass or when Annotations present

+ */

+public void testBug475746() {

+	this.formatterPrefs.insert_new_line_in_empty_block = false;

+	this.formatterPrefs.insert_space_after_opening_paren_in_method_invocation = true;

+	this.formatterPrefs.insert_space_before_closing_paren_in_method_invocation = true;

+	this.formatterPrefs.insert_space_after_opening_paren_in_method_declaration = true;

+	this.formatterPrefs.insert_space_before_closing_paren_in_method_declaration = true;

+	this.formatterPrefs.insert_space_after_opening_paren_in_constructor_declaration = true;

+	this.formatterPrefs.insert_space_before_closing_paren_in_constructor_declaration = true;

+	this.formatterPrefs.insert_space_after_opening_paren_in_annotation = true;

+	this.formatterPrefs.insert_space_before_closing_paren_in_annotation = true;

+	String source =

+		"import java.awt.*;\r\n" + 

+		"\r\n" + 

+		"public class MyClass {\r\n" + 

+		"\r\n" + 

+		"	@Annotation( Arrays.asList( \"\" ))\r\n" + 

+		"	static Point p = new Point( x, y) {\r\n" + 

+		"		@Override\r\n" + 

+		"		public int hashCode( ) {\r\n" + 

+		"			return 42;\r\n" + 

+		"		}\r\n" + 

+		"	};\r\n" + 

+		"\r\n" + 

+		"	MyClass( @Annotation( \"annotationVal\" ) String s)\r\n" + 

+		"	{\r\n" + 

+		"		Foo.bar( ( @Annotation( \"annotationVal\" ) int a) -> { } , IllegalArgumentException.class );\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"}";

+	formatSource(source,

+		"import java.awt.*;\r\n" + 

+		"\r\n" + 

+		"public class MyClass {\r\n" + 

+		"\r\n" + 

+		"	@Annotation( Arrays.asList( \"\" ) )\r\n" + 

+		"	static Point p = new Point( x, y ) {\r\n" + 

+		"		@Override\r\n" + 

+		"		public int hashCode() {\r\n" + 

+		"			return 42;\r\n" + 

+		"		}\r\n" + 

+		"	};\r\n" + 

+		"\r\n" + 

+		"	MyClass( @Annotation( \"annotationVal\" ) String s ) {\r\n" + 

+		"		Foo.bar( ( @Annotation( \"annotationVal\" ) int a ) -> {}, IllegalArgumentException.class );\r\n" + 

+		"	}\r\n" + 

+		"\r\n" + 

+		"}"

+	);

+}

+/**

+ * https://bugs.eclipse.org/477005 - [formatter] NullPointerException when first line is empty and indented

+ */

+public void testBug477005() {

+	this.formatterPrefs.indent_empty_lines = true;

+	this.formatterPrefs.blank_lines_before_package = 2;

+	String source =

+		"\r\n" + 

+		"\r\n" + 

+		"package test;\r\n" + 

+		"\r\n" + 

+		"public class MyClass {\r\n" + 

+		"}";

+	formatSource(source);

+}

+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterCommentsBugsTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterCommentsBugsTest.java
index 48dcc5a..052ab58 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterCommentsBugsTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterCommentsBugsTest.java
@@ -7223,4 +7223,103 @@
 		"																		// bbb\n" + 
 		"}");
 }
+/**
+ * https://bugs.eclipse.org/475294 - [formatter] "Preserve whitespace..." problems with wrapped line comments
+ */
+public void testBug475294() {
+	this.formatterPrefs.comment_preserve_white_space_between_code_and_line_comments = true;
+	String source = 
+		"public class A {\n" + 
+		"	void a() {\n" + 
+		"		System.out.println();// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println(); // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();   // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println(); 	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();   	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();    	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  	  // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();		// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"	}\n" + 
+		"}";
+	formatSource(source,
+		"public class A {\n" + 
+		"	void a() {\n" + 
+		"		System.out.println();// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"								// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println(); // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"								 // ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"								  // ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();   // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"								   // ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"									// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println(); 	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"								 	// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"								  	// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();   	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"								   	// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();    	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"								    	// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  	  // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"								  	  // ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();		// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"										// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"	}\n" + 
+		"}");
+}
+/**
+ * https://bugs.eclipse.org/475294 - [formatter] "Preserve whitespace..." problems with wrapped line comments
+ */
+public void testBug475294b() {
+	this.formatterPrefs.comment_preserve_white_space_between_code_and_line_comments = true;
+	this.formatterPrefs.use_tabs_only_for_leading_indentations = true;
+	String source = 
+		"public class A {\n" + 
+		"	void a() {\n" + 
+		"		System.out.println();// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println(); // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();   // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println(); 	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();   	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();    	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  	  // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();		// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"	}\n" + 
+		"}";
+	formatSource(source,
+		"public class A {\n" + 
+		"	void a() {\n" + 
+		"		System.out.println();// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                     // ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println(); // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                      // ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                       // ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();   // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                        // ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                     	// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println(); 	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                      	// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                       	// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();   	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                        	// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();    	// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                         	// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();  	  // aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                       	  // ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"		System.out.println();		// aaaaaaa bbbbbbbbbbbbbbb ccccccccccccc\n" + 
+		"		                     		// ddddddddddddddd eeeeeeeeeeeeeee\n" + 
+		"	}\n" + 
+		"}");
+}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java
index 07b52f5..20c9af0 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java
@@ -194,6 +194,12 @@
 		"  class Inner {\n" +
 		"    Inner() {\n" +
 		"    }\n" +
+		"    class WW {\n" +
+		"      WW() {}\n" +
+		"      class WWW {\n" +
+		"        WWW() {}\n" +
+		"      }\n" +
+		"    }\n" +
 		"  }\n" +
 		"}"
 	};
@@ -900,6 +906,12 @@
 		"  class Inner {\n" + 
 		"    Inner() {\n" + 
 		"    }\n" + 
+		"    class WW {\n" + 
+		"      WW() {}\n" + 
+		"      class WWW {\n" + 
+		"        WWW() {}\n" + 
+		"      }\n" + 
+		"    }\n" + 
 		"  }\n" + 
 		"}",
 		type.getSource());
@@ -1046,6 +1058,32 @@
 		type.getSource());
 	attachSource(root, null, null); // detach source
 }
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=476304
+public void testInnerClass10() throws JavaModelException {
+	IJavaProject project = this.getJavaProject("/AttachSourceTests");
+	IPackageFragmentRoot root = project.getPackageFragmentRoot(getFile("/AttachSourceTests/innerClasses.jar"));
+	attachSource(root, "/AttachSourceTests/innerClassessrc.zip", null);
+	IPackageFragment fragment = root.getPackageFragment("inner");
+
+	IType type = fragment.getClassFile("X$Inner$WW.class").getType();
+	assertSourceEquals(
+		"Unexpected source",
+		"class WW {\n" + 
+		"      WW() {}\n" + 
+		"      class WWW {\n" + 
+		"        WWW() {}\n" + 
+		"      }\n" + 
+		"    }",
+		type.getSource());
+	type = fragment.getClassFile("X$Inner$WW$WWW.class").getType();
+	assertSourceEquals(
+		"Unexpected source",
+		"class WWW {\n" + 
+		"        WWW() {}\n" + 
+		"      }",
+		type.getSource());
+	attachSource(root, null, null); // detach source
+}
 /**
  * Ensures that a source folder can be attached to a lib folder.
  */
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java
index b90ac98..824c5d5 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java
@@ -14328,5 +14328,110 @@
 		if (ProjectA != null) deleteProject(ProjectA);
 	}
 }
+/** @bug 476738
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=476738"
+ */
+public void testBug476738_001() throws CoreException {
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+			"interface I { \n" +
+			"    public void query(Foo.InnerKey key);// Search result of method query(Foo.InnerKey) returns the method query(Bar.InnerKey) too \n" +
+			"    public void query(Bar.InnerKey key);\n" +
+			"}\n" +
+			"\n" +
+			"class Foo { \n" +
+			"    static class InnerKey  {}\n" +
+			"}\n" +
+			"class Bar {\n" +
+			"    static class InnerKey {}\n" +
+			"}\n" +
+			"\n" +
+			"class X {\n" +
+			"	public static void foo(I i, Foo.InnerKey key) {\n" +
+			"		i.query(key);\n" +
+			"	}\n" +
+			"	public static void bar(I i, Bar.InnerKey key) {\n" +
+			"		i.query(key);\n" +
+			"	}\n" +
+			"	public static I getInstance() {\n" +
+			"		return null;\n" +
+			"	}\n" +
+			"}\n"
+	);
+
+	String str = this.workingCopies[0].getSource();
+	String selection = "query";
+	int start = str.indexOf(selection);
+	int length = selection.length();
+
+	IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+	MethodPattern leftPattern = (MethodPattern) SearchPattern.createPattern(elements[0], REFERENCES, EXACT_RULE | ERASURE_RULE);
+	MethodPattern rightPattern = (MethodPattern) SearchPattern.createPattern(elements[0], REFERENCES, EXACT_RULE | ERASURE_RULE);
+	SearchPattern pattern = SearchPattern.createOrPattern(leftPattern, rightPattern);
+	new SearchEngine(this.workingCopies).search(pattern,
+			new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()},
+			getJavaSearchWorkingCopiesScope(),
+			this.resultCollector,
+			null);
+	assertSearchResults(
+			"src/X.java void X.foo(I, Foo.InnerKey) [query(key)] EXACT_MATCH"
+	);
+}
+/** @bug 476738
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=476738"
+ */
+public void testBug476738_002() throws CoreException {
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+			"interface I { \n" +
+			"    public void query/* one */(Foo.InnerKey key);// Search result of method query(Foo.InnerKey) returns the method query(Bar.InnerKey) too \n" +
+			"    public void query/* two */(Bar.InnerKey key);\n" +
+			"}\n" +
+			"\n" +
+			"class Foo { \n" +
+			"    static class InnerKey  {}\n" +
+			"}\n" +
+			"class Bar {\n" +
+			"    static class InnerKey {}\n" +
+			"}\n" +
+			"\n" +
+			"class X {\n" +
+			"	public static void foo(I i, Foo.InnerKey key) {\n" +
+			"		i.query(key);\n" +
+			"	}\n" +
+			"	public static void bar(I i, Bar.InnerKey key) {\n" +
+			"		i.query(key);\n" +
+			"	}\n" +
+			"	public static I getInstance() {\n" +
+			"		return null;\n" +
+			"	}\n" +
+			"}\n"
+	);
+
+	String str = this.workingCopies[0].getSource();
+	String selection = "query";
+	String selection1 = "query/* one */";
+	String selection2 = "query/* two */";
+	int start = str.indexOf(selection1);
+	int length = selection.length();
+	IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+	MethodPattern leftPattern = (MethodPattern) SearchPattern.createPattern(elements[0], REFERENCES, EXACT_RULE | ERASURE_RULE);
+
+	start = str.indexOf(selection2);
+	length = selection.length();
+	elements = this.workingCopies[0].codeSelect(start, length);
+	MethodPattern rightPattern = (MethodPattern) SearchPattern.createPattern(elements[0], REFERENCES, EXACT_RULE | ERASURE_RULE);
+
+	SearchPattern pattern = SearchPattern.createOrPattern(leftPattern, rightPattern);
+	new SearchEngine(this.workingCopies).search(pattern,
+			new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()},
+			getJavaSearchWorkingCopiesScope(),
+			this.resultCollector,
+			null);
+	assertSearchResults(
+			"src/X.java void X.foo(I, Foo.InnerKey) [query(key)] EXACT_MATCH\n" + 
+			"src/X.java void X.bar(I, Bar.InnerKey) [query(key)] EXACT_MATCH"
+	);
+}
 
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests2.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests2.java
index 5969c4c..4c0e682 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests2.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests2.java
@@ -18,10 +18,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import junit.framework.Test;
-
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IAccessRule;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
@@ -34,8 +33,12 @@
 import org.eclipse.jdt.core.search.SearchEngine;
 import org.eclipse.jdt.core.search.SearchMatch;
 import org.eclipse.jdt.core.search.SearchPattern;
+import org.eclipse.jdt.core.search.TypeNameMatch;
+import org.eclipse.jdt.core.search.TypeNameMatchRequestor;
 import org.eclipse.jdt.internal.core.search.matching.MethodPattern;
 
+import junit.framework.Test;
+
 // The size of JavaSearchBugsTests.java is very big, Hence continuing here.
 @SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaSearchBugsTests2 extends AbstractJavaSearchTests {
@@ -1907,4 +1910,55 @@
 			deleteProject("P");
 		}
 	}
+
+	public void testBug473921() throws Exception {
+		try {
+			IJavaProject p = this.createJavaProject(
+				"P",
+				new String[] {},
+				new String[] { "/P/lib473921.jar", "JCL17_LIB" },
+				new String[][] {{ "p/*" }, { }},
+				new String[][] {{ "**/*" }, { }},
+				null/*no project*/,
+				null/*no inclusion pattern*/,
+				null/*no exclusion pattern*/,
+				null/*no exported project*/,
+				"",
+				null/*no source outputs*/,
+				null/*no inclusion pattern*/,
+				null/*no exclusion pattern*/,
+				"1.7"
+			);
+			org.eclipse.jdt.core.tests.util.Util.createJar(
+					new String[] {
+							"p/Enclosing.java",
+							"package p;\n" +
+							"public class Enclosing { enum Nested { A, B } }\n"
+					},
+					p.getProject().getLocation().append("lib473921.jar").toOSString(),
+					"1.7");
+			refresh(p);
+			
+			IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { p });
+			class Collector extends TypeNameMatchRequestor {
+				List<TypeNameMatch> matches = new ArrayList<>();
+				@Override
+				public void acceptTypeNameMatch(TypeNameMatch match) {
+					this.matches.add(match);
+				}
+			}
+			Collector collector = new Collector();
+			new SearchEngine().searchAllTypeNames(
+				null,
+				new char[][] { "Nested".toCharArray() },
+				scope,
+				collector,
+				IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
+				null);
+			assertEquals(1, collector.matches.size());
+			assertEquals(IAccessRule.K_ACCESSIBLE, collector.matches.get(0).getAccessibility());
+		} finally {
+			deleteProject("P");
+		}
+	}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite18Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite18Test.java
index 055fd36..ec3300a 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite18Test.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite18Test.java
@@ -22,11 +22,14 @@
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.Annotation;
+import org.eclipse.jdt.core.dom.Assignment;
 import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.ExpressionStatement;
 import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.IVariableBinding;
 import org.eclipse.jdt.core.dom.MarkerAnnotation;
 import org.eclipse.jdt.core.dom.MethodDeclaration;
+import org.eclipse.jdt.core.dom.MethodInvocation;
 import org.eclipse.jdt.core.dom.NormalAnnotation;
 import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
 import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
@@ -752,6 +755,48 @@
 		}
 	}
 
+	public void testBug474270_since_8() throws Exception {
+		String contents = 
+				"package pack1;\n" +
+				"import java.util.Comparator;\n" +
+				"interface Comparator<T> {\n" +
+				"    int compare(T o1, T o2);\n" +
+				"    public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {\n" +
+				"		return null;\n" +
+				"    }\n" +
+				"}\n" +
+				"public class X {\n" +
+				"    Comparator mComparator1 = null;\n" +
+				"	 Comparator mComparator2 = (pObj1, pObj2) -> mComparator1.compare(pObj1, pObj2);\n" +
+				"    X() {mComparator1 = Comparator.naturalOrder();}\n" +
+				"}\n";
+		createFolder("/" + PROJECT + "/src/pack1");
+		createFile("/" + PROJECT + "/src/pack1/X.java", contents);
+
+		ICompilationUnit cu = getCompilationUnit("/" + PROJECT + "/src/pack1/X.java");
+		ASTParser parser = ASTParser.newParser(AST.JLS8);
+		parser.setSource(cu);
+		parser.setResolveBindings(true);
+		parser.setStatementsRecovery(true);
+		CompilationUnit astRoot = (CompilationUnit) parser.createAST(null);	
+		TypeDeclaration type= (TypeDeclaration) astRoot.types().get(1);
+		MethodDeclaration [] methods =  type.getMethods();
+		MethodDeclaration method = methods[0];
+		ExpressionStatement stmt =  (ExpressionStatement) method.getBody().statements().get(0);
+		Assignment assignment = (Assignment) stmt.getExpression();
+		MethodInvocation invocation = (MethodInvocation) assignment.getRightHandSide();
+		ITypeBinding typeBinding = invocation.resolveTypeBinding();
+		typeBinding = typeBinding.getDeclaredMethods()[0].getParameterTypes()[0];
+		contents = "package pack2;\n" +
+				"\n" +
+				"public class A{}\n";
+		createFolder("/" + PROJECT + "/src/pack2");
+		createFile("/" + PROJECT + "/src/pack2/A.java", contents);
+		cu = getCompilationUnit("/" + PROJECT + "/src/pack2/A.java");
+		ImportRewrite rewrite = newImportsRewrite(cu, new String[0], 99, 99, true);
+		rewrite.addImport(typeBinding, astRoot.getAST());
+	}
+
 	private void assertEqualStringIgnoreDelim(String actual, String expected) throws IOException {
 		StringAsserts.assertEqualStringIgnoreDelim(actual, expected);
 	}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR308/testLambda/A_out.java b/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR308/testLambda/A_out.java
index ac92b6f..24670c6 100644
--- a/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR308/testLambda/A_out.java
+++ b/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR308/testLambda/A_out.java
@@ -44,7 +44,7 @@
 				}
 			}
 
-			.howMany();
+					.howMany();
 		};
 	}
 
diff --git a/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR335/testLambda/A_out.java b/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR335/testLambda/A_out.java
index 11e7d9a..1638629 100644
--- a/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR335/testLambda/A_out.java
+++ b/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR335/testLambda/A_out.java
@@ -48,7 +48,7 @@
 				}
 			}
 
-			.howMany();
+					.howMany();
 		};
 	}
 
diff --git a/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR335/testLambdaOptions/A_out.java b/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR335/testLambdaOptions/A_out.java
index 2c0e1f0..05a86b6 100644
--- a/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR335/testLambdaOptions/A_out.java
+++ b/org.eclipse.jdt.core.tests.model/workspace/FormatterJSR335/testLambdaOptions/A_out.java
@@ -51,7 +51,7 @@
 				}
 			}
 
-			.howMany();
+					.howMany();
 		};
 	}
 
diff --git a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java
index 391c763..6968ee2 100644
--- a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java
+++ b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java
@@ -683,6 +683,14 @@
 			}
 		}
 
+		public void logUnavaibleAPT(String className) {
+			if ((this.tagBits & Logger.XML) != 0) {
+				this.parameters.put(Logger.MESSAGE, this.main.bind("configure.unavailableAPT", className)); //$NON-NLS-1$
+				printTag(Logger.ERROR_TAG, this.parameters, true, true);
+			}
+			this.printlnErr(this.main.bind("configure.unavailableAPT", className)); //$NON-NLS-1$
+		}
+
 		public void logIncorrectVMVersionForAnnotationProcessing() {
 			if ((this.tagBits & Logger.XML) != 0) {
 				this.parameters.put(Logger.MESSAGE, this.main.bind("configure.incorrectVMVersionforAPT")); //$NON-NLS-1$
@@ -4030,17 +4038,16 @@
 	this.classNames = null;
 }
 protected void initializeAnnotationProcessorManager() {
+	String className = "org.eclipse.jdt.internal.compiler.apt.dispatch.BatchAnnotationProcessorManager"; //$NON-NLS-1$
 	try {
-		Class c = Class.forName("org.eclipse.jdt.internal.compiler.apt.dispatch.BatchAnnotationProcessorManager"); //$NON-NLS-1$
+		Class c = Class.forName(className);
 		AbstractAnnotationProcessorManager annotationManager = (AbstractAnnotationProcessorManager) c.newInstance();
 		annotationManager.configure(this, this.expandedCommandLine);
 		annotationManager.setErr(this.err);
 		annotationManager.setOut(this.out);
 		this.batchCompiler.annotationProcessorManager = annotationManager;
-	} catch (ClassNotFoundException e) {
-		// ignore
-	} catch (InstantiationException e) {
-		// should not happen
+	} catch (ClassNotFoundException | InstantiationException e) {
+		this.logger.logUnavaibleAPT(className);
 		throw new org.eclipse.jdt.internal.compiler.problem.AbortCompilation();
 	} catch (IllegalAccessException e) {
 		// should not happen
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 cceb509..25f27ab 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
@@ -104,6 +104,7 @@
 configure.accessRuleAfterDestinationPath = access rules cannot follow destination path entries: {0}
 configure.duplicateDestinationPathEntry = duplicate destination path entry in {0} option
 configure.invalidClassName = invalid class name: {0}
+configure.unavailableAPT = Unable to load annotation processing manager {0} from classpath.
 configure.incorrectVMVersionforAPT = Annotation processing got disabled, since it requires a 1.6 compliant JVM
 configure.incompatibleSourceForCldcTarget=Target level ''{0}'' is incompatible with source level ''{1}''. A source level ''1.3'' or lower is required
 configure.incompatibleComplianceForCldcTarget=Target level ''{0}'' is incompatible with compliance level ''{1}''. A compliance level ''1.4''or lower is required
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
index 555bdcf..4be2814 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
@@ -2022,6 +2022,7 @@
 			prepareForHeaders();
 			goForHeaders();
 			this.diet = true; // passed this point, will not consider method bodies
+			this.dietInt = 0;
 		}
 		return RESTART;
 	}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CategorizedProblem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CategorizedProblem.java
index 3fe14ec..55b0453 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CategorizedProblem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CategorizedProblem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2015 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
@@ -149,4 +149,13 @@
 public Object[] getExtraMarkerAttributeValues() {
 	return DefaultProblem.EMPTY_VALUES;
 }
+/**
+ * {@inheritDoc}
+ * <p>Note: This implementation always returns <code>false</code>, subclasses can override.</p>
+ *
+ * @since 3.12
+ */
+public boolean isInfo() {
+	return false;
+}
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
index d30135f..e92d6bf 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
@@ -302,6 +302,14 @@
 boolean isWarning();
 
 /**
+ * Checks the severity to see if the problem is an information.
+ *
+ * @return true if the information bit is set for the severity, false otherwise
+ * @since 3.12
+ */
+boolean isInfo();
+
+/**
  * Set the end position of the problem (inclusive), or -1 if unknown.
  * Used for shifting problem positions.
  *
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java
index 8720e8f..4b0996d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java
@@ -4004,7 +4004,8 @@
 			if (isConstructor) { // insert String name,int ordinal
 				length = writeArgumentName(ConstantPool.EnumName, ClassFileConstants.AccSynthetic, length);
 				length = writeArgumentName(ConstantPool.EnumOrdinal, ClassFileConstants.AccSynthetic, length);
-			} else if (CharOperation.equals(ConstantPool.ValueOf, binding.selector)) { // insert String name
+			} else if (binding instanceof SyntheticMethodBinding
+					&& CharOperation.equals(ConstantPool.ValueOf, binding.selector)) { // insert String name
 				length = writeArgumentName(ConstantPool.Name, ClassFileConstants.AccMandated, length);
 				targetParameters =  Binding.NO_PARAMETERS; // Override "unknown" synthetics below
 			}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java
index 6eb5627..4651364 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java
@@ -40,6 +40,8 @@
  *								bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
  *								bug 412149 - [1.8][compiler] Emit repeated annotations into the designated container
  *								bug 419209 - [1.8] Repeating container annotations should be rejected in the presence of annotation it contains
+ *     Till Brychcy - Contributions for
+ *     						    bug 467094 - [1.8][null] TYPE_USE NullAnnotations of array contents are applied to field.
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -988,6 +990,9 @@
 						local.declaration.bits |= HasTypeAnnotations;
 						typeRef.bits |= HasTypeAnnotations;
 						local.type = mergeAnnotationsIntoType(scope, se8Annotations, se8nullBits, se8NullAnnotation, typeRef, local.type);
+						if(scope.environment().usesNullTypeAnnotations()) {
+							local.tagBits &= ~(se8nullBits);
+						}
 					}
 					break;
 				case Binding.FIELD:
@@ -998,6 +1003,9 @@
 						fieldDeclaration.bits |= HasTypeAnnotations;
 						fieldDeclaration.type.bits |= HasTypeAnnotations;
 						field.type = mergeAnnotationsIntoType(scope, se8Annotations, se8nullBits, se8NullAnnotation, fieldDeclaration.type, field.type);
+						if(scope.environment().usesNullTypeAnnotations()) {
+							field.tagBits &= ~(se8nullBits);
+						}
 					}
 					break;
 				case Binding.METHOD:
@@ -1009,6 +1017,9 @@
 							methodDecl.bits |= HasTypeAnnotations;
 							methodDecl.returnType.bits |= HasTypeAnnotations;
 							method.returnType = mergeAnnotationsIntoType(scope, se8Annotations, se8nullBits, se8NullAnnotation, methodDecl.returnType, method.returnType);
+							if(scope.environment().usesNullTypeAnnotations()) {
+								method.tagBits &= ~(se8nullBits);
+							}
 						}
 					}
 					break;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/BreakStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/BreakStatement.java
index 47cfc81..3cb59b1 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/BreakStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/BreakStatement.java
@@ -42,6 +42,7 @@
 	}
 
 	targetContext.recordAbruptExit();
+	targetContext.expireNullCheckedFieldInfo();
 
 	this.initStateIndex =
 		currentScope.methodScope().recordInitializationStates(flowInfo);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
index c42960c..df99b84 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
@@ -447,7 +447,7 @@
 		if (valueRequired || needRuntimeCheckcast || annotatedCast) { // Added for: 1F1W9IG: IVJCOM:WINNT - Compiler omits casting check
 			codeStream.generateConstant(this.constant, this.implicitConversion);
 			if (needRuntimeCheckcast || annotatedCast) {
-				codeStream.checkcast(this.type, this.resolvedType);
+				codeStream.checkcast(this.type, this.resolvedType, pc);
 			}
 			if (!valueRequired) {
 				// the resolveType cannot be double or long
@@ -459,7 +459,7 @@
 	}
 	this.expression.generateCode(currentScope, codeStream, annotatedCast || valueRequired || needRuntimeCheckcast);
 	if (annotatedCast || (needRuntimeCheckcast && TypeBinding.notEquals(this.expression.postConversionType(currentScope), this.resolvedType.erasure()))) { // no need to issue a checkcast if already done as genericCast
-		codeStream.checkcast(this.type, this.resolvedType);
+		codeStream.checkcast(this.type, this.resolvedType, pc);
 	}
 	if (valueRequired) {
 		codeStream.generateImplicitConversion(this.implicitConversion);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.java
index a6f946d..30b7d4c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.java
@@ -42,6 +42,7 @@
 	}
 
 	targetContext.recordAbruptExit();
+	targetContext.expireNullCheckedFieldInfo();
 
 	if (targetContext == FlowContext.NotContinuableContext) {
 		currentScope.problemReporter().invalidContinue(this);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldReference.java
index a9b9c86..bf90d3a 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldReference.java
@@ -16,6 +16,8 @@
  *								Bug 458396 - NPE in CodeStream.invoke()
  *     Jesper S Moller - Contributions for
  *								Bug 378674 - "The method can be declared as static" is wrong
+ *     Robert Roth <robert.roth.off@gmail.com> - Contributions for
+ *								Bug 361039 - NPE in FieldReference.optimizedBooleanConstant
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -552,6 +554,8 @@
 }
 
 public Constant optimizedBooleanConstant() {
+	if (this.resolvedType == null)
+		return Constant.NotAConstant;
 	switch (this.resolvedType.id) {
 		case T_boolean :
 		case T_JavaLangBoolean :
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IfStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IfStatement.java
index 936c293..f1145cd 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IfStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IfStatement.java
@@ -103,6 +103,8 @@
 			}
 		}
 		thenFlowInfo = this.thenStatement.analyseCode(currentScope, flowContext, thenFlowInfo);
+		if (!(this.thenStatement instanceof Block))
+			flowContext.expireNullCheckedFieldInfo();
 	}
 	// any null check from the condition is now expired
 	flowContext.expireNullCheckedFieldInfo();
@@ -131,6 +133,8 @@
 			}
 		}
 		elseFlowInfo = this.elseStatement.analyseCode(currentScope, flowContext, elseFlowInfo);
+		if (!(this.elseStatement instanceof Block))
+			flowContext.expireNullCheckedFieldInfo();
 	}
 	// process AutoCloseable resources closed in only one branch:
 	currentScope.correlateTrackingVarsIfElse(thenFlowInfo, elseFlowInfo);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java
index 877114a..a615681 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java
@@ -425,6 +425,8 @@
 		if (this.body instanceof Expression) {
 			Expression expression = (Expression) this.body;
 			new ReturnStatement(expression, expression.sourceStart, expression.sourceEnd, true).resolve(this.scope); // :-) ;-)
+			if (expression.resolvedType == TypeBinding.VOID && !expression.statementExpression())
+				this.scope.problemReporter().invalidExpressionAsStatement(expression);
 		} else {
 			this.body.resolve(this.scope);
 			/* At this point, shape analysis is complete for ((see returnsExpression(...))
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java
index ad77677..845d662 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java
@@ -66,6 +66,7 @@
 import org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
+import org.eclipse.jdt.internal.compiler.lookup.ImplicitNullAnnotationVerifier;
 import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
 import org.eclipse.jdt.internal.compiler.lookup.IntersectionTypeBinding18;
 import org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
@@ -741,8 +742,14 @@
 	}
 
 	protected void checkNullAnnotations(BlockScope scope) {
-		if (scope.compilerOptions().isAnnotationBasedNullAnalysisEnabled) {
+		CompilerOptions compilerOptions = scope.compilerOptions();
+		if (compilerOptions.isAnnotationBasedNullAnalysisEnabled) {
         	if (this.expectedType == null || !NullAnnotationMatching.hasContradictions(this.expectedType)) { // otherwise assume it has been reported and we can do nothing here
+        		if ((this.binding.tagBits & TagBits.IsNullnessKnown) == 0) {
+        			// not interested in reporting problems against this.binding:
+        			new ImplicitNullAnnotationVerifier(scope.environment(), compilerOptions.inheritNullAnnotations)
+        					.checkImplicitNullAnnotations(this.binding, null/*srcMethod*/, false, scope);
+        		}
 	        	// TODO: simplify by using this.freeParameters?
 	        	int len;
 	        	int expectedlen = this.binding.parameters.length;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java
index cb1f37b..25d348d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java
@@ -171,6 +171,7 @@
 	currentScope.checkUnclosedCloseables(flowInfo, flowContext, this, currentScope);
 	// inside conditional structure respect that a finally-block may conditionally be entered directly from here
 	flowContext.recordAbruptExit();
+	flowContext.expireNullCheckedFieldInfo();
 	return FlowInfo.DEAD_END;
 }
 @Override
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 ce13931..5f6e111 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
@@ -123,6 +123,7 @@
 						if (caseInits == FlowInfo.DEAD_END) {
 							fallThroughState = ESCAPING;
 						}
+						switchContext.expireNullCheckedFieldInfo();
 					}
 				}
 			}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker.java
index aafe24b..9fa7cbf 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker.java
@@ -116,14 +116,14 @@
 
 	@Override
 	public ITypeAnnotationWalker toMethodParameter(short index) {
-		// don't set nextIsDefaultLocation, because signature-level nullness is handled by ImplicitNullAnnotationVerifier
+		// don't set nextIsDefaultLocation, because signature-level nullness is handled by ImplicitNullAnnotationVerifier (triggered per invocation via MessageSend.resolveType() et al)
 		if (this.isEmpty) return restrict(this.matches, this.pathPtr);
 		return super.toMethodParameter(index);
 	}
 
 	@Override
 	public ITypeAnnotationWalker toMethodReturn() {
-		// don't set nextIsDefaultLocation, because signature-level nullness is handled by ImplicitNullAnnotationVerifier
+		// don't set nextIsDefaultLocation, because signature-level nullness is handled by ImplicitNullAnnotationVerifier (triggered per invocation via MessageSend.resolveType() et al)
 		if (this.isEmpty) return restrict(this.matches, this.pathPtr);
 		return super.toMethodReturn();
 	}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java
index 85da064..045f8d4 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java
@@ -656,10 +656,10 @@
 }
 
 public void checkcast(TypeBinding typeBinding) {
-	this.checkcast(null, typeBinding);
+	this.checkcast(null, typeBinding, -1);
 }
 
-public void checkcast(TypeReference typeReference, TypeBinding typeBinding) {
+public void checkcast(TypeReference typeReference, TypeBinding typeBinding, int currentPosition) {
 	this.countLabels = 0;
 	if (this.classFileOffset + 2 >= this.bCodeStream.length) {
 		resizeByteArray();
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java
index 66cfc2d..2be341c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2014 IBM Corporation and others.
+ * Copyright (c) 2012, 2015 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
@@ -81,7 +81,7 @@
 		super.newArray(typeReference, allocationExpression, arrayBinding);
 	}
 	
-	public void checkcast(TypeReference typeReference, TypeBinding typeBinding) {
+	public void checkcast(TypeReference typeReference, TypeBinding typeBinding, int currentPosition) {
 		/* We use a slightly sub-optimal generation for intersection casts by resorting to a runtime cast for every intersecting type, but in
 		   reality this should not matter. In its intended use form such as (I & Serializable) () -> {}, no cast is emitted at all. Also note
 		   intersection cast type references cannot nest i.e ((X & I) & J) is not valid syntax.
@@ -91,13 +91,21 @@
 			for (int i = typeReferences.length - 1; i >= 0; i--) {  // need to emit right to left.
 				typeReference = typeReferences[i];
 				if (typeReference != null) {
-					if ((typeReference.bits & ASTNode.HasTypeAnnotations) != 0)
-						addAnnotationContext(typeReference, this.position, i, AnnotationTargetTypeConstants.CAST);
-					super.checkcast(typeReference, typeReference.resolvedType);
+					if ((typeReference.bits & ASTNode.HasTypeAnnotations) != 0) {
+						if (!typeReference.resolvedType.isBaseType()) {
+							addAnnotationContext(typeReference, this.position, i, AnnotationTargetTypeConstants.CAST);
+						} else {
+							// for base type record it against the start position of the expression
+							addAnnotationContext(typeReference, currentPosition, i, AnnotationTargetTypeConstants.CAST);
+						}
+					}
+					if (!typeReference.resolvedType.isBaseType()) {
+						super.checkcast(typeReference, typeReference.resolvedType, currentPosition);
+					}
 				}
 			}
 		} else {
-			super.checkcast(null, typeBinding);
+			super.checkcast(null, typeBinding, currentPosition);
 		}
 	}
 	
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java
index 61d54b5..9e3b20f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java
@@ -9,6 +9,7 @@
  *     Stephan Herrmann - initial API and implementation
  *     Lars Vogel <Lars.Vogel@vogella.com> - Contributions for
  *     						Bug 473178
+ *     IBM Corporation - Bug fixes
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.lookup;
 
@@ -182,7 +183,21 @@
 			return copy;
 		}
 		public TypeBinding findSingleWrapperType() {
-			TypeBinding wrapperBound = null;
+			if (this.instantiation != null) {
+				if (this.instantiation.isProperType(true)) {
+					switch (this.instantiation.id) {
+						case TypeIds.T_JavaLangByte:
+						case TypeIds.T_JavaLangShort:
+						case TypeIds.T_JavaLangCharacter:
+						case TypeIds.T_JavaLangInteger:
+						case TypeIds.T_JavaLangLong:
+						case TypeIds.T_JavaLangFloat:
+						case TypeIds.T_JavaLangDouble:
+						case TypeIds.T_JavaLangBoolean:
+							return this.instantiation;
+					}
+				}
+			}
 			if (this.subBounds != null) {
 				Iterator<TypeBound> it = this.subBounds.iterator();
 				while(it.hasNext()) {
@@ -197,9 +212,7 @@
 							case TypeIds.T_JavaLangFloat:
 							case TypeIds.T_JavaLangDouble:
 							case TypeIds.T_JavaLangBoolean:
-								if (wrapperBound != null)
-									return null;
-								wrapperBound = boundType;
+								return boundType;
 						}
 					}
 				}		
@@ -218,14 +231,12 @@
 							case TypeIds.T_JavaLangFloat:
 							case TypeIds.T_JavaLangDouble:
 							case TypeIds.T_JavaLangBoolean:
-								if (wrapperBound != null)
-									return null;
-								wrapperBound = boundType;
+								return boundType;
 						}
 					}
 				}		
 			}
-			return wrapperBound;
+			return null;
 		}
 		/**
 		 * Not per JLS: enhance the given type bounds using the nullHints, if useful.
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java
index 9b4b32e..c51a617 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java
@@ -110,11 +110,7 @@
 							return ConstraintTypeFormula.create(exprType, this.right, COMPATIBLE, this.isSoft);
 						}
 						if (innerCtx.stepCompleted >= InferenceContext18.APPLICABILITY_INFERRED) {
-							inferenceContext.currentBounds.addBounds(innerCtx.b2, inferenceContext.environment);
-							inferenceContext.inferenceVariables = innerCtx.inferenceVariables;
-							inferenceContext.inferenceKind = innerCtx.inferenceKind;
-							innerCtx.outerContext = inferenceContext;
-							inferenceContext.usesUncheckedConversion = innerCtx.usesUncheckedConversion;
+							inferenceContext.integrateInnerInferenceB2(innerCtx);
 						} else {
 							return FALSE; // should not reach here.
 						}
@@ -362,11 +358,7 @@
 				// spec says erasure, but we don't really have compatibility rules for erasure, use raw type instead:
 				TypeBinding erasure = inferenceContext.environment.convertToRawType(returnType, false);
 				ConstraintTypeFormula newConstraint = ConstraintTypeFormula.create(erasure, targetType, COMPATIBLE);
-				if (!inferenceContext.reduceAndIncorporate(newConstraint))
-					return false;
-				// continuing at true is not spec'd but needed for javac-compatibility,
-				// see org.eclipse.jdt.core.tests.compiler.regression.GenericsRegressionTest_1_8.testBug428198()
-				// and org.eclipse.jdt.core.tests.compiler.regression.GenericsRegressionTest_1_8.testBug428264()
+				return inferenceContext.reduceAndIncorporate(newConstraint);
 			}
 			TypeBinding rTheta = inferenceContext.substitute(returnType);
 			ParameterizedTypeBinding parameterizedType = InferenceContext18.parameterizedWithWildcard(rTheta);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.java
index 1d3415d..7c6d065 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.java
@@ -15,6 +15,8 @@
  *								Bug 435805 - [1.8][compiler][null] Java 8 compiler does not recognize declaration style null annotations
  *								Bug 458396 - NPE in CodeStream.invoke()
  *								Bug 446217 - [null] @NonNullByDefault in package-info.java causes bogus "null type safety" warning
+ *     Till Brychcy - Contribution for
+ *     						    bug 467094 - [1.8][null] TYPE_USE NullAnnotations of array contents are applied to field.
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.lookup;
 
@@ -245,21 +247,23 @@
 }
 
 public void fillInDefaultNonNullness(FieldDeclaration sourceField, Scope scope) {
+	if (this.type == null || this.type.isBaseType())
+		return;
 	LookupEnvironment environment = scope.environment();
-	if (this.type == null)
-		return;
-	if (environment.usesNullTypeAnnotations() && !this.type.acceptsNonNullDefault())
-		return;
-	if (   !this.type.isBaseType()
-		&& (this.tagBits & TagBits.AnnotationNullMASK) == 0 		// declaration annotation?
-		&& (this.type.tagBits & TagBits.AnnotationNullMASK) == 0)	// type annotation? (java.lang.@Nullable String)
-	{
-		if (environment.usesNullTypeAnnotations())
+	if (environment.usesNullTypeAnnotations()) {
+		if (!this.type.acceptsNonNullDefault())
+			return;
+		if ( (this.type.tagBits & TagBits.AnnotationNullMASK) == 0) {
 			this.type = environment.createAnnotatedType(this.type, new AnnotationBinding[]{environment.getNonNullAnnotation()});
-		else
+		} else if ((this.type.tagBits & TagBits.AnnotationNonNull) != 0) {
+			scope.problemReporter().nullAnnotationIsRedundant(sourceField);
+		}
+	} else {
+		if ( (this.tagBits & TagBits.AnnotationNullMASK) == 0 ) {
 			this.tagBits |= TagBits.AnnotationNonNull;
-	} else if ((this.tagBits & TagBits.AnnotationNonNull) != 0) {
-		scope.problemReporter().nullAnnotationIsRedundant(sourceField);
+		} else if ((this.tagBits & TagBits.AnnotationNonNull) != 0) {
+			scope.problemReporter().nullAnnotationIsRedundant(sourceField);
+		}		
 	}
 }
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java
index 2da3f5c..ea1e31c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java
@@ -128,6 +128,7 @@
 	
 	/** The inference variables for which as solution is sought. */
 	InferenceVariable[] inferenceVariables;
+	int nextVarId;
 
 	/** Constraints that have not yet been reduced and incorporated. */
 	ConstraintFormula[] initialConstraints;
@@ -179,7 +180,7 @@
 			if (i >= len)
 				System.arraycopy(interned, 0, outermostContext.internedVariables = new InferenceVariable[len+10], 0, len);
 		}
-		return outermostContext.internedVariables[i] = new InferenceVariable(typeParameter, rank, i, site, this.environment, this.object);
+		return outermostContext.internedVariables[i] = new InferenceVariable(typeParameter, rank, this.nextVarId++, site, this.environment, this.object);
 	}
 
 	public static final int CHECK_UNKNOWN = 0;
@@ -1399,6 +1400,16 @@
 		return record;
 	}
 
+	public void integrateInnerInferenceB2(InferenceContext18 innerCtx) {
+		this.currentBounds.addBounds(innerCtx.b2, this.environment);
+		this.inferenceVariables = innerCtx.inferenceVariables;
+		this.inferenceKind = innerCtx.inferenceKind;
+		innerCtx.outerContext = this;
+		this.usesUncheckedConversion = innerCtx.usesUncheckedConversion;
+		for (InferenceVariable variable : this.inferenceVariables)
+			variable.updateSourceName(this.nextVarId++);
+	}
+
 	public void resumeSuspendedInference(SuspendedInferenceRecord record) {
 		// merge inference variables:
 		if (this.inferenceVariables == null) { // no new ones, assume we aborted prematurely
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceVariable.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceVariable.java
index 060e4cf..b999b85 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceVariable.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceVariable.java
@@ -23,11 +23,13 @@
 	TypeBinding typeParameter;
 	long nullHints; // one of TagBits.{AnnotationNonNull,AnnotationNullable} may steer inference into inferring nullness as well; set both bits to request avoidance.
 	private InferenceVariable prototype;
+	int varId; // this is used for constructing a source name like T#0. NB: varId and sourceName are mutable, to be updated when two InferenceContext18 are integrated.
 	
 	public InferenceVariable(TypeBinding typeParameter, int parameterRank, int iVarId, InvocationSite site, LookupEnvironment environment, ReferenceBinding object) {
 		this(typeParameter, parameterRank, site,
 				CharOperation.concat(typeParameter.shortReadableName(), Integer.toString(iVarId).toCharArray(), '#'),
 				environment, object);
+		this.varId = iVarId;
 	}
 	private InferenceVariable(TypeBinding typeParameter, int parameterRank, InvocationSite site, char[] sourceName, LookupEnvironment environment, ReferenceBinding object) {
 		super(sourceName, null/*declaringElement*/, parameterRank, environment);
@@ -47,12 +49,21 @@
 		this.superclass = object;
 		this.prototype = this;
 	}
+	void updateSourceName(int newId) {
+		int hashPos = CharOperation.indexOf('#', this.sourceName);
+		this.varId = newId;
+		this.sourceName = CharOperation.concat(
+				CharOperation.subarray(this.sourceName, 0, hashPos),
+				Integer.toString(this.varId).toCharArray(),
+				'#');
+	}
 	
 	@Override
 	public TypeBinding clone(TypeBinding enclosingType) {
 		InferenceVariable clone = new InferenceVariable(this.typeParameter, this.rank, this.site, this.sourceName, this.environment, this.superclass);
 		clone.tagBits = this.tagBits;
 		clone.nullHints = this.nullHints;
+		clone.varId = this.varId;
 		clone.prototype = this;
 		return clone;
 	}
@@ -119,16 +130,19 @@
 	}
 	
 	public int hashCode() {
-		if (this.sourceName != null)
-			return this.sourceName.hashCode();
-		return super.hashCode();
+		int code = this.typeParameter.hashCode() + 17 * this.rank;
+		if (this.site != null)
+			return 31 * code + this.site.hashCode();
+		else
+			return code;
 	}
 	public boolean equals(Object obj) {
 		if (!(obj instanceof InferenceVariable))
 			return false;
-		if (this.sourceName != null)
-			return this.sourceName.equals(((InferenceVariable)obj).sourceName);
-		return super.equals(obj);
+		InferenceVariable other = (InferenceVariable) obj;
+		return this.rank == other.rank
+				&& this.site == other.site
+				&& TypeBinding.equalsEquals(this.typeParameter, other.typeParameter);
 	}
 
 	public TypeBinding erasure() {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
index 3b5083d..8882848 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
@@ -810,6 +810,11 @@
 }
 
 public ParameterizedGenericMethodBinding createParameterizedGenericMethod(MethodBinding genericMethod, TypeBinding[] typeArguments) {
+	return createParameterizedGenericMethod(genericMethod, typeArguments, false, false);
+}
+public ParameterizedGenericMethodBinding createParameterizedGenericMethod(MethodBinding genericMethod, TypeBinding[] typeArguments,
+																			boolean inferredWithUncheckedConversion, boolean hasReturnProblem)
+{
 	// cached info is array of already created parameterized types for this type
 	ParameterizedGenericMethodBinding[] cachedInfo = (ParameterizedGenericMethodBinding[])this.uniqueParameterizedGenericMethodBindings.get(genericMethod);
 	int argLength = typeArguments == null ? 0: typeArguments.length;
@@ -828,6 +833,12 @@
 				for (int j = 0; j < cachedArgLength; j++){
 					if (typeArguments[j] != cachedArguments[j]) continue nextCachedMethod; //$IDENTITY-COMPARISON$
 				}
+				if (inferredWithUncheckedConversion) { // JSL 18.5.2: "If unchecked conversion was necessary..."
+					// don't tolerate remaining parameterized types / type variables, should have been eliminated by erasure:
+					if (cachedMethod.returnType.isParameterizedType() || cachedMethod.returnType.isTypeVariable()) continue;
+					for (TypeBinding exc : cachedMethod.thrownExceptions)
+						if (exc.isParameterizedType() || exc.isTypeVariable()) continue nextCachedMethod;
+				}
 				// all arguments match, reuse current
 				return cachedMethod;
 		}
@@ -843,7 +854,8 @@
 		this.uniqueParameterizedGenericMethodBindings.put(genericMethod, cachedInfo);
 	}
 	// add new binding
-	ParameterizedGenericMethodBinding parameterizedGenericMethod = new ParameterizedGenericMethodBinding(genericMethod, typeArguments, this);
+	ParameterizedGenericMethodBinding parameterizedGenericMethod =
+			new ParameterizedGenericMethodBinding(genericMethod, typeArguments, this, inferredWithUncheckedConversion, hasReturnProblem);
 	cachedInfo[index] = parameterizedGenericMethod;
 	return parameterizedGenericMethod;
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java
index 1789afe..1f0446b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2015 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
@@ -188,7 +188,8 @@
 				}
 			}
 		}
-		checkForBridgeMethod(currentMethod, inheritedMethod, allInheritedMethods);
+		if (!inheritedMethod.isStatic() && !inheritedMethod.isFinal())
+			checkForBridgeMethod(currentMethod, inheritedMethod, allInheritedMethods);
 	}
 }
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.java
index 905fdf8..2fa02c9 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2014 IBM Corporation and others.
+ * Copyright (c) 2000, 2015 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
@@ -338,7 +338,7 @@
 		} else {
 			if (concreteMethod != null && concreteMethod.isDefaultMethod()) {
 				if (this.environment.globalOptions.complianceLevel >= ClassFileConstants.JDK1_8) {
-					if (!checkInheritedDefaultMethods(methods, length))
+					if (!checkInheritedDefaultMethods(methods, isOverridden, length))
 						return;
 				}
 			}
@@ -346,21 +346,21 @@
 		super.checkInheritedMethods(methods, length, isOverridden, isInherited);
 	}
 }
-boolean checkInheritedDefaultMethods(MethodBinding[] methods, int length) {
-	// JLS8  9.4.1 (interface) and  8.4.8.4 (class):
+boolean checkInheritedDefaultMethods(MethodBinding[] methods, boolean[] isOverridden, int length) {
+	// JLS8  9.4.1.3 (interface) and  8.4.8.4 (class):
 	// default method clashes with other inherited method which is override-equivalent 
 	if (length < 2) return true;
 	boolean ok = true;
 	findDefaultMethod: for (int i=0; i<length; i++) {
-		if (methods[i].isDefaultMethod()) {
+		if (methods[i].isDefaultMethod() && !isOverridden[i]) {
 			findEquivalent: for (int j=0; j<length; j++) {
-				if (j == i) continue findEquivalent;
+				if (j == i || isOverridden[j]) continue findEquivalent;
 				if (isMethodSubsignature(methods[i], methods[j])) {
 					if (!doesMethodOverride(methods[i], methods[j]) && !doesMethodOverride(methods[j], methods[i])) { 
 						problemReporter().inheritedDefaultMethodConflictsWithOtherInherited(this.type, methods[i], methods[j]);
 						ok = false;
+						continue findDefaultMethod;
 					}
-					continue findDefaultMethod;
 				}
 			}
 		}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java
index 6c22117..f7ab036 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java
@@ -263,7 +263,7 @@
 				// assemble the solution etc:
 				TypeBinding[] solutions = infCtx18.getSolutions(typeVariables, invocationSite, result);
 				if (solutions != null) {
-					methodSubstitute = scope.environment().createParameterizedGenericMethod(originalMethod, solutions);
+					methodSubstitute = scope.environment().createParameterizedGenericMethod(originalMethod, solutions, infCtx18.usesUncheckedConversion, hasReturnProblem);
 					if (invocationSite instanceof Invocation)
 						infCtx18.forwardResults(result, (Invocation) invocationSite, methodSubstitute, expectedType);
 					if (hasReturnProblem) { // illegally working from the provisional result?
@@ -529,7 +529,7 @@
     /**
      * Create method of parameterized type, substituting original parameters with type arguments.
      */
-	public ParameterizedGenericMethodBinding(MethodBinding originalMethod, TypeBinding[] typeArguments, LookupEnvironment environment) {
+	public ParameterizedGenericMethodBinding(MethodBinding originalMethod, TypeBinding[] typeArguments, LookupEnvironment environment, boolean inferredWithUncheckConversion, boolean hasReturnProblem) {
 	    this.environment = environment;
 		this.modifiers = originalMethod.modifiers;
 		this.selector = originalMethod.selector;
@@ -541,8 +541,16 @@
 	    this.originalMethod = originalMethod;
 	    this.parameters = Scope.substitute(this, originalMethod.parameters);
 	    // error case where exception type variable would have been substituted by a non-reference type (207573)
-	    this.returnType = Scope.substitute(this, originalMethod.returnType);
-	    this.thrownExceptions = Scope.substitute(this, originalMethod.thrownExceptions);
+	    if (inferredWithUncheckConversion) { // JSL 18.5.2: "If unchecked conversion was necessary..."
+	    	this.returnType = getErasure18_5_2(originalMethod.returnType, environment, hasReturnProblem); // propagate simulation of Bug JDK_8026527
+	    	this.thrownExceptions = new ReferenceBinding[originalMethod.thrownExceptions.length];
+	    	for (int i = 0; i < originalMethod.thrownExceptions.length; i++) {
+	    		this.thrownExceptions[i] = (ReferenceBinding) getErasure18_5_2(originalMethod.thrownExceptions[i], environment, false); // no excuse for exceptions
+			}
+	    } else {
+	    	this.returnType = Scope.substitute(this, originalMethod.returnType);
+	    	this.thrownExceptions = Scope.substitute(this, originalMethod.thrownExceptions);
+	    }
 	    if (this.thrownExceptions == null) this.thrownExceptions = Binding.NO_EXCEPTIONS;
 		checkMissingType: {
 			if ((this.tagBits & TagBits.HasMissingType) != 0)
@@ -582,6 +590,16 @@
 	    }
 	}
 
+	TypeBinding getErasure18_5_2(TypeBinding type, LookupEnvironment env, boolean substitute) {
+		// opportunistic interpretation of (JLS 18.5.2):
+		// "If unchecked conversion was necessary ..., then ... 
+		// the return type and thrown types of the invocation type of m are given by
+		// the erasure of the return type and thrown types of m's type."
+		if (substitute)
+			type = Scope.substitute(this, type);
+		return env.convertToRawType(type, true);
+	}
+
 	/*
 	 * parameterizedDeclaringUniqueKey dot selector originalMethodGenericSignature percent typeArguments
 	 * p.X<U> { <T> void bar(T t, U u) { new X<String>().bar(this, "") } } --> Lp/X<Ljava/lang/String;>;.bar<T:Ljava/lang/Object;>(TT;Ljava/lang/String;)V%<Lp/X;>
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PolyParameterizedGenericMethodBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PolyParameterizedGenericMethodBinding.java
index 3a5f6c4..29ed92b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PolyParameterizedGenericMethodBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PolyParameterizedGenericMethodBinding.java
@@ -14,7 +14,7 @@
 
 	private ParameterizedGenericMethodBinding wrappedBinding; 
 	public PolyParameterizedGenericMethodBinding(ParameterizedGenericMethodBinding applicableMethod) {
-		super(applicableMethod.originalMethod, applicableMethod.typeArguments, applicableMethod.environment);
+		super(applicableMethod.originalMethod, applicableMethod.typeArguments, applicableMethod.environment, false, false);
 		this.wrappedBinding = applicableMethod;
 	}
 	
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java
index 582cb19..33ded17 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java
@@ -757,8 +757,13 @@
 			} else if (!method.isOverriding() || !isOverriddenMethodGeneric(method)) {
 				return new ProblemMethodBinding(method, method.selector, genericTypeArguments, ProblemReasons.TypeParameterArityMismatch);
 			}
-		} else if (typeVariables == Binding.NO_TYPE_VARIABLES && method instanceof PolyParameterizedGenericMethodBinding) {
-			return method;
+		} else if (typeVariables == Binding.NO_TYPE_VARIABLES && method instanceof ParameterizedGenericMethodBinding) {
+			if (compilerOptions.sourceLevel >= ClassFileConstants.JDK1_8 && invocationSite instanceof Invocation) {
+				Invocation invocation = (Invocation) invocationSite;
+				InferenceContext18 infCtx = invocation.getInferenceContext((ParameterizedGenericMethodBinding) method);
+				if (infCtx != null)
+					return method; // inference is responsible, no need to recheck.
+			}
 		}
 
 		if (tiebreakingVarargsMethods) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java
index 32b1b07..55374ca 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java
@@ -244,13 +244,11 @@
 	}
 
 	public int boundsCount() {
-		if (this.firstBound == null) {
+		if (this.firstBound == null)
 			return 0;
-		} else if (TypeBinding.equalsEquals(this.firstBound, this.superclass)) {
-			return this.superInterfaces.length + 1;
-		} else {
-			return this.superInterfaces.length;
-		}
+		if (this.firstBound.isInterface())
+			return this.superInterfaces.length; // only interface bounds
+		return this.superInterfaces.length + 1; // class or array type isn't contained in superInterfaces
 	}
 
 	/**
@@ -421,10 +419,11 @@
         if (n == 0)
         	return NO_TYPE_BOUNDS;
         TypeBound[] bounds = new TypeBound[n];
-        bounds[0] = TypeBound.createBoundOrDependency(theta, this.firstBound, variable);
-        int ifcOffset = TypeBinding.equalsEquals(this.firstBound, this.superclass) ? -1 : 0;
-        for (int i = 1; i < n; i++)
-			bounds[i] = TypeBound.createBoundOrDependency(theta, this.superInterfaces[i+ifcOffset], variable);
+        int idx = 0;
+        if (!this.firstBound.isInterface())
+        	bounds[idx++] = TypeBound.createBoundOrDependency(theta, this.firstBound, variable);
+        for (int i = 0; i < this.superInterfaces.length; i++)
+			bounds[idx++] = TypeBound.createBoundOrDependency(theta, this.superInterfaces[i], variable);
         return bounds;
 	}
 
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 1893d20..f7bac96 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
@@ -9727,11 +9727,14 @@
 
 	CompilationUnitDeclaration parsedUnit;
 	boolean old = this.diet;
+	int oldInt = this.dietInt;
 	try {
+		this.dietInt = 0;
 		this.diet = true;
 		parsedUnit = parse(sourceUnit, compilationResult);
 	} finally {
 		this.diet = old;
+		this.dietInt = oldInt;
 	}
 	return parsedUnit;
 }
@@ -11498,6 +11501,7 @@
 }
 public ASTNode[] parseClassBodyDeclarations(char[] source, int offset, int length, CompilationUnitDeclaration unit) {
 	boolean oldDiet = this.diet;
+	int oldInt = this.dietInt;
 	boolean oldTolerateDefaultClassMethods = this.tolerateDefaultClassMethods;
 	/* automaton initialization */
 	initialize();
@@ -11525,12 +11529,14 @@
 	/* run automaton */
 	try {
 		this.diet = true;
+		this.dietInt = 0;
 		this.tolerateDefaultClassMethods = this.parsingJava8Plus;
 		parse();
 	} catch (AbortCompilation ex) {
 		this.lastAct = ERROR_ACTION;
 	} finally {
 		this.diet = oldDiet;
+		this.dietInt = oldInt;
 		this.tolerateDefaultClassMethods = oldTolerateDefaultClassMethods;
 	}
 
@@ -12339,6 +12345,7 @@
 		if (this.referenceContext instanceof CompilationUnitDeclaration){
 			goForHeaders();
 			this.diet = true; // passed this point, will not consider method bodies
+			this.dietInt = 0;
 			return RESTART;
 		}
 
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationBinding.java
index 0e8f6db..5475581 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2011 BEA Systems, Inc.
+ * Copyright (c) 2005, 2015 BEA Systems, Inc.
  * 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
@@ -28,6 +28,7 @@
  */
 class AnnotationBinding implements IAnnotationBinding {
 	static final AnnotationBinding[] NoAnnotations = new AnnotationBinding[0];
+	static final AnnotationBinding[][] NoAnnotationsOnDimensions = new AnnotationBinding[0][];
 	private org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding binding;
 	private BindingResolver bindingResolver;
 	private String key;
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ITypeBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ITypeBinding.java
index 4786097..c3f8699 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ITypeBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ITypeBinding.java
@@ -562,6 +562,23 @@
 	public IAnnotationBinding[] getTypeAnnotations();
 
 	/**
+	 * Returns the type use annotations on dimensions, or the empty array if there
+	 * are no annotations on dimensions.
+	 * 
+	 * <p>
+	 *  Since JLS8, (Section 9.7.4) type annotations can appear at array dimensions. These annotations
+	 *  are returned in a 2-d array with each row containing annotations for that dimension. If only some
+	 *  of the dimensions have type annotations, the rows corresponding to the dimensions without
+	 *  annotations will have an empty single dimensional array.
+	 * </p>
+	 * 
+	 * @return type annotations specified on the dimensions of this type reference, or an empty array if
+	 * either there is no dimension or no type use annotation is found on the dimensions.
+	 * @since 3.12
+	 */
+	public IAnnotationBinding[][] getTypeAnnotationsOnDimensions();
+
+	/**
 	 * Returns the type arguments of this generic type instance, or the
 	 * empty list for other type bindings.
 	 * <p>
@@ -584,8 +601,8 @@
 	public ITypeBinding[] getTypeArguments();
 
 	/**
-	 * Returns the upper type bounds of this type variable, wildcard, or capture. If the
-	 * variable, wildcard, or capture had no explicit bound, then it returns an empty list.
+	 * Returns the upper type bounds of this type variable, wildcard, capture, or intersectionType. 
+	 * If the variable, wildcard, or capture had no explicit bound, then it returns an empty list.
      * <p>
      * Note that per construction, it can only contain one class or array type,
      * at most, and then it is located in first position.
@@ -595,11 +612,12 @@
      * binding, e.g. <code>capture-of ? extends Object[]</code>
      * </p>
 	 *
-	 * @return the list of upper bounds for this type variable, wildcard, or capture,
+	 * @return the list of upper bounds for this type variable, wildcard, capture, or intersection type
      * or otherwise the empty list
      * @see #isTypeVariable()
      * @see #isWildcardType()
 	 * @see #isCapture()
+	 * @see #isIntersectionType()
 	 * @since 3.1
 	 */
 	public ITypeBinding[] getTypeBounds();
@@ -819,6 +837,28 @@
 	public boolean isInterface();
 
 	/**
+	 * Returns whether this type binding represents an intersection binding.
+	 * <p>
+	 * Intersection types can be derived from type parameter bounds and cast
+	 * expressions; they also arise in the processes of capture conversion 
+	 * and least upper bound computation as specified in section 4.9 of 
+	 * <em>The Java Language Specification, Java SE 8 Edition</em> (JLS8).
+	 * </p>
+	 * <p>
+	 * All the types in the intersection type can be accessed using
+	 * {@link #getTypeBounds()}. Wildcard types with more than one
+	 * bound will also be reported as intersection type. To check whether this
+	 * is a wildcard type, use {@link #isWildcardType()}.
+	 * </p>
+	 * @return <code>true</code> if this type binding is an intersecting type,
+	 *   and <code>false</code> otherwise
+	 * @see #getTypeBounds()
+	 * @see ITypeBinding#isWildcardType()
+	 * @since 3.12
+	 */
+	public boolean isIntersectionType();
+
+	/**
 	 * Returns whether this type binding represents a local class.
 	 * <p>
 	 * A local class is any nested class or enum type not declared as a member
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodBinding.java
index 23cba7b..f4a55b1 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodBinding.java
@@ -39,16 +39,16 @@
 	private static final ITypeBinding[] NO_TYPE_BINDINGS = new ITypeBinding[0];
 	protected org.eclipse.jdt.internal.compiler.lookup.MethodBinding binding;
 	protected BindingResolver resolver;
-	private ITypeBinding[] parameterTypes;
-	private ITypeBinding[] exceptionTypes;
-	private String name;
-	private ITypeBinding declaringClass;
-	private ITypeBinding returnType;
-	private String key;
-	private ITypeBinding[] typeParameters;
-	private ITypeBinding[] typeArguments;
-	private IAnnotationBinding[] annotations;
-	private IAnnotationBinding[][] parameterAnnotations;
+	private volatile ITypeBinding[] parameterTypes;
+	private volatile ITypeBinding[] exceptionTypes;
+	private volatile String name;
+	private volatile ITypeBinding declaringClass;
+	private volatile ITypeBinding returnType;
+	private volatile String key;
+	private volatile ITypeBinding[] typeParameters;
+	private volatile ITypeBinding[] typeArguments;
+	private volatile IAnnotationBinding[] annotations;
+	private volatile IAnnotationBinding[][] parameterAnnotations;
 
 	MethodBinding(BindingResolver resolver, org.eclipse.jdt.internal.compiler.lookup.MethodBinding binding) {
 		this.resolver = resolver;
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java
index c126584..97bc4e5 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java
@@ -467,6 +467,13 @@
 	}
 
 	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.core.dom.ITypeBinding#isIntersectionType18()
+	 */
+	public boolean isIntersectionType() {
+		return false;
+	}
+
+	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.core.dom.ITypeBinding#isLocal()
 	 */
 	public boolean isLocal() {
@@ -728,4 +735,9 @@
 	public IAnnotationBinding[] getTypeAnnotations() {
 		return AnnotationBinding.NoAnnotations;
 	}
+
+	@Override
+	public IAnnotationBinding[][] getTypeAnnotationsOnDimensions() {
+		return AnnotationBinding.NoAnnotationsOnDimensions;
+	}
 }
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
index 1fdc509..e163e5f 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.jdt.core.dom;
 
+import java.util.ArrayList;
+import java.util.List;
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.compiler.CharOperation;
@@ -64,6 +66,7 @@
 	private IVariableBinding[] fields;
 	private IAnnotationBinding[] annotations;
 	private IAnnotationBinding[] typeAnnotations;
+	private IAnnotationBinding[][] typeAnnotationsOnDimensions;
 	private IMethodBinding[] methods;
 	private ITypeBinding[] members;
 	private ITypeBinding[] interfaces;
@@ -144,6 +147,34 @@
 		return AnnotationBinding.NoAnnotations;
 	}
 
+	private IAnnotationBinding[][] resolveAnnotationBindingsOnDimensions(org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] internalAnnotations) {
+		int length = internalAnnotations == null ? 0 : internalAnnotations.length;
+		if (length != 0) {
+			IAnnotationBinding[][] dimAnnotations = new IAnnotationBinding[length][];
+			int row = 0;
+			List <IAnnotationBinding> tmpList = new ArrayList<>();
+			for (int i = 0; i < length; i++) {
+				org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding internalAnnotation = internalAnnotations[i];
+				if (internalAnnotation == null) {
+					if (tmpList.size() > 0) {
+						dimAnnotations[row] = tmpList.toArray(new AnnotationBinding[0]);
+						tmpList.clear();
+					} else {
+						dimAnnotations[row] = AnnotationBinding.NoAnnotations;
+					}
+					++row;
+				}
+				IAnnotationBinding annotationInstance = this.resolver.getAnnotationInstance(internalAnnotation);
+				if (annotationInstance == null) {
+					continue;
+				}
+				tmpList.add(annotationInstance);
+			}
+			System.arraycopy(dimAnnotations, 0, (dimAnnotations = new IAnnotationBinding[row][]), 0, row);
+			return dimAnnotations;
+		}
+		return AnnotationBinding.NoAnnotationsOnDimensions;
+	}
 	/*
 	 * @see ITypeBinding#getBinaryName()
 	 * @since 3.0
@@ -554,6 +585,19 @@
 		return this.interfaces = NO_TYPE_BINDINGS;
 	}
 
+	private ITypeBinding[] getIntersectingTypes() {
+		ITypeBinding[] intersectionBindings = TypeBinding.NO_TYPE_BINDINGS;
+		if (this.binding instanceof IntersectionTypeBinding18) {
+			ReferenceBinding[] intersectingTypes = this.binding.getIntersectingTypes();
+			int l = intersectingTypes.length;
+			intersectionBindings = new ITypeBinding[l];
+			for (int i = 0; i < l; ++i) {
+				intersectionBindings[i] = this.resolver.getTypeBinding(intersectingTypes[i]);
+			}
+		}
+		return intersectionBindings;
+	}
+
 	public IJavaElement getJavaElement() {
 		JavaElement element = getUnresolvedJavaElement();
 		if (element != null)
@@ -926,6 +970,8 @@
 		} else if (this.binding instanceof WildcardBinding) {
 			WildcardBinding wildcardBinding = (WildcardBinding) this.binding;
 			typeVariableBinding = wildcardBinding.typeVariable();
+		} else if (this.binding instanceof IntersectionTypeBinding18) {
+			return this.bounds = getIntersectingTypes();
 		}
 		if (typeVariableBinding != null) {
 			ReferenceBinding varSuperclass = typeVariableBinding.superclass();
@@ -1214,6 +1260,14 @@
 	}
 
 	/*
+	 * @see ITypeBinding#isIntersectionType18
+	 */
+	public boolean isIntersectionType() {
+		int kind = this.binding.kind();
+		return kind == Binding.INTERSECTION_TYPE18 || kind == Binding.INTERSECTION_TYPE;
+	}
+
+	/*
 	 * @see ITypeBinding#isLocal()
 	 */
 	public boolean isLocal() {
@@ -1363,6 +1417,17 @@
 		return this.typeAnnotations;
 	}
 
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jdt.core.dom.ITypeBinding#getTypeAnnotationsOnDimensions()
+	 */
+	public IAnnotationBinding[][] getTypeAnnotationsOnDimensions() {
+		if (this.typeAnnotationsOnDimensions == null) {
+			this.typeAnnotationsOnDimensions = resolveAnnotationBindingsOnDimensions(this.binding.getTypeAnnotations());
+		}
+		return this.typeAnnotationsOnDimensions;
+	}
+
 	static class LocalTypeBinding extends TypeBinding {
 
 		private IBinding declaringMember;
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java
index 0541f2a..55023d2 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java
@@ -1391,7 +1391,7 @@
 		} else {
 			normalizedBinding= normalizeTypeBinding(binding);
 			if (normalizedBinding == null) {
-				type = ast.newSimpleType(ast.newSimpleName("invalid")); //$NON-NLS-1$
+				 return ast.newSimpleType(ast.newSimpleName("invalid")); //$NON-NLS-1$
 			} else if (normalizedBinding.isTypeVariable()) {
 					// no import
 				type = ast.newSimpleType(ast.newSimpleName(binding.getName()));
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/CommentsPreparator.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/CommentsPreparator.java
index 1e2c529..7233476 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/CommentsPreparator.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/CommentsPreparator.java
@@ -57,16 +57,17 @@
 	private final static Pattern HTML_TAG_PATTERN;
 	private final static Pattern HTML_ATTRIBUTE_PATTERN;
 	static {
-		String formatCodeTags = "(pre)?"; //$NON-NLS-1$
-		String separateLineTags = "(dl|hr|nl|p|ul|ol|table|tr)?"; //$NON-NLS-1$
-		String breakBeforeTags = "(dd|dt|li|td|th|h1|h2|h3|h4|h5|h6|q)?"; //$NON-NLS-1$
-		String breakAfterTags = "(br)?"; //$NON-NLS-1$
-		String noFormatTags = "(code|em|tt)?"; //$NON-NLS-1$
-		String otherTags = "([^<>&&\\S]+)??"; //$NON-NLS-1$
-		String ws = "(?:[ \\t]+|[\\r\\n]+[ \\t]*\\*?)"; // whitespace or line break with optional asterisk //$NON-NLS-1$
-		String attribute = "(?:" + ws + "+[^=&&\\S]+" + ws + "*(=)" + ws + "*\"?[^\"]*\"?)"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		HTML_TAG_PATTERN = Pattern.compile("<(/)?" //$NON-NLS-1$
-				+ formatCodeTags + separateLineTags + breakBeforeTags + breakAfterTags + noFormatTags + otherTags
+		String formatCodeTags = "(pre)"; //$NON-NLS-1$
+		String separateLineTags = "(dl|hr|nl|p|ul|ol|table|tr)"; //$NON-NLS-1$
+		String breakBeforeTags = "(dd|dt|li|td|th|h1|h2|h3|h4|h5|h6|q)"; //$NON-NLS-1$
+		String breakAfterTags = "(br)"; //$NON-NLS-1$
+		String noFormatTags = "(code|em|tt)"; //$NON-NLS-1$
+		String otherTags = "([^<>&&\\S]++)"; //$NON-NLS-1$
+		String ws = "(?>[ \\t]++|[\\r\\n]++[ \\t]*+\\*?)"; // whitespace or line break with optional asterisk //$NON-NLS-1$
+		String attributeValue = "(?>\"[^\"]*\")|(?>\'[^\']*\')|[^/>\"\'&&\\S]++"; //$NON-NLS-1$
+		String attribute = "(?>" + ws + "+[^=&&\\S]+" + ws + "*(=)" + ws + "*(?>" + attributeValue  + "))"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+		HTML_TAG_PATTERN = Pattern.compile("<(/)?+(?:" //$NON-NLS-1$
+				+ formatCodeTags + '|' + separateLineTags + '|' + breakBeforeTags + '|' + breakAfterTags + '|' + noFormatTags + '|' + otherTags + ')'
 				+ "(" + attribute + "*)" + ws + "*/?>", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		HTML_ATTRIBUTE_PATTERN = Pattern.compile(attribute);
 	}
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/LineBreaksPreparator.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/LineBreaksPreparator.java
index ae1ef58..92b756b 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/LineBreaksPreparator.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/LineBreaksPreparator.java
@@ -361,27 +361,28 @@
 	@Override
 	public boolean visit(ArrayInitializer node) {
 		int openBraceIndex = this.tm.firstIndexIn(node, TokenNameLBRACE);
-		Token afterOpenBraceToken = this.tm.get(openBraceIndex + 1);
-		boolean isEmpty = afterOpenBraceToken.tokenType == TokenNameRBRACE;
-		if (isEmpty && this.options.keep_empty_array_initializer_on_one_line)
-			return true;
+		boolean isEmpty = handleEmptyLinesIndentation(openBraceIndex);
 
-		Token openBraceToken = this.tm.get(openBraceIndex);
 		int closeBraceIndex = this.tm.lastIndexIn(node, TokenNameRBRACE);
-		handleBracePosition(openBraceToken, closeBraceIndex, this.options.brace_position_for_array_initializer);
+		Token openBraceToken = this.tm.get(openBraceIndex);
+		Token closeBraceToken = this.tm.get(closeBraceIndex);
+
+		if (!(node.getParent() instanceof ArrayInitializer)) {
+			Token afterOpenBraceToken = this.tm.get(openBraceIndex + 1);
+			for (int i = 0; i < this.options.continuation_indentation_for_array_initializer; i++) {
+				afterOpenBraceToken.indent();
+				closeBraceToken.unindent();
+			}
+		}
+
+		if (!isEmpty || !this.options.keep_empty_array_initializer_on_one_line)
+			handleBracePosition(openBraceToken, closeBraceIndex, this.options.brace_position_for_array_initializer);
 
 		if (!isEmpty) {
-			Token closeBraceToken = this.tm.get(closeBraceIndex);
 			if (this.options.insert_new_line_after_opening_brace_in_array_initializer)
 				openBraceToken.breakAfter();
 			if (this.options.insert_new_line_before_closing_brace_in_array_initializer)
 				closeBraceToken.breakBefore();
-			if (!(node.getParent() instanceof ArrayInitializer)) {
-				for (int i = 0; i < this.options.continuation_indentation_for_array_initializer; i++) {
-					afterOpenBraceToken.indent();
-					closeBraceToken.unindent();
-				}
-			}
 		}
 		return true;
 	}
@@ -550,6 +551,7 @@
 				: this.tm.firstIndexAfter(nodeBeforeOpenBrace, TokenNameLBRACE);
 		int closeBraceIndex = this.tm.lastIndexIn(node, TokenNameRBRACE);
 		Token openBraceToken = this.tm.get(openBraceIndex);
+		Token closeBraceToken = this.tm.get(closeBraceIndex);
 		handleBracePosition(openBraceToken, closeBraceIndex, bracePosition);
 
 		boolean isEmpty = true;
@@ -559,13 +561,16 @@
 				break;
 			}
 		}
+
+		handleEmptyLinesIndentation(openBraceIndex);
+
 		if (!isEmpty || newLineInEmpty) {
 			openBraceToken.breakAfter();
-			this.tm.get(closeBraceIndex).breakBefore();
+			closeBraceToken.breakBefore();
 		}
 		if (indentBody) {
 			this.tm.get(openBraceIndex + 1).indent();
-			this.tm.get(closeBraceIndex).unindent();
+			closeBraceToken.unindent();
 		}
 	}
 
@@ -582,6 +587,31 @@
 		}
 	}
 
+	private boolean handleEmptyLinesIndentation(int openBraceIndex) {
+		Token open = this.tm.get(openBraceIndex);
+		Token next = this.tm.get(openBraceIndex + 1);
+		boolean isEmpty = next.tokenType == TokenNameRBRACE;
+		if (!isEmpty || this.tm.countLineBreaksBetween(open, next) < 2 || !this.options.indent_empty_lines)
+			return isEmpty;
+
+		// find a line break and make a token out of it
+		for (int i = open.originalEnd + 1; i < next.originalStart; i++) {
+			char c = this.tm.charAt(i);
+			char c2 = this.tm.charAt(i + 1);
+			int lineBreakStart = (c == '\r' || c == '\n') ? i : -1;
+			int lineBreakEnd = ((c2 == '\r' || c2 == '\n') && c2 != c) ? i + 1 : lineBreakStart;
+			if (lineBreakStart >= 0) {
+				Token emptyLineToken = new Token(lineBreakStart, lineBreakEnd, Token.TokenNameEMPTY_LINE);
+				emptyLineToken.breakBefore();
+				emptyLineToken.breakAfter();
+				emptyLineToken.setToEscape(true); // force text builder to use toString()
+				this.tm.insert(openBraceIndex + 1, emptyLineToken);
+				return true;
+			}
+		}
+		return true;
+	}
+
 	private void indent(ASTNode node) {
 		int startIndex = this.tm.firstIndexIn(node, -1);
 		while (startIndex > 0 && this.tm.get(startIndex - 1).isComment())
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java
index 9ecfdc8..2377567 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java
@@ -191,9 +191,10 @@
 		} else {

 			handleToken(node.getName(), TokenNameLPAREN, spaceBeforeOpenParen, spaceAfterOpenParen);

 

-			if (node.isConstructor() ? this.options.insert_space_before_closing_paren_in_constructor_declaration

-					: this.options.insert_space_before_closing_paren_in_method_declaration)

-				handleToken(node.getName(), TokenNameRPAREN, true, false);

+			boolean spaceBeforeCloseParen = node.isConstructor()

+					? this.options.insert_space_before_closing_paren_in_constructor_declaration

+					: this.options.insert_space_before_closing_paren_in_method_declaration;

+			handleTokenBefore(node.getBody(), TokenNameRPAREN, spaceBeforeCloseParen, false);

 		}

 

 		if ((node.isConstructor() ? this.options.insert_space_before_opening_brace_in_constructor_declaration

@@ -464,7 +465,8 @@
 		if (handleParenthesis) {

 			handleToken(node, TokenNameLPAREN, this.options.insert_space_before_opening_paren_in_annotation,

 					this.options.insert_space_after_opening_paren_in_annotation);

-			handleToken(node, TokenNameRPAREN, this.options.insert_space_before_closing_paren_in_annotation, false);

+			if (this.options.insert_space_before_closing_paren_in_annotation)

+				this.tm.lastTokenIn(node, TokenNameRPAREN).spaceBefore();

 		}

 

 		ASTNode parent = node.getParent();

@@ -486,7 +488,7 @@
 						this.options.insert_space_before_opening_paren_in_method_declaration,

 						this.options.insert_space_after_opening_paren_in_method_declaration);

 

-				handleToken(node, TokenNameRPAREN,

+				handleTokenBefore(node.getBody(), TokenNameRPAREN,

 						this.options.insert_space_before_closing_paren_in_method_declaration, false);

 			}

 			handleCommas(parameters, this.options.insert_space_before_comma_in_method_declaration_parameters,

@@ -497,19 +499,17 @@
 

 	@Override

 	public boolean visit(Block node) {

-		if (node.getParent().getLength() == 0)

+		ASTNode parent = node.getParent();

+		if (parent.getLength() == 0)

 			return true; // this is a fake block created by parsing in statements mode

-		if (node.getParent() instanceof MethodDeclaration)

+		if (parent instanceof MethodDeclaration)

 			return true; // spaces handled in #visit(MethodDeclaration)

 

 		handleToken(node, TokenNameLBRACE, this.options.insert_space_before_opening_brace_in_block, false);

-		if (this.options.insert_space_after_closing_brace_in_block) {

+		if (this.options.insert_space_after_closing_brace_in_block

+				&& (parent instanceof Statement || parent instanceof CatchClause)) {

 			int closeBraceIndex = this.tm.lastIndexIn(node, TokenNameRBRACE);

-			if (closeBraceIndex + 1 < this.tm.size()) {

-				int nextToken = this.tm.get(closeBraceIndex + 1).tokenType;

-				if (nextToken != TokenNameSEMICOLON && nextToken != TokenNameRPAREN)

-					this.tm.get(closeBraceIndex).spaceAfter();

-			}

+			this.tm.get(closeBraceIndex).spaceAfter();

 		}

 		return true;

 	}

@@ -601,7 +601,7 @@
 	public boolean visit(ClassInstanceCreation node) {

 		List<Type> typeArguments = node.typeArguments();

 		handleTypeArguments(typeArguments);

-		handleInvocation(node, node.getType());

+		handleInvocation(node, node.getType(), node.getAnonymousClassDeclaration());

 		if (!typeArguments.isEmpty()) {

 			handleTokenBefore(typeArguments.get(0), TokenNamenew, false, true); // fix for: new<Integer>A<String>()

 		}

@@ -631,6 +631,11 @@
 	}

 

 	private void handleInvocation(ASTNode invocationNode, ASTNode nodeBeforeOpeningParen) {

+		handleInvocation(invocationNode, nodeBeforeOpeningParen, null);

+	}

+

+	private void handleInvocation(ASTNode invocationNode, ASTNode nodeBeforeOpeningParen,

+			ASTNode nodeAfterClosingParen) {

 		if (handleEmptyParens(nodeBeforeOpeningParen,

 				this.options.insert_space_between_empty_parens_in_method_invocation)) {

 			handleToken(nodeBeforeOpeningParen, TokenNameLPAREN,

@@ -640,7 +645,10 @@
 					this.options.insert_space_before_opening_paren_in_method_invocation,

 					this.options.insert_space_after_opening_paren_in_method_invocation);

 			if (this.options.insert_space_before_closing_paren_in_method_invocation) {

-				this.tm.lastTokenIn(invocationNode, TokenNameRPAREN).spaceBefore();

+				Token closingParen = nodeAfterClosingParen == null

+						? this.tm.lastTokenIn(invocationNode, TokenNameRPAREN)

+						: this.tm.firstTokenBefore(nodeAfterClosingParen, TokenNameRPAREN);

+				closingParen.spaceBefore();

 			}

 		}

 	}

diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/TextEditsBuilder.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/TextEditsBuilder.java
index f1b92e1..8e725a9 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/TextEditsBuilder.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/TextEditsBuilder.java
@@ -153,7 +153,7 @@
 			if (getLineBreaksBefore() > 1) {
 				Token indentToken = null;
 				if (this.options.indent_empty_lines && token.tokenType != TokenNameNotAToken)
-					indentToken = token.getIndent() > getPrevious().getIndent() ? token : getPrevious();
+					indentToken = (index == 0 || token.getIndent() > getPrevious().getIndent()) ? token : getPrevious();
 				for (int i = 1; i < getLineBreaksBefore(); i++) {
 					bufferLineSeparator(token, true);
 					if (indentToken != null)
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/Token.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/Token.java
index 66dfafb..762edd0 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/Token.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/Token.java
@@ -70,6 +70,9 @@
 		}
 	}
 
+	/** Special token type used to mark tokens that store empty line indentation */
+	public static final int TokenNameEMPTY_LINE = 10000;
+
 	/** Position in source of the first character. */
 	public final int originalStart;
 	/** Position in source of the last character (this position is included in the token). */
@@ -276,6 +279,8 @@
 	}
 
 	public String toString(String source) {
+		if (this.tokenType == TokenNameEMPTY_LINE)
+			return ""; //$NON-NLS-1$
 		return source.substring(this.originalStart, this.originalEnd + 1);
 	}
 
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/TokenManager.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/TokenManager.java
index aff5ee5..76f74e1 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/TokenManager.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/TokenManager.java
@@ -432,6 +432,8 @@
 		for (Token[] pair : this.formatOffTagPairs) {
 			int index1 = findIndex(pair[0].originalStart, -1, false);
 			int index2 = findIndex(pair[1].originalEnd, -1, false);
+			pair[0] = get(index1);
+			pair[1] = get(index2);
 			Token unformatted = new Token(pair[0].originalStart, pair[1].originalEnd, TokenNameWHITESPACE);
 			unformatted.setIndent(Math.min(pair[0].getIndent(), findSourcePositionInLine(pair[0].originalStart)));
 			unformatted.putLineBreaksBefore(pair[0].getLineBreaksBefore());
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/CommentWrapExecutor.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/CommentWrapExecutor.java
index dd89f53..b24658a 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/CommentWrapExecutor.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/CommentWrapExecutor.java
@@ -227,6 +227,7 @@
 		if (prefix.tokenType == TokenNameWHITESPACE) {
 			whitespace = new Token(prefix);
 			whitespace.breakBefore();
+			whitespace.setIndent(indent);
 			whitespace.setWrapPolicy(new WrapPolicy(0, commentIndex, false));
 			prefix = structure.get(1);
 			assert prefix.tokenType == TokenNameCOMMENT_LINE;
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/FieldAligner.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/FieldAligner.java
index a548f48..9c15869 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/FieldAligner.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/FieldAligner.java
@@ -23,7 +23,6 @@
 import org.eclipse.jdt.core.dom.BodyDeclaration;
 import org.eclipse.jdt.core.dom.FieldDeclaration;
 import org.eclipse.jdt.core.dom.SimpleName;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
 import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
 import org.eclipse.jdt.internal.formatter.Token;
 import org.eclipse.jdt.internal.formatter.TokenManager;
@@ -71,21 +70,14 @@
 		this.tm = tokenManager;
 	}
 
-	public void prepareAlign(TypeDeclaration node) {
-		List<FieldDeclaration> bodyDeclarations = node.bodyDeclarations();
+	public void prepareAlign(List<FieldDeclaration> bodyDeclarations) {
 		ArrayList<FieldDeclaration> alignGroup = new ArrayList<>();
 		for (BodyDeclaration declaration : bodyDeclarations) {
-			if (!alignGroup.isEmpty()) {
-				if ((declaration instanceof FieldDeclaration)) {
-					alignGroup.add((FieldDeclaration) declaration);
-				} else {
-					alignFields(alignGroup);
-					alignGroup = new ArrayList<>();
-				}
-			}
-			if (alignGroup.isEmpty()) {
-				if (declaration instanceof FieldDeclaration)
-					alignGroup.add((FieldDeclaration) declaration);
+			if ((declaration instanceof FieldDeclaration)) {
+				alignGroup.add((FieldDeclaration) declaration);
+			} else {
+				alignFields(alignGroup);
+				alignGroup = new ArrayList<>();
 			}
 		}
 		alignFields(alignGroup);
@@ -104,7 +96,7 @@
 			int positionInLine = this.tm.getPositionInLine(nameIndex);
 			maxNameAlign = Math.max(maxNameAlign, positionInLine);
 		}
-		maxNameAlign = this.tm.toIndent(maxNameAlign, true);
+		maxNameAlign = this.tm.toIndent(maxNameAlign, false);
 
 		int maxAssignAlign = 0;
 		for (FieldDeclaration declaration : alignGroup) {
@@ -121,7 +113,7 @@
 				maxAssignAlign = Math.max(maxAssignAlign, positionInLine);
 			}
 		}
-		maxAssignAlign = this.tm.toIndent(maxAssignAlign, true);
+		maxAssignAlign = this.tm.toIndent(maxAssignAlign, false);
 
 		for (FieldDeclaration declaration : alignGroup) {
 			List<VariableDeclarationFragment> fragments = declaration.fragments();
@@ -155,7 +147,7 @@
 				maxCommentAlign = Math.max(maxCommentAlign,
 						positionCounter.findMaxPosition(firstIndexInLine, lastIndex));
 			}
-			maxCommentAlign = this.tm.toIndent(maxCommentAlign, true);
+			maxCommentAlign = this.tm.toIndent(maxCommentAlign, false);
 
 			for (FieldDeclaration declaration : alignGroup) {
 				int typeIndex = this.tm.firstIndexIn(declaration.getType(), -1);
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java
index 791c385..a25a29b 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java
@@ -320,6 +320,7 @@
 						findWrapsCached(index, currentIndent);
 						break;
 					}
+					currentIndent = Math.max(currentIndent, token.getAlign());
 					token.setIndent(currentIndent);
 				}
 				token = this.tm.get(index);
@@ -346,6 +347,7 @@
 					break;
 				if (shouldForceWrap(token, currentIndent))
 					currentIndent = token.getIndent();
+				currentIndent = Math.max(currentIndent, token.getAlign());
 				token.setIndent(currentIndent);
 			}
 		}
@@ -634,8 +636,8 @@
 
 	int getWrapIndent(Token token) {
 		WrapPolicy policy = token.getWrapPolicy();
-		if (policy == null || (token.getLineBreaksBefore() > 1 && !policy.isForced && !policy.isTopPriority()))
-			return token.getIndent(); // no additional indentation after an empty line
+		if (policy == null)
+			return token.getIndent();
 
 		if (this.options.never_indent_line_comments_on_first_column && token.tokenType == TokenNameCOMMENT_LINE
 				&& token.getIndent() == 0)
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java
index 39bcda7..3ac9ad2 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java
@@ -38,6 +38,7 @@
 
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ASTVisitor;
+import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration;
 import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
 import org.eclipse.jdt.core.dom.ArrayInitializer;
 import org.eclipse.jdt.core.dom.Assignment;
@@ -106,7 +107,7 @@
 	final DefaultCodeFormatterOptions options;
 	final int kind;
 	
-	FieldAligner fieldAligner;
+	final FieldAligner fieldAligner;
 
 	int importsStart = -1, importsEnd = -1;
 
@@ -125,11 +126,17 @@
 		this.tm = tokenManager;
 		this.options = options;
 		this.kind = kind;
+
+		this.fieldAligner = new FieldAligner(this.tm);
 	}
 
 	@Override
 	public boolean preVisit2(ASTNode node) {
 		this.currentDepth++;
+
+		assert this.wrapIndexes.isEmpty() && this.wrapPenalties.isEmpty();
+		assert this.wrapParentIndex == -1 && this.wrapGroupEnd == -1;
+
 		boolean isMalformed = (node.getFlags() & ASTNode.MALFORMED) != 0;
 		if (isMalformed) {
 			this.tm.addDisableFormatTokenPair(this.tm.firstTokenIn(node, -1), this.tm.lastTokenIn(node, -1));
@@ -180,12 +187,23 @@
 			handleWrap(this.options.alignment_for_superinterfaces_in_type_declaration, PREFERRED);
 		}
 
-		if (this.options.align_type_members_on_columns) {
-			if (this.fieldAligner == null) {
-				this.fieldAligner = new FieldAligner(this.tm);
-			}
-			this.fieldAligner.prepareAlign(node);
-		}
+		if (this.options.align_type_members_on_columns)
+			this.fieldAligner.prepareAlign(node.bodyDeclarations());
+
+		return true;
+	}
+
+	@Override
+	public boolean visit(AnnotationTypeDeclaration node) {
+		if (this.options.align_type_members_on_columns)
+			this.fieldAligner.prepareAlign(node.bodyDeclarations());
+		return true;
+	}
+
+	@Override
+	public boolean visit(AnonymousClassDeclaration node) {
+		if (this.options.align_type_members_on_columns)
+			this.fieldAligner.prepareAlign(node.bodyDeclarations());
 		return true;
 	}
 
@@ -218,13 +236,16 @@
 		}
 
 		if (!node.isConstructor()) {
+			this.wrapParentIndex = this.tm.findFirstTokenInLine(this.tm.firstIndexIn(node.getName(), -1));
 			List<TypeParameter> typeParameters = node.typeParameters();
 			if (!typeParameters.isEmpty())
 				this.wrapIndexes.add(this.tm.firstIndexIn(typeParameters.get(0), -1));
-			if (node.getReturnType2() != null && !node.modifiers().isEmpty())
-				this.wrapIndexes.add(this.tm.firstIndexIn(node.getReturnType2(), -1));
+			if (node.getReturnType2() != null) {
+				int returTypeIndex = this.tm.firstIndexIn(node.getReturnType2(), -1);
+				if (returTypeIndex != this.wrapParentIndex)
+					this.wrapIndexes.add(returTypeIndex);
+			}
 			this.wrapIndexes.add(this.tm.firstIndexIn(node.getName(), -1));
-			this.wrapParentIndex = this.tm.findFirstTokenInLine(this.tm.firstIndexIn(node.getName(), -1));
 			this.wrapGroupEnd = this.tm.lastIndexIn(node.getName(), -1);
 			handleWrap(this.options.alignment_for_method_declaration);
 		}
@@ -252,6 +273,10 @@
 			this.wrapPenalties.add(PREFERRED);
 			handleWrap(this.options.alignment_for_superinterfaces_in_enum_declaration, node);
 		}
+
+		if (this.options.align_type_members_on_columns)
+			this.fieldAligner.prepareAlign(node.bodyDeclarations());
+
 		return true;
 	}
 
@@ -333,7 +358,8 @@
 		findTokensToWrap(node, 0);
 		this.wrapParentIndex = this.wrapIndexes.remove(0);
 		this.wrapGroupEnd = this.tm.lastIndexIn(node, -1);
-		if ((this.options.alignment_for_binary_expression & Alignment.M_INDENT_ON_COLUMN) != 0)
+		if ((this.options.alignment_for_binary_expression & Alignment.M_INDENT_ON_COLUMN) != 0
+				&& this.wrapParentIndex > 0)
 			this.wrapParentIndex--;
 		for (int i = this.wrapParentIndex; i >= 0; i--) {
 			if (!this.tm.get(i).isComment()) {
@@ -562,7 +588,6 @@
 			this.wrapParentIndex = this.tm.findIndex(firstToken.originalStart - 1, TokenNameLPAREN, false);
 			if (!arguments.isEmpty() && this.wrapGroupEnd < 0)
 				this.wrapGroupEnd = this.tm.lastIndexIn(arguments.get(arguments.size() - 1), -1);
-			assert this.wrapGroupEnd >= 0;
 			handleWrap(wrappingOption, 1 / PREFERRED);
 		}
 	}
@@ -577,17 +602,22 @@
 	}
 
 	private void handleWrap(int wrappingOption, ASTNode parentNode) {
+		doHandleWrap(wrappingOption, parentNode);
+		this.wrapIndexes.clear();
+		this.wrapPenalties.clear();
+		this.wrapParentIndex = this.wrapGroupEnd = -1;
+	}
+
+	private void doHandleWrap(int wrappingOption, ASTNode parentNode) {
 		if (this.wrapIndexes.isEmpty())
 			return;
-		assert this.wrapParentIndex >= 0;
+		assert this.wrapParentIndex >= 0 && this.wrapParentIndex < this.wrapIndexes.get(0);
+		assert this.wrapGroupEnd >= this.wrapIndexes.get(this.wrapIndexes.size() - 1);
 		float penalty = this.wrapPenalties.isEmpty() ? 1 : this.wrapPenalties.get(0);
 		WrapPolicy policy = getWrapPolicy(wrappingOption, penalty, true, parentNode);
-		if (policy == null) {
-			this.wrapIndexes.clear();
-			this.wrapPenalties.clear();
-			this.wrapParentIndex = this.wrapGroupEnd = -1;
+		if (policy == null)
 			return;
-		}
+
 		setTokenWrapPolicy(this.wrapIndexes.get(0), policy, true);
 
 		boolean wrapPreceedingComments = !(parentNode instanceof InfixExpression)
@@ -615,9 +645,6 @@
 					this.tm.get(this.wrapIndexes.get(0)).breakBefore();
 			}
 		}
-		this.wrapIndexes.clear();
-		this.wrapPenalties.clear();
-		this.wrapParentIndex = this.wrapGroupEnd = -1;
 	}
 
 	private void setTokenWrapPolicy(int index, WrapPolicy policy, boolean wrapPreceedingComments) {
@@ -704,8 +731,7 @@
 	public void finishUp(ASTNode astRoot) {
 		preserveExistingLineBreaks();
 		new WrapExecutor(this.tm, this.options).executeWraps();
-		if (this.fieldAligner != null)
-			this.fieldAligner.alignComments();
+		this.fieldAligner.alignComments();
 		wrapComments();
 		fixEnumConstantIndents(astRoot);
 	}
@@ -722,45 +748,25 @@
 
 			@Override
 			protected boolean token(Token token, int index) {
-				int lineBreaks = getLineBreaksBetween(getPrevious(), token);
-				if (index > WrapPreparator.this.importsStart && index < WrapPreparator.this.importsEnd) {
-					lineBreaks = lineBreaks > 1 ? (this.options2.blank_lines_between_import_groups + 1) : 0;
-				} else {
-					lineBreaks = Math.min(lineBreaks, this.options2.number_of_empty_lines_to_preserve + 1);
-				}
+				boolean isBetweenImports = index > WrapPreparator.this.importsStart && index < WrapPreparator.this.importsEnd;
+				int lineBreaks = getLineBreaksToPreserve(getPrevious(), token, isBetweenImports);
 				if (lineBreaks <= getLineBreaksBefore())
 					return true;
 
-				if (!this.options2.join_wrapped_lines && token.isWrappable() && lineBreaks == 1) {
-					token.breakBefore();
+				if (lineBreaks == 1) {
+					if ((!this.options2.join_wrapped_lines && token.isWrappable()) || index == 0)
+						token.breakBefore();
 				} else if (lineBreaks > 1) {
-					if (index == 0)
-						lineBreaks--;
 					token.putLineBreaksBefore(lineBreaks);
 				}
 				return true;
 			}
 
-			private int getLineBreaksBetween(Token token1, Token token2) {
-				if (token1 != null) {
-					List<Token> structure1 = token1.getInternalStructure();
-					if (structure1 != null && !structure1.isEmpty())
-						token1 = structure1.get(structure1.size() - 1);
-				}
-				List<Token> structure2 = token2.getInternalStructure();
-				if (structure2 != null && !structure2.isEmpty())
-					token2 = structure2.get(0);
-				int lineBreaks = WrapPreparator.this.tm.countLineBreaksBetween(token1, token2);
-				if (token1 == null)
-					lineBreaks++;
-				return lineBreaks;
-			}
 		});
 
 		Token last = this.tm.get(this.tm.size() - 1);
 		last.clearLineBreaksAfter();
-		int endingBreaks = this.tm.countLineBreaksBetween(last, null);
-		endingBreaks = Math.min(endingBreaks, this.options.number_of_empty_lines_to_preserve);
+		int endingBreaks = getLineBreaksToPreserve(last, null, false);
 		if (endingBreaks > 0) {
 			last.putLineBreaksAfter(endingBreaks);
 		} else if ((this.kind & CodeFormatter.K_COMPILATION_UNIT) != 0
@@ -769,6 +775,29 @@
 		}
 	}
 
+	int getLineBreaksToPreserve(Token token1, Token token2, boolean isBetweenImports) {
+		if (token1 != null) {
+			List<Token> structure = token1.getInternalStructure();
+			if (structure != null && !structure.isEmpty())
+				token1 = structure.get(structure.size() - 1);
+		}
+		if (token2 != null) {
+			List<Token> structure = token2.getInternalStructure();
+			if (structure != null && !structure.isEmpty())
+				token2 = structure.get(0);
+		}
+		int lineBreaks = WrapPreparator.this.tm.countLineBreaksBetween(token1, token2);
+		if (isBetweenImports)
+			return lineBreaks > 1 ? (this.options.blank_lines_between_import_groups + 1) : 0;
+
+		int toPreserve = this.options.number_of_empty_lines_to_preserve;
+		if (token1 != null && token2 != null)
+			toPreserve++; // n empty lines = n+1 line breaks, except for file start and end
+		if (token1 != null && token1.tokenType == Token.TokenNameEMPTY_LINE)
+			toPreserve--;
+		return Math.min(lineBreaks, toPreserve);
+	}
+
 	private void wrapComments() {
 		CommentWrapExecutor commentWrapper = new CommentWrapExecutor(this.tm, this.options);
 		boolean isNLSTagInLine = false;
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/DocumentElementParser.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/DocumentElementParser.java
index 5f893e7..0ea74b9 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/DocumentElementParser.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/DocumentElementParser.java
@@ -1308,6 +1308,7 @@
 }
 protected void parse() {
 	this.diet = true;
+	this.dietInt = 0;
 	super.parse();
 }
 /*
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/SourceElementParser.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/SourceElementParser.java
index faa6d04..c21ab1f 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/SourceElementParser.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/compiler/SourceElementParser.java
@@ -946,9 +946,11 @@
 	IProgressMonitor pm) {
 
 	boolean old = this.diet;
+	int oldInt = this.dietInt;
 	CompilationUnitDeclaration parsedUnit = null;
 	try {
 		this.diet = true;
+		this.dietInt = 0;
 		this.reportReferenceInfo = fullParse;
 		CompilationResult compilationUnitResult = new CompilationResult(unit, 0, 0, this.options.maxProblemsPerUnit);
 		parsedUnit = parse(unit, compilationUnitResult);
@@ -976,6 +978,7 @@
 		// ignore this exception
 	} finally {
 		this.diet = old;
+		this.dietInt = oldInt;
 		reset();
 	}
 	return parsedUnit;
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMapper.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMapper.java
index aff2184..85e8139 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMapper.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMapper.java
@@ -1321,7 +1321,7 @@
 		} else if (this.binaryType.getElementName().equals(typeName))
 			return this.binaryType;
 		else
-			return this.binaryType.getType(typeName);
+			return ((this.typeDepth <= 1) ? this.binaryType : this.types[this.typeDepth - 1]).getType(typeName);
 	}
 
 	/**
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/BasicSearchEngine.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/BasicSearchEngine.java
index dc0177b..fa43a28 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/BasicSearchEngine.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/BasicSearchEngine.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2015 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
@@ -1359,7 +1359,9 @@
 					if (qualificationLength > 0) {
 						System.arraycopy(record.qualification, 0, path, pos, qualificationLength - 1);
 						CharOperation.replace(path, '.', '/');
-						path[qualificationLength-1] = '/';
+
+						// Do not use '/'. Access rules work on package level and should not discriminate on enclosing types.
+						path[qualificationLength-1] = '$';
 						pos += qualificationLength;
 					}
 					if (nameLength > 0) {
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
index fef7832..5b5634c 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
@@ -1047,11 +1047,10 @@
  * Selects the most applicable method (though similar but not to be confused with its namesake in jls)
  * All this machinery for that elusive uncommon case referred in bug 431357.
  */
-private MethodBinding getMostApplicableMethod(List<MethodBinding> possibleMethods) {
+private MethodBinding getMostApplicableMethod(List<MethodBinding> possibleMethods, MethodPattern methodPattern) {
 	int size = possibleMethods.size();
 	MethodBinding result = size != 0 ? possibleMethods.get(0) : null;
 	if (size > 1) {
-		MethodPattern methodPattern =  ((MethodPattern) this.pattern);
 		// can cache but may not be worth since this is not a common case
 		Map<Integer, List<String>> methodPatternReverseNames = getSplitNames(methodPattern.parameterQualifications, methodPattern.parameterSimpleNames);
 		int len = possibleMethods.size();
@@ -1133,7 +1132,7 @@
 					possibleMethods.add(methods[i]);
 				}
 			}
-			result =  getMostApplicableMethod(possibleMethods);
+			result =  getMostApplicableMethod(possibleMethods, methodPattern);
 		}
 	}
 	this.bindings.put(methodPattern, result != null ? result : new ProblemMethodBinding(methodPattern.selector, null, ProblemReasons.NotFound));