diff --git a/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF b/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF
index cf30c8b..831ff4b 100644
--- a/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.core.tests.compiler
-Bundle-Version: 3.7.1
+Bundle-Version: 3.8.0
 Bundle-ClassPath: jdtcoretestscompiler.jar
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
index 9d773de..f15f9de 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
@@ -1775,7 +1775,7 @@
         "      unusedLocal        + unread local variable\n" +
         "      unusedPrivate      + unused private member declaration\n" +
         "      unusedThrown         unused declared thrown exception\n" +
-        "      unusedTypeArgs     + unused type arguments for method\n" +
+        "      unusedTypeArgs     + unused type arguments for method and constructor\n" +
         "      uselessTypeCheck     unnecessary cast/instanceof operation\n" +
         "      varargsCast        + varargs argument need explicit cast\n" +
         "      warningToken       + unsupported or unnecessary @SuppressWarnings\n" +
@@ -9108,6 +9108,35 @@
 		"1 problem (1 warning)",
 		true);
 }
+//-warn option - regression tests
+public void test230_warn_options() {
+	// same source as 190, skip check defaults
+	this.runConformTest(
+		new String[] {
+			"X.java",
+			"import java.util.ArrayList;\n" +
+			"public class X<T>{\n" +
+			"  public X() {\n" +
+			"  }\n" +
+			"  public X(T t){}\n" +
+			"  void foo() {\n" +
+			"      X<String> x = new X<String>();\n" +
+			"	   X<Number> x1 = new X<Number>(1);\n" +
+			"  }\n" +
+			"}\n"
+		},
+		"\"" + OUTPUT_DIR +  File.separator + "X.java\""
+		+ " -warn:unusedTypeArgs -proc:none -1.7 -d \"" + OUTPUT_DIR + "\"",
+		"",
+		"----------\n" + 
+		"1. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 7)\n" + 
+		"	X<String> x = new X<String>();\n" + 
+		"	                  ^\n" + 
+		"Redundant specification of type arguments <String>\n" + 
+		"----------\n" + 
+		"1 problem (1 warning)",
+		true);
+}
 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=216684
 // .java/.class files precedence depending on sourcepath and other conditions
 // ecj always selects source files from the sourcepath over class files
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CastTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CastTest.java
index 052bbc1..cef41ac 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CastTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CastTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2010 IBM Corporation and others.
+ * Copyright (c) 2003, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -1869,6 +1869,511 @@
 		"----------\n"
 	);
 }
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test051() {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		boolean y = (boolean) x;\n" + 
+			"		System.out.println(y);\n" + 
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return Boolean.TRUE;\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 4)\n" + 
+				"	boolean y = (boolean) x;\n" + 
+				"	            ^^^^^^^^^^^\n" + 
+				"Cannot cast from Object to boolean\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"true"
+			);
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test052() {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		byte y = (byte) x;\n" + 
+			"		System.out.println(y);\n" + 
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return new Byte((byte)1);\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 4)\n" + 
+				"	byte y = (byte) x;\n" + 
+				"	         ^^^^^^^^\n" + 
+				"Cannot cast from Object to byte\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"1"
+			);
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test053() {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		char y = (char) x;\n" + 
+			"		System.out.println(y);\n" + 
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return new Character('d');\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 4)\n" + 
+				"	char y = (char) x;\n" + 
+				"	         ^^^^^^^^\n" + 
+				"Cannot cast from Object to char\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"d"
+			);
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+// Also confirm that a check cast and unboxing conversion are generated.
+public void test054() throws Exception {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		int y = (int) x;\n" + 
+			"		System.out.println(y);\n" + 
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return new Integer(1);\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 4)\n" + 
+				"	int y = (int) x;\n" + 
+				"	        ^^^^^^^\n" + 
+				"Cannot cast from Object to int\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"1"
+			);
+		String expectedOutput = 
+				"  // Method descriptor #15 ([Ljava/lang/String;)V\n" + 
+				"  // Stack: 2, Locals: 3\n" + 
+				"  public static void main(java.lang.String[] args);\n" + 
+				"     0  invokestatic X.foo() : java.lang.Object [16]\n" + 
+				"     3  astore_1 [x]\n" + 
+				"     4  aload_1 [x]\n" + 
+				"     5  checkcast java.lang.Integer [20]\n" + 
+				"     8  invokevirtual java.lang.Integer.intValue() : int [22]\n" + 
+				"    11  istore_2 [y]\n" + 
+				"    12  getstatic java.lang.System.out : java.io.PrintStream [26]\n" + 
+				"    15  iload_2 [y]\n" + 
+				"    16  invokevirtual java.io.PrintStream.println(int) : void [32]\n" + 
+				"    19  return\n" + 
+				"      Line numbers:\n" + 
+				"        [pc: 0, line: 3]\n" + 
+				"        [pc: 4, line: 4]\n" + 
+				"        [pc: 12, line: 5]\n" + 
+				"        [pc: 19, line: 6]\n" + 
+				"      Local variable table:\n" + 
+				"        [pc: 0, pc: 20] local: args index: 0 type: java.lang.String[]\n" + 
+				"        [pc: 4, pc: 20] local: x index: 1 type: java.lang.Object\n" + 
+				"        [pc: 12, pc: 20] local: y index: 2 type: int\n" + 
+				"  \n";
+		File f = new File(OUTPUT_DIR + File.separator + "X.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);
+		}
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test055() {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		long y = (long) x;\n" + 
+			"		System.out.println(y);\n" + 
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return new Long(Long.MAX_VALUE);\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 4)\n" + 
+				"	long y = (long) x;\n" + 
+				"	         ^^^^^^^^\n" + 
+				"Cannot cast from Object to long\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"9223372036854775807"
+			);
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test056() {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		short y = (short) x;\n" + 
+			"		System.out.println(y);\n" + 
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return new Short((short) 1);\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 4)\n" + 
+				"	short y = (short) x;\n" + 
+				"	          ^^^^^^^^^\n" + 
+				"Cannot cast from Object to short\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"1"
+			);
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test057() {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		double y = (double) x;\n" + 
+			"		System.out.println(y);\n" + 
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return new Double(1.0);\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 4)\n" + 
+				"	double y = (double) x;\n" + 
+				"	           ^^^^^^^^^^\n" + 
+				"Cannot cast from Object to double\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"1.0"
+			);
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test058() {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		float y = (float) x;\n" + 
+			"		System.out.println(y);\n" + 
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return new Float(1.0f);\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 4)\n" + 
+				"	float y = (float) x;\n" + 
+				"	          ^^^^^^^^^\n" + 
+				"Cannot cast from Object to float\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"1.0"
+			);
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test059() {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" +
+			"		try {\n" + 
+			"			int y = (int) x;\n" +
+			"		} catch (ClassCastException e) {\n" +
+			"			System.out.println(\"SUCCESS\");\n" +
+			"			return;\n" +
+			"		}\n" + 
+			"		System.out.println(\"FAIL\");\n" + 
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return new Float(1.0f);\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 5)\n" + 
+				"	int y = (int) x;\n" + 
+				"	        ^^^^^^^\n" + 
+				"Cannot cast from Object to int\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"SUCCESS"
+			);
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test059b() {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		try {\n" + 
+			"			int y = (int) x;\n" +
+			"		} catch (ClassCastException e) {\n" +
+			"			System.out.println(\"SUCCESS\");\n" +
+			"			return;\n" +
+			"		}\n" + 
+			"		System.out.println(\"FAIL\");\n" +
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return Boolean.TRUE;\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 5)\n" + 
+				"	int y = (int) x;\n" + 
+				"	        ^^^^^^^\n" + 
+				"Cannot cast from Object to int\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"SUCCESS"
+			);
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test059c() {
+	CompilerOptions options = new CompilerOptions(getCompilerOptions());
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		try {\n" + 
+			"			char y = (char) x;\n" +
+			"		} catch (ClassCastException e) {\n" +
+			"			System.out.println(\"SUCCESS\");\n" +
+			"			return;\n" +
+			"		}\n" + 
+			"		System.out.println(\"FAIL\");\n" +
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return Boolean.TRUE;\n" + 
+			"	}\n" + 
+			"}";
+	if (options.sourceLevel < ClassFileConstants.JDK1_7) {
+		this.runNegativeTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"----------\n" + 
+				"1. ERROR in X.java (at line 5)\n" + 
+				"	char y = (char) x;\n" + 
+				"	         ^^^^^^^^\n" + 
+				"Cannot cast from Object to char\n" + 
+				"----------\n"
+			);
+	} else {
+		this.runConformTest(
+				new String[] {
+					"X.java",
+					source
+				},
+				"SUCCESS"
+			);
+	}
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test060() {
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		Boolean y = (Boolean) x;\n" + 
+			"		System.out.println(y);\n" + 
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return Boolean.TRUE;\n" + 
+			"	}\n" + 
+			"}";
+	this.runConformTest(
+			new String[] {
+				"X.java",
+				source
+			},
+			"true"
+		);
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353085
+public void test061() {
+	String source =
+			"public class X {\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Object x = foo();\n" + 
+			"		try {\n" + 
+			"			Float y = (Float) x;\n" +
+			"		} catch (ClassCastException e) {\n" +
+			"			System.out.println(\"SUCCESS\");\n" +
+			"			return;\n" +
+			"		}\n" + 
+			"		System.out.println(\"FAIL\");\n" +
+			"	}\n" + 
+			"	public static Object foo() {\n" + 
+			"		return Boolean.TRUE;\n" + 
+			"	}\n" + 
+			"}";
+	this.runConformTest(
+			new String[] {
+				"X.java",
+				source
+			},
+			"SUCCESS"
+		);
+}
 public static Class testClass() {
 	return CastTest.class;
 }
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 241c2aa..0c2d97e 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
@@ -12328,4 +12328,112 @@
 		"The method f(String) is ambiguous for the type B<String>\n" + 
 		"----------\n");
 }
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353089
+public void test353089() throws Exception {
+	this.runConformTest(
+		new String[] {
+			"X.java",
+			"import java.util.*;\n" +
+			"interface A {\n" +
+			"int get(List<String> l);\n" +
+			"}\n" +
+			"interface B  {\n" +
+			"int get(List<Integer> l);\n" +
+			"}\n" +
+			"interface C  extends A, B { \n" +
+			"int get(List l);      // name clash error here\n" +
+            "}\n" +
+			"public class X {\n" +
+            "    public static void main(String [] args) {\n" +
+			"        System.out.println(\"Built OK\");\n" +
+            "    }\n" +
+			"}"
+		},
+		"Built OK");
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353089
+public void test353089b() throws Exception {
+	this.runNegativeTest(
+		new String[] {
+			"X.java",
+			"import java.util.List;\n" +
+			"interface I {\n" +
+			"    void a(List<String> i, List<String> j);\n" +
+			"    void b(List<String> i, List<String> j);\n" +
+			"    void c(List i, List<String> j);\n" +
+			"}\n" +
+			"interface X extends I {\n" +
+			"    public void a(List<String> i, List j);\n" +
+			"    public void b(List i, List j);\n" +
+			"    public void c(List i, List j);\n" +
+			"    public void d(Zork z);\n" +
+			"}\n"
+		},
+		"----------\n" + 
+		"1. WARNING in X.java (at line 5)\n" + 
+		"	void c(List i, List<String> j);\n" + 
+		"	       ^^^^\n" + 
+		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
+		"----------\n" + 
+		"2. ERROR in X.java (at line 8)\n" + 
+		"	public void a(List<String> i, List j);\n" + 
+		"	            ^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+		"Name clash: The method a(List<String>, List) of type X has the same erasure as a(List<String>, List<String>) of type I but does not override it\n" + 
+		"----------\n" + 
+		"3. WARNING in X.java (at line 8)\n" + 
+		"	public void a(List<String> i, List j);\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 9)\n" + 
+		"	public void b(List i, List j);\n" + 
+		"	              ^^^^\n" + 
+		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
+		"----------\n" + 
+		"5. WARNING in X.java (at line 9)\n" + 
+		"	public void b(List i, List j);\n" + 
+		"	                      ^^^^\n" + 
+		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
+		"----------\n" + 
+		"6. WARNING in X.java (at line 10)\n" + 
+		"	public void c(List i, List j);\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 10)\n" + 
+		"	public void c(List i, List j);\n" + 
+		"	                      ^^^^\n" + 
+		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
+		"----------\n" + 
+		"8. ERROR in X.java (at line 11)\n" + 
+		"	public void d(Zork z);\n" + 
+		"	              ^^^^\n" + 
+		"Zork cannot be resolved to a type\n" + 
+		"----------\n");
+}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353089
+public void test353089c() throws Exception {
+	this.runNegativeTest(
+		new String[] {
+			"X.java",
+			"import java.util.List;\n" +
+			"interface IFtest {\n" +
+			"    public void doTest(Integer i, List<String> pList, List<String> pList2);\n" +
+			"}\n" +
+			"interface Impl extends IFtest {\n" +
+			"    public void doTest(Integer i, List<String> iList, List iList2);\n" +
+			"}\n"
+		},
+		"----------\n" + 
+		"1. ERROR in X.java (at line 6)\n" + 
+		"	public void doTest(Integer i, List<String> iList, List iList2);\n" + 
+		"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+		"Name clash: The method doTest(Integer, List<String>, List) of type Impl has the same erasure as doTest(Integer, List<String>, List<String>) of type IFtest but does not override it\n" + 
+		"----------\n" + 
+		"2. WARNING in X.java (at line 6)\n" + 
+		"	public void doTest(Integer i, List<String> iList, List iList2);\n" + 
+		"	                                                  ^^^^\n" + 
+		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
+		"----------\n");
+}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/StackMapAttributeTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/StackMapAttributeTest.java
index c56f34a..de0e7c6 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/StackMapAttributeTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/StackMapAttributeTest.java
@@ -6778,4 +6778,28 @@
 			true,
 			customOptions);
 	}
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=354052
+	public void test054() throws Exception {
+		this.runConformTest(
+			new String[] {
+				"X.java",
+				"public class X {\n" +
+				"public static void foo() {\n" +
+			    "     X z;\n" +
+			    "     while ((z = getObject()) != null) {\n" +
+			    "         z.bar();\n" +
+			    "     }\n" +
+			    "	  System.out.println(\"SUCCESS\");\n" +
+			    " }\n" +
+			    " public void bar() {}\n" +
+			    " public static X getObject() {\n" +
+			    "     return null;\n" +
+			    " }\n" +
+				"   public static void main(String[] args) {\n"+
+				"       new X().foo();\n"+
+				"   }\n"+
+				"}",
+			},
+			"SUCCESS");
+	}
 }
