Merge branch 'sherrmann/osgi.WeavingHook'
diff --git a/.gitignore b/.gitignore
index f6c62c4..9892c4a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 /*/bin/
+/contrib/*/bin/
 /plugins/*/bin/
 /plugins/*/bcelpatchbin/
 /othersrc/*/bin/
diff --git a/features/org.eclipse.objectteams.mvn.feature/category.xml b/features/org.eclipse.objectteams.mvn.feature/category.xml
index 4b5e75a..d2e15e2 100644
--- a/features/org.eclipse.objectteams.mvn.feature/category.xml
+++ b/features/org.eclipse.objectteams.mvn.feature/category.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <site>
-   <feature url="features/org.eclipse.objectteams.mvn.feature_1.0.0.qualifier.jar" id="org.eclipse.objectteams.mvn.feature" version="1.0.0.qualifier">
+   <feature url="features/org.eclipse.objectteams.mvn.feature_1.0.1.qualifier.jar" id="org.eclipse.objectteams.mvn.feature" version="1.0.1.qualifier">
       <category name="org.eclipse.objectteams.integrations"/>
    </feature>
    <category-def name="org.eclipse.objectteams.integrations" label="Integrations for Object Teams">
diff --git a/features/org.eclipse.objectteams.mvn.feature/feature.xml b/features/org.eclipse.objectteams.mvn.feature/feature.xml
index 36847c2..ecf41f4 100644
--- a/features/org.eclipse.objectteams.mvn.feature/feature.xml
+++ b/features/org.eclipse.objectteams.mvn.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.objectteams.mvn.feature"
       label="%featureName"
-      version="1.0.0.qualifier"
+      version="1.0.1.qualifier"
       provider-name="%providerName"
       plugin="org.eclipse.objectteams.mvn">
 
diff --git a/features/org.eclipse.objectteams.otdt.core.patch/feature.xml b/features/org.eclipse.objectteams.otdt.core.patch/feature.xml
index 95bef1d..631a89e 100644
--- a/features/org.eclipse.objectteams.otdt.core.patch/feature.xml
+++ b/features/org.eclipse.objectteams.otdt.core.patch/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.objectteams.otdt.core.patch"
       label="%featureName"
-      version="2.2.0.qualifier"
+      version="2.3.0.qualifier"
       provider-name="%providerName"
       plugin="org.eclipse.jdt.core">
 
@@ -59,14 +59,14 @@
    </url>
 
    <requires>
-      <import feature="org.eclipse.jdt" version="3.9.0.v20130314-1330" patch="true"/>
+      <import feature="org.eclipse.jdt" version="3.10.0.v20130709-0800" patch="true"/>
    </requires>
 
    <plugin
          id="org.eclipse.jdt.core"
          download-size="5614"
          install-size="5614"
-         version="3.9.0.v_OTDT_r220_qualifier"
+         version="3.10.0.v_OTDT_r230_qualifier"
          unpack="false"/>
 
 </feature>
diff --git a/features/org.eclipse.objectteams.otdt.feature/category.xml b/features/org.eclipse.objectteams.otdt.feature/category.xml
index 3ee3229..9828f16 100644
--- a/features/org.eclipse.objectteams.otdt.feature/category.xml
+++ b/features/org.eclipse.objectteams.otdt.feature/category.xml
@@ -39,4 +39,18 @@
    <iu id="org.eclipse.objectteams.otequinox.feature.group" range="[2.2.0,2.3.0)">
       <category name="org.eclipse.objectteams.otdt_2.2"/>
    </iu>
+   <category-def name="org.eclipse.objectteams.otdt_2.3" label="OTDT 2.3 based on Eclipse 4.4">
+      <description>
+         The Object Teams Development Tooling versions 2.3.x based on Eclipse 4.4.x
+      </description>
+   </category-def>
+   <iu id="org.eclipse.objectteams.otdt.feature.group" range="[2.3.0,2.4.0)">
+      <category name="org.eclipse.objectteams.otdt_2.3"/>
+   </iu>
+   <iu id="org.eclipse.objectteams.otdt.source.feature.feature.group" range="[2.3.0,2.4.0)">
+      <category name="org.eclipse.objectteams.otdt_2.3"/>
+   </iu>
+   <iu id="org.eclipse.objectteams.otequinox.feature.group" range="[2.3.0,2.4.0)">
+      <category name="org.eclipse.objectteams.otdt_2.3"/>
+   </iu>
 </site>
diff --git a/features/org.eclipse.objectteams.otdt.feature/feature.xml b/features/org.eclipse.objectteams.otdt.feature/feature.xml
index 990cc94..ef893f4 100644
--- a/features/org.eclipse.objectteams.otdt.feature/feature.xml
+++ b/features/org.eclipse.objectteams.otdt.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.objectteams.otdt"
       label="%featureName"
-      version="2.2.0.qualifier"
+      version="2.3.0.qualifier"
       provider-name="%providerName"
       plugin="org.eclipse.objectteams.otdt"
       image="OTDT-110.png">
@@ -64,7 +64,7 @@
 
    <includes
          id="org.eclipse.objectteams.otdt.core.patch"
-         version="2.2.0.qualifier"/>
+         version="2.3.0.qualifier"/>
 
    <plugin
          id="org.eclipse.objectteams.otdt"
diff --git a/features/org.eclipse.objectteams.otdt.source.feature/feature.xml b/features/org.eclipse.objectteams.otdt.source.feature/feature.xml
index a9d2a32..eca2051 100644
--- a/features/org.eclipse.objectteams.otdt.source.feature/feature.xml
+++ b/features/org.eclipse.objectteams.otdt.source.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.objectteams.otdt.source.feature"
       label="%featureName"
-      version="2.2.0.qualifier"
+      version="2.3.0.qualifier"
       provider-name="%providerName">
 
    <description url="http://www.eclipse.org/objectteams">
diff --git a/maven/infrastructure/artifact-deployer/objectteams-runtime-pom.xml b/maven/infrastructure/artifact-deployer/objectteams-runtime-pom.xml
index 9daa552..a054648 100644
--- a/maven/infrastructure/artifact-deployer/objectteams-runtime-pom.xml
+++ b/maven/infrastructure/artifact-deployer/objectteams-runtime-pom.xml
@@ -4,7 +4,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.eclipse</groupId>
   <artifactId>objectteams-runtime</artifactId>
-  <version>2.1.2-SNAPSHOT</version>
+  <version>2.1.2</version>
   <description>The OT/J Runtime Library</description>
 
   <licenses>
@@ -13,7 +13,7 @@
 		<comments>
 			This file is part of "Object Teams Development Tooling"-Software
 
-			Copyright 2010, 2012 GK Software AG and others.
+			Copyright 2010, 2013 GK Software AG 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
diff --git a/maven/infrastructure/artifact-deployer/pom.xml b/maven/infrastructure/artifact-deployer/pom.xml
index 44e65d5..b7ea147 100644
--- a/maven/infrastructure/artifact-deployer/pom.xml
+++ b/maven/infrastructure/artifact-deployer/pom.xml
@@ -5,7 +5,7 @@
 	<parent>
 		<groupId>org.eclipse</groupId>
 		<artifactId>objectteams-parent-pom</artifactId>
-		<version>2.1.2-SNAPSHOT</version>
+		<version>2.2.0</version>
 		<relativePath>../parent-pom</relativePath>
 	</parent>
 
@@ -24,7 +24,7 @@
 			<comments>
 				This file is part of "Object Teams Development Tooling"-Software
 
-				Copyright 2010, 2012 GK Software AG and others.
+				Copyright 2010, 2013 GK Software AG 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
@@ -52,9 +52,9 @@
 	<properties>
 		<!-- Object Teams versions, update manually: 					-->
 		<!--   version of the signed ecotj jar file:	 				-->
-		<ecotj.version>S-2.1.1-201209011843-signed</ecotj.version> 
+		<ecotj.version>R-2.2.0-201306071800-signed</ecotj.version> 
 		<!--   version of the org.eclipse.objectteams.runtime plugin:	-->
-		<otre.version>2.1.0.201205081843</otre.version>
+		<otre.version>2.2.0.201305210612</otre.version>
 		
 		<!-- locate the jar files to install/deploy: -->
 	    <ecotj.jar.file>${ecj.export.dir}/ecotj-${ecotj.version}.jar</ecotj.jar.file>
diff --git a/maven/infrastructure/parent-pom/pom.xml b/maven/infrastructure/parent-pom/pom.xml
index a38aba3..f3a670e 100644
--- a/maven/infrastructure/parent-pom/pom.xml
+++ b/maven/infrastructure/parent-pom/pom.xml
@@ -4,7 +4,7 @@
 	
 	<groupId>org.eclipse</groupId>
 	<artifactId>objectteams-parent-pom</artifactId>
-	<version>2.1.2-SNAPSHOT</version>
+	<version>2.2.0</version>
 	<packaging>pom</packaging>
 	
 	<name>Object Teams parent pom</name>
@@ -23,7 +23,7 @@
 			<comments>
 				This file is part of "Object Teams Development Tooling"-Software.
 
-				Copyright 2010, 2012 GK Software AG and others.
+				Copyright 2010, 2013 GK Software AG 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
@@ -82,11 +82,11 @@
     	<project-repository-path>maven/infrastructure/parent-pom</project-repository-path>
 
 		<!-- Our Version: -->
-		<otj.version>2.1.2-SNAPSHOT</otj.version>
+		<otj.version>2.2.0</otj.version>
 
 		<!-- Versions of dependencies: -->
 		<bcel.version>5.2</bcel.version>
-		<tycho.version>0.16.0</tycho.version>
+		<tycho.version>0.18.0</tycho.version>
 		
 		<!-- Absolut paths for providing startup arguments to the JVM -->
 		<otj.otre.location>${settings.localRepository}/org/eclipse/objectteams-runtime/${otj.version}/objectteams-runtime-${otj.version}.jar</otj.otre.location>
diff --git a/maven/infrastructure/parent-pom/src/site/apt/usage.apt b/maven/infrastructure/parent-pom/src/site/apt/usage.apt
index 267d571..4261c06 100644
--- a/maven/infrastructure/parent-pom/src/site/apt/usage.apt
+++ b/maven/infrastructure/parent-pom/src/site/apt/usage.apt
@@ -3,7 +3,7 @@
 	------
 	Olaf Otto & Stephan Herrmann
 	------
-	2012-10-30
+	2013-06-23
 	------
 
 Using the Object Teams Parent POM
@@ -33,7 +33,7 @@
 	<parent>
 		<groupId>org.eclipse</groupId>
 		<artifactId>objectteams-parent-pom</artifactId>
-		<version>2.1.1</version>
+		<version>2.2.0</version>
 	</parent>
 +-----
 
diff --git a/maven/testproject/pom.xml b/maven/testproject/pom.xml
index 0b4a9c7..b726f10 100644
--- a/maven/testproject/pom.xml
+++ b/maven/testproject/pom.xml
@@ -5,13 +5,13 @@
 	<parent>
 		<groupId>org.eclipse</groupId>
 		<artifactId>objectteams-parent-pom</artifactId>
-		<version>2.1.2-SNAPSHOT</version>
+		<version>2.2.0</version>
 	</parent>
 
 	<packaging>jar</packaging>
         
 	<artifactId>objectteams-compile-test</artifactId>
-	<version>1.0.2</version>
+	<version>1.0.3</version>
 	<name>Object Teams test project</name>
 
 	<!-- simply repeat this declaration from the parent pom, otherwise Maven duplicates the artifactId in the path -->
@@ -27,7 +27,7 @@
 			<comments>
 				This file is part of "Object Teams Development Tooling"-Software
 
-				Copyright 2010, 2012 GK Software AG and others.
+				Copyright 2010, 2013 GK Software AG 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
diff --git a/maven/testproject/src/site/apt/usage.apt b/maven/testproject/src/site/apt/usage.apt
index 3e673fa..3ef64c8 100644
--- a/maven/testproject/src/site/apt/usage.apt
+++ b/maven/testproject/src/site/apt/usage.apt
@@ -3,7 +3,7 @@
 	------
 	Olaf Otto & Stephan Herrmann
 	------
-	2012-07-05
+	2013-06-23
 	------
 
 Using Object Teams with Maven3
@@ -33,7 +33,7 @@
 	<parent>
 		<groupId>org.eclipse</groupId>
 		<artifactId>objectteams-parent-pom</artifactId>
-		<version>2.1.0</version>
+		<version>2.2.0</version>
 	</parent>
 +-----
 
diff --git a/org.eclipse.jdt.core.tests.compiler/CompilerInvocationTests.launch b/org.eclipse.jdt.core.tests.compiler/CompilerInvocationTests.launch
index e04d8aa..759f4f1 100644
--- a/org.eclipse.jdt.core.tests.compiler/CompilerInvocationTests.launch
+++ b/org.eclipse.jdt.core.tests.compiler/CompilerInvocationTests.launch
@@ -24,7 +24,7 @@
 <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
 <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
 <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.6.0_16"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/java-7-openjdk-i386"/>
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.jdt.core.tests.compiler.regression.CompilerInvocationTests"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl}"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jdt.core.tests.compiler"/>
@@ -35,8 +35,8 @@
 <stringAttribute key="pde.version" value="3.3"/>
 <stringAttribute key="product" value="org.eclipse.sdk.ide"/>
 <booleanAttribute key="run_in_ui_thread" value="true"/>
-<stringAttribute key="selected_target_plugins" value="ch.qos.logback.classic@default:default,ch.qos.logback.core@default:default,ch.qos.logback.slf4j@default:false,com.ibm.icu@default:default,com.jcraft.jsch@default:default,javax.activation@default:default,javax.annotation@default:default,javax.inject@default:default,javax.mail@default:default,javax.servlet.jsp@default:default,javax.servlet@default:default,javax.xml@default:default,org.apache.ant@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.bcel@default:default,org.apache.commons.codec@default:default,org.apache.commons.httpclient@default:default,org.apache.commons.logging@default:default,org.apache.lucene.analysis@default:default,org.apache.lucene.core@default:default,org.apache.lucene.highlighter@default:default,org.apache.lucene.memory@default:default,org.apache.lucene.misc@default:default,org.apache.lucene.queries@default:default,org.apache.lucene.snowball@default:default,org.apache.lucene.spellchecker@default:default,org.apache.lucene@default:default,org.apache.xerces@default:default,org.apache.xml.resolver@default:default,org.apache.xml.serializer@default:default,org.eclipse.ant.core@default:default,org.eclipse.ant.launching@default:default,org.eclipse.ant.ui@default:default,org.eclipse.compare.core@default:default,org.eclipse.compare@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.beans@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.externaltools@default:default,org.eclipse.core.filebuffers@default:default,org.eclipse.core.filesystem.linux.x86@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.net.linux.x86@default:false,org.eclipse.core.net@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime.compatibility@default:default,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.cvs@default:default,org.eclipse.debug.core@default:default,org.eclipse.debug.ui@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.ecf.filetransfer@default:default,org.eclipse.ecf.identity@default:default,org.eclipse.ecf.provider.filetransfer.httpclient.ssl@default:false,org.eclipse.ecf.provider.filetransfer.httpclient@default:default,org.eclipse.ecf.provider.filetransfer.ssl@default:false,org.eclipse.ecf.provider.filetransfer@default:default,org.eclipse.ecf.ssl@default:false,org.eclipse.ecf@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.concurrent@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.frameworkadmin.equinox@default:default,org.eclipse.equinox.frameworkadmin@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.jsp.jasper.registry@default:default,org.eclipse.equinox.jsp.jasper@default:default,org.eclipse.equinox.launcher.gtk.linux.x86@default:false,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.p2.artifact.repository@default:default,org.eclipse.equinox.p2.console@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.director.app@default:default,org.eclipse.equinox.p2.director@default:default,org.eclipse.equinox.p2.directorywatcher@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.extensionlocation@default:default,org.eclipse.equinox.p2.garbagecollector@default:default,org.eclipse.equinox.p2.jarprocessor@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.operations@default:default,org.eclipse.equinox.p2.publisher.eclipse@default:default,org.eclipse.equinox.p2.publisher@default:default,org.eclipse.equinox.p2.ql@default:default,org.eclipse.equinox.p2.reconciler.dropins@default:default,org.eclipse.equinox.p2.repository.tools@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.p2.touchpoint.eclipse@default:default,org.eclipse.equinox.p2.touchpoint.natives@default:default,org.eclipse.equinox.p2.transport.ecf@default:default,org.eclipse.equinox.p2.ui.importexport@default:default,org.eclipse.equinox.p2.ui.sdk.scheduler@default:default,org.eclipse.equinox.p2.ui.sdk@default:default,org.eclipse.equinox.p2.ui@default:default,org.eclipse.equinox.p2.updatechecker@default:default,org.eclipse.equinox.p2.updatesite@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security.ui@default:default,org.eclipse.equinox.security@default:default,org.eclipse.equinox.simpleconfigurator.manipulator@default:default,org.eclipse.equinox.simpleconfigurator@1:true,org.eclipse.equinox.util@default:default,org.eclipse.help.base@default:default,org.eclipse.help.ui@default:default,org.eclipse.help.webapp@default:default,org.eclipse.help@default:default,org.eclipse.jdt.apt.core@default:default,org.eclipse.jdt.apt.pluggable.core@default:default,org.eclipse.jdt.apt.ui@default:default,org.eclipse.jdt.compiler.apt@default:false,org.eclipse.jdt.compiler.tool@default:false,org.eclipse.jdt.core.manipulation@default:default,org.eclipse.jdt.debug.ui@default:default,org.eclipse.jdt.debug@default:default,org.eclipse.jdt.doc.isv@default:default,org.eclipse.jdt.doc.user@default:default,org.eclipse.jdt.junit.core@default:default,org.eclipse.jdt.junit.runtime@default:default,org.eclipse.jdt.junit4.runtime@default:default,org.eclipse.jdt.junit@default:default,org.eclipse.jdt.launching@default:default,org.eclipse.jdt.ui@default:default,org.eclipse.jdt@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.jsch.core@default:default,org.eclipse.jsch.ui@default:default,org.eclipse.ltk.core.refactoring@default:default,org.eclipse.ltk.ui.refactoring@default:default,org.eclipse.net4j.jms.api@default:default,org.eclipse.objectteams.otequinox.branding@default:default,org.eclipse.objectteams.otequinox.hook@default:false,org.eclipse.objectteams.otequinox.sunjvm@default:false,org.eclipse.objectteams.otequinox@default:default,org.eclipse.objectteams.runtime@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.pde.api.tools.ui@default:default,org.eclipse.pde.api.tools@default:default,org.eclipse.pde.build@default:default,org.eclipse.pde.core@default:default,org.eclipse.pde.doc.user@default:default,org.eclipse.pde.ds.core@default:default,org.eclipse.pde.ds.ui@default:default,org.eclipse.pde.junit.runtime@default:default,org.eclipse.pde.launching@default:default,org.eclipse.pde.runtime@default:default,org.eclipse.pde.ua.core@default:default,org.eclipse.pde.ua.ui@default:default,org.eclipse.pde.ui.templates@default:default,org.eclipse.pde.ui@default:default,org.eclipse.pde@default:default,org.eclipse.platform.doc.isv@default:default,org.eclipse.platform.doc.user@default:default,org.eclipse.platform@default:default,org.eclipse.rcp@default:default,org.eclipse.sdk@default:default,org.eclipse.search@default:default,org.eclipse.swt.gtk.linux.x86@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.team.cvs.core@default:default,org.eclipse.team.cvs.ssh2@default:default,org.eclipse.team.cvs.ui@default:default,org.eclipse.team.ui@default:default,org.eclipse.text@default:default,org.eclipse.ui.browser@default:default,org.eclipse.ui.cheatsheets@default:default,org.eclipse.ui.console@default:default,org.eclipse.ui.editors@default:default,org.eclipse.ui.externaltools@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.ide.application@default:default,org.eclipse.ui.ide@default:default,org.eclipse.ui.intro.universal@default:default,org.eclipse.ui.intro@default:default,org.eclipse.ui.navigator.resources@default:default,org.eclipse.ui.navigator@default:default,org.eclipse.ui.net@default:default,org.eclipse.ui.views.log@default:default,org.eclipse.ui.views.properties.tabbed@default:default,org.eclipse.ui.views@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.eclipse.update.configurator@3:true,org.hamcrest.core@default:default,org.junit*3.8.2.v3_8_2_v20100427-1100@default:default,org.junit*4.8.2.v4_8_2_v20110321-1705@default:default,org.junit4@default:default,org.mortbay.jetty.util@default:default,org.objectweb.asm@default:default,org.sat4j.core@default:default,org.sat4j.pb@default:default,org.slf4j.api@default:default,org.w3c.css.sac@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
-<stringAttribute key="selected_workspace_plugins" value="org.eclipse.jdt.annotation@default:default,org.eclipse.jdt.core.tests.builder@default:default,org.eclipse.jdt.core.tests.compiler@default:default,org.eclipse.jdt.core.tests.model@default:default,org.eclipse.jdt.core@default:default,org.eclipse.objectteams.eclipse.monitor@default:default,org.eclipse.objectteams.otdt.apt@default:default,org.eclipse.objectteams.otdt.compiler.adaptor@default:default,org.eclipse.objectteams.otdt.debug@default:default,org.eclipse.objectteams.otdt.doc@default:default,org.eclipse.objectteams.otdt.ui.help@default:default,org.eclipse.objectteams.otdt.ui@default:default,org.eclipse.objectteams.otdt@default:default,org.eclipse.test.performance@default:default"/>
+<stringAttribute key="selected_target_plugins" value="ch.qos.logback.classic@default:default,ch.qos.logback.core@default:default,ch.qos.logback.slf4j@default:false,com.ibm.icu@default:default,com.jcraft.jsch@default:default,com.ning.async-http-client@default:default,javax.annotation@default:default,javax.el@default:default,javax.inject@default:default,javax.servlet.jsp@default:default,javax.servlet@default:default,javax.xml@default:default,org.apache.ant@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.bcel@default:default,org.apache.commons.codec@default:default,org.apache.commons.httpclient@default:default,org.apache.commons.logging@default:default,org.apache.jasper.glassfish@default:default,org.apache.lucene.analysis@default:default,org.apache.lucene.core@default:default,org.apache.xerces@default:default,org.apache.xml.resolver@default:default,org.apache.xml.serializer@default:default,org.eclipse.ant.core@default:default,org.eclipse.ant.launching@default:default,org.eclipse.ant.ui@default:default,org.eclipse.compare.core@default:default,org.eclipse.compare@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.beans@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.externaltools@default:default,org.eclipse.core.filebuffers@default:default,org.eclipse.core.filesystem.linux.x86@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.net.linux.x86@default:false,org.eclipse.core.net@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.auth@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime.compatibility@default:default,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.cvs@default:default,org.eclipse.debug.core@default:default,org.eclipse.debug.ui@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.ecf.filetransfer@default:default,org.eclipse.ecf.identity@default:default,org.eclipse.ecf.provider.filetransfer.ssl@default:false,org.eclipse.ecf.provider.filetransfer@default:default,org.eclipse.ecf.ssl@default:false,org.eclipse.ecf@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.edit@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.emf.edit@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.concurrent@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.frameworkadmin.equinox@default:default,org.eclipse.equinox.frameworkadmin@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.jsp.jasper.registry@default:default,org.eclipse.equinox.jsp.jasper@default:default,org.eclipse.equinox.launcher.gtk.linux.x86@default:false,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.p2.artifact.repository@default:default,org.eclipse.equinox.p2.console@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.director.app@default:default,org.eclipse.equinox.p2.director@default:default,org.eclipse.equinox.p2.directorywatcher@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.extensionlocation@default:default,org.eclipse.equinox.p2.garbagecollector@default:default,org.eclipse.equinox.p2.jarprocessor@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.operations@default:default,org.eclipse.equinox.p2.publisher.eclipse@default:default,org.eclipse.equinox.p2.publisher@default:default,org.eclipse.equinox.p2.ql@default:default,org.eclipse.equinox.p2.reconciler.dropins@default:default,org.eclipse.equinox.p2.repository.tools@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.p2.touchpoint.eclipse@default:default,org.eclipse.equinox.p2.touchpoint.natives@default:default,org.eclipse.equinox.p2.transport.ecf@default:default,org.eclipse.equinox.p2.ui.importexport@default:default,org.eclipse.equinox.p2.ui.sdk.scheduler@default:default,org.eclipse.equinox.p2.ui.sdk@default:default,org.eclipse.equinox.p2.ui@default:default,org.eclipse.equinox.p2.updatechecker@default:default,org.eclipse.equinox.p2.updatesite@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security.ui@default:default,org.eclipse.equinox.security@default:default,org.eclipse.equinox.simpleconfigurator.manipulator@default:default,org.eclipse.equinox.simpleconfigurator@1:true,org.eclipse.equinox.util@default:default,org.eclipse.help.base@default:default,org.eclipse.help.ui@default:default,org.eclipse.help.webapp@default:default,org.eclipse.help@default:default,org.eclipse.jdt.annotation@default:default,org.eclipse.jdt.apt.core@default:default,org.eclipse.jdt.apt.pluggable.core@default:default,org.eclipse.jdt.apt.ui@default:default,org.eclipse.jdt.compiler.apt@default:false,org.eclipse.jdt.compiler.tool@default:false,org.eclipse.jdt.core.manipulation@default:default,org.eclipse.jdt.debug.ui@default:default,org.eclipse.jdt.debug@default:default,org.eclipse.jdt.doc.isv@default:default,org.eclipse.jdt.doc.user@default:default,org.eclipse.jdt.junit.core@default:default,org.eclipse.jdt.junit.runtime@default:default,org.eclipse.jdt.junit4.runtime@default:default,org.eclipse.jdt.junit@default:default,org.eclipse.jdt.launching@default:default,org.eclipse.jdt.ui@default:default,org.eclipse.jdt@default:default,org.eclipse.jem.util@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.jsch.core@default:default,org.eclipse.jsch.ui@default:default,org.eclipse.ltk.core.refactoring@default:default,org.eclipse.ltk.ui.refactoring@default:default,org.eclipse.m2e.archetype.common@default:default,org.eclipse.m2e.core.ui@default:default,org.eclipse.m2e.core@default:default,org.eclipse.m2e.logback.appender@default:false,org.eclipse.m2e.maven.indexer@default:default,org.eclipse.m2e.maven.runtime@default:default,org.eclipse.m2e.model.edit@default:default,org.eclipse.objectteams.otequinox.branding@default:default,org.eclipse.objectteams.otequinox.hook@default:false,org.eclipse.objectteams.otequinox.sunjvm@default:false,org.eclipse.objectteams.otequinox@default:default,org.eclipse.objectteams.runtime@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.pde.api.tools.ee.cdcfoundation10@default:false,org.eclipse.pde.api.tools.ee.cdcfoundation11@default:false,org.eclipse.pde.api.tools.ee.j2se12@default:false,org.eclipse.pde.api.tools.ee.j2se13@default:false,org.eclipse.pde.api.tools.ee.j2se14@default:false,org.eclipse.pde.api.tools.ee.j2se15@default:false,org.eclipse.pde.api.tools.ee.javase16@default:false,org.eclipse.pde.api.tools.ee.javase17@default:false,org.eclipse.pde.api.tools.ee.jre11@default:false,org.eclipse.pde.api.tools.ee.osgiminimum10@default:false,org.eclipse.pde.api.tools.ee.osgiminimum11@default:false,org.eclipse.pde.api.tools.ee.osgiminimum12@default:false,org.eclipse.pde.api.tools.ui@default:default,org.eclipse.pde.api.tools@default:default,org.eclipse.pde.build@default:default,org.eclipse.pde.core@default:default,org.eclipse.pde.doc.user@default:default,org.eclipse.pde.ds.core@default:default,org.eclipse.pde.ds.ui@default:default,org.eclipse.pde.junit.runtime@default:default,org.eclipse.pde.launching@default:default,org.eclipse.pde.runtime@default:default,org.eclipse.pde.ua.core@default:default,org.eclipse.pde.ua.ui@default:default,org.eclipse.pde.ui.templates@default:default,org.eclipse.pde.ui@default:default,org.eclipse.pde@default:default,org.eclipse.platform.doc.isv@default:default,org.eclipse.platform.doc.user@default:default,org.eclipse.platform@default:default,org.eclipse.rcp@default:default,org.eclipse.sdk@default:default,org.eclipse.search@default:default,org.eclipse.swt.gtk.linux.x86@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.team.cvs.core@default:default,org.eclipse.team.cvs.ssh2@default:default,org.eclipse.team.cvs.ui@default:default,org.eclipse.team.ui@default:default,org.eclipse.text@default:default,org.eclipse.ui.browser@default:default,org.eclipse.ui.cheatsheets@default:default,org.eclipse.ui.console@default:default,org.eclipse.ui.editors@default:default,org.eclipse.ui.externaltools@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.ide.application@default:default,org.eclipse.ui.ide@default:default,org.eclipse.ui.intro.universal@default:default,org.eclipse.ui.intro@default:default,org.eclipse.ui.navigator.resources@default:default,org.eclipse.ui.navigator@default:default,org.eclipse.ui.net@default:default,org.eclipse.ui.trace@default:default,org.eclipse.ui.views.log@default:default,org.eclipse.ui.views.properties.tabbed@default:default,org.eclipse.ui.views@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.eclipse.update.configurator@3:true,org.eclipse.wst.common.core@default:default,org.eclipse.wst.common.emf@default:default,org.eclipse.wst.common.environment@default:default,org.eclipse.wst.common.frameworks@default:default,org.eclipse.wst.common.project.facet.core@default:default,org.eclipse.wst.common.uriresolver@default:default,org.eclipse.wst.sse.core@default:default,org.eclipse.wst.validation@default:default,org.eclipse.wst.xml.core@default:default,org.eclipse.wst.xsd.core@default:default,org.eclipse.xsd@default:default,org.hamcrest.core@default:default,org.jboss.netty@default:default,org.junit@default:default,org.objectweb.asm@default:default,org.sat4j.core@default:default,org.sat4j.pb@default:default,org.slf4j.api*1.6.4.v20120130-2120@default:default,org.slf4j.api*1.7.2.v20121108-1250@default:default,org.w3c.css.sac@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
+<stringAttribute key="selected_workspace_plugins" value="org.eclipse.jdt.core.tests.builder@default:default,org.eclipse.jdt.core.tests.compiler@default:default,org.eclipse.jdt.core.tests.model@default:default,org.eclipse.jdt.core@default:default,org.eclipse.objectteams.eclipse.monitor@default:default,org.eclipse.objectteams.otdt.apt@default:default,org.eclipse.objectteams.otdt.compiler.adaptor@default:default,org.eclipse.objectteams.otdt.debug@default:default,org.eclipse.objectteams.otdt.doc@default:default,org.eclipse.objectteams.otdt.ui.help@default:default,org.eclipse.objectteams.otdt.ui@default:default,org.eclipse.objectteams.otdt@default:default,org.eclipse.test.performance@default:default"/>
 <booleanAttribute key="show_selected_only" value="false"/>
 <stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
 <booleanAttribute key="tracing" value="false"/>
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 4e51e16..50ad2b4 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.8.2
+Bundle-Version: 3.8.3
 Bundle-ClassPath: jdtcoretestscompiler.jar
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/org.eclipse.jdt.core.tests.compiler/pom.xml b/org.eclipse.jdt.core.tests.compiler/pom.xml
index 01c15c4..9b3bc2f 100644
--- a/org.eclipse.jdt.core.tests.compiler/pom.xml
+++ b/org.eclipse.jdt.core.tests.compiler/pom.xml
@@ -9,17 +9,15 @@
   Contributors:
      Igor Fedorenko - initial implementation
 -->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <artifactId>eclipse.jdt.core</artifactId>
     <groupId>eclipse.jdt.core</groupId>
-    <version>3.8.0-SNAPSHOT</version>
+    <version>4.4.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.core.tests.compiler</artifactId>
-  <version>3.8.2-SNAPSHOT</version>
+  <version>3.8.3-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java
index a0a9e99..0b4da40 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java
@@ -1887,12 +1887,7 @@
 		"----------\n" +
 		"1. ERROR in X.java (at line 2)\n" +
 		"	Z <Y1, for Y2> var;\n" +
-//{ObjectTeams: slightly different error range:
-/* orig:
   		"	  ^^^^^^^^^^^^\n" +
-  :giro */
-  		"	   ^^^^^^^^^^\n" +
-// SH}
 		"Syntax error on tokens, delete these tokens\n" +
 		"----------\n";
 	String expected14ProblemLog =
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractComparableTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractComparableTest.java
index 22685c1..61a20b6 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractComparableTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractComparableTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
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 6833108..d8a6c4f 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
@@ -8,7 +8,9 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Technical University Berlin - adapted for Object Teams
- *     Stephan Herrmann - Contribution for bug 335093 - [compiler][null] minimal hook for future null annotation support
+ *     Stephan Herrmann - Contributions for
+ *								bug 335093 - [compiler][null] minimal hook for future null annotation support
+ *								Bug 412203 - [compiler] Internal compiler error: java.lang.IllegalArgumentException: info cannot be null
  *     Jesper S Moller - Contributions for bug 378674 - "The method can be declared as static" is wrong
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
@@ -1021,6 +1023,19 @@
 	protected String[] getDefaultClassPaths() {
 		return DefaultJavaRuntimeEnvironment.getDefaultClassPaths();
 	}
+	/** Get class library paths built from default class paths plus the JDT null annotations. */
+	protected String[] getLibsWithNullAnnotations() throws IOException {
+		String[] defaultLibs = getDefaultClassPaths();
+		int len = defaultLibs.length;
+		String[] libs = new String[len+1];
+		System.arraycopy(defaultLibs, 0, libs, 0, len);
+		File bundleFile = FileLocator.getBundleFile(Platform.getBundle("org.eclipse.jdt.annotation"));
+		if (bundleFile.isDirectory())
+			libs[len] = bundleFile.getPath()+"/bin";
+		else
+			libs[len] = bundleFile.getPath();
+		return libs;
+	}
 	protected IErrorHandlingPolicy getErrorHandlingPolicy() {
 		return new IErrorHandlingPolicy() {
 			public boolean stopOnFirstError() {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AmbiguousMethodTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AmbiguousMethodTest.java
index 0c6446f..a44a371 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AmbiguousMethodTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AmbiguousMethodTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								bug 395681 - [compiler] Improve simulation of javac6 behavior from bug 317719 after fixing bug 388795
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -115,7 +117,7 @@
 					"1. ERROR in X.java (at line 4)\n" + 
 					"	static interface I3<E3, E4> extends I1<E3>, I2<E4> {}\n" + 
 					"	                 ^^\n" + 
-					"Name clash: The method method(E1) of type X.I1<E1> has the same erasure as method(E2) of type X.I2<E2> but does not override it\n" + 
+					"Name clash: The method method(E2) of type X.I2<E2> has the same erasure as method(E1) of type X.I1<E1> but does not override it\n" + 
 					"----------\n");
 		}
 	}
@@ -611,23 +613,23 @@
 		"1. WARNING in Combined.java (at line 2)\n" + 
 		"	<T extends Comparable<T>> void pickOne(T value) throws ExOne {}\n" + 
 		"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-		"Method pickOne(T) has the same erasure pickOne(Comparable<T>) as another method in type Combined<A,B>\n" + 
+		"Erasure of method pickOne(T) is the same as another method in type Combined<A,B>\n" +
 		"----------\n" + 
 		"2. WARNING in Combined.java (at line 3)\n" + 
 		"	<T> T pickOne(Comparable<T> value) throws ExTwo { return null;}\n" + 
 		"	      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-		"Method pickOne(Comparable<T>) has the same erasure pickOne(Comparable<T>) as another method in type Combined<A,B>\n" + 
+		"Erasure of method pickOne(Comparable<T>) is the same as another method in type Combined<A,B>\n" +
 		"----------\n":
 			"----------\n" + 
 			"1. ERROR in Combined.java (at line 2)\n" + 
 			"	<T extends Comparable<T>> void pickOne(T value) throws ExOne {}\n" + 
 			"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method pickOne(T) has the same erasure pickOne(Comparable<T>) as another method in type Combined<A,B>\n" + 
+			"Erasure of method pickOne(T) is the same as another method in type Combined<A,B>\n" +
 			"----------\n" + 
 			"2. ERROR in Combined.java (at line 3)\n" + 
 			"	<T> T pickOne(Comparable<T> value) throws ExTwo { return null;}\n" + 
 			"	      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method pickOne(Comparable<T>) has the same erasure pickOne(Comparable<T>) as another method in type Combined<A,B>\n" + 
+			"Erasure of method pickOne(Comparable<T>) is the same as another method in type Combined<A,B>\n" +
 			"----------\n";
 		this.runNegativeTest(
 			new String[] {
@@ -663,12 +665,12 @@
 		"1. WARNING in Test1.java (at line 2)\n" + 
 		"	<T extends Comparable<T>> void pickOne(T value) throws ExOne {}\n" + 
 		"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-		"Method pickOne(T) has the same erasure pickOne(Comparable<T>) as another method in type Test1<AA,BB>\n" + 
+		"Erasure of method pickOne(T) is the same as another method in type Test1<AA,BB>\n" +
 		"----------\n" + 
 		"2. WARNING in Test1.java (at line 3)\n" + 
 		"	<T> T pickOne(Comparable<T> value) throws ExTwo { return null;}\n" + 
 		"	      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-		"Method pickOne(Comparable<T>) has the same erasure pickOne(Comparable<T>) as another method in type Test1<AA,BB>\n" + 
+		"Erasure of method pickOne(Comparable<T>) is the same as another method in type Test1<AA,BB>\n" +
 		"----------\n" + 
 		"3. WARNING in Test1.java (at line 4)\n" + 
 		"	void pickOne2(Test1<Integer,Integer> c) throws ExOne { c.pickOne((Comparable) \"test\"); }\n" + 
@@ -684,12 +686,12 @@
 			"1. ERROR in Test1.java (at line 2)\n" + 
 			"	<T extends Comparable<T>> void pickOne(T value) throws ExOne {}\n" + 
 			"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method pickOne(T) has the same erasure pickOne(Comparable<T>) as another method in type Test1<AA,BB>\n" + 
+			"Erasure of method pickOne(T) is the same as another method in type Test1<AA,BB>\n" +
 			"----------\n" + 
 			"2. ERROR in Test1.java (at line 3)\n" + 
 			"	<T> T pickOne(Comparable<T> value) throws ExTwo { return null;}\n" + 
 			"	      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method pickOne(Comparable<T>) has the same erasure pickOne(Comparable<T>) as another method in type Test1<AA,BB>\n" + 
+			"Erasure of method pickOne(Comparable<T>) is the same as another method in type Test1<AA,BB>\n" +
 			"----------\n" + 
 			"3. WARNING in Test1.java (at line 4)\n" + 
 			"	void pickOne2(Test1<Integer,Integer> c) throws ExOne { c.pickOne((Comparable) \"test\"); }\n" + 
@@ -1693,12 +1695,12 @@
 		"3. WARNING in Y.java (at line 4)\n" + 
 		"	public static <W extends String> Y<W> make(Class<W> clazz) {\n" + 
 		"	                                      ^^^^^^^^^^^^^^^^^^^^\n" + 
-		"Method make(Class<W>) has the same erasure make(Class<T>) as another method in type Y<V>\n" + 
+		"Erasure of method make(Class<W>) is the same as another method in type Y<V>\n" +
 		"----------\n" + 
 		"4. WARNING in Y.java (at line 8)\n" + 
 		"	public static <U extends Object> X<U> make(Class<U> clazz) {\n" + 
 		"	                                      ^^^^^^^^^^^^^^^^^^^^\n" + 
-		"Method make(Class<U>) has the same erasure make(Class<T>) as another method in type Y<V>\n" + 
+		"Erasure of method make(Class<U>) is the same as another method in type Y<V>\n" +
 		"----------\n" + 
 		"5. WARNING in Y.java (at line 13)\n" + 
 		"	Y.make(getClazz());\n" + 
@@ -1729,12 +1731,12 @@
 			"3. ERROR in Y.java (at line 4)\n" + 
 			"	public static <W extends String> Y<W> make(Class<W> clazz) {\n" + 
 			"	                                      ^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method make(Class<W>) has the same erasure make(Class<T>) as another method in type Y<V>\n" + 
+			"Erasure of method make(Class<W>) is the same as another method in type Y<V>\n" +
 			"----------\n" + 
 			"4. ERROR in Y.java (at line 8)\n" + 
 			"	public static <U extends Object> X<U> make(Class<U> clazz) {\n" + 
 			"	                                      ^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method make(Class<U>) has the same erasure make(Class<T>) as another method in type Y<V>\n" + 
+			"Erasure of method make(Class<U>) is the same as another method in type Y<V>\n" +
 			"----------\n" + 
 			"5. WARNING in Y.java (at line 13)\n" + 
 			"	Y.make(getClazz());\n" + 
@@ -1820,12 +1822,12 @@
 		"3. WARNING in X.java (at line 4)\n" + 
 		"	public <W extends String> Y<W> make(Class<W> clazz) {\n" + 
 		"	                               ^^^^^^^^^^^^^^^^^^^^\n" + 
-		"Method make(Class<W>) has the same erasure make(Class<T>) as another method in type Y<V>\n" + 
+		"Erasure of method make(Class<W>) is the same as another method in type Y<V>\n" +
 		"----------\n" + 
 		"4. WARNING in X.java (at line 7)\n" + 
 		"	public <U extends Object> X<U> make(Class<U> clazz) {\n" + 
 		"	                               ^^^^^^^^^^^^^^^^^^^^\n" + 
-		"Method make(Class<U>) has the same erasure make(Class<T>) as another method in type Y<V>\n" + 
+		"Erasure of method make(Class<U>) is the same as another method in type Y<V>\n" +
 		"----------\n" + 
 		"5. WARNING in X.java (at line 11)\n" + 
 		"	Y y = new Y();\n" + 
@@ -1871,12 +1873,12 @@
 			"3. ERROR in X.java (at line 4)\n" + 
 			"	public <W extends String> Y<W> make(Class<W> clazz) {\n" + 
 			"	                               ^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method make(Class<W>) has the same erasure make(Class<T>) as another method in type Y<V>\n" + 
+			"Erasure of method make(Class<W>) is the same as another method in type Y<V>\n" +
 			"----------\n" + 
 			"4. ERROR in X.java (at line 7)\n" + 
 			"	public <U extends Object> X<U> make(Class<U> clazz) {\n" + 
 			"	                               ^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method make(Class<U>) has the same erasure make(Class<T>) as another method in type Y<V>\n" + 
+			"Erasure of method make(Class<U>) is the same as another method in type Y<V>\n" +
 			"----------\n" + 
 			"5. WARNING in X.java (at line 11)\n" + 
 			"	Y y = new Y();\n" + 
@@ -2485,7 +2487,7 @@
 		"1. ERROR in X.java (at line 1)\n" +
 		"	public class X<T extends I & J> {\n" +
 		"	               ^\n" +
-		"The return types are incompatible for the inherited methods J.method(), I.method()\n" +
+		"The return types are incompatible for the inherited methods I.method(), J.method()\n" +
 		"----------\n",
 		// javac options
 	  	JavacTestOptions.JavacHasABug.JavacBug5061359 /* javac test options */);
@@ -2517,7 +2519,7 @@
 		"1. ERROR in X.java (at line 1)\n" +
 		"	public class X<T extends I & J> {\n" +
 		"	               ^\n" +
-		"The return types are incompatible for the inherited methods J.method(), I.method()\n" +
+		"The return types are incompatible for the inherited methods I.method(), J.method()\n" +
 		"----------\n" +
 		"2. ERROR in X.java (at line 3)\n" +
 		"	t.method();\n" +
@@ -3176,12 +3178,12 @@
 		"1. ERROR in X.java (at line 3)\n" +
 		"	interface C extends B, A {}\n" +
 		"	          ^\n" +
-		"The return types are incompatible for the inherited methods A.foo(), B.foo()\n" +
+		"The return types are incompatible for the inherited methods B.foo(), A.foo()\n" +
 		"----------\n" +
 		"2. ERROR in X.java (at line 4)\n" +
 		"	interface D extends A, B {}\n" +
 		"	          ^\n" +
-		"The return types are incompatible for the inherited methods B.foo(), A.foo()\n" +
+		"The return types are incompatible for the inherited methods A.foo(), B.foo()\n" +
 		"----------\n" +
 		"3. ERROR in X.java (at line 8)\n" +
 		"	X<? extends B> c_b = c.foo();\n" +
@@ -3307,7 +3309,7 @@
 		"3. ERROR in Y.java (at line 13)\n" +
 		"	abstract class Y extends X implements I, J {\n" +
 		"	               ^\n" +
-		"The return types are incompatible for the inherited methods J.a(), I.a()\n" +
+		"The return types are incompatible for the inherited methods I.a(), J.a()\n" +
 		"----------\n" +
 		"4. ERROR in Y.java (at line 20)\n" +
 		"	abstract class Y2 extends X implements J, I {\n" +
@@ -3322,7 +3324,7 @@
 		"6. ERROR in Y.java (at line 20)\n" +
 		"	abstract class Y2 extends X implements J, I {\n" +
 		"	               ^^\n" +
-		"The return types are incompatible for the inherited methods I.a(), J.a()\n" +
+		"The return types are incompatible for the inherited methods J.a(), I.a()\n" +
 		"----------\n"
 	);
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ArrayTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ArrayTest.java
index 2f45746..1205491 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ArrayTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ArrayTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
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 656bac1..80c081a 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -24,6 +24,8 @@
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
  *								bug 381443 - [compiler][null] Allow parameter widening from @NonNull to unannotated
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *     Jesper Steen Moller - Contributions for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -51,7 +53,6 @@
 import org.eclipse.jdt.internal.compiler.batch.ClasspathJar;
 import org.eclipse.jdt.internal.compiler.batch.ClasspathLocation;
 import org.eclipse.jdt.internal.compiler.batch.Main;
-import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.eclipse.jdt.internal.compiler.util.ManifestAnalyzer;
 
 public class BatchCompilerTest extends AbstractRegressionTest {
@@ -100,7 +101,7 @@
  * @see TestAll
  */
 public static Test suite() {
-	return buildUniqueComplianceTestSuite(testClass(), ClassFileConstants.JDK1_5);
+	return buildMinimalComplianceTestSuite(testClass(), F_1_5);
 }
 public static Class testClass() {
 	return BatchCompilerTest.class;
@@ -1937,6 +1938,7 @@
 			"		<option key=\"org.eclipse.jdt.core.compiler.annotation.nullable\" value=\"org.eclipse.jdt.annotation.Nullable\"/>\n" +
 			"		<option key=\"org.eclipse.jdt.core.compiler.annotation.nullanalysis\" value=\"disabled\"/>\n" +
 			"		<option key=\"org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode\" value=\"disabled\"/>\n" +
+			"		<option key=\"org.eclipse.jdt.core.compiler.codegen.shareCommonFinallyBlocks\" value=\"disabled\"/>\n" +
 			"		<option key=\"org.eclipse.jdt.core.compiler.codegen.targetPlatform\" value=\"1.5\"/>\n" +
 			"		<option key=\"org.eclipse.jdt.core.compiler.codegen.unusedLocal\" value=\"optimize out\"/>\n" +
 			"		<option key=\"org.eclipse.jdt.core.compiler.compliance\" value=\"1.5\"/>\n" +
@@ -13849,4 +13851,25 @@
 		"4 problems (4 warnings)",
 		true);
 }
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=405225
+public void test405225_extdirs() {
+	// check the option introduced in bug 359721
+	this.runConformTest(
+		new String[] {
+			"X.java",
+			"import java.io.FileReader;\n" +
+			"public class X {\n" +
+			"  void foo() throws java.io.IOException {\n" +
+			"      FileReader r = new FileReader(\"f1\");\n" +
+			"      char[] cs = new char[1024];\n" +
+			"	   r.read(cs);\n" +
+			"  }\n" +
+			"}\n"
+		},
+		"\"" + OUTPUT_DIR +  File.separator + "X.java\""
+		+ " -warn:-resource -1.7 -extdirs \"" + LIB_DIR + "\" -d \"" + OUTPUT_DIR + "\"",
+		"",
+		"",
+		true);
+}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileComparatorTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileComparatorTest.java
index 870de58..82e2eb5 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileComparatorTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileComparatorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -13,8 +13,6 @@
 import junit.framework.Test;
 import java.io.*;
 
-import junit.framework.Assert;
-
 import org.eclipse.jdt.core.compiler.batch.BatchCompiler;
 import org.eclipse.jdt.core.tests.util.Util;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;
@@ -117,7 +115,7 @@
 				"  }\n" +
 				"}";
 			compileAndDeploy(sourceA001_2, "A001_2");
-			Assert.assertTrue(!areStructurallyDifferent("A001", "A001_2", false, false));
+			assertTrue(!areStructurallyDifferent("A001", "A001_2", false, false));
 		} finally {
 			removeTempClass("A001");
 		}
@@ -142,7 +140,7 @@
 				"  }\n" +
 				"}";
 			compileAndDeploy(sourceA002_2, "A002_2");
-			Assert.assertTrue(areStructurallyDifferent("A002", "A002_2", false, false));
+			assertTrue(areStructurallyDifferent("A002", "A002_2", false, false));
 		} finally {
 			removeTempClass("A002");
 		}
@@ -160,7 +158,7 @@
 				"public static final int II = 6;\n" +
 				"}";
 			compileAndDeploy(sourceA003_2, "A003_2");
-			Assert.assertTrue(areStructurallyDifferent("A003", "A003_2", false, false));
+			assertTrue(areStructurallyDifferent("A003", "A003_2", false, false));
 		} finally {
 			removeTempClass("A003");
 		}
@@ -187,7 +185,7 @@
 				"  }\n" +
 				"}";
 			compileAndDeploy(sourceA004_2, "A004_2");
-			Assert.assertTrue(!areStructurallyDifferent("A004", "A004_2", true, true));
+			assertTrue(!areStructurallyDifferent("A004", "A004_2", true, true));
 		} finally {
 			removeTempClass("A004");
 		}
@@ -211,7 +209,7 @@
 				"  }\n" +
 				"}";
 			compileAndDeploy(sourceA005_2, "A005_2");
-			Assert.assertTrue(areStructurallyDifferent("A005", "A005_2", true, true));
+			assertTrue(areStructurallyDifferent("A005", "A005_2", true, true));
 		} finally {
 			removeTempClass("A005");
 		}
@@ -228,7 +226,7 @@
 				"public static final int II = 6;\n" +
 				"}";
 			compileAndDeploy(sourceA006_2, "A006_2");
-			Assert.assertTrue(areStructurallyDifferent("A006", "A006_2", true, true));
+			assertTrue(areStructurallyDifferent("A006", "A006_2", true, true));
 		} finally {
 			removeTempClass("A006");
 		}
@@ -252,7 +250,7 @@
 				"}\n" +
 				"}";
 			compileAndDeploy(sourceA007_2, "A007_2");
-			Assert.assertTrue(!areStructurallyDifferent("A007", "A007_2", true, true));
+			assertTrue(!areStructurallyDifferent("A007", "A007_2", true, true));
 		} finally {
 			removeTempClass("A007");
 		}
@@ -275,7 +273,7 @@
 				"}\n" +
 				"}";
 			compileAndDeploy(sourceA008_2, "A008_2");
-			Assert.assertTrue(!areStructurallyDifferent("A008", "A008_2", true, false));
+			assertTrue(!areStructurallyDifferent("A008", "A008_2", true, false));
 		} finally {
 			removeTempClass("A008");
 		}
@@ -304,7 +302,7 @@
 				"}\n" +
 				"}";
 			compileAndDeploy(sourceA009_2, "A009_2");
-			Assert.assertTrue(areStructurallyDifferent("A009", "A009_2", true, false));
+			assertTrue(areStructurallyDifferent("A009", "A009_2", true, false));
 		} finally {
 			removeTempClass("A009");
 		}
@@ -332,7 +330,7 @@
 				"}\n" +
 				"}";
 			compileAndDeploy(sourceA010_2, "A010_2");
-			Assert.assertTrue(!areStructurallyDifferent("A010", "A010_2", true, true));
+			assertTrue(!areStructurallyDifferent("A010", "A010_2", true, true));
 		} finally {
 			removeTempClass("A010");
 		}
@@ -361,7 +359,7 @@
 				"}\n" +
 				"}";
 			compileAndDeploy(sourceA011_2, "A011_2");
-			Assert.assertTrue(!areStructurallyDifferent("A011", "A011_2", false, true));
+			assertTrue(!areStructurallyDifferent("A011", "A011_2", false, true));
 		} finally {
 			removeTempClass("A011");
 		}
@@ -382,7 +380,7 @@
 				"}\n" +
 				"}";
 			compileAndDeploy(sourceA012_2, "A012_2");
-			Assert.assertTrue(areStructurallyDifferent("A012", "A012_2", false, false));
+			assertTrue(areStructurallyDifferent("A012", "A012_2", false, false));
 		} finally {
 			removeTempClass("A012");
 		}
@@ -403,7 +401,7 @@
 				"}\n" +
 				"}";
 			compileAndDeploy(sourceA013_2, "A013_2");
-			Assert.assertTrue(!areStructurallyDifferent("A013", "A013_2", false, true));
+			assertTrue(!areStructurallyDifferent("A013", "A013_2", false, true));
 		} finally {
 			removeTempClass("A013");
 		}
@@ -424,7 +422,7 @@
 				"}\n" +
 				"}";
 			compileAndDeploy(sourceA014_2, "A014_2");
-			Assert.assertTrue(!areStructurallyDifferent("A014", "A014_2", true, true));
+			assertTrue(!areStructurallyDifferent("A014", "A014_2", true, true));
 		} finally {
 			removeTempClass("A014");
 		}
@@ -444,7 +442,7 @@
 				"  }\n" +
 				"}";
 			compileAndDeploy(sourceA015, "A015");
-			Assert.assertTrue(!areStructurallyDifferent("A015$B", "A015$B", false, false));
+			assertTrue(!areStructurallyDifferent("A015$B", "A015$B", false, false));
 		} finally {
 			removeTempClass("A015");
 		}
@@ -464,7 +462,7 @@
 				"}\n" +
 				"}";
 			compileAndDeploy(sourceA016_2, "A016_2");
-			Assert.assertTrue(areStructurallyDifferent("A016", "A016_2", false, false));
+			assertTrue(areStructurallyDifferent("A016", "A016_2", false, false));
 		} finally {
 			removeTempClass("A016");
 		}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest_1_4.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest_1_4.java
index e03d0a7..0376cf4 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest_1_4.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest_1_4.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
index 5a6f582..92eba22 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
@@ -991,6 +991,7 @@
         expectedProblemAttributes.put("DifferentReturnInCalloutMethodSpec", new ProblemAttributes(CategorizedProblem.CAT_MEMBER));
 
         expectedProblemAttributes.put("CovariantReturnRequiresTypeParameter", new ProblemAttributes(CategorizedProblem.CAT_MEMBER));
+        expectedProblemAttributes.put("CallinToConstructorMustUseAfter", new ProblemAttributes(CategorizedProblem.CAT_INTERNAL));
         
         // OT SYNTAX_RELATED:
         expectedProblemAttributes.put("SYNTAX_RELATED", new ProblemAttributes(CategorizedProblem.CAT_INTERNAL));
@@ -1044,6 +1045,7 @@
         expectedProblemAttributes.put("UnexpectedAnnotationStructure", new ProblemAttributes(CategorizedProblem.CAT_INTERNAL));
         expectedProblemAttributes.put("IncompatibleOTJByteCodeVersion", new ProblemAttributes(CategorizedProblem.CAT_INTERNAL));
         expectedProblemAttributes.put("AbstractStaticMethodCalled", new ProblemAttributes(CategorizedProblem.CAT_INTERNAL));
+        expectedProblemAttributes.put("RoleFileMissingTeamDeclaration", new ProblemAttributes(CategorizedProblem.CAT_INTERNAL));
 //SH}
 		StringBuffer failures = new StringBuffer();
 		StringBuffer correctResult = new StringBuffer(70000);
@@ -2026,6 +2028,8 @@
         expectedProblemAttributes.put("CallinIncompatibleStatic", SKIP);
         expectedProblemAttributes.put("ReplaceCallinIncompatibleStatic", SKIP);
         expectedProblemAttributes.put("UnknownPrecedence", SKIP);
+        expectedProblemAttributes.put("CallinToConstructorMustUseAfter", SKIP);
+
 
         expectedProblemAttributes.put("OTJ_RELATED", SKIP);
         expectedProblemAttributes.put("OTCHAP", SKIP);
@@ -2377,6 +2381,7 @@
         expectedProblemAttributes.put("BaseMigrateNonRole", SKIP);
         expectedProblemAttributes.put("BaseMigrateUnboundRole", SKIP);
         expectedProblemAttributes.put("MigrateToWrongBase", SKIP);
+        expectedProblemAttributes.put("RoleFileMissingTeamDeclaration", SKIP);
 //SH}
 		Map constantNamesIndex = new HashMap();
 		Field[] fields = JavaCore.class.getFields();
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Deprecated15Test.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Deprecated15Test.java
index 20b8825..563dc7c 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Deprecated15Test.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Deprecated15Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java
index b6cb60c..3b3a5ab 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -11,6 +11,7 @@
  *								Bug 365519 - editorial cleanup after bug 186342 and bug 365387
  *								Bug 265744 - Enum switch should warn about missing default
  *								Bug 374605 - Unreasonable warning for enum-based switch statements
+ *								Bug 395681 - [compiler] Improve simulation of javac6 behavior from bug 317719 after fixing bug 388795
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -3007,7 +3008,7 @@
 		"1. ERROR in X.java (at line 1)\n" +
 		"	public enum X implements I, J { \n" +
 		"	            ^\n" +
-		"The type X must implement the inherited abstract method I.foo()\n" +
+		"The type X must implement the inherited abstract method J.foo()\n" +
 		"----------\n");
 	this.runNegativeTest(
 		new String[] {
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 b2bbe63..0e046cc 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -11,6 +11,8 @@
  *     Stephan Herrmann - Contributions for
  *								bug 383690 - [compiler] location of error re uninitialized final field should be aligned
  *								bug 388795 - [compiler] detection of name clash depends on order of super interfaces
+ *								bug 395681 - [compiler] Improve simulation of javac6 behavior from bug 317719 after fixing bug 388795
+ *								bug 406928 - computation of inherited methods seems damaged (affecting @Overrides)
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -885,12 +887,12 @@
 			"1. ERROR in X.java (at line 2)\n" +
 			"	void foo(E e){}\n" +
 			"	     ^^^^^^^^\n" +
-			"Method foo(E) has the same erasure foo(Object) as another method in type X<E,T>\n" +
+			"Erasure of method foo(E) is the same as another method in type X<E,T>\n" +
 			"----------\n" +
 			"2. ERROR in X.java (at line 3)\n" +
 			"	void foo(T t){}\n" +
 			"	     ^^^^^^^^\n" +
-			"Method foo(T) has the same erasure foo(Object) as another method in type X<E,T>\n" +
+			"Erasure of method foo(T) is the same as another method in type X<E,T>\n" +
 			"----------\n");
 	}
 
@@ -907,12 +909,12 @@
 			"1. ERROR in X.java (at line 2)\n" +
 			"	void foo(E e){}\n" +
 			"	     ^^^^^^^^\n" +
-			"Method foo(E) has the same erasure foo(Exception) as another method in type X<E,T>\n" +
+			"Erasure of method foo(E) is the same as another method in type X<E,T>\n" +
 			"----------\n" +
 			"2. ERROR in X.java (at line 3)\n" +
 			"	void foo(T t){}\n" +
 			"	     ^^^^^^^^\n" +
-			"Method foo(T) has the same erasure foo(Exception) as another method in type X<E,T>\n" +
+			"Erasure of method foo(T) is the same as another method in type X<E,T>\n" +
 			"----------\n");
 	}
 
@@ -929,12 +931,12 @@
 			"1. ERROR in X.java (at line 2)\n" +
 			"	void foo(E e, Thread t){}\n" +
 			"	     ^^^^^^^^^^^^^^^^^^\n" +
-			"Method foo(E, Thread) has the same erasure foo(Exception, Thread) as another method in type X<E,T>\n" +
+			"Erasure of method foo(E, Thread) is the same as another method in type X<E,T>\n" +
 			"----------\n" +
 			"2. ERROR in X.java (at line 3)\n" +
 			"	void foo(Exception e, T t){}\n" +
 			"	     ^^^^^^^^^^^^^^^^^^^^^\n" +
-			"Method foo(Exception, T) has the same erasure foo(Exception, Thread) as another method in type X<E,T>\n" +
+			"Erasure of method foo(Exception, T) is the same as another method in type X<E,T>\n" +
 			"----------\n");
 	}
 
@@ -1007,17 +1009,17 @@
 			"1. ERROR in X.java (at line 2)\n" +
 			"	void foo(L<E> l1){}\n" +
 			"	     ^^^^^^^^^^^^\n" +
-			"Method foo(L<E>) has the same erasure foo(L<E>) as another method in type X<E,T>\n" +
+			"Erasure of method foo(L<E>) is the same as another method in type X<E,T>\n" +
 			"----------\n" +
 			"2. ERROR in X.java (at line 3)\n" +
 			"	void foo(L<T> l2){}\n" +
 			"	     ^^^^^^^^^^^^\n" +
-			"Method foo(L<T>) has the same erasure foo(L<E>) as another method in type X<E,T>\n" +
+			"Erasure of method foo(L<T>) is the same as another method in type X<E,T>\n" +
 			"----------\n" +
 			"3. ERROR in X.java (at line 4)\n" +
 			"	void foo(L l){}\n" +
 			"	     ^^^^^^^^\n" +
-			"Method foo(L) has the same erasure foo(L<E>) as another method in type X<E,T>\n" +
+			"Erasure of method foo(L) is the same as another method in type X<E,T>\n" +
 			"----------\n" +
 			"4. WARNING in X.java (at line 4)\n" +
 			"	void foo(L l){}\n" +
@@ -17676,23 +17678,23 @@
 				"1. WARNING in X.java (at line 2)\n" + 
 				"	void foo(A<String> a) {}\n" + 
 				"	     ^^^^^^^^^^^^^^^^\n" + 
-				"Method foo(A<String>) has the same erasure foo(A<T>) as another method in type X\n" + 
+				"Erasure of method foo(A<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. WARNING in X.java (at line 3)\n" + 
 				"	Object foo(A<Integer> a) { return null; }\n" + 
 				"	       ^^^^^^^^^^^^^^^^^\n" + 
-				"Method foo(A<Integer>) has the same erasure foo(A<T>) as another method in type X\n" + 
+				"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
 				"----------\n":
 					"----------\n" + 
 					"1. ERROR in X.java (at line 2)\n" + 
 					"	void foo(A<String> a) {}\n" + 
 					"	     ^^^^^^^^^^^^^^^^\n" + 
-					"Method foo(A<String>) has the same erasure foo(A<T>) as another method in type X\n" + 
+					"Erasure of method foo(A<String>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"2. ERROR in X.java (at line 3)\n" + 
 					"	Object foo(A<Integer> a) { return null; }\n" + 
 					"	       ^^^^^^^^^^^^^^^^^\n" + 
-					"Method foo(A<Integer>) has the same erasure foo(A<T>) as another method in type X\n" + 
+					"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"3. ERROR in X.java (at line 4)\n" + 
 					"	void test(A<Integer> a) { foo(a); }\n" + 
@@ -17727,23 +17729,23 @@
 				"1. WARNING in X.java (at line 2)\n" + 
 				"	Number foo(A<String> a) { return null; }\n" + 
 				"	       ^^^^^^^^^^^^^^^^\n" + 
-				"Method foo(A<String>) has the same erasure foo(A<T>) as another method in type X\n" + 
+				"Erasure of method foo(A<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. WARNING in X.java (at line 3)\n" + 
 				"	Integer foo(A<Integer> a) { return null; }\n" + 
 				"	        ^^^^^^^^^^^^^^^^^\n" + 
-				"Method foo(A<Integer>) has the same erasure foo(A<T>) as another method in type X\n" + 
+				"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
 				"----------\n":
 					"----------\n" + 
 					"1. ERROR in X.java (at line 2)\n" + 
 					"	Number foo(A<String> a) { return null; }\n" + 
 					"	       ^^^^^^^^^^^^^^^^\n" + 
-					"Method foo(A<String>) has the same erasure foo(A<T>) as another method in type X\n" + 
+					"Erasure of method foo(A<String>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"2. ERROR in X.java (at line 3)\n" + 
 					"	Integer foo(A<Integer> a) { return null; }\n" + 
 					"	        ^^^^^^^^^^^^^^^^^\n" + 
-					"Method foo(A<Integer>) has the same erasure foo(A<T>) as another method in type X\n" + 
+					"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"3. ERROR in X.java (at line 4)\n" + 
 					"	void test(A<Integer> a) { foo(a); }\n" + 
@@ -32570,7 +32572,7 @@
 			"1. ERROR in X.java (at line 7)\n" + 
 			"	abstract class GLinkElementView<M,CM> extends AbstractLinkView<M> {}\n" + 
 			"	               ^^^^^^^^^^^^^^^^\n" + 
-			"The return types are incompatible for the inherited methods EditPart.getViewer(), ILinkViewElement.getViewer(), AbstractLinkView<M>.getViewer()\n" + 
+			"The return types are incompatible for the inherited methods ILinkViewElement.getViewer(), EditPart.getViewer(), AbstractLinkView<M>.getViewer()\n" + 
 			"----------\n" + 
 			"2. ERROR in X.java (at line 11)\n" + 
 			"	public SheetViewer getViewer() { return null; }	\n" + 
@@ -40499,7 +40501,7 @@
 			"2. ERROR in X.java (at line 2)\n" + 
 			"	public static <S, T extends Comparable<S>, R extends S & T> R max(T arg1, S arg2) {\n" + 
 			"	                                                              ^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method max(T, S) has the same erasure max(Comparable<T>, Object) as another method in type X\n" + 
+			"Erasure of method max(T, S) is the same as another method in type X\n" +
 			"----------\n" + 
 			"3. WARNING in X.java (at line 3)\n" + 
 			"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
@@ -40514,7 +40516,7 @@
 			"5. ERROR in X.java (at line 5)\n" + 
 			"	public static <T extends Comparable<S>, S, R extends S & Comparable<S>> R max(T arg1, S arg2) {\n" + 
 			"	                                                                          ^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method max(T, S) has the same erasure max(Comparable<T>, Object) as another method in type X\n" + 
+			"Erasure of method max(T, S) is the same as another method in type X\n" +
 			"----------\n" + 
 			"6. WARNING in X.java (at line 6)\n" + 
 			"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
@@ -40524,7 +40526,7 @@
 			"7. WARNING in X.java (at line 8)\n" + 
 			"	public static <T extends Comparable<S>, S, R extends Comparable<S>> R max(T arg1, S arg2) {\n" + 
 			"	                                                                      ^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method max(T, S) has the same erasure max(Comparable<T>, Object) as another method in type X\n" + 
+			"Erasure of method max(T, S) is the same as another method in type X\n" +
 			"----------\n" + 
 			"8. WARNING in X.java (at line 9)\n" + 
 			"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
@@ -40540,7 +40542,7 @@
 				"2. ERROR in X.java (at line 2)\n" + 
 				"	public static <S, T extends Comparable<S>, R extends S & T> R max(T arg1, S arg2) {\n" + 
 				"	                                                              ^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method max(T, S) has the same erasure max(Comparable<T>, Object) as another method in type X\n" + 
+				"Erasure of method max(T, S) is the same as another method in type X\n" +
 				"----------\n" + 
 				"3. WARNING in X.java (at line 3)\n" + 
 				"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
@@ -40555,7 +40557,7 @@
 				"5. ERROR in X.java (at line 5)\n" + 
 				"	public static <T extends Comparable<S>, S, R extends S & Comparable<S>> R max(T arg1, S arg2) {\n" + 
 				"	                                                                          ^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method max(T, S) has the same erasure max(Comparable<T>, Object) as another method in type X\n" + 
+				"Erasure of method max(T, S) is the same as another method in type X\n" +
 				"----------\n" + 
 				"6. WARNING in X.java (at line 6)\n" + 
 				"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
@@ -40565,7 +40567,7 @@
 				"7. ERROR in X.java (at line 8)\n" + 
 				"	public static <T extends Comparable<S>, S, R extends Comparable<S>> R max(T arg1, S arg2) {\n" + 
 				"	                                                                      ^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method max(T, S) has the same erasure max(Comparable<T>, Object) as another method in type X\n" + 
+				"Erasure of method max(T, S) is the same as another method in type X\n" +
 				"----------\n" + 
 				"8. WARNING in X.java (at line 9)\n" + 
 				"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
@@ -40742,7 +40744,7 @@
 		"1. ERROR in X.java (at line 2)\n" +
 		"	<T> void foo(Class<X> c) {};\n" +
 		"	         ^^^^^^^^^^^^^^^\n" +
-		"Method foo(Class<X>) has the same erasure foo(Class<T>) as another method in type X<U,V>\n" +
+		"Erasure of method foo(Class<X>) is the same as another method in type X<U,V>\n" +
 		"----------\n" +
 		"2. WARNING in X.java (at line 2)\n" +
 		"	<T> void foo(Class<X> c) {};\n" +
@@ -40752,7 +40754,7 @@
 		"3. ERROR in X.java (at line 3)\n" +
 		"	<A, B> void foo(Class<X<A, B>> c) {}\n" +
 		"	            ^^^^^^^^^^^^^^^^^^^^^\n" +
-		"Method foo(Class<X<A,B>>) has the same erasure foo(Class<T>) as another method in type X<U,V>\n" +
+		"Erasure of method foo(Class<X<A,B>>) is the same as another method in type X<U,V>\n" +
 		"----------\n" +
 		"4. ERROR in X.java (at line 4)\n" +
 		"	void foo2(Class<X<U, V>> c) {};\n" +
@@ -42811,7 +42813,7 @@
 		"4. ERROR in X.java (at line 13)\n" +
 		"	public interface CombinedSubInterface extends SubInterface, OtherSubInterface {}\n" +
 		"	                 ^^^^^^^^^^^^^^^^^^^^\n" +
-		"The return types are incompatible for the inherited methods X.OtherSubInterface.and(X.SuperInterface), X.SubInterface.and(X.SuperInterface)\n" +
+		"The return types are incompatible for the inherited methods X.SubInterface.and(X.SuperInterface), X.OtherSubInterface.and(X.SuperInterface)\n" +
 		"----------\n" +
 		"5. WARNING in X.java (at line 15)\n" +
 		"	public interface OtherSubInterface extends SuperInterface {\n" +
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 6b769eb..9ccb048 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
@@ -11,6 +11,7 @@
  *								bug 282152 - [1.5][compiler] Generics code rejected by Eclipse but accepted by javac
  *								bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
  *								bug 401456 - Code compiles from javac/intellij, but fails from eclipse
+ *								bug 405706 - Eclipse compiler fails to give compiler error when return type is a inferred generic
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -31,7 +32,7 @@
 	// Static initializer to specify tests subset using TESTS_* static variables
 	// All specified tests which does not belong to the class are skipped...
 	static {
-//		TESTS_NAMES = new String[] { "test401456" };
+//		TESTS_NAMES = new String[] { "testBug405706" };
 //		TESTS_NAMES = new String[] { "test1464" };
 //		TESTS_NUMBERS = new int[] { 1465 };
 //		TESTS_RANGE = new int[] { 1097, -1 };
@@ -2857,4 +2858,61 @@
 			"}\n"
 		});
 }
+// https://bugs.eclipse.org/405706 - Eclipse compiler fails to give compiler error when return type is a inferred generic
+// original test
+public void testBug405706a() {
+	runNegativeTest(
+		new String[] {
+			"TypeUnsafe.java",
+			"import java.util.Collection;\n" + 
+			"\n" + 
+			"public class TypeUnsafe {\n" + 
+			"	public static <Type,\n" + 
+			"			CollectionType extends Collection<Type>>\n" + 
+			"			CollectionType\n" + 
+			"			nullAsCollection(Class<Type> clazz) {\n" + 
+			"		return null;\n" + 
+			"	}\n" + 
+			"\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Collection<Integer> integers = nullAsCollection(String.class);\n" + 
+			"	}\n" + 
+			"}\n"
+		},
+		"----------\n" + 
+		"1. ERROR in TypeUnsafe.java (at line 12)\n" + 
+		"	Collection<Integer> integers = nullAsCollection(String.class);\n" + 
+		"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+		"Type mismatch: cannot convert from Collection<String> to Collection<Integer>\n" + 
+		"----------\n");
+}
+// https://bugs.eclipse.org/405706 - Eclipse compiler fails to give compiler error when return type is a inferred generic
+// include compatibility List <: Collection
+public void testBug405706b() {
+	runNegativeTest(
+		new String[] {
+			"TypeUnsafe.java",
+			"import java.util.Collection;\n" + 
+			"import java.util.List;\n" + 
+			"\n" + 
+			"public class TypeUnsafe {\n" + 
+			"	public static <Type,\n" + 
+			"			CollectionType extends List<Type>>\n" + 
+			"			CollectionType\n" + 
+			"			nullAsList(Class<Type> clazz) {\n" + 
+			"		return null;\n" + 
+			"	}\n" + 
+			"\n" + 
+			"	public static void main(String[] args) {\n" + 
+			"		Collection<Integer> integers = nullAsList(String.class);\n" + 
+			"	}\n" + 
+			"}\n"
+		},
+		"----------\n" + 
+		"1. ERROR in TypeUnsafe.java (at line 13)\n" + 
+		"	Collection<Integer> integers = nullAsList(String.class);\n" + 
+		"	                               ^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
+		"Type mismatch: cannot convert from List<String> to Collection<Integer>\n" + 
+		"----------\n");
+}
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InnerEmulationTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InnerEmulationTest.java
index 7e127d4..d486651 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InnerEmulationTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InnerEmulationTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2010 IBM Corporation and others.
+ * Copyright (c) 2006, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Keigo Imai - Contribution for  bug 388903 - Cannot extend inner class as an anonymous class when it extends the outer class
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -6891,6 +6892,53 @@
 		},
 		"SUCCESS");
 }
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=388903
+public void test175() throws Exception {
+	this.runConformTest(
+		new String[] {
+			"X.java",//=======================
+			"public class X {\n" + 
+			"	class Inner extends X {\n" +
+			"	}\n" + 
+			"	public static void main(String[] args) {\n" +
+			"		new X().new Inner(){};\n" + 
+			"		System.out.println(\"SUCCESS\");\n" + 
+			"	}\n" + 
+			"}",
+		},
+		"SUCCESS");
+	this.runConformTest(
+			new String[] {
+				"X.java",//=======================
+				"public class X {\n" +
+				"	String which;\n" +
+				"	X(String s) {\n" +
+				"		this.which = s;\n" +
+				"	}\n" + 
+				"	class Inner extends X {\n" +
+				"		Inner() {\n" +
+				"			super(\"Inner\");\n" +
+				"			System.out.print( X.this.which + \",\" ); // will output 'Enclosing,'\n" +
+				"		}\n" +
+				"	}\n" + 
+				"	void check() {\n" +
+				"		new X(\"Enclosing\").new Inner() {\n" +
+				"			{\n" +
+				"				System.out.print( X.this.which + \",\" ); // will output 'Context,'\n" +
+				"			}\n" +
+				"			void f() {\n" +
+				"				System.out.println( X.this.which ); // will output 'Context'\n" +
+				"			}\n" +
+				"		}.f();\n" + 
+				"	}\n" +
+				"	public static void main(String[] args) {\n" +
+				"		new X(\"Context\").check();\n" +
+				"	}\n" + 
+				"}",
+			},
+			"Enclosing,Context,Context");
+}
+
 public static Class testClass() {
 	return InnerEmulationTest.class;
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InstanceofExpressionTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InstanceofExpressionTest.java
new file mode 100644
index 0000000..233eafd
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InstanceofExpressionTest.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *
+ *******************************************************************************/
+
+package org.eclipse.jdt.core.tests.compiler.regression;
+
+import junit.framework.Test;
+
+public class InstanceofExpressionTest extends AbstractRegressionTest {
+
+	public InstanceofExpressionTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		return buildAllCompliancesTestSuite(testClass());
+	}
+
+	public static Class testClass() {
+		return InstanceofExpressionTest.class;
+	}
+
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=341828
+	public void test001() {
+		this.runNegativeTest(
+			new String[] {
+				"X.java",
+				"import java.io.InputStream;\n" +
+				"public class X {\n" +
+				"    void foo(InputStream is) {\n" +
+				"    if (is instanceof FileInputStream)\n" +
+				"        System.out.println(\"Hello\");\n" +
+				"    }\n" +
+				"}",
+			},
+			"----------\n" +
+			"1. ERROR in X.java (at line 4)\n" +
+			"	if (is instanceof FileInputStream)\n" +
+			"	                  ^^^^^^^^^^^^^^^\n" +
+			"FileInputStream cannot be resolved to a type\n" +
+			"----------\n"
+		);
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LineNumberAttributeTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LineNumberAttributeTest.java
index 7afa765..21de7be 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LineNumberAttributeTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LineNumberAttributeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2012 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
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 079991d..b8ad03f 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,8 +7,12 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Stephan Herrmann - Contribution for
+ *     Stephan Herrmann - Contributions for
  *								bug 388795 - [compiler] detection of name clash depends on order of super interfaces
+ *								bug 395681 - [compiler] Improve simulation of javac6 behavior from bug 317719 after fixing bug 388795
+ *								bug 409473 - [compiler] JDT cannot compile against JRE 1.8
+ *	   Andy Clement - Contribution for
+ *								bug 406928 - computation of inherited methods seems damaged (affecting @Overrides)
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -29,7 +33,7 @@
 
 public class MethodVerifyTest extends AbstractComparableTest {
 	static {
-//		TESTS_NAMES = new String[] { "testBug317719" };
+//		TESTS_NAMES = new String[] { "testBug406928" };
 //		TESTS_NUMBERS = new int[] { 213 };
 //		TESTS_RANGE = new int[] { 190, -1};
 	}
@@ -2033,7 +2037,7 @@
 			"1. ERROR in X.java (at line 3)\n" +
 			"	public class X<T extends I&J> {}\n" +
 			"	               ^\n" +
-			"The return types are incompatible for the inherited methods J.foo(), I.foo()\n" +
+			"The return types are incompatible for the inherited methods I.foo(), J.foo()\n" +
 			"----------\n"
 			// types J and I are incompatible; both define foo(), but with unrelated return types
 		);
@@ -2359,7 +2363,7 @@
 					"1. ERROR in Y.java (at line 1)\n" + 
 					"	abstract class Y implements Equivalent<String>, EqualityComparable<Integer> {\n" + 
 					"	               ^\n" + 
-					"Name clash: The method equalTo(T) of type Equivalent<T> has the same erasure as equalTo(T) of type EqualityComparable<T> but does not override it\n" + 
+					"Name clash: The method equalTo(T) of type EqualityComparable<T> has the same erasure as equalTo(T) of type Equivalent<T> but does not override it\n" + 
 					"----------\n");
 		}
 	}
@@ -2379,29 +2383,29 @@
 			"1. ERROR in Y.java (at line 2)\n" +
 			"	public abstract boolean equalTo(Object other);\n" +
 			"	                        ^^^^^^^^^^^^^^^^^^^^^\n" +
-			"Name clash: The method equalTo(Object) of type Y has the same erasure as equalTo(T) of type Equivalent<T> but does not override it\n" +
+			"Name clash: The method equalTo(Object) of type Y has the same erasure as equalTo(T) of type EqualityComparable<T> but does not override it\n" +
 			"----------\n" +
 			"2. ERROR in Y.java (at line 2)\n" +
 			"	public abstract boolean equalTo(Object other);\n" +
 			"	                        ^^^^^^^^^^^^^^^^^^^^^\n" +
-			"Name clash: The method equalTo(Object) of type Y has the same erasure as equalTo(T) of type EqualityComparable<T> but does not override it\n" +
+			"Name clash: The method equalTo(Object) of type Y has the same erasure as equalTo(T) of type Equivalent<T> but does not override it\n" +
 			"----------\n" :
 			// name clash: equalTo(java.lang.Object) in Y and equalTo(T) in Equivalent<java.lang.String> have the same erasure, yet neither overrides the other
 			"----------\n" + 
 			"1. ERROR in Y.java (at line 1)\n" + 
 			"	abstract class Y implements Equivalent<String>, EqualityComparable<Integer> {\n" + 
 			"	               ^\n" + 
-			"Name clash: The method equalTo(T) of type Equivalent<T> has the same erasure as equalTo(T) of type EqualityComparable<T> but does not override it\n" + 
+			"Name clash: The method equalTo(T) of type EqualityComparable<T> has the same erasure as equalTo(T) of type Equivalent<T> but does not override it\n" + 
 			"----------\n" + 
 			"2. ERROR in Y.java (at line 2)\n" + 
 			"	public abstract boolean equalTo(Object other);\n" + 
 			"	                        ^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Name clash: The method equalTo(Object) of type Y has the same erasure as equalTo(T) of type Equivalent<T> but does not override it\n" + 
+			"Name clash: The method equalTo(Object) of type Y has the same erasure as equalTo(T) of type EqualityComparable<T> but does not override it\n" + 
 			"----------\n" + 
 			"3. ERROR in Y.java (at line 2)\n" + 
 			"	public abstract boolean equalTo(Object other);\n" + 
 			"	                        ^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Name clash: The method equalTo(Object) of type Y has the same erasure as equalTo(T) of type EqualityComparable<T> but does not override it\n" + 
+			"Name clash: The method equalTo(Object) of type Y has the same erasure as equalTo(T) of type Equivalent<T> but does not override it\n" + 
 			"----------\n"
 		);
 	}
@@ -3718,7 +3722,7 @@
 			"1. ERROR in X.java (at line 6)\n" +
 			"	@Override T id(T x) { return x; }\n" +
 			"	            ^^^^^^^\n" +
-			"Method id(T) has the same erasure id(A) as another method in type Y<T>\n" +
+			"Erasure of method id(T) is the same as another method in type Y<T>\n" +
 			"----------\n" +
 			"2. ERROR in X.java (at line 6)\n" +
 			"	@Override T id(T x) { return x; }\n" +
@@ -3728,7 +3732,7 @@
 			"3. ERROR in X.java (at line 7)\n" +
 			"	@Override A id(A x) { return x; }\n" +
 			"	            ^^^^^^^\n" +
-			"Method id(A) has the same erasure id(A) as another method in type Y<T>\n" +
+			"Erasure of method id(A) is the same as another method in type Y<T>\n" +
 			"----------\n"
 			// id(T) is already defined in Y
 			// id(java.lang.String) in Y overrides id(T) in X; return type requires unchecked conversion
@@ -4034,43 +4038,43 @@
 				"1. ERROR in X.java (at line 3)\n" + 
 				"	A<Y> foo(A<Y> o) {  return null; } // duplicate\n" + 
 				"	     ^^^^^^^^^^^\n" + 
-				"Method foo(A<Y>) has the same erasure foo(A<T>) as another method in type X.C5\n" + 
+				"Erasure of method foo(A<Y>) is the same as another method in type X.C5\n" +
 				"----------\n" + 
 				"2. ERROR in X.java (at line 4)\n" + 
 				"	A<Z> foo(A<Z> o) {  return null; } // duplicate\n" + 
 				"	     ^^^^^^^^^^^\n" + 
-				"Method foo(A<Z>) has the same erasure foo(A<T>) as another method in type X.C5\n" + 
+				"Erasure of method foo(A<Z>) is the same as another method in type X.C5\n" +
 				"----------\n" + 
 				"3. WARNING in X.java (at line 7)\n" + 
 				"	<T extends Y> T foo(A<Y> o) {  return null; } // ok\n" + 
 				"	                ^^^^^^^^^^^\n" + 
-				"Method foo(A<Y>) has the same erasure foo(A<T>) as another method in type X.C6\n" + 
+				"Erasure of method foo(A<Y>) is the same as another method in type X.C6\n" +
 				"----------\n" + 
 				"4. WARNING in X.java (at line 8)\n" + 
 				"	<T extends Z> T foo(A<Z> o) {  return null; } // ok\n" + 
 				"	                ^^^^^^^^^^^\n" + 
-				"Method foo(A<Z>) has the same erasure foo(A<T>) as another method in type X.C6\n" + 
+				"Erasure of method foo(A<Z>) is the same as another method in type X.C6\n" +
 				"----------\n":
 					"----------\n" + 
 					"1. ERROR in X.java (at line 3)\n" + 
 					"	A<Y> foo(A<Y> o) {  return null; } // duplicate\n" + 
 					"	     ^^^^^^^^^^^\n" + 
-					"Method foo(A<Y>) has the same erasure foo(A<T>) as another method in type X.C5\n" + 
+					"Erasure of method foo(A<Y>) is the same as another method in type X.C5\n" +
 					"----------\n" + 
 					"2. ERROR in X.java (at line 4)\n" + 
 					"	A<Z> foo(A<Z> o) {  return null; } // duplicate\n" + 
 					"	     ^^^^^^^^^^^\n" + 
-					"Method foo(A<Z>) has the same erasure foo(A<T>) as another method in type X.C5\n" + 
+					"Erasure of method foo(A<Z>) is the same as another method in type X.C5\n" +
 					"----------\n" + 
 					"3. ERROR in X.java (at line 7)\n" + 
 					"	<T extends Y> T foo(A<Y> o) {  return null; } // ok\n" + 
 					"	                ^^^^^^^^^^^\n" + 
-					"Method foo(A<Y>) has the same erasure foo(A<T>) as another method in type X.C6\n" + 
+					"Erasure of method foo(A<Y>) is the same as another method in type X.C6\n" +
 					"----------\n" + 
 					"4. ERROR in X.java (at line 8)\n" + 
 					"	<T extends Z> T foo(A<Z> o) {  return null; } // ok\n" + 
 					"	                ^^^^^^^^^^^\n" + 
-					"Method foo(A<Z>) has the same erasure foo(A<T>) as another method in type X.C6\n" + 
+					"Erasure of method foo(A<Z>) is the same as another method in type X.C6\n" +
 					"----------\n";
 		this.runNegativeTest(
 			new String[] {
@@ -4163,63 +4167,63 @@
 				"1. WARNING in X.java (at line 2)\n" + 
 				"	<N extends B> N a(A<String> s) { return null; }\n" + 
 				"	                ^^^^^^^^^^^^^^\n" + 
-				"Method a(A<String>) has the same erasure a(A<T>) as another method in type X\n" + 
+				"Erasure of method a(A<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. WARNING in X.java (at line 3)\n" + 
 				"	<N> Object a(A<Number> n) { return null; }\n" + 
 				"	           ^^^^^^^^^^^^^^\n" + 
-				"Method a(A<Number>) has the same erasure a(A<T>) as another method in type X\n" + 
+				"Erasure of method a(A<Number>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"3. WARNING in X.java (at line 4)\n" + 
 				"	<N extends B> void b(A<String> s) {}\n" + 
 				"	                   ^^^^^^^^^^^^^^\n" + 
-				"Method b(A<String>) has the same erasure b(A<T>) as another method in type X\n" + 
+				"Erasure of method b(A<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"4. WARNING in X.java (at line 5)\n" + 
 				"	<N extends B> B b(A<Number> n) { return null; }\n" + 
 				"	                ^^^^^^^^^^^^^^\n" + 
-				"Method b(A<Number>) has the same erasure b(A<T>) as another method in type X\n" + 
+				"Erasure of method b(A<Number>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"5. WARNING in X.java (at line 6)\n" + 
 				"	void c(A<String> s) {}\n" + 
 				"	     ^^^^^^^^^^^^^^\n" + 
-				"Method c(A<String>) has the same erasure c(A<T>) as another method in type X\n" + 
+				"Erasure of method c(A<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"6. WARNING in X.java (at line 7)\n" + 
 				"	B c(A<Number> n) { return null; }\n" + 
 				"	  ^^^^^^^^^^^^^^\n" + 
-				"Method c(A<Number>) has the same erasure c(A<T>) as another method in type X\n" + 
+				"Erasure of method c(A<Number>) is the same as another method in type X\n" +
 				"----------\n":
 					"----------\n" + 
 					"1. ERROR in X.java (at line 2)\n" + 
 					"	<N extends B> N a(A<String> s) { return null; }\n" + 
 					"	                ^^^^^^^^^^^^^^\n" + 
-					"Method a(A<String>) has the same erasure a(A<T>) as another method in type X\n" + 
+					"Erasure of method a(A<String>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"2. ERROR in X.java (at line 3)\n" + 
 					"	<N> Object a(A<Number> n) { return null; }\n" + 
 					"	           ^^^^^^^^^^^^^^\n" + 
-					"Method a(A<Number>) has the same erasure a(A<T>) as another method in type X\n" + 
+					"Erasure of method a(A<Number>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"3. ERROR in X.java (at line 4)\n" + 
 					"	<N extends B> void b(A<String> s) {}\n" + 
 					"	                   ^^^^^^^^^^^^^^\n" + 
-					"Method b(A<String>) has the same erasure b(A<T>) as another method in type X\n" + 
+					"Erasure of method b(A<String>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"4. ERROR in X.java (at line 5)\n" + 
 					"	<N extends B> B b(A<Number> n) { return null; }\n" + 
 					"	                ^^^^^^^^^^^^^^\n" + 
-					"Method b(A<Number>) has the same erasure b(A<T>) as another method in type X\n" + 
+					"Erasure of method b(A<Number>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"5. ERROR in X.java (at line 6)\n" + 
 					"	void c(A<String> s) {}\n" + 
 					"	     ^^^^^^^^^^^^^^\n" + 
-					"Method c(A<String>) has the same erasure c(A<T>) as another method in type X\n" + 
+					"Erasure of method c(A<String>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"6. ERROR in X.java (at line 7)\n" + 
 					"	B c(A<Number> n) { return null; }\n" + 
 					"	  ^^^^^^^^^^^^^^\n" + 
-					"Method c(A<Number>) has the same erasure c(A<T>) as another method in type X\n" + 
+					"Erasure of method c(A<Number>) is the same as another method in type X\n" +
 					"----------\n";
 		this.runNegativeTest(
 			new String[] {
@@ -4272,12 +4276,12 @@
 			"1. ERROR in X.java (at line 2)\n" +
 			"	<N extends B> N a(A<String> s) { return null; }\n" +
 			"	                ^^^^^^^^^^^^^^\n" +
-			"Method a(A<String>) has the same erasure a(A<T>) as another method in type X\n" +
+			"Erasure of method a(A<String>) is the same as another method in type X\n" +
 			"----------\n" +
 			"2. ERROR in X.java (at line 3)\n" +
 			"	<N> B a(A<Number> n) { return null; }\n" +
 			"	      ^^^^^^^^^^^^^^\n" +
-			"Method a(A<Number>) has the same erasure a(A<T>) as another method in type X\n" +
+			"Erasure of method a(A<Number>) is the same as another method in type X\n" +
 			"----------\n"
 		);
 /* javac 7
@@ -4306,12 +4310,12 @@
 			"1. ERROR in X.java (at line 2)\n" +
 			"	<N extends B> N b(A<String> s) { return null; }\n" +
 			"	                ^^^^^^^^^^^^^^\n" +
-			"Method b(A<String>) has the same erasure b(A<T>) as another method in type X\n" +
+			"Erasure of method b(A<String>) is the same as another method in type X\n" +
 			"----------\n" +
 			"2. ERROR in X.java (at line 3)\n" +
 			"	<N extends B> B b(A<Number> n) { return null; }\n" +
 			"	                ^^^^^^^^^^^^^^\n" +
-			"Method b(A<Number>) has the same erasure b(A<T>) as another method in type X\n" +
+			"Erasure of method b(A<Number>) is the same as another method in type X\n" +
 			"----------\n"
 		);
 /* javac 7
@@ -4340,12 +4344,12 @@
 			"1. ERROR in X.java (at line 2)\n" +
 			"	B c(A<String> s) { return null; }\n" +
 			"	  ^^^^^^^^^^^^^^\n" +
-			"Method c(A<String>) has the same erasure c(A<T>) as another method in type X\n" +
+			"Erasure of method c(A<String>) is the same as another method in type X\n" +
 			"----------\n" +
 			"2. ERROR in X.java (at line 3)\n" +
 			"	B c(A<Number> n) { return null; }\n" +
 			"	  ^^^^^^^^^^^^^^\n" +
-			"Method c(A<Number>) has the same erasure c(A<T>) as another method in type X\n" +
+			"Erasure of method c(A<Number>) is the same as another method in type X\n" +
 			"----------\n"
 		);
 /* javac 7
@@ -4373,12 +4377,12 @@
 				"3. WARNING in X.java (at line 4)\n" + 
 				"	<N extends B> N b(A<Number> s) { return null; }\n" + 
 				"	                ^^^^^^^^^^^^^^\n" + 
-				"Method b(A<Number>) has the same erasure b(A<T>) as another method in type X\n" + 
+				"Erasure of method b(A<Number>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"4. WARNING in X.java (at line 5)\n" + 
 				"	<N> Object b(A<String> n) { return null; }\n" + 
 				"	           ^^^^^^^^^^^^^^\n" + 
-				"Method b(A<String>) has the same erasure b(A<T>) as another method in type X\n" + 
+				"Erasure of method b(A<String>) is the same as another method in type X\n" +
 				"----------\n":
 					"----------\n" + 
 					"1. ERROR in X.java (at line 2)\n" + 
@@ -4394,12 +4398,12 @@
 					"3. ERROR in X.java (at line 4)\n" + 
 					"	<N extends B> N b(A<Number> s) { return null; }\n" + 
 					"	                ^^^^^^^^^^^^^^\n" + 
-					"Method b(A<Number>) has the same erasure b(A<T>) as another method in type X\n" + 
+					"Erasure of method b(A<Number>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"4. ERROR in X.java (at line 5)\n" + 
 					"	<N> Object b(A<String> n) { return null; }\n" + 
 					"	           ^^^^^^^^^^^^^^\n" + 
-					"Method b(A<String>) has the same erasure b(A<T>) as another method in type X\n" + 
+					"Erasure of method b(A<String>) is the same as another method in type X\n" +
 					"----------\n";
 		this.runNegativeTest(
 			new String[] {
@@ -4459,12 +4463,12 @@
 			"3. ERROR in X.java (at line 4)\n" +
 			"	<N extends B> N b(A<Number> s) { return null; }\n" +
 			"	                ^^^^^^^^^^^^^^\n" +
-			"Method b(A<Number>) has the same erasure b(A<T>) as another method in type X\n" +
+			"Erasure of method b(A<Number>) is the same as another method in type X\n" +
 			"----------\n" +
 			"4. ERROR in X.java (at line 5)\n" +
 			"	<N> B b(A<String> n) { return null; }\n" +
 			"	      ^^^^^^^^^^^^^^\n" +
-			"Method b(A<String>) has the same erasure b(A<T>) as another method in type X\n" +
+			"Erasure of method b(A<String>) is the same as another method in type X\n" +
 			"----------\n"
 		);
 /* javac 7
@@ -4628,12 +4632,12 @@
 			"1. ERROR in X.java (at line 2)\n" +
 			"	void foo(A<String> a) {}\n" +
 			"	     ^^^^^^^^^^^^^^^^\n" +
-			"Method foo(A<String>) has the same erasure foo(A<T>) as another method in type X\n" +
+			"Erasure of method foo(A<String>) is the same as another method in type X\n" +
 			"----------\n" +
 			"2. ERROR in X.java (at line 3)\n" +
 			"	void foo(A<Integer> a) {}\n" +
 			"	     ^^^^^^^^^^^^^^^^^\n" +
-			"Method foo(A<Integer>) has the same erasure foo(A<T>) as another method in type X\n" +
+			"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
 			"----------\n"
 		);
 /* javac 7
@@ -4650,23 +4654,23 @@
 				"1. WARNING in X.java (at line 2)\n" + 
 				"	void foo(A<String> a) {}\n" + 
 				"	     ^^^^^^^^^^^^^^^^\n" + 
-				"Method foo(A<String>) has the same erasure foo(A<T>) as another method in type X\n" + 
+				"Erasure of method foo(A<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. WARNING in X.java (at line 3)\n" + 
 				"	Object foo(A<Integer> a) { return null; }\n" + 
 				"	       ^^^^^^^^^^^^^^^^^\n" + 
-				"Method foo(A<Integer>) has the same erasure foo(A<T>) as another method in type X\n" + 
+				"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
 				"----------\n":
 					"----------\n" + 
 					"1. ERROR in X.java (at line 2)\n" + 
 					"	void foo(A<String> a) {}\n" + 
 					"	     ^^^^^^^^^^^^^^^^\n" + 
-					"Method foo(A<String>) has the same erasure foo(A<T>) as another method in type X\n" + 
+					"Erasure of method foo(A<String>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"2. ERROR in X.java (at line 3)\n" + 
 					"	Object foo(A<Integer> a) { return null; }\n" + 
 					"	       ^^^^^^^^^^^^^^^^^\n" + 
-					"Method foo(A<Integer>) has the same erasure foo(A<T>) as another method in type X\n" + 
+					"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
 					"----------\n";
 		this.runNegativeTest(
 			new String[] {
@@ -4812,12 +4816,12 @@
 			"1. ERROR in X.java (at line 2)\n" +
 			"	void a(Object x) {}\n" +
 			"	     ^^^^^^^^^^^\n" +
-			"Method a(Object) has the same erasure a(Object) as another method in type X\n" +
+			"Erasure of method a(Object) is the same as another method in type X\n" +
 			"----------\n" +
 			"2. ERROR in X.java (at line 3)\n" +
 			"	<T> T a(T x) {  return null; }\n" +
 			"	      ^^^^^^\n" +
-			"Method a(T) has the same erasure a(Object) as another method in type X\n" +
+			"Erasure of method a(T) is the same as another method in type X\n" +
 			"----------\n"
 		);
 /* javac 7
@@ -4834,32 +4838,32 @@
 				"1. WARNING in X.java (at line 2)\n" + 
 				"	<T1, T2> String aaa(X x) {  return null; }\n" + 
 				"	                ^^^^^^^^\n" + 
-				"Method aaa(X) has the same erasure aaa(X) as another method in type X\n" + 
+				"Erasure of method aaa(X) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. WARNING in X.java (at line 3)\n" + 
 				"	<T extends X> T aaa(T x) {  return null; }\n" + 
 				"	                ^^^^^^^^\n" + 
-				"Method aaa(T) has the same erasure aaa(X) as another method in type X\n" + 
+				"Erasure of method aaa(T) is the same as another method in type X\n" +
 				"----------\n" + 
 				"3. WARNING in X.java (at line 4)\n" + 
 				"	<T> String aa(X x) {  return null; }\n" + 
 				"	           ^^^^^^^\n" + 
-				"Method aa(X) has the same erasure aa(X) as another method in type X\n" + 
+				"Erasure of method aa(X) is the same as another method in type X\n" +
 				"----------\n" + 
 				"4. WARNING in X.java (at line 5)\n" + 
 				"	<T extends X> T aa(T x) {  return null; }\n" + 
 				"	                ^^^^^^^\n" + 
-				"Method aa(T) has the same erasure aa(X) as another method in type X\n" + 
+				"Erasure of method aa(T) is the same as another method in type X\n" +
 				"----------\n" + 
 				"5. ERROR in X.java (at line 6)\n" + 
 				"	String a(X x) {  return null; }\n" + 
 				"	       ^^^^^^\n" + 
-				"Method a(X) has the same erasure a(X) as another method in type X\n" + 
+				"Erasure of method a(X) is the same as another method in type X\n" +
 				"----------\n" + 
 				"6. ERROR in X.java (at line 7)\n" + 
 				"	<T extends X> T a(T x) {  return null; }\n" + 
 				"	                ^^^^^^\n" + 
-				"Method a(T) has the same erasure a(X) as another method in type X\n" + 
+				"Erasure of method a(T) is the same as another method in type X\n" +
 				"----------\n" + 
 				"7. WARNING in X.java (at line 8)\n" + 
 				"	<T> String z(X x) { return null; }\n" + 
@@ -4875,32 +4879,32 @@
 					"1. ERROR in X.java (at line 2)\n" + 
 					"	<T1, T2> String aaa(X x) {  return null; }\n" + 
 					"	                ^^^^^^^^\n" + 
-					"Method aaa(X) has the same erasure aaa(X) as another method in type X\n" + 
+					"Erasure of method aaa(X) is the same as another method in type X\n" +
 					"----------\n" + 
 					"2. ERROR in X.java (at line 3)\n" + 
 					"	<T extends X> T aaa(T x) {  return null; }\n" + 
 					"	                ^^^^^^^^\n" + 
-					"Method aaa(T) has the same erasure aaa(X) as another method in type X\n" + 
+					"Erasure of method aaa(T) is the same as another method in type X\n" +
 					"----------\n" + 
 					"3. ERROR in X.java (at line 4)\n" + 
 					"	<T> String aa(X x) {  return null; }\n" + 
 					"	           ^^^^^^^\n" + 
-					"Method aa(X) has the same erasure aa(X) as another method in type X\n" + 
+					"Erasure of method aa(X) is the same as another method in type X\n" +
 					"----------\n" + 
 					"4. ERROR in X.java (at line 5)\n" + 
 					"	<T extends X> T aa(T x) {  return null; }\n" + 
 					"	                ^^^^^^^\n" + 
-					"Method aa(T) has the same erasure aa(X) as another method in type X\n" + 
+					"Erasure of method aa(T) is the same as another method in type X\n" +
 					"----------\n" + 
 					"5. ERROR in X.java (at line 6)\n" + 
 					"	String a(X x) {  return null; }\n" + 
 					"	       ^^^^^^\n" + 
-					"Method a(X) has the same erasure a(X) as another method in type X\n" + 
+					"Erasure of method a(X) is the same as another method in type X\n" +
 					"----------\n" + 
 					"6. ERROR in X.java (at line 7)\n" + 
 					"	<T extends X> T a(T x) {  return null; }\n" + 
 					"	                ^^^^^^\n" + 
-					"Method a(T) has the same erasure a(X) as another method in type X\n" + 
+					"Erasure of method a(T) is the same as another method in type X\n" +
 					"----------\n" + 
 					"7. ERROR in X.java (at line 8)\n" + 
 					"	<T> String z(X x) { return null; }\n" + 
@@ -5038,43 +5042,43 @@
 				"1. WARNING in X.java (at line 2)\n" + 
 				"	<T> T a(A<T> t) {return null;}\n" + 
 				"	      ^^^^^^^^^\n" + 
-				"Method a(A<T>) has the same erasure a(A<T>) as another method in type X\n" + 
+				"Erasure of method a(A<T>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. WARNING in X.java (at line 3)\n" + 
 				"	<T> String a(A<Object> o) {return null;}\n" + 
 				"	           ^^^^^^^^^^^^^^\n" + 
-				"Method a(A<Object>) has the same erasure a(A<T>) as another method in type X\n" + 
+				"Erasure of method a(A<Object>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"3. WARNING in X.java (at line 4)\n" + 
 				"	<T> T aa(A<T> t) {return null;}\n" + 
 				"	      ^^^^^^^^^^\n" + 
-				"Method aa(A<T>) has the same erasure aa(A<T>) as another method in type X\n" + 
+				"Erasure of method aa(A<T>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"4. WARNING in X.java (at line 5)\n" + 
 				"	String aa(A<Object> o) {return null;}\n" + 
 				"	       ^^^^^^^^^^^^^^^\n" + 
-				"Method aa(A<Object>) has the same erasure aa(A<T>) as another method in type X\n" + 
+				"Erasure of method aa(A<Object>) is the same as another method in type X\n" +
 				"----------\n":
 					"----------\n" + 
 					"1. ERROR in X.java (at line 2)\n" + 
 					"	<T> T a(A<T> t) {return null;}\n" + 
 					"	      ^^^^^^^^^\n" + 
-					"Method a(A<T>) has the same erasure a(A<T>) as another method in type X\n" + 
+					"Erasure of method a(A<T>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"2. ERROR in X.java (at line 3)\n" + 
 					"	<T> String a(A<Object> o) {return null;}\n" + 
 					"	           ^^^^^^^^^^^^^^\n" + 
-					"Method a(A<Object>) has the same erasure a(A<T>) as another method in type X\n" + 
+					"Erasure of method a(A<Object>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"3. ERROR in X.java (at line 4)\n" + 
 					"	<T> T aa(A<T> t) {return null;}\n" + 
 					"	      ^^^^^^^^^^\n" + 
-					"Method aa(A<T>) has the same erasure aa(A<T>) as another method in type X\n" + 
+					"Erasure of method aa(A<T>) is the same as another method in type X\n" +
 					"----------\n" + 
 					"4. ERROR in X.java (at line 5)\n" + 
 					"	String aa(A<Object> o) {return null;}\n" + 
 					"	       ^^^^^^^^^^^^^^^\n" + 
-					"Method aa(A<Object>) has the same erasure aa(A<T>) as another method in type X\n" + 
+					"Erasure of method aa(A<Object>) is the same as another method in type X\n" +
 					"----------\n";
 		this.runNegativeTest(
 			new String[] {
@@ -5226,43 +5230,43 @@
 				"3. WARNING in X.java (at line 6)\n" + 
 				"	<T> T foo(T t) {return null;}\n" + 
 				"	      ^^^^^^^^\n" + 
-				"Method foo(T) has the same erasure foo(Object) as another method in type X<A>\n" + 
+				"Erasure of method foo(T) is the same as another method in type X<A>\n" +
 				"----------\n" + 
 				"4. WARNING in X.java (at line 7)\n" + 
 				"	void foo(A a) {}\n" + 
 				"	     ^^^^^^^^\n" + 
-				"Method foo(A) has the same erasure foo(Object) as another method in type X<A>\n" + 
+				"Erasure of method foo(A) is the same as another method in type X<A>\n" +
 				"----------\n" + 
 				"5. WARNING in X.java (at line 8)\n" + 
 				"	<T> T foo2(T t) {return null;}\n" + 
 				"	      ^^^^^^^^^\n" + 
-				"Method foo2(T) has the same erasure foo2(Object) as another method in type X<A>\n" + 
+				"Erasure of method foo2(T) is the same as another method in type X<A>\n" +
 				"----------\n" + 
 				"6. WARNING in X.java (at line 9)\n" + 
 				"	<T> void foo2(A a) {}\n" + 
 				"	         ^^^^^^^^^\n" + 
-				"Method foo2(A) has the same erasure foo2(Object) as another method in type X<A>\n" + 
+				"Erasure of method foo2(A) is the same as another method in type X<A>\n" +
 				"----------\n":
 					"----------\n" + 
 					"1. ERROR in X.java (at line 6)\n" + 
 					"	<T> T foo(T t) {return null;}\n" + 
 					"	      ^^^^^^^^\n" + 
-					"Method foo(T) has the same erasure foo(Object) as another method in type X<A>\n" + 
+					"Erasure of method foo(T) is the same as another method in type X<A>\n" +
 					"----------\n" + 
 					"2. ERROR in X.java (at line 7)\n" + 
 					"	void foo(A a) {}\n" + 
 					"	     ^^^^^^^^\n" + 
-					"Method foo(A) has the same erasure foo(Object) as another method in type X<A>\n" + 
+					"Erasure of method foo(A) is the same as another method in type X<A>\n" +
 					"----------\n" + 
 					"3. ERROR in X.java (at line 8)\n" + 
 					"	<T> T foo2(T t) {return null;}\n" + 
 					"	      ^^^^^^^^^\n" + 
-					"Method foo2(T) has the same erasure foo2(Object) as another method in type X<A>\n" + 
+					"Erasure of method foo2(T) is the same as another method in type X<A>\n" +
 					"----------\n" + 
 					"4. ERROR in X.java (at line 9)\n" + 
 					"	<T> void foo2(A a) {}\n" + 
 					"	         ^^^^^^^^^\n" + 
-					"Method foo2(A) has the same erasure foo2(Object) as another method in type X<A>\n" + 
+					"Erasure of method foo2(A) is the same as another method in type X<A>\n" +
 					"----------\n";
 		this.runNegativeTest(
 			new String[] {
@@ -7126,7 +7130,7 @@
 			"5. ERROR in DataSet.java (at line 6)\n" +
 			"	public <S> S[] toArray(S[] s) {\n" +
 			"	               ^^^^^^^^^^^^^^\n" +
-			"Method toArray(S[]) has the same erasure toArray(Object[]) as another method in type DataSet<T>\n" +
+			"Erasure of method toArray(S[]) is the same as another method in type DataSet<T>\n" +
 			"----------\n" +
 			"6. ERROR in DataSet.java (at line 6)\n" +
 			"	public <S> S[] toArray(S[] s) {\n" +
@@ -7141,7 +7145,7 @@
 			"8. ERROR in DataSet.java (at line 9)\n" +
 			"	public Object[] toArray(Object[] o) {\n" +
 			"	                ^^^^^^^^^^^^^^^^^^^\n" +
-			"Method toArray(Object[]) has the same erasure toArray(Object[]) as another method in type DataSet<T>\n" +
+			"Erasure of method toArray(Object[]) is the same as another method in type DataSet<T>\n" +
 			"----------\n" +
 			"9. WARNING in DataSet.java (at line 14)\n" +
 			"	public boolean addAll(Collection c) {	return false; }\n" +
@@ -7360,12 +7364,12 @@
 			"1. WARNING in X.java (at line 3)\n" + 
 			"	Integer getX(List<Integer> l) {\n" + 
 			"	        ^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method getX(List<Integer>) has the same erasure getX(List<E>) as another method in type X\n" + 
+			"Erasure of method getX(List<Integer>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"2. WARNING in X.java (at line 6)\n" + 
 			"	String getX(List<String> l) {\n" + 
 			"	       ^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method getX(List<String>) has the same erasure getX(List<E>) as another method in type X\n" + 
+			"Erasure of method getX(List<String>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"3. ERROR in X.java (at line 11)\n" + 
 			"	Integer getX(List<Integer> l) {\n" + 
@@ -7381,12 +7385,12 @@
 				"1. ERROR in X.java (at line 3)\n" + 
 				"	Integer getX(List<Integer> l) {\n" + 
 				"	        ^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method getX(List<Integer>) has the same erasure getX(List<E>) as another method in type X\n" + 
+				"Erasure of method getX(List<Integer>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. ERROR in X.java (at line 6)\n" + 
 				"	String getX(List<String> l) {\n" + 
 				"	       ^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method getX(List<String>) has the same erasure getX(List<E>) as another method in type X\n" + 
+				"Erasure of method getX(List<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"3. ERROR in X.java (at line 11)\n" + 
 				"	Integer getX(List<Integer> l) {\n" + 
@@ -8477,23 +8481,23 @@
 			"1. WARNING in Bar.java (at line 2)\n" + 
 			"	int getThing(V v) { return 1; }\n" + 
 			"	    ^^^^^^^^^^^^^\n" + 
-			"Method getThing(V) has the same erasure getThing(Object) as another method in type Foo<V,E>\n" + 
+			"Erasure of method getThing(V) is the same as another method in type Foo<V,E>\n" +
 			"----------\n" + 
 			"2. WARNING in Bar.java (at line 3)\n" + 
 			"	boolean getThing(E e) { return true; }\n" + 
 			"	        ^^^^^^^^^^^^^\n" + 
-			"Method getThing(E) has the same erasure getThing(Object) as another method in type Foo<V,E>\n" + 
+			"Erasure of method getThing(E) is the same as another method in type Foo<V,E>\n" +
 			"----------\n":
 				"----------\n" + 
 				"1. ERROR in Bar.java (at line 2)\n" + 
 				"	int getThing(V v) { return 1; }\n" + 
 				"	    ^^^^^^^^^^^^^\n" + 
-				"Method getThing(V) has the same erasure getThing(Object) as another method in type Foo<V,E>\n" + 
+				"Erasure of method getThing(V) is the same as another method in type Foo<V,E>\n" +
 				"----------\n" + 
 				"2. ERROR in Bar.java (at line 3)\n" + 
 				"	boolean getThing(E e) { return true; }\n" + 
 				"	        ^^^^^^^^^^^^^\n" + 
-				"Method getThing(E) has the same erasure getThing(Object) as another method in type Foo<V,E>\n" + 
+				"Erasure of method getThing(E) is the same as another method in type Foo<V,E>\n" +
 				"----------\n";
 	this.runNegativeTest(
 		new String[] {
@@ -9084,7 +9088,7 @@
 		"1. ERROR in X.java (at line 1)\n" +
 		"	public abstract class X implements J, K {}\n" +
 		"	                      ^\n" +
-		"The return types are incompatible for the inherited methods K.foo(Number), J.foo(Number)\n" +
+		"The return types are incompatible for the inherited methods J.foo(Number), K.foo(Number)\n" +
 		"----------\n" +
 		"2. WARNING in X.java (at line 6)\n" +
 		"	XX foo(Number n);\n" +
@@ -9448,12 +9452,12 @@
 		"1. ERROR in X.java (at line 3)\n" +
 		"	public MyT<Void> method3(D1<String> harg, D1<String> oarg, D1<java.util.Date> date){\n" +
 		"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
-		"Method method3(X.D1<String>, X.D1<String>, X.D1<Date>) has the same erasure method3(X.D1<T>, X.D1<T>, X.D1<T>) as another method in type X\n" +
+		"Erasure of method method3(X.D1<String>, X.D1<String>, X.D1<Date>) is the same as another method in type X\n" +
 		"----------\n" +
 		"2. ERROR in X.java (at line 7)\n" +
 		"	public MyT<Void> method3(D1<String> harg, D1<String> oarg, D1<String> date){\n" +
 		"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
-		"Method method3(X.D1<String>, X.D1<String>, X.D1<String>) has the same erasure method3(X.D1<T>, X.D1<T>, X.D1<T>) as another method in type X\n" +
+		"Erasure of method method3(X.D1<String>, X.D1<String>, X.D1<String>) is the same as another method in type X\n" +
 		"----------\n" +
 		"3. WARNING in X.java (at line 11)\n" +
 		"	public MyT<Void> method3(D1<String> harg, D1<String> oarg, D1<java.util.Date> date, D1 ... notUsed){\n" +
@@ -9698,7 +9702,7 @@
 		"1. ERROR in X.java (at line 9)\n" +
 		"	public abstract class X implements I, J {\n" +
 		"	                      ^\n" +
-		"The return types are incompatible for the inherited methods J.foo(), I.foo()\n" +
+		"The return types are incompatible for the inherited methods I.foo(), J.foo()\n" +
 		"----------\n"
 	);
 }
@@ -9723,7 +9727,7 @@
 		"1. ERROR in X.java (at line 10)\n" +
 		"	public abstract class X implements I, J {\n" +
 		"	                      ^\n" +
-		"The return types are incompatible for the inherited methods J.foo(), I.foo()\n" +
+		"The return types are incompatible for the inherited methods I.foo(), J.foo()\n" +
 		"----------\n"
 	);
 }
@@ -9750,7 +9754,7 @@
 		"1. ERROR in X.java (at line 7)\n" +
 		"	interface C extends A, B {}\n" +
 		"	          ^\n" +
-		"The return types are incompatible for the inherited methods B.foo(), A.foo()\n" +
+		"The return types are incompatible for the inherited methods A.foo(), B.foo()\n" +
 		"----------\n"
 	);
 }
@@ -9782,7 +9786,7 @@
 		"1. ERROR in X.java (at line 17)\n" +
 		"	public abstract class X extends Root implements AFoo, BFoo {\n" +
 		"	                      ^\n" +
-		"The return types are incompatible for the inherited methods BFoo.bar(), AFoo.bar()\n" +
+		"The return types are incompatible for the inherited methods AFoo.bar(), BFoo.bar()\n" +
 		"----------\n"
 	);
 }
@@ -9813,17 +9817,17 @@
 		"1. ERROR in X.java (at line 15)\n" + 
 		"	public abstract class X extends Root implements AFoo, BFoo {}\n" + 
 		"	                      ^\n" + 
-		"The return types are incompatible for the inherited methods BFoo.bar(), AFoo.bar()\n" + 
+		"The return types are incompatible for the inherited methods AFoo.bar(), BFoo.bar()\n" + 
 		"----------\n" + 
 		"2. ERROR in X.java (at line 16)\n" + 
 		"	abstract class Y extends X {}\n" + 
 		"	               ^\n" + 
-		"The return types are incompatible for the inherited methods BFoo.bar(), AFoo.bar()\n" + 
+		"The return types are incompatible for the inherited methods AFoo.bar(), BFoo.bar()\n" + 
 		"----------\n" + 
 		"3. ERROR in X.java (at line 17)\n" + 
 		"	class Z extends X {}\n" + 
 		"	      ^\n" + 
-		"The type Z must implement the inherited abstract method AFoo.bar()\n" + 
+		"The type Z must implement the inherited abstract method BFoo.bar()\n" + 
 		"----------\n");
 }
 //https://bugs.eclipse.org/bugs/show_bug.cgi?id=208010
@@ -10793,7 +10797,7 @@
 		"1. ERROR in A.java (at line 3)\n" + 
 		"	class A implements I, J {}\n" + 
 		"	      ^\n" + 
-		"The type A must implement the inherited abstract method I.hello()\n" + 
+		"The type A must implement the inherited abstract method J.hello()\n" + 
 		"----------\n"
 	);
 }
@@ -10838,12 +10842,12 @@
 			"2. WARNING in X.java (at line 13)\n" + 
 			"	int f(List<String> l) {return 0;}\n" + 
 			"	    ^^^^^^^^^^^^^^^^^\n" + 
-			"Method f(List<String>) has the same erasure f(List<E>) as another method in type XX\n" + 
+			"Erasure of method f(List<String>) is the same as another method in type XX\n" +
 			"----------\n" + 
 			"3. WARNING in X.java (at line 14)\n" + 
 			"	double f(List<Integer> l) {return 0;}\n" + 
 			"	       ^^^^^^^^^^^^^^^^^^\n" + 
-			"Method f(List<Integer>) has the same erasure f(List<E>) as another method in type XX\n" + 
+			"Erasure of method f(List<Integer>) is the same as another method in type XX\n" +
 			"----------\n":
 				"----------\n" + 
 				"1. ERROR in X.java (at line 6)\n" + 
@@ -10854,12 +10858,12 @@
 				"2. ERROR in X.java (at line 13)\n" + 
 				"	int f(List<String> l) {return 0;}\n" + 
 				"	    ^^^^^^^^^^^^^^^^^\n" + 
-				"Method f(List<String>) has the same erasure f(List<E>) as another method in type XX\n" + 
+				"Erasure of method f(List<String>) is the same as another method in type XX\n" +
 				"----------\n" + 
 				"3. ERROR in X.java (at line 14)\n" + 
 				"	double f(List<Integer> l) {return 0;}\n" + 
 				"	       ^^^^^^^^^^^^^^^^^^\n" + 
-				"Method f(List<Integer>) has the same erasure f(List<E>) as another method in type XX\n" + 
+				"Erasure of method f(List<Integer>) is the same as another method in type XX\n" +
 				"----------\n";
 	this.runNegativeTest(
 		new String[] {
@@ -11307,7 +11311,7 @@
 				"1. ERROR in X.java (at line 3)\n" + 
 				"	int foo(Collection bar) { return 0; }\n" + 
 				"	    ^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method foo(Collection) has the same erasure foo(Collection<E>) as another method in type X\n" + 
+				"Erasure of method foo(Collection) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. WARNING in X.java (at line 3)\n" + 
 				"	int foo(Collection bar) { return 0; }\n" + 
@@ -11317,7 +11321,7 @@
 				"3. ERROR in X.java (at line 4)\n" + 
 				"	double foo(Collection<String> bar) {return 0; }\n" + 
 				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method foo(Collection<String>) has the same erasure foo(Collection<E>) as another method in type X\n" + 
+				"Erasure of method foo(Collection<String>) is the same as another method in type X\n" +
 				"----------\n";
 	this.runNegativeTest(
 		new String[] {
@@ -13113,12 +13117,12 @@
 			"1. WARNING in X.java (at line 4)\n" + 
 			"	public Integer same(List<Integer> a) { return null; }\n" + 
 			"	               ^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method same(List<Integer>) has the same erasure same(List<E>) as another method in type X\n" + 
+			"Erasure of method same(List<Integer>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"2. WARNING in X.java (at line 5)\n" + 
 			"	public String same(List<String> b) { return null; }\n" + 
 			"	              ^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method same(List<String>) has the same erasure same(List<E>) as another method in type X\n" + 
+			"Erasure of method same(List<String>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"3. ERROR in X.java (at line 6)\n" + 
 			"	Zork z;\n" + 
@@ -13129,12 +13133,12 @@
 				"1. ERROR in X.java (at line 4)\n" + 
 				"	public Integer same(List<Integer> a) { return null; }\n" + 
 				"	               ^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method same(List<Integer>) has the same erasure same(List<E>) as another method in type X\n" + 
+				"Erasure of method same(List<Integer>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. ERROR in X.java (at line 5)\n" + 
 				"	public String same(List<String> b) { return null; }\n" + 
 				"	              ^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method same(List<String>) has the same erasure same(List<E>) as another method in type X\n" + 
+				"Erasure of method same(List<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"3. ERROR in X.java (at line 6)\n" + 
 				"	Zork z;\n" + 
@@ -13161,12 +13165,12 @@
 			"1. WARNING in X.java (at line 3)\n" + 
 			"	public static String doIt(final List<String> arg) { return null; }\n" + 
 			"	                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method doIt(List<String>) has the same erasure doIt(List<E>) as another method in type X\n" + 
+			"Erasure of method doIt(List<String>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"2. WARNING in X.java (at line 4)\n" + 
 			"	public static CharSequence doIt(final List<CharSequence> arg) { return null; }\n" + 
 			"	                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method doIt(List<CharSequence>) has the same erasure doIt(List<E>) as another method in type X\n" + 
+			"Erasure of method doIt(List<CharSequence>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"3. ERROR in X.java (at line 5)\n" + 
 			"	Zork z;\n" + 
@@ -13177,12 +13181,12 @@
 				"1. ERROR in X.java (at line 3)\n" + 
 				"	public static String doIt(final List<String> arg) { return null; }\n" + 
 				"	                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method doIt(List<String>) has the same erasure doIt(List<E>) as another method in type X\n" + 
+				"Erasure of method doIt(List<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. ERROR in X.java (at line 4)\n" + 
 				"	public static CharSequence doIt(final List<CharSequence> arg) { return null; }\n" + 
 				"	                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method doIt(List<CharSequence>) has the same erasure doIt(List<E>) as another method in type X\n" + 
+				"Erasure of method doIt(List<CharSequence>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"3. ERROR in X.java (at line 5)\n" + 
 				"	Zork z;\n" + 
@@ -13213,12 +13217,12 @@
 			"2. WARNING in X.java (at line 3)\n" + 
 			"	protected static <T extends String> T same(Collection<? extends T> p_col) { return null; }\n" + 
 			"	                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method same(Collection<? extends T>) has the same erasure same(Collection<E>) as another method in type X\n" + 
+			"Erasure of method same(Collection<? extends T>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"3. WARNING in X.java (at line 4)\n" + 
 			"	protected static <T extends Number> T same(Collection<? extends T> p_col) { return null; }\n" + 
 			"	                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method same(Collection<? extends T>) has the same erasure same(Collection<E>) as another method in type X\n" + 
+			"Erasure of method same(Collection<? extends T>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"4. ERROR in X.java (at line 5)\n" + 
 			"	Zork z;\n" + 
@@ -13234,13 +13238,13 @@
 				"2. ERROR in X.java (at line 3)\n" + 
 				"	protected static <T extends String> T same(Collection<? extends T> p_col) { return null; }\n" + 
 				"	                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method same(Collection<? extends T>) has the same erasure same(Collection<E>) as another method in type X\n" + 
+				"Erasure of method same(Collection<? extends T>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"3. ERROR in X.java (at line 4)\n" + 
 				"	protected static <T extends Number> T same(Collection<? extends T> p_col) { return null; }\n" + 
 				"	                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method same(Collection<? extends T>) has the same erasure same(Collection<E>) as another method in type X\n" + 
-				"----------\n" + 
+				"Erasure of method same(Collection<? extends T>) is the same as another method in type X\n" +
+				"----------\n" +
 				"4. ERROR in X.java (at line 5)\n" + 
 				"	Zork z;\n" + 
 				"	^^^^\n" + 
@@ -13265,12 +13269,12 @@
 			"1. WARNING in X.java (at line 3)\n" + 
 			"	public static boolean foo(List<String> x) { return true; }\n" + 
 			"	                      ^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method foo(List<String>) has the same erasure foo(List<E>) as another method in type X\n" + 
+			"Erasure of method foo(List<String>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"2. WARNING in X.java (at line 4)\n" + 
 			"	public static int foo(List<Integer> x) { return 2; }\n" + 
 			"	                  ^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method foo(List<Integer>) has the same erasure foo(List<E>) as another method in type X\n" + 
+			"Erasure of method foo(List<Integer>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"3. ERROR in X.java (at line 5)\n" + 
 			"	Zork z;\n" + 
@@ -13281,12 +13285,12 @@
 				"1. ERROR in X.java (at line 3)\n" + 
 				"	public static boolean foo(List<String> x) { return true; }\n" + 
 				"	                      ^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method foo(List<String>) has the same erasure foo(List<E>) as another method in type X\n" + 
+				"Erasure of method foo(List<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. ERROR in X.java (at line 4)\n" + 
 				"	public static int foo(List<Integer> x) { return 2; }\n" + 
 				"	                  ^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method foo(List<Integer>) has the same erasure foo(List<E>) as another method in type X\n" + 
+				"Erasure of method foo(List<Integer>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"3. ERROR in X.java (at line 5)\n" + 
 				"	Zork z;\n" + 
@@ -13312,12 +13316,12 @@
 			"1. WARNING in X.java (at line 3)\n" + 
 			"	public String getFirst (ArrayList<String> ss) { return ss.get(0); }\n" + 
 			"	              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method getFirst(ArrayList<String>) has the same erasure getFirst(ArrayList<E>) as another method in type X\n" + 
+			"Erasure of method getFirst(ArrayList<String>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"2. WARNING in X.java (at line 4)\n" + 
 			"	public Integer getFirst (ArrayList<Integer> ss) { return ss.get(0); }\n" + 
 			"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method getFirst(ArrayList<Integer>) has the same erasure getFirst(ArrayList<E>) as another method in type X\n" + 
+			"Erasure of method getFirst(ArrayList<Integer>) is the same as another method in type X\n" +
 			"----------\n" + 
 			"3. ERROR in X.java (at line 5)\n" + 
 			"	Zork z;\n" + 
@@ -13328,12 +13332,12 @@
 				"1. ERROR in X.java (at line 3)\n" + 
 				"	public String getFirst (ArrayList<String> ss) { return ss.get(0); }\n" + 
 				"	              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method getFirst(ArrayList<String>) has the same erasure getFirst(ArrayList<E>) as another method in type X\n" + 
+				"Erasure of method getFirst(ArrayList<String>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"2. ERROR in X.java (at line 4)\n" + 
 				"	public Integer getFirst (ArrayList<Integer> ss) { return ss.get(0); }\n" + 
 				"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method getFirst(ArrayList<Integer>) has the same erasure getFirst(ArrayList<E>) as another method in type X\n" + 
+				"Erasure of method getFirst(ArrayList<Integer>) is the same as another method in type X\n" +
 				"----------\n" + 
 				"3. ERROR in X.java (at line 5)\n" + 
 				"	Zork z;\n" + 
@@ -13359,7 +13363,7 @@
 			"1. WARNING in X.java (at line 3)\n" + 
 			"	public static <R extends Object> X<R> forAccountSet(List list) { return null; }\n" + 
 			"	                                      ^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method forAccountSet(List) has the same erasure forAccountSet(List<E>) as another method in type X<Z>\n" + 
+			"Erasure of method forAccountSet(List) is the same as another method in type X<Z>\n" +
 			"----------\n" + 
 			"2. WARNING in X.java (at line 3)\n" + 
 			"	public static <R extends Object> X<R> forAccountSet(List list) { return null; }\n" + 
@@ -13369,23 +13373,18 @@
 			"3. WARNING in X.java (at line 4)\n" + 
 			"	public static <R extends Object> ChildX<R> forAccountSet(List<R> list) { return null; }\n" + 
 			"	                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method forAccountSet(List<R>) has the same erasure forAccountSet(List<E>) as another method in type X<Z>\n" + 
+			"Erasure of method forAccountSet(List<R>) is the same as another method in type X<Z>\n" +
 			"----------\n" + 
 			"4. ERROR in X.java (at line 5)\n" + 
 			"	Zork z;\n" + 
 			"	^^^^\n" + 
 			"Zork cannot be resolved to a type\n" + 
-			"----------\n" + 
-			"5. ERROR in X.java (at line 7)\n" + 
-			"	class ChildX<Z> extends X<Z>{}\n" + 
-			"	      ^^^^^^\n" + 
-			"Duplicate methods named forAccountSet with the parameters (List<R>) and (List) are defined by the type X<Z>\n" + 
 			"----------\n":
 				"----------\n" + 
 				"1. ERROR in X.java (at line 3)\n" + 
 				"	public static <R extends Object> X<R> forAccountSet(List list) { return null; }\n" + 
 				"	                                      ^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method forAccountSet(List) has the same erasure forAccountSet(List<E>) as another method in type X<Z>\n" + 
+				"Erasure of method forAccountSet(List) is the same as another method in type X<Z>\n" +
 				"----------\n" + 
 				"2. WARNING in X.java (at line 3)\n" + 
 				"	public static <R extends Object> X<R> forAccountSet(List list) { return null; }\n" + 
@@ -13395,7 +13394,7 @@
 				"3. ERROR in X.java (at line 4)\n" + 
 				"	public static <R extends Object> ChildX<R> forAccountSet(List<R> list) { return null; }\n" + 
 				"	                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method forAccountSet(List<R>) has the same erasure forAccountSet(List<E>) as another method in type X<Z>\n" + 
+				"Erasure of method forAccountSet(List<R>) is the same as another method in type X<Z>\n" +
 				"----------\n" + 
 				"4. ERROR in X.java (at line 5)\n" + 
 				"	Zork z;\n" + 
@@ -13422,22 +13421,22 @@
 			"1. WARNING in X.java (at line 3)\n" + 
 			"	public static int[] doIt(Collection<int[]> col) { return new int[1]; }\n" + 
 			"	                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method doIt(Collection<int[]>) has the same erasure doIt(Collection<E>) as another method in type X<Z>\n" + 
+			"Erasure of method doIt(Collection<int[]>) is the same as another method in type X<Z>\n" +
 			"----------\n" + 
 			"2. WARNING in X.java (at line 4)\n" + 
 			"	public static int[][] doIt(Collection<int[][]> col) { return new int[0][0]; }\n" + 
 			"	                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method doIt(Collection<int[][]>) has the same erasure doIt(Collection<E>) as another method in type X<Z>\n" + 
+			"Erasure of method doIt(Collection<int[][]>) is the same as another method in type X<Z>\n" +
 			"----------\n" + 
 			"3. WARNING in X.java (at line 5)\n" + 
 			"	public int[] doIt2(Collection<int[]> col) { return new int[0]; }\n" + 
 			"	             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method doIt2(Collection<int[]>) has the same erasure doIt2(Collection<E>) as another method in type X<Z>\n" + 
+			"Erasure of method doIt2(Collection<int[]>) is the same as another method in type X<Z>\n" +
 			"----------\n" + 
 			"4. WARNING in X.java (at line 6)\n" + 
 			"	public int[][] doIt2(Collection<int[][]> col) { return new int[0][0]; }\n" + 
 			"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method doIt2(Collection<int[][]>) has the same erasure doIt2(Collection<E>) as another method in type X<Z>\n" + 
+			"Erasure of method doIt2(Collection<int[][]>) is the same as another method in type X<Z>\n" +
 			"----------\n" + 
 			"5. ERROR in X.java (at line 7)\n" + 
 			"	Zork z;\n" + 
@@ -13448,22 +13447,22 @@
 				"1. ERROR in X.java (at line 3)\n" + 
 				"	public static int[] doIt(Collection<int[]> col) { return new int[1]; }\n" + 
 				"	                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method doIt(Collection<int[]>) has the same erasure doIt(Collection<E>) as another method in type X<Z>\n" + 
+				"Erasure of method doIt(Collection<int[]>) is the same as another method in type X<Z>\n" +
 				"----------\n" + 
 				"2. ERROR in X.java (at line 4)\n" + 
 				"	public static int[][] doIt(Collection<int[][]> col) { return new int[0][0]; }\n" + 
 				"	                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method doIt(Collection<int[][]>) has the same erasure doIt(Collection<E>) as another method in type X<Z>\n" + 
+				"Erasure of method doIt(Collection<int[][]>) is the same as another method in type X<Z>\n" +
 				"----------\n" + 
 				"3. ERROR in X.java (at line 5)\n" + 
 				"	public int[] doIt2(Collection<int[]> col) { return new int[0]; }\n" + 
 				"	             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method doIt2(Collection<int[]>) has the same erasure doIt2(Collection<E>) as another method in type X<Z>\n" + 
+				"Erasure of method doIt2(Collection<int[]>) is the same as another method in type X<Z>\n" +
 				"----------\n" + 
 				"4. ERROR in X.java (at line 6)\n" + 
 				"	public int[][] doIt2(Collection<int[][]> col) { return new int[0][0]; }\n" + 
 				"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-				"Method doIt2(Collection<int[][]>) has the same erasure doIt2(Collection<E>) as another method in type X<Z>\n" + 
+				"Erasure of method doIt2(Collection<int[][]>) is the same as another method in type X<Z>\n" +
 				"----------\n" + 
 				"5. ERROR in X.java (at line 7)\n" + 
 				"	Zork z;\n" + 
@@ -13570,12 +13569,12 @@
 			"1. ERROR in ErasureBug.java (at line 4)\n" + 
 			"	public String output(List<String> integers) {\n" + 
 			"	              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method output(List<String>) has the same erasure output(List<E>) as another method in type ErasureBug\n" + 
+			"Erasure of method output(List<String>) is the same as another method in type ErasureBug\n" +
 			"----------\n" + 
 			"2. ERROR in ErasureBug.java (at line 7)\n" + 
 			"	public String output(List doubles) {\n" + 
 			"	              ^^^^^^^^^^^^^^^^^^^^\n" + 
-			"Method output(List) has the same erasure output(List<E>) as another method in type ErasureBug\n" + 
+			"Erasure of method output(List) is the same as another method in type ErasureBug\n" +
 			"----------\n" + 
 			"3. WARNING in ErasureBug.java (at line 7)\n" + 
 			"	public String output(List doubles) {\n" + 
@@ -13714,7 +13713,7 @@
 					"1. ERROR in X.java (at line 8)\n" + 
 					"	interface C  extends A, B { \n" + 
 					"	          ^\n" + 
-					"Name clash: The method get(List<String>) of type A has the same erasure as get(List<Integer>) of type B but does not override it\n" + 
+					"Name clash: The method get(List<Integer>) of type B has the same erasure as get(List<String>) of type A but does not override it\n" + 
 					"----------\n" + 
 					"2. ERROR in X.java (at line 10)\n" + 
 					"	Zork z;\n" + 
@@ -13780,7 +13779,7 @@
 					"1. ERROR in X.java (at line 7)\n" + 
 					"	interface E extends X, Y {\n" + 
 					"	          ^\n" + 
-					"Name clash: The method e(Action<T>) of type X has the same erasure as e(Action<S>) of type Y but does not override it\n" + 
+					"Name clash: The method e(Action<S>) of type Y has the same erasure as e(Action<T>) of type X but does not override it\n" + 
 					"----------\n" + 
 					"2. ERROR in X.java (at line 10)\n" + 
 					"	Zork z;\n" + 
@@ -13804,12 +13803,40 @@
 		"1. ERROR in X.java (at line 2)\n" + 
 		"	<T> T e(Action<T> p);\n" + 
 		"	      ^^^^^^^^^^^^^^\n" + 
-		"Method e(Action<T>) has the same erasure e(Action<T>) as another method in type X\n" + 
+		"Erasure of method e(Action<T>) is the same as another method in type X\n" +
 		"----------\n" + 
 		"2. ERROR in X.java (at line 3)\n" + 
 		"	<S, T> S e(Action<S> t);\n" + 
 		"	         ^^^^^^^^^^^^^^\n" + 
-		"Method e(Action<S>) has the same erasure e(Action<T>) as another method in type X\n" + 
+		"Erasure of method e(Action<S>) is the same as another method in type X\n" +
 		"----------\n");
 }
+// https://bugs.eclipse.org/406928 - computation of inherited methods seems damaged (affecting @Overrides)
+public void testBug406928() {
+	if (this.complianceLevel < ClassFileConstants.JDK1_6) return;
+	this.runConformTest(
+		new String[] {
+			"TestPointcut.java",
+			"interface MethodMatcher {\n"+
+			"	boolean matches();\n"+
+			"}\n"+
+			"abstract class StaticMethodMatcher implements MethodMatcher { }\n"+
+			"abstract class StaticMethodMatcherPointcut extends StaticMethodMatcher { }\n"+
+			"\n"+
+			"class TestPointcut extends StaticMethodMatcherPointcut {\n"+
+			"	@Override\n"+
+			"	public boolean matches() { return false; } \n"+
+			"}\n"
+		},
+		"");
+}
+// https://bugs.eclipse.org/409473 - [compiler] JDT cannot compile against JRE 1.8
+// Test failed when running on a JRE 1.8 b90
+public void testBug409473() {
+    this.runConformTest(
+        new String[] {
+            "Foo.java",
+            "public abstract class Foo<E> implements java.util.List<E> { } "
+        });
+}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTest.java
index 77908b2..d0f020c 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTest.java
@@ -16,8 +16,6 @@
 
 import junit.framework.Test;
 
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Platform;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 
@@ -53,7 +51,7 @@
 // Static initializer to specify tests subset using TESTS_* static variables
 // All specified tests which do not belong to the class are skipped...
 static {
-//		TESTS_NAMES = new String[] { "test_conditional_expression" };
+//		TESTS_NAMES = new String[] { "testBug412076" };
 //		TESTS_NUMBERS = new int[] { 561 };
 //		TESTS_RANGE = new int[] { 1, 2049 };
 }
@@ -69,15 +67,7 @@
 protected void setUp() throws Exception {
 	super.setUp();
 	if (this.LIBS == null) {
-		String[] defaultLibs = getDefaultClassPaths();
-		int len = defaultLibs.length;
-		this.LIBS = new String[len+1];
-		System.arraycopy(defaultLibs, 0, this.LIBS, 0, len);
-		File bundleFile = FileLocator.getBundleFile(Platform.getBundle("org.eclipse.jdt.annotation"));
-		if (bundleFile.isDirectory())
-			this.LIBS[len] = bundleFile.getPath()+"/bin";
-		else
-			this.LIBS[len] = bundleFile.getPath();
+		this.LIBS = getLibsWithNullAnnotations();
 	}
 }
 // Conditionally augment problem detection settings
@@ -3879,7 +3869,7 @@
 		new String[] {
 			"X.java",
 			"import org.eclipse.jdt.annotation.*;\n" +
-			"public class X {\n" +
+			"public class X<T> {\n" +
 			"    @NonNull Object f;\n" +
 			"    {\n" +
 			"         this.f = new Object();\n" +
@@ -4757,7 +4747,15 @@
 			"         if (o1 != null || o2 != null || o3 != null) \n" +
 			"             System.out.println(o2.toString()); // warn here: disjunktion is no protection\n" +
 			"         if (!(o1 != null)) \n" +
-			"             System.out.println(o1.toString()); // warn here: negation is no protection\n" +
+			"             System.out.println(o1.toString()); // warn here: negated inequality is no protection\n" +
+			"         if (!(o1 == null || o2 == null)) \n" +
+			"             System.out.println(o1.toString()); // don't warn here\n" +
+			"         if (!(o1 == null && o2 == null)) \n" +
+			"             System.out.println(o2.toString()); // warn here: negated conjunction is no protection\n" +
+			"         if (!(!(o1 == null))) \n" +
+			"             System.out.println(o1.toString()); // warn here: double negation is no protection\n" +
+			"         if (!(!(o1 != null && o2 != null))) \n" +
+			"             System.out.println(o1.toString()); // don't warn here\n" +
 			"    }\n" +
 			"}\n"
 		},
@@ -4769,7 +4767,17 @@
 		"Potential null pointer access: The field o2 is declared as @Nullable\n" +
 		"----------\n" +
 		"2. ERROR in X.java (at line 10)\n" +
-		"	System.out.println(o1.toString()); // warn here: negation is no protection\n" +
+		"	System.out.println(o1.toString()); // warn here: negated inequality is no protection\n" +
+		"	                   ^^\n" +
+		"Potential null pointer access: The field o1 is declared as @Nullable\n" +
+		"----------\n" +
+		"3. ERROR in X.java (at line 14)\n" +
+		"	System.out.println(o2.toString()); // warn here: negated conjunction is no protection\n" +
+		"	                   ^^\n" +
+		"Potential null pointer access: The field o2 is declared as @Nullable\n" +
+		"----------\n" +
+		"4. ERROR in X.java (at line 16)\n" +
+		"	System.out.println(o1.toString()); // warn here: double negation is no protection\n" +
 		"	                   ^^\n" +
 		"Potential null pointer access: The field o1 is declared as @Nullable\n" +
 		"----------\n");
@@ -6127,4 +6135,98 @@
 		"Potential null pointer access: This expression of type Boolean may be null but requires auto-unboxing\n" + 
 		"----------\n");
 }
+
+// Bug 403086 - [compiler][null] include the effect of 'assert' in syntactic null analysis for fields
+public void testBug403086_1() {
+	Map customOptions = getCompilerOptions();
+	customOptions.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.ERROR);
+	customOptions.put(JavaCore.COMPILER_PB_INCLUDE_ASSERTS_IN_NULL_ANALYSIS, JavaCore.ENABLED);
+	customOptions.put(JavaCore.COMPILER_PB_SYNTACTIC_NULL_ANALYSIS_FOR_FIELDS, JavaCore.ENABLED);
+	runConformTestWithLibs(
+		new String[] {
+			NullReferenceTestAsserts.JUNIT_ASSERT_NAME,
+			NullReferenceTestAsserts.JUNIT_ASSERT_CONTENT,		
+			"Y.java",
+			"import org.eclipse.jdt.annotation.*;\n" +
+			"class Y {\n" +
+			"	@Nullable String str;\n" +
+			"	int foo(@Nullable String str2) {\n" +
+			"		int i;\n" +
+			"		junit.framework.Assert.assertNotNull(str);\n" +
+			"		i = str.length();\n" +
+			"\n" +
+			"		assert this.str != null;\n" +
+			"		i = str.length();\n" +
+			"\n" +
+			"		return i;\n" +
+			"	}\n" +
+			"}\n"
+		},
+		customOptions,
+		"");
+}
+
+//Bug 403086 - [compiler][null] include the effect of 'assert' in syntactic null analysis for fields
+public void testBug403086_2() {
+	Map customOptions = getCompilerOptions();
+	customOptions.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.ERROR);
+	customOptions.put(JavaCore.COMPILER_PB_INCLUDE_ASSERTS_IN_NULL_ANALYSIS, JavaCore.ENABLED);
+	customOptions.put(JavaCore.COMPILER_PB_SYNTACTIC_NULL_ANALYSIS_FOR_FIELDS, JavaCore.ENABLED);
+	runConformTestWithLibs(
+		new String[] {
+			NullReferenceTestAsserts.JUNIT_ASSERT_NAME,
+			NullReferenceTestAsserts.JUNIT_ASSERT_CONTENT,		
+			"Y.java",
+			"import org.eclipse.jdt.annotation.*;\n" +
+			"class Y {\n" +
+			"	@Nullable String str;\n" +
+			"	int foo(@Nullable String str2) {\n" +
+			"		int i;\n" +
+			"		junit.framework.Assert.assertNotNull(str);\n" +
+			"		i = str.length();\n" +
+			"\n" +
+			"		assert ! (this.str == null);\n" +
+			"		i = str.length();\n" +
+			"\n" +
+			"		return i;\n" +
+			"	}\n" +
+			"}\n"
+		},
+		customOptions,
+		"");
+}
+
+// https://bugs.eclipse.org/412076 - [compiler] @NonNullByDefault doesn't work for varargs parameter when in generic interface
+public void testBug412076() {
+	Map options = getCompilerOptions();
+	options.put(JavaCore.COMPILER_PB_MISSING_OVERRIDE_ANNOTATION, JavaCore.IGNORE);
+	runConformTestWithLibs(
+		new String[] {
+			"Foo.java",
+			"import org.eclipse.jdt.annotation.*;\n" +
+			"@NonNullByDefault\n" + 
+			"public interface Foo<V> {\n" + 
+			"  V bar(String... values);\n" + 
+			"  V foo(String value);\n" + 
+			"}\n"
+		},
+		options,
+		"");
+	runConformTestWithLibs(
+		new String[] {
+			"FooImpl.java",
+			"import org.eclipse.jdt.annotation.*;\n" +
+			"@NonNullByDefault\n" + 
+			"public class FooImpl implements Foo<String> {\n" + 
+			"  public String bar(final String... values) {\n" + 
+			"    return (\"\");\n" + 
+			"  }\n" + 
+			"  public String foo(final String value) {\n" + 
+			"    return (\"\");\n" + 
+			"  }\n" + 
+			"}\n"
+		},
+		options,
+		"");	
+}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullReferenceTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullReferenceTest.java
index 5346099..c4f5b2e 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullReferenceTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullReferenceTest.java
@@ -30,6 +30,10 @@
  *							bug 401088 - [compiler][null] Wrong warning "Redundant null check" inside nested try statement
  *							bug 401092 - [compiler][null] Wrong warning "Redundant null check" in outer catch of nested try
  *							bug 400761 - [compiler][null] null may be return as boolean without a diagnostic
+ *							bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
+ *							bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
+ *							bug 384380 - False positive on a « Potential null pointer access » after a continue
+ *							bug 406384 - Internal error with I20130413
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -58,9 +62,9 @@
 // Only the highest compliance level is run; add the VM argument
 // -Dcompliance=1.4 (for example) to lower it if needed
 static {
-//		TESTS_NAMES = new String[] { "test0037_conditional_expression" };
-//		TESTS_NAMES = new String[] { "test0515_try_finally" };
-//		TESTS_NAMES = new String[] { "testBug319201c" };
+//		TESTS_NAMES = new String[] { "test0037_autounboxing_3" };
+//		TESTS_NAMES = new String[] { "testBug401088" };
+//		TESTS_NAMES = new String[] { "testBug402993" };
 //		TESTS_NUMBERS = new int[] { 561 };
 //		TESTS_RANGE = new int[] { 1, 2049 };
 }
@@ -1024,6 +1028,265 @@
 		"----------\n",
 	    JavacTestOptions.Excuse.EclipseWarningConfiguredAsError);
 }
+// https://bugs.eclipse.org/403147 [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
+// finally block injects pot-nn into itself via enclosing loop
+public void test0037_autounboxing_1() {
+	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
+	Map options = getCompilerOptions();
+	options.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.ERROR);
+	runNegativeTest(
+		true,
+		new String[] {
+			"X.java",
+			"public class X {\n" +
+			"	void foo1(boolean b) {\n" +
+			"       int j = 0;\n" + 
+			"       Integer i = null;\n" + 
+			"       while (true) {\n" + 
+			"           try {\n" + 
+			"               j = 1;\n" + 
+			"           } finally {\n" + 
+			"               j = (b?i:1)+1;\n" + 
+			"               i = 2;\n" + 
+			"           }\n" + 
+			"       }\n" + 
+			"   }\n" +
+			"	void foo2(boolean b) {\n" +
+			"       int j = 0;\n" + 
+			"       Integer i = null;\n" + 
+			"       try {\n" + 
+			"           j = 1;\n" + 
+			"       } finally {\n" + 
+			"           j = (b?i:1)+1;\n" + 
+			"           i = 2;\n" + 
+			"       }\n" + 
+			"   }\n" +
+			"}\n"},
+		null,
+		options,
+		"----------\n" + 
+		"1. ERROR in X.java (at line 9)\n" + 
+		"	j = (b?i:1)+1;\n" + 
+		"	       ^\n" + 
+		"Potential null pointer access: This expression of type Integer may be null but requires auto-unboxing\n" + 
+		"----------\n" + 
+		"2. ERROR in X.java (at line 20)\n" + 
+		"	j = (b?i:1)+1;\n" + 
+		"	       ^\n" + 
+		"Null pointer access: This expression of type Integer is null but requires auto-unboxing\n" + 
+		"----------\n",
+	    JavacTestOptions.Excuse.EclipseWarningConfiguredAsError);
+}
+// https://bugs.eclipse.org/403147 [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
+// inject pot.nn from try into finally 
+public void test0037_autounboxing_2() {
+	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
+	Map options = getCompilerOptions();
+	options.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.ERROR);
+	runNegativeTest(
+		true,
+		new String[] {
+			"X.java",
+			"public class X {\n" +
+			"	void foo2(boolean b) {\n" + 
+			"       int j = 0;\n" + 
+			"       Integer i = null;\n" + 
+			"       while (true) {\n" + 
+			"           try {\n" + 
+			"               if (b)\n" + 
+			"                   i = 3;\n" + 
+			"           } finally {\n" + 
+			"               j = (b?i:1)+1;\n" + 
+			"           }\n" + 
+			"       }\n" + 
+			"   }\n" +
+			"	void foo3(boolean b) {\n" + 
+			"       int j = 0;\n" + 
+			"       Integer i = null;\n" + 
+			"       try {\n" + 
+			"           if (b)\n" + 
+			"               i = 3;\n" + 
+			"       } finally {\n" + 
+			"           j = (b?i:1)+1;\n" + 
+			"       }\n" + 
+			"   }\n" +
+			"}\n"},
+		null,
+		options,
+		"----------\n" + 
+		"1. ERROR in X.java (at line 10)\n" + 
+		"	j = (b?i:1)+1;\n" + 
+		"	       ^\n" + 
+		"Potential null pointer access: This expression of type Integer may be null but requires auto-unboxing\n" + 
+		"----------\n" + 
+		"2. ERROR in X.java (at line 21)\n" + 
+		"	j = (b?i:1)+1;\n" + 
+		"	       ^\n" + 
+		"Potential null pointer access: This expression of type Integer may be null but requires auto-unboxing\n" + 
+		"----------\n",
+	    JavacTestOptions.Excuse.EclipseWarningConfiguredAsError);
+}
+// https://bugs.eclipse.org/403147 [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
+// null from try, nn from catch, merge both into finally
+public void test0037_autounboxing_3() {
+	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
+	Map options = getCompilerOptions();
+	options.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.ERROR);
+	runNegativeTest(
+		true,
+		new String[] {
+			"X.java",
+			"public class X {\n" +
+			"	void foo3(Integer i, boolean b) {\n" + 
+			"       int j = 0;\n" + 
+			"       while (true) {\n" + 
+			"           try {\n" + 
+			"               i = null;\n" + 
+			"               unsafe();\n" + 
+			"           } catch (Exception e) {\n" + 
+			"               i = 3;\n" + 
+			"           } finally {\n" + 
+			"               j = (b?i:1)+1;\n" + 
+			"           }\n" + 
+			"       }\n" + 
+			"   }\n" + 
+			"	void foo4(Integer i, boolean b) {\n" + 
+			"       int j = 0;\n" + 
+			"       try {\n" + 
+			"           i = null;\n" + 
+			"           unsafe();\n" + 
+			"       } catch (Exception e) {\n" + 
+			"           i = 3;\n" + 
+			"       } finally {\n" + 
+			"           while (j < 0)\n" + 
+			"               j = (b?i:1)+1;\n" + 
+			"       }\n" + 
+			"   }\n" + 
+			"\n" + 
+			"   private void unsafe() throws Exception {\n" + 
+			"        throw new Exception();\n" + 
+			"   }\n" +
+			"}\n"},
+		null,
+		options,
+		"----------\n" + 
+		"1. ERROR in X.java (at line 11)\n" + 
+		"	j = (b?i:1)+1;\n" + 
+		"	       ^\n" + 
+		"Potential null pointer access: This expression of type Integer may be null but requires auto-unboxing\n" + 
+		"----------\n" + 
+		"2. ERROR in X.java (at line 24)\n" + 
+		"	j = (b?i:1)+1;\n" + 
+		"	       ^\n" + 
+		"Potential null pointer access: This expression of type Integer may be null but requires auto-unboxing\n" + 
+		"----------\n",
+	    JavacTestOptions.Excuse.EclipseWarningConfiguredAsError);
+}
+// https://bugs.eclipse.org/403147 [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
+// effective protection locally within the finally block
+public void test0037_autounboxing_4() {
+	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
+	Map options = getCompilerOptions();
+	options.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.ERROR);
+	runConformTest(
+		new String[] {
+			"X.java",
+			"public class X {\n" +
+			"	void foo3(Integer i, boolean b) {\n" + 
+			"       int j = 0;\n" + 
+			"       while (true) {\n" + 
+			"           try {\n" + 
+			"               i = null;\n" + 
+			"               unsafe();\n" + 
+			"           } catch (Exception e) {\n" + 
+			"               i = 3;\n" + 
+			"           } finally {\n" +
+			"				if (i == null) i = 4;\n" + 
+			"               j = (b?i:1)+1;\n" + 
+			"           }\n" + 
+			"       }\n" + 
+			"   }\n" + 
+			"	void foo4(Integer i, boolean b) {\n" + 
+			"       int j = 0;\n" + 
+			"       try {\n" + 
+			"           i = null;\n" + 
+			"           unsafe();\n" + 
+			"       } catch (Exception e) {\n" + 
+			"           i = 3;\n" + 
+			"       } finally {\n" +
+			"           while (i == null)\n" + 
+			"				i = 4;\n" + 
+			"           while (j < 4)\n" + 
+			"               j = (b?i:1)+1;\n" + 
+			"       }\n" + 
+			"   }\n" + 
+			"\n" + 
+			"   private void unsafe() throws Exception {\n" + 
+			"        throw new Exception();\n" + 
+			"   }\n" +
+			"}\n"},
+		options);
+}
+// https://bugs.eclipse.org/403147 [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
+// array reference in nested try
+public void test0037_autounboxing_5() {
+	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
+	Map options = getCompilerOptions();
+	options.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.ERROR);
+	runNegativeTest(
+		true,
+		new String[] {
+			"X.java",
+			"public class X {\n" +
+			"		void foo(Object [] o, boolean b, Integer i) {\n" + 
+			"		int j = 1;\n" + 
+			"		try {\n" + 
+			"			if (b) i = null;\n" + 
+			"		} catch (RuntimeException r) {\n" + 
+			"			i = 3;\n" + 
+			"		} finally {\n" + 
+			"			try {\n" + 
+			"				System.out.println(o[i]);  \n" + 
+			"			} finally {\n" + 
+			"				System.out.println(j);\n" + 
+			"			}\n" + 
+			"		}\n" + 
+			"	}\n" +
+			"}\n"},
+		null,
+		options,
+		"----------\n" + 
+		"1. ERROR in X.java (at line 10)\n" + 
+		"	System.out.println(o[i]);  \n" + 
+		"	                     ^\n" + 
+		"Potential null pointer access: This expression of type Integer may be null but requires auto-unboxing\n" + 
+		"----------\n",
+		JavacTestOptions.Excuse.EclipseWarningConfiguredAsError);
+}
+
+// Bug 406384 - Internal error with I20130413 
+public void test0037_autounboxing_6() {
+	if (this.complianceLevel < ClassFileConstants.JDK1_5)
+		return;
+	runConformTest(
+		new String[] {
+			"X.java",
+			"import java.util.List;\n" +
+			"public class X {\n" +
+			"	void test(List<String> l1, List<String> l2, int i, Object val) {\n" +
+			"		for (String s1 : l1) {\n" +
+			"			for (String s2 : l2) {\n" +
+			"				switch (i) {\n" +
+			"				case 1: \n" +
+			"					boolean booleanValue = (Boolean)val;\n" +
+			"				}\n" +
+			"			}\n" +
+			"		}\n" +
+			"	}\n" +
+			"}\n"
+		});
+}
+
 // null analysis -- autoboxing
 public void test0040_autoboxing_compound_assignment() {
 	if (this.complianceLevel >= ClassFileConstants.JDK1_5) {
@@ -14234,6 +14497,7 @@
 }
 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=332637 
 // Dead Code detection removing code that isn't dead
+// variant with a finally block
 public void testBug332637b() {
 	if (this.complianceLevel < ClassFileConstants.JDK1_5)
 		return;
@@ -15771,6 +16035,82 @@
 		"",/* expected error */
 	    JavacTestOptions.Excuse.EclipseWarningConfiguredAsError);
 }
+// Bug 384380 - False positive on a « Potential null pointer access » after a continue
+// original test case
+public void testBug384380() {
+	if (this.complianceLevel >= ClassFileConstants.JDK1_5) {
+		this.runConformTest(
+			new String[] {
+				"Test.java",
+				"public class Test {\n" +
+				"	public static class Container{\n" +
+				"		public int property;\n" +
+				"	}\n" +
+				"	public static class CustomException extends Exception {\n" +
+				"		private static final long	 serialVersionUID	= 1L;\n" +
+				"	}\n" +
+				"	public static void anotherMethod() throws CustomException {}\n" +
+				"\n" +
+				"	public static void method(final java.util.List<Container> list) {\n" +
+				"		for (final Container c : list) {\n" +
+				"			if(c == null)\n" +
+				"				continue; // return or break, are fine though\n" +
+				"\n" + 
+				"			// without this try-catch+for+exception block it does not fails\n" +
+				"			try {\n" +
+				"				for(int i = 0; i < 10 ; i++) // needs a loop here (a 'while' or a 'for') to fail\n" +
+				"					anotherMethod(); // throwing directly CustomException make it fails too\n" +
+				"			} catch (final CustomException e) {\n" +
+				"				// it fails even if catch is empty\n" +
+				"			}\n" +
+				"			c.property += 1; // \"Potential null pointer access: The variable c may be null at this location\"\n" +
+				"		}\n" +
+				"\n" +
+				"	}\n" +
+				"}\n"
+			},
+			"");
+	}
+}
+// Bug 384380 - False positive on a « Potential null pointer access » after a continue
+// variant with a finally block
+public void testBug384380_a() {
+	if (this.complianceLevel >= ClassFileConstants.JDK1_5) {
+		this.runConformTest(
+			new String[] {
+				"Test.java",
+				"public class Test {\n" +
+				"	public static class Container{\n" +
+				"		public int property;\n" +
+				"	}\n" +
+				"	public static class CustomException extends Exception {\n" +
+				"		private static final long	 serialVersionUID	= 1L;\n" +
+				"	}\n" +
+				"	public static void anotherMethod() throws CustomException {}\n" +
+				"\n" +
+				"	public static void method(final java.util.List<Container> list) {\n" +
+				"		for (final Container c : list) {\n" +
+				"			if(c == null)\n" +
+				"				continue; // return or break, are fine though\n" +
+				"\n" + 
+				"			// without this try-catch+for+exception block it does not fails\n" +
+				"			try {\n" +
+				"				for(int i = 0; i < 10 ; i++) // needs a loop here (a 'while' or a 'for') to fail\n" +
+				"					anotherMethod(); // throwing directly CustomException make it fails too\n" +
+				"			} catch (final CustomException e) {\n" +
+				"				// it fails even if catch is empty\n" +
+				"			} finally {\n" +
+				"				System.out.print(3);\n" +
+				"			}\n" +
+				"			c.property += 1; // \"Potential null pointer access: The variable c may be null at this location\"\n" +
+				"		}\n" +
+				"\n" +
+				"	}\n" +
+				"}\n"
+			},
+			"");
+	}
+}
 public void testBug376263() {
 	Map customOptions = getCompilerOptions();
 	customOptions.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.ERROR);
@@ -16518,4 +16858,115 @@
 			"}\n"
 		});
 }
+// Bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
+public void testBug402993() {
+	runNegativeTest(
+		new String[] {
+			"Test.java",
+			"public class Test {\n" + 
+			"\n" + 
+			"	private static void occasionallyThrowException() throws Exception {\n" + 
+			"		if ((System.currentTimeMillis() & 1L) != 0L)\n" + 
+			"			throw new Exception();\n" + 
+			"	}\n" + 
+			"\n" + 
+			"	private static void open() throws Exception {\n" + 
+			"		occasionallyThrowException();\n" + 
+			"	}\n" + 
+			"\n" + 
+			"	private static void close() throws Exception {\n" + 
+			"		occasionallyThrowException();\n" + 
+			"	}\n" + 
+			"\n" + 
+			"	public static void main(String s[]) {\n" + 
+			"		Exception exc = null;\n" +
+			"		try {\n" + 
+			"			open();\n" + 
+			"			// do more things\n" + 
+			"		}\n" + 
+			"		catch (Exception e) {\n" + 
+			"			if (exc == null) // no warning here ??\n" + 
+			"				;\n" + 
+			"		}\n" + 
+			"		finally {\n" + 
+			"			try {\n" + 
+			"				close();\n" + 
+			"			}\n" + 
+			"			catch (Exception e) {\n" + 
+			"				if (exc == null) // No warning here ??\n" + 
+			"					exc = e;\n" + 
+			"			}\n" + 
+			"		}\n" + 
+			"	}\n" + 
+			"}\n"
+		}, 
+		"----------\n" + 
+		"1. ERROR in Test.java (at line 23)\n" + 
+		"	if (exc == null) // no warning here ??\n" + 
+		"	    ^^^\n" + 
+		"Redundant null check: The variable exc can only be null at this location\n" + 
+		"----------\n" + 
+		"2. ERROR in Test.java (at line 31)\n" + 
+		"	if (exc == null) // No warning here ??\n" + 
+		"	    ^^^\n" + 
+		"Redundant null check: The variable exc can only be null at this location\n" + 
+		"----------\n");
+}
+// Bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
+// variant with finally block in inner try
+public void testBug402993a() {
+	runNegativeTest(
+		new String[] {
+			"Test.java",
+			"public class Test {\n" + 
+			"\n" + 
+			"	private static void occasionallyThrowException() throws Exception {\n" + 
+			"		if ((System.currentTimeMillis() & 1L) != 0L)\n" + 
+			"			throw new Exception();\n" + 
+			"	}\n" + 
+			"\n" + 
+			"	private static void open() throws Exception {\n" + 
+			"		occasionallyThrowException();\n" + 
+			"	}\n" + 
+			"\n" + 
+			"	private static void close() throws Exception {\n" + 
+			"		occasionallyThrowException();\n" + 
+			"	}\n" + 
+			"\n" + 
+			"	public static void main(String s[]) {\n" + 
+			"		Exception exc = null;\n" + 
+			"		try {\n" + 
+			"			open();\n" + 
+			"			// do more things\n" + 
+			"		}\n" + 
+			"		catch (Exception e) {\n" + 
+			"			if (exc == null) // no warning here ??\n" + 
+			"				;\n" + 
+			"		}\n" + 
+			"		finally {\n" + 
+			"			try {\n" + 
+			"				close();\n" + 
+			"			}\n" + 
+			"			catch (Exception e) {\n" + 
+			"				if (exc == null) // No warning here ??\n" + 
+			"					exc = e;\n" + 
+			"			} finally {\n" +
+			"				System.out.print(1);\n" +
+			"			}\n" +
+			"		}\n" + 
+			"	}\n" + 
+			"}\n"
+		}, 
+		"----------\n" + 
+		"1. ERROR in Test.java (at line 23)\n" + 
+		"	if (exc == null) // no warning here ??\n" + 
+		"	    ^^^\n" + 
+		"Redundant null check: The variable exc can only be null at this location\n" + 
+		"----------\n" + 
+		"2. ERROR in Test.java (at line 31)\n" + 
+		"	if (exc == null) // No warning here ??\n" + 
+		"	    ^^^\n" + 
+		"Redundant null check: The variable exc can only be null at this location\n" + 
+		"----------\n");
+}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Requestor.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Requestor.java
index 7b0df8b..6f0eafc 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Requestor.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Requestor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -14,14 +14,12 @@
 import java.io.IOException;
 import java.util.Hashtable;
 
-import junit.framework.Assert;
-
 import org.eclipse.jdt.core.tests.util.Util;
 import org.eclipse.jdt.internal.compiler.ClassFile;
 import org.eclipse.jdt.internal.compiler.CompilationResult;
 import org.eclipse.jdt.internal.compiler.ICompilerRequestor;
 
-public class Requestor extends Assert implements ICompilerRequestor {
+public class Requestor implements ICompilerRequestor {
 	public boolean hasErrors = false;
 	public String outputPath;
 	private boolean forceOutputGeneration;
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 a6c0f98..ba6b9b7 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2012 IBM Corporation and others.
+ * Copyright (c) 2006, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - contribution for
+ *								Bug 412203 - [compiler] Internal compiler error: java.lang.IllegalArgumentException: info cannot be null
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -34,7 +36,7 @@
 	// All specified tests which does not belong to the class are skipped...
 	static {
 //		TESTS_PREFIX = "testBug95521";
-//		TESTS_NAMES = new String[] { "testBug380313" };
+//		TESTS_NAMES = new String[] { "testBug412076_" };
 //		TESTS_NUMBERS = new int[] { 53 };
 //		TESTS_RANGE = new int[] { 23 -1,};
 	}
@@ -8198,5 +8200,396 @@
 					"}"
 			},
 			"StartingDone");
-	}	
+	}
+	
+	// https://bugs.eclipse.org/412076
+	public void testBug412076_a() throws Exception {
+		if (this.complianceLevel < ClassFileConstants.JDK1_7) return; // using <>
+		Map options = getCompilerOptions();
+		options.put(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, JavaCore.ENABLED);
+		options.put(JavaCore.COMPILER_PB_NULL_REFERENCE, JavaCore.ERROR);
+		options.put(JavaCore.COMPILER_PB_NULL_SPECIFICATION_VIOLATION, JavaCore.ERROR);
+		options.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.WARNING);
+		options.put(JavaCore.COMPILER_PB_SUPPRESS_OPTIONAL_ERRORS, JavaCore.ENABLED);
+		this.runConformTest(
+				new String[] {
+					"X2.java",
+					"import java.util.*;\n" + 
+					"\n" + 
+					"import org.eclipse.jdt.annotation.NonNullByDefault;\n" + 
+					"\n" + 
+					"class Y {\n" + 
+					"	public Y() { }\n" + 
+					"}\n" + 
+					"\n" + 
+					"@NonNullByDefault\n" + 
+					"abstract class X1 {\n" + 
+					"\n" + 
+					"	private Object a;\n" + 
+					"	private Object b;\n" + 
+					"	private Object c;\n" + 
+					"	private Object d;\n" + 
+					"	private Object e;\n" + 
+					"	private Object f;\n" + 
+					"\n" + 
+					"	protected Object name;\n" + 
+					"\n" + 
+					"	@SuppressWarnings(\"null\")\n" + 
+					"	protected X1() {\n" + 
+					"		super ();\n" + 
+					"	}\n" + 
+					"\n" + 
+					"}\n" + 
+					"public class X2 extends X1 {\n" + 
+					"\n" + 
+					"\n" + 
+					"	public static final int ID = 4711;\n" + 
+					"\n" + 
+					"	private Object x;\n" + 
+					"	private Object y;\n" + 
+					"	private Object z;\n" + 
+					"\n" + 
+					"	private Runnable runable = new Runnable () {\n" + 
+					"		@Override\n" + 
+					"		public void run () {\n" + 
+					"			// whatever\n" + 
+					"		}\n" + 
+					"	};\n" + 
+					"\n" + 
+					"	private void init () {\n" + 
+					"		final Object selector = new Object ();\n" + 
+					"		this.name = new Object ();\n" + 
+					"		LinkedList<Character> invalidCharactersList = new LinkedList<> ();\n" + 
+					"		char[] invalidCharacters = new char[invalidCharactersList.size ()];\n" + 
+					"		for (int i = 0; i < invalidCharacters.length; i++) {\n" + 
+					"			invalidCharacters[i] = invalidCharactersList.get (i).charValue ();\n" + 
+					"		}\n" + 
+					"		Y inputVerifier = new Y();\n" + 
+					"	}\n" + 
+					"\n" + 
+					"}\n",
+				},
+				"",
+				getLibsWithNullAnnotations(),
+				true/*flush*/,
+				null/*vmArgs*/,
+				options,
+				null/*requestor*/,
+				true/*skipJavac*/);
+
+			ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
+			byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator  +"X2.class"));
+			String actualOutput =
+				disassembler.disassemble(
+					classFileBytes,
+					"\n",
+					ClassFileBytesDisassembler.DETAILED);
+
+			String expectedOutput =
+					"  // Method descriptor #16 ()V\n" + 
+					"  // Stack: 4, Locals: 5\n" + 
+					"  private void init();\n" + 
+					"     0  new java.lang.Object [32]\n" + 
+					"     3  dup\n" + 
+					"     4  invokespecial java.lang.Object() [34]\n" + 
+					"     7  astore_1 [selector]\n" + 
+					"     8  aload_0 [this]\n" + 
+					"     9  new java.lang.Object [32]\n" + 
+					"    12  dup\n" + 
+					"    13  invokespecial java.lang.Object() [34]\n" + 
+					"    16  putfield X2.name : java.lang.Object [35]\n" + 
+					"    19  new java.util.LinkedList [38]\n" + 
+					"    22  dup\n" + 
+					"    23  invokespecial java.util.LinkedList() [40]\n" + 
+					"    26  astore_2 [invalidCharactersList]\n" + 
+					"    27  aload_2 [invalidCharactersList]\n" + 
+					"    28  invokevirtual java.util.LinkedList.size() : int [41]\n" + 
+					"    31  newarray char [5]\n" + 
+					"    33  astore_3 [invalidCharacters]\n" + 
+					"    34  iconst_0\n" + 
+					"    35  istore 4 [i]\n" + 
+					"    37  goto 59\n" + 
+					"    40  aload_3 [invalidCharacters]\n" + 
+					"    41  iload 4 [i]\n" + 
+					"    43  aload_2 [invalidCharactersList]\n" + 
+					"    44  iload 4 [i]\n" + 
+					"    46  invokevirtual java.util.LinkedList.get(int) : java.lang.Object [45]\n" + 
+					"    49  checkcast java.lang.Character [49]\n" + 
+					"    52  invokevirtual java.lang.Character.charValue() : char [51]\n" + 
+					"    55  castore\n" + 
+					"    56  iinc 4 1 [i]\n" + 
+					"    59  iload 4 [i]\n" + 
+					"    61  aload_3 [invalidCharacters]\n" + 
+					"    62  arraylength\n" + 
+					"    63  if_icmplt 40\n" + 
+					"    66  new Y [55]\n" + 
+					"    69  dup\n" + 
+					"    70  invokespecial Y() [57]\n" + 
+					"    73  astore 4 [inputVerifier]\n" + 
+					"    75  return\n" + 
+					"      Line numbers:\n" + 
+					"        [pc: 0, line: 44]\n" + 
+					"        [pc: 8, line: 45]\n" + 
+					"        [pc: 19, line: 46]\n" + 
+					"        [pc: 27, line: 47]\n" + 
+					"        [pc: 34, line: 48]\n" + 
+					"        [pc: 40, line: 49]\n" + 
+					"        [pc: 56, line: 48]\n" + 
+					"        [pc: 66, line: 51]\n" + 
+					"        [pc: 75, line: 52]\n" + 
+					"      Local variable table:\n" + 
+					"        [pc: 0, pc: 76] local: this index: 0 type: X2\n" + 
+					"        [pc: 8, pc: 76] local: selector index: 1 type: java.lang.Object\n" + 
+					"        [pc: 27, pc: 76] local: invalidCharactersList index: 2 type: java.util.LinkedList\n" + 
+					"        [pc: 34, pc: 76] local: invalidCharacters index: 3 type: char[]\n" + 
+					"        [pc: 37, pc: 66] local: i index: 4 type: int\n" + 
+					"        [pc: 75, pc: 76] local: inputVerifier index: 4 type: Y\n" + 
+					"      Local variable type table:\n" + 
+					"        [pc: 27, pc: 76] local: invalidCharactersList index: 2 type: java.util.LinkedList<java.lang.Character>\n" + 
+					"      Stack map table: number of frames 2\n" + 
+					"        [pc: 40, full, stack: {}, locals: {X2, java.lang.Object, java.util.LinkedList, char[], int}]\n" + 
+					"        [pc: 59, same]\n";
+
+			int index = actualOutput.indexOf(expectedOutput);
+			if (index == -1 || expectedOutput.length() == 0) {
+				System.out.println(Util.displayString(actualOutput, 2));
+			}
+			if (index == -1) {
+				assertEquals("Wrong contents", expectedOutput, actualOutput);
+			}
+	}
+
+	// https://bugs.eclipse.org/412076
+	// yet simplified version - using FieldReference
+	public void testBug412076_b() throws Exception {
+		Map options = getCompilerOptions();
+		options.put(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, JavaCore.ENABLED);
+		options.put(JavaCore.COMPILER_PB_NULL_REFERENCE, JavaCore.ERROR);
+		options.put(JavaCore.COMPILER_PB_NULL_SPECIFICATION_VIOLATION, JavaCore.ERROR);
+		options.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.WARNING);
+		options.put(JavaCore.COMPILER_PB_SUPPRESS_OPTIONAL_ERRORS, JavaCore.ENABLED);
+		this.runConformTest(
+				new String[] {
+					"X2.java",
+					"import java.util.LinkedList;\n" + 
+					"\n" + 
+					"import org.eclipse.jdt.annotation.NonNull;\n" + 
+					"\n" + 
+					"abstract class X1 {\n" + 
+					"	protected @NonNull Object name = new Object();\n" + 
+					"}\n" + 
+					"\n" + 
+					"public class X2 extends X1 {\n" + 
+					"	void init () {\n" + 
+					"		this.name = new Object ();\n" + 
+					"		LinkedList<Character> l = new LinkedList<Character> ();\n" + 
+					"		char[] cs = new char[l.size ()];\n" + 
+					"		for (int i = 0; i < cs.length; i++) {\n" + 
+					"			cs[i] = l.get (i).charValue ();\n" + 
+					"		}\n" + 
+					"		Object o2 = new Object();\n" + 
+					"	}\n" + 
+					"}\n",
+				},
+				"",
+				getLibsWithNullAnnotations(),
+				true/*flush*/,
+				null/*vmArgs*/,
+				options,
+				null/*requestor*/,
+				true/*skipJavac*/);
+
+			ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
+			byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator  +"X2.class"));
+			String actualOutput =
+				disassembler.disassemble(
+					classFileBytes,
+					"\n",
+					ClassFileBytesDisassembler.DETAILED);
+
+			String expectedOutput =
+					"  // Method descriptor #6 ()V\n" + 
+					"  // Stack: 4, Locals: 4\n" + 
+					"  void init();\n" + 
+					"     0  aload_0 [this]\n" + 
+					"     1  new java.lang.Object [15]\n" + 
+					"     4  dup\n" + 
+					"     5  invokespecial java.lang.Object() [17]\n" + 
+					"     8  putfield X2.name : java.lang.Object [18]\n" + 
+					"    11  new java.util.LinkedList [22]\n" + 
+					"    14  dup\n" + 
+					"    15  invokespecial java.util.LinkedList() [24]\n" + 
+					"    18  astore_1 [l]\n" + 
+					"    19  aload_1 [l]\n" + 
+					"    20  invokevirtual java.util.LinkedList.size() : int [25]\n" + 
+					"    23  newarray char [5]\n" + 
+					"    25  astore_2 [cs]\n" + 
+					"    26  iconst_0\n" + 
+					"    27  istore_3 [i]\n" + 
+					"    28  goto 48\n" + 
+					"    31  aload_2 [cs]\n" + 
+					"    32  iload_3 [i]\n" + 
+					"    33  aload_1 [l]\n" + 
+					"    34  iload_3 [i]\n" + 
+					"    35  invokevirtual java.util.LinkedList.get(int) : java.lang.Object [29]\n" + 
+					"    38  checkcast java.lang.Character [33]\n" + 
+					"    41  invokevirtual java.lang.Character.charValue() : char [35]\n" + 
+					"    44  castore\n" + 
+					"    45  iinc 3 1 [i]\n" + 
+					"    48  iload_3 [i]\n" + 
+					"    49  aload_2 [cs]\n" + 
+					"    50  arraylength\n" + 
+					"    51  if_icmplt 31\n" + 
+					"    54  new java.lang.Object [15]\n" + 
+					"    57  dup\n" + 
+					"    58  invokespecial java.lang.Object() [17]\n" + 
+					"    61  astore_3 [o2]\n" + 
+					"    62  return\n" + 
+					"      Line numbers:\n" + 
+					"        [pc: 0, line: 11]\n" + 
+					"        [pc: 11, line: 12]\n" + 
+					"        [pc: 19, line: 13]\n" + 
+					"        [pc: 26, line: 14]\n" + 
+					"        [pc: 31, line: 15]\n" + 
+					"        [pc: 45, line: 14]\n" + 
+					"        [pc: 54, line: 17]\n" + 
+					"        [pc: 62, line: 18]\n" + 
+					"      Local variable table:\n" + 
+					"        [pc: 0, pc: 63] local: this index: 0 type: X2\n" + 
+					"        [pc: 19, pc: 63] local: l index: 1 type: java.util.LinkedList\n" + 
+					"        [pc: 26, pc: 63] local: cs index: 2 type: char[]\n" + 
+					"        [pc: 28, pc: 54] local: i index: 3 type: int\n" + 
+					"        [pc: 62, pc: 63] local: o2 index: 3 type: java.lang.Object\n" + 
+					"      Local variable type table:\n" + 
+					"        [pc: 19, pc: 63] local: l index: 1 type: java.util.LinkedList<java.lang.Character>\n" + 
+					"      Stack map table: number of frames 2\n" + 
+					"        [pc: 31, append: {java.util.LinkedList, char[], int}]\n" + 
+					"        [pc: 48, same]\n" + 
+					"}";
+
+			int index = actualOutput.indexOf(expectedOutput);
+			if (index == -1 || expectedOutput.length() == 0) {
+				System.out.println(Util.displayString(actualOutput, 2));
+			}
+			if (index == -1) {
+				assertEquals("Wrong contents", expectedOutput, actualOutput);
+			}
+	}
+
+	// https://bugs.eclipse.org/412076
+	// yet simplified version - using SingleNameReference
+	public void testBug412076_c() throws Exception {
+		Map options = getCompilerOptions();
+		options.put(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, JavaCore.ENABLED);
+		options.put(JavaCore.COMPILER_PB_NULL_REFERENCE, JavaCore.ERROR);
+		options.put(JavaCore.COMPILER_PB_NULL_SPECIFICATION_VIOLATION, JavaCore.ERROR);
+		options.put(JavaCore.COMPILER_PB_POTENTIAL_NULL_REFERENCE, JavaCore.WARNING);
+		options.put(JavaCore.COMPILER_PB_SUPPRESS_OPTIONAL_ERRORS, JavaCore.ENABLED);
+		this.runConformTest(
+				new String[] {
+					"X2.java",
+					"import java.util.LinkedList;\n" + 
+					"\n" + 
+					"import org.eclipse.jdt.annotation.NonNull;\n" + 
+					"\n" + 
+					"abstract class X1 {\n" + 
+					"	protected @NonNull Object name = new Object();\n" + 
+					"}\n" + 
+					"\n" + 
+					"public class X2 extends X1 {\n" + 
+					"	void init () {\n" + 
+					"		name = new Object ();\n" + 
+					"		LinkedList<Character> l = new LinkedList<Character> ();\n" + 
+					"		char[] cs = new char[l.size ()];\n" + 
+					"		for (int i = 0; i < cs.length; i++) {\n" + 
+					"			cs[i] = l.get (i).charValue ();\n" + 
+					"		}\n" + 
+					"		Object o2 = new Object();\n" + 
+					"	}\n" + 
+					"}\n",
+				},
+				"",
+				getLibsWithNullAnnotations(),
+				true/*flush*/,
+				null/*vmArgs*/,
+				options,
+				null/*requestor*/,
+				true/*skipJavac*/);
+
+			ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
+			byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator  +"X2.class"));
+			String actualOutput =
+				disassembler.disassemble(
+					classFileBytes,
+					"\n",
+					ClassFileBytesDisassembler.DETAILED);
+
+			String expectedOutput =
+					"  // Method descriptor #6 ()V\n" + 
+					"  // Stack: 4, Locals: 4\n" + 
+					"  void init();\n" + 
+					"     0  aload_0 [this]\n" + 
+					"     1  new java.lang.Object [15]\n" + 
+					"     4  dup\n" + 
+					"     5  invokespecial java.lang.Object() [17]\n" + 
+					"     8  putfield X2.name : java.lang.Object [18]\n" + 
+					"    11  new java.util.LinkedList [22]\n" + 
+					"    14  dup\n" + 
+					"    15  invokespecial java.util.LinkedList() [24]\n" + 
+					"    18  astore_1 [l]\n" + 
+					"    19  aload_1 [l]\n" + 
+					"    20  invokevirtual java.util.LinkedList.size() : int [25]\n" + 
+					"    23  newarray char [5]\n" + 
+					"    25  astore_2 [cs]\n" + 
+					"    26  iconst_0\n" + 
+					"    27  istore_3 [i]\n" + 
+					"    28  goto 48\n" + 
+					"    31  aload_2 [cs]\n" + 
+					"    32  iload_3 [i]\n" + 
+					"    33  aload_1 [l]\n" + 
+					"    34  iload_3 [i]\n" + 
+					"    35  invokevirtual java.util.LinkedList.get(int) : java.lang.Object [29]\n" + 
+					"    38  checkcast java.lang.Character [33]\n" + 
+					"    41  invokevirtual java.lang.Character.charValue() : char [35]\n" + 
+					"    44  castore\n" + 
+					"    45  iinc 3 1 [i]\n" + 
+					"    48  iload_3 [i]\n" + 
+					"    49  aload_2 [cs]\n" + 
+					"    50  arraylength\n" + 
+					"    51  if_icmplt 31\n" + 
+					"    54  new java.lang.Object [15]\n" + 
+					"    57  dup\n" + 
+					"    58  invokespecial java.lang.Object() [17]\n" + 
+					"    61  astore_3 [o2]\n" + 
+					"    62  return\n" + 
+					"      Line numbers:\n" + 
+					"        [pc: 0, line: 11]\n" + 
+					"        [pc: 11, line: 12]\n" + 
+					"        [pc: 19, line: 13]\n" + 
+					"        [pc: 26, line: 14]\n" + 
+					"        [pc: 31, line: 15]\n" + 
+					"        [pc: 45, line: 14]\n" + 
+					"        [pc: 54, line: 17]\n" + 
+					"        [pc: 62, line: 18]\n" + 
+					"      Local variable table:\n" + 
+					"        [pc: 0, pc: 63] local: this index: 0 type: X2\n" + 
+					"        [pc: 19, pc: 63] local: l index: 1 type: java.util.LinkedList\n" + 
+					"        [pc: 26, pc: 63] local: cs index: 2 type: char[]\n" + 
+					"        [pc: 28, pc: 54] local: i index: 3 type: int\n" + 
+					"        [pc: 62, pc: 63] local: o2 index: 3 type: java.lang.Object\n" + 
+					"      Local variable type table:\n" + 
+					"        [pc: 19, pc: 63] local: l index: 1 type: java.util.LinkedList<java.lang.Character>\n" + 
+					"      Stack map table: number of frames 2\n" + 
+					"        [pc: 31, append: {java.util.LinkedList, char[], int}]\n" + 
+					"        [pc: 48, same]\n" + 
+					"}";
+
+			int index = actualOutput.indexOf(expectedOutput);
+			if (index == -1 || expectedOutput.length() == 0) {
+				System.out.println(Util.displayString(actualOutput, 2));
+			}
+			if (index == -1) {
+				assertEquals("Wrong contents", expectedOutput, actualOutput);
+			}
+	}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatement17Test.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatement17Test.java
index fafc9d3..9718a1f 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatement17Test.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatement17Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2011 IBM Corporation and others.
+ * Copyright (c) 2003, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Jesper Steen Moller - bug 404146 nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -1216,6 +1217,50 @@
 		"No exception of type ClassNotFoundException[] can be thrown; an exception type must be a subclass of Throwable\n" + 
 		"----------\n");
 	}
+
+//Bug 404146 - nested try-catch-finally-blocks leads to unrunnable Java byte code
+public void testBug404146() {
+	runConformTest(
+		new String[] {
+			"X.java",
+			"import java.io.IOException;\n" + 
+					"import javax.naming.NamingException;\n" + 
+
+			"\n" + 
+			"public final class X {\n" + 
+			"\n" + 
+			"    public static final void illegalStackMap() {\n" + 
+			"        try {\n" + 
+			"          try {\n" + 
+			"            Y.decoy1();\n" + 
+			"          } finally {\n" + 
+			"            try {\n" + 
+			"                Y.decoy2();\n" + 
+			"            } catch (final IOException e) {\n" + 
+			"              return;\n" + 
+			"            }\n" + 
+			"          }\n" + 
+			"        } finally {\n" + 
+			"          try {\n" + 
+			"            Y.decoy3();\n" + 
+			"          } catch (final NamingException e) {\n" + 
+			"            return;\n" + 
+			"          }\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			"}\n",
+			"Y.java",
+				"import java.io.IOException;\n" + 
+						"import javax.naming.NamingException;\n" + 
+			"public final class Y {\n" + 
+			"\n" + 
+			"    public static void decoy1() {}\n" +
+			"    public static void decoy2() throws IOException {}\n" +
+			"    public static void decoy3() throws NamingException {}\n" +
+			"}\n"
+		});
+}
+
 public static Class testClass() {
 	return TryStatement17Test.class;
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatementTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatementTest.java
index bcef02a..d963925 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatementTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatementTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2012 IBM Corporation and others.
+ * Copyright (c) 2003, 2013 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
@@ -10,6 +10,8 @@
  *     Stephan Herrmann - Contribution for
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *								bug 387612 - Unreachable catch block...exception is never thrown from the try
+ *     Jesper Steen Moller - Contribution for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -36,6 +38,11 @@
 public static Test suite() {
 	return buildAllCompliancesTestSuite(testClass());
 }
+protected Map getCompilerOptions() {
+	Map compilerOptions = super.getCompilerOptions();
+	compilerOptions.put(CompilerOptions.OPTION_ShareCommonFinallyBlocks, CompilerOptions.ENABLED);
+	return compilerOptions;
+}
 public void test001() {
 	this.runConformTest(new String[] {
 		"p/X.java",
@@ -2364,6 +2371,128 @@
 		assertEquals("Wrong contents", expectedOutput, result);
 	}
 }
+
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=404146 - variation without sharing of inlined escaping finally-blocks
+public void test042_not_shared() throws Exception {
+	Map customOptions = getCompilerOptions();
+	customOptions.put(CompilerOptions.OPTION_ShareCommonFinallyBlocks, CompilerOptions.DISABLED);
+	customOptions.put(CompilerOptions.OPTION_InlineJsr, CompilerOptions.ENABLED);
+
+	this.runConformTest(
+			new String[] {
+				"X.java",
+				" public class X {\n" +
+				" public static void main(String[] args) {\n" +
+				"		System.out.println(new X().foo(args));\n" +
+				"	}\n" +
+				"	String foo(String[] args) {\n" +
+				"		try {\n" +
+				"			if (args == null) return \"KO\";\n" +
+				"			switch(args.length) {\n" +
+				"			case 0:\n" +
+				"				return \"OK\";\n" +
+				"			case 1:\n" +
+				"				return \"KO\";\n" +
+				"			case 3:\n" +
+				"				return \"OK\";\n" +
+				"			default:\n" +
+				"				return \"KO\";\n" +
+				"			}\n" +
+				"		} finally {\n" +
+				"			System.out.print(\"FINALLY:\");\n" +
+				"		}\n" +
+				"	}\n" +
+				"}\n",
+			},
+			"FINALLY:OK",
+			null,
+			true,
+			null,
+			customOptions,
+			null);
+
+	String expectedOutput =
+			"  // Method descriptor #26 ([Ljava/lang/String;)Ljava/lang/String;\n" + 
+			"  // Stack: 2, Locals: 3\n" + 
+			"  java.lang.String foo(java.lang.String[] args);\n" + 
+			"      0  aload_1 [args]\n" + 
+			"      1  ifnonnull 15\n" + 
+			"      4  getstatic java.lang.System.out : java.io.PrintStream [16]\n" + 
+			"      7  ldc <String \"FINALLY:\"> [35]\n" + 
+			"      9  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" + 
+			"     12  ldc <String \"KO\"> [40]\n" + 
+			"     14  areturn\n" + 
+			"     15  aload_1 [args]\n" + 
+			"     16  arraylength\n" + 
+			"     17  tableswitch default: 81\n" + 
+			"          case 0: 48\n" + 
+			"          case 1: 59\n" + 
+			"          case 2: 81\n" + 
+			"          case 3: 70\n" + 
+			"     48  getstatic java.lang.System.out : java.io.PrintStream [16]\n" + 
+			"     51  ldc <String \"FINALLY:\"> [35]\n" + 
+			"     53  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" + 
+			"     56  ldc <String \"OK\"> [42]\n" + 
+			"     58  areturn\n" + 
+			"     59  getstatic java.lang.System.out : java.io.PrintStream [16]\n" + 
+			"     62  ldc <String \"FINALLY:\"> [35]\n" + 
+			"     64  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" + 
+			"     67  ldc <String \"KO\"> [40]\n" + 
+			"     69  areturn\n" + 
+			"     70  getstatic java.lang.System.out : java.io.PrintStream [16]\n" + 
+			"     73  ldc <String \"FINALLY:\"> [35]\n" + 
+			"     75  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" + 
+			"     78  ldc <String \"OK\"> [42]\n" + 
+			"     80  areturn\n" + 
+			"     81  getstatic java.lang.System.out : java.io.PrintStream [16]\n" + 
+			"     84  ldc <String \"FINALLY:\"> [35]\n" + 
+			"     86  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" + 
+			"     89  ldc <String \"KO\"> [40]\n" + 
+			"     91  areturn\n" + 
+			"     92  astore_2\n" + 
+			"     93  getstatic java.lang.System.out : java.io.PrintStream [16]\n" + 
+			"     96  ldc <String \"FINALLY:\"> [35]\n" + 
+			"     98  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" + 
+			"    101  aload_2\n" + 
+			"    102  athrow\n" + 
+			"      Exception Table:\n" + 
+			"        [pc: 0, pc: 4] -> 92 when : any\n" + 
+			"        [pc: 15, pc: 48] -> 92 when : any\n" + 
+			"      Line numbers:\n" + 
+			"        [pc: 0, line: 7]\n" + 
+			"        [pc: 4, line: 19]\n" + 
+			"        [pc: 12, line: 7]\n" + 
+			"        [pc: 15, line: 8]\n" + 
+			"        [pc: 48, line: 19]\n" + 
+			"        [pc: 56, line: 10]\n" + 
+			"        [pc: 59, line: 19]\n" + 
+			"        [pc: 67, line: 12]\n" + 
+			"        [pc: 70, line: 19]\n" + 
+			"        [pc: 78, line: 14]\n" + 
+			"        [pc: 81, line: 19]\n" + 
+			"        [pc: 89, line: 16]\n" + 
+			"        [pc: 92, line: 18]\n" + 
+			"        [pc: 93, line: 19]\n" + 
+			"        [pc: 101, line: 20]\n" + 
+			"      Local variable table:\n" + 
+			"        [pc: 0, pc: 103] local: this index: 0 type: X\n" + 
+			"        [pc: 0, pc: 103] local: args index: 1 type: java.lang.String[]\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=128705 - variation
 public void test043() throws Exception {
 	this.runConformTest(
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/XLargeTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/XLargeTest.java
index 27414e6..73c220d 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/XLargeTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/XLargeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2012 IBM Corporation and others.
+ * Copyright (c) 2005, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Jesper Steen Moller - Contributions for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -3909,6 +3911,8 @@
 	"");
 }
 public void test015() {
+	Map settings = getCompilerOptions();
+	settings.put(CompilerOptions.OPTION_ShareCommonFinallyBlocks, CompilerOptions.ENABLED);
 	runConformTest(
 		true,
 		new String[] {
@@ -11934,6 +11938,8 @@
 		"	}\n" +
 		"}"},
 		null,
+		settings,
+		null,
 		"Enter finally block\n" +
 		"Inside finally block\n" +
 		"Leave finally block\n" +
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/JDIStackFrame.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/JDIStackFrame.java
index df0e12b..efe4910 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/JDIStackFrame.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/JDIStackFrame.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -15,7 +15,7 @@
 import java.util.List;
 import java.util.Vector;
 
-import junit.framework.Assert;
+import junit.framework.TestCase;
 
 import org.eclipse.jdt.core.tests.runtime.RuntimeConstants;
 import org.eclipse.jdt.internal.eval.EvaluationConstants;
@@ -165,12 +165,12 @@
 				requestor,
 				test.getProblemFactory());
 		} catch (InstallException e) {
-			Assert.assertTrue("Target exception " + e.getMessage(), false);
+			TestCase.assertTrue("Target exception " + e.getMessage(), false);
 		}
 		EvaluationResult[] results = requestor.results;
 		for (int i = 0; i < requestor.resultIndex + 1; i++){
 			if (results[i].hasErrors()) {
-				Assert.assertTrue("Compilation error in user code", false);
+				TestCase.assertTrue("Compilation error in user code", false);
 			}
 		}
 
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/runtime/LocalVMLauncher.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/runtime/LocalVMLauncher.java
index 2e4d114..e3de69a 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/runtime/LocalVMLauncher.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/runtime/LocalVMLauncher.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
diff --git a/org.eclipse.jdt.core.tests.model/.settings/org.eclipse.core.resources.prefs b/org.eclipse.jdt.core.tests.model/.settings/org.eclipse.core.resources.prefs
index 5af3750..d4ea5fb 100644
--- a/org.eclipse.jdt.core.tests.model/.settings/org.eclipse.core.resources.prefs
+++ b/org.eclipse.jdt.core.tests.model/.settings/org.eclipse.core.resources.prefs
@@ -1,3 +1,4 @@
 eclipse.preferences.version=1
+encoding//workspace/AttachedJavadocProject/UTF8doc=UTF-8
 encoding//workspace/AttachedJavadocProject/UTF8doc/p/TestBug394382.txt=UTF-8
 encoding//workspace/Encoding/src/testUTF8/Test.java=UTF-8
diff --git a/org.eclipse.jdt.core.tests.model/pom.xml b/org.eclipse.jdt.core.tests.model/pom.xml
index ee39c3f..0a1ae8e 100644
--- a/org.eclipse.jdt.core.tests.model/pom.xml
+++ b/org.eclipse.jdt.core.tests.model/pom.xml
@@ -9,14 +9,12 @@
   Contributors:
      Igor Fedorenko - initial implementation
 -->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <artifactId>eclipse.jdt.core</artifactId>
     <groupId>eclipse.jdt.core</groupId>
-    <version>3.8.0-SNAPSHOT</version>
+    <version>4.4.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.core.tests.model</artifactId>
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestJLS3.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestJLS3.java
index 6929f32..0cb5ad2 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestJLS3.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestJLS3.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -10,21 +10,27 @@
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.dom;
 
+import java.io.IOException;
 import java.util.List;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
 import org.eclipse.jdt.core.dom.ClassInstanceCreation;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.IAnnotationBinding;
+import org.eclipse.jdt.core.dom.IMemberValuePairBinding;
 import org.eclipse.jdt.core.dom.IMethodBinding;
 import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
 import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.eclipse.jdt.internal.core.JavaElement;
 
 /**
@@ -1100,4 +1106,31 @@
 		deleteProject(project);
 	}
 }
+
+public void testBug405908() throws CoreException, IOException {
+	try {
+		createJavaProject("P", new String[] { "" }, new String[0], "", CompilerOptions.VERSION_1_5);
+			createFile("P/A.java",
+					"@interface Generated {\n" +
+					"    String comment() default \"\";\n" +
+					"    String[] value();\n" +
+					"}\n" +
+					"@Generated()\n" +
+					"class A {\n" +
+					"}"
+			);
+		ICompilationUnit cuA = getCompilationUnit("P/A.java");
+		CompilationUnit unitA = (CompilationUnit) runConversion(cuA, true, false, true);
+		AbstractTypeDeclaration typeA = (AbstractTypeDeclaration) unitA.types().get(1);
+		IAnnotationBinding[] annotations = typeA.resolveBinding().getAnnotations();
+		IAnnotationBinding generated = annotations[0];
+		IMemberValuePairBinding[] mvps = generated.getAllMemberValuePairs();
+		IMemberValuePairBinding valueBinding = mvps[1];
+		assertEquals("value", valueBinding.getName());
+		Object value = valueBinding.getValue();
+		assertEquals(0, ((Object[]) value).length);
+	} finally {
+		deleteProject("P");
+	}
+}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestJLS4.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestJLS4.java
index a8ad61c..6532bd0 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestJLS4.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestJLS4.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
+ * Copyright (c) 2011, 2013 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
@@ -15,18 +15,16 @@
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.AST;
 
 /**
  * Test suite to verify that DOM/AST bugs are fixed.
  *
  * Note that only specific JLS4 tests are defined in this test suite, but when
- * running it, all superclass {@link ASTConverterBugsTest} tests will be run
+ * running it, all superclass {@link ASTConverterBugsTestJLS3} tests will be run
  * as well.
  */
-public class ASTConverterBugsTestJLS4 extends ASTConverterBugsTest {
+public class ASTConverterBugsTestJLS4 extends ASTConverterBugsTestJLS3 {
 
 public ASTConverterBugsTestJLS4(String name) {
     super(name);
@@ -35,1011 +33,11 @@
 
 public static Test suite() {
 	TestSuite suite = new Suite(ASTConverterBugsTestJLS4.class.getName());
-	List tests = buildTestsList(ASTConverterBugsTestJLS4.class, 1, 0/* do not sort*/);
+	List tests = buildTestsList(ASTConverterBugsTestJLS4.class, 2, 0/* do not sort*/);
 	for (int index=0, size=tests.size(); index<size; index++) {
 		suite.addTest((Test)tests.get(index));
 	}
 	return suite;
 }
 
-/**
- * @bug 130778: Invalid annotation elements cause no annotation to be in the AST
- * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=130778"
- */
-public void testBug130778a() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]public[*1*]\n" +
-			"[*2*]@AnAnnotation(\"a\")[*2*]\n" +
-			"[*3*]final[*3*]\n" +
-			"[*4*]@AnAnnotation2(\"b\")[*4*]\n" +
-			"class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]public[*1*] [*2*]@AnAnnotation(\"a\")[*2*] [*3*]final[*3*] [*4*]@AnAnnotation2(\"b\")[*4*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:MODIFIER,[11,6],,,[N/A]\n" +
-			"2:SINGLE_MEMBER_ANNOTATION,[18,18],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:MODIFIER,[37,5],,,[N/A]\n" +
-			"4:SINGLE_MEMBER_ANNOTATION,[43,19],,,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"No problem",
-			result);
-}
-public void testBug130778b() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"#\n" +
-			"[*1*]public[*1*]\n" +
-			"[*2*]@AnAnnotation(\"a\")[*2*]\n" +
-			"[*3*]final[*3*]\n" +
-			"[*4*]@AnAnnotation2(\"b\")[*4*]\n" +
-			"class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]public[*1*] [*2*]@AnAnnotation(\"a\")[*2*] [*3*]final[*3*] [*4*]@AnAnnotation2(\"b\")[*4*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:MODIFIER,[13,6],,,[N/A]\n" +
-			"2:SINGLE_MEMBER_ANNOTATION,[20,18],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:MODIFIER,[39,5],,,[N/A]\n" +
-			"4:SINGLE_MEMBER_ANNOTATION,[45,19],,,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	#\n" +
-			"	^\n" +
-			"Syntax error on token \"Invalid Character\", delete this token\n",
-			result);
-}
-public void testBug130778c() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]public[*1*]\n" +
-			"#\n" +
-			"[*2*]@AnAnnotation(\"a\")[*2*]\n" +
-			"[*3*]final[*3*]\n" +
-			"[*4*]@AnAnnotation2(\"b\")[*4*]\n" +
-			"class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]public[*1*] [*2*]@AnAnnotation(\"a\")[*2*] [*3*]final[*3*] [*4*]@AnAnnotation2(\"b\")[*4*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:MODIFIER,[11,6],,,[N/A]\n" +
-			"2:SINGLE_MEMBER_ANNOTATION,[20,18],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:MODIFIER,[39,5],,,[N/A]\n" +
-			"4:SINGLE_MEMBER_ANNOTATION,[45,19],,,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 3)\n" +
-			"	#\n" +
-			"	^\n" +
-			"Syntax error on token \"Invalid Character\", delete this token\n",
-			result);
-}
-public void testBug130778d() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]public[*1*]\n" +
-			"[*2*]@AnAnnotation(\"a\")[*2*]\n" +
-			"#\n" +
-			"[*3*]final[*3*]\n" +
-			"[*4*]@AnAnnotation2(\"b\")[*4*]\n" +
-			"class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]public[*1*] [*2*]@AnAnnotation(\"a\")[*2*] [*3*]final[*3*] [*4*]@AnAnnotation2(\"b\")[*4*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:MODIFIER,[11,6],,,[N/A]\n" +
-			"2:SINGLE_MEMBER_ANNOTATION,[18,18],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:MODIFIER,[39,5],,,[N/A]\n" +
-			"4:SINGLE_MEMBER_ANNOTATION,[45,19],,,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 4)\n" +
-			"	#\n" +
-			"	^\n" +
-			"Syntax error on token \"Invalid Character\", delete this token\n",
-			result);
-}
-public void testBug130778e() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]public[*1*]\n" +
-			"[*2*]@AnAnnotation(\"a\")[*2*]\n" +
-			"[*3*]final[*3*]\n" +
-			"#\n" +
-			"[*4*]@AnAnnotation2(\"b\")[*4*]\n" +
-			"class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]public[*1*] [*2*]@AnAnnotation(\"a\")[*2*] [*3*]final[*3*] [*4*]@AnAnnotation2(\"b\")[*4*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:MODIFIER,[11,6],,,[N/A]\n" +
-			"2:SINGLE_MEMBER_ANNOTATION,[18,18],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:MODIFIER,[37,5],,,[N/A]\n" +
-			"4:SINGLE_MEMBER_ANNOTATION,[45,19],,,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 5)\n" +
-			"	#\n" +
-			"	^\n" +
-			"Syntax error on token \"Invalid Character\", delete this token\n",
-			result);
-}
-public void testBug130778f() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]public[*1*]\n" +
-			"[*2*]@AnAnnotation(\"a\")[*2*]\n" +
-			"[*3*]final[*3*]\n" +
-			"[*4*]@AnAnnotation2(\"b\")[*4*]\n" +
-			"#\n" +
-			"class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]public[*1*] [*2*]@AnAnnotation(\"a\")[*2*] [*3*]final[*3*] [*4*]@AnAnnotation2(\"b\")[*4*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:MODIFIER,[11,6],,,[N/A]\n" +
-			"2:SINGLE_MEMBER_ANNOTATION,[18,18],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:MODIFIER,[37,5],,,[N/A]\n" +
-			"4:SINGLE_MEMBER_ANNOTATION,[43,19],,,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 6)\n" +
-			"	#\n" +
-			"	^\n" +
-			"Syntax error on token \"Invalid Character\", delete this token\n",
-			result);
-}
-public void testBug130778g() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]public[*1*]\n" +
-			"[*2*]@AnAnnotation(\"a\")[*2*]\n" +
-			"[*3*]final[*3*]\n" +
-			"[*4*]@AnAnnotation2(\"b\")[*4*]\n" +
-			"class X {\n" +
-			"  #\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]public[*1*] [*2*]@AnAnnotation(\"a\")[*2*] [*3*]final[*3*] [*4*]@AnAnnotation2(\"b\")[*4*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:MODIFIER,[11,6],,,[N/A]\n" +
-			"2:SINGLE_MEMBER_ANNOTATION,[18,18],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:MODIFIER,[37,5],,,[N/A]\n" +
-			"4:SINGLE_MEMBER_ANNOTATION,[43,19],,,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 7)\n" +
-			"	#\n" +
-			"	^\n" +
-			"Syntax error on token \"Invalid Character\", delete this token\n",
-			result);
-}
-public void testBug130778h() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]@AnAnnotation(value=\"a\")[*1*]\n" +
-			"[*2*]@AnAnnotation2(value=\"b\")[*2*]\n" +
-			"[*3*]public[*3*] class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]@AnAnnotation(value=\"a\")[*1*] [*2*]@AnAnnotation2(value=\"b\")[*2*] [*3*]public[*3*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:NORMAL_ANNOTATION,[11,24],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"2:NORMAL_ANNOTATION,[36,25],,,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"3:MODIFIER,[62,6],,,[N/A]\n" +
-			"===== Problems =====\n" +
-			"No problem",
-			result);
-}
-public void testBug130778i() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]@AnAnnotation(value=[*1*])\n" +
-			"[*2*]@AnAnnotation2(value=\"b\")[*2*]\n" +
-			"[*3*]public[*3*] class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]@AnAnnotation(value=$missing$)[*1*] [*2*]@AnAnnotation2(value=\"b\")[*2*] [*3*]public[*3*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:NORMAL_ANNOTATION,[11,20],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"2:NORMAL_ANNOTATION,[33,25],,,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"3:MODIFIER,[59,6],,,[N/A]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(value=)\n" +
-			"	                   ^\n" +
-			"Syntax error on token \"=\", MemberValue expected after this token\n",
-			result);
-}
-public void testBug130778j() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]@AnAnnotation(value=\"a\")[*1*]\n" +
-			"[*2*]@AnAnnotation2(value=[*2*])\n" +
-			"[*3*]public[*3*] class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]@AnAnnotation(value=\"a\")[*1*] [*2*]@AnAnnotation2(value=$missing$)[*2*] [*3*]public[*3*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:NORMAL_ANNOTATION,[11,24],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"2:NORMAL_ANNOTATION,[36,21],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"3:MODIFIER,[59,6],,,[N/A]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 3)\n" +
-			"	@AnAnnotation2(value=)\n" +
-			"	                    ^\n" +
-			"Syntax error on token \"=\", MemberValue expected after this token\n",
-			result);
-}
-public void testBug130778k() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]@AnAnnotation(value=[*1*])\n" +
-			"[*2*]@AnAnnotation2(value=[*2*])\n" +
-			"[*3*]public[*3*] class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]@AnAnnotation(value=$missing$)[*1*] [*2*]@AnAnnotation2(value=$missing$)[*2*] [*3*]public[*3*] class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:NORMAL_ANNOTATION,[11,20],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"2:NORMAL_ANNOTATION,[33,21],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"3:MODIFIER,[56,6],,,[N/A]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(value=)\n" +
-			"	                    ^\n" +
-			"Syntax error on token \")\", delete this token\n" +
-			"2. ERROR in /Converter15/src/a/X.java (at line 3)\n" +
-			"	@AnAnnotation2(value=)\n" +
-			"	                    ^\n" +
-			"Syntax error on token \"=\", ) expected\n",
-			result);
-}
-public void testBug130778l() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"public class X {\n" +
-			"  public void foo(){\n" +
-			"    [*1*]@AnAnnotation(value=[*1*])\n" +
-			"    [*2*]@AnAnnotation2(value=\"b\")[*2*]\n" +
-			"    class Y {}\n" +
-			"  }\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"public class X {\n" +
-			"  public void foo(){\n" +
-			"[*1*]@AnAnnotation(value=$missing$)[*1*] [*2*]@AnAnnotation2(value=\"b\")[*2*] class Y {\n" +
-			"    }\n" +
-			"  }\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:NORMAL_ANNOTATION,[53,20],,RECOVERED,[ANNOTATION,La/X$115$Y;@La/AnAnnotation;,]\n" +
-			"2:NORMAL_ANNOTATION,[79,25],,,[ANNOTATION,La/X$115$Y;@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 4)\n" +
-			"	@AnAnnotation(value=)\n" +
-			"	                   ^\n" +
-			"Syntax error on token \"=\", MemberValue expected after this token\n",
-			result);
-}
-public void testBug130778m() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"public class X {\n" +
-			"  public void foo(){\n" +
-			"    [*1*]@AnAnnotation(value=)[*1*]\n" +
-			"    [*2*]@AnAnnotation2(value=\"b\")[*2*]\n" +
-			"    int i;\n" +
-			"  }\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"public class X {\n" +
-			"  public void foo(){\n" +
-			"    [*1*]@AnAnnotation(value=$missing$)[*1*] [*2*]@AnAnnotation2(value=\"b\")[*2*] int i;\n" +
-			"  }\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:NORMAL_ANNOTATION,[53,21],,,[ANNOTATION,La/X;.foo()V#i@La/AnAnnotation;,]\n" +
-			"2:NORMAL_ANNOTATION,[79,25],,,[ANNOTATION,La/X;.foo()V#i@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 4)\n" +
-			"	@AnAnnotation(value=)\n" +
-			"	                   ^\n" +
-			"Syntax error on token \"=\", MemberValue expected after this token\n",
-			result);
-}
-public void testBug130778n() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[1];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String name1();\n" +
-			"  String name2();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*][*2*]@AnAnnotation([*3*]name1=\"a\"[*3*][*2*], name2)\n" +
-			"public class X {\n" +
-			"}[*1*]\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*][*2*]@AnAnnotation([*3*]name1=\"a\"[*3*])[*2*] public class X {\n" +
-			"}[*1*]\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:TYPE_DECLARATION,[11,50],,MALFORMED|RECOVERED,[TYPE,La/X;,]\n" +
-			"2:NORMAL_ANNOTATION,[11,23],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:MEMBER_VALUE_PAIR,[25,9],,,[N/A]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(name1=\"a\", name2)\n" +
-			"	                       ^\n" +
-			"Syntax error on token \",\", . expected\n",
-			result);
-}
-public void testBug130778o() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[1];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String name1();\n" +
-			"  String name2();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*][*2*]@AnAnnotation([*3*]name1=[*3*][*2*])\n" +
-			"public class X {\n" +
-			"}[*1*]\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*][*2*]@AnAnnotation([*3*]name1=$missing$[*3*])[*2*] public class X {\n" +
-			"}[*1*]\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:TYPE_DECLARATION,[11,40],,MALFORMED,[TYPE,La/X;,]\n" +
-			"2:NORMAL_ANNOTATION,[11,20],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:MEMBER_VALUE_PAIR,[25,6],,RECOVERED,[N/A]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(name1=)\n" +
-			"	                   ^\n" +
-			"Syntax error on token \"=\", MemberValue expected after this token\n",
-			result);
-}
-public void testBug130778p() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  AnAnnotation2 value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]@AnAnnotation([*2*]value=[*3*]@AnAnnotation2(value=\"a\")[*3*][*2*])[*1*]\n" +
-			"public class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]@AnAnnotation([*2*]value=[*3*]@AnAnnotation2(value=\"a\")[*3*][*2*])[*1*] public class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:NORMAL_ANNOTATION,[11,46],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"2:MEMBER_VALUE_PAIR,[25,31],,,[N/A]\n" +
-			"3:NORMAL_ANNOTATION,[31,25],,,[ANNOTATION,@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"No problem",
-			result);
-}
-public void testBug130778q() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  AnAnnotation2 value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]@AnAnnotation([*2*]value=[*3*]@AnAnnotation2(value=\"a\")[*3*][*2*][*1*]\n" +
-			"public class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]@AnAnnotation([*2*]value=[*3*]@AnAnnotation2(value=\"a\")[*3*][*2*])[*1*] public class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:NORMAL_ANNOTATION,[11,45],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"2:MEMBER_VALUE_PAIR,[25,31],,,[N/A]\n" +
-			"3:NORMAL_ANNOTATION,[31,25],,RECOVERED,[ANNOTATION,@La/AnAnnotation2;,]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(value=@AnAnnotation2(value=\"a\")\n" +
-			"	                                            ^\n" +
-			"Syntax error, insert \")\" to complete Modifiers\n",
-			result);
-}
-public void testBug130778r() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  AnAnnotation2 value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*][*2*]@AnAnnotation(value=[*2*][*3*]@AnAnnotation2(value=[*3*]))\n" +
-			"public class X {\n" +
-			"}[*1*]\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*][*2*]@AnAnnotation(value=$missing$)[*2*] public class X {\n" +
-			"}[*1*]\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:TYPE_DECLARATION,[11,62],,MALFORMED|RECOVERED,[TYPE,La/X;,]\n" +
-			"2:NORMAL_ANNOTATION,[11,20],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:No corresponding node\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(value=@AnAnnotation2(value=))\n" +
-			"	                                        ^\n" +
-			"Syntax error on token \"=\", MemberValue expected after this token\n",
-			result);
-}
-public void testBug130778s() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value1();\n" +
-			"  AnAnnotation2 value2();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*][*2*]@AnAnnotation([*3*]value1=[*3*][*2*],[*4*]value=[*5*]@AnAnnotation2(value=\"b\")[*5*][*4*])\n" +
-			"public class X {\n" +
-			"}[*1*]\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*][*2*]@AnAnnotation([*3*]value1=$missing$[*3*])[*2*] [*5*]@AnAnnotation2(value=\"b\")[*5*] public class X {\n" +
-			"}[*1*]\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:TYPE_DECLARATION,[11,73],,MALFORMED,[TYPE,La/X;,]\n" +
-			"2:NORMAL_ANNOTATION,[11,21],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"3:MEMBER_VALUE_PAIR,[25,7],,RECOVERED,[N/A]\n" +
-			"5:NORMAL_ANNOTATION,[39,25],,,[ANNOTATION,La/X;@La/AnAnnotation2;,]\n" +
-			"4:No corresponding node\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(value1=,value=@AnAnnotation2(value=\"b\"))\n" +
-			"	                    ^\n" +
-			"Syntax error on token \"=\", MemberValue expected after this token\n",
-			result);
-}
-public void testBug130778t() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[1];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]@AnAnnotation(\"b\")[*1*]\n" +
-			"public class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]@AnAnnotation(\"b\")[*1*] public class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:SINGLE_MEMBER_ANNOTATION,[11,18],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"===== Problems =====\n" +
-			"No problem",
-			result);
-}
-public void testBug130778u() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[1];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]@AnAnnotation([*2*]\"b\"[*2*][*1*]\n" +
-			"public class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]@AnAnnotation([*2*]\"b\"[*2*])[*1*] public class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:SINGLE_MEMBER_ANNOTATION,[11,17],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"2:STRING_LITERAL,[25,3],,,[N/A]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(\"b\"\n" +
-			"	              ^^^\n" +
-			"Syntax error, insert \")\" to complete Modifiers\n",
-			result);
-}
-public void testBug130778v() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[2];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  AnAnnotation2 value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	this.workingCopies[1] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation2.java",
-			"package a;\n" +
-			"public @interface AnAnnotation2 {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]@AnAnnotation[*1*](@AnAnnotation2(\"b\"\n" +
-			"public class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]@AnAnnotation[*1*] public class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:MARKER_ANNOTATION,[11,13],,,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(@AnAnnotation2(\"b\"\n" +
-			"	                             ^^^\n" +
-			"Syntax error, insert \")\" to complete SingleMemberAnnotation\n" +
-			"2. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(@AnAnnotation2(\"b\"\n" +
-			"	                             ^^^\n" +
-			"Syntax error, insert \")\" to complete Modifiers\n",
-			result);
-}
-public void testBug130778x() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[1];
-
-	this.workingCopies[0] = getWorkingCopy(
-			"/Converter15/src/a/AnAnnotation.java",
-			"package a;\n" +
-			"public @interface AnAnnotation {\n" +
-			"  String value();\n" +
-			"}\n",
-			true/*resolve*/);
-
-	ASTResult result = this.buildMarkedAST(
-			"/Converter15/src/a/X.java",
-			"package a;\n" +
-			"[*1*]@AnAnnotation([*2*]\"a\"[*2*][*1*], [*3*]\"b\"[*3*])\n" +
-			"public class X {\n" +
-			"}\n");
-
-	assertASTResult(
-			"===== AST =====\n" +
-			"package a;\n" +
-			"[*1*]@AnAnnotation([*2*]\"a\"[*2*])[*1*] public class X {\n" +
-			"}\n" +
-			"\n" +
-			"===== Details =====\n" +
-			"1:SINGLE_MEMBER_ANNOTATION,[11,17],,RECOVERED,[ANNOTATION,La/X;@La/AnAnnotation;,]\n" +
-			"2:STRING_LITERAL,[25,3],,,[N/A]\n" +
-			"3:No corresponding node\n" +
-			"===== Problems =====\n" +
-			"1. ERROR in /Converter15/src/a/X.java (at line 2)\n" +
-			"	@AnAnnotation(\"a\", \"b\")\n" +
-			"	                 ^\n" +
-			"Syntax error on token \",\", < expected\n",
-			result);
-}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java
index c644091..2c10016 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java
@@ -183,11 +183,11 @@
   :giro */
 				assertEquals("Wrong number of child properties", 117, childProperties.size());
 				
-			 // 1 new child list property: PRECEDENCES_PROPERTY
+			 // 2 new child list properties: TypeDeclaration.PRECEDENCES_PROPERTY, PackageDeclaration.MODIFIERS_PROPERTY  
 /* orig:
 				assertEquals("Wrong number of child list properties", 52, childListProperties.size());
   :giro */
-				assertEquals("Wrong number of child list properties", 53, childListProperties.size());
+				assertEquals("Wrong number of child list properties", 54, childListProperties.size());
 // SH}
 		}
 		// visit should rebuild tree
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/GetKeyVisitor.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/GetKeyVisitor.java
index 9f37cd2..6d67b5e 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/GetKeyVisitor.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/GetKeyVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -10,7 +10,8 @@
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.dom;
 
-import junit.framework.Assert;
+import junit.framework.TestCase;
+
 import org.eclipse.jdt.core.dom.ASTVisitor;
 import org.eclipse.jdt.core.dom.ClassInstanceCreation;
 import org.eclipse.jdt.core.dom.IMethodBinding;
@@ -22,8 +23,8 @@
 	 */
 	public boolean visit(ClassInstanceCreation node) {
 		IMethodBinding constructorBinding = node.resolveConstructorBinding();
-		Assert.assertNotNull(constructorBinding);
-		Assert.assertNotNull(constructorBinding.getKey());
+		TestCase.assertNotNull(constructorBinding);
+		TestCase.assertNotNull(constructorBinding.getKey());
 		return super.visit(node);
 	}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java
index b650db3..8d26b4e 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -12938,4 +12938,104 @@
 		"}\n"
 	);
 }
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=405038
+//To verify that the whitespace options for resources in try statement work correctly
+public void testBug405038() throws Exception {
+	this.formatterPrefs = null;
+	this.formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+	this.formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+	String source =
+		"public class FormatterError {\n" +
+		"  int foo(int a, int b, int c) {\n" + 
+		"        return a + b + ++c;\n" + 
+		"    }\n" +
+		"}\n";
+	formatSource(source,
+		"public class FormatterError {\n" + 
+		"	int foo(int a, int b, int c) {\n" + 
+		"		return a+b+ ++c;\n" + 
+		"	}\n" + 
+		"}\n"
+	);
+}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=405038
+//To verify that the whitespace options for resources in try statement work correctly
+public void testBug405038_2() throws Exception {
+	this.formatterPrefs = null;
+	this.formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+	this.formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+	String source =
+		"public class FormatterError {\n" +
+		"  int foo(int a, int b, int c) {\n" + 
+		"        return a + ++b + c;\n" + 
+		"    }\n" +
+		"}\n";
+	formatSource(source,
+		"public class FormatterError {\n" + 
+		"	int foo(int a, int b, int c) {\n" + 
+		"		return a+ ++b+c;\n" + 
+		"	}\n" + 
+		"}\n"
+	);
+}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=405038
+//To verify that the whitespace options for resources in try statement work correctly
+public void testBug405038_3() throws Exception {
+	this.formatterPrefs = null;
+	this.formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+	this.formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+	String source =
+		"public class FormatterError {\n" +
+		"  int foo(int a, int b, int c) {\n" + 
+		"        return a - --b + c;\n" + 
+		"    }\n" +
+		"}\n";
+	formatSource(source,
+		"public class FormatterError {\n" + 
+		"	int foo(int a, int b, int c) {\n" + 
+		"		return a- --b+c;\n" + 
+		"	}\n" + 
+		"}\n"
+	);
+}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=405038
+//To verify that the whitespace options for resources in try statement work correctly
+public void testBug405038_4() throws Exception {
+	this.formatterPrefs = null;
+	this.formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+	this.formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+	String source =
+		"public class FormatterError {\n" +
+		"  int foo(int a, int b, int c) {\n" + 
+		"        return a - -b + c;\n" + 
+		"    }\n" +
+		"}\n";
+	formatSource(source,
+		"public class FormatterError {\n" + 
+		"	int foo(int a, int b, int c) {\n" + 
+		"		return a- -b+c;\n" + 
+		"	}\n" + 
+		"}\n"
+	);
+}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=405038
+//To verify that the whitespace options for resources in try statement work correctly
+public void testBug405038_5() throws Exception {
+	this.formatterPrefs = null;
+	this.formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+	this.formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+	String source =
+		"public class FormatterError {\n" +
+		"  int foo(int a, int b, int c) {\n" + 
+		"        return a - -b + ++c;\n" + 
+		"    }\n" +
+		"}\n";
+	formatSource(source,
+		"public class FormatterError {\n" + 
+		"	int foo(int a, int b, int c) {\n" + 
+		"		return a- -b+ ++c;\n" + 
+		"	}\n" + 
+		"}\n"
+	);
+}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
index 7ab7d17..e798a32 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
@@ -2770,6 +2770,7 @@
 	}
 	public void setUpSuite() throws Exception {
 		super.setUpSuite();
+
 		// ensure autobuilding is turned off
 		IWorkspaceDescription description = getWorkspace().getDescription();
 		if (description.isAutoBuilding()) {
@@ -2779,7 +2780,7 @@
 	}
 	protected void setUp () throws Exception {
 		super.setUp();
-		System.setProperty("jdt.bug.367669", "non-null");
+
 		if (NameLookup.VERBOSE || BasicSearchEngine.VERBOSE || JavaModelManager.VERBOSE) {
 			System.out.println("--------------------------------------------------------------------------------");
 			System.out.println("Running test "+getName()+"...");
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 82c0dc8..35fa5c4 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
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.model;
 
+import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -50,6 +51,7 @@
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.eclipse.jdt.internal.core.ExternalFoldersManager;
 import org.eclipse.jdt.internal.core.JarPackageFragmentRoot;
+import org.eclipse.jdt.internal.core.JavaModelManager;
 import org.eclipse.jdt.internal.core.JavaProject;
 import org.eclipse.jdt.internal.core.util.Util;
 
@@ -504,7 +506,33 @@
 
 		String externalLib = externalFolder + "/lib";
 		IJavaProject javaProject = null;
-		javaProject = createJavaProject("P", new String[0], new String[] {externalLib}, "");
+		try {
+			javaProject = createJavaProject("P", new String[0], new String[] {externalLib}, "");
+		}
+		catch (Exception e) {
+			IFolder folder = getFolder(externalLib);
+			System.out.println("----------  This information is logged for debugging purposes as this test fails sporadically.---------");
+			System.out.println("Failing when creating Link folder for: " + externalFolder);
+			System.out.println("Existing? " + folder.exists());
+			IProject externalFolderProject = JavaModelManager.getExternalManager().getExternalFoldersProject();
+			IFile externalProjectFile = externalFolderProject.getFile(".project");
+			if (externalProjectFile.exists()) {
+				System.out.println("External Folder Project exists with following content:");
+				BufferedInputStream bs = new BufferedInputStream(externalProjectFile.getContents());
+				int available = 0;
+				while ((available = bs.available()) > 0) {
+					byte[] contents = new byte[available];
+					bs.read(contents);
+					System.out.println(new String(contents));
+				}
+				bs.close();
+			}
+			else {
+				System.out.println("External folders project doesn't exist.");
+			}
+			System.out.println("----------  Debug information ends ---------");
+			throw e;
+		}
 		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(externalLib);
 		attachSource(root, externalFolder + "/src228639", "");
 		IType type = root.getPackageFragment("p").getClassFile("X.class").getType();
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathTests.java
index ecd021f..f28ad7e 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathTests.java
@@ -9,6 +9,7 @@
  *     IBM Corporation - initial API and implementation
  *     Terry Parker <tparker@google.com> - DeltaProcessor misses state changes in archive files, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=357425,
  *     									   Fup of 357425: ensure all reported regressions are witnessed by tests, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=361922
+ *     Thirumala Reddy Mutchukota <thirumala@google.com> - Contribution to bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=411423
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.model;
 
@@ -345,6 +346,7 @@
 	suite.addTest(new ClasspathTests("testBug220928a"));
 	suite.addTest(new ClasspathTests("testBug220928b"));
 	suite.addTest(new ClasspathTests("testBug396299"));
+	suite.addTest(new ClasspathTests("testBug411423"));
 	return suite;
 }
 public void setUpSuite() throws Exception {
@@ -4247,6 +4249,7 @@
 		assertFalse("Non-existing jar should be invalid", status2.isOK());
 	} finally {
 		deleteExternalResource(transitioningJarName);
+		deleteExternalResource("invalidJar.jar");
 		deleteProject("P");
 	}
 }
@@ -7460,4 +7463,76 @@
 		deleteProject("P1");
 	}
 }
+/**
+ * @bug 411423: JavaProject.resolveClasspath is spending more than 90% time on ExternalFoldersManager.isExternalFolderPath
+ * Tests that
+ * 1) External file paths are cached during classpath resolution and can be retrieved later on
+ * 2) A full save (after resetting the external files cache) caches the external files information
+ * 3) when a project is deleted, the external files cache is reset.
+ *
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=411423"
+ * @throws Exception
+ */
+public void testBug411423() throws Exception {
+	try {
+		IJavaProject proj = this.createJavaProject("P", new String[] {}, "bin");
+
+		createFile("/P/internal.jar", "");
+		createFolder("/P/internalSrcFolder");
+		createExternalFile("external.jar", "");
+		createExternalFile("external-src.jar", "");
+		createExternalFolder("externalFolder");
+		createExternalFolder("externalSrcFolder");
+
+		IClasspathEntry[] classpath = new IClasspathEntry[3];
+		classpath[0] = JavaCore.newLibraryEntry(new Path("/P/internal.jar"), new Path("/P/internalSrcFolder"), null);
+		classpath[1] = JavaCore.newLibraryEntry(new Path(getExternalFile("external.jar").getPath()), new Path(getExternalFile("external-src.jar").getPath()), null);
+		classpath[2] = JavaCore.newLibraryEntry(new Path(getExternalFile("externalFolder").getPath()), new Path(getExternalFile("externalSrcFolder").getPath()), null);
+
+		proj.setRawClasspath(classpath, null);
+		waitForAutoBuild();
+		JavaModelManager manager = JavaModelManager.getJavaModelManager();
+		assertFalse("Internal Jar", manager.isExternalFile(classpath[0].getPath()));
+		assertFalse("Internal Folder", manager.isExternalFile(classpath[0].getSourceAttachmentPath()));
+		assertTrue("External Jar", manager.isExternalFile(classpath[1].getPath()));
+		assertTrue("External Jar", manager.isExternalFile(classpath[1].getSourceAttachmentPath()));
+		assertFalse("External Folder", manager.isExternalFile(classpath[2].getPath()));
+		assertFalse("External Folder", manager.isExternalFile(classpath[2].getSourceAttachmentPath()));
+
+		((JavaProject)proj).resetResolvedClasspath();
+		proj.getResolvedClasspath(true);
+		assertFalse("Internal Jar", manager.isExternalFile(classpath[0].getPath()));
+		assertFalse("Internal Jar", manager.isExternalFile(classpath[0].getSourceAttachmentPath()));
+		assertTrue("External Jar", manager.isExternalFile(classpath[1].getPath()));
+		assertTrue("External Jar", manager.isExternalFile(classpath[1].getSourceAttachmentPath()));
+		assertFalse("External Folder", manager.isExternalFile(classpath[2].getPath()));
+		assertFalse("External Folder", manager.isExternalFile(classpath[2].getSourceAttachmentPath()));
+
+		((JavaProject)proj).resetResolvedClasspath();
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		workspace.save(true, null);
+		assertFalse("Internal Jar", manager.isExternalFile(classpath[0].getPath()));
+		assertFalse("Internal Jar", manager.isExternalFile(classpath[0].getSourceAttachmentPath()));
+		assertTrue("External Jar", manager.isExternalFile(classpath[1].getPath()));
+		assertTrue("External Jar", manager.isExternalFile(classpath[1].getSourceAttachmentPath()));
+		assertFalse("External Folder", manager.isExternalFile(classpath[2].getPath()));
+		assertFalse("External Folder", manager.isExternalFile(classpath[2].getSourceAttachmentPath()));
+
+		this.deleteProject("P");
+		assertFalse("Cache reset", manager.isExternalFile(classpath[0].getPath()));
+		assertFalse("Cache reset", manager.isExternalFile(classpath[0].getSourceAttachmentPath()));
+		assertFalse("Cache reset", manager.isExternalFile(classpath[1].getPath()));
+		assertFalse("Cache reset", manager.isExternalFile(classpath[1].getSourceAttachmentPath()));
+		assertFalse("Cache reset", manager.isExternalFile(classpath[2].getPath()));
+		assertFalse("Cache reset", manager.isExternalFile(classpath[2].getSourceAttachmentPath()));
+	} finally {
+		IProject proj = this.getProject("P");
+		if ( proj != null && proj.exists())
+			this.deleteProject("P");
+		deleteExternalResource("external.jar");
+		deleteExternalResource("external-src.jar");
+		deleteExternalResource("externalFolder");
+		deleteExternalResource("externalSrcFolder");
+	}
+}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionContextTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionContextTests.java
index 829bb99..06786d6 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionContextTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionContextTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * Copyright (c) 2005, 2012 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
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
index a050ffe..af4f1ee 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
@@ -1045,6 +1045,8 @@
 	suite.addTest(new CompletionTests("testBug385858b"));
 	suite.addTest(new CompletionTests("testBug385858c"));
 	suite.addTest(new CompletionTests("testBug385858d"));
+	suite.addTest(new CompletionTests("testBug402574"));
+	suite.addTest(new CompletionTests("testBug370971"));
 	return suite;
 }
 public CompletionTests(String name) {
@@ -1058,6 +1060,21 @@
 	}
 	super.setUpSuite();
 }
+public void tearDownSuite() throws Exception {
+	if (COMPLETION_SUITES == null) {
+		deleteProject("Completion");
+	} else {
+		COMPLETION_SUITES.remove(getClass());
+		if (COMPLETION_SUITES.size() == 0) {
+			deleteProject("Completion");
+			COMPLETION_SUITES = null;
+		}
+	}
+	if (COMPLETION_SUITES == null) {
+		COMPLETION_PROJECT = null;
+	}
+	super.tearDownSuite();
+}
 private String getVarClassSignature(IEvaluationContext context) {
 	char[] varClassName = ((EvaluationContextWrapper)context).getVarClassName();
 	return Signature.createTypeSignature(varClassName, true);
@@ -13796,6 +13813,26 @@
 		} else {
 			assertResults(
 				"[POTENTIAL_METHOD_DECLARATION]{, LCompletionSuperClass;, ()V, , null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_NON_RESTRICTED)+"}\n" +
+				"abstract[KEYWORD]{abstract, null, null, abstract, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+//{ObjectTeams: new keyword:
+				"callin[KEYWORD]{callin, null, null, callin, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n" +
+// SH}
+				"class[KEYWORD]{class, null, null, class, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"enum[KEYWORD]{enum, null, null, enum, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"final[KEYWORD]{final, null, null, final, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"interface[KEYWORD]{interface, null, null, interface, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"native[KEYWORD]{native, null, null, native, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"private[KEYWORD]{private, null, null, private, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"protected[KEYWORD]{protected, null, null, protected, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"public[KEYWORD]{public, null, null, public, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"static[KEYWORD]{static, null, null, static, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"strictfp[KEYWORD]{strictfp, null, null, strictfp, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"synchronized[KEYWORD]{synchronized, null, null, synchronized, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+//{ObjectTeams: new keyword:
+				"team[KEYWORD]{team, null, null, team, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n" +
+// SH}
+				"transient[KEYWORD]{transient, null, null, transient, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
+				"volatile[KEYWORD]{volatile, null, null, volatile, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED)+"}\n"+
 				"CompletionMethodDeclaration5[TYPE_REF]{CompletionMethodDeclaration5, , LCompletionMethodDeclaration5;, null, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED)+"}\n"+
 				"clone[METHOD_DECLARATION]{protected Object clone() throws CloneNotSupportedException, Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_METHOD_OVERIDE + R_NON_RESTRICTED)+"}\n"+
 				"eqFoo[METHOD_DECLARATION]{public int eqFoo(int a, Object b), LCompletionSuperClass;, (ILjava.lang.Object;)I, eqFoo, (a, b), "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_METHOD_OVERIDE + R_NON_RESTRICTED)+"}\n"+
@@ -25776,4 +25813,174 @@
 			"completion token location={CONSTRUCTOR_START}",
 			requestor.getContext());
 }
+// Bug 402574 - Autocomplete does not recognize all enum constants when constants override methods
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=402574
+public void testBug402574() throws JavaModelException {
+	Map options = COMPLETION_PROJECT.getOptions(true);
+	Object savedOptionCompliance = options.get(CompilerOptions.OPTION_Source);
+	try {
+		options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_7);
+		COMPLETION_PROJECT.setOptions(options);
+		this.workingCopies = new ICompilationUnit[2];
+		this.workingCopies[1] = getWorkingCopy(
+			"/Completion/src/test/ExampleEnumNoAutocomplete.java",
+		    "public enum ExampleEnumNoAutocomplete {\n" +		
+			"    STUFF(\"a\", \"b\") {\n" +
+			"    @Override\n" +
+			"    public String getProperty1() {\n"+
+			"        return super.getProperty1().toUpperCase();\n" +
+			"    }\n" +
+			"    @Override\n" +
+			"			public String getSomething() {\n" +
+			"				throw new UnsupportedOperationException(\"What is this, I don't even?!\");\n" +
+			"			}\n" +
+			"		},\n" +
+			"		THINGS(\"c\", \"d\") {\n" +
+			"			@Override\n" +
+			"			public String getProperty1() {\n" +
+			"				return super.getProperty2();\n" +
+			"			}\n" +
+			"			@Override\n" +
+			"			public String getProperty2() {\n" +
+			"				return super.getProperty1();\n" +
+			"			}\n" +
+			"			@Override\n" +
+			"			public String getSomething() {\n" +
+			"				throw new UnsupportedOperationException(\"What is this, I don't even?!\");\n" +
+			"			}\n" +
+			"		},\n" +
+			"		MORE_STUFF(\"e\", \"f\") {\n" +
+			"			@Override\n" +
+			"			public String getProperty1() {\n" +
+			"				return getProperty2();\n" +
+			"			}\n" +
+			"			@Override\n" +
+			"			public String getSomething() {\n" +
+			"				throw new UnsupportedOperationException(\"What is this, I don't even?!\");\n" +
+			"			}\n" +
+			"		},\n" +
+			"		OTHER(\"g\", \"h\") {\n" +
+			"			@Override\n" +
+			"			public String getSomething() {\n" +
+			"				throw new UnsupportedOperationException(\"What is this, I don't even?!\");\n" +
+			"			}\n" +
+			"		},\n" +
+			"		STILL_OTHER(\"i\", \"j\") {\n" +
+			"			@Override\n" +
+			"			public String getSomething() {\n" +
+			"				throw new UnsupportedOperationException(\"What is this, I don't even?!\");\n" +
+			"			}\n" +
+			"		},\n" +
+			"		IT_MAY_BE_DUE_TO_MIXING_PERHAPS(\"k\", \"l\") {\n" +
+			"			@Override\n" +
+			"			public String getProperty1() {\n" +
+			"				throw new UnsupportedOperationException(\"What is this, I don't even?!\");\n" +
+			"			}\n" +
+			"			@Override\n" +
+			"			public String getProperty2() {\n" +
+			"				throw new UnsupportedOperationException(\"What is this, I don't even?!\");\n" +
+			"			}\n" +
+			"			@Override\n" +
+			"			public String getSomething() {\n" +
+			"				throw new UnsupportedOperationException(\"What is this, I don't even?!\");\n" +
+			"			}\n" +
+			"		};\n" +		
+			"		private final String property1;\n" +
+			"		private final String property2;\n" +	
+			"		ExampleEnumNoAutocomplete(final String property1, final String property2) {\n" +
+			"			this.property1 = property1;\n" +
+			"			this.property2 = property2;\n" +
+			"		}\n" +
+			"		public String getProperty1() {\n" +
+			"			return property1;\n" +
+			"		}\n" +
+			"		public String getProperty2() {\n" +
+			"			return property2;\n" +
+			"		}\n" +
+			"		public abstract String getSomething();\n" +
+			"	}\n");
+		this.workingCopies[0] = getWorkingCopy(
+			"/Completion/src/test/Tester.java",
+			"import java.util.EnumMap;\n" +
+			"import java.util.Map;\n" +
+			"public class Tester {\n" +
+			"	public static void main(String[] args) {\n" +
+			"		Map<ExampleEnumNoAutocomplete, Map<String, Object>> huh = new EnumMap<ExampleEnumNoAutocomplete, Map<String, Object>>(\n" +
+			"				ExampleEnumNoAutocomplete.class);\n" +
+			"		huh.put(ExampleEnumNoAutocomplete.STUFF, null);\n" +
+			"		ExampleEnumNoAutocomplete.   \n" +
+			"	}\n" +
+			"}\n");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, false, false, true);
+		requestor.allowAllRequiredProposals();
+		requestor.setRequireExtendedContext(true);
+		requestor.setComputeEnclosingElement(true);
+		NullProgressMonitor monitor = new NullProgressMonitor();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "		ExampleEnumNoAutocomplete.";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner, monitor);
+		
+		assertResults(
+				"IT_MAY_BE_DUE_TO_MIXING_PERHAPS[FIELD_REF]{IT_MAY_BE_DUE_TO_MIXING_PERHAPS, Ltest.ExampleEnumNoAutocomplete;, Ltest.ExampleEnumNoAutocomplete;, IT_MAY_BE_DUE_TO_MIXING_PERHAPS, null, 26}\n" +
+				"MORE_STUFF[FIELD_REF]{MORE_STUFF, Ltest.ExampleEnumNoAutocomplete;, Ltest.ExampleEnumNoAutocomplete;, MORE_STUFF, null, 26}\n" +
+				"OTHER[FIELD_REF]{OTHER, Ltest.ExampleEnumNoAutocomplete;, Ltest.ExampleEnumNoAutocomplete;, OTHER, null, 26}\n" +
+				"STILL_OTHER[FIELD_REF]{STILL_OTHER, Ltest.ExampleEnumNoAutocomplete;, Ltest.ExampleEnumNoAutocomplete;, STILL_OTHER, null, 26}\n" +
+				"STUFF[FIELD_REF]{STUFF, Ltest.ExampleEnumNoAutocomplete;, Ltest.ExampleEnumNoAutocomplete;, STUFF, null, 26}\n" +
+				"THINGS[FIELD_REF]{THINGS, Ltest.ExampleEnumNoAutocomplete;, Ltest.ExampleEnumNoAutocomplete;, THINGS, null, 26}\n" +
+				"class[FIELD_REF]{class, null, Ljava.lang.Class<Ltest.ExampleEnumNoAutocomplete;>;, class, null, 26}\n" +
+				"valueOf[METHOD_REF]{valueOf(), Ltest.ExampleEnumNoAutocomplete;, (Ljava.lang.String;)Ltest.ExampleEnumNoAutocomplete;, valueOf, (arg0), 26}\n" +
+				"values[METHOD_REF]{values(), Ltest.ExampleEnumNoAutocomplete;, ()[Ltest.ExampleEnumNoAutocomplete;, values, null, 26}",
+				requestor.getResults());
+		assertEquals(false,
+			requestor.canUseDiamond(0));
+	} finally {
+		// Restore compliance settings.
+		options.put(CompilerOptions.OPTION_Source, savedOptionCompliance);
+		COMPLETION_PROJECT.setOptions(options);	
+	}
+}
+//Bug 370971 - Content Assist autocomplete broken within an array of anonymous classes instances
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=370971
+public void testBug370971() throws JavaModelException {
+	Map options = COMPLETION_PROJECT.getOptions(true);
+	Object savedOptionCompliance = options.get(CompilerOptions.OPTION_Source);
+	try {
+		options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_7);
+		COMPLETION_PROJECT.setOptions(options);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+			"/Completion/src/test/ExampleEnumNoAutocomplete.java",
+			"public class X {\n" +
+			"	private Object[] items = new Object[] {\n" +
+			"        new Object() {\n" +
+			"              @Override\n" +
+			"              public String toString() {\n" +
+			"                  return super.toS;\n" +
+			"              }\n" +
+			"        },\n" +
+			"        new Object() { }\n" +
+			"    } ;\n" +
+			"}\n");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, false, false, true);
+		requestor.allowAllRequiredProposals();
+		requestor.setRequireExtendedContext(true);
+		requestor.setComputeEnclosingElement(true);
+		NullProgressMonitor monitor = new NullProgressMonitor();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "return super.toS";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner, monitor);
+		
+		assertResults(
+				"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 65}",
+				requestor.getResults());
+		assertEquals(false,
+			requestor.canUseDiamond(0));
+	} finally {
+		// Restore compliance settings.
+		options.put(CompilerOptions.OPTION_Source, savedOptionCompliance);
+		COMPLETION_PROJECT.setOptions(options);	
+	}
+}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java
index b5e07e9..51429ca 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -2213,38 +2213,40 @@
  * Test that the correct package fragments exist in the project.
  * (regression test for bug 65693 Package Explorer shows .class files instead of .java)
  */
-public void testRootGetPackageFragments3() throws CoreException {
+public void _testRootGetPackageFragments3() throws CoreException {
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=403414
+	// Test disabled temporarily
 	try {
-		IJavaProject p1 = createJavaProject("P1");
+		IJavaProject p1 = createJavaProject("Bug65693_1");
 		createFile(
-			"/P1/X.java",
+			"/Bug65693_1/X.java",
 			"public class X {\n" +
 			"}"
 		);
-		getProject("P1").build(IncrementalProjectBuilder.FULL_BUILD, null);
-		IJavaProject p2 = createJavaProject("P2");
+		getProject("Bug65693_1").build(IncrementalProjectBuilder.FULL_BUILD, null);
+		IJavaProject p2 = createJavaProject("Bug65693_2");
 		editFile(
-			"/P2/.classpath",
+			"/Bug65693_2/.classpath",
 			"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
 			"<classpath>\n" +
 			"    <classpathentry kind=\"src\" path=\"\"/>\n" +
-			"    <classpathentry kind=\"lib\" path=\"/P1\"/>\n" +
+			"    <classpathentry kind=\"lib\" path=\"/Bug65693_1\"/>\n" +
 			"    <classpathentry kind=\"output\" path=\"\"/>\n" +
 			"</classpath>"
 		);
 		IPackageFragment pkg = p1.getPackageFragmentRoot(p1.getProject()).getPackageFragment("");
 		assertElementsEqual(
-			"Unexpected packages for P1",
-			"X.java [in <default> [in <project root> [in P1]]]",
+			"Unexpected packages for Bug65693_1",
+			"X.java [in <default> [in <project root> [in Bug65693_1]]]",
 			pkg.getChildren());
 		pkg = p2.getPackageFragmentRoot(p1.getProject()).getPackageFragment("");
 		assertElementsEqual(
-			"Unexpected packages for P2",
-			"X.class [in <default> [in /P1 [in P2]]]",
+			"Unexpected packages for Bug65693_2",
+			"X.class [in <default> [in /Bug65693_1 [in Bug65693_2]]]",
 			pkg.getChildren());
 	} finally {
-		deleteProject("P1");
-		deleteProject("P2");
+		deleteProject("Bug65693_1");
+		deleteProject("Bug65693_2");
 	}
 }
 /**
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchScopeTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchScopeTests.java
index 23cf2f2..d191327 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchScopeTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchScopeTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/SignatureTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/SignatureTests.java
index e236030..d3e3fe7 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/SignatureTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/SignatureTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingExpressionsTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingExpressionsTest.java
index ca8679b..8d2bf21 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingExpressionsTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingExpressionsTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -16,10 +16,52 @@
 
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IPackageFragment;
-
-import org.eclipse.jdt.core.dom.*;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
+import org.eclipse.jdt.core.dom.ArrayAccess;
+import org.eclipse.jdt.core.dom.ArrayCreation;
+import org.eclipse.jdt.core.dom.ArrayInitializer;
+import org.eclipse.jdt.core.dom.ArrayType;
+import org.eclipse.jdt.core.dom.Assignment;
+import org.eclipse.jdt.core.dom.Block;
+import org.eclipse.jdt.core.dom.BooleanLiteral;
+import org.eclipse.jdt.core.dom.CastExpression;
+import org.eclipse.jdt.core.dom.CatchClause;
+import org.eclipse.jdt.core.dom.CharacterLiteral;
+import org.eclipse.jdt.core.dom.ClassInstanceCreation;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.ConditionalExpression;
+import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.ExpressionStatement;
+import org.eclipse.jdt.core.dom.FieldAccess;
+import org.eclipse.jdt.core.dom.InfixExpression;
+import org.eclipse.jdt.core.dom.InstanceofExpression;
+import org.eclipse.jdt.core.dom.MethodDeclaration;
+import org.eclipse.jdt.core.dom.MethodInvocation;
+import org.eclipse.jdt.core.dom.Name;
+import org.eclipse.jdt.core.dom.NumberLiteral;
+import org.eclipse.jdt.core.dom.ParenthesizedExpression;
+import org.eclipse.jdt.core.dom.PostfixExpression;
+import org.eclipse.jdt.core.dom.PrefixExpression;
+import org.eclipse.jdt.core.dom.PrimitiveType;
+import org.eclipse.jdt.core.dom.ReturnStatement;
+import org.eclipse.jdt.core.dom.SimpleName;
+import org.eclipse.jdt.core.dom.SimpleType;
+import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
+import org.eclipse.jdt.core.dom.StringLiteral;
+import org.eclipse.jdt.core.dom.SuperConstructorInvocation;
+import org.eclipse.jdt.core.dom.SuperFieldAccess;
+import org.eclipse.jdt.core.dom.SuperMethodInvocation;
+import org.eclipse.jdt.core.dom.ThisExpression;
+import org.eclipse.jdt.core.dom.TryStatement;
+import org.eclipse.jdt.core.dom.Type;
+import org.eclipse.jdt.core.dom.TypeDeclaration;
+import org.eclipse.jdt.core.dom.TypeLiteral;
 import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
 import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
+import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
 
 public class ASTRewritingExpressionsTest extends ASTRewritingTest {
 	private static final Class THIS= ASTRewritingExpressionsTest.class;
@@ -2145,5 +2187,67 @@
 		assertEqualString(preview, buf.toString());
 
 	}
+	
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=404251
+	public void testBug404251() throws Exception {
+		IPackageFragment pack1= this.sourceFolder.createPackageFragment("test1", false, null);
+		StringBuffer buf= new StringBuffer();
+		buf.append("package test1;\n");
+		buf.append("public class E {\n");
+		buf.append("    public void foo(int a, int b, int c) {\n");
+		buf.append("       total = 0;\n");
+		buf.append("    }\n");
+		buf.append("}\n");
+		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
+
+		CompilationUnit astRoot= createAST(cu);
+		AST ast = astRoot.getAST();
+		ASTRewrite rewrite= ASTRewrite.create(ast);
+
+		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
+		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
+		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
+		Block block= methodDecl.getBody();
+		List statements= block.statements();
+		{ // add infix expression with operand that is a prefix expression 
+			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
+			Assignment assignment= (Assignment) stmt.getExpression();
+			
+			PrefixExpression prefix = ast.newPrefixExpression();
+			prefix.setOperator(PrefixExpression.Operator.INCREMENT);
+			prefix.setOperand(ast.newSimpleName("c"));
+			
+			InfixExpression infix= ast.newInfixExpression();
+			infix.setLeftOperand(ast.newSimpleName("a"));
+			infix.setRightOperand(ast.newSimpleName("b"));
+			infix.extendedOperands().add(prefix);
+			rewrite.set(assignment, Assignment.RIGHT_HAND_SIDE_PROPERTY, infix, null);
+		}
+
+		String preview= evaluateRewrite(cu, rewrite);
+
+		buf= new StringBuffer();
+		buf.append("package test1;\n");
+		buf.append("public class E {\n");
+		buf.append("    public void foo(int a, int b, int c) {\n");
+		buf.append("       total = a + b + ++c;\n");
+		buf.append("    }\n");
+		buf.append("}\n");
+		assertEqualString(preview, buf.toString());
+		
+		this.project1.setOption(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+		this.project1.setOption(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_BINARY_OPERATOR, JavaCore.DO_NOT_INSERT);
+		
+		preview= evaluateRewrite(cu, rewrite);
+
+		buf= new StringBuffer();
+		buf.append("package test1;\n");
+		buf.append("public class E {\n");
+		buf.append("    public void foo(int a, int b, int c) {\n");
+		buf.append("       total = a+b+ ++c;\n");
+		buf.append("    }\n");
+		buf.append("}\n");
+		assertEqualString(preview, buf.toString());
+	}
 
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTypeDeclTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTypeDeclTest.java
index 7f9a192..f86fa4f 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTypeDeclTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTypeDeclTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -17,7 +17,6 @@
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IPackageFragment;
 import org.eclipse.jdt.core.JavaCore;
-
 import org.eclipse.jdt.core.dom.*;
 import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
 import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
@@ -1368,10 +1367,11 @@
 			// remove first, insert after 2nd
 			rewrite.remove((ASTNode) declaration.enumConstants().get(0), null);
 
-			ASTNode newNode= ast.newSimpleName("X");
+			EnumConstantDeclaration newEnumConstant = ast.newEnumConstantDeclaration();
+			newEnumConstant.setName(ast.newSimpleName("X"));
 
 			ListRewrite listRewrite= rewrite.getListRewrite(declaration, EnumDeclaration.ENUM_CONSTANTS_PROPERTY);
-			listRewrite.insertAfter(newNode, (ASTNode) declaration.enumConstants().get(1), null);
+			listRewrite.insertAfter(newEnumConstant, (ASTNode) declaration.enumConstants().get(1), null);
 
 			// add body declaration
 
@@ -1412,10 +1412,11 @@
 			// remove first, insert after 2nd
 			rewrite.remove((ASTNode) declaration.enumConstants().get(0), null);
 
-			ASTNode newNode= ast.newSimpleName("X");
+			EnumConstantDeclaration newEnumConstant = ast.newEnumConstantDeclaration();
+			newEnumConstant.setName(ast.newSimpleName("X"));
 
 			ListRewrite listRewrite= rewrite.getListRewrite(declaration, EnumDeclaration.ENUM_CONSTANTS_PROPERTY);
-			listRewrite.insertAfter(newNode, (ASTNode) declaration.enumConstants().get(1), null);
+			listRewrite.insertAfter(newEnumConstant, (ASTNode) declaration.enumConstants().get(1), null);
 
 			// add body declaration
 
@@ -1488,10 +1489,11 @@
 		EnumDeclaration declaration= (EnumDeclaration) findAbstractTypeDeclaration(astRoot, "E");
 		{
 
-			ASTNode newNode= astRoot.getAST().newSimpleName("X");
+			EnumConstantDeclaration newEnumConstant = astRoot.getAST().newEnumConstantDeclaration();
+			newEnumConstant.setName(astRoot.getAST().newSimpleName("X"));
 
 			ListRewrite listRewrite= rewrite.getListRewrite(declaration, EnumDeclaration.ENUM_CONSTANTS_PROPERTY);
-			listRewrite.insertAfter(newNode, (ASTNode) declaration.enumConstants().get(2), null);
+			listRewrite.insertAfter(newEnumConstant, (ASTNode) declaration.enumConstants().get(2), null);
 
 			rewrite.remove((ASTNode) declaration.bodyDeclarations().get(0), null);
 		}
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/StringAsserts.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/StringAsserts.java
index f42e253..ea766e4 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/StringAsserts.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/StringAsserts.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -16,7 +16,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 
-import junit.framework.Assert;
+import junit.framework.TestCase;
 
 /**
  *
@@ -53,9 +53,9 @@
 				return;
 			}
 			if (actual == null) {
-				Assert.assertTrue("Content not as expected: is 'null' expected: " + expected, false);
+				TestCase.assertTrue("Content not as expected: is 'null' expected: " + expected, false);
 			} else {
-				Assert.assertTrue("Content not as expected: expected 'null' is: " + actual, false);
+				TestCase.assertTrue("Content not as expected: expected 'null' is: " + actual, false);
 			}
 		}
 
@@ -69,7 +69,7 @@
 			// use detailed message
 			String message= "Content not as expected: is\n" + actual + "\nDiffers at pos " + diffPos + ": " + diffStr + "\nexpected:\n" + expected;  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 
-			Assert.assertEquals(message, expected, actual);
+			TestCase.assertEquals(message, expected, actual);
 		}
 	}
 
@@ -79,9 +79,9 @@
 				return;
 			}
 			if (actual == null) {
-				Assert.assertTrue("Content not as expected: is 'null' expected: " + expected, false);
+				TestCase.assertTrue("Content not as expected: is 'null' expected: " + expected, false);
 			} else {
-				Assert.assertTrue("Content not as expected: expected 'null' is: " + actual, false);
+				TestCase.assertTrue("Content not as expected: expected 'null' is: " + actual, false);
 			}
 		}
 
@@ -100,7 +100,7 @@
 				String diffStr= (s1 == null) ? s2 : s1;
 
 				String message= "Content not as expected: Content is: \n" + actual + "\nDiffers at line " + line + ": " + diffStr + "\nExpected contents: \n" + expected;
-				Assert.assertEquals(message, expected, actual);
+				TestCase.assertEquals(message, expected, actual);
 			}
 			line++;
 		} while (true);
@@ -145,7 +145,7 @@
 			String expected= buf.toString();
 
 			String message= "Content not as expected: Content is: \n" + actual + "\nExpected contents: \n" + expected;
-			Assert.assertEquals(message, expected, actual);
+			TestCase.assertEquals(message, expected, actual);
 		}
 	}
 
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/modifying/ASTRewritingModifyingCopyTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/modifying/ASTRewritingModifyingCopyTest.java
index bc3c2f6..ac48ae6 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/modifying/ASTRewritingModifyingCopyTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/modifying/ASTRewritingModifyingCopyTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -26,6 +26,7 @@
 import org.eclipse.jdt.core.dom.Expression;
 import org.eclipse.jdt.core.dom.ExpressionStatement;
 import org.eclipse.jdt.core.dom.FieldAccess;
+import org.eclipse.jdt.core.dom.Javadoc;
 import org.eclipse.jdt.core.dom.MethodDeclaration;
 import org.eclipse.jdt.core.dom.MethodInvocation;
 import org.eclipse.jdt.core.dom.Name;
@@ -102,7 +103,7 @@
 	}
 
 	/*
-	 * Known limitation: a copied node cannot be modified.
+	 * https://bugs.eclipse.org/405699 : modify a copied node.
 	 */
 	public void test0002() throws Exception {
 		IPackageFragment pack1= this.sourceFolder.createPackageFragment("test0002", false, null);
@@ -113,7 +114,9 @@
 		buf.append("\n");
 		buf.append("}\n");
 		buf.append("class Y /**/ {\n");
+		buf.append("    //pre\n");
 		buf.append("\n");
+		buf.append("    int i; //post\n");
 		buf.append("}\n");
 		buf.append("class Z {\n");
 		buf.append("\n");
@@ -141,13 +144,17 @@
 		buf.append("\n");
 		buf.append("}\n");
 		buf.append("class Y /**/ {\n");
+		buf.append("    //pre\n");
 		buf.append("\n");
+		buf.append("    int i; //post\n");
 		buf.append("}\n");
 		buf.append("class Z {\n");
 		buf.append("\n");
 		buf.append("}\n");
-		buf.append("class Y /**/ {\n");
-		buf.append("\n");
+		buf.append("class A {\n");
+//		buf.append("    //pre\n"); // we can't preserve everything, but we do our best...
+//		buf.append("\n");
+		buf.append("    int i; //post\n");
 		buf.append("}\n");
 		assertEqualString(preview, buf.toString());
 	}
@@ -516,57 +523,58 @@
 		assertEqualString(Util.convertToIndependantLineDelimiter(preview), Util.convertToIndependantLineDelimiter(buf.toString()));
 	}
 
-	//	public void test0007() throws Exception {
-	//		IPackageFragment pack1= fSourceFolder.createPackageFragment("test0007", false, null);
-	//		StringBuffer buf= new StringBuffer();
-	//		buf.append("package test0007;\n");
-	//		buf.append("\n");
-	//		buf.append("public class X {\n");
-	//		buf.append("    /**\n");
-	//		buf.append("     * NOTHING\n");
-	//		buf.append("     */\n");
-	//		buf.append("    void foo() {\n");
-	//		buf.append("    \n");
-	//		buf.append("    }\n");
-	//		buf.append("    void bar() {\n");
-	//		buf.append("    \n");
-	//		buf.append("    }\n");
-	//		buf.append("}\n");
-	//		ICompilationUnit cu= pack1.createCompilationUnit("X.java", buf.toString(), false, null);
-	//
-	//		CompilationUnit astRoot= parseCompilationUnit(cu, false);
-	//
-	//		astRoot.recordModifications();
-	//
-	//		AST a = astRoot.getAST();
-	//
-	//		List types = astRoot.types();
-	//		TypeDeclaration typeDeclaration = (TypeDeclaration)types.get(0);
-	//		MethodDeclaration methodDeclaration1 = typeDeclaration.getMethods()[0];
-	//		MethodDeclaration methodDeclaration2 = typeDeclaration.getMethods()[1];
-	//		Javadoc javadoc1 = methodDeclaration1.getJavadoc();
-	//		Javadoc javadoc2 = (Javadoc)ASTNode.copySubtree(a, javadoc1);
-	//		methodDeclaration2.setJavadoc(javadoc2);
-	//
-	//		String preview = evaluateRewrite(cu, astRoot);
-	//
-	//		buf= new StringBuffer();
-	//		buf.append("package test0007;\n");
-	//		buf.append("\n");
-	//		buf.append("public class X {\n");
-	//		buf.append("    /**\n");
-	//		buf.append("     * NOTHING\n");
-	//		buf.append("     */\n");
-	//		buf.append("    void foo() {\n");
-	//		buf.append("    \n");
-	//		buf.append("    }\n");
-	//		buf.append("    /**\n");
-	//		buf.append("     * NOTHING\n");
-	//		buf.append("     */\n");
-	//		buf.append("    void bar() {\n");
-	//		buf.append("    \n");
-	//		buf.append("    }\n");
-	//		buf.append("}\n");
-	//		assertEqualString(Util.convertToIndependantLineDelimiter(preview), Util.convertToIndependantLineDelimiter(buf.toString()));
-	//	}
+	public void test0009() throws Exception {
+		IPackageFragment pack1= this.sourceFolder.createPackageFragment("test0007", false, null);
+		StringBuffer buf= new StringBuffer();
+		buf.append("package test0007;\n");
+		buf.append("\n");
+		buf.append("public class X {\n");
+		buf.append("    /**\n");
+		buf.append("     * NOTHING\n");
+		buf.append("     */\n");
+		buf.append("    void foo() {\n");
+		buf.append("    \n");
+		buf.append("    }\n");
+		buf.append("    void bar() {\n");
+		buf.append("    \n");
+		buf.append("    }\n");
+		buf.append("}\n");
+		ICompilationUnit cu= pack1.createCompilationUnit("X.java", buf.toString(), false, null);
+
+		ASTParser astParser = ASTParser.newParser(getJLS3());
+		astParser.setSource(cu);
+		CompilationUnit compilationUnit = (CompilationUnit) astParser.createAST(new NullProgressMonitor());
+		AST ast = compilationUnit.getAST();
+
+		compilationUnit.recordModifications();
+
+		List types = compilationUnit.types();
+		TypeDeclaration typeDeclaration = (TypeDeclaration)types.get(0);
+		MethodDeclaration methodDeclaration1 = typeDeclaration.getMethods()[0];
+		MethodDeclaration methodDeclaration2 = typeDeclaration.getMethods()[1];
+		Javadoc javadoc1 = methodDeclaration1.getJavadoc();
+		Javadoc javadoc2 = (Javadoc)ASTNode.copySubtree(ast, javadoc1);
+		methodDeclaration2.setJavadoc(javadoc2);
+
+		String preview = evaluateRewrite(cu, compilationUnit);
+
+		buf= new StringBuffer();
+		buf.append("package test0007;\n");
+		buf.append("\n");
+		buf.append("public class X {\n");
+		buf.append("    /**\n");
+		buf.append("     * NOTHING\n");
+		buf.append("     */\n");
+		buf.append("    void foo() {\n");
+		buf.append("    \n");
+		buf.append("    }\n");
+		buf.append("    /**\n");
+		buf.append("     * NOTHING\n");
+		buf.append("     */\n");
+		buf.append("    void bar() {\n");
+		buf.append("    \n");
+		buf.append("    }\n");
+		buf.append("}\n");
+		assertEqualString(Util.convertToIndependantLineDelimiter(preview), Util.convertToIndependantLineDelimiter(buf.toString()));
+	}
 }
diff --git a/org.eclipse.jdt.core.tests.model/workspace/AttachedJavadocProject/UTF8doc/p/TestBug394382.txt b/org.eclipse.jdt.core.tests.model/workspace/AttachedJavadocProject/UTF8doc/p/TestBug394382.txt
index 3b205c2..18a540a 100644
--- a/org.eclipse.jdt.core.tests.model/workspace/AttachedJavadocProject/UTF8doc/p/TestBug394382.txt
+++ b/org.eclipse.jdt.core.tests.model/workspace/AttachedJavadocProject/UTF8doc/p/TestBug394382.txt
@@ -1,24 +1,3 @@
-
-<div class="header">
-<div class="subTitle">p</div>
-<h2 title="Class TestBug394382" class="title">Class TestBug394382</h2>
-</div>
-<div class="contentContainer">
-<ul class="inheritance">
-<li>java.lang.Object</li>
-<li>
-<ul class="inheritance">
-<li>p.TestBug394382</li>
-</ul>
-</li>
-</ul>
-<div class="description">
-<ul class="blockList">
-<li class="blockList">
-<hr>
-<br>
-<pre>public class <span class="strong">TestBug394382</span>
-extends java.lang.Object</pre>
 <div class="block">こんにちは世界 ! This class <code>TestBug394382</code> is to test bug 394382</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><code>https://bugs.eclipse.org/bugs/show_bug.cgi?id=394382</code></dd></dl>
 </li>
diff --git a/org.eclipse.jdt.core/.options b/org.eclipse.jdt.core/.options
index 07b4305..3a18809 100644
--- a/org.eclipse.jdt.core/.options
+++ b/org.eclipse.jdt.core/.options
@@ -22,6 +22,15 @@
 # Reports failures during classpath variable initialization, and classpath container resolution
 org.eclipse.jdt.core/debug/cpresolution/failure=false
 
+# Reports bad node nesting in DOM AST
+org.eclipse.jdt.core/debug/dom/ast=false
+
+# Throws an exception in case of bad node nesting in DOM AST
+org.eclipse.jdt.core/debug/dom/ast/throw=false
+
+# Reports type errors when using ASTRewrite
+org.eclipse.jdt.core/debug/dom/rewrite=false
+
 # Report type hierarchy connections, refreshes and deltas
 org.eclipse.jdt.core/debug/hierarchy=false
 
diff --git a/org.eclipse.jdt.core/META-INF/MANIFEST.MF b/org.eclipse.jdt.core/META-INF/MANIFEST.MF
index c14c107..a261eed 100644
--- a/org.eclipse.jdt.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.core/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.core; singleton:=true
-Bundle-Version: 3.9.0.v_OTDT_r220_qualifier
+Bundle-Version: 3.10.0.v_OTDT_r230_qualifier
 Bundle-Activator: org.eclipse.jdt.core.JavaCore
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/org.eclipse.jdt.core/antadapter/META-INF/eclipse.inf b/org.eclipse.jdt.core/antadapter/META-INF/eclipse.inf
index 54e4b72..125dc30 100644
--- a/org.eclipse.jdt.core/antadapter/META-INF/eclipse.inf
+++ b/org.eclipse.jdt.core/antadapter/META-INF/eclipse.inf
@@ -1,2 +1,3 @@
 jarprocessor.exclude.sign=true
 jarprocessor.exclude.children=true
+jarprocessor.exclude.pack=true
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 11dd477..7534b15 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
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 267aa6f..260a956 100644
--- a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
+++ b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2000, 2012 IBM Corporation and others.
+# Copyright (c) 2000, 2013 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
@@ -23,12 +23,12 @@
 #Format: compiler.name = word1 word2 word3
 compiler.name = Eclipse Compiler for Java(TM)
 #Format: compiler.version = (The placeholder 'bundle_qualifier' will be automatically filled. Do not remove or alter it)
-compiler.version = bundle_qualifier, 3.9.0
-compiler.copyright = Copyright IBM Corp 2000, 2012. All rights reserved.
+compiler.version = bundle_qualifier, 3.10.0
+compiler.copyright = Copyright IBM Corp 2000, 2013. All rights reserved.
 
 ###{ObjectTeams:
 otdtc.name = Extension for Object Teams
-otdtc.version = 2.2.0 M6
+otdtc.version = 2.2.0
 otdtc.copyright = Copyright by TU Berlin, Fraunhofer FIRST and others, 2004, 2013.
 ### SH}
 ### progress
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
index b32eec7..d867cab 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
@@ -1932,7 +1932,7 @@
 							if(!this.requestor.isIgnored(CompletionProposal.KEYWORD)) {
 								setSourceAndTokenRange(importReference.sourceStart, importReference.sourceEnd);
 								CompletionOnKeyword keyword = (CompletionOnKeyword)importReference;
-								findKeywords(keyword.getToken(), keyword.getPossibleKeywords(), true, false, parsedUnit.currentPackage != null);
+								findKeywords(keyword.getToken(), keyword.getPossibleKeywords(), false, parsedUnit.currentPackage != null);
 							}
 							if(this.noProposal && this.problem != null) {
 								this.requestor.completionFailure(this.problem);
@@ -2541,7 +2541,7 @@
 	private void completionOnKeyword(ASTNode astNode) {
 		if (!this.requestor.isIgnored(CompletionProposal.KEYWORD)) {
 			CompletionOnKeyword keyword = (CompletionOnKeyword)astNode;
-			findKeywords(keyword.getToken(), keyword.getPossibleKeywords(), keyword.canCompleteEmptyToken(), false, false);
+			findKeywords(keyword.getToken(), keyword.getPossibleKeywords(), false, false);
 		}
 	}
 	
@@ -2689,8 +2689,8 @@
 			}
 		} else {
 			if (!access.isInsideAnnotation) {
-				if (!this.requestor.isIgnored(CompletionProposal.KEYWORD)) {
-					findKeywords(this.completionToken, new char[][]{Keywords.NEW}, false, false, false);
+				if (!this.requestor.isIgnored(CompletionProposal.KEYWORD) && !access.isSuperAccess()) {
+					findKeywords(this.completionToken, new char[][]{Keywords.NEW}, false, false);
 				}
 
 				ObjectVector fieldsFound = new ObjectVector();
@@ -3349,7 +3349,7 @@
 			findTypesAndPackages(this.completionToken, scope, true, false, new ObjectVector());
 			if (!this.requestor.isIgnored(CompletionProposal.KEYWORD)) {
 				if (this.completionToken != null && this.completionToken.length != 0) {
-					findKeywords(this.completionToken, singleNameReference.possibleKeywords, false, false, false);
+					findKeywords(this.completionToken, singleNameReference.possibleKeywords, false, false);
 				} else {
 					findTrueOrFalseKeywords(singleNameReference.possibleKeywords);
 				}
@@ -6389,7 +6389,7 @@
 			// We maybe asking for a proposal inside this field's initialization. So record its id
 			ASTNode astNode = this.parser.assistNode;
 			if (fieldDeclaration != null && fieldDeclaration.initialization != null && astNode != null) {
-				if (fieldDeclaration.initialization.sourceEnd > 0) {
+				if (CharOperation.equals(this.fileName, field.declaringClass.getFileName()) && fieldDeclaration.initialization.sourceEnd > 0) {
 					if (fieldDeclaration.initialization.sourceStart <= astNode.sourceStart &&
 						astNode.sourceEnd <= fieldDeclaration.initialization.sourceEnd) {
 						// completion is inside a field initializer
@@ -8467,42 +8467,40 @@
 
 	// what about onDemand types? Ignore them since it does not happen!
 	// import p1.p2.A.*;
-	private void findKeywords(char[] keyword, char[][] choices, boolean canCompleteEmptyToken, boolean staticFieldsAndMethodOnly, boolean ignorePackageKeyword) {
+	private void findKeywords(char[] keyword, char[][] choices, boolean staticFieldsAndMethodOnly, boolean ignorePackageKeyword) {
 		if(choices == null || choices.length == 0) return;
-
 		int length = keyword.length;
-		if (canCompleteEmptyToken || length > 0)
-			for (int i = 0; i < choices.length; i++)
-				if (length <= choices[i].length
-					&& CharOperation.prefixEquals(keyword, choices[i], false /* ignore case */
-				)){
-					if (ignorePackageKeyword && CharOperation.equals(choices[i], Keywords.PACKAGE))
-						continue;
-					int relevance = computeBaseRelevance();
-					relevance += computeRelevanceForResolution();
-					relevance += computeRelevanceForInterestingProposal();
-					relevance += computeRelevanceForCaseMatching(keyword, choices[i]);
-					relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE); // no access restriction for keywords
-					if (staticFieldsAndMethodOnly && this.insideQualifiedReference) relevance += R_NON_INHERITED;
+		for (int i = 0; i < choices.length; i++)
+			if (length <= choices[i].length
+			&& CharOperation.prefixEquals(keyword, choices[i], false /* ignore case */
+					)){
+				if (ignorePackageKeyword && CharOperation.equals(choices[i], Keywords.PACKAGE))
+					continue;
+				int relevance = computeBaseRelevance();
+				relevance += computeRelevanceForResolution();
+				relevance += computeRelevanceForInterestingProposal();
+				relevance += computeRelevanceForCaseMatching(keyword, choices[i]);
+				relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE); // no access restriction for keywords
+				if (staticFieldsAndMethodOnly && this.insideQualifiedReference) relevance += R_NON_INHERITED;
 
-					if(CharOperation.equals(choices[i], Keywords.TRUE) || CharOperation.equals(choices[i], Keywords.FALSE)) {
-						relevance += computeRelevanceForExpectingType(TypeBinding.BOOLEAN);
-						relevance += computeRelevanceForQualification(false);
-					}
-					this.noProposal = false;
-					if(!this.requestor.isIgnored(CompletionProposal.KEYWORD)) {
-						InternalCompletionProposal proposal =  createProposal(CompletionProposal.KEYWORD, this.actualCompletionPosition);
-						proposal.setName(choices[i]);
-						proposal.setCompletion(choices[i]);
-						proposal.setReplaceRange((canCompleteEmptyToken && (this.startPosition < 0)) ? 0 : this.startPosition - this.offset, this.endPosition - this.offset);
-						proposal.setTokenRange((canCompleteEmptyToken && (this.tokenStart < 0)) ? 0 : this.tokenStart - this.offset, this.tokenEnd - this.offset);
-						proposal.setRelevance(relevance);
-						this.requestor.accept(proposal);
-						if(DEBUG) {
-							this.printDebug(proposal);
-						}
+				if(CharOperation.equals(choices[i], Keywords.TRUE) || CharOperation.equals(choices[i], Keywords.FALSE)) {
+					relevance += computeRelevanceForExpectingType(TypeBinding.BOOLEAN);
+					relevance += computeRelevanceForQualification(false);
+				}
+				this.noProposal = false;
+				if(!this.requestor.isIgnored(CompletionProposal.KEYWORD)) {
+					InternalCompletionProposal proposal =  createProposal(CompletionProposal.KEYWORD, this.actualCompletionPosition);
+					proposal.setName(choices[i]);
+					proposal.setCompletion(choices[i]);
+					proposal.setReplaceRange((this.startPosition < 0) ? 0 : this.startPosition - this.offset, this.endPosition - this.offset);
+					proposal.setTokenRange((this.tokenStart < 0) ? 0 : this.tokenStart - this.offset, this.tokenEnd - this.offset);
+					proposal.setRelevance(relevance);
+					this.requestor.accept(proposal);
+					if(DEBUG) {
+						this.printDebug(proposal);
 					}
 				}
+			}
 	}
 	private void findKeywordsForMember(char[] token, int modifiers) {
 		char[][] keywords = new char[Keywords.COUNT][];
@@ -8610,7 +8608,7 @@
 		}
 		System.arraycopy(keywords, 0, keywords = new char[count][], 0, count);
 
-		findKeywords(token, keywords, false, false, false);
+		findKeywords(token, keywords, false, false);
 	}
 	private void findLabels(char[] label, char[][] choices) {
 		if(choices == null || choices.length == 0) return;
@@ -9748,7 +9746,7 @@
 				((scope instanceof MethodScope && !((MethodScope)scope).isStatic)
 				|| ((methodScope = scope.enclosingMethodScope()) != null && !methodScope.isStatic))) {
 			if (token.length > 0) {
-				findKeywords(token, new char[][]{Keywords.THIS}, false, true, false);
+				findKeywords(token, new char[][]{Keywords.THIS}, true, false);
 			} else {
 				int relevance = computeBaseRelevance();
 				relevance += computeRelevanceForResolution();
@@ -11304,9 +11302,9 @@
 				if (this.assistNodeInJavadoc == 0 || (this.assistNodeInJavadoc & CompletionOnJavadoc.BASE_TYPES) != 0) {
 					if (proposeBaseTypes) {
 						if (proposeVoidType) {
-							findKeywords(token, BASE_TYPE_NAMES, false, false, false);
+							findKeywords(token, BASE_TYPE_NAMES, false, false);
 						} else {
-							findKeywords(token, BASE_TYPE_NAMES_WITHOUT_VOID, false, false, false);
+							findKeywords(token, BASE_TYPE_NAMES_WITHOUT_VOID, false, false);
 						}
 					}
 				}
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java
index 42ff67e..0d600d3 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2009 IBM Corporation and others.
+ * Copyright (c) 2008, 2013 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
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.java
index a2ade79..62e927e 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -14,5 +14,4 @@
 
 	char[] getToken();
 	char[][] getPossibleKeywords();
-	boolean canCompleteEmptyToken();
 }
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.java
index 29c4d6f..7bd9125 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -16,7 +16,6 @@
 
 public class CompletionOnKeyword1 extends SingleTypeReference implements CompletionOnKeyword {
 	private char[][] possibleKeywords;
-	public boolean canCompleteEmptyToken;
 
 	public CompletionOnKeyword1(char[] token, long pos, char[] possibleKeyword) {
 		this(token, pos, new char[][]{possibleKeyword});
@@ -25,9 +24,6 @@
 		super(token, pos);
 		this.possibleKeywords = possibleKeywords;
 	}
-	public boolean canCompleteEmptyToken() {
-		return this.canCompleteEmptyToken;
-	}
 	public char[] getToken() {
 		return this.token;
 	}
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.java
index 8578841..017f200 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -21,9 +21,6 @@
 		this.token = token;
 		this.possibleKeywords = possibleKeywords;
 	}
-	public boolean canCompleteEmptyToken() {
-		return false;
-	}
 	public char[] getToken() {
 		return this.token;
 	}
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.java
index e6e3a81..eea71b5 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -24,9 +24,6 @@
 		this.token = token;
 		this.possibleKeywords = possibleKeywords;
 	}
-	public boolean canCompleteEmptyToken() {
-		return false;
-	}
 	public char[] getToken() {
 		return this.token;
 	}
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
index c38f86d..4aa23fd 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -2172,7 +2172,6 @@
 							this.identifierStack[ptr],
 							this.identifierPositionStack[ptr],
 							keywords);
-						completionOnKeyword.canCompleteEmptyToken = true;
 						type.superclass = completionOnKeyword;
 						type.superclass.bits |= ASTNode.IsSuperType;
 						this.assistNode = completionOnKeyword;
@@ -2184,7 +2183,6 @@
 							this.identifierStack[ptr],
 							this.identifierPositionStack[ptr],
 							Keywords.EXTENDS);
-						completionOnKeyword.canCompleteEmptyToken = true;
 						type.superInterfaces = new TypeReference[]{completionOnKeyword};
 						type.superInterfaces[0].bits |= ASTNode.IsSuperType;
 						this.assistNode = completionOnKeyword;
@@ -2251,7 +2249,6 @@
 		this.identifierStack[ptr],
 		this.identifierPositionStack[ptr],
 		new char[][]{ Keywords.BASE_WHEN, Keywords.WHEN});
-	completionOnKeyword.canCompleteEmptyToken = true;
 
 	// store this type ref into a faked guard predicate:
 	GuardPredicateDeclaration result = new GuardPredicateDeclaration(cResult,
@@ -3123,6 +3120,28 @@
 	popElement(K_SELECTOR_INVOCATION_TYPE);
 	super.consumeMethodInvocationNameWithTypeArguments();
 }
+//{ObjectTeams:
+protected void consumeMethodInvocationBase(boolean isSuperAccess) {
+	popElement(K_SELECTOR_QUALIFIER);
+	popElement(K_SELECTOR_INVOCATION_TYPE);
+	super.consumeMethodInvocationBase(isSuperAccess);
+}
+protected void consumeMethodInvocationBaseWithTypeArguments(boolean isSuperAccess) {
+	popElement(K_SELECTOR_QUALIFIER);
+	popElement(K_SELECTOR_INVOCATION_TYPE);
+	super.consumeMethodInvocationBaseWithTypeArguments(isSuperAccess);
+}
+protected void consumeMethodInvocationTSuper(int kind) {
+	popElement(K_SELECTOR_QUALIFIER);
+	popElement(K_SELECTOR_INVOCATION_TYPE);
+	super.consumeMethodInvocationTSuper(kind);
+}
+protected void consumeMethodInvocationTSuperWithTypeArguments(int kind) {
+	popElement(K_SELECTOR_QUALIFIER);
+	popElement(K_SELECTOR_INVOCATION_TYPE);
+	super.consumeMethodInvocationTSuperWithTypeArguments(kind);
+}
+// SH}
 protected void consumeMethodInvocationPrimary() {
 	popElement(K_SELECTOR_QUALIFIER);
 	popElement(K_SELECTOR_INVOCATION_TYPE);
@@ -4323,7 +4342,6 @@
 		this.identifierStack[this.identifierPtr],
 		this.identifierPositionStack[this.identifierPtr],
 		Keywords.EXTENDS);
-	keyword.canCompleteEmptyToken = true;
 	typeParameter.type = keyword;
 
 	this.identifierPtr--;
@@ -4417,7 +4435,6 @@
 		this.identifierStack[this.identifierPtr],
 		this.identifierPositionStack[this.identifierPtr],
 		new char[][]{Keywords.EXTENDS, Keywords.SUPER} );
-	keyword.canCompleteEmptyToken = true;
 	wildcard.kind = Wildcard.EXTENDS;
 	wildcard.bound = keyword;
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java
index 86cf2ec..ee68d3f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -1970,7 +1970,7 @@
 }
 
 /**
- * Answers true if c is a whitespace according to the JLS (&#92;u000a, &#92;u000c, &#92;u000d, &#92;u0009), otherwise false.
+ * Answers true if c is a whitespace according to the JLS (&#92;u0009, &#92;u000a, &#92;u000c, &#92;u000d, &#92;u0020), otherwise false.
  * <br>
  * <br>
  * For example:
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 87b8af0..f4cbc90 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
@@ -1825,6 +1825,8 @@
 	int DuplicateCallinName 					 = CALLIN_RELATED + 1009; // 4.1(e)
 	int CallinToInheritedFinal 					 = CALLIN_RELATED + 1010; // 4.1(f)
 	int CallinUndeclaredException                = CALLIN_RELATED + 1011; // 4.1(g)
+	/** @since 3.9 OTDT 2.2 */
+	int CallinToConstructorMustUseAfter			 = CALLIN_RELATED + 1012; // 4.1(h)
 
 	int CallinToDeprecated						 = CALLIN_RELATED + 1099; // no OTJLD
 	
@@ -2003,6 +2005,9 @@
 	
 	int AbstractStaticMethodCalled 				 = LIMITATIONS +     31; // actually a sign of corrupt byte code
 	
+	/** @since 4.3 OT 2.2 */
+	int RoleFileMissingTeamDeclaration			 = LIMITATIONS + 	 32;
+	
 // ==== EXPERIMENTAL: ====
 	int EXPERIMENTAL = OTJ_RELATED + 12*OTCHAP;
 	int MigrateNonRole 							 = EXPERIMENTAL +     1;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ASTVisitor.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ASTVisitor.java
index f07f838..cb0c895 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ASTVisitor.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ASTVisitor.java
@@ -24,6 +24,7 @@
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.ParameterMapping;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.PrecedenceDeclaration;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.TsuperReference;
+import org.eclipse.objectteams.otdt.internal.core.compiler.ast.TypeAnchorReference;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.WithinStatement;
 
 /**
@@ -490,6 +491,12 @@
 	public void endVisit(LiftingTypeReference  liftingTypeReference, ClassScope scope) {
 		// do nothing by default
 	}
+	public void endVisit(TypeAnchorReference typeAnchorReference, BlockScope scope) {
+		// do nothing by default
+	}
+	public void endVisit(TypeAnchorReference typeAnchorReference, ClassScope scope) {
+		// do nothing by default
+	}
 	public void endVisit(WithinStatement withinStatement, BlockScope scope) {
 		// do nothing by default
 	}
@@ -970,6 +977,12 @@
 	public boolean visit(LiftingTypeReference liftingTypeReference, ClassScope scope) {
 		return true; // do nothing by default, keep traversing
 	}
+	public boolean visit(TypeAnchorReference typeAnchorReference, BlockScope scope) {
+		return true; // do nothing by default, keep traversing
+	}
+	public boolean visit(TypeAnchorReference typeAnchorReference, ClassScope scope) {
+		return true; // do nothing by default, keep traversing
+	}
 	public boolean visit(WithinStatement withinStatement, BlockScope scope) {
 		return true; // do nothing by default, keep traversing
 	}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.java
index 254d50f..6d10931 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,7 +7,10 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Stephan Herrmann - Contribution for bug 319201 - [null] no warning when unboxing SingleNameReference causes NPE
+ *     Stephan Herrmann - Contributions for
+ *								bug 319201 - [null] no warning when unboxing SingleNameReference causes NPE
+ *								bug 403086 - [compiler][null] include the effect of 'assert' in syntactic null analysis for fields
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -47,6 +50,8 @@
 		}
 
 		FlowInfo leftInfo = this.left.analyseCode(currentScope, flowContext, flowInfo);
+		if ((flowContext.tagBits & FlowContext.INSIDE_NEGATION) != 0)
+			flowContext.expireNullCheckedFieldInfo();
 		// need to be careful of scenario:
 		//  (x && y) && !z, if passing the left info to the right, it would be
 		// swapped by the !
@@ -61,12 +66,10 @@
 			}
 		}
 		rightInfo = this.right.analyseCode(currentScope, flowContext, rightInfo);
-		if ((this.left.implicitConversion & TypeIds.UNBOXING) != 0) {
-			this.left.checkNPE(currentScope, flowContext, flowInfo);
-		}
-		if ((this.right.implicitConversion & TypeIds.UNBOXING) != 0) {
-			this.right.checkNPE(currentScope, flowContext, flowInfo);
-		}
+		if ((flowContext.tagBits & FlowContext.INSIDE_NEGATION) != 0)
+			flowContext.expireNullCheckedFieldInfo();
+		this.left.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
+		this.right.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 		FlowInfo mergedInfo = FlowInfo.conditional(
 				rightInfo.safeInitsWhenTrue(),
 				leftInfo.initsWhenFalse().unconditionalInits().mergedWith(
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
index a648b11..3c90929 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -19,6 +19,9 @@
  *							bug 370639 - [compiler][resource] restore the default for resource leak warnings
  *							bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *							bug 388996 - [compiler][resource] Incorrect 'potential resource leak'
+ *							bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
+ *     Jesper S Moller <jesper@selskabet.org> - Contributions for
+ *							bug 378674 - "The method can be declared as static" is wrong
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -102,9 +105,7 @@
 			if (analyseResources && !hasResourceWrapperType) { // allocation of wrapped closeables is analyzed specially
 				flowInfo = FakedTrackingVariable.markPassedToOutside(currentScope, this.arguments[i], flowInfo, flowContext, false);
 			}
-			if ((this.arguments[i].implicitConversion & TypeIds.UNBOXING) != 0) {
-				this.arguments[i].checkNPE(currentScope, flowContext, flowInfo);
-			}
+			this.arguments[i].checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 		}
 		analyseArguments(currentScope, flowContext, flowInfo, this.binding, this.arguments);
 	}
@@ -132,6 +133,8 @@
 		// allocating a non-static member type without an enclosing instance of parent type
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=335845
 		currentScope.resetDeclaringClassMethodStaticFlag(this.binding.declaringClass.enclosingType());
+		// Reviewed for https://bugs.eclipse.org/bugs/show_bug.cgi?id=378674 :
+		// The corresponding problem (when called from static) is not produced until during code generation
 	}
 	manageEnclosingInstanceAccessIfNecessary(currentScope, flowInfo);
 	manageSyntheticAccessIfNecessary(currentScope, flowInfo);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Annotation.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Annotation.java
index 47f3bd8..e644f83 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Annotation.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Annotation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java
index ae4921a..d71c242 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -13,6 +13,7 @@
  *     Stephan Herrmann - Contributions for
  *								bug 319201 - [null] no warning when unboxing SingleNameReference causes NPE
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -44,9 +45,7 @@
 			Expression dim;
 			if ((dim = this.dimensions[i]) != null) {
 				flowInfo = dim.analyseCode(currentScope, flowContext, flowInfo);
-				if ((dim.implicitConversion & TypeIds.UNBOXING) != 0) {
-					dim.checkNPE(currentScope, flowContext, flowInfo);
-				}
+				dim.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 			}
 		}
 		// account for potential OutOfMemoryError:
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayReference.java
index 21f7e7a..0f80187 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayReference.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -10,6 +10,7 @@
  *     Stephan Herrmann - Contribution for
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -53,6 +54,7 @@
 	this.receiver.checkNPE(currentScope, flowContext, flowInfo);
 	flowInfo = this.receiver.analyseCode(currentScope, flowContext, flowInfo);
 	flowInfo = this.position.analyseCode(currentScope, flowContext, flowInfo);
+	this.position.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 	// account for potential ArrayIndexOutOfBoundsException:
 	flowContext.recordAbruptExit();
 	return flowInfo;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AssertStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AssertStatement.java
index 71c86c2..17cbc01 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AssertStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AssertStatement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -10,6 +10,8 @@
  *     Stephan Herrmann - Contributions for
  *								bug 319201 - [null] no warning when unboxing SingleNameReference causes NPE
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
+ *								bug 403086 - [compiler][null] include the effect of 'assert' in syntactic null analysis for fields
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -46,14 +48,13 @@
 	this.preAssertInitStateIndex = currentScope.methodScope().recordInitializationStates(flowInfo);
 
 	Constant cst = this.assertExpression.optimizedBooleanConstant();
-	if ((this.assertExpression.implicitConversion & TypeIds.UNBOXING) != 0) {
-		this.assertExpression.checkNPE(currentScope, flowContext, flowInfo);
-	}
+	this.assertExpression.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 	boolean isOptimizedTrueAssertion = cst != Constant.NotAConstant && cst.booleanValue() == true;
 	boolean isOptimizedFalseAssertion = cst != Constant.NotAConstant && cst.booleanValue() == false;
 	
 	flowContext.tagBits |= FlowContext.HIDE_NULL_COMPARISON_WARNING;
 	FlowInfo conditionFlowInfo = this.assertExpression.analyseCode(currentScope, flowContext, flowInfo.copy());
+	flowContext.extendTimeToLiveForNullCheckedField(1); // survive this assert as a Statement
 	flowContext.tagBits &= ~FlowContext.HIDE_NULL_COMPARISON_WARNING;
 	UnconditionalFlowInfo assertWhenTrueInfo = conditionFlowInfo.initsWhenTrue().unconditionalInits();
 	FlowInfo assertInfo = conditionFlowInfo.initsWhenFalse();
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Assignment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Assignment.java
index 75b294a..fc1b5fc 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Assignment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Assignment.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -25,6 +25,8 @@
  *							bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
  *							bug 331649 - [compiler][null] consider null annotations for fields
  *							bug 383368 - [compiler][null] syntactic null analysis for field references
+ *							bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
+ *							bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -84,9 +86,7 @@
 // a field reference, a blank final field reference, a field of an enclosing instance or
 // just a local variable.
 	LocalVariableBinding local = this.lhs.localVariableBinding();
-	if ((this.expression.implicitConversion & TypeIds.UNBOXING) != 0) {
-		this.expression.checkNPE(currentScope, flowContext, flowInfo);
-	}
+	this.expression.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 	
 	FlowInfo preInitInfo = null;
 	CompilerOptions compilerOptions = currentScope.compilerOptions();
@@ -138,8 +138,7 @@
 	}
 	if (local != null && (local.type.tagBits & TagBits.IsBaseType) == 0) {
 		flowInfo.markNullStatus(local, nullStatus);
-		if (flowContext.initsOnFinally != null)
-			flowContext.markFinallyNullStatus(local, nullStatus);
+		flowContext.markFinallyNullStatus(local, nullStatus);
 	}
 	return flowInfo;
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java
index 1c4eaa1..b327ad7 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Block.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Block.java
index 8cf78aa..2eb945b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Block.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Block.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -15,6 +15,7 @@
  *								bug 368546 - [compiler][resource] Avoid remaining false positives found when compiling the Eclipse SDK
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -55,8 +56,7 @@
 			flowInfo = stat.analyseCode(this.scope, flowContext, flowInfo);
 		}
 		// record the effect of stat on the finally block of an enclosing try-finally, if any:
-		if (flowContext.initsOnFinally != null)
-			flowContext.mergeFinallyNullInfo(flowInfo);
+		flowContext.mergeFinallyNullInfo(flowInfo);
 		if (enableSyntacticNullAnalysisForFields) {
 			flowContext.expireNullCheckedFieldInfo();
 		}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Clinit.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Clinit.java
index e46fbaa..7eb295d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Clinit.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Clinit.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java
index 3ab010e..f6aaeb1 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -10,6 +10,7 @@
  *     Stephan Herrmann - Contribution for
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -54,8 +55,7 @@
 		if (local != null) {
 			// compound assignment results in a definitely non null value for String
 			flowInfo.markAsDefinitelyNonNull(local);
-			if (flowContext.initsOnFinally != null)
-				flowContext.markFinallyNullStatus(local, FlowInfo.NON_NULL);
+			flowContext.markFinallyNullStatus(local, FlowInfo.NON_NULL);
 		}
 	}
 	return flowInfo;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
index 80b3e32..f4522b4 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -262,6 +262,9 @@
 			// if calling 'this(...)', then flag all non-static fields as definitely
 			// set since they are supposed to be set inside other local constructor
 			if (this.constructorCall.accessMode == ExplicitConstructorCall.This) {
+//{ObjectTeams: calls to copied super ctors are not relevant here:
+			  if (!TSuperHelper.isTSuper(this.constructorCall.binding)) {
+// orig:
 				FieldBinding[] fields = this.binding.declaringClass.fields();
 				for (int i = 0, count = fields.length; i < count; i++) {
 					FieldBinding field;
@@ -269,6 +272,9 @@
 						flowInfo.markAsDefinitelyAssigned(field);
 					}
 				}
+// :giro
+			  }
+// SH}
 			}
 			flowInfo = this.constructorCall.analyseCode(this.scope, constructorContext, flowInfo);
 		}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DoStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DoStatement.java
index 6a76c3e..267ba15 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DoStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DoStatement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -10,6 +10,7 @@
  *     Stephan Herrmann - Contributions for
  *								bug 319201 - [null] no warning when unboxing SingleNameReference causes NPE
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -83,9 +84,7 @@
 										actionInfo.mergedWith(loopingContext.initsOnContinue));
 		}
 	}
-	if ((this.condition.implicitConversion & TypeIds.UNBOXING) != 0) {
-		this.condition.checkNPE(currentScope, flowContext, initsOnCondition);
-	}
+	this.condition.checkNPEbyUnboxing(currentScope, flowContext, initsOnCondition);
 	/* Reset reach mode, to address following scenario.
 	 *   final blank;
 	 *   do { if (true) break; else blank = 0; } while(false);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java
index ad9a6a8..0a8475c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java
@@ -12,6 +12,7 @@
  *								bug 331649 - [compiler][null] consider null annotations for fields
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
  *								bug 382069 - [null] Make the null analysis consider JUnit's assertNotNull similarly to assertions
+ *								bug 403086 - [compiler][null] include the effect of 'assert' in syntactic null analysis for fields
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -47,7 +48,7 @@
 			rightNonNullChecked = scope.problemReporter().expressionNonNullComparison(this.right, checkEquality);
 		}
 		
-		boolean contextualCheckEquality = checkEquality ^ ((flowContext.tagBits & FlowContext.INSIDE_NEGATIVE_ASSERT) != 0);
+		boolean contextualCheckEquality = checkEquality ^ ((flowContext.tagBits & FlowContext.INSIDE_NEGATION) != 0);
 		// perform flowInfo-based checks for variables and record info for syntactic null analysis for fields:
 		if (!leftNonNullChecked) {
 			LocalVariableBinding local = this.left.localVariableBinding();
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
index b3e10c8..97f0f5a 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -16,6 +16,7 @@
  *								bug 361407 - Resource leak warning when resource is assigned to a field outside of constructor
  *								bug 370639 - [compiler][resource] restore the default for resource leak warnings
  *								bug 388996 - [compiler][resource] Incorrect 'potential resource leak'
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -148,9 +149,7 @@
 						// if argument is an AutoCloseable insert info that it *may* be closed (by the target constructor, i.e.)
 						flowInfo = FakedTrackingVariable.markPassedToOutside(currentScope, this.arguments[i], flowInfo, flowContext, false);
 					}
-					if ((this.arguments[i].implicitConversion & TypeIds.UNBOXING) != 0) {
-						this.arguments[i].checkNPE(currentScope, flowContext, flowInfo);
-					}
+					this.arguments[i].checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 				}
 				analyseArguments(currentScope, flowContext, flowInfo, this.binding, this.arguments);
 			}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Expression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Expression.java
index 957d918..3f98fdc 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Expression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Expression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -16,6 +16,8 @@
  *								bug 331649 - [compiler][null] consider null annotations for fields
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
  *								bug 400761 - [compiler][null] null may be return as boolean without a diagnostic
+ *								bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -736,9 +738,7 @@
 		}
 		flowInfo.markAsComparedEqualToNonNull(local);
 			// from thereon it is set
-		if (flowContext.initsOnFinally != null) {
-			flowContext.markFinallyNullStatus(local, FlowInfo.NON_NULL);
-		}
+		flowContext.markFinallyNullStatus(local, FlowInfo.NON_NULL);
 		return true;
 	}
 	return false; // not checked
@@ -746,12 +746,12 @@
 
 /** If this expression requires unboxing check if that operation can throw NPE. */
 protected void checkNPEbyUnboxing(BlockScope scope, FlowContext flowContext, FlowInfo flowInfo) {
-	if ((this.implicitConversion & UNBOXING) != 0) {
-		int status = nullStatus(flowInfo, flowContext);
-		if ((status & FlowInfo.NULL) != 0)
-			scope.problemReporter().nullUnboxing(this, this.resolvedType);
-		else if ((status & FlowInfo.POTENTIALLY_NULL) != 0)
-			scope.problemReporter().potentialNullUnboxing(this, this.resolvedType);
+	int status;
+	if ((this.implicitConversion & UNBOXING) != 0
+			&& (this.bits & ASTNode.IsNonNull) == 0
+			&& (status = nullStatus(flowInfo, flowContext)) != FlowInfo.NON_NULL)
+	{
+		flowContext.recordUnboxing(scope, this, status, flowInfo);
 	}
 }
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java
index 7e1f697..655375b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2011, 2012 GK Software AG and others.
+ * Copyright (c) 2011, 2013 GK Software AG 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
@@ -626,8 +626,7 @@
 		do {
 			flowInfo.markAsDefinitelyNonNull(current.binding);
 			current.globalClosingState |= CLOSE_SEEN;
-			if (flowContext.initsOnFinally != null)
-				flowContext.markFinallyNullStatus(this.binding, FlowInfo.NON_NULL);
+			flowContext.markFinallyNullStatus(this.binding, FlowInfo.NON_NULL);
 			current = current.innerTracker;
 		} while (current != null);
 	}
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 0b3660f..22149ad 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
@@ -14,6 +14,7 @@
  *								bug 185682 - Increment/decrement operators mark local variables as read
  *								bug 331649 - [compiler][null] consider null annotations for fields
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								Bug 412203 - [compiler] Internal compiler error: java.lang.IllegalArgumentException: info cannot be null
  *     Jesper S Moller - Contributions for
  *								Bug 378674 - "The method can be declared as static" is wrong
  *******************************************************************************/
@@ -166,21 +167,11 @@
 		if (   !isCompound
 			&& this.receiver.isThis()
 			&& !(this.receiver instanceof QualifiedThisReference)
+			&& this.receiver.resolvedType == this.binding.declaringClass // inherited fields are not tracked here
 			&& ((this.receiver.bits & ASTNode.ParenthesizedMASK) == 0)) { // (this).x is forbidden
 			flowInfo.markAsDefinitelyAssigned(this.binding);
 		}		
 	}
-	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=318682
-	if (!this.binding.isStatic()) {
-		if (this.receiver.isThis()) {
-			currentScope.resetDeclaringClassMethodStaticFlag(this.binding.declaringClass);
-		}
-	} else if (this.receiver.isThis()) {
-		if ((this.receiver.bits & ASTNode.IsImplicitThis) == 0) {
-			// explicit this, not allowed in static context
-			currentScope.resetDeclaringClassMethodStaticFlag(this.binding.declaringClass);
-		}
-	}
 	return flowInfo;
 }
 
@@ -193,10 +184,6 @@
 	this.receiver.analyseCode(currentScope, flowContext, flowInfo, nonStatic);
 	if (nonStatic) {
 		this.receiver.checkNPE(currentScope, flowContext, flowInfo);
-		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=318682
-		if (this.receiver.isThis()) {
-			currentScope.resetDeclaringClassMethodStaticFlag(this.binding.declaringClass);
-		}
 	}
 
 	if (valueRequired || currentScope.compilerOptions().complianceLevel >= ClassFileConstants.JDK1_4) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ForStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ForStatement.java
index 7434b42..4100448 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ForStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ForStatement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,6 +12,7 @@
  *     							bug 319201 - [null] no warning when unboxing SingleNameReference causes NPE
  *     							bug 349326 - [1.7] new warning for missing try-with-resources
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -97,9 +98,7 @@
 							new LoopingFlowContext(flowContext, flowInfo, this, null,
 								null, this.scope, true)),
 						condInfo);
-				if ((this.condition.implicitConversion & TypeIds.UNBOXING) != 0) {
-					this.condition.checkNPE(currentScope, flowContext, flowInfo);
-				}
+				this.condition.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 			}
 		}
 
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 60de061..7d70f0e 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,6 +12,7 @@
  *     							bug 349326 - [1.7] new warning for missing try-with-resources
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -62,9 +63,7 @@
 	int initialComplaintLevel = (flowInfo.reachMode() & FlowInfo.UNREACHABLE) != 0 ? Statement.COMPLAINED_FAKE_REACHABLE : Statement.NOT_COMPLAINED;
 
 	Constant cst = this.condition.optimizedBooleanConstant();
-	if ((this.condition.implicitConversion & TypeIds.UNBOXING) != 0) {
-		this.condition.checkNPE(currentScope, flowContext, flowInfo);
-	}
+	this.condition.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 	boolean isConditionOptimizedTrue = cst != Constant.NotAConstant && cst.booleanValue() == true;
 	boolean isConditionOptimizedFalse = cst != Constant.NotAConstant && cst.booleanValue() == false;
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java
index 7054549..cabf550 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -151,9 +151,12 @@
 
 	if (!checkedType.isReifiable()) {
 		scope.problemReporter().illegalInstanceOfGenericType(checkedType, this);
-	} else if ((expressionType != TypeBinding.NULL && expressionType.isBaseType()) // disallow autoboxing
-			|| !checkCastTypesCompatibility(scope, checkedType, expressionType, null)) {
-		scope.problemReporter().notCompatibleTypesError(this, expressionType, checkedType);
+	} else if (checkedType.isValidBinding()) {
+		// if not a valid binding, an error has already been reported for unresolved type
+		if ((expressionType != TypeBinding.NULL && expressionType.isBaseType()) // disallow autoboxing
+				|| !checkCastTypesCompatibility(scope, checkedType, expressionType, null)) {
+			scope.problemReporter().notCompatibleTypesError(this, expressionType, checkedType);
+		}
 	}
 	return this.resolvedType = TypeBinding.BOOLEAN;
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
index e3a7029..5e4b339 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
@@ -26,6 +26,8 @@
  *								bug 331649 - [compiler][null] consider null annotations for fields
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
  *								bug 382069 - [null] Make the null analysis consider JUnit's assertNotNull similarly to assertions
+ *								bug 403086 - [compiler][null] include the effect of 'assert' in syntactic null analysis for fields
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *     Jesper S Moller - Contributions for
  *								Bug 378674 - "The method can be declared as static" is wrong
  *******************************************************************************/
@@ -203,20 +205,13 @@
 
 	if (nonStatic) {
 		this.receiver.checkNPE(currentScope, flowContext, flowInfo);
-		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=318682
-		if (this.receiver.isThis() || this.receiver.isSuper()) {
-			// accessing non-static method without an object
-			currentScope.resetDeclaringClassMethodStaticFlag(this.actualReceiverType);
-		}
 	}
 
 	if (this.arguments != null) {
 		int length = this.arguments.length;
 		for (int i = 0; i < length; i++) {
 			Expression argument = this.arguments[i];
-			if ((argument.implicitConversion & TypeIds.UNBOXING) != 0) {
-				argument.checkNPE(currentScope, flowContext, flowInfo);
-			}
+			argument.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 			switch (detectAssertionUtility(i)) {
 				case TRUE_ASSERTION:
 					flowInfo = analyseBooleanAssertion(currentScope, argument, flowContext, flowInfo, wasInsideAssert, true);
@@ -380,7 +375,7 @@
 	int tagBitsSave = flowContext.tagBits;
 	flowContext.tagBits |= FlowContext.HIDE_NULL_COMPARISON_WARNING;
 	if (!passOnTrue)
-		flowContext.tagBits |= FlowContext.INSIDE_NEGATIVE_ASSERT; // this affects syntactic analysis for fields in EqualExpression
+		flowContext.tagBits |= FlowContext.INSIDE_NEGATION; // this affects syntactic analysis for fields in EqualExpression
 	FlowInfo conditionFlowInfo = argument.analyseCode(currentScope, flowContext, flowInfo.copy());
 	flowContext.extendTimeToLiveForNullCheckedField(2); // survive this assert as a MessageSend and as a Statement
 	flowContext.tagBits = tagBitsSave;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NameReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NameReference.java
index 8a8aaea..9a50264 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NameReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NameReference.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NullLiteral.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NullLiteral.java
index 5e5bbbd..d24a3ef 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NullLiteral.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NullLiteral.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.java
index 111714a..5e81242 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -10,6 +10,8 @@
  *     Stephan Herrmann - Contributions for
  *								bug 319201 - [null] no warning when unboxing SingleNameReference causes NPE
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								bug 403086 - [compiler][null] include the effect of 'assert' in syntactic null analysis for fields
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -52,7 +54,8 @@
 		}
 
 		FlowInfo leftInfo = this.left.analyseCode(currentScope, flowContext, flowInfo);
-		flowContext.expireNullCheckedFieldInfo();
+		if ((flowContext.tagBits & FlowContext.INSIDE_NEGATION) == 0)
+			flowContext.expireNullCheckedFieldInfo();
 
 		 // need to be careful of scenario:
 		//		(x || y) || !z, if passing the left info to the right, it would be swapped by the !
@@ -68,13 +71,10 @@
 			}
 		}
 		rightInfo = this.right.analyseCode(currentScope, flowContext, rightInfo);
-		flowContext.expireNullCheckedFieldInfo();
-		if ((this.left.implicitConversion & TypeIds.UNBOXING) != 0) {
-			this.left.checkNPE(currentScope, flowContext, flowInfo);
-		}
-		if ((this.right.implicitConversion & TypeIds.UNBOXING) != 0) {
-			this.right.checkNPE(currentScope, flowContext, flowInfo);
-		}
+		if ((flowContext.tagBits & FlowContext.INSIDE_NEGATION) == 0)
+			flowContext.expireNullCheckedFieldInfo();
+		this.left.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
+		this.right.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 		// The definitely null variables in right info when true should not be missed out while merging
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=299900
 		FlowInfo leftInfoWhenTrueForMerging = leftInfo.initsWhenTrue().unconditionalCopy().addPotentialInitializationsFrom(rightInfo.unconditionalInitsWithoutSideEffect());
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.java
index 8cd4584..284984c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java
index 187978d..445c410 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java
@@ -84,14 +84,24 @@
 	 * @return char[][]
 	 */
 	public char [][] getParameterizedTypeName(){
-//{ObjectTeams: were all parameters value parameters?
-		if (this.typeArguments.length == 0) {
-			return super.getParameterizedTypeName();
-		}
-// SH}
 		StringBuffer buffer = new StringBuffer(5);
 		buffer.append(this.token).append('<');
+//{ObjectTeams: type anchors?
+		boolean haveOne = false;
+		if (this.typeAnchors != null) {
+			for (int i = 0, length = this.typeAnchors.length; i < length; i++) {
+				if (i > 0) buffer.append(',');
+				buffer.append(CharOperation.concatWith(this.typeAnchors[i].getParameterizedTypeName(), '.'));
+				haveOne = true;
+			}
+		}
+// SH}
 		for (int i = 0, length = this.typeArguments.length; i < length; i++) {
+//{ObjectTeams:
+		  if (haveOne)
+			  buffer.append(',');
+		  else
+// SH}
 			if (i > 0) buffer.append(',');
 			buffer.append(CharOperation.concatWith(this.typeArguments[i].getParameterizedTypeName(), '.'));
 		}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
index 73c9163..e999aa0 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -18,7 +18,10 @@
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *								bug 388996 - [compiler][resource] Incorrect 'potential resource leak'
  *								bug 395977 - [compiler][resource] Resource leak warning behavior possibly incorrect for anonymous inner class
- *******************************************************************************/
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
+ *     Jesper S Moller <jesper@selskabet.org> - Contributions for
+ *								bug 378674 - "The method can be declared as static" is wrong
+ ******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
 import org.eclipse.jdt.internal.compiler.ASTVisitor;
@@ -142,6 +145,8 @@
 				if (superclass != null && superclass.isMemberType() && !superclass.isStatic()) {
 					// creating an anonymous type of a non-static member type without an enclosing instance of parent type
 					currentScope.resetDeclaringClassMethodStaticFlag(superclass.enclosingType());
+					// Reviewed for https://bugs.eclipse.org/bugs/show_bug.cgi?id=378674 :
+					// The corresponding problem (when called from static) is not produced until during code generation
 				}
 			}
 			
@@ -167,9 +172,7 @@
 					// if argument is an AutoCloseable insert info that it *may* be closed (by the target method, i.e.)
 					flowInfo = FakedTrackingVariable.markPassedToOutside(currentScope, this.arguments[i], flowInfo, flowContext, false);
 				}
-				if ((this.arguments[i].implicitConversion & TypeIds.UNBOXING) != 0) {
-					this.arguments[i].checkNPE(currentScope, flowContext, flowInfo);
-				}
+				this.arguments[i].checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 			}
 			analyseArguments(currentScope, flowContext, flowInfo, this.binding, this.arguments);
 		}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java
index 54ba6a8..51405bc 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -18,6 +18,9 @@
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *								bug 331649 - [compiler][null] consider null annotations for fields
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
+ *     Jesper S Moller <jesper@selskabet.org> - Contributions for
+ *								bug 378674 - "The method can be declared as static" is wrong
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -125,9 +128,6 @@
 					currentScope.problemReporter().uninitializedBlankFinalField(lastFieldBinding, this);
 				}
 			}
-			if (!lastFieldBinding.isStatic()) {
-				currentScope.resetDeclaringClassMethodStaticFlag(lastFieldBinding.declaringClass);
-			}
 			break;
 		case Binding.LOCAL :
 			// first binding is a local variable
@@ -235,9 +235,6 @@
 					}
 				}
 			}
-			if (!fieldBinding.isStatic()) {
-				currentScope.resetDeclaringClassMethodStaticFlag(fieldBinding.declaringClass);
-			}
 			break;
 		case Binding.LOCAL : // reading a local variable
 			LocalVariableBinding localBinding;
@@ -281,9 +278,7 @@
 			}
 			flowInfo.markAsComparedEqualToNonNull(local);
 			// from thereon it is set
-			if (flowContext.initsOnFinally != null) {
-				flowContext.markFinallyNullStatus(local, FlowInfo.NON_NULL);
-			}
+			flowContext.markFinallyNullStatus(local, FlowInfo.NON_NULL);
 		}
 	}
 	if (this.otherBindings != null) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java
index 551d488..7049f44 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -10,6 +10,8 @@
  *     IBM Corporation - initial API and implementation
  *     Fraunhofer FIRST - extended API and implementation
  *     Technical University Berlin - extended API and implementation
+ *     Jesper S Moller <jesper@selskabet.org> - Contributions for
+ *								bug 378674 - "The method can be declared as static" is wrong
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -135,6 +137,9 @@
 		if (this.currentCompatibleType == null) {
 			scope.problemReporter().noSuchEnclosingInstance(type, this, false);
 			return this.resolvedType;
+		} else {
+			// Mark all methods between here and the declared type as not static
+			scope.resetDeclaringClassMethodStaticFlag(this.currentCompatibleType);
 		}
 
 		// Ensure one cannot write code like: B() { super(B.this); }
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 a754008..665a0c5 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
index 2afd2bf..541e4b7 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -14,6 +14,9 @@
  *								bug 185682 - Increment/decrement operators mark local variables as read
  *								bug 331649 - [compiler][null] consider null annotations for fields
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								Bug 412203 - [compiler] Internal compiler error: java.lang.IllegalArgumentException: info cannot be null
+ *     Jesper S Moller <jesper@selskabet.org> - Contributions for
+ *								bug 378674 - "The method can be declared as static" is wrong
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -93,10 +96,6 @@
 						currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
 					}
 				}
-				if (!fieldBinding.isStatic()) {
-					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=318682
-					currentScope.resetDeclaringClassMethodStaticFlag(fieldBinding.declaringClass);
-				}
 				manageSyntheticAccessIfNecessary(currentScope, flowInfo, true /*read-access*/);
 				break;
 			case Binding.LOCAL : // reading a local variable
@@ -140,14 +139,11 @@
 				} else {
 					currentScope.problemReporter().cannotAssignToFinalField(fieldBinding, this);
 				}
-			} else if (!isCompound && fieldBinding.isNonNull()) {
+			} else if (!isCompound && fieldBinding.isNonNull()
+						&& fieldBinding.declaringClass == currentScope.enclosingReceiverType()) { // inherited fields are not tracked here
 				// record assignment for detecting uninitialized non-null fields:
 				flowInfo.markAsDefinitelyAssigned(fieldBinding);
 			}
-			if (!fieldBinding.isStatic()) {
-				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=318682
-				currentScope.resetDeclaringClassMethodStaticFlag(fieldBinding.declaringClass);
-			}
 			break;
 		case Binding.LOCAL : // assigning to a local variable
 			LocalVariableBinding localBinding = (LocalVariableBinding) this.binding;
@@ -197,10 +193,6 @@
 					currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
 				}
 			}
-			if (!fieldBinding.isStatic()) {
-				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=318682
-				currentScope.resetDeclaringClassMethodStaticFlag(fieldBinding.declaringClass);
-			}
 			break;
 		case Binding.LOCAL : // reading a local variable
 			LocalVariableBinding localBinding;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Statement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Statement.java
index 588c2e5..682a8a9 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Statement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Statement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
index 9a0cba7..08087a9 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
@@ -19,6 +19,10 @@
  *								bug 388996 - [compiler][resource] Incorrect 'potential resource leak'
  *								bug 401088 - [compiler][null] Wrong warning "Redundant null check" inside nested try statement
  *								bug 401092 - [compiler][null] Wrong warning "Redundant null check" in outer catch of nested try
+ *								bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
+ *								bug 384380 - False positive on a ?? Potential null pointer access ?? after a continue
+ *     Jesper Steen Moller - Contributions for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -27,6 +31,7 @@
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.eclipse.jdt.internal.compiler.codegen.*;
 import org.eclipse.jdt.internal.compiler.flow.*;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.eclipse.jdt.internal.compiler.lookup.*;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lifting.DeclaredLifting;
@@ -50,8 +55,6 @@
 
 	public Argument[] catchArguments;
 
-	// should rename into subRoutineComplete to be set to false by default
-
 	public Block finallyBlock;
 //{ObjectTeams: accessible for anonymous sub-class:
 	protected
@@ -125,9 +128,10 @@
 	if (this.subRoutineStartLabel == null) {
 		// no finally block -- this is a simplified copy of the else part
 		if (flowContext instanceof FinallyFlowContext) {
-			// if this TryStatement sits inside another TryStatement,
-			// report into the initsOnFinally of the outer try-block.
-			flowContext.initsOnFinally = ((FinallyFlowContext)flowContext).tryContext.initsOnFinally;
+			// if this TryStatement sits inside another TryStatement, establish the wiring so that
+			// FlowContext.markFinallyNullStatus can report into initsOnFinally of the outer try context:
+			FinallyFlowContext finallyContext = (FinallyFlowContext) flowContext;
+			finallyContext.outerTryContext = finallyContext.tryContext;
 		}
 		// process the try block in a context handling the local exceptions.
 		ExceptionHandlingFlowContext handlingContext =
@@ -144,6 +148,7 @@
 				flowInfo);
   :giro */
 // SH}
+		handlingContext.conditionalLevel = 0; // start collection initsOnFinally
 		// only try blocks initialize that member - may consider creating a
 		// separate class if needed
 
@@ -159,200 +164,11 @@
 				this.tryBlock.scope.removeTrackingVar(resourceBinding.closeTracker);
 				// keep the tracking variable in the resourceBinding in order to prevent creating a new one while analyzing the try block
 			}
-			TypeBinding type = resourceBinding.type;
-			if (type != null && type.isValidBinding()) {
-				ReferenceBinding binding = (ReferenceBinding) type;
-				MethodBinding closeMethod = binding.getExactMethod(ConstantPool.Close, new TypeBinding [0], this.scope.compilationUnitScope()); // scope needs to be tighter
-				if(closeMethod == null) {
-					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380112
-					// closeMethod could be null if the binding is from an interface
-					// extending from multiple interfaces.					
-					InvocationSite site = new InvocationSite() {
-						public TypeBinding[] genericTypeArguments() { return null;}
-						public boolean isSuperAccess() {return false;}
-						public boolean isTypeAccess() {return false;}
-						public void setActualReceiverType(ReferenceBinding receiverType) {/* empty */}
-						public void setDepth(int depth) {/* empty */ }
-						public void setFieldIndex(int depth) {/* empty */ }
-						public int sourceEnd() {return resource.sourceEnd(); }
-						public int sourceStart() {return resource.sourceStart(); }
-						public TypeBinding expectedType() { return null; }
-					};
-					closeMethod = this.scope.compilationUnitScope().findMethod(binding, ConstantPool.Close, new TypeBinding[0], site, false);
-				}
-				if (closeMethod != null && closeMethod.isValidBinding() && closeMethod.returnType.id == TypeIds.T_void) {
-					ReferenceBinding[] thrownExceptions = closeMethod.thrownExceptions;
-					for (int j = 0, length = thrownExceptions.length; j < length; j++) {
-						handlingContext.checkExceptionHandlers(thrownExceptions[j], this.resources[i], tryInfo, currentScope, true);
-					}
-				}
-			}
-		}
-		if (!this.tryBlock.isEmptyBlock()) {
-			tryInfo = this.tryBlock.analyseCode(currentScope, handlingContext, tryInfo);
-			if ((tryInfo.tagBits & FlowInfo.UNREACHABLE_OR_DEAD) != 0)
-				this.bits |= ASTNode.IsTryBlockExiting;
-		}
-		if (resourcesLength > 0) { 
-			this.postTryInitStateIndex = currentScope.methodScope().recordInitializationStates(tryInfo);
-			// the resources are not in scope after the try block, so remove their assignment info
-			// to avoid polluting the state indices. However, do this after the postTryInitStateIndex is calculated since
-			// it is used to add or remove assigned resources during code gen
-			for (int i = 0; i < resourcesLength; i++) {
-				tryInfo.resetAssignmentInfo(this.resources[i].binding);
-			}
-		}
-		// check unreachable catch blocks
-		handlingContext.complainIfUnusedExceptionHandlers(this.scope, this);
-
-		// process the catch blocks - computing the minimal exit depth amongst try/catch
-		if (this.catchArguments != null) {
-			int catchCount;
-			this.catchExits = new boolean[catchCount = this.catchBlocks.length];
-			this.catchExitInitStateIndexes = new int[catchCount];
-			for (int i = 0; i < catchCount; i++) {
-				// keep track of the inits that could potentially have led to this exception handler (for final assignments diagnosis)
-				FlowInfo catchInfo;
-				if (isUncheckedCatchBlock(i)) {
-					catchInfo =
-						flowInfo.unconditionalCopy().
-							addPotentialInitializationsFrom(
-								handlingContext.initsOnException(i)).
-							addPotentialInitializationsFrom(tryInfo).
-							addPotentialInitializationsFrom(
-								handlingContext.initsOnReturn).
-						addNullInfoFrom(handlingContext.initsOnFinally);
-				} else {
-					FlowInfo initsOnException = handlingContext.initsOnException(i);
-					catchInfo =
-						flowInfo.nullInfoLessUnconditionalCopy()
-							.addPotentialInitializationsFrom(initsOnException)
-							.addNullInfoFrom(initsOnException)	// null info only from here, this is the only way to enter the catch block
-							.addPotentialInitializationsFrom(
-									tryInfo.nullInfoLessUnconditionalCopy())
-							.addPotentialInitializationsFrom(
-									handlingContext.initsOnReturn.nullInfoLessUnconditionalCopy());
-				}
-
-				// catch var is always set
-				LocalVariableBinding catchArg = this.catchArguments[i].binding;
-				catchInfo.markAsDefinitelyAssigned(catchArg);
-				catchInfo.markAsDefinitelyNonNull(catchArg);
-				/*
-				"If we are about to consider an unchecked exception handler, potential inits may have occured inside
-				the try block that need to be detected , e.g.
-				try { x = 1; throwSomething();} catch(Exception e){ x = 2} "
-				"(uncheckedExceptionTypes notNil and: [uncheckedExceptionTypes at: index])
-				ifTrue: [catchInits addPotentialInitializationsFrom: tryInits]."
-				*/
-				if (this.tryBlock.statements == null && this.resources == NO_RESOURCES) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=350579
-					catchInfo.setReachMode(FlowInfo.UNREACHABLE_OR_DEAD);
-				}
-				catchInfo =
-					this.catchBlocks[i].analyseCode(
-						currentScope,
-						flowContext,
-						catchInfo);
-				this.catchExitInitStateIndexes[i] = currentScope.methodScope().recordInitializationStates(catchInfo);
-				this.catchExits[i] =
-					(catchInfo.tagBits & FlowInfo.UNREACHABLE_OR_DEAD) != 0;
-				tryInfo = tryInfo.mergedWith(catchInfo.unconditionalInits());
-			}
-		}
-		this.mergedInitStateIndex =
-			currentScope.methodScope().recordInitializationStates(tryInfo);
-
-		// chain up null info registry
-		if (flowContext.initsOnFinally != null) {
-			flowContext.mergeFinallyNullInfo(handlingContext.initsOnFinally);
-		}
-
-		return tryInfo;
-	} else {
-		InsideSubRoutineFlowContext insideSubContext;
-		FinallyFlowContext finallyContext;
-		UnconditionalFlowInfo subInfo;
-		// analyse finally block first
-		insideSubContext = new InsideSubRoutineFlowContext(flowContext, this);
-		if (flowContext instanceof FinallyFlowContext) {
-			// if this TryStatement sits inside another TryStatement,
-			// let the nested context report into the initsOnFinally of the outer try-block.
-			insideSubContext.initsOnFinally = ((FinallyFlowContext)flowContext).tryContext.initsOnFinally;
-		}
-
-		// process the try block in a context handling the local exceptions.
-		// (advance instantiation so we can wire this into the FinallyFlowContext)
-		ExceptionHandlingFlowContext handlingContext =
-			new ExceptionHandlingFlowContext(
-				insideSubContext,
-				this,
-				this.caughtExceptionTypes,
-				this.caughtExceptionsCatchBlocks,
-				null,
-				this.scope,
-				flowInfo);
-
-		subInfo =
-			this.finallyBlock
-				.analyseCode(
-					currentScope,
-					finallyContext = new FinallyFlowContext(flowContext, this.finallyBlock, handlingContext),
-					flowInfo.nullInfoLessUnconditionalCopy())
-				.unconditionalInits();
-		if (subInfo == FlowInfo.DEAD_END) {
-			this.bits |= ASTNode.IsSubRoutineEscaping;
-			this.scope.problemReporter().finallyMustCompleteNormally(this.finallyBlock);
-		} else {
-			// for resource analysis we need the finallyInfo in these nested scopes:
-			FlowInfo finallyInfo = subInfo.copy();
-			this.tryBlock.scope.finallyInfo = finallyInfo;
-			if (this.catchBlocks != null) {
-				for (int i = 0; i < this.catchBlocks.length; i++)
-					this.catchBlocks[i].scope.finallyInfo = finallyInfo;
-			}
-		}
-		this.subRoutineInits = subInfo;
-		// only try blocks initialize that member - may consider creating a
-		// separate class if needed
-
-		FlowInfo tryInfo = flowInfo.copy();
-		for (int i = 0; i < resourcesLength; i++) {
-			final LocalDeclaration resource = this.resources[i];
-			tryInfo = resource.analyseCode(currentScope, handlingContext, tryInfo);
-			this.postResourcesInitStateIndexes[i] = currentScope.methodScope().recordInitializationStates(tryInfo);
-			LocalVariableBinding resourceBinding = resource.binding;
-			resourceBinding.useFlag = LocalVariableBinding.USED; // Is implicitly used anyways.
-			if (resourceBinding.closeTracker != null) {
-				// this was false alarm, we don't need to track the resource
-				this.tryBlock.scope.removeTrackingVar(resourceBinding.closeTracker);
-				// keep the tracking variable in the resourceBinding in order to prevent creating a new one while analyzing the try block
-			} 
-			TypeBinding type = resourceBinding.type;
-			if (type != null && type.isValidBinding()) {
-				ReferenceBinding binding = (ReferenceBinding) type;
-				MethodBinding closeMethod = binding.getExactMethod(ConstantPool.Close, new TypeBinding [0], this.scope.compilationUnitScope()); // scope needs to be tighter
-				if(closeMethod == null) {
-					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380112
-					// closeMethod could be null if the binding is from an interface
-					// extending from multiple interfaces.
-					InvocationSite site = new InvocationSite() {
-						public TypeBinding[] genericTypeArguments() { return null;}
-						public boolean isSuperAccess() {return false;}
-						public boolean isTypeAccess() {return false;}
-						public void setActualReceiverType(ReferenceBinding receiverType) {/* empty */}
-						public void setDepth(int depth) {/* empty */ }
-						public void setFieldIndex(int depth) {/* empty */ }
-						public int sourceEnd() {return resource.sourceEnd(); }
-						public int sourceStart() {return resource.sourceStart(); }
-						public TypeBinding expectedType() { return null; }
-					};
-					closeMethod = this.scope.compilationUnitScope().findMethod(binding, ConstantPool.Close, new TypeBinding[0], site, false);
-				}
-				if (closeMethod != null && closeMethod.isValidBinding() && closeMethod.returnType.id == TypeIds.T_void) {
-					ReferenceBinding[] thrownExceptions = closeMethod.thrownExceptions;
-					for (int j = 0, length = thrownExceptions.length; j < length; j++) {
-						handlingContext.checkExceptionHandlers(thrownExceptions[j], this.resources[i], tryInfo, currentScope, true);
-					}
+			MethodBinding closeMethod = findCloseMethod(resource, resourceBinding);
+			if (closeMethod != null && closeMethod.isValidBinding() && closeMethod.returnType.id == TypeIds.T_void) {
+				ReferenceBinding[] thrownExceptions = closeMethod.thrownExceptions;
+				for (int j = 0, length = thrownExceptions.length; j < length; j++) {
+					handlingContext.checkExceptionHandlers(thrownExceptions[j], this.resources[i], tryInfo, currentScope, true);
 				}
 			}
 		}
@@ -380,42 +196,122 @@
 			this.catchExitInitStateIndexes = new int[catchCount];
 			for (int i = 0; i < catchCount; i++) {
 				// keep track of the inits that could potentially have led to this exception handler (for final assignments diagnosis)
-				FlowInfo catchInfo;
-				if (isUncheckedCatchBlock(i)) {
-					catchInfo =
-						flowInfo.unconditionalCopy().
-							addPotentialInitializationsFrom(
-								handlingContext.initsOnException(i)).
-							addPotentialInitializationsFrom(tryInfo).
-							addPotentialInitializationsFrom(
-								handlingContext.initsOnReturn).
-							addNullInfoFrom(handlingContext.initsOnFinally);
-				}else {
-					FlowInfo initsOnException = handlingContext.initsOnException(i);
-					catchInfo =
-						flowInfo.nullInfoLessUnconditionalCopy()
-							.addPotentialInitializationsFrom(initsOnException)
-							.addNullInfoFrom(initsOnException)	// null info only from here, this is the only way to enter the catch block
-							.addPotentialInitializationsFrom(
-									tryInfo.nullInfoLessUnconditionalCopy())
-							.addPotentialInitializationsFrom(
-									handlingContext.initsOnReturn.nullInfoLessUnconditionalCopy());
-				}
+				FlowInfo catchInfo = prepareCatchInfo(flowInfo, handlingContext, tryInfo, i);
+				flowContext.conditionalLevel++;
+				catchInfo =
+					this.catchBlocks[i].analyseCode(
+						currentScope,
+						flowContext,
+						catchInfo);
+				flowContext.conditionalLevel--;
+				this.catchExitInitStateIndexes[i] = currentScope.methodScope().recordInitializationStates(catchInfo);
+				this.catchExits[i] =
+					(catchInfo.tagBits & FlowInfo.UNREACHABLE_OR_DEAD) != 0;
+				tryInfo = tryInfo.mergedWith(catchInfo.unconditionalInits());
+			}
+		}
+		this.mergedInitStateIndex =
+			currentScope.methodScope().recordInitializationStates(tryInfo);
 
-				// catch var is always set
-				LocalVariableBinding catchArg = this.catchArguments[i].binding;
-				catchInfo.markAsDefinitelyAssigned(catchArg);
-				catchInfo.markAsDefinitelyNonNull(catchArg);
-				/*
-				"If we are about to consider an unchecked exception handler, potential inits may have occured inside
-				the try block that need to be detected , e.g.
-				try { x = 1; throwSomething();} catch(Exception e){ x = 2} "
-				"(uncheckedExceptionTypes notNil and: [uncheckedExceptionTypes at: index])
-				ifTrue: [catchInits addPotentialInitializationsFrom: tryInits]."
-				*/
-				if (this.tryBlock.statements == null && this.resources == NO_RESOURCES) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=350579
-					catchInfo.setReachMode(FlowInfo.UNREACHABLE_OR_DEAD);
+		// chain up null info registry
+		flowContext.mergeFinallyNullInfo(handlingContext.initsOnFinally);
+
+		return tryInfo;
+	} else {
+		InsideSubRoutineFlowContext insideSubContext;
+		FinallyFlowContext finallyContext;
+		UnconditionalFlowInfo subInfo;
+		// analyse finally block first
+		insideSubContext = new InsideSubRoutineFlowContext(flowContext, this);
+		if (flowContext instanceof FinallyFlowContext) {
+			// if this TryStatement sits inside another TryStatement, establish the wiring so that
+			// FlowContext.markFinallyNullStatus can report into initsOnFinally of the outer try context:
+			insideSubContext.outerTryContext = ((FinallyFlowContext)flowContext).tryContext;
+		}
+
+		// process the try block in a context handling the local exceptions.
+		// (advance instantiation so we can wire this into the FinallyFlowContext)
+		ExceptionHandlingFlowContext handlingContext =
+			new ExceptionHandlingFlowContext(
+				insideSubContext,
+				this,
+				this.caughtExceptionTypes,
+				this.caughtExceptionsCatchBlocks,
+				null,
+				this.scope,
+				flowInfo);
+		insideSubContext.initsOnFinally = handlingContext.initsOnFinally; 
+
+		subInfo =
+			this.finallyBlock
+				.analyseCode(
+					currentScope,
+					finallyContext = new FinallyFlowContext(flowContext, this.finallyBlock, handlingContext),
+					flowInfo.nullInfoLessUnconditionalCopy())
+				.unconditionalInits();
+		handlingContext.conditionalLevel = 0; // start collection initsOnFinally only after analysing the finally block
+		if (subInfo == FlowInfo.DEAD_END) {
+			this.bits |= ASTNode.IsSubRoutineEscaping;
+			this.scope.problemReporter().finallyMustCompleteNormally(this.finallyBlock);
+		} else {
+			// for resource analysis we need the finallyInfo in these nested scopes:
+			FlowInfo finallyInfo = subInfo.copy();
+			this.tryBlock.scope.finallyInfo = finallyInfo;
+			if (this.catchBlocks != null) {
+				for (int i = 0; i < this.catchBlocks.length; i++)
+					this.catchBlocks[i].scope.finallyInfo = finallyInfo;
+			}
+		}
+		this.subRoutineInits = subInfo;
+		// only try blocks initialize that member - may consider creating a
+		// separate class if needed
+
+		FlowInfo tryInfo = flowInfo.copy();
+		for (int i = 0; i < resourcesLength; i++) {
+			final LocalDeclaration resource = this.resources[i];
+			tryInfo = resource.analyseCode(currentScope, handlingContext, tryInfo);
+			this.postResourcesInitStateIndexes[i] = currentScope.methodScope().recordInitializationStates(tryInfo);
+			LocalVariableBinding resourceBinding = resource.binding;
+			resourceBinding.useFlag = LocalVariableBinding.USED; // Is implicitly used anyways.
+			if (resourceBinding.closeTracker != null) {
+				// this was false alarm, we don't need to track the resource
+				this.tryBlock.scope.removeTrackingVar(resourceBinding.closeTracker);
+				// keep the tracking variable in the resourceBinding in order to prevent creating a new one while analyzing the try block
+			}
+			MethodBinding closeMethod = findCloseMethod(resource, resourceBinding);
+			if (closeMethod != null && closeMethod.isValidBinding() && closeMethod.returnType.id == TypeIds.T_void) {
+				ReferenceBinding[] thrownExceptions = closeMethod.thrownExceptions;
+				for (int j = 0, length = thrownExceptions.length; j < length; j++) {
+					handlingContext.checkExceptionHandlers(thrownExceptions[j], this.resources[i], tryInfo, currentScope, true);
 				}
+			}
+		}
+		if (!this.tryBlock.isEmptyBlock()) {
+			tryInfo = this.tryBlock.analyseCode(currentScope, handlingContext, tryInfo);
+			if ((tryInfo.tagBits & FlowInfo.UNREACHABLE_OR_DEAD) != 0)
+				this.bits |= ASTNode.IsTryBlockExiting;
+		}
+		if (resourcesLength > 0) {
+			this.postTryInitStateIndex = currentScope.methodScope().recordInitializationStates(tryInfo);
+			// the resources are not in scope after the try block, so remove their assignment info
+			// to avoid polluting the state indices. However, do this after the postTryInitStateIndex is calculated since
+			// it is used to add or remove assigned resources during code gen
+			for (int i = 0; i < resourcesLength; i++) {
+				tryInfo.resetAssignmentInfo(this.resources[i].binding);
+			}
+		}
+		// check unreachable catch blocks
+		handlingContext.complainIfUnusedExceptionHandlers(this.scope, this);
+
+		// process the catch blocks - computing the minimal exit depth amongst try/catch
+		if (this.catchArguments != null) {
+			int catchCount;
+			this.catchExits = new boolean[catchCount = this.catchBlocks.length];
+			this.catchExitInitStateIndexes = new int[catchCount];
+			for (int i = 0; i < catchCount; i++) {
+				// keep track of the inits that could potentially have led to this exception handler (for final assignments diagnosis)
+				FlowInfo catchInfo = prepareCatchInfo(flowInfo, handlingContext, tryInfo, i);
+				insideSubContext.conditionalLevel = 1;
 				catchInfo =
 					this.catchBlocks[i].analyseCode(
 						currentScope,
@@ -442,9 +338,7 @@
 			currentScope);
 
 		// chain up null info registry
-		if (flowContext.initsOnFinally != null) {
-			flowContext.mergeFinallyNullInfo(handlingContext.initsOnFinally);
-		}
+		flowContext.mergeFinallyNullInfo(handlingContext.initsOnFinally);
 
 		this.naturalExitMergeInitStateIndex =
 			currentScope.methodScope().recordInitializationStates(tryInfo);
@@ -472,6 +366,76 @@
 			flowInfo);
 }
 // SH}
+private MethodBinding findCloseMethod(final LocalDeclaration resource, LocalVariableBinding resourceBinding) {
+	MethodBinding closeMethod = null;
+	TypeBinding type = resourceBinding.type;
+	if (type != null && type.isValidBinding()) {
+		ReferenceBinding binding = (ReferenceBinding) type;
+		closeMethod = binding.getExactMethod(ConstantPool.Close, new TypeBinding [0], this.scope.compilationUnitScope()); // scope needs to be tighter
+		if(closeMethod == null) {
+			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380112
+			// closeMethod could be null if the binding is from an interface
+			// extending from multiple interfaces.
+			InvocationSite site = new InvocationSite.EmptyWithAstNode(resource);
+			closeMethod = this.scope.compilationUnitScope().findMethod(binding, ConstantPool.Close, new TypeBinding[0], site, false);
+		}
+	}
+	return closeMethod;
+}
+private FlowInfo prepareCatchInfo(FlowInfo flowInfo, ExceptionHandlingFlowContext handlingContext, FlowInfo tryInfo, int i) {
+	FlowInfo catchInfo;
+	if (isUncheckedCatchBlock(i)) {
+		catchInfo =
+			flowInfo.unconditionalCopy().
+				addPotentialInitializationsFrom(
+					handlingContext.initsOnException(i)).
+				addPotentialInitializationsFrom(tryInfo).
+				addPotentialInitializationsFrom(
+					handlingContext.initsOnReturn).
+			addNullInfoFrom(handlingContext.initsOnFinally);
+	} else {
+		FlowInfo initsOnException = handlingContext.initsOnException(i);
+		if ((handlingContext.tagBits & (FlowContext.DEFER_NULL_DIAGNOSTIC | FlowContext.PREEMPT_NULL_DIAGNOSTIC))
+				== FlowContext.DEFER_NULL_DIAGNOSTIC)
+		{
+			// if null diagnostics are being deferred, initsOnException are incomplete,
+			// need to start with the more accurate upstream flowInfo
+			catchInfo =
+				flowInfo.unconditionalCopy()
+					.addPotentialInitializationsFrom(initsOnException)
+					.addPotentialInitializationsFrom(
+							tryInfo.unconditionalCopy())
+					.addPotentialInitializationsFrom(
+							handlingContext.initsOnReturn.nullInfoLessUnconditionalCopy());						
+		} else {
+			// here initsOnException are precise, so use them as the only source for null information into the catch block:
+			catchInfo =
+				flowInfo.nullInfoLessUnconditionalCopy()
+					.addPotentialInitializationsFrom(initsOnException)
+					.addNullInfoFrom(initsOnException)
+					.addPotentialInitializationsFrom(
+							tryInfo.nullInfoLessUnconditionalCopy())
+					.addPotentialInitializationsFrom(
+							handlingContext.initsOnReturn.nullInfoLessUnconditionalCopy());
+		}
+	}
+
+	// catch var is always set
+	LocalVariableBinding catchArg = this.catchArguments[i].binding;
+	catchInfo.markAsDefinitelyAssigned(catchArg);
+	catchInfo.markAsDefinitelyNonNull(catchArg);
+	/*
+	"If we are about to consider an unchecked exception handler, potential inits may have occured inside
+	the try block that need to be detected , e.g.
+	try { x = 1; throwSomething();} catch(Exception e){ x = 2} "
+	"(uncheckedExceptionTypes notNil and: [uncheckedExceptionTypes at: index])
+	ifTrue: [catchInits addPotentialInitializationsFrom: tryInits]."
+	*/
+	if (this.tryBlock.statements == null && this.resources == NO_RESOURCES) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=350579
+		catchInfo.setReachMode(FlowInfo.UNREACHABLE_OR_DEAD);
+	}
+	return catchInfo;
+}
 // Return true if the catch block corresponds to an unchecked exception making allowance for multi-catch blocks.
 private boolean isUncheckedCatchBlock(int catchBlock) {
 	if (this.caughtExceptionsCatchBlocks == null) {
@@ -953,7 +917,8 @@
 			return false;
 	}
 	// optimize subroutine invocation sequences, using the targetLocation (if any)
-	if (targetLocation != null) {
+	CompilerOptions options = this.scope.compilerOptions();
+	if (options.shareCommonFinallyBlocks && targetLocation != null) {
 		boolean reuseTargetLocation = true;
 		if (this.reusableJSRTargetsCount > 0) {
 			nextReusableTarget: for (int i = 0, count = this.reusableJSRTargetsCount; i < count; i++) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
index 7a589e2..0bf7a85 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,6 +12,7 @@
  *     Stephan Herrmann - Contributions for
  *								Bug 360328 - [compiler][null] detect null problems in nested code (local class inside a loop)
  *								Bug 388630 - @NonNull diagnostics at line 0
+ *     Keigo Imai - Contribution for  bug 388903 - Cannot extend inner class as an anonymous class when it extends the outer class
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -1416,7 +1417,7 @@
 			if (enclosing.isNestedType()) {
 				NestedTypeBinding nestedEnclosing = (NestedTypeBinding)enclosing;
 //					if (nestedEnclosing.findSuperTypeErasingTo(nestedEnclosing.enclosingType()) == null) { // only if not inheriting
-					SyntheticArgumentBinding syntheticEnclosingInstanceArgument = nestedEnclosing.getSyntheticArgument(nestedEnclosing.enclosingType(), true);
+					SyntheticArgumentBinding syntheticEnclosingInstanceArgument = nestedEnclosing.getSyntheticArgument(nestedEnclosing.enclosingType(), true, false);
 					if (syntheticEnclosingInstanceArgument != null) {
 						nestedType.addSyntheticArgumentAndField(syntheticEnclosingInstanceArgument);
 					}
@@ -2137,17 +2138,14 @@
 				for (int i = 0; i < length; i++)
 					this.methods[i].traverse(visitor, this.scope);
 			}
-		}
 //{ObjectTeams
-		if(this.callinCallouts != null)
-		{
-			int methodBindingsLength = this.callinCallouts.length;
-			for(int idx = 0; idx < methodBindingsLength; idx++)
-			{
-				this.callinCallouts[idx].traverse(visitor,  this.scope);
+			if(this.callinCallouts != null) {
+				int methodBindingsLength = this.callinCallouts.length;
+				for(int idx = 0; idx < methodBindingsLength; idx++)
+					this.callinCallouts[idx].traverse(visitor,  this.scope);
 			}
-		}
 // Joachim Haensel}
+		}
 		visitor.endVisit(this, unitScope);
 	} catch (AbortType e) {
 		// silent abort
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.java
index 81b9323..ed03863 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -9,6 +9,7 @@
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								bug 403086 - [compiler][null] include the effect of 'assert' in syntactic null analysis for fields
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -35,10 +36,11 @@
 		FlowInfo flowInfo) {
 	this.expression.checkNPE(currentScope, flowContext, flowInfo);
 	if (((this.bits & OperatorMASK) >> OperatorSHIFT) == NOT) {
+		flowContext.tagBits ^= FlowContext.INSIDE_NEGATION;
 		flowInfo = this.expression.
 			analyseCode(currentScope, flowContext, flowInfo).
 			asNegatedCondition();
-		flowContext.expireNullCheckedFieldInfo();
+		flowContext.tagBits ^= FlowContext.INSIDE_NEGATION;
 		return flowInfo;
 	} else {
 		return this.expression.
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java
index 54b3a16..837f432 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -11,6 +11,7 @@
  *     							bug 319201 - [null] no warning when unboxing SingleNameReference causes NPE
  *     							bug 349326 - [1.7] new warning for missing try-with-resources
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -67,9 +68,7 @@
 					new LoopingFlowContext(flowContext, flowInfo, this, null,
 						null, currentScope, true)),
 				condInfo);
-		if ((this.condition.implicitConversion & TypeIds.UNBOXING) != 0) {
-			this.condition.checkNPE(currentScope, flowContext, flowInfo);
-		}
+		this.condition.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 
 		LoopingFlowContext loopingContext;
 		FlowInfo actionInfo;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.java
index 407e5a6..27f4ea2 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2011 BEA Systems, Inc.
+ * Copyright (c) 2005, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/INameEnvironment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/INameEnvironment.java
index 19af297..9a7a2e0 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/INameEnvironment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/INameEnvironment.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java
index 2a3bded..d860a8d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -9,6 +9,7 @@
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
+ *								bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.flow;
 
@@ -78,7 +79,6 @@
 	this(parent, tryStatement, handledExceptions, exceptionToCatchBlockMap, 
 			tryStatement.catchArguments, initializationParent, scope, flowInfo.unconditionalInits());
 	this.initsOnFinally = flowInfo.unconditionalCopy();
-	this.conditionalLevel = 0;	
 }
 ExceptionHandlingFlowContext(
 		FlowContext parent,
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java
index 2efcbd9..d918879 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -14,6 +14,7 @@
  *								bug 365859 - [compiler][null] distinguish warnings based on flow analysis vs. null annotations
  *								bug 385626 - @NonNull fails across loop boundaries
  *								bug 388996 - [compiler][resource] Incorrect 'potential resource leak'
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.flow;
 
@@ -32,14 +33,14 @@
  * Reflects the context of code analysis, keeping track of enclosing
  *	try statements, exception handlers, etc...
  */
-public class FinallyFlowContext extends FlowContext {
+public class FinallyFlowContext extends TryFlowContext {
 
 	Reference[] finalAssignments;
 	VariableBinding[] finalVariables;
 	int assignCount;
 
 	// the following three arrays are in sync regarding their indices:
-	LocalVariableBinding[] nullLocals;
+	LocalVariableBinding[] nullLocals; // slots can be null for checkType == IN_UNBOXING
 	ASTNode[] nullReferences;	// Expressions for null checking, Statements for resource analysis
 								// cast to Expression is safe if corresponding nullCheckType != EXIT_RESOURCE
 	int[] nullCheckTypes;
@@ -98,15 +99,21 @@
 	// check inconsistent null checks
 	if ((this.tagBits & FlowContext.DEFER_NULL_DIAGNOSTIC) != 0) { // within an enclosing loop, be conservative
 		for (int i = 0; i < this.nullCount; i++) {
-			if ((this.nullCheckTypes[i] & ~HIDE_NULL_COMPARISON_WARNING_MASK) == ASSIGN_TO_NONNULL) {
-				int nullStatus = flowInfo.nullStatus(this.nullLocals[i]);
-				if (nullStatus != FlowInfo.NON_NULL) {
-					this.parent.recordNullityMismatch(scope, (Expression)this.nullReferences[i],
-							this.providedExpectedTypes[i][0], this.providedExpectedTypes[i][1], nullStatus);
-				}
-			} else {
-				this.parent.recordUsingNullReference(scope, this.nullLocals[i],
-						this.nullReferences[i],	this.nullCheckTypes[i], flowInfo);
+			ASTNode location = this.nullReferences[i];
+			switch (this.nullCheckTypes[i] & ~HIDE_NULL_COMPARISON_WARNING_MASK) {
+				case ASSIGN_TO_NONNULL:
+					int nullStatus = flowInfo.nullStatus(this.nullLocals[i]);
+					if (nullStatus != FlowInfo.NON_NULL) {
+						this.parent.recordNullityMismatch(scope, (Expression) location,
+								this.providedExpectedTypes[i][0], this.providedExpectedTypes[i][1], nullStatus);
+					}
+					break;
+				case IN_UNBOXING:
+					checkUnboxing(scope, (Expression) location, flowInfo);
+					break;
+				default:
+					this.parent.recordUsingNullReference(scope, this.nullLocals[i],
+							this.nullReferences[i],	this.nullCheckTypes[i], flowInfo);
 			}
 
 		}
@@ -195,6 +202,9 @@
 						scope.problemReporter().nullityMismatch((Expression) location, this.providedExpectedTypes[i][0], this.providedExpectedTypes[i][1], nullStatus, annotationName);
 					}
 					break;
+				case IN_UNBOXING:
+					checkUnboxing(scope, (Expression) location, flowInfo);	
+					break;
 				default:
 					// should not happen
 			}
@@ -423,10 +433,10 @@
 	}
 
 protected void recordNullReference(LocalVariableBinding local,
-	ASTNode expression, int status) {
+	ASTNode expression, int checkType) {
 	if (this.nullCount == 0) {
 		this.nullLocals = new LocalVariableBinding[5];
-		this.nullReferences = new Expression[5];
+		this.nullReferences = new ASTNode[5];
 		this.nullCheckTypes = new int[5];
 	}
 	else if (this.nullCount == this.nullLocals.length) {
@@ -435,7 +445,7 @@
 			this.nullLocals = new LocalVariableBinding[newLength], 0,
 			this.nullCount);
 		System.arraycopy(this.nullReferences, 0,
-			this.nullReferences = new Expression[newLength], 0,
+			this.nullReferences = new ASTNode[newLength], 0,
 			this.nullCount);
 		System.arraycopy(this.nullCheckTypes, 0,
 			this.nullCheckTypes = new int[newLength], 0,
@@ -443,7 +453,13 @@
 	}
 	this.nullLocals[this.nullCount] = local;
 	this.nullReferences[this.nullCount] = expression;
-	this.nullCheckTypes[this.nullCount++] = status;
+	this.nullCheckTypes[this.nullCount++] = checkType;
+}
+public void recordUnboxing(Scope scope, Expression expression, int nullStatus, FlowInfo flowInfo) {
+	if (nullStatus == FlowInfo.NULL)
+		super.recordUnboxing(scope, expression, nullStatus, flowInfo);
+	else // defer checking:
+		recordNullReference(null, expression, IN_UNBOXING);
 }
 protected boolean internalRecordNullityMismatch(Expression expression, TypeBinding providedType, int nullStatus, TypeBinding expectedType, int checkType) {
 	// cf. decision structure inside FinallyFlowContext.recordUsingNullReference(..)
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FlowContext.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FlowContext.java
index 664d240..5ae2b8b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FlowContext.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FlowContext.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -14,6 +14,9 @@
  *								bug 365859 - [compiler][null] distinguish warnings based on flow analysis vs. null annotations
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
+ *								bug 403086 - [compiler][null] include the effect of 'assert' in syntactic null analysis for fields
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.flow;
 
@@ -79,8 +82,8 @@
 
 	public static final int DEFER_NULL_DIAGNOSTIC = 0x1;
 	public static final int PREEMPT_NULL_DIAGNOSTIC = 0x2;
-	// inside an assertFalse checks for equality / inequality have reversed meaning for syntactic analysis for fields:
-	public static final int INSIDE_NEGATIVE_ASSERT = 0x4;
+	// inside an assertFalse or a not-expression checks for equality / inequality have reversed meaning for syntactic analysis for fields:
+	public static final int INSIDE_NEGATION = 0x4;
 	/**
 	 * used to hide null comparison related warnings inside assert statements 
 	 */
@@ -96,6 +99,8 @@
 public static final int MAY_NULL = 0x0003;
 //check binding a value to a @NonNull variable 
 public final static int ASSIGN_TO_NONNULL = 0x0080;
+//check against an unboxing conversion
+public static final int IN_UNBOXING = 0x0010;
 //check against unclosed resource at early exit:
 public static final int EXIT_RESOURCE = 0x0800;
 // check against null, with potential values -- NPE guard
@@ -643,11 +648,11 @@
 
 /**
  * Record a given null status of a given local variable as it will be seen in the finally block.
- * Precondition: caller has checked that initsOnFinally != null.
  * @param local the local variable being observed
  * @param nullStatus the null status of local at the current point in the flow
  */
 public void markFinallyNullStatus(LocalVariableBinding local, int nullStatus) {
+	if (this.initsOnFinally == null) return;
 	if (this.conditionalLevel == -1) return;
 	if (this.conditionalLevel == 0) {
 		// node is unconditionally reached, take nullStatus as is:
@@ -667,6 +672,7 @@
  * @param flowInfo info after executing a statement of the try-block.
  */
 public void mergeFinallyNullInfo(FlowInfo flowInfo) {
+	if (this.initsOnFinally == null) return;
 	if (this.conditionalLevel == -1) return;
 	if (this.conditionalLevel == 0) {
 		// node is unconditionally reached, take null info as is:
@@ -740,23 +746,53 @@
 
 /**
  * Record a null reference for use by deferred checks. Only looping or
- * finally contexts really record that information.
+ * finally contexts really record that information. Other contexts
+ * immediately check for unboxing.
  * @param local the local variable involved in the check
  * @param location the location triggering the analysis, for normal null dereference
  *      this is an expression resolving to 'local', for resource leaks it is an
  *      early exit statement.
- * @param status the status against which the check must be performed; one of
+ * @param checkType the checkType against which the check must be performed; one of
  * 		{@link #CAN_ONLY_NULL CAN_ONLY_NULL}, {@link #CAN_ONLY_NULL_NON_NULL
  * 		CAN_ONLY_NULL_NON_NULL}, {@link #MAY_NULL MAY_NULL},
  *      {@link #CAN_ONLY_NON_NULL CAN_ONLY_NON_NULL}, potentially
  *      combined with a context indicator (one of {@link #IN_COMPARISON_NULL},
- *      {@link #IN_COMPARISON_NON_NULL}, {@link #IN_ASSIGNMENT} or {@link #IN_INSTANCEOF})
+ *      {@link #IN_COMPARISON_NON_NULL}, {@link #IN_ASSIGNMENT} or {@link #IN_INSTANCEOF}).
+ *      <br>
+ *      Alternatively, a {@link #IN_UNBOXING} check can e requested.
  */
 protected void recordNullReference(LocalVariableBinding local,
-	ASTNode location, int status) {
+	ASTNode location, int checkType) {
 	// default implementation: do nothing
 }
 
+/**
+ * Either AST analysis or checking of a child flow context has encountered an unboxing situation.
+ * Record this fact for handling at an appropriate point in time.
+ * @param nullStatus the status as we know it so far.
+ */
+public void recordUnboxing(Scope scope, Expression expression, int nullStatus, FlowInfo flowInfo) {
+	// default: handle immediately:
+	checkUnboxing(scope, expression, flowInfo);
+}
+/** During deferred checking re-visit a previously recording unboxing situation. */
+protected void checkUnboxing(Scope scope, Expression expression, FlowInfo flowInfo) {
+	int status = expression.nullStatus(flowInfo, this);
+	if ((status & FlowInfo.NULL) != 0) {
+		scope.problemReporter().nullUnboxing(expression, expression.resolvedType);
+		return;
+	} else if ((status & FlowInfo.POTENTIALLY_NULL) != 0) {
+		scope.problemReporter().potentialNullUnboxing(expression, expression.resolvedType);
+		return;
+	} else if ((status & FlowInfo.NON_NULL) != 0) {
+		return;
+	}
+	// not handled, perhaps our parent will eventually have something to say?
+	if (this.parent != null) {
+		this.parent.recordUnboxing(scope, expression, FlowInfo.UNKNOWN, flowInfo);
+	}
+}
+
 public void recordReturnFrom(UnconditionalFlowInfo flowInfo) {
 	// default implementation: do nothing
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/InsideSubRoutineFlowContext.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/InsideSubRoutineFlowContext.java
index 4daa2c7..915f0c0 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/InsideSubRoutineFlowContext.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/InsideSubRoutineFlowContext.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -17,7 +17,7 @@
  * Reflects the context of code analysis, keeping track of enclosing
  *	try statements, exception handlers, etc...
  */
-public class InsideSubRoutineFlowContext extends FlowContext {
+public class InsideSubRoutineFlowContext extends TryFlowContext {
 
 	public UnconditionalFlowInfo initsOnReturn;
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.java
index 5dcf13a..2befb45 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -16,6 +16,8 @@
  *								bug 385626 - @NonNull fails across loop boundaries
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *								bug 376263 - Bogus "Potential null pointer access" warning
+ *								bug 403147 - [compiler][null] FUP of bug 400761: consolidate interaction between unboxing, NPE, and deferred checking
+ *								bug 406384 - Internal error with I20130413
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.flow;
 
@@ -55,7 +57,7 @@
 	int assignCount = 0;
 
 	// the following three arrays are in sync regarding their indices:
-	LocalVariableBinding[] nullLocals;
+	LocalVariableBinding[] nullLocals; // slots can be null for checkType == IN_UNBOXING
 	ASTNode[] nullReferences;	// Expressions for null checking, Statements for resource analysis
 								// cast to Expression is safe if corresponding nullCheckType != EXIT_RESOURCE
 	int[] nullCheckTypes;
@@ -276,6 +278,9 @@
 							}
 						}
 					break;
+				case IN_UNBOXING:
+					checkUnboxing(scope, (Expression) location, flowInfo);
+					continue; // delegation to parent already handled in the above.
 				default:
 					// never happens
 			}
@@ -396,6 +401,9 @@
 						}
 					}
 					break;
+				case IN_UNBOXING:
+					checkUnboxing(scope, (Expression) location, flowInfo);
+					break;
 				default:
 					// never happens
 			}
@@ -518,7 +526,7 @@
 	}
 
 protected void recordNullReference(LocalVariableBinding local,
-	ASTNode expression, int status) {
+	ASTNode expression, int checkType) {
 	if (this.nullCount == 0) {
 		this.nullLocals = new LocalVariableBinding[5];
 		this.nullReferences = new ASTNode[5];
@@ -534,7 +542,13 @@
 	}
 	this.nullLocals[this.nullCount] = local;
 	this.nullReferences[this.nullCount] = expression;
-	this.nullCheckTypes[this.nullCount++] = status;
+	this.nullCheckTypes[this.nullCount++] = checkType;
+}
+public void recordUnboxing(Scope scope, Expression expression, int nullStatus, FlowInfo flowInfo) {
+	if (nullStatus == FlowInfo.NULL)
+		super.recordUnboxing(scope, expression, nullStatus, flowInfo);
+	else // defer checking:
+		recordNullReference(null, expression, IN_UNBOXING);
 }
 
 /** Record the fact that we see an early exit (in 'reference') while 'trackingVar' is in scope and may be unclosed. */
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/TryFlowContext.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/TryFlowContext.java
new file mode 100644
index 0000000..1623e51
--- /dev/null
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/TryFlowContext.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2013 GK Software AG 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Stephan Herrmann - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.internal.compiler.flow;
+
+import org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
+
+/**
+ * Shared implementation for try-statement-related flow contexts.
+ */
+public abstract class TryFlowContext extends FlowContext {
+
+	/**
+	 * For a try statement nested inside a finally block this reference
+	 * points to the flow context of the outer try block, for access to its initsOnFinally.
+	 */
+	public FlowContext outerTryContext;
+
+	public TryFlowContext(FlowContext parent, ASTNode associatedNode) {
+		super(parent, associatedNode);
+	}
+	
+	public void markFinallyNullStatus(LocalVariableBinding local, int nullStatus) {
+		if (this.outerTryContext != null) {
+			this.outerTryContext.markFinallyNullStatus(local, nullStatus);
+		}
+		super.markFinallyNullStatus(local, nullStatus);
+	}
+
+	public void mergeFinallyNullInfo(FlowInfo flowInfo) {
+		if (this.outerTryContext != null) {
+			this.outerTryContext.mergeFinallyNullInfo(flowInfo);
+		}
+		super.mergeFinallyNullInfo(flowInfo);
+	}
+}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
index 06a761e..129ad7f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -21,6 +21,8 @@
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
  *								bug 381443 - [compiler][null] Allow parameter widening from @NonNull to unannotated
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *     Jesper Steen Moller - Contributions for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.impl;
 
@@ -121,6 +123,7 @@
 	public static final String OPTION_TaskPriorities = "org.eclipse.jdt.core.compiler.taskPriorities"; //$NON-NLS-1$
 	public static final String OPTION_TaskCaseSensitive = "org.eclipse.jdt.core.compiler.taskCaseSensitive"; //$NON-NLS-1$
 	public static final String OPTION_InlineJsr = "org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode"; //$NON-NLS-1$
+	public static final String OPTION_ShareCommonFinallyBlocks = "org.eclipse.jdt.core.compiler.codegen.shareCommonFinallyBlocks"; //$NON-NLS-1$
 	public static final String OPTION_ReportNullReference = "org.eclipse.jdt.core.compiler.problem.nullReference"; //$NON-NLS-1$
 	public static final String OPTION_ReportPotentialNullReference = "org.eclipse.jdt.core.compiler.problem.potentialNullReference"; //$NON-NLS-1$
 	public static final String OPTION_ReportRedundantNullCheck = "org.eclipse.jdt.core.compiler.problem.redundantNullCheck"; //$NON-NLS-1$
@@ -482,6 +485,8 @@
 	public boolean reportMissingJavadocCommentsOverriding;
 	/** Indicate whether the JSR bytecode should be inlined to avoid its presence in classfile */
 	public boolean inlineJsrBytecode;
+	/** Indicate whether common escaping finally blocks should be shared */
+	public boolean shareCommonFinallyBlocks;
 	/** Indicate if @SuppressWarning annotations are activated */
 	public boolean suppressWarnings;
 	/** Indicate if @SuppressWarning annotations should also suppress optional errors */
@@ -1396,6 +1401,7 @@
 		optionsMap.put(OPTION_ReportSpecialParameterHidingField, this.reportSpecialParameterHidingField ? ENABLED : DISABLED);
 		optionsMap.put(OPTION_MaxProblemPerUnit, String.valueOf(this.maxProblemsPerUnit));
 		optionsMap.put(OPTION_InlineJsr, this.inlineJsrBytecode ? ENABLED : DISABLED);
+		optionsMap.put(OPTION_ShareCommonFinallyBlocks, this.shareCommonFinallyBlocks ? ENABLED : DISABLED);
 		optionsMap.put(OPTION_ReportNullReference, getSeverityString(NullReference));
 		optionsMap.put(OPTION_ReportPotentialNullReference, getSeverityString(PotentialNullReference));
 		optionsMap.put(OPTION_ReportRedundantNullCheck, getSeverityString(RedundantNullCheck));
@@ -1577,8 +1583,9 @@
 		this.reportMissingJavadocCommentsVisibility = ClassFileConstants.AccPublic;
 		this.reportMissingJavadocCommentsOverriding = false;
 		
-		// JSR bytecode inlining
+		// JSR bytecode inlining and sharing
 		this.inlineJsrBytecode = false;
+		this.shareCommonFinallyBlocks = false;
 
 		// javadoc comment support
 		this.docCommentSupport = false;
@@ -1817,6 +1824,13 @@
 				}
 			}
 		}
+		if ((optionValue = optionsMap.get(OPTION_ShareCommonFinallyBlocks)) != null) {
+			if (ENABLED.equals(optionValue)) {
+				this.shareCommonFinallyBlocks = true;
+			} else if (DISABLED.equals(optionValue)) {
+				this.shareCommonFinallyBlocks = false;
+			}
+		}
 		if ((optionValue = optionsMap.get(OPTION_SuppressWarnings)) != null) {
 			if (ENABLED.equals(optionValue)) {
 				this.suppressWarnings = true;
@@ -2189,6 +2203,7 @@
 		buf.append("\n\t- report unused parameter include doc comment reference : ").append(this.reportUnusedParameterIncludeDocCommentReference ? ENABLED : DISABLED); //$NON-NLS-1$
 		buf.append("\n\t- report constructor/setter parameter hiding existing field : ").append(this.reportSpecialParameterHidingField ? ENABLED : DISABLED); //$NON-NLS-1$
 		buf.append("\n\t- inline JSR bytecode : ").append(this.inlineJsrBytecode ? ENABLED : DISABLED); //$NON-NLS-1$
+		buf.append("\n\t- share common finally blocks : ").append(this.shareCommonFinallyBlocks ? ENABLED : DISABLED); //$NON-NLS-1$
 		buf.append("\n\t- report unavoidable generic type problems : ").append(this.reportUnavoidableGenericTypeProblems ? ENABLED : DISABLED); //$NON-NLS-1$
 		buf.append("\n\t- unsafe type operation: ").append(getSeverityString(UncheckedTypeOperation)); //$NON-NLS-1$
 		buf.append("\n\t- unsafe raw type: ").append(getSeverityString(RawTypeReference)); //$NON-NLS-1$
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
index dba49a4..aad0916 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java
index 22c138a..9e9a2f4 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.java
index 1e11782..8a77315 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
index e496d99..89d428e 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java
index f18fac1..966e914 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -19,6 +19,9 @@
  *								bug 388996 - [compiler][resource] Incorrect 'potential resource leak'
  *								bug 379784 - [compiler] "Method can be static" is not getting reported
  *								bug 394768 - [compiler][resource] Incorrect resource leak warning when creating stream in conditional
+ *     Jesper S Moller <jesper@selskabet.org> - Contributions for
+ *								bug 378674 - "The method can be declared as static" is wrong
+ *     Keigo Imai - Contribution for  bug 388903 - Cannot extend inner class as an anonymous class when it extends the outer class
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.lookup;
 
@@ -672,6 +675,8 @@
 				field.declaringClass,
 				CharOperation.concatWith(CharOperation.subarray(compoundName, 0, currentIndex), '.'),
 				ProblemReasons.NonStaticReferenceInStaticContext);
+		// Since a qualified reference must be for a static member, it won't affect static-ness of the enclosing method, 
+		// so we don't have to call resetEnclosingMethodStaticFlag() in this case
 		return binding;
 	}
 	if ((mask & Binding.TYPE) != 0 && (binding instanceof ReferenceBinding)) {
@@ -874,10 +879,13 @@
 	// use synthetic constructor arguments if possible
 	if (insideConstructor) {
 		SyntheticArgumentBinding syntheticArg;
-		if ((syntheticArg = ((NestedTypeBinding) sourceType).getSyntheticArgument(targetEnclosingType, onlyExactMatch)) != null) {
+		if ((syntheticArg = ((NestedTypeBinding) sourceType).getSyntheticArgument(targetEnclosingType, onlyExactMatch, currentMethodScope.isConstructorCall)) != null) {
+			boolean isAnonymousAndHasEnclosing = sourceType.isAnonymousType()
+				&& sourceType.scope.referenceContext.allocation.enclosingInstance != null;
 			// reject allocation and super constructor call
 			if (denyEnclosingArgInConstructorCall
 					&& currentMethodScope.isConstructorCall
+					&& !isAnonymousAndHasEnclosing
 					&& (sourceType == targetEnclosingType || (!onlyExactMatch && sourceType.findSuperTypeOriginatingFrom(targetEnclosingType) != null))) {
 				return BlockScope.NoEnclosingInstanceInConstructorCall;
 			}
@@ -889,7 +897,7 @@
 	if (currentMethodScope.isStatic && sourceType.isRole())
 	{
 		SyntheticArgumentBinding syntheticArg;
-		if ((syntheticArg = ((NestedTypeBinding) sourceType).getSyntheticArgument(targetEnclosingType, onlyExactMatch)) != null) {
+		if ((syntheticArg = ((NestedTypeBinding) sourceType).getSyntheticArgument(targetEnclosingType, onlyExactMatch, false)) != null) {
 			return new Object[] { syntheticArg };
 		}
 	}
@@ -908,7 +916,7 @@
 		ReferenceBinding enclosingType = sourceType.enclosingType();
 		if (enclosingType.isNestedType()) {
 			NestedTypeBinding nestedEnclosingType = (NestedTypeBinding) enclosingType;
-			SyntheticArgumentBinding enclosingArgument = nestedEnclosingType.getSyntheticArgument(nestedEnclosingType.enclosingType(), onlyExactMatch);
+			SyntheticArgumentBinding enclosingArgument = nestedEnclosingType.getSyntheticArgument(nestedEnclosingType.enclosingType(), onlyExactMatch, currentMethodScope.isConstructorCall);
 			if (enclosingArgument != null) {
 				FieldBinding syntheticField = sourceType.getSyntheticField(enclosingArgument);
 				if (syntheticField != null) {
@@ -930,7 +938,7 @@
 	Object[] path = new Object[2]; // probably at least 2 of them
 	ReferenceBinding currentType = sourceType.enclosingType();
 	if (insideConstructor) {
-		path[0] = ((NestedTypeBinding) sourceType).getSyntheticArgument(currentType, onlyExactMatch);
+		path[0] = ((NestedTypeBinding) sourceType).getSyntheticArgument(currentType, onlyExactMatch, currentMethodScope.isConstructorCall);
 	} else {
 		if (currentMethodScope.isConstructorCall){
 			return BlockScope.NoEnclosingInstanceInConstructorCall;
@@ -939,7 +947,7 @@
 	  if (currentMethodScope.isStatic && sourceType.isRole())
 	  {
 		  SyntheticArgumentBinding syntheticArg;
-		  if ((syntheticArg = ((NestedTypeBinding) sourceType).getSyntheticArgument(currentType, onlyExactMatch)) != null)
+		  if ((syntheticArg = ((NestedTypeBinding) sourceType).getSyntheticArgument(currentType, onlyExactMatch, false)) != null)
 			  path[0] = syntheticArg;
 		  else
 			  return null;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
index 4c6d589..d97eed5 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
@@ -748,7 +748,7 @@
 	/**
 	 * build Callin and Callout
 	 */
-	private void buildCallinCallouts() {
+	public void buildCallinCallouts() {
 		if (this.referenceContext.callinCallouts == null) {
 			this.referenceContext.binding.callinCallouts = Binding.NO_CALLIN_CALLOUT_BINDINGS;
 			return;
@@ -761,6 +761,9 @@
 			return;
 		}
 
+		if (this.referenceContext.binding.callinCallouts != null)
+			return; // already done
+
 		// iterate the binding declarations to create the bindings
 		AbstractMethodMappingDeclaration[] callinCallouts = this.referenceContext.callinCallouts;
 		int size = callinCallouts.length;
@@ -1806,7 +1809,8 @@
 					// pretend "implements o.o.IBoundBase", will be generated by the OTRE:
 					baseclass.setIsBoundBase(sourceType);
 
-					StandardElementGenerator.checkCreateBaseField(this.referenceContext, baseclass, true);
+					boolean createBinding = sourceType.unResolvedFields() != Binding.UNINITIALIZED_FIELDS; // don't create field binding if none have been built yet
+					StandardElementGenerator.checkCreateBaseField(this.referenceContext, baseclass, createBinding);
 					return true;
 				}
 		    }
@@ -1825,6 +1829,14 @@
 		return false; // reported some error against the source type
 	}
 
+	public void connectBaseclassRecurse() {
+		connectBaseclass();
+		TypeDeclaration[] members = this.referenceContext.memberTypes;
+		if (members != null)
+			for (TypeDeclaration member : members)
+				member.scope.connectBaseclassRecurse();
+	}
+
 	private boolean areEqualTypeParameters(TypeVariableBinding[] roleTypeVariables, TypeBinding[] baseTypeArguments) {
 		if (roleTypeVariables.length != baseTypeArguments.length)
 			return false;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java
index 792d9a2..ed09551 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java
@@ -103,6 +103,12 @@
 	for (int i = 0, length = this.topLevelTypes.length; i < length; i++)
 		this.topLevelTypes[i].scope.buildFieldsAndMethods();
 }
+//{ObjectTeams: extract from the above:
+public void connectBaseclass() {
+	for (int i = 0, length = this.topLevelTypes.length; i < length; i++)
+		this.topLevelTypes[i].scope.connectBaseclassRecurse();	
+}
+// SH}
 void buildTypeBindings(AccessRestriction accessRestriction) {
 	this.topLevelTypes = new SourceTypeBinding[0]; // want it initialized if the package cannot be resolved
 	boolean firstIsSynthetic = false;
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 4288443..2afd2b6 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java
index be1b765..beef97c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012 GK Software AG and others.
+ * Copyright (c) 2012, 2013 GK Software AG 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
@@ -76,6 +76,10 @@
 			if (currentType.id == TypeIds.T_JavaLangObject) {
 				return;
 			}
+//{ObjectTeams: other top types:
+			if (TypeAnalyzer.isTopConfined(currentType))
+				return;
+// SH}
 			boolean needToApplyNonNullDefault = currentMethod.hasNonNullDefault();
 			// compatibility & inheritance do not consider constructors / static methods:
 			boolean isInstanceMethod = !currentMethod.isConstructor() && !currentMethod.isStatic();
@@ -143,6 +147,10 @@
 	{
 		if (currentType.id == TypeIds.T_JavaLangObject)
 			return;
+//{ObjectTeams: other top types:
+		if (TypeAnalyzer.isTopConfined(currentType))
+			return;
+// SH}
 
 		// superclass:
 		collectOverriddenMethods(original, selector, suggestedParameterLength, currentType.superclass(), ifcsSeen, result);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.java
index a09b056..19c1ec1 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,9 +7,13 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								bug 384380 - False positive on a « Potential null pointer access » after a continue
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.lookup;
 
+import org.eclipse.jdt.internal.compiler.ast.ASTNode;
+
 public interface InvocationSite {
 
 	TypeBinding[] genericTypeArguments();
@@ -25,4 +29,20 @@
 	int sourceEnd();
 	int sourceStart();
 	TypeBinding expectedType();
+	
+	static class EmptyWithAstNode implements InvocationSite {
+		ASTNode node;
+		public EmptyWithAstNode(ASTNode node) {
+			this.node = node;
+		}
+		public TypeBinding[] genericTypeArguments() { return null;}
+		public boolean isSuperAccess() {return false;}
+		public boolean isTypeAccess() {return false;}
+		public void setActualReceiverType(ReferenceBinding receiverType) {/* empty */}
+		public void setDepth(int depth) {/* empty */ }
+		public void setFieldIndex(int depth) {/* empty */ }
+		public int sourceEnd() {return this.node.sourceEnd; }
+		public int sourceStart() {return this.node.sourceStart; }
+		public TypeBinding expectedType() { return null; }
+	}
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.java
index e23a0b9..cae923b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
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 08976f6..e3235b0 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
@@ -47,6 +47,7 @@
 import org.eclipse.objectteams.otdt.internal.core.compiler.statemachine.transformer.TeamMethodGenerator;
 import org.eclipse.objectteams.otdt.internal.core.compiler.util.AstEdit;
 import org.eclipse.objectteams.otdt.internal.core.compiler.util.RoleFileHelper;
+import org.eclipse.objectteams.otdt.internal.core.compiler.util.TypeAnalyzer;
 
 /**
  * OTDT changes:
@@ -511,11 +512,17 @@
 		  boolean done = false;
 		  if (parsedUnit.state.getState() < ITranslationStates.STATE_LENV_DONE_FIELDS_AND_METHODS)
 		  {
+			// also roles with anchored baseclass need fields:
+			if (TypeAnalyzer.containsAnchoredBaseclass(parsedUnit))
+				buildFieldsAndMethods[i] = true;
 // SH}
 			(this.unitBeingCompleted = parsedUnit).scope.checkParameterizedTypes();
 			if (buildFieldsAndMethods[i])
 				parsedUnit.scope.buildFieldsAndMethods();
-//{ObjectTeams: record that we are done:
+//{ObjectTeams: roles *always* need their baseclass:
+			else
+				parsedUnit.scope.connectBaseclass();
+			// record that we are done:
 			done = true;
 		  }
 		  StateHelper.setStateRecursive(parsedUnit, ITranslationStates.STATE_LENV_DONE_FIELDS_AND_METHODS, done);
@@ -1196,7 +1203,7 @@
 				if (teamAnchor != null) {
 					if (!(cachedType instanceof DependentTypeBinding))
 						continue nextCachedType;
-					if (((DependentTypeBinding)cachedType)._teamAnchor != teamAnchor)
+					if (!((DependentTypeBinding)cachedType)._teamAnchor.hasSameBestNameAs(teamAnchor))
 						continue nextCachedType;
 				}
 				if (   valueParamPosition > -1 							// position specified, requires dependent type
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 d0701fa..d400c87 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,10 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
  * http://www.eclipse.org/legal/epl-v10.html
- * $Id: MethodVerifier.java 23405 2010-02-03 17:02:18Z stephan $
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -13,18 +12,25 @@
  *     Technical University Berlin - extended API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
+ *								bug 395681 - [compiler] Improve simulation of javac6 behavior from bug 317719 after fixing bug 388795
+ *								bug 406928 - computation of inherited methods seems damaged (affecting @Overrides)
+ *								bug 409473 - [compiler] JDT cannot compile against JRE 1.8
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.lookup;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 import org.eclipse.jdt.core.compiler.CharOperation;
-import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
-import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
-import org.eclipse.jdt.internal.compiler.ast.TypeReference;
+import org.eclipse.jdt.internal.compiler.ast.*;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 import org.eclipse.jdt.internal.compiler.util.HashtableOfObject;
 import org.eclipse.jdt.internal.compiler.util.SimpleSet;
+import org.eclipse.jdt.internal.compiler.util.Sorting;
 import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
 import org.eclipse.objectteams.otdt.core.compiler.OTNameUtils;
 import org.eclipse.objectteams.otdt.internal.core.compiler.mappings.CalloutImplementor;
@@ -58,7 +64,7 @@
  * Why:  would report unimplemented methods.
  *
  */
-public class MethodVerifier extends ImplicitNullAnnotationVerifier {
+public abstract class MethodVerifier extends ImplicitNullAnnotationVerifier {
 	SourceTypeBinding type;
 	HashtableOfObject inheritedMethods;
 	HashtableOfObject currentMethods;
@@ -318,13 +324,16 @@
 			if (reportIncompatibleReturnTypeError(currentMethod, inheritedMethod))
 				return; // orig: continue nextMethod;
 		}
-
+	reportRawReferences(currentMethod, inheritedMethod); // if they were deferred, emit them now.
 	if (currentMethod.thrownExceptions != Binding.NO_EXCEPTIONS)
 		checkExceptions(currentMethod, inheritedMethod);
 	if (inheritedMethod.isFinal())
 		problemReporter(currentMethod).finalMethodCannotBeOverridden(currentMethod, inheritedMethod);
 	if (!isAsVisible(currentMethod, inheritedMethod))
 /*OT:*/		this.problemReporter(currentMethod).tsubMethodReducesVisibility(currentMethod, inheritedMethod);
+	if(inheritedMethod.isSynchronized() && !currentMethod.isSynchronized()) {
+		problemReporter(currentMethod).missingSynchronizedOnInheritedMethod(currentMethod, inheritedMethod);
+	}
 	if (options.reportDeprecationWhenOverridingDeprecatedMethod && inheritedMethod.isViewedAsDeprecated()) {
 		if (!currentMethod.isViewedAsDeprecated() || options.reportDeprecationInsideDeprecatedCode) {
 
@@ -526,7 +535,7 @@
 	}
 }
 
-void checkInheritedMethods(MethodBinding[] methods, int length) {
+void checkInheritedMethods(MethodBinding[] methods, int length, boolean[] isOverridden) {
 	/*
 	1. find concrete method
 	2. if it doesn't exist then find first inherited abstract method whose return type is compatible with all others
@@ -563,7 +572,7 @@
 				}
 			}
 		} else if (noMatch) {
-			problemReporter().inheritedMethodsHaveIncompatibleReturnTypes(this.type, methods, length);
+			problemReporter().inheritedMethodsHaveIncompatibleReturnTypes(this.type, methods, length, isOverridden);
 		}
 		return;
 	}
@@ -575,7 +584,7 @@
 		// concreteMethod is not the best match
 		MethodBinding bestAbstractMethod = findBestInheritedAbstractMethod(methods, length);
 		if (bestAbstractMethod == null)
-			problemReporter().inheritedMethodsHaveIncompatibleReturnTypes(this.type, methods, length);
+			problemReporter().inheritedMethodsHaveIncompatibleReturnTypes(this.type, methods, length, isOverridden);
 		else // can only happen in >= 1.5 since return types must be equal prior to 1.5
 			problemReporter().abstractMethodMustBeImplemented(this.type, bestAbstractMethod, concreteMethod);
 		return;
@@ -621,87 +630,7 @@
 				else
 					complain about missing implementation only if type is NOT an interface or abstract
 */
-void checkMethods() {
-	boolean mustImplementAbstractMethods = mustImplementAbstractMethods();
-	boolean skipInheritedMethods = mustImplementAbstractMethods && canSkipInheritedMethods(); // have a single concrete superclass so only check overridden methods
-	boolean isOrEnclosedByPrivateType = this.type.isOrEnclosedByPrivateType();
-	char[][] methodSelectors = this.inheritedMethods.keyTable;
-	nextSelector : for (int s = methodSelectors.length; --s >= 0;) {
-		if (methodSelectors[s] == null) continue nextSelector;
-
-		MethodBinding[] current = (MethodBinding[]) this.currentMethods.get(methodSelectors[s]);
-		MethodBinding[] inherited = (MethodBinding[]) this.inheritedMethods.valueTable[s];
-		
-		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=296660, if current type is exposed,
-		// inherited methods of super classes are too. current != null case handled below.
-		if (current == null && !isOrEnclosedByPrivateType) {
-			int length = inherited.length;
-			for (int i = 0; i < length; i++){
-				inherited[i].original().modifiers |= ExtraCompilerModifiers.AccLocallyUsed;
-			}
-		}
-
-		if (current == null && skipInheritedMethods)
-			continue nextSelector;
-
-		if (inherited.length == 1 && current == null) { // handle the common case
-			if (mustImplementAbstractMethods && inherited[0].isAbstract())
-				checkAbstractMethod(inherited[0]);
-			continue nextSelector;
-		}
-
-		int index = -1;
-		MethodBinding[] matchingInherited = new MethodBinding[inherited.length];
-		if (current != null) {
-			for (int i = 0, length1 = current.length; i < length1; i++) {
-				MethodBinding currentMethod = current[i];
-				for (int j = 0, length2 = inherited.length; j < length2; j++) {
-					MethodBinding inheritedMethod = computeSubstituteMethod(inherited[j], currentMethod);
-					if (inheritedMethod != null) {
-						if (isParameterSubsignature(currentMethod, inheritedMethod)) {
-							matchingInherited[++index] = inheritedMethod;
-							inherited[j] = null; // do not want to find it again
-						}
-					}
-				}
-				if (index >= 0) {
-					checkAgainstInheritedMethods(currentMethod, matchingInherited, index + 1, inherited); // pass in the length of matching
-					while (index >= 0) matchingInherited[index--] = null; // clear the contents of the matching methods
-				}
-			}
-		}
-
-		for (int i = 0, length = inherited.length; i < length; i++) {
-			MethodBinding inheritedMethod = inherited[i];
-			if (inheritedMethod == null) continue;
-			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=296660, if current type is exposed,
-			// inherited methods of super classes are too. current == null case handled already.
-			if (!isOrEnclosedByPrivateType && current != null) {
-				inheritedMethod.original().modifiers |= ExtraCompilerModifiers.AccLocallyUsed;
-			}
-			matchingInherited[++index] = inheritedMethod;
-			for (int j = i + 1; j < length; j++) {
-				MethodBinding otherInheritedMethod = inherited[j];
-				if (canSkipInheritedMethods(inheritedMethod, otherInheritedMethod))
-					continue;
-				otherInheritedMethod = computeSubstituteMethod(otherInheritedMethod, inheritedMethod);
-				if (otherInheritedMethod != null) {
-					if (isParameterSubsignature(inheritedMethod, otherInheritedMethod)) {
-						matchingInherited[++index] = otherInheritedMethod;
-						inherited[j] = null; // do not want to find it again
-					}
-				}
-			}
-			if (index == -1) continue;
-			if (index > 0)
-				checkInheritedMethods(matchingInherited, index + 1); // pass in the length of matching
-			else if (mustImplementAbstractMethods && matchingInherited[0].isAbstract())
-				checkAbstractMethod(matchingInherited[0]);
-			while (index >= 0) matchingInherited[index--] = null; // clear the contents of the matching methods
-		}
-	}
-}
-
+abstract void checkMethods();
 void checkPackagePrivateAbstractMethod(MethodBinding abstractMethod) {
 	// check that the inherited abstract method (package private visibility) is implemented within the same package
 	PackageBinding necessaryPackage = abstractMethod.declaringClass.fPackage;
@@ -754,36 +683,11 @@
 	// if an inheritedMethod has been 'replaced' by a supertype's method then skip it, however
     // see usage of canOverridingMethodDifferInErasure below.
 	this.inheritedMethods = new HashtableOfObject(51); // maps method selectors to an array of methods... must search to match paramaters & return type
-	ReferenceBinding[] interfacesToVisit = null;
-	int nextPosition = 0;
-	ReferenceBinding[] itsInterfaces = superInterfaces;
-	if (itsInterfaces != Binding.NO_SUPERINTERFACES) {
-		nextPosition = itsInterfaces.length;
-		interfacesToVisit = itsInterfaces;
-	}
 
 	ReferenceBinding superType = superclass;
 	HashtableOfObject nonVisibleDefaultMethods = new HashtableOfObject(3); // maps method selectors to an array of methods
 
 	while (superType != null && superType.isValidBinding()) {
-		// We used to only include superinterfaces if immediate superclasses are abstract
-		// but that is problematic. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=302358
-		if ((itsInterfaces = superType.superInterfaces()) != Binding.NO_SUPERINTERFACES) {
-			if (interfacesToVisit == null) {
-				interfacesToVisit = itsInterfaces;
-				nextPosition = interfacesToVisit.length;
-			} else {
-				int itsLength = itsInterfaces.length;
-				if (nextPosition + itsLength >= interfacesToVisit.length)
-					System.arraycopy(interfacesToVisit, 0, interfacesToVisit = new ReferenceBinding[nextPosition + itsLength + 5], 0, nextPosition);
-				nextInterface : for (int a = 0; a < itsLength; a++) {
-					ReferenceBinding next = itsInterfaces[a];
-					for (int b = 0; b < nextPosition; b++)
-						if (next == interfacesToVisit[b]) continue nextInterface;
-					interfacesToVisit[nextPosition++] = next;
-				}
-			}
-		}
 
 		MethodBinding[] methods = superType.unResolvedMethods();
 		nextMethod : for (int m = methods.length; --m >= 0;) {
@@ -850,24 +754,31 @@
 		}
 		superType = superType.superclass();
 	}
-	if (nextPosition == 0) return;
 
+	List superIfcList = new ArrayList();
+	HashSet seenTypes = new HashSet();
+	collectAllDistinctSuperInterfaces(superInterfaces, seenTypes, superIfcList);
+	ReferenceBinding currentSuper = superclass;
+	while (currentSuper != null && currentSuper.id != TypeIds.T_JavaLangObject) {
+		collectAllDistinctSuperInterfaces(currentSuper.superInterfaces(), seenTypes, superIfcList);
+		currentSuper = currentSuper.superclass();
+	}
+
+	if (superIfcList.size() == 0) return;
+	
+	if (superIfcList.size() == 1) {
+		superInterfaces = new ReferenceBinding[] { (ReferenceBinding) superIfcList.get(0) };
+	} else {
+		superInterfaces = (ReferenceBinding[]) superIfcList.toArray(new ReferenceBinding[superIfcList.size()]);
+		superInterfaces = Sorting.sortTypes(superInterfaces);
+	}
+	
 	SimpleSet skip = findSuperinterfaceCollisions(superclass, superInterfaces);
-	for (int i = 0; i < nextPosition; i++) {
-		superType = interfacesToVisit[i];
+	int len = superInterfaces.length;
+	for (int i = len-1; i >= 0; i--) {
+		superType = superInterfaces[i];
 		if (superType.isValidBinding()) {
 			if (skip != null && skip.includes(superType)) continue;
-			if ((itsInterfaces = superType.superInterfaces()) != Binding.NO_SUPERINTERFACES) {
-				int itsLength = itsInterfaces.length;
-				if (nextPosition + itsLength >= interfacesToVisit.length)
-					System.arraycopy(interfacesToVisit, 0, interfacesToVisit = new ReferenceBinding[nextPosition + itsLength + 5], 0, nextPosition);
-				nextInterface : for (int a = 0; a < itsLength; a++) {
-					ReferenceBinding next = itsInterfaces[a];
-					for (int b = 0; b < nextPosition; b++)
-						if (next == interfacesToVisit[b]) continue nextInterface;
-					interfacesToVisit[nextPosition++] = next;
-				}
-			}
 
 			MethodBinding[] methods = superType.unResolvedMethods();
 			nextMethod : for (int m = methods.length; --m >= 0;) { // Interface methods are all abstract public
@@ -897,6 +808,18 @@
 	}
 }
 
+void collectAllDistinctSuperInterfaces(ReferenceBinding[] superInterfaces, Set seen, List result) {
+	// use 'seen' to avoid duplicates, use result to maintain stable order
+	int length = superInterfaces.length;
+	for (int i=0; i<length; i++) {
+		ReferenceBinding superInterface = superInterfaces[i];
+		if (seen.add(superInterface)) {
+			result.add(superInterface);
+			collectAllDistinctSuperInterfaces(superInterface.superInterfaces(), seen, result);
+		}
+	}
+}
+
 // Given `overridingMethod' which overrides `inheritedMethod' answer whether some subclass method that
 // differs in erasure from overridingMethod could override `inheritedMethod'
 protected boolean canOverridingMethodDifferInErasure(MethodBinding overridingMethod, MethodBinding inheritedMethod) {
@@ -996,7 +919,8 @@
 MethodBinding findBestInheritedAbstractMethod(MethodBinding[] methods, int length) {
 	findMethod : for (int i = 0; i < length; i++) {
 		MethodBinding method = methods[i];
-		if (!method.isAbstract()) continue findMethod;
+		// when unexpectedly seeing a non-abstract interface method regard it as abstract, too, for this check:
+		if (!(method.isAbstract() || method.declaringClass.isInterface())) continue findMethod;
 		for (int j = 0; j < length; j++) {
 			if (i == j) continue;
 			if (!checkInheritedReturnTypes(method, methods[j])) {
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 9bc4353..3e5ddfd 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,10 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
  * http://www.eclipse.org/legal/epl-v10.html
- * $Id: MethodVerifier15.java 23404 2010-02-03 14:10:22Z stephan $
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -16,6 +15,8 @@
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
  *								bug 388795 - [compiler] detection of name clash depends on order of super interfaces
  *								bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
+ *								bug 395681 - [compiler] Improve simulation of javac6 behavior from bug 317719 after fixing bug 388795
+ *								bug 409473 - [compiler] JDT cannot compile against JRE 1.8
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.lookup;
 
@@ -40,8 +41,6 @@
  * What: integrate changes done in MethodVerifier
  * How:  + make sure methods still override those from MethodVerifier (added 3. arg)
  *       + invoke areRoleTypesEqual()
- *
- * @version $Id: MethodVerifier15.java 23404 2010-02-03 14:10:22Z stephan $
  */
 class MethodVerifier15 extends MethodVerifier {
 
@@ -49,9 +48,6 @@
 	super(environment);
 }
 boolean areMethodsCompatible(MethodBinding one, MethodBinding two) {
-	return areMethodsCompatible(one, two, false);
-}
-boolean areMethodsCompatible(MethodBinding one, MethodBinding two, boolean allowReverse) {
 	// use the original methods to test compatibility, but do not check visibility, etc
 	one = one.original();
 	two = one.findOriginalInheritedMethod(two);
@@ -59,7 +55,7 @@
 	if (two == null)
 		return false; // method's declaringClass does not inherit from inheritedMethod's
 
-	return isParameterSubsignature(one, two) || (allowReverse && isParameterSubsignature(two, one));
+	return isParameterSubsignature(one, two);
 }
 boolean areReturnTypesCompatible(MethodBinding one, MethodBinding two) {
 //{ObjectTeams: consider enhanced callin signatures:
@@ -298,11 +294,13 @@
 	detectInheritedNameClash(inheritedMethod.original(), otherInheritedMethod.original());
 }
 // 8.4.8.4
-void checkInheritedMethods(MethodBinding[] methods, int length) {
+void checkInheritedMethods(MethodBinding[] methods, int length, boolean[] isOverridden) {
 	boolean continueInvestigation = true;
 	MethodBinding concreteMethod = null;
 	for (int i = 0; i < length; i++) {
-		if (!methods[i].isAbstract()) {
+		// when unexpectedly seeing a non-abstract interface method regard it as abstract, too, for this check:
+		boolean isAbstract = methods[i].isAbstract() || methods[i].declaringClass.isInterface();
+		if (!isAbstract) {
 			if (concreteMethod != null) {
 				problemReporter().duplicateInheritedMethods(this.type, concreteMethod, methods[i]);
 				continueInvestigation = false;
@@ -311,7 +309,7 @@
 		}
 	}
 	if (continueInvestigation) {
-		super.checkInheritedMethods(methods, length);
+		super.checkInheritedMethods(methods, length, isOverridden);
 	}
 }
 boolean checkInheritedReturnTypes(MethodBinding method, MethodBinding otherMethod) {
@@ -502,6 +500,7 @@
 		// 		either because they match the same currentMethod or match each other
 		// - methods that are overridden by a current method
 		boolean[] skip = new boolean[inheritedLength];
+		boolean[] isOverridden = new boolean[inheritedLength];
 		if (current != null) {
 			for (int i = 0, length1 = current.length; i < length1; i++) {
 				MethodBinding currentMethod = current[i];
@@ -529,7 +528,7 @@
 					if (inheritedMethod != null) {
 						if (foundMatch[j] == null && isSubstituteParameterSubsignature(currentMethod, inheritedMethod)) {
 							// already checked compatibility, do visibility etc. also indicate overriding? If so ignore inheritedMethod further downstream
-							skip[j] = couldMethodOverride(currentMethod, inheritedMethod);
+							isOverridden[j] = skip[j] = couldMethodOverride(currentMethod, inheritedMethod);
 							matchingInherited[++index] = inheritedMethod;
 							foundMatch[j] = currentMethod;
 						} else {
@@ -562,7 +561,8 @@
 // SH}
 			}
 		}
-
+		// first round: collect information into skip and isOverridden by comparing all pairs:
+		// (and perform some side effects : bridge methods & use flags)
 		for (int i = 0; i < inheritedLength; i++) {
 			MethodBinding matchMethod = foundMatch[i];
 			if (matchMethod == null && current != null && this.type.isPublic()) { // current == null case handled already.
@@ -576,10 +576,7 @@
 			if (!isOrEnclosedByPrivateType && matchMethod == null && current != null) {
 				inherited[i].original().modifiers |= ExtraCompilerModifiers.AccLocallyUsed;	
 			}
-			if (skip[i]) continue;
 			MethodBinding inheritedMethod = inherited[i];
-			if (matchMethod == null)
-				matchingInherited[++index] = inheritedMethod;
 			for (int j = i + 1; j < inheritedLength; j++) {
 				MethodBinding otherInheritedMethod = inherited[j];
 				if (matchMethod == foundMatch[j] && matchMethod != null)
@@ -590,29 +587,38 @@
 				// This elimination used to happen rather eagerly in computeInheritedMethods step
 				// itself earlier. (https://bugs.eclipse.org/bugs/show_bug.cgi?id=302358)
 				if (inheritedMethod.declaringClass != otherInheritedMethod.declaringClass) {
-					if (otherInheritedMethod.declaringClass.isInterface() && !inheritedMethod.declaringClass.isInterface()) {
-						if (isInterfaceMethodImplemented(otherInheritedMethod, inheritedMethod, otherInheritedMethod.declaringClass)) {
-							skip[j] = true;
-							continue;
-						}
-					} else if (areMethodsCompatible(inheritedMethod, otherInheritedMethod, true)) {
-						skip[j] = true;
+					// these method calls produce their effect as side-effects into skip and isOverridden:
+					if (isSkippableOrOverridden(inheritedMethod, otherInheritedMethod, skip, isOverridden, j))
 						continue;
-					}
+					if (isSkippableOrOverridden(otherInheritedMethod, inheritedMethod, skip, isOverridden, i))
+						continue;
 				}
-				otherInheritedMethod = computeSubstituteMethod(otherInheritedMethod, inheritedMethod);
-				if (otherInheritedMethod != null) {
-					if (((!inheritedMethod.isAbstract() || otherInheritedMethod.isAbstract()) 		// if (abstract(inherited) => abstract(other)) check if inherited overrides other 
-								&& isSubstituteParameterSubsignature(inheritedMethod, otherInheritedMethod))
-						|| ((!otherInheritedMethod.isAbstract() || inheritedMethod.isAbstract())	// if (abstract(other) => abstract(inherited)) check if other overrides inherited 
-								&& isSubstituteParameterSubsignature(otherInheritedMethod, inheritedMethod))) 
-					{
-						if (index == -1)
-							matchingInherited[++index] = inheritedMethod;
-						if (foundMatch[j] == null)
-							matchingInherited[++index] = otherInheritedMethod;
+			}
+		}
+		// second round: collect and check matchingInherited, directly check methods with no replacing etc.
+		for (int i = 0; i < inheritedLength; i++) {
+			MethodBinding matchMethod = foundMatch[i];
+			if (skip[i]) continue;
+			MethodBinding inheritedMethod = inherited[i];
+			if (matchMethod == null)
+				matchingInherited[++index] = inheritedMethod;
+			for (int j = i + 1; j < inheritedLength; j++) {
+				if (foundMatch[j] == null) {
+					MethodBinding otherInheritedMethod = inherited[j];
+					if (matchMethod == foundMatch[j] && matchMethod != null)
+						continue; // both inherited methods matched the same currentMethod
+					if (canSkipInheritedMethods(inheritedMethod, otherInheritedMethod))
+						continue;
+
+					MethodBinding replaceMatch;
+					if ((replaceMatch = findReplacedMethod(inheritedMethod, otherInheritedMethod)) != null) {
+						matchingInherited[++index] = replaceMatch;
 						skip[j] = true;
-					} else if (matchMethod == null && foundMatch[j] == null) {
+					} else if ((replaceMatch = findReplacedMethod(otherInheritedMethod, inheritedMethod)) != null) {
+						matchingInherited[++index] = replaceMatch;
+						skip[j] = true;						
+					} else if (matchMethod == null) {
+						// none replaced by the other, check these methods against each other now:
 						checkInheritedMethods(inheritedMethod, otherInheritedMethod);
 					}
 				}
@@ -620,13 +626,52 @@
 			if (index == -1) continue;
 
 			if (index > 0)
-				checkInheritedMethods(matchingInherited, index + 1); // pass in the length of matching
+				checkInheritedMethods(matchingInherited, index + 1, isOverridden); // pass in the length of matching
 			else if (mustImplementAbstractMethods && matchingInherited[0].isAbstract() && matchMethod == null)
 				checkAbstractMethod(matchingInherited[0]);
 			while (index >= 0) matchingInherited[index--] = null; // clear the previous contents of the matching methods
 		}
 	}
 }
+/* mark as skippable
+ * - any interface method implemented by a class method
+ * - an x method (x in {class, interface}), for which another x method with a subsignature was found
+ * mark as isOverridden
+ * - any skippable method as defined above iff it is actually overridden by the specific method (disregarding visibility etc.)
+ * Note, that 'idx' corresponds to the position of 'general' in the arrays 'skip' and 'isOverridden'
+ */
+boolean isSkippableOrOverridden(MethodBinding specific, MethodBinding general, boolean[] skip, boolean[] isOverridden, int idx) {
+	boolean specificIsInterface = specific.declaringClass.isInterface();
+	boolean generalIsInterface = general.declaringClass.isInterface();
+	if (!specificIsInterface && generalIsInterface) {
+		if (isInterfaceMethodImplemented(general, specific, general.declaringClass)) {
+			skip[idx] = true;
+			isOverridden[idx] = true;
+			return true;
+		}
+	} else if (specificIsInterface == generalIsInterface) { 
+		if (isParameterSubsignature(specific, general)) {
+			skip[idx] = true;
+			isOverridden[idx] = specific.declaringClass.isCompatibleWith(general.declaringClass);
+			return true;
+		}
+	}
+	return false;
+}
+/* 'general' is considered as replaced by 'specific' if
+ * - 'specific' is "at least as concrete as" 'general'
+ * - 'specific' has a signature that is a subsignature of the substituted signature of 'general' (as seen from specific's declaring class)  
+ */
+MethodBinding findReplacedMethod(MethodBinding specific, MethodBinding general) {
+	MethodBinding generalSubstitute = computeSubstituteMethod(general, specific);
+	if (generalSubstitute != null 
+			&& (!specific.isAbstract() || general.isAbstract())	// if (abstract(specific) => abstract(general)) check if 'specific' overrides 'general' 
+			&& isSubstituteParameterSubsignature(specific, generalSubstitute)) 
+	{
+		return generalSubstitute;
+	} 
+	return null;
+}
 
 //{ObjectTeams: specific treatment of callin modifier:
 /**
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java
index 2a561d4..abd5450 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -9,6 +9,7 @@
  *     IBM Corporation - initial API and implementation
  *     Technical University Berlin - extended API and implementation
  *     Stephan Herrmann - Contribution for  bug 365662 - [compiler][null] warn on contradictory and redundant null annotations
+ *     Keigo Imai - Contribution for  bug 388903 - Cannot extend inner class as an anonymous class when it extends the outer class
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.lookup;
 
@@ -73,12 +74,8 @@
 	} else {
 		int size = this.enclosingInstances.length;
 		int newArgIndex = size;
-		for (int i = size; --i >= 0;) {
-			if (this.enclosingInstances[i].type == targetEnclosingType)
-				return this.enclosingInstances[i]; // already exists
-			if (enclosingType() == targetEnclosingType)
-				newArgIndex = 0;
-		}
+		if (enclosingType() == targetEnclosingType)
+			newArgIndex = 0;
 		SyntheticArgumentBinding[] newInstances = new SyntheticArgumentBinding[size + 1];
 		System.arraycopy(this.enclosingInstances, 0, newInstances, newArgIndex == 0 ? 1 : 0, size);
 		newInstances[newArgIndex] = synthLocal = new SyntheticArgumentBinding(targetEnclosingType);
@@ -173,9 +170,27 @@
 
 /* Answer the synthetic argument for <targetEnclosingType> or null if one does not exist.
 */
-public SyntheticArgumentBinding getSyntheticArgument(ReferenceBinding targetEnclosingType, boolean onlyExactMatch) {
+public SyntheticArgumentBinding getSyntheticArgument(ReferenceBinding targetEnclosingType, boolean onlyExactMatch, boolean scopeIsConstructorCall) {
 	if (this.enclosingInstances == null) return null;		// is null if no enclosing instances are known
+	
 	// exact match
+	
+	// firstly, during allocation, check and use the leftmost one (if possible) 
+	// to handle cases involving two instances of same type, such as
+	// class X {
+	//   class Inner extends X {}
+	//   void f(){
+	//     new X().new Inner(){} 
+	//     // here the result of (new X()) is passed as the first (synthetic) arg for ctor of new Inner(){}
+	//     // (and (this) as the second, of course) 
+	//   }
+	// }
+	if (scopeIsConstructorCall && this.enclosingInstances.length > 0)
+		if (this.enclosingInstances[0].type == targetEnclosingType) 
+			if (this.enclosingInstances[0].actualOuterLocalVariable == null)
+				return this.enclosingInstances[0];
+	
+	// then check other possibility
 	for (int i = this.enclosingInstances.length; --i >= 0;)
 		if (this.enclosingInstances[i].type == targetEnclosingType)
 			if (this.enclosingInstances[i].actualOuterLocalVariable == null)
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java
index 96a37ad..9121cd7 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2012 IBM Corporation and others.
+ * Copyright (c) 2005, 2013 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
@@ -13,6 +13,7 @@
  *     Stephan Herrmann - Contributions for
  *								bug 349326 - [1.7] new warning for missing try-with-resources
  *								bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
+ *								Bug 412076 - [compiler] @NonNullByDefault doesn't work for varargs parameter when in generic interface
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.lookup;
 
@@ -734,7 +735,9 @@
 		this._teamModel = someType._teamModel;
 		this.roleModel = someType.roleModel;
 // SH}
-		this.tagBits |= someType.tagBits & (TagBits.IsLocalType| TagBits.IsMemberType | TagBits.IsNestedType | TagBits.HasMissingType | TagBits.ContainsNestedTypeReferences);
+		this.tagBits |= someType.tagBits & (TagBits.IsLocalType| TagBits.IsMemberType | TagBits.IsNestedType | TagBits.ContainsNestedTypeReferences
+				 | TagBits.HasMissingType
+				 | TagBits.AnnotationNonNullByDefault | TagBits.AnnotationNullUnspecifiedByDefault);
 		this.tagBits &= ~(TagBits.AreFieldsComplete|TagBits.AreMethodsComplete);
 	}
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
index 6c80792..f9f60d0 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
@@ -1149,7 +1149,8 @@
 
 //{ObjectTeams:
 	/**
-	 * get method by its selector, search includes superclasses, superinterfaces.
+	 * get method by its selector, search includes superclasses, superinterfaces
+	 * (except when searching a constructor).
 	 * If more than one method (significantly, ie., not overriding each other)
 	 * is found, return a ProblemMethodBinding, if none is found return null.
 	 * Ignore tsuper versions of methods.
@@ -1172,6 +1173,8 @@
 			else if (numFound > 1)
 				return new ProblemMethodBinding(selector, Binding.NO_PARAMETERS, ProblemReasons.Ambiguous);
 		}
+		if (CharOperation.equals(TypeConstants.INIT, selector))
+			return foundMethod; // don't search supers for constructor
 		MethodVerifier verifier = scope.environment().methodVerifier(); // respect source level.
 		if (superclass() != null) {
 			MethodBinding superclassMethod = superclass().getMethod(scope, selector);
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 9e72b0f..57b9a58 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
@@ -16,6 +16,7 @@
  *								bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
  *								bug 401456 - Code compiles from javac/intellij, but fails from eclipse
  *								bug 401271 - StackOverflowError when searching for a methods references
+ *								bug 405706 - Eclipse compiler fails to give compiler error when return type is a inferred generic
  *     Jesper S Moller - Contributions for
  *								Bug 378674 - "The method can be declared as static" is wrong
  *******************************************************************************/
@@ -377,6 +378,16 @@
 					}
 					result[j] = null;
 					removed ++;
+				} else if (!jType.isCompatibleWith(iType, scope)) {
+					// avoid creating unsatisfiable intersection types (see https://bugs.eclipse.org/405706):
+					if (iType.isParameterizedType() && jType.isParameterizedType()) {
+						if (iType.original().isCompatibleWith(jType.original(), scope)
+								|| jType.original().isCompatibleWith(iType.original(), scope)) 
+						{
+							// parameterized types are incompatible due to incompatible type arguments => unsatisfiable
+							return null;
+						}
+					}
 				}
 			}
 		}
@@ -2820,7 +2831,7 @@
 	*/
 	// The return type of this method could be ReferenceBinding if we did not answer base types.
 	// NOTE: We could support looking for Base Types last in the search, however any code using
-	// this feature would be extraordinarily slow. Therefore we don't do this
+	// this feature would be extraordinarily slow. Therefore we don't do this.
 //{ObjectTeams: ROFI changed modifiers, was final
 	public TypeBinding getType(char[] name) {
 // SH}
@@ -4590,6 +4601,7 @@
 		}
 		return NOT_COMPATIBLE;
 	}
+
 	public abstract ProblemReporter problemReporter();
 
 //{ObjectTeams: removed final:
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
index f7e96cb..382154f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -1908,7 +1908,7 @@
 							// remove user defined methods & keep the synthetic
 							removeMethod = true;
 						} else {
-							this.scope.problemReporter().duplicateMethodInType(this, methodDecl, method.areParametersEqual(method2), severity);
+							this.scope.problemReporter().duplicateMethodInType(methodDecl, method.areParametersEqual(method2), severity);
 						}
 						if (removeMethod) {
 							removeMethod2 = false;
@@ -1927,7 +1927,7 @@
 						this.scope.problemReporter().duplicateEnumSpecialMethod(this, method2Decl);
 						removeMethod2 = true;
 					} else {
-						this.scope.problemReporter().duplicateMethodInType(this, method2Decl, method.areParametersEqual(method2), severity);
+						this.scope.problemReporter().duplicateMethodInType(method2Decl, method.areParametersEqual(method2), severity);
 					}
 					if (removeMethod2) {
 						method2Decl.binding = null;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java
index ac08968..f5f61ef 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.java
index 217afd8..999fdad 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
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 35362dd..1c754e9 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -7568,1607 +7568,1611 @@
 		    consumeMethodSpecLong(true);  
 			break;
  
-    case 285 : if (DEBUG) { System.out.println("MethodSpecNamePlus ::= Modifiersopt Type PLUS Identifier"); }  //$NON-NLS-1$
+    case 285 : if (DEBUG) { System.out.println("BaseMethodSpecLong ::= ConstructorHeaderName..."); }  //$NON-NLS-1$
+		    consumeMethodSpecLong(false);  
+			break;
+ 
+    case 286 : if (DEBUG) { System.out.println("MethodSpecNamePlus ::= Modifiersopt Type PLUS Identifier"); }  //$NON-NLS-1$
 		    consumeMethodHeaderName(false);  
 			break;
  
-    case 286 : if (DEBUG) { System.out.println("CalloutFieldSpecLong ::= CalloutModifier Type Identifier"); }  //$NON-NLS-1$
+    case 287 : if (DEBUG) { System.out.println("CalloutFieldSpecLong ::= CalloutModifier Type Identifier"); }  //$NON-NLS-1$
 		    consumeFieldSpecLong();  
 			break;
  
-    case 289 : if (DEBUG) { System.out.println("BaseMethodSpecListShort ::= BaseMethodSpecListShort..."); }  //$NON-NLS-1$
+    case 290 : if (DEBUG) { System.out.println("BaseMethodSpecListShort ::= BaseMethodSpecListShort..."); }  //$NON-NLS-1$
 		    consumeMethodSpecList();  
 			break;
  
-    case 293 : if (DEBUG) { System.out.println("MethodSpecListLong ::= MethodSpecListLong COMMA..."); }  //$NON-NLS-1$
+    case 294 : if (DEBUG) { System.out.println("MethodSpecListLong ::= MethodSpecListLong COMMA..."); }  //$NON-NLS-1$
 		    consumeMethodSpecList();  
 			break;
  
-    case 294 : if (DEBUG) { System.out.println("PrecedenceDeclaration ::= precedence BindingNames..."); }  //$NON-NLS-1$
+    case 295 : if (DEBUG) { System.out.println("PrecedenceDeclaration ::= precedence BindingNames..."); }  //$NON-NLS-1$
 		    consumePrecedenceDeclaration(false);  
 			break;
  
-    case 295 : if (DEBUG) { System.out.println("PrecedenceDeclaration ::= precedence after BindingNames"); }  //$NON-NLS-1$
+    case 296 : if (DEBUG) { System.out.println("PrecedenceDeclaration ::= precedence after BindingNames"); }  //$NON-NLS-1$
 		    consumePrecedenceDeclaration(true);  
 			break;
  
-    case 297 : if (DEBUG) { System.out.println("BindingNames ::= BindingNames COMMA BindingName"); }  //$NON-NLS-1$
+    case 298 : if (DEBUG) { System.out.println("BindingNames ::= BindingNames COMMA BindingName"); }  //$NON-NLS-1$
 		    consumeBindingNames();  
 			break;
  
-    case 298 : if (DEBUG) { System.out.println("BindingName ::= Name"); }  //$NON-NLS-1$
+    case 299 : if (DEBUG) { System.out.println("BindingName ::= Name"); }  //$NON-NLS-1$
 		    consumeBindingName();  
 			break;
  
-    case 299 : if (DEBUG) { System.out.println("StaticInitializer ::= StaticOnly Block"); }  //$NON-NLS-1$
+    case 300 : if (DEBUG) { System.out.println("StaticInitializer ::= StaticOnly Block"); }  //$NON-NLS-1$
 		    consumeStaticInitializer();  
 			break;
 
-    case 300 : if (DEBUG) { System.out.println("StaticOnly ::= static"); }  //$NON-NLS-1$
+    case 301 : if (DEBUG) { System.out.println("StaticOnly ::= static"); }  //$NON-NLS-1$
 		    consumeStaticOnly();  
 			break;
  
-    case 301 : if (DEBUG) { System.out.println("ConstructorDeclaration ::= ConstructorHeader MethodBody"); }  //$NON-NLS-1$
+    case 302 : if (DEBUG) { System.out.println("ConstructorDeclaration ::= ConstructorHeader MethodBody"); }  //$NON-NLS-1$
 		    consumeConstructorDeclaration() ;  
 			break;
  
-    case 302 : if (DEBUG) { System.out.println("ConstructorDeclaration ::= ConstructorHeader SEMICOLON"); }  //$NON-NLS-1$
+    case 303 : if (DEBUG) { System.out.println("ConstructorDeclaration ::= ConstructorHeader SEMICOLON"); }  //$NON-NLS-1$
 		    consumeInvalidConstructorDeclaration() ;  
 			break;
  
-    case 303 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= this LPAREN..."); }  //$NON-NLS-1$
+    case 304 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= this LPAREN..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocation(0, THIS_CALL);  
 			break;
  
-    case 304 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= OnlyTypeArguments this"); }  //$NON-NLS-1$
+    case 305 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= OnlyTypeArguments this"); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocationWithTypeArguments(0,THIS_CALL);  
 			break;
  
-    case 305 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= super LPAREN..."); }  //$NON-NLS-1$
+    case 306 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= super LPAREN..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocation(0,SUPER_CALL);  
 			break;
  
-    case 306 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= OnlyTypeArguments..."); }  //$NON-NLS-1$
+    case 307 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= OnlyTypeArguments..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocationWithTypeArguments(0,SUPER_CALL);  
 			break;
  
-    case 307 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= tsuper LPAREN..."); }  //$NON-NLS-1$
+    case 308 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= tsuper LPAREN..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocation(0,TSUPER_CALL);  
 			break;
  
-    case 308 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT tsuper LPAREN"); }  //$NON-NLS-1$
+    case 309 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT tsuper LPAREN"); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocation(2,TSUPER_CALL);  
 			break;
  
-    case 309 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT super..."); }  //$NON-NLS-1$
+    case 310 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT super..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocation(1, SUPER_CALL);  
 			break;
  
-    case 310 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT..."); }  //$NON-NLS-1$
+    case 311 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocationWithTypeArguments(1, SUPER_CALL);  
 			break;
  
-    case 311 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT super LPAREN"); }  //$NON-NLS-1$
+    case 312 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT super LPAREN"); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocation(2, SUPER_CALL);  
 			break;
  
-    case 312 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT..."); }  //$NON-NLS-1$
+    case 313 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocationWithTypeArguments(2, SUPER_CALL);  
 			break;
  
-    case 313 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT this..."); }  //$NON-NLS-1$
+    case 314 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT this..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocation(1, THIS_CALL);  
 			break;
  
-    case 314 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT..."); }  //$NON-NLS-1$
+    case 315 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocationWithTypeArguments(1, THIS_CALL);  
 			break;
  
-    case 315 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT this LPAREN"); }  //$NON-NLS-1$
+    case 316 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT this LPAREN"); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocation(2, THIS_CALL);  
 			break;
  
-    case 316 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT..."); }  //$NON-NLS-1$
+    case 317 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocationWithTypeArguments(2, THIS_CALL);  
 			break;
  
-    case 317 : if (DEBUG) { System.out.println("BaseConstructorExpression ::= base LPAREN..."); }  //$NON-NLS-1$
+    case 318 : if (DEBUG) { System.out.println("BaseConstructorExpression ::= base LPAREN..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocationBase(0);  
 			break;
  
-    case 318 : if (DEBUG) { System.out.println("BaseConstructorInvocation ::= base LPAREN..."); }  //$NON-NLS-1$
+    case 319 : if (DEBUG) { System.out.println("BaseConstructorInvocation ::= base LPAREN..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocationBase(1);  
 			break;
  
-    case 319 : if (DEBUG) { System.out.println("BaseConstructorInvocation ::= Primary DOT base LPAREN..."); }  //$NON-NLS-1$
+    case 320 : if (DEBUG) { System.out.println("BaseConstructorInvocation ::= Primary DOT base LPAREN..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocationBase(2);  
 			break;
  
-    case 320 : if (DEBUG) { System.out.println("BaseConstructorInvocation ::= Name DOT base LPAREN..."); }  //$NON-NLS-1$
+    case 321 : if (DEBUG) { System.out.println("BaseConstructorInvocation ::= Name DOT base LPAREN..."); }  //$NON-NLS-1$
 		    consumeExplicitConstructorInvocationBase(3);  
 			break;
  
-    case 321 : if (DEBUG) { System.out.println("InterfaceDeclaration ::= InterfaceHeader InterfaceBody"); }  //$NON-NLS-1$
+    case 322 : if (DEBUG) { System.out.println("InterfaceDeclaration ::= InterfaceHeader InterfaceBody"); }  //$NON-NLS-1$
 		    consumeInterfaceDeclaration();  
 			break;
  
-    case 322 : if (DEBUG) { System.out.println("InterfaceHeader ::= InterfaceHeaderName..."); }  //$NON-NLS-1$
+    case 323 : if (DEBUG) { System.out.println("InterfaceHeader ::= InterfaceHeaderName..."); }  //$NON-NLS-1$
 		    consumeInterfaceHeader();  
 			break;
  
-    case 323 : if (DEBUG) { System.out.println("InterfaceHeaderName ::= InterfaceHeaderName1..."); }  //$NON-NLS-1$
+    case 324 : if (DEBUG) { System.out.println("InterfaceHeaderName ::= InterfaceHeaderName1..."); }  //$NON-NLS-1$
 		    consumeTypeHeaderNameWithTypeParameters();  
 			break;
  
-    case 325 : if (DEBUG) { System.out.println("InterfaceHeaderName1 ::= Modifiersopt interface..."); }  //$NON-NLS-1$
+    case 326 : if (DEBUG) { System.out.println("InterfaceHeaderName1 ::= Modifiersopt interface..."); }  //$NON-NLS-1$
 		    consumeInterfaceHeaderName1();  
 			break;
  
-    case 326 : if (DEBUG) { System.out.println("InterfaceHeaderExtends ::= extends InterfaceTypeList"); }  //$NON-NLS-1$
+    case 327 : if (DEBUG) { System.out.println("InterfaceHeaderExtends ::= extends InterfaceTypeList"); }  //$NON-NLS-1$
 		    consumeInterfaceHeaderExtends();  
 			break;
  
-    case 329 : if (DEBUG) { System.out.println("InterfaceMemberDeclarations ::=..."); }  //$NON-NLS-1$
+    case 330 : if (DEBUG) { System.out.println("InterfaceMemberDeclarations ::=..."); }  //$NON-NLS-1$
 		    consumeInterfaceMemberDeclarations();  
 			break;
  
-    case 330 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= SEMICOLON"); }  //$NON-NLS-1$
+    case 331 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= SEMICOLON"); }  //$NON-NLS-1$
 		    consumeEmptyTypeDeclaration();  
 			break;
  
-    case 332 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= MethodHeader MethodBody"); }  //$NON-NLS-1$
+    case 333 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= MethodHeader MethodBody"); }  //$NON-NLS-1$
 		    consumeInvalidMethodDeclaration();  
 			break;
  
-    case 333 : if (DEBUG) { System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader..."); }  //$NON-NLS-1$
+    case 334 : if (DEBUG) { System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader..."); }  //$NON-NLS-1$
 		    consumeInvalidConstructorDeclaration(true);  
 			break;
  
-    case 334 : if (DEBUG) { System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader..."); }  //$NON-NLS-1$
+    case 335 : if (DEBUG) { System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader..."); }  //$NON-NLS-1$
 		    consumeInvalidConstructorDeclaration(false);  
 			break;
  
-    case 346 : if (DEBUG) { System.out.println("PushLeftBrace ::="); }  //$NON-NLS-1$
+    case 347 : if (DEBUG) { System.out.println("PushLeftBrace ::="); }  //$NON-NLS-1$
 		    consumePushLeftBrace();  
 			break;
  
-    case 347 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace ,opt RBRACE"); }  //$NON-NLS-1$
+    case 348 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace ,opt RBRACE"); }  //$NON-NLS-1$
 		    consumeEmptyArrayInitializer();  
 			break;
  
-    case 348 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace..."); }  //$NON-NLS-1$
-		    consumeArrayInitializer();  
-			break;
- 
     case 349 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace..."); }  //$NON-NLS-1$
 		    consumeArrayInitializer();  
 			break;
  
-    case 351 : if (DEBUG) { System.out.println("VariableInitializers ::= VariableInitializers COMMA..."); }  //$NON-NLS-1$
+    case 350 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace..."); }  //$NON-NLS-1$
+		    consumeArrayInitializer();  
+			break;
+ 
+    case 352 : if (DEBUG) { System.out.println("VariableInitializers ::= VariableInitializers COMMA..."); }  //$NON-NLS-1$
 		    consumeVariableInitializers();  
 			break;
  
-    case 352 : if (DEBUG) { System.out.println("Block ::= OpenBlock LBRACE BlockStatementsopt RBRACE"); }  //$NON-NLS-1$
+    case 353 : if (DEBUG) { System.out.println("Block ::= OpenBlock LBRACE BlockStatementsopt RBRACE"); }  //$NON-NLS-1$
 		    consumeBlock();  
 			break;
  
-    case 353 : if (DEBUG) { System.out.println("OpenBlock ::="); }  //$NON-NLS-1$
+    case 354 : if (DEBUG) { System.out.println("OpenBlock ::="); }  //$NON-NLS-1$
 		    consumeOpenBlock() ;  
 			break;
  
-    case 355 : if (DEBUG) { System.out.println("BlockStatements ::= BlockStatements BlockStatement"); }  //$NON-NLS-1$
+    case 356 : if (DEBUG) { System.out.println("BlockStatements ::= BlockStatements BlockStatement"); }  //$NON-NLS-1$
 		    consumeBlockStatements() ;  
 			break;
  
-    case 359 : if (DEBUG) { System.out.println("BlockStatement ::= InterfaceDeclaration"); }  //$NON-NLS-1$
+    case 360 : if (DEBUG) { System.out.println("BlockStatement ::= InterfaceDeclaration"); }  //$NON-NLS-1$
 		    consumeInvalidInterfaceDeclaration();  
 			break;
  
-    case 360 : if (DEBUG) { System.out.println("BlockStatement ::= AnnotationTypeDeclaration"); }  //$NON-NLS-1$
+    case 361 : if (DEBUG) { System.out.println("BlockStatement ::= AnnotationTypeDeclaration"); }  //$NON-NLS-1$
 		    consumeInvalidAnnotationTypeDeclaration();  
 			break;
  
-    case 361 : if (DEBUG) { System.out.println("BlockStatement ::= EnumDeclaration"); }  //$NON-NLS-1$
+    case 362 : if (DEBUG) { System.out.println("BlockStatement ::= EnumDeclaration"); }  //$NON-NLS-1$
 		    consumeInvalidEnumDeclaration();  
 			break;
  
-    case 362 : if (DEBUG) { System.out.println("LocalVariableDeclarationStatement ::=..."); }  //$NON-NLS-1$
+    case 363 : if (DEBUG) { System.out.println("LocalVariableDeclarationStatement ::=..."); }  //$NON-NLS-1$
 		    consumeLocalVariableDeclarationStatement();  
 			break;
  
-    case 363 : if (DEBUG) { System.out.println("LocalVariableDeclaration ::= Type PushModifiers..."); }  //$NON-NLS-1$
+    case 364 : if (DEBUG) { System.out.println("LocalVariableDeclaration ::= Type PushModifiers..."); }  //$NON-NLS-1$
 		    consumeLocalVariableDeclaration();  
 			break;
  
-    case 364 : if (DEBUG) { System.out.println("LocalVariableDeclaration ::= Modifiers Type..."); }  //$NON-NLS-1$
+    case 365 : if (DEBUG) { System.out.println("LocalVariableDeclaration ::= Modifiers Type..."); }  //$NON-NLS-1$
 		    consumeLocalVariableDeclaration();  
 			break;
  
-    case 365 : if (DEBUG) { System.out.println("PushModifiers ::="); }  //$NON-NLS-1$
+    case 366 : if (DEBUG) { System.out.println("PushModifiers ::="); }  //$NON-NLS-1$
 		    consumePushModifiers();  
 			break;
  
-    case 366 : if (DEBUG) { System.out.println("PushModifiersForHeader ::="); }  //$NON-NLS-1$
+    case 367 : if (DEBUG) { System.out.println("PushModifiersForHeader ::="); }  //$NON-NLS-1$
 		    consumePushModifiersForHeader();  
 			break;
  
-    case 367 : if (DEBUG) { System.out.println("PushRealModifiers ::="); }  //$NON-NLS-1$
+    case 368 : if (DEBUG) { System.out.println("PushRealModifiers ::="); }  //$NON-NLS-1$
 		    consumePushRealModifiers();  
 			break;
  
-    case 395 : if (DEBUG) { System.out.println("EmptyStatement ::= SEMICOLON"); }  //$NON-NLS-1$
+    case 396 : if (DEBUG) { System.out.println("EmptyStatement ::= SEMICOLON"); }  //$NON-NLS-1$
 		    consumeEmptyStatement();  
 			break;
  
-    case 396 : if (DEBUG) { System.out.println("LabeledStatement ::= Label COLON Statement"); }  //$NON-NLS-1$
+    case 397 : if (DEBUG) { System.out.println("LabeledStatement ::= Label COLON Statement"); }  //$NON-NLS-1$
 		    consumeStatementLabel() ;  
 			break;
  
-    case 397 : if (DEBUG) { System.out.println("LabeledStatementNoShortIf ::= Label COLON..."); }  //$NON-NLS-1$
+    case 398 : if (DEBUG) { System.out.println("LabeledStatementNoShortIf ::= Label COLON..."); }  //$NON-NLS-1$
 		    consumeStatementLabel() ;  
 			break;
  
-    case 398 : if (DEBUG) { System.out.println("Label ::= Identifier"); }  //$NON-NLS-1$
+    case 399 : if (DEBUG) { System.out.println("Label ::= Identifier"); }  //$NON-NLS-1$
 		    consumeLabel() ;  
 			break;
  
-     case 399 : if (DEBUG) { System.out.println("ExpressionStatement ::= StatementExpression SEMICOLON"); }  //$NON-NLS-1$
+     case 400 : if (DEBUG) { System.out.println("ExpressionStatement ::= StatementExpression SEMICOLON"); }  //$NON-NLS-1$
 		    consumeExpressionStatement();  
 			break;
  
-    case 409 : if (DEBUG) { System.out.println("IfThenStatement ::= if LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
+    case 410 : if (DEBUG) { System.out.println("IfThenStatement ::= if LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
 		    consumeStatementIfNoElse();  
 			break;
  
-    case 410 : if (DEBUG) { System.out.println("IfThenElseStatement ::= if LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
+    case 411 : if (DEBUG) { System.out.println("IfThenElseStatement ::= if LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
 		    consumeStatementIfWithElse();  
 			break;
  
-    case 411 : if (DEBUG) { System.out.println("IfThenElseStatementNoShortIf ::= if LPAREN Expression..."); }  //$NON-NLS-1$
+    case 412 : if (DEBUG) { System.out.println("IfThenElseStatementNoShortIf ::= if LPAREN Expression..."); }  //$NON-NLS-1$
 		    consumeStatementIfWithElse();  
 			break;
  
-    case 412 : if (DEBUG) { System.out.println("SwitchStatement ::= switch LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
+    case 413 : if (DEBUG) { System.out.println("SwitchStatement ::= switch LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
 		    consumeStatementSwitch() ;  
 			break;
  
-    case 413 : if (DEBUG) { System.out.println("SwitchBlock ::= LBRACE RBRACE"); }  //$NON-NLS-1$
+    case 414 : if (DEBUG) { System.out.println("SwitchBlock ::= LBRACE RBRACE"); }  //$NON-NLS-1$
 		    consumeEmptySwitchBlock() ;  
 			break;
  
-    case 416 : if (DEBUG) { System.out.println("SwitchBlock ::= LBRACE SwitchBlockStatements..."); }  //$NON-NLS-1$
+    case 417 : if (DEBUG) { System.out.println("SwitchBlock ::= LBRACE SwitchBlockStatements..."); }  //$NON-NLS-1$
 		    consumeSwitchBlock() ;  
 			break;
  
-    case 418 : if (DEBUG) { System.out.println("SwitchBlockStatements ::= SwitchBlockStatements..."); }  //$NON-NLS-1$
+    case 419 : if (DEBUG) { System.out.println("SwitchBlockStatements ::= SwitchBlockStatements..."); }  //$NON-NLS-1$
 		    consumeSwitchBlockStatements() ;  
 			break;
  
-    case 419 : if (DEBUG) { System.out.println("SwitchBlockStatement ::= SwitchLabels BlockStatements"); }  //$NON-NLS-1$
+    case 420 : if (DEBUG) { System.out.println("SwitchBlockStatement ::= SwitchLabels BlockStatements"); }  //$NON-NLS-1$
 		    consumeSwitchBlockStatement() ;  
 			break;
  
-    case 421 : if (DEBUG) { System.out.println("SwitchLabels ::= SwitchLabels SwitchLabel"); }  //$NON-NLS-1$
+    case 422 : if (DEBUG) { System.out.println("SwitchLabels ::= SwitchLabels SwitchLabel"); }  //$NON-NLS-1$
 		    consumeSwitchLabels() ;  
 			break;
  
-     case 422 : if (DEBUG) { System.out.println("SwitchLabel ::= case ConstantExpression COLON"); }  //$NON-NLS-1$
+     case 423 : if (DEBUG) { System.out.println("SwitchLabel ::= case ConstantExpression COLON"); }  //$NON-NLS-1$
 		    consumeCaseLabel();  
 			break;
  
-     case 423 : if (DEBUG) { System.out.println("SwitchLabel ::= default COLON"); }  //$NON-NLS-1$
+     case 424 : if (DEBUG) { System.out.println("SwitchLabel ::= default COLON"); }  //$NON-NLS-1$
 		    consumeDefaultLabel();  
 			break;
  
-    case 424 : if (DEBUG) { System.out.println("WhileStatement ::= while LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
+    case 425 : if (DEBUG) { System.out.println("WhileStatement ::= while LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
 		    consumeStatementWhile() ;  
 			break;
  
-    case 425 : if (DEBUG) { System.out.println("WhileStatementNoShortIf ::= while LPAREN Expression..."); }  //$NON-NLS-1$
+    case 426 : if (DEBUG) { System.out.println("WhileStatementNoShortIf ::= while LPAREN Expression..."); }  //$NON-NLS-1$
 		    consumeStatementWhile() ;  
 			break;
  
-    case 426 : if (DEBUG) { System.out.println("DoStatement ::= do Statement while LPAREN Expression..."); }  //$NON-NLS-1$
+    case 427 : if (DEBUG) { System.out.println("DoStatement ::= do Statement while LPAREN Expression..."); }  //$NON-NLS-1$
 		    consumeStatementDo() ;  
 			break;
  
-    case 427 : if (DEBUG) { System.out.println("ForStatement ::= for LPAREN ForInitopt SEMICOLON..."); }  //$NON-NLS-1$
+    case 428 : if (DEBUG) { System.out.println("ForStatement ::= for LPAREN ForInitopt SEMICOLON..."); }  //$NON-NLS-1$
 		    consumeStatementFor() ;  
 			break;
  
-    case 428 : if (DEBUG) { System.out.println("ForStatementNoShortIf ::= for LPAREN ForInitopt..."); }  //$NON-NLS-1$
+    case 429 : if (DEBUG) { System.out.println("ForStatementNoShortIf ::= for LPAREN ForInitopt..."); }  //$NON-NLS-1$
 		    consumeStatementFor() ;  
 			break;
  
-    case 429 : if (DEBUG) { System.out.println("ForInit ::= StatementExpressionList"); }  //$NON-NLS-1$
+    case 430 : if (DEBUG) { System.out.println("ForInit ::= StatementExpressionList"); }  //$NON-NLS-1$
 		    consumeForInit() ;  
 			break;
  
-    case 433 : if (DEBUG) { System.out.println("StatementExpressionList ::= StatementExpressionList..."); }  //$NON-NLS-1$
+    case 434 : if (DEBUG) { System.out.println("StatementExpressionList ::= StatementExpressionList..."); }  //$NON-NLS-1$
 		    consumeStatementExpressionList() ;  
 			break;
  
-    case 434 : if (DEBUG) { System.out.println("WithinStatement ::= within LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
+    case 435 : if (DEBUG) { System.out.println("WithinStatement ::= within LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
 		    consumeWithinStatement();  
 			break;
  
-    case 435 : if (DEBUG) { System.out.println("AssertStatement ::= assert Expression SEMICOLON"); }  //$NON-NLS-1$
+    case 436 : if (DEBUG) { System.out.println("AssertStatement ::= assert Expression SEMICOLON"); }  //$NON-NLS-1$
 		    consumeSimpleAssertStatement() ;  
 			break;
  
-    case 436 : if (DEBUG) { System.out.println("AssertStatement ::= assert Expression COLON Expression"); }  //$NON-NLS-1$
+    case 437 : if (DEBUG) { System.out.println("AssertStatement ::= assert Expression COLON Expression"); }  //$NON-NLS-1$
 		    consumeAssertStatement() ;  
 			break;
  
-    case 437 : if (DEBUG) { System.out.println("BreakStatement ::= break SEMICOLON"); }  //$NON-NLS-1$
+    case 438 : if (DEBUG) { System.out.println("BreakStatement ::= break SEMICOLON"); }  //$NON-NLS-1$
 		    consumeStatementBreak() ;  
 			break;
  
-    case 438 : if (DEBUG) { System.out.println("BreakStatement ::= break Identifier SEMICOLON"); }  //$NON-NLS-1$
+    case 439 : if (DEBUG) { System.out.println("BreakStatement ::= break Identifier SEMICOLON"); }  //$NON-NLS-1$
 		    consumeStatementBreakWithLabel() ;  
 			break;
  
-    case 439 : if (DEBUG) { System.out.println("ContinueStatement ::= continue SEMICOLON"); }  //$NON-NLS-1$
+    case 440 : if (DEBUG) { System.out.println("ContinueStatement ::= continue SEMICOLON"); }  //$NON-NLS-1$
 		    consumeStatementContinue() ;  
 			break;
  
-    case 440 : if (DEBUG) { System.out.println("ContinueStatement ::= continue Identifier SEMICOLON"); }  //$NON-NLS-1$
+    case 441 : if (DEBUG) { System.out.println("ContinueStatement ::= continue Identifier SEMICOLON"); }  //$NON-NLS-1$
 		    consumeStatementContinueWithLabel() ;  
 			break;
  
-    case 441 : if (DEBUG) { System.out.println("ReturnStatement ::= return Expressionopt SEMICOLON"); }  //$NON-NLS-1$
+    case 442 : if (DEBUG) { System.out.println("ReturnStatement ::= return Expressionopt SEMICOLON"); }  //$NON-NLS-1$
 		    consumeStatementReturn() ;  
 			break;
  
-    case 442 : if (DEBUG) { System.out.println("ThrowStatement ::= throw Expression SEMICOLON"); }  //$NON-NLS-1$
+    case 443 : if (DEBUG) { System.out.println("ThrowStatement ::= throw Expression SEMICOLON"); }  //$NON-NLS-1$
 		    consumeStatementThrow();  
 			break;
  
-    case 443 : if (DEBUG) { System.out.println("SynchronizedStatement ::= OnlySynchronized LPAREN..."); }  //$NON-NLS-1$
+    case 444 : if (DEBUG) { System.out.println("SynchronizedStatement ::= OnlySynchronized LPAREN..."); }  //$NON-NLS-1$
 		    consumeStatementSynchronized();  
 			break;
  
-    case 444 : if (DEBUG) { System.out.println("OnlySynchronized ::= synchronized"); }  //$NON-NLS-1$
+    case 445 : if (DEBUG) { System.out.println("OnlySynchronized ::= synchronized"); }  //$NON-NLS-1$
 		    consumeOnlySynchronized();  
 			break;
  
-    case 445 : if (DEBUG) { System.out.println("TryStatement ::= try TryBlock Catches"); }  //$NON-NLS-1$
+    case 446 : if (DEBUG) { System.out.println("TryStatement ::= try TryBlock Catches"); }  //$NON-NLS-1$
 		    consumeStatementTry(false, false);  
 			break;
  
-    case 446 : if (DEBUG) { System.out.println("TryStatement ::= try TryBlock Catchesopt Finally"); }  //$NON-NLS-1$
+    case 447 : if (DEBUG) { System.out.println("TryStatement ::= try TryBlock Catchesopt Finally"); }  //$NON-NLS-1$
 		    consumeStatementTry(true, false);  
 			break;
  
-    case 447 : if (DEBUG) { System.out.println("TryStatementWithResources ::= try ResourceSpecification"); }  //$NON-NLS-1$
+    case 448 : if (DEBUG) { System.out.println("TryStatementWithResources ::= try ResourceSpecification"); }  //$NON-NLS-1$
 		    consumeStatementTry(false, true);  
 			break;
  
-    case 448 : if (DEBUG) { System.out.println("TryStatementWithResources ::= try ResourceSpecification"); }  //$NON-NLS-1$
+    case 449 : if (DEBUG) { System.out.println("TryStatementWithResources ::= try ResourceSpecification"); }  //$NON-NLS-1$
 		    consumeStatementTry(true, true);  
 			break;
  
-    case 449 : if (DEBUG) { System.out.println("ResourceSpecification ::= LPAREN Resources ;opt RPAREN"); }  //$NON-NLS-1$
+    case 450 : if (DEBUG) { System.out.println("ResourceSpecification ::= LPAREN Resources ;opt RPAREN"); }  //$NON-NLS-1$
 		    consumeResourceSpecification();  
 			break;
  
-    case 450 : if (DEBUG) { System.out.println(";opt ::="); }  //$NON-NLS-1$
+    case 451 : if (DEBUG) { System.out.println(";opt ::="); }  //$NON-NLS-1$
 		    consumeResourceOptionalTrailingSemiColon(false);  
 			break;
  
-    case 451 : if (DEBUG) { System.out.println(";opt ::= SEMICOLON"); }  //$NON-NLS-1$
+    case 452 : if (DEBUG) { System.out.println(";opt ::= SEMICOLON"); }  //$NON-NLS-1$
 		    consumeResourceOptionalTrailingSemiColon(true);  
 			break;
  
-    case 452 : if (DEBUG) { System.out.println("Resources ::= Resource"); }  //$NON-NLS-1$
+    case 453 : if (DEBUG) { System.out.println("Resources ::= Resource"); }  //$NON-NLS-1$
 		    consumeSingleResource();  
 			break;
  
-    case 453 : if (DEBUG) { System.out.println("Resources ::= Resources TrailingSemiColon Resource"); }  //$NON-NLS-1$
+    case 454 : if (DEBUG) { System.out.println("Resources ::= Resources TrailingSemiColon Resource"); }  //$NON-NLS-1$
 		    consumeMultipleResources();  
 			break;
  
-    case 454 : if (DEBUG) { System.out.println("TrailingSemiColon ::= SEMICOLON"); }  //$NON-NLS-1$
+    case 455 : if (DEBUG) { System.out.println("TrailingSemiColon ::= SEMICOLON"); }  //$NON-NLS-1$
 		    consumeResourceOptionalTrailingSemiColon(true);  
 			break;
  
-    case 455 : if (DEBUG) { System.out.println("Resource ::= Type PushModifiers VariableDeclaratorId..."); }  //$NON-NLS-1$
+    case 456 : if (DEBUG) { System.out.println("Resource ::= Type PushModifiers VariableDeclaratorId..."); }  //$NON-NLS-1$
 		    consumeResourceAsLocalVariableDeclaration();  
 			break;
  
-    case 456 : if (DEBUG) { System.out.println("Resource ::= Modifiers Type PushRealModifiers..."); }  //$NON-NLS-1$
+    case 457 : if (DEBUG) { System.out.println("Resource ::= Modifiers Type PushRealModifiers..."); }  //$NON-NLS-1$
 		    consumeResourceAsLocalVariableDeclaration();  
 			break;
  
-    case 458 : if (DEBUG) { System.out.println("ExitTryBlock ::="); }  //$NON-NLS-1$
+    case 459 : if (DEBUG) { System.out.println("ExitTryBlock ::="); }  //$NON-NLS-1$
 		    consumeExitTryBlock();  
 			break;
  
-    case 460 : if (DEBUG) { System.out.println("Catches ::= Catches CatchClause"); }  //$NON-NLS-1$
+    case 461 : if (DEBUG) { System.out.println("Catches ::= Catches CatchClause"); }  //$NON-NLS-1$
 		    consumeCatches();  
 			break;
  
-    case 461 : if (DEBUG) { System.out.println("CatchClause ::= catch LPAREN CatchFormalParameter RPAREN"); }  //$NON-NLS-1$
+    case 462 : if (DEBUG) { System.out.println("CatchClause ::= catch LPAREN CatchFormalParameter RPAREN"); }  //$NON-NLS-1$
 		    consumeStatementCatch() ;  
 			break;
  
-    case 463 : if (DEBUG) { System.out.println("PushLPAREN ::= LPAREN"); }  //$NON-NLS-1$
+    case 464 : if (DEBUG) { System.out.println("PushLPAREN ::= LPAREN"); }  //$NON-NLS-1$
 		    consumeLeftParen();  
 			break;
  
-    case 464 : if (DEBUG) { System.out.println("PushRPAREN ::= RPAREN"); }  //$NON-NLS-1$
+    case 465 : if (DEBUG) { System.out.println("PushRPAREN ::= RPAREN"); }  //$NON-NLS-1$
 		    consumeRightParen();  
 			break;
  
-    case 469 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= this"); }  //$NON-NLS-1$
+    case 470 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= this"); }  //$NON-NLS-1$
 		    consumePrimaryNoNewArrayThis();  
 			break;
  
-    case 470 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PushLPAREN Expression_NotName..."); }  //$NON-NLS-1$
+    case 471 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PushLPAREN Expression_NotName..."); }  //$NON-NLS-1$
 		    consumePrimaryNoNewArray();  
 			break;
  
-    case 471 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PushLPAREN Name PushRPAREN"); }  //$NON-NLS-1$
+    case 472 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PushLPAREN Name PushRPAREN"); }  //$NON-NLS-1$
 		    consumePrimaryNoNewArrayWithName();  
 			break;
  
-    case 475 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT this"); }  //$NON-NLS-1$
+    case 476 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT this"); }  //$NON-NLS-1$
 		    consumePrimaryNoNewArrayNameThis();  
 			break;
  
-    case 476 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT super"); }  //$NON-NLS-1$
+    case 477 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT super"); }  //$NON-NLS-1$
 		    consumePrimaryNoNewArrayNameSuper();  
 			break;
  
-    case 477 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT class"); }  //$NON-NLS-1$
+    case 478 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT class"); }  //$NON-NLS-1$
 		    consumePrimaryNoNewArrayName();  
 			break;
  
-    case 478 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name Dims DOT class"); }  //$NON-NLS-1$
+    case 479 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name Dims DOT class"); }  //$NON-NLS-1$
 		    consumePrimaryNoNewArrayArrayType();  
 			break;
  
-    case 479 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PrimitiveType Dims DOT class"); }  //$NON-NLS-1$
+    case 480 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PrimitiveType Dims DOT class"); }  //$NON-NLS-1$
 		    consumePrimaryNoNewArrayPrimitiveArrayType();  
 			break;
  
-    case 480 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PrimitiveType DOT class"); }  //$NON-NLS-1$
+    case 481 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PrimitiveType DOT class"); }  //$NON-NLS-1$
 		    consumePrimaryNoNewArrayPrimitiveType();  
 			break;
  
-    case 481 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression LESS..."); }  //$NON-NLS-1$
+    case 482 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression LESS..."); }  //$NON-NLS-1$
 		    consumeRoleClassLiteral();  
 			break;
  
-    case 484 : if (DEBUG) { System.out.println("AllocationHeader ::= new ClassType LPAREN..."); }  //$NON-NLS-1$
+    case 485 : if (DEBUG) { System.out.println("AllocationHeader ::= new ClassType LPAREN..."); }  //$NON-NLS-1$
 		    consumeAllocationHeader();  
 			break;
  
-    case 485 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= new..."); }  //$NON-NLS-1$
+    case 486 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= new..."); }  //$NON-NLS-1$
 		    consumeClassInstanceCreationExpressionWithTypeArguments();  
 			break;
  
-    case 486 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= new ClassType..."); }  //$NON-NLS-1$
+    case 487 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= new ClassType..."); }  //$NON-NLS-1$
 		    consumeClassInstanceCreationExpression();  
 			break;
  
-    case 487 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= Primary DOT new..."); }  //$NON-NLS-1$
+    case 488 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= Primary DOT new..."); }  //$NON-NLS-1$
 		    consumeClassInstanceCreationExpressionQualifiedWithTypeArguments() ;  
 			break;
  
-    case 488 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= Primary DOT new..."); }  //$NON-NLS-1$
-		    consumeClassInstanceCreationExpressionQualified() ;  
-			break;
- 
-    case 489 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::=..."); }  //$NON-NLS-1$
+    case 489 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= Primary DOT new..."); }  //$NON-NLS-1$
 		    consumeClassInstanceCreationExpressionQualified() ;  
 			break;
  
     case 490 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::=..."); }  //$NON-NLS-1$
+		    consumeClassInstanceCreationExpressionQualified() ;  
+			break;
+ 
+    case 491 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::=..."); }  //$NON-NLS-1$
 		    consumeClassInstanceCreationExpressionQualifiedWithTypeArguments() ;  
 			break;
  
-    case 491 : if (DEBUG) { System.out.println("EnterInstanceCreationArgumentList ::="); }  //$NON-NLS-1$
+    case 492 : if (DEBUG) { System.out.println("EnterInstanceCreationArgumentList ::="); }  //$NON-NLS-1$
 		    consumeEnterInstanceCreationArgumentList();  
 			break;
  
-    case 492 : if (DEBUG) { System.out.println("ClassInstanceCreationExpressionName ::= Name DOT"); }  //$NON-NLS-1$
+    case 493 : if (DEBUG) { System.out.println("ClassInstanceCreationExpressionName ::= Name DOT"); }  //$NON-NLS-1$
 		    consumeClassInstanceCreationExpressionName() ;  
 			break;
  
-    case 493 : if (DEBUG) { System.out.println("UnqualifiedClassBodyopt ::="); }  //$NON-NLS-1$
+    case 494 : if (DEBUG) { System.out.println("UnqualifiedClassBodyopt ::="); }  //$NON-NLS-1$
 		    consumeClassBodyopt();  
 			break;
  
-    case 495 : if (DEBUG) { System.out.println("UnqualifiedEnterAnonymousClassBody ::="); }  //$NON-NLS-1$
+    case 496 : if (DEBUG) { System.out.println("UnqualifiedEnterAnonymousClassBody ::="); }  //$NON-NLS-1$
 		    consumeEnterAnonymousClassBody(false);  
 			break;
  
-    case 496 : if (DEBUG) { System.out.println("QualifiedClassBodyopt ::="); }  //$NON-NLS-1$
+    case 497 : if (DEBUG) { System.out.println("QualifiedClassBodyopt ::="); }  //$NON-NLS-1$
 		    consumeClassBodyopt();  
 			break;
  
-    case 498 : if (DEBUG) { System.out.println("QualifiedEnterAnonymousClassBody ::="); }  //$NON-NLS-1$
+    case 499 : if (DEBUG) { System.out.println("QualifiedEnterAnonymousClassBody ::="); }  //$NON-NLS-1$
 		    consumeEnterAnonymousClassBody(true);  
 			break;
  
-    case 500 : if (DEBUG) { System.out.println("ArgumentList ::= ArgumentList COMMA Expression"); }  //$NON-NLS-1$
+    case 501 : if (DEBUG) { System.out.println("ArgumentList ::= ArgumentList COMMA Expression"); }  //$NON-NLS-1$
 		    consumeArgumentList();  
 			break;
  
-    case 501 : if (DEBUG) { System.out.println("ArrayCreationHeader ::= new PrimitiveType..."); }  //$NON-NLS-1$
+    case 502 : if (DEBUG) { System.out.println("ArrayCreationHeader ::= new PrimitiveType..."); }  //$NON-NLS-1$
 		    consumeArrayCreationHeader();  
 			break;
  
-    case 502 : if (DEBUG) { System.out.println("ArrayCreationHeader ::= new ClassOrInterfaceType..."); }  //$NON-NLS-1$
+    case 503 : if (DEBUG) { System.out.println("ArrayCreationHeader ::= new ClassOrInterfaceType..."); }  //$NON-NLS-1$
 		    consumeArrayCreationHeader();  
 			break;
  
-    case 503 : if (DEBUG) { System.out.println("ArrayCreationWithoutArrayInitializer ::= new..."); }  //$NON-NLS-1$
+    case 504 : if (DEBUG) { System.out.println("ArrayCreationWithoutArrayInitializer ::= new..."); }  //$NON-NLS-1$
 		    consumeArrayCreationExpressionWithoutInitializer();  
 			break;
  
-    case 504 : if (DEBUG) { System.out.println("ArrayCreationWithArrayInitializer ::= new PrimitiveType"); }  //$NON-NLS-1$
+    case 505 : if (DEBUG) { System.out.println("ArrayCreationWithArrayInitializer ::= new PrimitiveType"); }  //$NON-NLS-1$
 		    consumeArrayCreationExpressionWithInitializer();  
 			break;
  
-    case 505 : if (DEBUG) { System.out.println("ArrayCreationWithoutArrayInitializer ::= new..."); }  //$NON-NLS-1$
+    case 506 : if (DEBUG) { System.out.println("ArrayCreationWithoutArrayInitializer ::= new..."); }  //$NON-NLS-1$
 		    consumeArrayCreationExpressionWithoutInitializer();  
 			break;
  
-    case 506 : if (DEBUG) { System.out.println("ArrayCreationWithArrayInitializer ::= new..."); }  //$NON-NLS-1$
+    case 507 : if (DEBUG) { System.out.println("ArrayCreationWithArrayInitializer ::= new..."); }  //$NON-NLS-1$
 		    consumeArrayCreationExpressionWithInitializer();  
 			break;
  
-    case 508 : if (DEBUG) { System.out.println("DimWithOrWithOutExprs ::= DimWithOrWithOutExprs..."); }  //$NON-NLS-1$
+    case 509 : if (DEBUG) { System.out.println("DimWithOrWithOutExprs ::= DimWithOrWithOutExprs..."); }  //$NON-NLS-1$
 		    consumeDimWithOrWithOutExprs();  
 			break;
  
-     case 510 : if (DEBUG) { System.out.println("DimWithOrWithOutExpr ::= LBRACKET RBRACKET"); }  //$NON-NLS-1$
+     case 511 : if (DEBUG) { System.out.println("DimWithOrWithOutExpr ::= LBRACKET RBRACKET"); }  //$NON-NLS-1$
 		    consumeDimWithOrWithOutExpr();  
 			break;
  
-     case 511 : if (DEBUG) { System.out.println("Dims ::= DimsLoop"); }  //$NON-NLS-1$
+     case 512 : if (DEBUG) { System.out.println("Dims ::= DimsLoop"); }  //$NON-NLS-1$
 		    consumeDims();  
 			break;
  
-     case 514 : if (DEBUG) { System.out.println("OneDimLoop ::= LBRACKET RBRACKET"); }  //$NON-NLS-1$
+     case 515 : if (DEBUG) { System.out.println("OneDimLoop ::= LBRACKET RBRACKET"); }  //$NON-NLS-1$
 		    consumeOneDimLoop();  
 			break;
  
-    case 515 : if (DEBUG) { System.out.println("FieldAccess ::= Primary DOT Identifier"); }  //$NON-NLS-1$
+    case 516 : if (DEBUG) { System.out.println("FieldAccess ::= Primary DOT Identifier"); }  //$NON-NLS-1$
 		    consumeFieldAccess(false);  
 			break;
  
-    case 516 : if (DEBUG) { System.out.println("FieldAccess ::= super DOT Identifier"); }  //$NON-NLS-1$
+    case 517 : if (DEBUG) { System.out.println("FieldAccess ::= super DOT Identifier"); }  //$NON-NLS-1$
 		    consumeFieldAccess(true);  
 			break;
  
-    case 517 : if (DEBUG) { System.out.println("MethodInvocation ::= Name LPAREN ArgumentListopt RPAREN"); }  //$NON-NLS-1$
+    case 518 : if (DEBUG) { System.out.println("MethodInvocation ::= Name LPAREN ArgumentListopt RPAREN"); }  //$NON-NLS-1$
 		    consumeMethodInvocationName();  
 			break;
  
-    case 518 : if (DEBUG) { System.out.println("MethodInvocation ::= Name DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
+    case 519 : if (DEBUG) { System.out.println("MethodInvocation ::= Name DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationNameWithTypeArguments();  
 			break;
  
-    case 519 : if (DEBUG) { System.out.println("MethodInvocation ::= Primary DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
+    case 520 : if (DEBUG) { System.out.println("MethodInvocation ::= Primary DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationPrimaryWithTypeArguments();  
 			break;
  
-    case 520 : if (DEBUG) { System.out.println("MethodInvocation ::= Primary DOT Identifier LPAREN..."); }  //$NON-NLS-1$
+    case 521 : if (DEBUG) { System.out.println("MethodInvocation ::= Primary DOT Identifier LPAREN..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationPrimary();  
 			break;
  
-    case 521 : if (DEBUG) { System.out.println("MethodInvocation ::= super DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
+    case 522 : if (DEBUG) { System.out.println("MethodInvocation ::= super DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationSuperWithTypeArguments();  
 			break;
  
-    case 522 : if (DEBUG) { System.out.println("MethodInvocation ::= super DOT Identifier LPAREN..."); }  //$NON-NLS-1$
+    case 523 : if (DEBUG) { System.out.println("MethodInvocation ::= super DOT Identifier LPAREN..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationSuper();  
 			break;
  
-    case 523 : if (DEBUG) { System.out.println("MethodInvocation ::= tsuper DOT Identifier LPAREN..."); }  //$NON-NLS-1$
+    case 524 : if (DEBUG) { System.out.println("MethodInvocation ::= tsuper DOT Identifier LPAREN..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationTSuper(UNQUALIFIED);  
 			break;
  
-    case 524 : if (DEBUG) { System.out.println("MethodInvocation ::= tsuper DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
+    case 525 : if (DEBUG) { System.out.println("MethodInvocation ::= tsuper DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationTSuperWithTypeArguments(0);  
 			break;
  
-    case 525 : if (DEBUG) { System.out.println("MethodInvocation ::= Name DOT tsuper DOT Identifier..."); }  //$NON-NLS-1$
+    case 526 : if (DEBUG) { System.out.println("MethodInvocation ::= Name DOT tsuper DOT Identifier..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationTSuper(QUALIFIED);  
 			break;
  
-    case 526 : if (DEBUG) { System.out.println("MethodInvocation ::= Name DOT tsuper DOT..."); }  //$NON-NLS-1$
+    case 527 : if (DEBUG) { System.out.println("MethodInvocation ::= Name DOT tsuper DOT..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationTSuperWithTypeArguments(2);  
 			break;
  
-    case 527 : if (DEBUG) { System.out.println("MethodInvocation ::= base DOT Identifier LPAREN..."); }  //$NON-NLS-1$
+    case 528 : if (DEBUG) { System.out.println("MethodInvocation ::= base DOT Identifier LPAREN..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationBase(false);  
 			break;
  
-    case 528 : if (DEBUG) { System.out.println("MethodInvocation ::= base DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
+    case 529 : if (DEBUG) { System.out.println("MethodInvocation ::= base DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationBaseWithTypeArguments(false);  
 			break;
  
-    case 529 : if (DEBUG) { System.out.println("MethodInvocation ::= base DOT super DOT Identifier..."); }  //$NON-NLS-1$
+    case 530 : if (DEBUG) { System.out.println("MethodInvocation ::= base DOT super DOT Identifier..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationBase(true);  
 			break;
  
-    case 530 : if (DEBUG) { System.out.println("MethodInvocation ::= base DOT super DOT..."); }  //$NON-NLS-1$
+    case 531 : if (DEBUG) { System.out.println("MethodInvocation ::= base DOT super DOT..."); }  //$NON-NLS-1$
 		    consumeMethodInvocationBaseWithTypeArguments(true);  
 			break;
  
-    case 531 : if (DEBUG) { System.out.println("ArrayAccess ::= Name LBRACKET Expression RBRACKET"); }  //$NON-NLS-1$
+    case 532 : if (DEBUG) { System.out.println("ArrayAccess ::= Name LBRACKET Expression RBRACKET"); }  //$NON-NLS-1$
 		    consumeArrayAccess(true);  
 			break;
  
-    case 532 : if (DEBUG) { System.out.println("ArrayAccess ::= PrimaryNoNewArray LBRACKET Expression..."); }  //$NON-NLS-1$
+    case 533 : if (DEBUG) { System.out.println("ArrayAccess ::= PrimaryNoNewArray LBRACKET Expression..."); }  //$NON-NLS-1$
 		    consumeArrayAccess(false);  
 			break;
  
-    case 533 : if (DEBUG) { System.out.println("ArrayAccess ::= ArrayCreationWithArrayInitializer..."); }  //$NON-NLS-1$
+    case 534 : if (DEBUG) { System.out.println("ArrayAccess ::= ArrayCreationWithArrayInitializer..."); }  //$NON-NLS-1$
 		    consumeArrayAccess(false);  
 			break;
  
-    case 535 : if (DEBUG) { System.out.println("PostfixExpression ::= Name"); }  //$NON-NLS-1$
+    case 536 : if (DEBUG) { System.out.println("PostfixExpression ::= Name"); }  //$NON-NLS-1$
 		    consumePostfixExpression();  
 			break;
  
-    case 538 : if (DEBUG) { System.out.println("PostIncrementExpression ::= PostfixExpression PLUS_PLUS"); }  //$NON-NLS-1$
+    case 539 : if (DEBUG) { System.out.println("PostIncrementExpression ::= PostfixExpression PLUS_PLUS"); }  //$NON-NLS-1$
 		    consumeUnaryExpression(OperatorIds.PLUS,true);  
 			break;
  
-    case 539 : if (DEBUG) { System.out.println("PostDecrementExpression ::= PostfixExpression..."); }  //$NON-NLS-1$
+    case 540 : if (DEBUG) { System.out.println("PostDecrementExpression ::= PostfixExpression..."); }  //$NON-NLS-1$
 		    consumeUnaryExpression(OperatorIds.MINUS,true);  
 			break;
  
-    case 540 : if (DEBUG) { System.out.println("PushPosition ::="); }  //$NON-NLS-1$
+    case 541 : if (DEBUG) { System.out.println("PushPosition ::="); }  //$NON-NLS-1$
 		    consumePushPosition();  
 			break;
  
-    case 543 : if (DEBUG) { System.out.println("UnaryExpression ::= PLUS PushPosition UnaryExpression"); }  //$NON-NLS-1$
+    case 544 : if (DEBUG) { System.out.println("UnaryExpression ::= PLUS PushPosition UnaryExpression"); }  //$NON-NLS-1$
 		    consumeUnaryExpression(OperatorIds.PLUS);  
 			break;
  
-    case 544 : if (DEBUG) { System.out.println("UnaryExpression ::= MINUS PushPosition UnaryExpression"); }  //$NON-NLS-1$
+    case 545 : if (DEBUG) { System.out.println("UnaryExpression ::= MINUS PushPosition UnaryExpression"); }  //$NON-NLS-1$
 		    consumeUnaryExpression(OperatorIds.MINUS);  
 			break;
  
-    case 546 : if (DEBUG) { System.out.println("PreIncrementExpression ::= PLUS_PLUS PushPosition..."); }  //$NON-NLS-1$
+    case 547 : if (DEBUG) { System.out.println("PreIncrementExpression ::= PLUS_PLUS PushPosition..."); }  //$NON-NLS-1$
 		    consumeUnaryExpression(OperatorIds.PLUS,false);  
 			break;
  
-    case 547 : if (DEBUG) { System.out.println("PreDecrementExpression ::= MINUS_MINUS PushPosition..."); }  //$NON-NLS-1$
+    case 548 : if (DEBUG) { System.out.println("PreDecrementExpression ::= MINUS_MINUS PushPosition..."); }  //$NON-NLS-1$
 		    consumeUnaryExpression(OperatorIds.MINUS,false);  
 			break;
  
-    case 549 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus ::= TWIDDLE PushPosition..."); }  //$NON-NLS-1$
+    case 550 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus ::= TWIDDLE PushPosition..."); }  //$NON-NLS-1$
 		    consumeUnaryExpression(OperatorIds.TWIDDLE);  
 			break;
  
-    case 550 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus ::= NOT PushPosition..."); }  //$NON-NLS-1$
+    case 551 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus ::= NOT PushPosition..."); }  //$NON-NLS-1$
 		    consumeUnaryExpression(OperatorIds.NOT);  
 			break;
  
-    case 552 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN PrimitiveType Dimsopt..."); }  //$NON-NLS-1$
+    case 553 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN PrimitiveType Dimsopt..."); }  //$NON-NLS-1$
 		    consumeCastExpressionWithPrimitiveType();  
 			break;
  
-    case 553 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name..."); }  //$NON-NLS-1$
+    case 554 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name..."); }  //$NON-NLS-1$
 		    consumeCastExpressionWithGenericsArray();  
 			break;
  
-    case 554 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name..."); }  //$NON-NLS-1$
+    case 555 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name..."); }  //$NON-NLS-1$
 		    consumeCastExpressionWithQualifiedGenericsArray();  
 			break;
  
-    case 555 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name PushRPAREN..."); }  //$NON-NLS-1$
+    case 556 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name PushRPAREN..."); }  //$NON-NLS-1$
 		    consumeCastExpressionLL1();  
 			break;
  
-    case 556 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name Dims PushRPAREN..."); }  //$NON-NLS-1$
+    case 557 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name Dims PushRPAREN..."); }  //$NON-NLS-1$
 		    consumeCastExpressionWithNameArray();  
 			break;
  
-    case 557 : if (DEBUG) { System.out.println("OnlyTypeArgumentsForCastExpression ::= OnlyTypeArguments"); }  //$NON-NLS-1$
+    case 558 : if (DEBUG) { System.out.println("OnlyTypeArgumentsForCastExpression ::= OnlyTypeArguments"); }  //$NON-NLS-1$
 		    consumeOnlyTypeArgumentsForCastExpression();  
 			break;
  
-    case 558 : if (DEBUG) { System.out.println("InsideCastExpression ::="); }  //$NON-NLS-1$
+    case 559 : if (DEBUG) { System.out.println("InsideCastExpression ::="); }  //$NON-NLS-1$
 		    consumeInsideCastExpression();  
 			break;
  
-    case 559 : if (DEBUG) { System.out.println("InsideCastExpressionLL1 ::="); }  //$NON-NLS-1$
+    case 560 : if (DEBUG) { System.out.println("InsideCastExpressionLL1 ::="); }  //$NON-NLS-1$
 		    consumeInsideCastExpressionLL1();  
 			break;
  
-    case 560 : if (DEBUG) { System.out.println("InsideCastExpressionWithQualifiedGenerics ::="); }  //$NON-NLS-1$
+    case 561 : if (DEBUG) { System.out.println("InsideCastExpressionWithQualifiedGenerics ::="); }  //$NON-NLS-1$
 		    consumeInsideCastExpressionWithQualifiedGenerics();  
 			break;
  
-    case 562 : if (DEBUG) { System.out.println("MultiplicativeExpression ::= MultiplicativeExpression..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.MULTIPLY);  
-			break;
- 
     case 563 : if (DEBUG) { System.out.println("MultiplicativeExpression ::= MultiplicativeExpression..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.DIVIDE);  
+		    consumeBinaryExpression(OperatorIds.MULTIPLY);  
 			break;
  
     case 564 : if (DEBUG) { System.out.println("MultiplicativeExpression ::= MultiplicativeExpression..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.REMAINDER);  
-			break;
- 
-    case 566 : if (DEBUG) { System.out.println("AdditiveExpression ::= AdditiveExpression PLUS..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.PLUS);  
-			break;
- 
-    case 567 : if (DEBUG) { System.out.println("AdditiveExpression ::= AdditiveExpression MINUS..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.MINUS);  
-			break;
- 
-    case 569 : if (DEBUG) { System.out.println("ShiftExpression ::= ShiftExpression LEFT_SHIFT..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.LEFT_SHIFT);  
-			break;
- 
-    case 570 : if (DEBUG) { System.out.println("ShiftExpression ::= ShiftExpression RIGHT_SHIFT..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.RIGHT_SHIFT);  
-			break;
- 
-    case 571 : if (DEBUG) { System.out.println("ShiftExpression ::= ShiftExpression UNSIGNED_RIGHT_SHIFT"); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.UNSIGNED_RIGHT_SHIFT);  
-			break;
- 
-    case 573 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression LESS..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.LESS);  
-			break;
- 
-    case 574 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression GREATER..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.GREATER);  
-			break;
- 
-    case 575 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression LESS_EQUAL"); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.LESS_EQUAL);  
-			break;
- 
-    case 576 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.GREATER_EQUAL);  
-			break;
- 
-    case 578 : if (DEBUG) { System.out.println("InstanceofExpression ::= InstanceofExpression instanceof"); }  //$NON-NLS-1$
-		    consumeInstanceOfExpression();  
-			break;
- 
-    case 580 : if (DEBUG) { System.out.println("EqualityExpression ::= EqualityExpression EQUAL_EQUAL..."); }  //$NON-NLS-1$
-		    consumeEqualityExpression(OperatorIds.EQUAL_EQUAL);  
-			break;
- 
-    case 581 : if (DEBUG) { System.out.println("EqualityExpression ::= EqualityExpression NOT_EQUAL..."); }  //$NON-NLS-1$
-		    consumeEqualityExpression(OperatorIds.NOT_EQUAL);  
-			break;
- 
-    case 583 : if (DEBUG) { System.out.println("AndExpression ::= AndExpression AND EqualityExpression"); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.AND);  
-			break;
- 
-    case 585 : if (DEBUG) { System.out.println("ExclusiveOrExpression ::= ExclusiveOrExpression XOR..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.XOR);  
-			break;
- 
-    case 587 : if (DEBUG) { System.out.println("InclusiveOrExpression ::= InclusiveOrExpression OR..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.OR);  
-			break;
- 
-    case 589 : if (DEBUG) { System.out.println("ConditionalAndExpression ::= ConditionalAndExpression..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.AND_AND);  
-			break;
- 
-    case 591 : if (DEBUG) { System.out.println("ConditionalOrExpression ::= ConditionalOrExpression..."); }  //$NON-NLS-1$
-		    consumeBinaryExpression(OperatorIds.OR_OR);  
-			break;
- 
-    case 593 : if (DEBUG) { System.out.println("ConditionalExpression ::= ConditionalOrExpression..."); }  //$NON-NLS-1$
-		    consumeConditionalExpression(OperatorIds.QUESTIONCOLON) ;  
-			break;
- 
-    case 596 : if (DEBUG) { System.out.println("Assignment ::= PostfixExpression AssignmentOperator..."); }  //$NON-NLS-1$
-		    consumeAssignment();  
-			break;
- 
-    case 598 : if (DEBUG) { System.out.println("Assignment ::= InvalidArrayInitializerAssignement"); }  //$NON-NLS-1$
-		    ignoreExpressionAssignment(); 
-			break;
- 
-    case 599 : if (DEBUG) { System.out.println("AssignmentOperator ::= EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(EQUAL);  
-			break;
- 
-    case 600 : if (DEBUG) { System.out.println("AssignmentOperator ::= MULTIPLY_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(MULTIPLY);  
-			break;
- 
-    case 601 : if (DEBUG) { System.out.println("AssignmentOperator ::= DIVIDE_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(DIVIDE);  
-			break;
- 
-    case 602 : if (DEBUG) { System.out.println("AssignmentOperator ::= REMAINDER_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(REMAINDER);  
-			break;
- 
-    case 603 : if (DEBUG) { System.out.println("AssignmentOperator ::= PLUS_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(PLUS);  
-			break;
- 
-    case 604 : if (DEBUG) { System.out.println("AssignmentOperator ::= MINUS_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(MINUS);  
-			break;
- 
-    case 605 : if (DEBUG) { System.out.println("AssignmentOperator ::= LEFT_SHIFT_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(LEFT_SHIFT);  
-			break;
- 
-    case 606 : if (DEBUG) { System.out.println("AssignmentOperator ::= RIGHT_SHIFT_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(RIGHT_SHIFT);  
-			break;
- 
-    case 607 : if (DEBUG) { System.out.println("AssignmentOperator ::= UNSIGNED_RIGHT_SHIFT_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(UNSIGNED_RIGHT_SHIFT);  
-			break;
- 
-    case 608 : if (DEBUG) { System.out.println("AssignmentOperator ::= AND_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(AND);  
-			break;
- 
-    case 609 : if (DEBUG) { System.out.println("AssignmentOperator ::= XOR_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(XOR);  
-			break;
- 
-    case 610 : if (DEBUG) { System.out.println("AssignmentOperator ::= OR_EQUAL"); }  //$NON-NLS-1$
-		    consumeAssignmentOperator(OR);  
-			break;
- 
-    case 614 : if (DEBUG) { System.out.println("Expressionopt ::="); }  //$NON-NLS-1$
-		    consumeEmptyExpression();  
-			break;
- 
-    case 619 : if (DEBUG) { System.out.println("ClassBodyDeclarationsopt ::="); }  //$NON-NLS-1$
-		    consumeEmptyClassBodyDeclarationsopt();  
-			break;
- 
-    case 620 : if (DEBUG) { System.out.println("ClassBodyDeclarationsopt ::= NestedType..."); }  //$NON-NLS-1$
-		    consumeClassBodyDeclarationsopt();  
-			break;
- 
-     case 621 : if (DEBUG) { System.out.println("Modifiersopt ::="); }  //$NON-NLS-1$
-		    consumeDefaultModifiers();  
-			break;
- 
-    case 622 : if (DEBUG) { System.out.println("Modifiersopt ::= Modifiers"); }  //$NON-NLS-1$
-		    consumeModifiers();  
-			break;
- 
-    case 623 : if (DEBUG) { System.out.println("BlockStatementsopt ::="); }  //$NON-NLS-1$
-		    consumeEmptyBlockStatementsopt();  
-			break;
- 
-     case 625 : if (DEBUG) { System.out.println("Dimsopt ::="); }  //$NON-NLS-1$
-		    consumeEmptyDimsopt();  
-			break;
- 
-     case 627 : if (DEBUG) { System.out.println("ArgumentListopt ::="); }  //$NON-NLS-1$
-		    consumeEmptyArgumentListopt();  
-			break;
- 
-    case 631 : if (DEBUG) { System.out.println("FormalParameterListopt ::="); }  //$NON-NLS-1$
-		    consumeFormalParameterListopt();  
-			break;
- 
-     case 635 : if (DEBUG) { System.out.println("InterfaceMemberDeclarationsopt ::="); }  //$NON-NLS-1$
-		    consumeEmptyInterfaceMemberDeclarationsopt();  
-			break;
- 
-     case 636 : if (DEBUG) { System.out.println("InterfaceMemberDeclarationsopt ::= NestedType..."); }  //$NON-NLS-1$
-		    consumeInterfaceMemberDeclarationsopt();  
-			break;
- 
-    case 637 : if (DEBUG) { System.out.println("NestedType ::="); }  //$NON-NLS-1$
-		    consumeNestedType();  
-			break;
-
-     case 638 : if (DEBUG) { System.out.println("ForInitopt ::="); }  //$NON-NLS-1$
-		    consumeEmptyForInitopt();  
-			break;
- 
-     case 640 : if (DEBUG) { System.out.println("ForUpdateopt ::="); }  //$NON-NLS-1$
-		    consumeEmptyForUpdateopt();  
-			break;
- 
-     case 644 : if (DEBUG) { System.out.println("Catchesopt ::="); }  //$NON-NLS-1$
-		    consumeEmptyCatchesopt();  
-			break;
- 
-     case 646 : if (DEBUG) { System.out.println("EnumDeclaration ::= EnumHeader EnumBody"); }  //$NON-NLS-1$
-		    consumeEnumDeclaration();  
-			break;
- 
-     case 647 : if (DEBUG) { System.out.println("EnumHeader ::= EnumHeaderName ClassHeaderImplementsopt"); }  //$NON-NLS-1$
-		    consumeEnumHeader();  
-			break;
- 
-     case 648 : if (DEBUG) { System.out.println("EnumHeaderName ::= Modifiersopt enum Identifier"); }  //$NON-NLS-1$
-		    consumeEnumHeaderName();  
-			break;
- 
-     case 649 : if (DEBUG) { System.out.println("EnumHeaderName ::= Modifiersopt enum Identifier..."); }  //$NON-NLS-1$
-		    consumeEnumHeaderNameWithTypeParameters();  
-			break;
- 
-     case 650 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE EnumBodyDeclarationsopt RBRACE"); }  //$NON-NLS-1$
-		    consumeEnumBodyNoConstants();  
-			break;
- 
-     case 651 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE COMMA EnumBodyDeclarationsopt..."); }  //$NON-NLS-1$
-		    consumeEnumBodyNoConstants();  
-			break;
- 
-     case 652 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE EnumConstants COMMA..."); }  //$NON-NLS-1$
-		    consumeEnumBodyWithConstants();  
-			break;
- 
-     case 653 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE EnumConstants..."); }  //$NON-NLS-1$
-		    consumeEnumBodyWithConstants();  
-			break;
- 
-    case 655 : if (DEBUG) { System.out.println("EnumConstants ::= EnumConstants COMMA EnumConstant"); }  //$NON-NLS-1$
-		    consumeEnumConstants();  
-			break;
- 
-    case 656 : if (DEBUG) { System.out.println("EnumConstantHeaderName ::= Modifiersopt Identifier"); }  //$NON-NLS-1$
-		    consumeEnumConstantHeaderName();  
-			break;
- 
-    case 657 : if (DEBUG) { System.out.println("EnumConstantHeader ::= EnumConstantHeaderName..."); }  //$NON-NLS-1$
-		    consumeEnumConstantHeader();  
-			break;
- 
-    case 658 : if (DEBUG) { System.out.println("EnumConstant ::= EnumConstantHeader ForceNoDiet..."); }  //$NON-NLS-1$
-		    consumeEnumConstantWithClassBody();  
-			break;
- 
-    case 659 : if (DEBUG) { System.out.println("EnumConstant ::= EnumCo