1.8.0.20140409170000 - RC3
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/BuildArgParser.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/BuildArgParser.class
index b16852d..a2d7178 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/BuildArgParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/BuildArgParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/ConfigParser.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/ConfigParser.class
index 70df181..82d7d23 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/ConfigParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/ConfigParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/messages.properties b/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/messages.properties
index c9a2bf4..64ca22c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/messages.properties
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/messages.properties
@@ -5,7 +5,7 @@
      org/aspectj/weaver/XlintDefault.properties for the default behavior and a template to copy. 
 ### AspectJ-specific messages 
 compiler.name = AspectJ Compiler 1.8.0
-compiler.version = Eclipse Compiler BETA_JAVA8_3D6E745, 3.9
+compiler.version = Eclipse Compiler BETA_JAVA8_8661797, 3.9
 compiler.copyright = 
 
 ## this next one superceded by above...
@@ -63,8 +63,9 @@
 \    -1.5 -5 -5.0       use 1.5 compliance (-source 1.5 -target 1.5)\n\
 \    -1.6 -6 -6.0       use 1.6 compliance (-source 1.6 -target 1.6)\n\
 \    -1.7 -7 -7.0       use 1.7 compliance (-source 1.7 -target 1.7)\n\
-\    -source <version>  set source level: 1.3 to 1.7 (or 5, 5.0, etc)\n\
-\    -target <version>  set classfile target: 1.1 to 1.7 (or 5, 5.0, etc)\n\
+\    -1.8 -8 -8.0       use 1.8 compliance (-source 1.8 -target 1.8)\n\
+\    -source <version>  set source level: 1.3 to 1.8 (or 5, 5.0, etc)\n\
+\    -target <version>  set classfile target: 1.1 to 1.8 (or 5, 5.0, etc)\n\
 \ \n\
 \ Warning options:\n\
 \    -deprecation         + deprecation outside deprecated code\n\
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/CompilerAdapter$CompilerAdapter$1.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/CompilerAdapter$CompilerAdapter$1.class
index 5ab3244..6efbdf2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/CompilerAdapter$CompilerAdapter$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/CompilerAdapter$CompilerAdapter$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/CompilerAdapter.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/CompilerAdapter.class
index b65a1dd..ef1ea6e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/CompilerAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/CompilerAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/DefaultCompilerAdapter.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/DefaultCompilerAdapter.class
index c422954..d79f68f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/DefaultCompilerAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/DefaultCompilerAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ICompilerAdapter.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ICompilerAdapter.class
index 9474564..6dfd288 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ICompilerAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ICompilerAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ICompilerAdapterFactory.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ICompilerAdapterFactory.class
index 2885f54..1e5e5ed 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ICompilerAdapterFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ICompilerAdapterFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$10.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$10.class
index b08c715..3f73f5e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$10.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$10.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$13.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$13.class
index b38e7ba..4aa30ac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$13.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$13.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$16.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$16.class
index 705659c..6c5dc8e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$16.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$16.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$4.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$4.class
index 6028975..d9f00f6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.class
index e13f7dd..ac0460b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/InterTypeFieldDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/InterTypeFieldDeclaration.class
index 887b327..3fe5319 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/InterTypeFieldDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/InterTypeFieldDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/Proceed.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/Proceed.class
index 94f6a07..ea4208c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/Proceed.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/ast/Proceed.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/AnonymousClassCreationListener.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/AnonymousClassCreationListener.class
index 365016d..90212e9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/AnonymousClassCreationListener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/AnonymousClassCreationListener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/AnonymousClassPublisher.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/AnonymousClassPublisher.class
index f7b3c39..7abcc48 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/AnonymousClassPublisher.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/AnonymousClassPublisher.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/EclipseFactory.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/EclipseFactory.class
index 6b6a858..84f05a7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/EclipseFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/EclipseFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/OwningClassSupportForFieldBindings.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/OwningClassSupportForFieldBindings.class
index 4cfde38..fa301db 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/OwningClassSupportForFieldBindings.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/OwningClassSupportForFieldBindings.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/OwningClassSupportForMethodBindings.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/OwningClassSupportForMethodBindings.class
index d0085ff..2f239f1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/OwningClassSupportForMethodBindings.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/OwningClassSupportForMethodBindings.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/WarnOnSwallowedException.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/WarnOnSwallowedException.class
index 1ef2861..88fa7b6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/WarnOnSwallowedException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/lookup/WarnOnSwallowedException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/parser/AllowAssertAndEnumAsIdentifierTokensInPointcutExpressions.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/parser/AllowAssertAndEnumAsIdentifierTokensInPointcutExpressions.class
index df19c0d..63358eb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/parser/AllowAssertAndEnumAsIdentifierTokensInPointcutExpressions.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/parser/AllowAssertAndEnumAsIdentifierTokensInPointcutExpressions.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter$MessageIssued.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter$MessageIssued.class
index 80b9ae2..43cdcf3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter$MessageIssued.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter$MessageIssued.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter$PinpointedProblem.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter$PinpointedProblem.class
index 626f130..93c1d01 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter$PinpointedProblem.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter$PinpointedProblem.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.class
index bff45c5..30417bb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig$1.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig$1.class
index 7fb2498..7bbead0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig$BinarySourceFile.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig$BinarySourceFile.class
index ca5080c..bae04c1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig$BinarySourceFile.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig$BinarySourceFile.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.class
index c306bac..fd1df5d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$3.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$3.class
index c1ac451..bc278fc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$4.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$4.class
index a3c5947..69da9d5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$AjBuildContexFormatter.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$AjBuildContexFormatter.class
index c40e678..ec7d496 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$AjBuildContexFormatter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager$AjBuildContexFormatter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager.class
index 5fdc6f3..432f253 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjBuildManager.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$ClassFile$1.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$ClassFile$1.class
index d010870..ac13e39 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$ClassFile$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$ClassFile$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$ClassFile.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$ClassFile.class
index 568b57d..d522b3e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$ClassFile.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$ClassFile.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$SoftHashMap$SoftReferenceKnownKey.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$SoftHashMap$SoftReferenceKnownKey.class
index 3b86047..6c1e548 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$SoftHashMap$SoftReferenceKnownKey.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$SoftHashMap$SoftReferenceKnownKey.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$SoftHashMap.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$SoftHashMap.class
index f3a937c..fdbb0e8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$SoftHashMap.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState$SoftHashMap.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState.class
index 523be26..20ad000 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/AjState.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/CompactTypeStructureRepresentation.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/CompactTypeStructureRepresentation.class
index c28ebae..c6264a6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/CompactTypeStructureRepresentation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/internal/core/builder/CompactTypeStructureRepresentation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/BindingKey.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/BindingKey.class
index 073b27e..13792df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/BindingKey.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/BindingKey.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/BufferChangedEvent.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/BufferChangedEvent.class
index 5417317..4003b48 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/BufferChangedEvent.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/BufferChangedEvent.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathContainerInitializer$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathContainerInitializer$1.class
index 746a41e..a1437a0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathContainerInitializer$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathContainerInitializer$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathContainerInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathContainerInitializer.class
index 05eae86..59c65d8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathContainerInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathContainerInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathVariableInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathVariableInitializer.class
index d615ea0..f4776f8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathVariableInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ClasspathVariableInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionContext.class
index eb5f4c1..ef04b39 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionFlags.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionFlags.class
index fa68a3d..ccbd81c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionFlags.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionFlags.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionProposal.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionProposal.class
index a761abb..ef2b914 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionProposal.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionProposal.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionRequestor.class
index c64f07e..3e546bd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionRequestorAdapter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionRequestorAdapter.class
index c0eb84e..a03ee78 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionRequestorAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CompletionRequestorAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CorrectionEngine$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CorrectionEngine$1.class
index 8709ae0..2ef1c33 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CorrectionEngine$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CorrectionEngine$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CorrectionEngine.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CorrectionEngine.class
index d6b3adb..96ab977 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CorrectionEngine.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/CorrectionEngine.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ElementChangedEvent.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ElementChangedEvent.class
index 8c79645..1715c8d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ElementChangedEvent.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ElementChangedEvent.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/Flags.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/Flags.class
index bb3b900..53aba15 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/Flags.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/Flags.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAccessRule.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAccessRule.class
index be4ff08..852c01b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAccessRule.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAccessRule.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAnnotatable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAnnotatable.class
index 85b1c54..01f3b56 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAnnotatable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAnnotatable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAnnotation.class
index 16e226a..10bf4b5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBuffer$ITextEditCapability.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBuffer$ITextEditCapability.class
index 068a500..bf25c46 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBuffer$ITextEditCapability.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBuffer$ITextEditCapability.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBuffer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBuffer.class
index 538c0ea..d23a705 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBuffer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBuffer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBufferChangedListener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBufferChangedListener.class
index 746028d..dfd7ebb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBufferChangedListener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBufferChangedListener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBufferFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBufferFactory.class
index 93eb718..f536b43 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBufferFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IBufferFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClassFile.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClassFile.class
index 760bc7a..fa55497 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClassFile.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClassFile.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathAttribute.class
index f685ddf..487fd3c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathContainer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathContainer.class
index 7442f77..36ec52a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathContainer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathContainer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathEntry.class
index f843527..88491fc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IClasspathEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeAssist.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeAssist.class
index 9b37249..a9a7d2c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeAssist.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeAssist.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeCompletionRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeCompletionRequestor.class
index 24c2be1..40ece78 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeCompletionRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeCompletionRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeFormatter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeFormatter.class
index 057a73d..8cc64f6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeFormatter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICodeFormatter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICompilationUnit.class
index bf81113..dd2d0af 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICompletionRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICompletionRequestor.class
index 875a41b..f35e792 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICompletionRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICompletionRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICorrectionRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICorrectionRequestor.class
index 5731134..8e3e69d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICorrectionRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ICorrectionRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IElementChangedListener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IElementChangedListener.class
index 0f7a119..2a25880 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IElementChangedListener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IElementChangedListener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IField.class
index 7abc87e..310fbe1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IImportContainer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IImportContainer.class
index 8265ba8..55de73e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IImportContainer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IImportContainer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IImportDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IImportDeclaration.class
index f777457..5904a16 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IImportDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IImportDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IInitializer.class
index 0d12149..89f28d5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJarEntryResource.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJarEntryResource.class
index d819903..616cab6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJarEntryResource.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJarEntryResource.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaElement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaElement.class
index 41ded46..8311fdb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaElement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaElement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaElementDelta.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaElementDelta.class
index edafc29..a3fa451 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaElementDelta.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaElementDelta.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModel.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModel.class
index daef488..b2aa830 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModel.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModel.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelMarker.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelMarker.class
index 508f7cc..3bc4b58 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelMarker.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelMarker.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelStatus.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelStatus.class
index 762c90b..c62ce59 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelStatus.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelStatus.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelStatusConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelStatusConstants.class
index 6c67728..9b9a1de 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelStatusConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaModelStatusConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaProject.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaProject.class
index 70fe1f6..3f71aef 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaProject.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IJavaProject.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ILocalVariable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ILocalVariable.class
index 950bd83..f3c848d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ILocalVariable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ILocalVariable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMember.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMember.class
index 5c08e95..754fe21 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMember.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMember.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMemberValuePair.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMemberValuePair.class
index 3c9581b..ec3624d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMemberValuePair.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMemberValuePair.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMethod.class
index 147b3d0..42da605 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IOpenable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IOpenable.class
index edd5179..b03b3b3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IOpenable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IOpenable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageDeclaration.class
index ef3745b..1855f38 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageFragment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageFragment.class
index 4a85dad..33205f2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageFragment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageFragment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageFragmentRoot.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageFragmentRoot.class
index 7ab6db6..c316b80 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageFragmentRoot.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IPackageFragmentRoot.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IParent.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IParent.class
index 7f1d725..20bbaac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IParent.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IParent.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IProblemRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IProblemRequestor.class
index e0c7ccd..546a881 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IProblemRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IProblemRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IRegion.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IRegion.class
index da26858..9b9f63a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IRegion.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IRegion.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceManipulation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceManipulation.class
index 606e816..12d12ec 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceManipulation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceManipulation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceRange.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceRange.class
index 3565a21..2af4a00 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceRange.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceRange.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceReference.class
index 571a045..96d7118 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ISourceReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IType.class
index ff86315..1eae03d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeHierarchy.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeHierarchy.class
index 45a9797..cac654f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeHierarchy.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeHierarchy.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeHierarchyChangedListener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeHierarchyChangedListener.class
index a7de870..63b56df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeHierarchyChangedListener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeHierarchyChangedListener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeParameter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeParameter.class
index b00d8a0..05ee37a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeParameter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeParameter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeRoot.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeRoot.class
index 2c2aad1..807dce1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeRoot.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ITypeRoot.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IWorkingCopy.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IWorkingCopy.class
index 48e0762..a7e156e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IWorkingCopy.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/IWorkingCopy.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaConventions.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaConventions.class
index 02c92bf..4a2a467 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaConventions.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaConventions.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore$1.class
index 59886ea..a3d6c6a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore$2.class
index 75706fc..acd6cc2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore.class
index 1ec60f6..60b99cd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaCore.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaModelException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaModelException.class
index a30ad9d..67ffa14 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaModelException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/JavaModelException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/NamingConventions$NamingRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/NamingConventions$NamingRequestor.class
index d513a23..124464d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/NamingConventions$NamingRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/NamingConventions$NamingRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/NamingConventions.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/NamingConventions.class
index 16273bc..0fef36a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/NamingConventions.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/NamingConventions.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/Signature.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/Signature.class
index d01598d..9c8c2d8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/Signature.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/Signature.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/SourceRange.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/SourceRange.class
index e342385..d4f7967 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/SourceRange.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/SourceRange.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ToolFactory$1DeprecatedDisassembler.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ToolFactory$1DeprecatedDisassembler.class
index c62b3ac..31e3c02 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ToolFactory$1DeprecatedDisassembler.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ToolFactory$1DeprecatedDisassembler.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ToolFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ToolFactory.class
index 47ce72a..176e380 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ToolFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/ToolFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/WorkingCopyOwner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/WorkingCopyOwner.class
index 607e076..8b51c5a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/WorkingCopyOwner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/WorkingCopyOwner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/BuildContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/BuildContext.class
index 30ed7e2..f11e587 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/BuildContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/BuildContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CategorizedProblem.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CategorizedProblem.class
index 691e41d..3f608e9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CategorizedProblem.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CategorizedProblem.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CharOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CharOperation.class
index 82fe34d..2b2c3ec 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CharOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CharOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CompilationParticipant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CompilationParticipant.class
index ee6ff7d..bfe064d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CompilationParticipant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CompilationParticipant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CompilationProgress.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CompilationProgress.class
index 3844167..51306ef 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CompilationProgress.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/CompilationProgress.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/IProblem.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/IProblem.class
index 6b3d515..2c44ffe 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/IProblem.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/IProblem.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/IScanner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/IScanner.class
index 6c7066d..67a67b5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/IScanner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/IScanner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/ITerminalSymbols.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/ITerminalSymbols.class
index 71a1c20..910c15b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/ITerminalSymbols.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/ITerminalSymbols.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/InvalidInputException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/InvalidInputException.class
index 0fba22a..64bb017 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/InvalidInputException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/InvalidInputException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/ReconcileContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/ReconcileContext.class
index 023f0d5..30632df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/ReconcileContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/ReconcileContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/batch/BatchCompiler.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/batch/BatchCompiler.class
index ab01cc4..a9fd76e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/batch/BatchCompiler.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/compiler/batch/BatchCompiler.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AST.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AST.class
index 86146d3..512ab82 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AST.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AST.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter$IASTConverterFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter$IASTConverterFactory.class
index 7d5ab55..ae49a38 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter$IASTConverterFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter$IASTConverterFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter.class
index 00b67a3..a6bbb65 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTMatcher.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTMatcher.class
index 85037bc..24c73c5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTMatcher.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTMatcher.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode$NodeList$Cursor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode$NodeList$Cursor.class
index b0b7d56..327c32e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode$NodeList$Cursor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode$NodeList$Cursor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode$NodeList.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode$NodeList.class
index 76a5625..c3735dd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode$NodeList.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode$NodeList.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode.class
index cfe0163..f33aa7b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTNode.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTParser$IASTFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTParser$IASTFactory.class
index 0036ee3..a004523 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTParser$IASTFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTParser$IASTFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTParser.class
index cb2bd05..a529d07 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTRecoveryPropagator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTRecoveryPropagator.class
index 8c65a85..5d67877 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTRecoveryPropagator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTRecoveryPropagator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTRequestor.class
index f2ca94a..baa0e7d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTSyntaxErrorPropagator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTSyntaxErrorPropagator.class
index 6dd60d7..1320ad7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTSyntaxErrorPropagator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTSyntaxErrorPropagator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTVisitor.class
index 1349b8a..fa40dd9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ASTVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.class
index b267c42..d4b9de8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AjASTConverter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AjASTConverter.class
index ef410b4..8f2159b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AjASTConverter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AjASTConverter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotatableType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotatableType.class
index 199a0d6..ae547de 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotatableType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotatableType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Annotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Annotation.class
index 32e689e..4f7668e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Annotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Annotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationBinding.class
index a52913d..6958ff0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.class
index 2d45a86..fff5819 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.class
index 22af768..d36af13 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.class
index eef38fb..9b09954 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayAccess.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayAccess.class
index 789a3cb..9d2f8c5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayAccess.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayAccess.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayCreation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayCreation.class
index a15b943..17bc833 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayCreation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayCreation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayInitializer.class
index 48eaa81..d69e01a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayType.class
index 52d365a..f64193f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ArrayType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AssertStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AssertStatement.class
index a9fd5ed..01b4898 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AssertStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/AssertStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Assignment$Operator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Assignment$Operator.class
index 0a03a52..542534c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Assignment$Operator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Assignment$Operator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Assignment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Assignment.class
index 1a65e6e..c859b7c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Assignment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Assignment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BindingComparator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BindingComparator.class
index 3871d5d..2e77e8f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BindingComparator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BindingComparator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BindingResolver.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BindingResolver.class
index 55419bb..f5e0b59 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BindingResolver.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BindingResolver.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Block.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Block.class
index 6e17a08..8c94f5a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Block.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Block.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BlockComment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BlockComment.class
index ab0cd5b..56b91c0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BlockComment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BlockComment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BodyDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BodyDeclaration.class
index 78a7cbb..b768615 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BodyDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BodyDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BooleanLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BooleanLiteral.class
index 8a18bad..7b559eb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BooleanLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BooleanLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BreakStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BreakStatement.class
index 35f2625..f9ac6cc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BreakStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/BreakStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CastExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CastExpression.class
index fa64db9..4d4b6ae 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CastExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CastExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CatchClause.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CatchClause.class
index cbf2c58..0df0f80 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CatchClause.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CatchClause.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CharacterLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CharacterLiteral.class
index 7453410..b5d7d0c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CharacterLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CharacterLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ChildListPropertyDescriptor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ChildListPropertyDescriptor.class
index 473b30f..7222454 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ChildListPropertyDescriptor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ChildListPropertyDescriptor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ChildPropertyDescriptor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ChildPropertyDescriptor.class
index 3932ccb..22b9d99 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ChildPropertyDescriptor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ChildPropertyDescriptor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ClassInstanceCreation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ClassInstanceCreation.class
index c3d79ca..6653474 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ClassInstanceCreation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ClassInstanceCreation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Comment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Comment.class
index fa1d152..0d60710 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Comment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Comment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnit.class
index 9f9afd0..32148c3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$1.class
index ef75076..13466cd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$1Requestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$1Requestor.class
index 1bc1742..ae0d9b7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$1Requestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$1Requestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$2.class
index e09a42a..8595b61 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$IntArrayList.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$IntArrayList.class
index 381d26b..2af8ee4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$IntArrayList.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver$IntArrayList.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver.class
index 42660a4..3f0ebd1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ConditionalExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ConditionalExpression.class
index 40a65ad..06e954b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ConditionalExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ConditionalExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ConstructorInvocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ConstructorInvocation.class
index 33a9fc8..df26e68 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ConstructorInvocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ConstructorInvocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ContinueStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ContinueStatement.class
index 556c389..a9e489c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ContinueStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ContinueStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CreationReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CreationReference.class
index d169acb..5d2b8ac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CreationReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/CreationReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultASTVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultASTVisitor.class
index d564c4d..6a7e6ff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultASTVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultASTVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver$1.class
index 17c3a06..f116df6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver$BindingTables.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver$BindingTables.class
index 989d3d6..f02d9af 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver$BindingTables.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver$BindingTables.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver.class
index 3226625..e0501fc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultCommentMapper$CommentMapperVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultCommentMapper$CommentMapperVisitor.class
index a9fcb8d..e7f794d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultCommentMapper$CommentMapperVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultCommentMapper$CommentMapperVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultCommentMapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultCommentMapper.class
index b4cfba2..d8ee103 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultCommentMapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultCommentMapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultValuePairBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultValuePairBinding.class
index 75f2b36..8aabc54 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultValuePairBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DefaultValuePairBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Dimension.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Dimension.class
new file mode 100644
index 0000000..fa438a0
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Dimension.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DoStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DoStatement.class
index e4d5745..5bc3e5f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DoStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DoStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DocCommentParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DocCommentParser.class
index b1eacf7..9630aca 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DocCommentParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/DocCommentParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EmptyStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EmptyStatement.class
index d9e2ab8..19c73a3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EmptyStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EmptyStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnhancedForStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnhancedForStatement.class
index c0100fb..e703f0c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnhancedForStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnhancedForStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnumConstantDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnumConstantDeclaration.class
index 294c50e..9f851b2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnumConstantDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnumConstantDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnumDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnumDeclaration.class
index 04031d2..0d1c0b5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnumDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/EnumDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Expression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Expression.class
index 9b73c2a..11d8640 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Expression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Expression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExpressionMethodReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExpressionMethodReference.class
index 2cd160c..9c00a69 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExpressionMethodReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExpressionMethodReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExpressionStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExpressionStatement.class
index 45d5d2d..45d2bb0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExpressionStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExpressionStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExtraDimension.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExtraDimension.class
deleted file mode 100644
index 2fd4cf0..0000000
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ExtraDimension.class
+++ /dev/null
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FieldAccess.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FieldAccess.class
index bad20f4..b229fd7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FieldAccess.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FieldAccess.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FieldDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FieldDeclaration.class
index 15669b0..db1270d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FieldDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FieldDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FileASTRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FileASTRequestor.class
index 2c3b806..f23fadb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FileASTRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/FileASTRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ForStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ForStatement.class
index 9688240..0338711 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ForStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ForStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IAnnotationBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IAnnotationBinding.class
index f8bfcbc..e017c8d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IAnnotationBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IAnnotationBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IBinding.class
index b34feae..9dee364 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IDocElement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IDocElement.class
index 5f7f653..baea2b7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IDocElement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IDocElement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IExtendedModifier.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IExtendedModifier.class
index 56ba60d..401173e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IExtendedModifier.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IExtendedModifier.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IMemberValuePairBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IMemberValuePairBinding.class
index 6fd6489..ce16927 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IMemberValuePairBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IMemberValuePairBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IMethodBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IMethodBinding.class
index a4eea4f..e434cac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IMethodBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IMethodBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IPackageBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IPackageBinding.class
index f54aba9..398346d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IPackageBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IPackageBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ITypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ITypeBinding.class
index 73a608e..94e8f18 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ITypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ITypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IVariableBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IVariableBinding.class
index 2d5b915..a80375a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IVariableBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IVariableBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IfStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IfStatement.class
index 5ccb285..9cbdba7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IfStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IfStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ImportDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ImportDeclaration.class
index 75e7c2c..9fe89da 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ImportDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ImportDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression$Operator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression$Operator.class
index b369158..8c1ee74 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression$Operator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression$Operator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression.class
index b6bcf82..ea1749c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Initializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Initializer.class
index e547a6d..b3a4fa9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Initializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Initializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InstanceofExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InstanceofExpression.class
index 5a5b233..f30949d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InstanceofExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InstanceofExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite$1.class
index 35b008f..38ce5c0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite.class
index be29843..6ae651f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IntersectionType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IntersectionType.class
index 6741565..fba86cb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IntersectionType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/IntersectionType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Javadoc.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Javadoc.class
index 64cc52a..eccd04b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Javadoc.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Javadoc.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LabeledStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LabeledStatement.class
index e03d5fa..ce02536 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LabeledStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LabeledStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LambdaExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LambdaExpression.class
index 922acb4..0857a03 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LambdaExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LambdaExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LineComment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LineComment.class
index cfc2d85..d8af2fe 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LineComment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/LineComment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MarkerAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MarkerAnnotation.class
index 9d19fc3..c22e561 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MarkerAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MarkerAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberRef.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberRef.class
index 3c16717..431e893 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberRef.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberRef.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePair.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePair.class
index 6c5e36e..22aa923 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePair.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePair.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePairBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePairBinding.class
index da00bfa..3f46c91 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePairBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePairBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Message.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Message.class
index 477493b..58814fd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Message.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Message.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodBinding.class
index dad6949..1675cc5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodDeclaration.class
index b729bdf..e3632c4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodInvocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodInvocation.class
index 6cec0d6..a3f9285 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodInvocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodInvocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodRef.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodRef.class
index 92eb18f..fe6c57d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodRef.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodRef.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodRefParameter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodRefParameter.class
index 6ed7412..54ca9bf 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodRefParameter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodRefParameter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodReference.class
index c7443d7..577d682 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/MethodReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Modifier$ModifierKeyword.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Modifier$ModifierKeyword.class
index 04a4316..52c9c74 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Modifier$ModifierKeyword.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Modifier$ModifierKeyword.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Modifier.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Modifier.class
index ce0b7ad..eaca496 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Modifier.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Modifier.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Name.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Name.class
index 16a86a6..b0a14c7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Name.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Name.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NameEnvironmentWithProgress.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NameEnvironmentWithProgress.class
index 08b7f77..abfa117 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NameEnvironmentWithProgress.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NameEnvironmentWithProgress.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NameQualifiedType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NameQualifiedType.class
new file mode 100644
index 0000000..b4d9e7a
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NameQualifiedType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeEventHandler.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeEventHandler.class
index a782bda..0be4e06 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeEventHandler.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeEventHandler.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder$NodeFinderVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder$NodeFinderVisitor.class
index 22e6847..16a9955 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder$NodeFinderVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder$NodeFinderVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder.class
index 045b713..8e85c34 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeSearcher.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeSearcher.class
index 1d77b7a..e99ddc9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeSearcher.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NodeSearcher.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NormalAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NormalAnnotation.class
index a5a0e85..0207fff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NormalAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NormalAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NullLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NullLiteral.class
index 6a7970d..b37c65d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NullLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NullLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NumberLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NumberLiteral.class
index ce0c16d..2d22538 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NumberLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/NumberLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageBinding.class
index 99407f8..9edac54 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageDeclaration.class
index 521bbca..c29e1c6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageQualifiedType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageQualifiedType.class
deleted file mode 100644
index 04f4511..0000000
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PackageQualifiedType.class
+++ /dev/null
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ParameterizedType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ParameterizedType.class
index 353dca4..08ce015 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ParameterizedType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ParameterizedType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ParenthesizedExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ParenthesizedExpression.class
index b28fcd8..63f230d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ParenthesizedExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ParenthesizedExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression$Operator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression$Operator.class
index e602bd1..7fbc6fa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression$Operator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression$Operator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression.class
index 19328af..73759d7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression$Operator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression$Operator.class
index 1c6b9c9..0d2ac6a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression$Operator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression$Operator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression.class
index b54e71e..a53cea4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType$Code.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType$Code.class
index 2d11427..43b1ff5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType$Code.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType$Code.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType.class
index a1b1f16..d9c4d40 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/QualifiedName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/QualifiedName.class
index af818aa..f125bee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/QualifiedName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/QualifiedName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/QualifiedType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/QualifiedType.class
index 6c26d60..c648100 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/QualifiedType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/QualifiedType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/RecoveredTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/RecoveredTypeBinding.class
index 3f85fd7..94b051a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/RecoveredTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/RecoveredTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/RecoveredVariableBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/RecoveredVariableBinding.class
index 7224184..c48d0a7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/RecoveredVariableBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/RecoveredVariableBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ReturnStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ReturnStatement.class
index f341d5e..82ea835 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ReturnStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ReturnStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimpleName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimpleName.class
index 1a7e229..97437e0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimpleName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimpleName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimplePropertyDescriptor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimplePropertyDescriptor.class
index 1fc010d..62d28e9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimplePropertyDescriptor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimplePropertyDescriptor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimpleType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimpleType.class
index e57c820..9d44bf2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimpleType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SimpleType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SingleMemberAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SingleMemberAnnotation.class
index c1be79f..c635aff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SingleMemberAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SingleMemberAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SingleVariableDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SingleVariableDeclaration.class
index 42f080f..349be43 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SingleVariableDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SingleVariableDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Statement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Statement.class
index 69d4cb8..4731258 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Statement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Statement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/StringLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/StringLiteral.class
index b7a9054..49beb8d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/StringLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/StringLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/StructuralPropertyDescriptor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/StructuralPropertyDescriptor.class
index 2c17a88..10c25c9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/StructuralPropertyDescriptor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/StructuralPropertyDescriptor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperConstructorInvocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperConstructorInvocation.class
index dcb00ea..99942cb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperConstructorInvocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperConstructorInvocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperFieldAccess.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperFieldAccess.class
index 59b433c..222cb75 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperFieldAccess.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperFieldAccess.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodInvocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodInvocation.class
index 19ade56..a12e67d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodInvocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodInvocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodReference.class
index 782fa37..ef87d20 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SwitchCase.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SwitchCase.class
index b02890e..51e0ddb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SwitchCase.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SwitchCase.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SwitchStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SwitchStatement.class
index e760445..1b4a125 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SwitchStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SwitchStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SynchronizedStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SynchronizedStatement.class
index 9775d0b..e329ebd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SynchronizedStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/SynchronizedStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TagElement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TagElement.class
index 1a2f090..d61e5c4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TagElement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TagElement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TextElement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TextElement.class
index 7afb125..a5809de 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TextElement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TextElement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ThisExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ThisExpression.class
index e175280..c1763ae 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ThisExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ThisExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ThrowStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ThrowStatement.class
index 113e984..7da4275 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ThrowStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/ThrowStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TryStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TryStatement.class
index f83c415..5bac8a2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TryStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TryStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Type.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Type.class
index 5495caa..4207801 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Type.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/Type.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeBinding.class
index de2fedd..4202b6f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration$ITypeDeclFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration$ITypeDeclFactory.class
index eeb1870..724bd54 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration$ITypeDeclFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration$ITypeDeclFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration.class
index 19b875f..c9beb01 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclarationStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclarationStatement.class
index f7243fb..3f44520 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclarationStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclarationStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeLiteral.class
index 6920ce2..58f0c1b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeMethodReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeMethodReference.class
index 8060d5b..d8b3af0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeMethodReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeMethodReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeParameter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeParameter.class
index 6418fff..6c598b0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeParameter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/TypeParameter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/UnionType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/UnionType.class
index 396ceee..bab5b87 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/UnionType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/UnionType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableBinding.class
index 44ed0d0..c4b38fd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclaration.class
index 5e2d737..49599c6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationExpression.class
index 1aa5f1f..2544b60 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationFragment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationFragment.class
index 503e24f..e1b1a37 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationFragment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationFragment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationStatement.class
index 6797d14..6234235 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/WhileStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/WhileStatement.class
index 53ad6f0..b017e47 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/WhileStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/WhileStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/WildcardType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/WildcardType.class
index 31a109e..922dcad 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/WildcardType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/WildcardType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.class
index 98fda65..02ebd33 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ITrackedNodePosition.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ITrackedNodePosition.class
index a24421a..78d387a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ITrackedNodePosition.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ITrackedNodePosition.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite$1.class
index 80cd254..44ee4eb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite$ImportRewriteContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite$ImportRewriteContext.class
index 6c0985f..dc33381 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite$ImportRewriteContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite$ImportRewriteContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.class
index 39f2eff..dd6a6a7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ListRewrite.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ListRewrite.class
index 1009b5b..df8c2bc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ListRewrite.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ListRewrite.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/TargetSourceRangeComputer$SourceRange.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/TargetSourceRangeComputer$SourceRange.class
index d7ed082..32c901d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/TargetSourceRangeComputer$SourceRange.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/TargetSourceRangeComputer$SourceRange.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/TargetSourceRangeComputer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/TargetSourceRangeComputer.class
index e5a9520..852287d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/TargetSourceRangeComputer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/dom/rewrite/TargetSourceRangeComputer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/ICodeSnippetRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/ICodeSnippetRequestor.class
index 6390aad..517dd5d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/ICodeSnippetRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/ICodeSnippetRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/IEvaluationContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/IEvaluationContext.class
index 99ada4b..13d66d3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/IEvaluationContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/IEvaluationContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/IGlobalVariable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/IGlobalVariable.class
index d023e7d..44e47e0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/IGlobalVariable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/eval/IGlobalVariable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatter.class
index bdc883c..4a31c06 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication$Messages.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication$Messages.class
index 1b4577d..2ea67a5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication$Messages.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication$Messages.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication.class
index 16d722b..cb34254 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.class
index 12307e2..ca5d395 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/IndentManipulation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/IndentManipulation.class
index d86cf87..f87591c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/IndentManipulation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/formatter/IndentManipulation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexer.class
index 0cc84ce..9ba2f2f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication$Messages.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication$Messages.class
index ac2e7b8..e899d3a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication$Messages.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication$Messages.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication.class
index eff2c70..999bcc2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/DOMException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/DOMException.class
index 4016324..1293f20 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/DOMException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/DOMException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/DOMFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/DOMFactory.class
index 1326474..30750c0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/DOMFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/DOMFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMCompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMCompilationUnit.class
index 8e383ea..ddbf357 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMCompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMCompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMFactory.class
index c391050..0ee18d2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMField.class
index e14fcac..989c9ff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMImport.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMImport.class
index 1934827..40d6112 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMImport.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMImport.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMInitializer.class
index 581a36e..65aa851 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMMember.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMMember.class
index f9c3b85..e5c59c8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMMember.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMMember.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMMethod.class
index 4816d6b..e744132 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMNode.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMNode.class
index a8b5c95..56967a5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMNode.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMNode.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMPackage.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMPackage.class
index 83c9c3d..73e1c33 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMPackage.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMPackage.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMType.class
index 0f29adb..b048ff0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/jdom/IDOMType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/FieldDeclarationMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/FieldDeclarationMatch.class
index 3420703..6e33c01 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/FieldDeclarationMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/FieldDeclarationMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/FieldReferenceMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/FieldReferenceMatch.class
index d56c3f8..7c2c57e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/FieldReferenceMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/FieldReferenceMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchConstants.class
index be14f9c..0a0a216 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchResultCollector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchResultCollector.class
index 920406f..b4a4781 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchResultCollector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchResultCollector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchScope.class
index 12a18c7..2126f63 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/IJavaSearchScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ISearchPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ISearchPattern.class
index 1f42879..eb31dba 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ISearchPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ISearchPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ITypeNameRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ITypeNameRequestor.class
index cbc81ce..2f56236 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ITypeNameRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ITypeNameRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/LocalVariableDeclarationMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/LocalVariableDeclarationMatch.class
index 89e8388..e232551 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/LocalVariableDeclarationMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/LocalVariableDeclarationMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/LocalVariableReferenceMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/LocalVariableReferenceMatch.class
index afebf6b..5132e12 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/LocalVariableReferenceMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/LocalVariableReferenceMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/MethodDeclarationMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/MethodDeclarationMatch.class
index 9a64a17..669f247 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/MethodDeclarationMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/MethodDeclarationMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/MethodReferenceMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/MethodReferenceMatch.class
index 8b13f36..cd7e4c6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/MethodReferenceMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/MethodReferenceMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/PackageDeclarationMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/PackageDeclarationMatch.class
index 061dd89..c89abd7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/PackageDeclarationMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/PackageDeclarationMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/PackageReferenceMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/PackageReferenceMatch.class
index 95e3cb3..d1bfb7b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/PackageReferenceMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/PackageReferenceMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ReferenceMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ReferenceMatch.class
index 68f754c..a091459 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ReferenceMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/ReferenceMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchDocument.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchDocument.class
index 4816436..542c9ed 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchDocument.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchDocument.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$ResultCollectorAdapter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$ResultCollectorAdapter.class
index bce4179..b5888aa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$ResultCollectorAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$ResultCollectorAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$SearchPatternAdapter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$SearchPatternAdapter.class
index 4969e87..5c8982e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$SearchPatternAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$SearchPatternAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$TypeNameRequestorAdapter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$TypeNameRequestorAdapter.class
index 814e4ac..ed0cc22 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$TypeNameRequestorAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine$TypeNameRequestorAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine.class
index e18544d..7fd2da6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchEngine.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchMatch.class
index 4694223..63a7653 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchParticipant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchParticipant.class
index 5d9a596..11c428b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchParticipant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchParticipant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchPattern.class
index 5bfe360..a54281e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchRequestor.class
index f2394f4..205ace5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/SearchRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeDeclarationMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeDeclarationMatch.class
index b0b73dc..3ffb3ed 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeDeclarationMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeDeclarationMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameMatch.class
index c5d1010..e722ac2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameMatchRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameMatchRequestor.class
index b9bcbe3..a18fd89 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameMatchRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameMatchRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameRequestor.class
index 4719ea1..78b8133 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeNameRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeParameterDeclarationMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeParameterDeclarationMatch.class
index af13847..a132d4d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeParameterDeclarationMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeParameterDeclarationMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeParameterReferenceMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeParameterReferenceMatch.class
index ccdcefb..e6a5232 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeParameterReferenceMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeParameterReferenceMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeReferenceMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeReferenceMatch.class
index a19106c..ec121df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeReferenceMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/search/TypeReferenceMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ByteCodeVisitorAdapter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ByteCodeVisitorAdapter.class
index 29da665..bb0629c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ByteCodeVisitorAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ByteCodeVisitorAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ClassFileBytesDisassembler.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ClassFileBytesDisassembler.class
index be8297b..cb802bd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ClassFileBytesDisassembler.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ClassFileBytesDisassembler.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ClassFormatException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ClassFormatException.class
index 174ed36..7e149d7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ClassFormatException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ClassFormatException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/CompilationUnitSorter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/CompilationUnitSorter.class
index b9a2a25..999b834 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/CompilationUnitSorter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/CompilationUnitSorter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotation.class
index b3794a7..7a778fb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationComponent.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationComponent.class
index 257ccac..ff625ab 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationComponent.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationComponent.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationComponentValue.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationComponentValue.class
index ca06fee..516d8a5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationComponentValue.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationComponentValue.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationDefaultAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationDefaultAttribute.class
index 8f6c021..928ada3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationDefaultAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAnnotationDefaultAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAttributeNamesConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAttributeNamesConstants.class
index 543cce4..23464fd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAttributeNamesConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IAttributeNamesConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBootstrapMethodsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBootstrapMethodsAttribute.class
index 88ed506..2ee5300 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBootstrapMethodsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBootstrapMethodsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBootstrapMethodsEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBootstrapMethodsEntry.class
index 207ae60..f754c5d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBootstrapMethodsEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBootstrapMethodsEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBytecodeVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBytecodeVisitor.class
index 91b2a0d..20e35cc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBytecodeVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IBytecodeVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileAttribute.class
index 49c327d..930d8c2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileDisassembler.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileDisassembler.class
index 245a1ae..73a3a5f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileDisassembler.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileDisassembler.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileReader.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileReader.class
index fb03b03..2b865a6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileReader.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IClassFileReader.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ICodeAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ICodeAttribute.class
index 293ca72..74707b2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ICodeAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ICodeAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPool.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPool.class
index 36683d9..b5de032 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPool.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPool.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolConstant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolConstant.class
index fc8387e..082afc9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolConstant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolConstant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolEntry.class
index f0dba94..b8fb663 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolEntry2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolEntry2.class
index dbd6e7d..d64acd5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolEntry2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantPoolEntry2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantValueAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantValueAttribute.class
index 978432e..c6e943d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantValueAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IConstantValueAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IEnclosingMethodAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IEnclosingMethodAttribute.class
index 224b14a..aeb4de3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IEnclosingMethodAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IEnclosingMethodAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExceptionAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExceptionAttribute.class
index b4b8ae2..4407cee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExceptionAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExceptionAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExceptionTableEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExceptionTableEntry.class
index 446463d..59bb7fa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExceptionTableEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExceptionTableEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotation.class
index 27df8c4..dc98081 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotationConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotationConstants.class
index e84ff3d..173e700 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotationConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotationConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IFieldInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IFieldInfo.class
index 4e995c6..94ec012 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IFieldInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IFieldInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IInnerClassesAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IInnerClassesAttribute.class
index 2c293a4..ab7040d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IInnerClassesAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IInnerClassesAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IInnerClassesAttributeEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IInnerClassesAttributeEntry.class
index 6dd72fd..41b2ac4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IInnerClassesAttributeEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IInnerClassesAttributeEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILineNumberAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILineNumberAttribute.class
index 5803bf2..863d50e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILineNumberAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILineNumberAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableAttribute.class
index 32ead02..86d4b21 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableReferenceInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableReferenceInfo.class
index 75b6fbd..86568cf 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableReferenceInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableReferenceInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTableEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTableEntry.class
index 1b5ace3..ee15737 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTableEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTableEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTypeTableAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTypeTableAttribute.class
index 5405dbe..6b91273 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTypeTableAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTypeTableAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTypeTableEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTypeTableEntry.class
index e2f60d2..bb649aa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTypeTableEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableTypeTableEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IMethodInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IMethodInfo.class
index 26818d3..4fb666e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IMethodInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IMethodInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IMethodParametersAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IMethodParametersAttribute.class
new file mode 100644
index 0000000..6da96ed
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IMethodParametersAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IModifierConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IModifierConstants.class
index ee69481..aaf3095 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IModifierConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IModifierConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IOpcodeMnemonics.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IOpcodeMnemonics.class
index a28f6a0..229af32 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IOpcodeMnemonics.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IOpcodeMnemonics.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IParameterAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IParameterAnnotation.class
index 76a6751..0d29e30 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IParameterAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IParameterAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleAnnotationsAttribute.class
index 8e4b25f..354d446 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleParameterAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleParameterAnnotationsAttribute.class
index f8d488a..f5b9e9b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleParameterAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleParameterAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleTypeAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleTypeAnnotationsAttribute.class
index 7903c84..97f81ff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleTypeAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleTypeAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleAnnotationsAttribute.class
index 84f6c0c..7c2c5f0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleParameterAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleParameterAnnotationsAttribute.class
index 62c5a59..0e35da1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleParameterAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleParameterAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleTypeAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleTypeAnnotationsAttribute.class
index b37a4cc..db7fe23 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleTypeAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleTypeAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ISignatureAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ISignatureAttribute.class
index 63be0d3..10c5316 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ISignatureAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ISignatureAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ISourceAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ISourceAttribute.class
index b54d051..2a9813c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ISourceAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/ISourceAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapAttribute.class
index 7a68f73..6b96fe2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapFrame.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapFrame.class
index ae5b43b..cac303e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapFrame.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapFrame.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapTableAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapTableAttribute.class
index a43dd26..2dfef8d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapTableAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IStackMapTableAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IVerificationTypeInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IVerificationTypeInfo.class
index 4efd37d..fa35e6e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IVerificationTypeInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/IVerificationTypeInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/OpcodeStringValues.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/OpcodeStringValues.class
index acef554..88e340d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/OpcodeStringValues.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/core/util/OpcodeStringValues.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionElementNotifier.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionElementNotifier.class
index efbc994..6a2f45e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionElementNotifier.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionElementNotifier.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$1.class
index aed732b..c5ae761 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$10.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$10.class
index 0b623a2..1b1a944 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$10.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$10.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$2.class
index fe08518..7ff3214 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$3.class
index ffa5833..01fd1ee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$4.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$4.class
index 8db6e59..45311ea 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$5.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$5.class
index 90b1dda..8f4e9d5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$5.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$5.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$6.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$6.class
index 92c67ac..b7cbe82 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$6.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$6.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$7.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$7.class
index e516be3..4fd74b0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$7.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$7.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$8.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$8.class
index 8895631..6731506 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$8.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$8.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$9.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$9.class
index a20a08b..012cb02 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$9.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$9.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$AcceptedConstructor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$AcceptedConstructor.class
index 2128035..78ce18e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$AcceptedConstructor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$AcceptedConstructor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$AcceptedType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$AcceptedType.class
index cfa0f28..101b999 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$AcceptedType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$AcceptedType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$CompletionProblemFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$CompletionProblemFactory.class
index 2b7a51f..deb1ec7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$CompletionProblemFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine$CompletionProblemFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine.class
index 743cafd..57fdc49 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionRequestorWrapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionRequestorWrapper.class
index 7809af5..3db251f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionRequestorWrapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionRequestorWrapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.class
index ed85ea9..1da95dd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/IExtendedCompletionRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/IExtendedCompletionRequestor.class
index 4008d98..0c66a25 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/IExtendedCompletionRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/IExtendedCompletionRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ISearchRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ISearchRequestor.class
index c0c25d7..9552fbd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ISearchRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ISearchRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ISelectionRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ISelectionRequestor.class
index c1caea8..337ee81 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ISelectionRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ISelectionRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalCompletionContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalCompletionContext.class
index bca92ab..53243d2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalCompletionContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalCompletionContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalCompletionProposal.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalCompletionProposal.class
index 9fb409a..46eb8c2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalCompletionProposal.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalCompletionProposal.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext$1.class
index 53b6ca3..c4bc7e9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext.class
index 2fd0f78..067033f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$1.class
index 091a574..30eea5d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$GuessedTypeRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$GuessedTypeRequestor.class
index 25b0dd6..4312a20 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$GuessedTypeRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$GuessedTypeRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$ResolutionCleaner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$ResolutionCleaner.class
index 2f53b5e..3a353c5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$ResolutionCleaner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser$ResolutionCleaner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser.class
index 38c2904..13df6e4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/RelevanceConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/RelevanceConstants.class
index a3189f7..f4fdf8d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/RelevanceConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/RelevanceConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$1.class
index 9646b7b..394aaea 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$1Visitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$1Visitor.class
index 8aca519..4ce3a4c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$1Visitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$1Visitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$2.class
index eb21ed1..5b2d7ac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$3.class
index 97659c7..d3025e6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$4.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$4.class
index 6dac58c..3eccc4f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor$1.class
index 4f77d24..3492f86 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor$2.class
index 7742270..3ece84c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor.class
index aa6c24d..fa6aa5f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$InheritDocVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$SelectionTypeNameMatchRequestorWrapper$AcceptedType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$SelectionTypeNameMatchRequestorWrapper$AcceptedType.class
index 1265ec4..3b95da1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$SelectionTypeNameMatchRequestorWrapper$AcceptedType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$SelectionTypeNameMatchRequestorWrapper$AcceptedType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$SelectionTypeNameMatchRequestorWrapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$SelectionTypeNameMatchRequestorWrapper.class
index e4fecd1..a73be73 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$SelectionTypeNameMatchRequestorWrapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine$SelectionTypeNameMatchRequestorWrapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine.class
index 4155f62..62748c3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ThrownExceptionFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ThrownExceptionFinder.class
index 2164719..e5c3033 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ThrownExceptionFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/ThrownExceptionFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/UnresolvedReferenceNameFinder$UnresolvedReferenceNameRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/UnresolvedReferenceNameFinder$UnresolvedReferenceNameRequestor.class
index 27819b0..e6b1a7a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/UnresolvedReferenceNameFinder$UnresolvedReferenceNameRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/UnresolvedReferenceNameFinder$UnresolvedReferenceNameRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/UnresolvedReferenceNameFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/UnresolvedReferenceNameFinder.class
index 1f3b93e..f3094f9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/UnresolvedReferenceNameFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/UnresolvedReferenceNameFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadoc.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadoc.class
index da08c91..d15c236 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadoc.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadoc.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadocParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadocParser.class
index 6be3d33..ccb16d6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadocParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadocParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionNodeDetector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionNodeDetector.class
index 1ac46d4..cdd848c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionNodeDetector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionNodeDetector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionNodeFound.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionNodeFound.class
index b829ba2..4554123 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionNodeFound.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionNodeFound.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnAnnotationMemberValuePair.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnAnnotationMemberValuePair.class
index 4ba881c..b1a33c8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnAnnotationMemberValuePair.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnAnnotationMemberValuePair.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnAnnotationOfType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnAnnotationOfType.class
index 8e5f340..63940a2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnAnnotationOfType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnAnnotationOfType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnArgumentName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnArgumentName.class
index 52bac66..5220d85 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnArgumentName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnArgumentName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnBranchStatementLabel.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnBranchStatementLabel.class
index 77673a3..c20ad2c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnBranchStatementLabel.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnBranchStatementLabel.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnClassLiteralAccess.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnClassLiteralAccess.class
index 7269fbe..7455a54 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnClassLiteralAccess.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnClassLiteralAccess.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnExplicitConstructorCall.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnExplicitConstructorCall.class
index 7b519be..f78fcbb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnExplicitConstructorCall.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnExplicitConstructorCall.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnFieldName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnFieldName.class
index 88d2c0d..361197e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnFieldName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnFieldName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnFieldType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnFieldType.class
index d3fbd72..4f0a586 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnFieldType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnFieldType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnImportReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnImportReference.class
index 18ae477..94b8fff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnImportReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnImportReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadoc.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadoc.class
index 3759a29..be6aa22 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadoc.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadoc.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocAllocationExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocAllocationExpression.class
index bb1385d..fd2f184 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocAllocationExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocAllocationExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocFieldReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocFieldReference.class
index 471fc44..acd1759 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocFieldReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocFieldReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocMessageSend.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocMessageSend.class
index 5f06d45..6c63c6b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocMessageSend.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocMessageSend.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocParamNameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocParamNameReference.class
index e7c035b..c21acd6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocParamNameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocParamNameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocQualifiedTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocQualifiedTypeReference.class
index 40fede2..efc78d8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocQualifiedTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocQualifiedTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocSingleTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocSingleTypeReference.class
index 82f5c08..40a7b50 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocSingleTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocSingleTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocTag.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocTag.class
index 1d9df13..04b45af 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocTag.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocTag.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocTypeParamReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocTypeParamReference.class
index 8c0953b..93723b8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocTypeParamReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnJavadocTypeParamReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.class
index 1d4e47e..acefd12 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.class
index 11cd27c..c801d2d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.class
index 39610a7..a00d491 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.class
index cf7b15c..7dcf229 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnLocalName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnLocalName.class
index fdf4ecb..2ef4c3b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnLocalName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnLocalName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMarkerAnnotationName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMarkerAnnotationName.class
index 5642f43..241dbf4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMarkerAnnotationName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMarkerAnnotationName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMemberAccess.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMemberAccess.class
index 13df7e4..74300d6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMemberAccess.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMemberAccess.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMemberValueName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMemberValueName.class
index 703351d..4f6f2d4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMemberValueName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMemberValueName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSend.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSend.class
index 56d821e..5d52305 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSend.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSend.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSendName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSendName.class
index f7b8c1c..7ee522e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSendName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSendName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodName.class
index 6ccc86a..901cf99 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodReturnType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodReturnType.class
index 39c2d84..1369784 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodReturnType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodReturnType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodTypeParameter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodTypeParameter.class
index ff9af66..8ef728f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodTypeParameter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodTypeParameter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnPackageReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnPackageReference.class
index 7e0420a..fd5cff2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnPackageReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnPackageReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnParameterizedQualifiedTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnParameterizedQualifiedTypeReference.class
index 915c1ed..8e239f0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnParameterizedQualifiedTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnParameterizedQualifiedTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedAllocationExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedAllocationExpression.class
index 162f375..d8250e9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedAllocationExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedAllocationExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedNameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedNameReference.class
index 794a5b5..c2647f2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedNameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedNameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.class
index 5d00eea..a2da6df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnReferenceExpressionName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnReferenceExpressionName.class
new file mode 100644
index 0000000..6409456
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnReferenceExpressionName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleNameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleNameReference.class
index fdc4cd0..5042c91 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleNameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleNameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleTypeReference.class
index f577a13..d832a8c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnStringLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnStringLiteral.class
index 38ed58f..0c3056f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnStringLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnStringLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.class
index 78136cc..11d8313 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.class
index b3793ef..43efaad 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/InvalidCursorLocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/InvalidCursorLocation.class
index 879dba3..36f1058 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/InvalidCursorLocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/InvalidCursorLocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistAnnotation.class
index 0e1a481..e8c5911 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistCompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistCompilationUnit.class
index a2ef153..ef29c57 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistCompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistCompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportContainer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportContainer.class
index d3d7d28..53de856 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportContainer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportContainer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportDeclaration.class
index 3a6a8b9..822d5e1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistInitializer.class
index df31ffd..0f2ee2b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistOptions.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistOptions.class
index bd646f9..f73576d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistOptions.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistOptions.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistPackageDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistPackageDeclaration.class
index b5aa995..23a1b35 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistPackageDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistPackageDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistParser.class
index 5231cd7..8512d55 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceField.class
index 8ac9073..05480ca 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceMethod.class
index a0c343b..27e9144 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceType.class
index b2903c6..4a40c07 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistTypeParameter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistTypeParameter.class
index c6d6c10..ef93e5a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistTypeParameter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistTypeParameter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Engine.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Engine.class
index 5c089b7..12630bc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Engine.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Engine.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Keywords.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Keywords.class
index 0015992..241929f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Keywords.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Keywords.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionJavadoc.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionJavadoc.class
index d8a99d8..33bf740 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionJavadoc.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionJavadoc.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionJavadocParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionJavadocParser.class
index ada67ef..c2340c8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionJavadocParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionJavadocParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionNodeFound.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionNodeFound.class
index 047ebd3..ede2faa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionNodeFound.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionNodeFound.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnArgumentName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnArgumentName.class
index 4513bab..3c78248 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnArgumentName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnArgumentName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnExplicitConstructorCall.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnExplicitConstructorCall.class
index f050b36..4b3378e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnExplicitConstructorCall.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnExplicitConstructorCall.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnFieldReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnFieldReference.class
index c0f9f49..b82007d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnFieldReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnFieldReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnFieldType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnFieldType.class
index a34a908..80d098c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnFieldType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnFieldType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnImportReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnImportReference.class
index 7f53f98..31ad5a8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnImportReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnImportReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnLambdaExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnLambdaExpression.class
new file mode 100644
index 0000000..fdf0c2e
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnLambdaExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnLocalName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnLocalName.class
index 527f00d..329d6eb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnLocalName.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnLocalName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnMessageSend.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnMessageSend.class
index 4cf22c1..95b9c55 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnMessageSend.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnMessageSend.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnNameOfMemberValuePair.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnNameOfMemberValuePair.class
index 33ce20e..9c272a3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnNameOfMemberValuePair.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnNameOfMemberValuePair.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnPackageReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnPackageReference.class
index 091d2bc..07764c9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnPackageReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnPackageReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnParameterizedQualifiedTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnParameterizedQualifiedTypeReference.class
index 70b4d27..08847fc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnParameterizedQualifiedTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnParameterizedQualifiedTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnParameterizedSingleTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnParameterizedSingleTypeReference.class
index ae6dc67..111bad9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnParameterizedSingleTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnParameterizedSingleTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedAllocationExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedAllocationExpression.class
index 5825351..191174a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedAllocationExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedAllocationExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedNameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedNameReference.class
index b99ef5d..6aa690a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedNameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedNameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedSuperReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedSuperReference.class
index 87dc27d..cc98a7c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedSuperReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedSuperReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedTypeReference.class
index 6c66684..0f67091 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpression.class
new file mode 100644
index 0000000..c31d606
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpressionName.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpressionName.class
new file mode 100644
index 0000000..5b5b417
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpressionName.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSingleNameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSingleNameReference.class
index ed4d25a..3f14327 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSingleNameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSingleNameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSingleTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSingleTypeReference.class
index f4bbfd6..654f1ea 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSingleTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSingleTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSuperReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSuperReference.class
index f57d22e..a1fe6c8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSuperReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnSuperReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser$1.class
index 524c951..8f44898 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser$2.class
index 59fb86a..998cff5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser.class
index a0b8812..821fca6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionScanner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionScanner.class
index af7340d..8d16d82 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionScanner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionScanner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ASTVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ASTVisitor.class
index 3d6fd1f..ed4ae5d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ASTVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ASTVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/AbstractAnnotationProcessorManager.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/AbstractAnnotationProcessorManager.class
index a6695e8..fb855f6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/AbstractAnnotationProcessorManager.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/AbstractAnnotationProcessorManager.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$1.class
index 3782111..1e09e1c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$2.class
index 6b4b9b5..eb533d5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$3.class
index 45a2d65..06c64e1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile.class
index 2d8b3c6..1aef2e9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFilePool.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFilePool.class
index 5d84aa6..a727e8b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFilePool.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFilePool.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult$1.class
index 529dbea..0976c39 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult$ProblemsForRemovalFilter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult$ProblemsForRemovalFilter.class
index a688cdd..d84f22e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult$ProblemsForRemovalFilter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult$ProblemsForRemovalFilter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult.class
index e982fd1..a82b6ac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler$1.class
index 522caee..7e05bc1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler.class
index 31cca8a..3130f60 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$1.class
index 87e5d75..4676110 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$2.class
index e806c22..3f847de 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$3.class
index 6a15e90..9307785 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$4.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$4.class
index 2672d7f..6bdd647 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$5.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$5.class
index 6c15a5e..78a59fb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$5.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies$5.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies.class
index 23c1612..538f2a7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DocumentElementParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DocumentElementParser.class
index 864d1a5..36fce0b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DocumentElementParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/DocumentElementParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ExtraFlags.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ExtraFlags.class
index e0573f9..a321977 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ExtraFlags.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ExtraFlags.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IAttribute.class
index 73ee932..4fa374f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ICompilerRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ICompilerRequestor.class
index 0a02d4f..68e0b06 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ICompilerRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ICompilerRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IDebugRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IDebugRequestor.class
index ed85319..83e94e8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IDebugRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IDebugRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IDocumentElementRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IDocumentElementRequestor.class
index e5b0dd5..22a5549 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IDocumentElementRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IDocumentElementRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IErrorHandlingPolicy.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IErrorHandlingPolicy.class
index dabdede..b90678a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IErrorHandlingPolicy.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IErrorHandlingPolicy.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IProblemFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IProblemFactory.class
index 029b3c0..2085f9a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IProblemFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/IProblemFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$FieldInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$FieldInfo.class
index 42b8f2a..c92ff2a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$FieldInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$FieldInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$MethodInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$MethodInfo.class
index 518e8c3..d03b140 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$MethodInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$MethodInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$ParameterInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$ParameterInfo.class
index e29be3d..90eaf50 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$ParameterInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$ParameterInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$TypeInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$TypeInfo.class
index 82c0ed3..5a0728e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$TypeInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$TypeInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$TypeParameterInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$TypeParameterInfo.class
index f7c7394..97ea62b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$TypeParameterInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor$TypeParameterInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor.class
index 21697f7..dc29eb1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ProcessTaskManager.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ProcessTaskManager.class
index 8fb155d..f1269c3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ProcessTaskManager.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ProcessTaskManager.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ReadManager.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ReadManager.class
index 1c90bd7..a16680c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ReadManager.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ReadManager.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier$LocalDeclarationVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier$LocalDeclarationVisitor.class
index 4b8d01b..f4e3a21 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier$LocalDeclarationVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier$LocalDeclarationVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier.class
index 6ed7051..50cc766 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser$1.class
index d4b00fb..45f3c7e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser.class
index c08be22..8fb9966 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementRequestorAdapter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementRequestorAdapter.class
index ae9a0b2..2027458 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementRequestorAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementRequestorAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceJavadocParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceJavadocParser.class
index b3b3449..756ee9e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceJavadocParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/SourceJavadocParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.class
index 373755e..9ea0506 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ASTNode.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ASTNode.class
index 0846824..1071065 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ASTNode.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ASTNode.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.class
index c59e561..5c4b5a7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractVariableDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractVariableDeclaration.class
index dca3676..b9f355a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractVariableDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractVariableDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression$ResolutionState.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression$ResolutionState.class
new file mode 100644
index 0000000..ffc08fd
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression$ResolutionState.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.class
index e3ee5a8..7a29fa8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation$1LocationCollector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation$1LocationCollector.class
index 9bed099..e280fc5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation$1LocationCollector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation$1LocationCollector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation$1MissingTargetBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation$1MissingTargetBuilder.class
new file mode 100644
index 0000000..31d27e8
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation$1MissingTargetBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation$TypeUseBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation$TypeUseBinding.class
deleted file mode 100644
index b0a2664..0000000
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation$TypeUseBinding.class
+++ /dev/null
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation.class
index 473fb5d..253332f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AnnotationMethodDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AnnotationMethodDeclaration.class
index cfa662b..195fab7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AnnotationMethodDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AnnotationMethodDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Argument.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Argument.class
index 448ad7d..f87a0fa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Argument.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Argument.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.class
index f7e9301..c814731 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.class
index fd665b5..bb5b548 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.class
index eabe324..254ad4e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayReference.class
index 683fca4..ecb2909 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.class
index 4075f37..583b402 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AssertStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AssertStatement.class
index 334ffe9..4361e3a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AssertStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AssertStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Assignment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Assignment.class
index 94b7d49..a4d99ba 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Assignment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Assignment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.class
index 3d425bf..c8b819f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Block.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Block.class
index f3295b5..1a98f30 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Block.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Block.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BranchStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BranchStatement.class
index fa8562b..00a3776 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BranchStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BranchStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BreakStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BreakStatement.class
index 57663e5..bac8cf9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BreakStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BreakStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CaseStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CaseStatement.class
index 709b419..d3f99e7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CaseStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CaseStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression$1.class
index ebefc91..7ea4837 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression.class
index 98fca11..59eb265 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CharLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CharLiteral.class
index 2b04adf..defe0e0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CharLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CharLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ClassLiteralAccess.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ClassLiteralAccess.class
index f8de351..df07475 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ClassLiteralAccess.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ClassLiteralAccess.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Clinit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Clinit.class
index 8354663..c27e55d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Clinit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Clinit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CombinedBinaryExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CombinedBinaryExpression.class
index 778d2d9..a675f20 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CombinedBinaryExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CombinedBinaryExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration$1.class
index 26b8052..c75688f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.class
index 8d080f6..98efc16 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.class
index 395791d..d3f62ce 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.class
index 61376fd..7ac9b2a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.class
index de69358..5dd5ab2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ContainerAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ContainerAnnotation.class
new file mode 100644
index 0000000..8369b32
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ContainerAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.class
index 997e363..e55a682 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/DoStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/DoStatement.class
index d605197..65b10af 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/DoStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/DoStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/DoubleLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/DoubleLiteral.class
index ff65cc6..91d4cd7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/DoubleLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/DoubleLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EmptyStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EmptyStatement.class
index e8fed2a..9062a5b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EmptyStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EmptyStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EqualExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EqualExpression.class
index 144244c..5ca776e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EqualExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EqualExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.class
index 3cac302..0c7e0b7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Expression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Expression.class
index cc27312..380e96a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Expression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Expression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$1.class
index df82517..b2c35ab 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$2.class
index 2348981..00cf04c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$3.class
index cf36bfa..f055d55 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$4.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$4.class
index 4d3af07..383e7be 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext.class
index ac64fcf..13297e9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExtendedStringLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExtendedStringLiteral.class
index e0651f0..fb7ffd1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExtendedStringLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExtendedStringLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.class
index 3b944eb..c2f55e9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FalseLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FalseLiteral.class
index e881f78..730cafa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FalseLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FalseLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.class
index be6ceef..0763862 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldReference.class
index d42e30f..bea82f5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FloatLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FloatLiteral.class
index bc73fd7..cf0566a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FloatLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FloatLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForStatement.class
index 1137cb8..ba43ea5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.class
index 996c976..6008b37 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression$1BridgeCollector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression$1BridgeCollector.class
new file mode 100644
index 0000000..18a069a
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression$1BridgeCollector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression$VisibilityInspector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression$VisibilityInspector.class
index f771b74..4dbdb6a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression$VisibilityInspector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression$VisibilityInspector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.class
index bd4bf89..4fe0428 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IfStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IfStatement.class
index ed57099..216524b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IfStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IfStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ImportReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ImportReference.class
index 3bec637..b7a5b05 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ImportReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ImportReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IncongruentLambdaException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IncongruentLambdaException.class
deleted file mode 100644
index 8b6ae31..0000000
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IncongruentLambdaException.class
+++ /dev/null
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Initializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Initializer.class
index ad6ff3a..453b442 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Initializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Initializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InnerInferenceHelper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InnerInferenceHelper.class
new file mode 100644
index 0000000..af6f086
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InnerInferenceHelper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.class
index 472adfc..16c8b4c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntLiteral.class
index 83ac1e2..9dccabe 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntLiteralMinValue.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntLiteralMinValue.class
index 2c2a942..f8d20e5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntLiteralMinValue.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntLiteralMinValue.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.class
index 4c82e44..b0655b9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Invocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Invocation.class
new file mode 100644
index 0000000..f6c50c5
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Invocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Javadoc.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Javadoc.class
index 8d7348b..d95c8dd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Javadoc.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Javadoc.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocAllocationExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocAllocationExpression.class
index 648ad08..940cbeb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocAllocationExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocAllocationExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArgumentExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArgumentExpression.class
index afb30da..9aa2166 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArgumentExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArgumentExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArrayQualifiedTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArrayQualifiedTypeReference.class
index 345b72a..a5f2c71 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArrayQualifiedTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArrayQualifiedTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArraySingleTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArraySingleTypeReference.class
index 2862056..e8de9a6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArraySingleTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocArraySingleTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocFieldReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocFieldReference.class
index 14bf92a..118f66d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocFieldReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocFieldReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.class
index 3eaeb20..7e9939b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.class
index 4da745e..f4917be 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocQualifiedTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocQualifiedTypeReference.class
index 8d2b165..cf7045b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocQualifiedTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocQualifiedTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocReturnStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocReturnStatement.class
index 6e44e7a..f914048 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocReturnStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocReturnStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocSingleNameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocSingleNameReference.class
index fd68cfe..3df1918 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocSingleNameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocSingleNameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocSingleTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocSingleTypeReference.class
index ebac760..8ebe16e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocSingleTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocSingleTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LabeledStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LabeledStatement.class
index 75ff4d8..7f502f6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LabeledStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LabeledStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression$1LambdaTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression$1LambdaTypeBinding.class
new file mode 100644
index 0000000..bcfaf1e
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression$1LambdaTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression$1ShapeComputer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression$1ShapeComputer.class
new file mode 100644
index 0000000..5ed2ccf
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression$1ShapeComputer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.class
index b8fd36a..f11d784 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Literal.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Literal.class
index 36f15d1..0973f0c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Literal.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Literal.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.class
index 2ec3c68..ff18885 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LongLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LongLiteral.class
index b0f0215..6e4d375 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LongLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LongLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LongLiteralMinValue.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LongLiteralMinValue.class
index 3d9c2ae..e78ae80 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LongLiteralMinValue.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LongLiteralMinValue.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MagicLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MagicLiteral.class
index 1518c23..7d86e15 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MagicLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MagicLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.class
index c7273bf..180f54f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair$1.class
index 943fb4c..8d23f5c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.class
index 66ddbc2..16e1121 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MessageSend.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MessageSend.class
index 95acf12..d872d33 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MessageSend.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MessageSend.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.class
index 74e181f..08afc3f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NameReference.class
index b7cb1ea..d696d71 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.class
index 34fa214..d618bb3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching$1SearchContradictions.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching$1SearchContradictions.class
new file mode 100644
index 0000000..9080ea2
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching$1SearchContradictions.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.class
new file mode 100644
index 0000000..1055b91
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullLiteral.class
index 4470c7c..10c545c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NumberLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NumberLiteral.class
index be0961a..fe7d1e4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NumberLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NumberLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.class
index 5365b02..866b5b5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression$1Decode.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression$1Decode.class
index 3492f22..ad1553f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression$1Decode.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression$1Decode.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.class
index d2fdb03..14338c6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorIds.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorIds.class
index 685736c..1e8a6a2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorIds.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorIds.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.class
index 9155f7c..ddc87c0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.class
index 271b30f..b066589 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/PostfixExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/PostfixExpression.class
index f5558d7..87a161f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/PostfixExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/PostfixExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/PrefixExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/PrefixExpression.class
index 797205f..35e1024 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/PrefixExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/PrefixExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.class
index a8ae350..d2a4473 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.class
index cd556f3..69ad8ac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.class
index b581f31..4283797 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.class
index f50ab29..6a40f3e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedTypeReference.class
index a4d7f2d..5a677a3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Receiver.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Receiver.class
index 8007a45..10b6884 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Receiver.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Receiver.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Reference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Reference.class
index 295f0f4..c8e0169 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Reference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Reference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.class
index 6e6bf43..3cdc2ee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.class
index ace8635..e63afa8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.class
index fc97f94..484e221 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.class
index cc29039..fb95e29 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleTypeReference.class
index cc2dd61..9be9f82 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Statement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Statement.class
index 1751557..6d79f0b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Statement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Statement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/StringLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/StringLiteral.class
index 90fddd9..cf9c9e7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/StringLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/StringLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/StringLiteralConcatenation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/StringLiteralConcatenation.class
index ce6fb21..d296f64 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/StringLiteralConcatenation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/StringLiteralConcatenation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SubRoutineStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SubRoutineStatement.class
index efc80a9..84526e0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SubRoutineStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SubRoutineStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SuperReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SuperReference.class
index 3e20d1a..4c30486 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SuperReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SuperReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement$1StringSwitchCase.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement$1StringSwitchCase.class
index 6c1fab6..07beaf4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement$1StringSwitchCase.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement$1StringSwitchCase.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.class
index e11c7d9..e0ee4f1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement.class
index 7143d0b..33fe527 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThisReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThisReference.class
index 139b74d..593568f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThisReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThisReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThrowStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThrowStatement.class
index 7d34bdb..10e4150 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThrowStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThrowStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TrueLiteral.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TrueLiteral.class
index a1795e5..bca3222 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TrueLiteral.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TrueLiteral.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TryStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TryStatement.class
index 0b32869..f6c0138 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TryStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TryStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.class
index 9d90663..3d6e1b2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeParameter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeParameter.class
index 14cf5e4..ddab4af 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeParameter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeParameter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference$AnnotationCollector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference$AnnotationCollector.class
index c7efd57..0bf1b5d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference$AnnotationCollector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference$AnnotationCollector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference.class
index a33c955..8ef11a0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.class
index debd8b8..bb4ef16 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnionTypeReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnionTypeReference.class
index da5147c..284039a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnionTypeReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnionTypeReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/WhileStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/WhileStatement.class
index a8c9f4f..9a743b2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/WhileStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/WhileStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Wildcard.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Wildcard.class
index a665203..32f7fc2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Wildcard.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Wildcard.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory$1.class
index ebb16dc..e838f44 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.class
index dfb71c5..63ea3cc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.class
index f0d4ac1..dd622ec 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathLocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathLocation.class
index fa58165..59cfd38 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathLocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathLocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathSourceJar.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathSourceJar.class
index 19b8249..568f556 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathSourceJar.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathSourceJar.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/CompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/CompilationUnit.class
index 05dcf56..44f8bf9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/CompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/CompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileFinder.class
index 8132051..eededc4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$Classpath.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$Classpath.class
index 8fd5e51..51d541b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$Classpath.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$Classpath.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$ClasspathNormalizer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$ClasspathNormalizer.class
index 9ec045f..dcc36ea 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$ClasspathNormalizer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$ClasspathNormalizer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$ClasspathSectionProblemReporter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$ClasspathSectionProblemReporter.class
index df33aa5..020f181 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$ClasspathSectionProblemReporter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem$ClasspathSectionProblemReporter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem.class
index e5030dc..bfc2284 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$1.class
index b89cef8..c4f790c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$2.class
index 26a5b11..9c017a7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$3.class
index 7041540..084307d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$4.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$4.class
index 06e6d44..570a5b2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$Logger$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$Logger$1.class
index 65faa55..a61daab 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$Logger$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$Logger$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$Logger.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$Logger.class
index f3ad0d7..60867c5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$Logger.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$Logger.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$ResourceBundleFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$ResourceBundleFactory.class
index bb19f1b..bb259d8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$ResourceBundleFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main$ResourceBundleFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main.class
index 5e1d034..e7f3dce 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/messages.properties b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/messages.properties
index 79d8870..61a6306 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/messages.properties
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/batch/messages.properties
@@ -16,14 +16,15 @@
 #								bug 374605 - Unreasonable warning for enum-based switch statements
 #								bug 388281 - [compiler][null] inheritance of null annotations as an option
 #		Alan Moraes <alan@kelon.org> - Contribution for bug 383644
+#		Jesper S Moller - Contribution for bug 407297 - [1.8][compiler] Control generation of parameter names by option
 ###############################################################################
 ### JavaBatchCompiler messages.
 
 ### compiler
 #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 = BETA_JAVA8_3d6e745, 3.9.0
+#Format: compiler.version = (The place holders will be automatically filled. Do not remove or alter it)
+compiler.version = BETA_JAVA8_LUNA_8661797, 3.9.2
 compiler.copyright = Copyright IBM Corp 2000, 2013. All rights reserved.
 
 ### progress
@@ -257,6 +258,7 @@
 \    -repeat <n>        repeat compilation process <n> times for perf analysis\n\
 \    -inlineJSR         inline JSR bytecode (implicit if target >= 1.5)\n\
 \    -enableJavadoc     consider references in javadoc\n\
+\    -parameters        generate method parameters attribute (for target >= 1.8)\n\
 \    -Xemacs            used to enable emacs-style output in the console.\n\
 \                       It does not affect the xml log output\n\
 \    -missingNullDefault  report missing default nullness annotation\n\
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.class
index c4946ac..3dff8e4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationMethodInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationMethodInfo.class
index 29ae33f..9a60321 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationMethodInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationMethodInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationMethodInfoWithAnnotations.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationMethodInfoWithAnnotations.class
index fe17540..6a3d917 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationMethodInfoWithAnnotations.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/AnnotationMethodInfoWithAnnotations.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileConstants.class
index 84f79f1..a50c553 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.class
index 6382f93..24e39bd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileStruct.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileStruct.class
index b821586..d6a1f9a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileStruct.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileStruct.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFormatException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFormatException.class
index 9ce245b..eb9e7d7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFormatException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFormatException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ElementValuePairInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ElementValuePairInfo.class
index 05d35d5..c360016 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ElementValuePairInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ElementValuePairInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfo.class
index fa9b411..69ea686 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithAnnotation.class
index e1ae66c..72718cb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithTypeAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithTypeAnnotation.class
new file mode 100644
index 0000000..329844a
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithTypeAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/InnerClassInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/InnerClassInfo.class
index ea2a7c1..3a8d091 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/InnerClassInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/InnerClassInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.class
index 7d722a4..7787d7a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithAnnotations.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithAnnotations.class
index 523e68e..29b3fa8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithAnnotations.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithAnnotations.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.class
index dd621ac..ea3214a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithTypeAnnotations.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithTypeAnnotations.class
new file mode 100644
index 0000000..e67e3e8
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithTypeAnnotations.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationInfo.class
new file mode 100644
index 0000000..18c73ce
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker$1.class
new file mode 100644
index 0000000..b3785aa
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker.class
new file mode 100644
index 0000000..93d6989
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationContext.class
index 8eaae43..bca6542 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationTargetTypeConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationTargetTypeConstants.class
index 6e5387e..05cdd80 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationTargetTypeConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationTargetTypeConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AttributeNamesConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AttributeNamesConstants.class
index 2fc4997..3d58719 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AttributeNamesConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AttributeNamesConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/BranchLabel.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/BranchLabel.class
index 85d81ba..5e815dd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/BranchLabel.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/BranchLabel.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CachedIndexEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CachedIndexEntry.class
index fef6f71..c9a9868 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CachedIndexEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CachedIndexEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CaseLabel.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CaseLabel.class
index 1dca4bd..b2133d1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CaseLabel.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CaseLabel.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.class
index f30221b..47853b1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CodeStream.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CodeStream.class
index df8c340..add617b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CodeStream.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CodeStream.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.class
index e86cf02..c866062 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/DoubleCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/DoubleCache.class
index 00a2f2c..8af6afb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/DoubleCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/DoubleCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ExceptionLabel.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ExceptionLabel.class
index 40af1ae..db8f6f8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ExceptionLabel.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ExceptionLabel.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/FloatCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/FloatCache.class
index f53a1d6..40403f2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/FloatCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/FloatCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/IntegerCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/IntegerCache.class
index 641f07c..aae59bc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/IntegerCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/IntegerCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Label.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Label.class
index 6954d10..e2593f3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Label.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Label.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/LongCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/LongCache.class
index 88f3ce6..7a858d6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/LongCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/LongCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.class
index 1ac18da..311e08d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ObjectCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ObjectCache.class
index 9bf1f9d..6989bf9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ObjectCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ObjectCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Opcodes.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Opcodes.class
index 23240b4..5463bc6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Opcodes.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Opcodes.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.class
index 2646a0b..cb652d0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$ExceptionMarker.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$ExceptionMarker.class
index de1c646..a804cba 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$ExceptionMarker.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$ExceptionMarker.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$FramePosition.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$FramePosition.class
index 6e9d24e..0aae962 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$FramePosition.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$FramePosition.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$StackDepthMarker.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$StackDepthMarker.class
index 854fa32..d898d12 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$StackDepthMarker.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$StackDepthMarker.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$StackMarker.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$StackMarker.class
index cd5d838..d333026 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$StackMarker.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream$StackMarker.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.class
index 9d53cc0..c7ebf01 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.class
index e2bebc1..a4787c4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/VerificationTypeInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/VerificationTypeInfo.class
index c647f50..ee1f233 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/VerificationTypeInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/VerificationTypeInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRestriction.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRestriction.class
index be943f7..ed058e5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRestriction.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRestriction.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRule.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRule.class
index 93e95ba..25db359 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRule.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRule.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRuleSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRuleSet.class
index 132820b..32f67d2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRuleSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/AccessRuleSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ClassSignature.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ClassSignature.class
index 8a8185f..ebe1de8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ClassSignature.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ClassSignature.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/EnumConstantSignature.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/EnumConstantSignature.class
index c44b60d..964a0f0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/EnumConstantSignature.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/EnumConstantSignature.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryAnnotation.class
index f709050..f0aebc0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryElementValuePair.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryElementValuePair.class
index 1bbd756..4a15176 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryElementValuePair.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryElementValuePair.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryField.class
index 2506297..8292786 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryMethod.class
index 855d657..561395c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryNestedType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryNestedType.class
index 191feeb..d6d41d7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryNestedType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryNestedType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryType.class
index 51a8c5d..7bd5bad 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryTypeAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryTypeAnnotation.class
new file mode 100644
index 0000000..c246ff7
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryTypeAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ICompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ICompilationUnit.class
index 02781d8..5da40dc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ICompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ICompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IDependent.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IDependent.class
index 743d75c..a8f7be7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IDependent.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IDependent.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericField.class
index d93b3eb..347760f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericMethod.class
index 4ecc564..88394e4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericType.class
index 70c3284..bcc0257 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/IGenericType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/INameEnvironment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/INameEnvironment.class
index 75e652b..4ae9c75 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/INameEnvironment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/INameEnvironment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceField.class
index 496796e..6210854 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceImport.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceImport.class
index 37b3f5b..7984eb7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceImport.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceImport.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceMethod.class
index 186ce95..2e522ab 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceType.class
index 17cebd5..419b9f5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/ISourceType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/NameEnvironmentAnswer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/NameEnvironmentAnswer.class
index eea66c8..f80ef3f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/NameEnvironmentAnswer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/env/NameEnvironmentAnswer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ConditionalFlowInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ConditionalFlowInfo.class
index 65fbd93..c516a64 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ConditionalFlowInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ConditionalFlowInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.class
index a0fb2a8..9d872f0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.class
index da41fb1..2ec76d8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowContext.class
index 2d816fb..315d078 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowInfo.class
index 6f9ac8a..f7d6fbe 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/InitializationFlowContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/InitializationFlowContext.class
index b722c43..dee06dd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/InitializationFlowContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/InitializationFlowContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/InsideSubRoutineFlowContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/InsideSubRoutineFlowContext.class
index be3c21f..f52130c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/InsideSubRoutineFlowContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/InsideSubRoutineFlowContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LabelFlowContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LabelFlowContext.class
index c430e0e..b2767f8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LabelFlowContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LabelFlowContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext$EscapingExceptionCatchSite.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext$EscapingExceptionCatchSite.class
index 79d1355..b1e90d3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext$EscapingExceptionCatchSite.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext$EscapingExceptionCatchSite.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.class
index 6c96868..6528fce 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/SwitchFlowContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/SwitchFlowContext.class
index 834a314..53785d9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/SwitchFlowContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/SwitchFlowContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/TryFlowContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/TryFlowContext.class
index 17b5d16..cb80b39 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/TryFlowContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/TryFlowContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo$AssertionFailedException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo$AssertionFailedException.class
index 1756399..c1ee325 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo$AssertionFailedException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo$AssertionFailedException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo.class
index ed7a63a..5d737fe 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/BooleanConstant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/BooleanConstant.class
index 39984d5..b05e70b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/BooleanConstant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/BooleanConstant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ByteConstant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ByteConstant.class
index 40bd0bd..3e94fea 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ByteConstant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ByteConstant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CharConstant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CharConstant.class
index 42df249..2e9c2a5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CharConstant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CharConstant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.class
index fef01dd..41c5115 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerStats.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerStats.class
index daeb4b2..910b3ff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerStats.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerStats.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/Constant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/Constant.class
index 61e87aa..ca2d738 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/Constant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/Constant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/DoubleConstant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/DoubleConstant.class
index b14f478..a949620 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/DoubleConstant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/DoubleConstant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/FloatConstant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/FloatConstant.class
index a104324..a89c339 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/FloatConstant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/FloatConstant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ITypeRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ITypeRequestor.class
index 7a51680..10293d3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ITypeRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ITypeRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/IntConstant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/IntConstant.class
index 223eb99..7357748 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/IntConstant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/IntConstant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/IrritantSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/IrritantSet.class
index 844c483..b2e7a81 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/IrritantSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/IrritantSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/LongConstant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/LongConstant.class
index a5807c6..f3f1e52 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/LongConstant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/LongConstant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ReferenceContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ReferenceContext.class
index cb75811..efcaf89 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ReferenceContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ReferenceContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ShortConstant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ShortConstant.class
index 76773c3..13b8b42 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ShortConstant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ShortConstant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/StringConstant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/StringConstant.class
index 061ecbb..ec288a5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/StringConstant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/impl/StringConstant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.class
new file mode 100644
index 0000000..bdcb99b
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.class
index 149e28f..1928712 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder$AnnotationMethodHolder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder$AnnotationMethodHolder.class
index 6bf82de..06f4d81 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder$AnnotationMethodHolder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder$AnnotationMethodHolder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder$MethodHolder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder$MethodHolder.class
index 949184a..2e80bff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder$MethodHolder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder$MethodHolder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder.class
index fab1884..f3d485e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.class
index 5ff4828..da6204e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.class
index df18728..4824c66 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.class
index 1063f43..99ddb28 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Binding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Binding.class
index 3231b8b..78a0d1d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Binding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Binding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BlockScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BlockScope.class
index 1b3b2c4..99debd9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BlockScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BlockScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BoundSet$ThreeSets.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BoundSet$ThreeSets.class
new file mode 100644
index 0000000..917182d
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BoundSet$ThreeSets.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BoundSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BoundSet.class
new file mode 100644
index 0000000..53d8b49
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BoundSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.class
index 6b9ae3c..0ab5e43 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding18.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding18.class
new file mode 100644
index 0000000..7156800
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding18.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CatchParameterBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CatchParameterBinding.class
index 32f0971..cf32ab9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CatchParameterBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CatchParameterBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ClassScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ClassScope.class
index 1cc2acd..b8dc34a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ClassScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ClassScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.class
index b48f097..9a7ece1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExceptionFormula.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExceptionFormula.class
new file mode 100644
index 0000000..ea3c0be
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExceptionFormula.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula$1.class
new file mode 100644
index 0000000..638324f
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.class
new file mode 100644
index 0000000..6f8b5cd
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintFormula.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintFormula.class
new file mode 100644
index 0000000..ff02b55
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintFormula.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintTypeFormula.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintTypeFormula.class
new file mode 100644
index 0000000..1f6a25c
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintTypeFormula.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ElementValuePair.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ElementValuePair.class
index f6a4053..459f2df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ElementValuePair.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ElementValuePair.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.class
index cd30faa..74ad2c8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.class
index 8ae7b89..a2b2deb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IMemberFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IMemberFinder.class
index 26ab221..5e27f73 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IMemberFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IMemberFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IPrivilegedHandler.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IPrivilegedHandler.class
index 81b4f10..cbb1a21 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IPrivilegedHandler.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IPrivilegedHandler.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IQualifiedTypeResolutionListener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IQualifiedTypeResolutionListener.class
index 5dcf0fe..7a77d8a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IQualifiedTypeResolutionListener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IQualifiedTypeResolutionListener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ITypeFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ITypeFinder.class
index 8342608..125cf25 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ITypeFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ITypeFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier$InheritedNonNullnessInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier$InheritedNonNullnessInfo.class
index 1f21496..f39ecaa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier$InheritedNonNullnessInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier$InheritedNonNullnessInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.class
index d4a275d..2182687 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImportBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImportBinding.class
index 62037db..acedc0d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImportBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImportBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImportConflictBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImportConflictBinding.class
index 8271975..ed3747c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImportConflictBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImportConflictBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext.class
index f750d65..e40c4f6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$1.class
new file mode 100644
index 0000000..235d98e
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$2.class
new file mode 100644
index 0000000..480adfe
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$3.class
new file mode 100644
index 0000000..00b717a
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$Solution.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$Solution.class
new file mode 100644
index 0000000..db587e1
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$Solution.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$SuspendedInferenceRecord.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$SuspendedInferenceRecord.class
new file mode 100644
index 0000000..e243e5d
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$SuspendedInferenceRecord.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.class
new file mode 100644
index 0000000..704142b
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceFailureException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceFailureException.class
new file mode 100644
index 0000000..02411aa
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceFailureException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceSubstitution.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceSubstitution.class
new file mode 100644
index 0000000..5b186b9
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceSubstitution.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceVariable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceVariable.class
new file mode 100644
index 0000000..5ea506c
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceVariable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InnerEmulationDependency.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InnerEmulationDependency.class
index a3f4bf8..552df74 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InnerEmulationDependency.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InnerEmulationDependency.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IntersectionCastTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IntersectionCastTypeBinding.class
index cd24018..3027d4b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IntersectionCastTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IntersectionCastTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite$EmptyWithAstNode.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite$EmptyWithAstNode.class
index 4d3593e..7b4f25c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite$EmptyWithAstNode.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite$EmptyWithAstNode.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.class
index 80ac830..935629e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalTypeBinding.class
index 9e28264..70011bf 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.class
index 67b7dd9..9a86d01 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.class
index 150b0f0..eadd75e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MemberTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MemberTypeBinding.class
index 75dbe39..6c89cf7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MemberTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MemberTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.class
index 7c181a3..a14bea6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodScope.class
index 5762dac..bccab9e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.class
index f34b3a7..12efd94 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.class
index 4f487dd..8c52f5e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MissingTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MissingTypeBinding.class
index 7e14695..b6ca2b0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MissingTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MissingTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MostSpecificExceptionMethodBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MostSpecificExceptionMethodBinding.class
index ff4f83e..1187ed7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MostSpecificExceptionMethodBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MostSpecificExceptionMethodBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.class
index 6cf781d..d75c090 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NullTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NullTypeBinding.class
new file mode 100644
index 0000000..1b9e5ea
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NullTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.class
index aab27bb..379b5fd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedFieldBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedFieldBinding.class
index 6b3a83f..f27e206 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedFieldBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedFieldBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding$LingeringTypeVariableEliminator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding$LingeringTypeVariableEliminator.class
index 26fdbce..7e323fe 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding$LingeringTypeVariableEliminator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding$LingeringTypeVariableEliminator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.class
index dfa36a7..f63273a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding$1.class
index 6b6a73c..95ce569 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding$2.class
index 78ca5ff..d6cc453 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding.class
index 8248509..857db01 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding$1MentionListener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding$1MentionListener.class
index dbb088f..af044b1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding$1MentionListener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding$1MentionListener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.class
index ef8880b..80b1ab8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.class
index ef91996..1fdef8e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolymorphicMethodBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolymorphicMethodBinding.class
index 2b93bf5..55a7489 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolymorphicMethodBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolymorphicMethodBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemBinding.class
index d2c749d..0d809c2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemFieldBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemFieldBinding.class
index 42f9974..5ebe7a9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemFieldBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemFieldBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemMethodBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemMethodBinding.class
index 7345f87..8652a49 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemMethodBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemMethodBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemPackageBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemPackageBinding.class
index 7114f4b..ec93217 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemPackageBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemPackageBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReasons.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReasons.class
index 2dd4765..3768f34 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReasons.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReasons.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.class
index 83ee014..58e5274 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.class
index 8b5c513..eabc920 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult$1.class
new file mode 100644
index 0000000..2ac3d25
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult$2.class
new file mode 100644
index 0000000..b7a6aa1
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult.class
new file mode 100644
index 0000000..1f4fc42
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$1.class
index 257774f..56d02b8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$2.class
index 4adbdaf..9488d72 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$3.class
index 7ebe06c..4fc3fd7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.class
index ab16c5c..c2f3d34 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$1.class
index 27c214e..96d9c32 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$2.class
index 667aa61..7c84454 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$MethodClashException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$MethodClashException.class
new file mode 100644
index 0000000..ab0ef04
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$MethodClashException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$Substitutor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$Substitutor.class
new file mode 100644
index 0000000..fbe58e6
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope$Substitutor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope.class
index 5efcf2b..d2f8a72 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SignatureWrapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SignatureWrapper.class
index 4c6ea21..48cc766 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SignatureWrapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SignatureWrapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.class
index 5bdecd2..4f5c31f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeCollisionException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeCollisionException.class
index aa3cc88..dfadd68 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeCollisionException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeCollisionException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Substitution.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Substitution.class
index b9a508f..de5851b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Substitution.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Substitution.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticArgumentBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticArgumentBinding.class
index 85bcb13..a1150f9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticArgumentBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticArgumentBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticFactoryMethodBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticFactoryMethodBinding.class
new file mode 100644
index 0000000..4852a13
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticFactoryMethodBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticFieldBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticFieldBinding.class
index f559674..fcb62bf 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticFieldBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticFieldBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.class
index 04cea7b..5106d28 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TagBits.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TagBits.class
index 5a3cb6d..36e7900 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TagBits.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TagBits.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding$1.class
new file mode 100644
index 0000000..ef4cb5b
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.class
index 6ce5a1a..b8503cc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBindingVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBindingVisitor.class
index 373b2cd..8d0ba94 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBindingVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBindingVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBound.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBound.class
new file mode 100644
index 0000000..b07436c
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBound.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants$CloseMethodRecord.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants$CloseMethodRecord.class
index c619d1f..16d95ad 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants$CloseMethodRecord.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants$CloseMethodRecord.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.class
index 422885a..c479527 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeIds.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeIds.class
index 004dc80..dcc57b5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeIds.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeIds.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.class
new file mode 100644
index 0000000..01db462
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.class
index 78f4ef6..7140a5f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding.class
index 4e0c656..ce3663c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.class
index ecd3656..b8a3999 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.class
index 4c80027..f1f4ce7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VoidTypeBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VoidTypeBinding.class
new file mode 100644
index 0000000..5613eaa
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VoidTypeBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.class
index 51ceecd..30188b4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.class
index 4a0885a..cca7217 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/CommitRollbackParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/CommitRollbackParser.class
new file mode 100644
index 0000000..63ccab4
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/CommitRollbackParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ConflictedParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ConflictedParser.class
index 42e9078..83cc009 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ConflictedParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ConflictedParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocParser.class
index 0d753ac..1195535 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.class
index 4b51d5d..2468c0a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/NLSTag.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/NLSTag.class
index fbbc689..42f5d73 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/NLSTag.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/NLSTag.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser$IDeclarationFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser$IDeclarationFactory.class
index 3b6fec7..6ff9d8d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser$IDeclarationFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser$IDeclarationFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser.class
index bb21098..2978440 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.class
index e595074..290efc8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredAnnotation.class
index 31dfeb4..4a381bb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.class
index 0bbfd23..661caa9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.class
index f512ee8..92de3ce 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredField.class
index b6b103e..e2cb60e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredImport.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredImport.class
index 17de26b..35d1f2f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredImport.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredImport.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredInitializer.class
index 3d55c8f..6363231 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.class
index 75e8d73..5379d6e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.class
index bf86e13..3444b52 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.class
index 8f8f487..3cb8add 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredType.class
index db71243..c70c3fa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.class
index bcf983e..5acbd00 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.class
index 0239bde..0ff7821 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScannerData.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScannerData.class
index e104071..7234846 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScannerData.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScannerData.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Scanner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Scanner.class
index ac4f652..3555668 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Scanner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Scanner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.class
index 0e481a4..c85b0ae 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter$AnonymousMemberFound.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter$AnonymousMemberFound.class
index 28b50c9..6ed12ce 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter$AnonymousMemberFound.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter$AnonymousMemberFound.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter.class
index ac3c6a7..e4bc5cc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TerminalTokens.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TerminalTokens.class
index 1157c9f..fe7f113 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TerminalTokens.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TerminalTokens.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1.class
index abe5d84..6a1887c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1MethodVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1MethodVisitor.class
index d604eda..84f9591 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1MethodVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1MethodVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1TypeVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1TypeVisitor.class
index e323f10..0d9b582 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1TypeVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$1TypeVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$LocalTypeKind.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$LocalTypeKind.class
new file mode 100644
index 0000000..f41fd51
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass$LocalTypeKind.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass.class
index 0a8a2fa..7c0c03f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$Goal.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$Goal.class
index 4e7d3b3..4a04912 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$Goal.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$Goal.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$VanguardParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$VanguardParser.class
index 36e6775..731ee96 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$VanguardParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$VanguardParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$VanguardScanner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$VanguardScanner.class
index 71f16e1..5f2fe90 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$VanguardScanner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass$VanguardScanner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass.class
index dc11f24..723b1b2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TypeConverter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TypeConverter.class
index 9fd1f3c..c2c58e2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TypeConverter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TypeConverter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$PrimaryRepairInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$PrimaryRepairInfo.class
index 9a506a1..070ea35 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$PrimaryRepairInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$PrimaryRepairInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$RepairCandidate.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$RepairCandidate.class
index ffcb8c9..e532ac3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$RepairCandidate.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$RepairCandidate.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$SecondaryRepairInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$SecondaryRepairInfo.class
index f610f06..31904f9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$SecondaryRepairInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$SecondaryRepairInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$StateInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$StateInfo.class
index aa7cf76..2edfeb8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$StateInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser$StateInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.class
index 92fc1da..f876883 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream$Token.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream$Token.class
index 4654da8..eed5c6e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream$Token.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream$Token.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream.class
index ae67fda..3936342 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/RangeUtil$RangeResult.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/RangeUtil$RangeResult.class
index c9d3a66..5ae48ba 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/RangeUtil$RangeResult.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/RangeUtil$RangeResult.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/RangeUtil.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/RangeUtil.class
index 2d09dc5..d29e1c1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/RangeUtil.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/RangeUtil.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser1.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser1.rsc
index 78c3e84..35ff8d05 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser1.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser1.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser10.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser10.rsc
index 14b78eb..31091df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser10.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser10.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser11.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser11.rsc
index 97d5957..9586c4a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser11.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser11.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser12.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser12.rsc
index cac4c9a..a2405da 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser12.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser12.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser13.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser13.rsc
index 06c37e8..c93b080 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser13.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser13.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser14.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser14.rsc
index e6c599f..c287cad 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser14.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser14.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser15.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser15.rsc
index 97dc846..cc8990c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser15.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser15.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser16.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser16.rsc
index 771a532..687bd27 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser16.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser16.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser17.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser17.rsc
index 2406c9d..b0fdf76 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser17.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser17.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser18.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser18.rsc
index 426a382..297858e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser18.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser18.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser19.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser19.rsc
index 1fa1c81..8caf5a7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser19.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser19.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser2.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser2.rsc
index 08bdedf..d34b764 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser2.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser2.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser20.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser20.rsc
index 82bb005..e5bb86a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser20.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser20.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser21.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser21.rsc
index c098ce3..724bd2b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser21.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser21.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser22.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser22.rsc
index 261140d..376547c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser22.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser22.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser23.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser23.rsc
index 0468fc8..ea0615b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser23.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser23.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser24.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser24.rsc
index f8d889f..0cc3d82 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser24.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser24.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser3.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser3.rsc
index 313bf81..dab1c01 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser3.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser3.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser4.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser4.rsc
index 35eff4f..c74948a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser4.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser4.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser5.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser5.rsc
index 4e426aa..7e6c951 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser5.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser5.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser6.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser6.rsc
index d04b33e..565a167 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser6.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser6.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser7.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser7.rsc
index bf8172a..c6fea9d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser7.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser7.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser8.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser8.rsc
index 54e6acb..49f5fa8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser8.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser8.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser9.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser9.rsc
index 395af82..9c7914f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser9.rsc
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser9.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/readableNames.props b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/readableNames.props
index bbb9b5e..b7506a6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/readableNames.props
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/readableNames.props
@@ -68,6 +68,8 @@
 BeforeAdviceHeaderName=AdviceHeaderName
 Block=Block
 BlockStatement=BlockStatement
+BlockStatementopt0=BlockStatementopt0
+BlockStatementopt=BlockStatementopt
 BlockStatements=BlockStatements
 BlockStatementsopt=BlockStatements
 BooleanLiteral=BooleanLiteral
@@ -270,6 +272,7 @@
 MultiplicativeExpression_NotName=Expression
 Name=Name
 NameOrAj=name
+NestedLambda=NestedLambda
 NestedMethod=NestedMethod
 NestedType=NestedType
 NonWildTypeArgumentsopt=NonWildTypeArgumentsopt
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part0.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part0.rsc
new file mode 100644
index 0000000..16afc3d
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part0.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part1.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part1.rsc
new file mode 100644
index 0000000..be67b30
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part1.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part14.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part14.rsc
new file mode 100644
index 0000000..c8241e8
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part14.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part2.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part2.rsc
new file mode 100644
index 0000000..f89f581
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part2.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start0.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start0.rsc
new file mode 100644
index 0000000..dae941d
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start0.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start1.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start1.rsc
new file mode 100644
index 0000000..6076041
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start1.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start2.rsc b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start2.rsc
new file mode 100644
index 0000000..f89f581
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start2.rsc
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortCompilation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortCompilation.class
index 64b3904..ac24cfc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortCompilation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortCompilation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortCompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortCompilationUnit.class
index 3f279af..44d9c8d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortCompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortCompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortMethod.class
index 788847e..466d5a9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortType.class
index ee21fda..ea4962e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/AbortType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblem.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblem.class
index 3fc0cf6..60c5eb1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblem.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblem.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.class
index 9a466b9..fb412e3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.class
index e9a4304..fab3001 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.class
index 3638f48..1071f0a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemSeverities.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemSeverities.class
index c8df899..963a150 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemSeverities.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemSeverities.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ShouldNotImplement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ShouldNotImplement.class
index 898c7b5..dae3108 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ShouldNotImplement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ShouldNotImplement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/messages.properties b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/messages.properties
index d10aeb3..8dc1e3e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/messages.properties
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/problem/messages.properties
@@ -1,14 +1,10 @@
 ###############################################################################
-# Copyright (c) 2000, 2013 IBM Corporation and others.
+# Copyright (c) 2000, 2014 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
 #
-# This is an implementation of an early-draft specification developed under the Java
-# Community Process (JCP) and is made available for testing and evaluation purposes
-# only. The code is not compatible with any specification of the JCP.
-#
 #
 # Contributors:
 #     IBM Corporation - initial API and implementation
@@ -32,9 +28,21 @@
 #							bug 402028 - [1.8][compiler] null analysis for reference expressions
 #							bug 401796 - [1.8][compiler] don't treat default methods as overriding an independent inherited abstract method
 #							bug 404649 - [1.8][compiler] detect illegal reference to indirect or redundant super
+#							Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+#							Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+#							Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+#							Bug 416307 - [1.8][compiler][null] subclass with type parameter substitution confuses null checking
+#							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+#							Bug 424637 - [1.8][compiler][null] AIOOB in ReferenceExpression.resolveType with a method reference to Files::walk
+#							Bug 418743 - [1.8][null] contradictory annotations on invocation of generic method not reported
+#							Bug 416190 - [1.8][null] detect incompatible overrides due to null type annotations
+#							Bug 392245 - [1.8][compiler][null] Define whether / how @NonNullByDefault applies to TYPE_USE locations
 #		Jesper S Moller <jesper@selskabet.org> - Contributions for
 #							bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
 #							bug 384567 - [1.5][compiler] Compiler accepts illegal modifiers on package declaration
+#							Bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
+#							Bug 412151 - [1.8][compiler] Check repeating annotation's collection type
+#							Bug 419209 - [1.8] Repeating container annotations should be rejected in the presence of annotation it contains
 ###############################################################################
 0 = {0}
 1 = super cannot be used in java.lang.Object
@@ -49,19 +57,19 @@
 16 = Incompatible conditional operand types {0} and {1}
 17 = Type mismatch: cannot convert from {0} to {1}
 18 = The static member type {0}.{1} should be accessed directly
-
+19 = Type mismatch: cannot convert from {0} to {1}
 20 = No enclosing instance of type {0} is accessible to invoke the super constructor. Must define a constructor and explicitly qualify its super constructor invocation with an instance of {0} (e.g. x.super() where x is an instance of {0}).
 21 = No enclosing instance of type {0} is accessible. Must qualify the allocation with an enclosing instance of type {0} (e.g. x.new A() where x is an instance of {0}).
 22 = No enclosing instance of the type {0} is accessible in scope
 23 = Illegal enclosing instance specification for type {0}
 24 = Cannot define static initializer in inner type {0}
-25 = Cannot refer to the non-final variable {0} in a different method inside an inner class
-26 = The member interface {0} can only be defined inside a top-level class or interface
+25 = Cannot refer to the non-final local variable {0} defined in an enclosing scope
+26 = The member interface {0} can only be defined inside a top-level class or interface or in a static context
 27 = Cannot use an expression of the type {0} as a valid enclosing instance
 28 = No enclosing instance of type {0} is available due to some intermediate constructor invocation
 29 = An anonymous class cannot subclass the final class {0}
-30 = The member annotation {0} can only be defined inside a top-level class or interface
-31 = The member enum {0} can only be defined inside a top-level class or interface
+30 = The member annotation {0} can only be defined inside a top-level class or interface or in a static context
+31 = The member enum {0} can only be defined inside a top-level class or interface or in a static context
 32 = The member enum {0} must be defined inside a static member type
 33 = The type {0} is hiding the type {1}
 
@@ -108,8 +116,8 @@
 94 = The parameter {0} is hiding another local variable defined in an enclosing scope
 95 = The parameter {0} is hiding a field from type {1}
 96 = The serializable class {0} does not declare a static final serialVersionUID field of type long
-97 = Lambda expression's parameter {0} cannot redeclare another local variable defined in an enclosing scope. 
-98 = Lambda expression's local variable {0} cannot redeclare another local variable defined in an enclosing scope. 
+97 = Lambda expression''s parameter {0} cannot redeclare another local variable defined in an enclosing scope. 
+98 = Lambda expression''s local variable {0} cannot redeclare another local variable defined in an enclosing scope. 
 99 = The type {0} from the descriptor computed for the target context is not visible here.  
 100 = The method {1}({2}) is undefined for the type {0}
 101 = The method {1}({2}) from the type {0} is not visible
@@ -139,7 +147,7 @@
 125 = Incompatible parameter list for array constructor. Expected (int), but found ({1})
 126 = Constructed array {0} cannot be assigned to {1} as required in the interface descriptor  
 127 = The type {0} does not define {1}({2}) that is applicable here
-128 = The type of {0}({1}) from the type {2} is {3}, this is incompatible with the descriptor's return type: {4}
+128 = The type of {0}({1}) from the type {2} is {3}, this is incompatible with the descriptor''s return type: {4}
 129 = The constructor {0}({1}) refers to the missing type {2}
 130 = The constructor {0}({1}) is undefined
 131 = The constructor {0}({1}) is not visible
@@ -231,6 +239,7 @@
 223 = The left-hand side of an assignment must be a variable
 224 = Missing semicolon
 225 = Invalid parenthesized expression
+226 = super reference is illegal in interface context
 
 230 = Syntax error on token "{0}", {1} expected before this token
 231 = Syntax error on token "{0}", {1} expected after this token
@@ -266,6 +275,7 @@
 267 = Binary literals can only be used with source level 1.7 or greater
 268 = Underscores have to be located within digits
 269 = Underscores can only be used with source level 1.7 or greater
+271 = This lambda expression refers to the missing type {0}
 
 280 = Discouraged access: {0}
 
@@ -416,6 +426,7 @@
 441 = 'enum' should not be used as an identifier, since it is a reserved keyword from source level 1.5 on
 442 = Enum constants cannot be surrounded by parenthesis
 443 = '_' should not be used as an identifier, since it is a reserved keyword from source level 1.8 on
+444 = The uninterned types {0} and {1} should not be compared using ==/!= operators.
 
 450 = {0}{1}
 
@@ -499,7 +510,7 @@
 524 = The type {0} is not generic; it cannot be parameterized with arguments <{1}>
 525 = Incorrect number of arguments for type {0}; it cannot be parameterized with arguments <{1}>
 526 = Bound mismatch: The type {0} is not a valid substitute for the bounded parameter <{2} extends {3}> of the type {1}
-527 = Method {0}({2}) has the same erasure {0}({3}) as another method in type {1}
+527 = Erasure of method {0}({2}) is the same as another method in type {1}
 528 = Illegal forward reference to type parameter {0}
 529 = The type {0} is not an interface; it cannot be specified as a bounded parameter
 530 = Type safety: The constructor {0}({1}) belongs to the raw type {0}. References to generic type {2} should be parameterized
@@ -582,7 +593,7 @@
 605 = Invalid type {0} for the annotation attribute {2}.{1}; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof
 606 = Cycle detected: the annotation type {0} cannot contain attributes of the annotation type itself
 607 = Cycle detected: a cycle exists between annotation attributes of {0} and {1}
-608 = Duplicate annotation @{0}
+608 = Duplicate annotation @{0}. Repeated annotations are allowed only at source level 1.8 or above
 609 = The annotation @{0} must define the attribute {1}
 610 = Duplicate attribute {0} in annotation @{1}
 611 = The attribute {0} is undefined for the annotation type {1}
@@ -612,12 +623,12 @@
 635 = Unnecessary @SuppressWarnings("{0}")
 636 = The method {0}({1}) of type {2} should be tagged with @Override since it actually overrides a superinterface method
 637 = Syntax error, type annotations are available only when source level is at least 1.8
-638 = Explicit ''this'' parameter is allowed only in instance methods of non-anonymous classes and inner class constructors
+638 = Explicit 'this' parameter is allowed only in instance methods of non-anonymous classes and inner class constructors
 639 = Syntax error, type annotations are illegal here
 640 = Type annotations are not allowed on type names used to access static members
 641 = Type annotation is illegal for a method that returns void
-642 = Only the first formal parameter may be declared explicitly as ''this''
-643 = Explicit declaration of ''this'' parameter is allowed only at source level 1.8 or above
+642 = Only the first formal parameter may be declared explicitly as 'this'
+643 = Explicit declaration of 'this' parameter is allowed only at source level 1.8 or above
 644 = Default methods are allowed only at source level 1.8 or above
 645 = Lambda expressions are allowed only at source level 1.8 or above
 646 = Method references are allowed only at source level 1.8 or above
@@ -626,13 +637,13 @@
 649 = Annotation types that do not specify explicit target element types cannot be applied here
 650 = The declared type of the explicit ''this'' parameter is expected to be {0}
 651 = The explicit ''this'' parameter is expected to be qualified with {0}
-652 = The explicit ''this'' parameter for a method cannot have a qualifying name
+652 = The explicit 'this' parameter for a method cannot have a qualifying name
 653 = The target type of this expression must be a functional interface
 654 = The variable argument type {0} of the lambda expression must be the last parameter
 655 = The target type of this expression is not a well formed parameterized type due to bound(s) mismatch
-656 = Lambda expression's signature does not match the signature of the functional interface method
-657 = Lambda expression's parameter {0} is expected to be of type {1}
-658 = Incompatible type specified for lambda expression's parameter {0}
+656 = Lambda expression''s signature does not match the signature of the functional interface method {0}
+657 = Lambda expression''s parameter {0} is expected to be of type {1}
+658 = Incompatible type specified for lambda expression''s parameter {0}
 659 = Illegal lambda expression: Method {0} of type {1} is generic 
 ### MORE GENERICS
 660 = Unused type arguments for the non generic constructor {0}({1}) of type {2}; it should not be parameterized with arguments <{3}>
@@ -640,9 +651,10 @@
 
 ### MORE TYPE RELATED
 662 = Illegal attempt to create arrays of union types
-663 = Variable {0} is required to be final or effectively final
-664 = Invalid '@FunctionalInterface' annotation; {0} is not a functional interface
-665 = The constructed object of type {0} is incompatible with the descriptor's return type: {1}
+663 = Local variable {0} defined in an enclosing scope must be final or effectively final
+664 = Invalid ''@FunctionalInterface'' annotation; {0} is not a functional interface
+665 = The constructed object of type {0} is incompatible with the descriptor''s return type: {1}
+666 = Syntax error, type annotations are illegal here
 
 ### NULL ANALYSIS FOR OTHER EXPRESSIONS
 670 = Null comparison always yields false: this expression cannot be null
@@ -691,14 +703,15 @@
 
 ### VARARGS
 800 = Extended dimensions are illegal for a variable argument
-801 = The argument of type {0} should explicitly be cast to {1} for the invocation of the varargs method {2}({3}) from type {4}. It could alternatively be cast to {5} for a varargs invocation
-802 = The argument of type {0} should explicitly be cast to {1} for the invocation of the varargs constructor {2}({3}). It could alternatively be cast to {4} for a varargs invocation
+801 = Type {0} of the last argument to method {2}({3}) doesn''t exactly match the vararg parameter type. Cast to {1} to confirm the non-varargs invocation, or pass individual arguments of type {5} for a varargs invocation.
+802 = Type {0} of the last argument to constructor {2}({3}) doesn''t exactly match the vararg parameter type. Cast to {1} to confirm the non-varargs invocation, or pass individual arguments of type {4} for a varargs invocation.
 803 = Varargs methods should only override or be overridden by other varargs methods unlike {2}.{0}({1}) and {4}.{0}({3})
 804 = @SafeVarargs annotation cannot be applied to fixed arity method {0}
 805 = @SafeVarargs annotation cannot be applied to non-final instance method {0}
 806 = Type safety: Potential heap pollution via varargs parameter {0}
 807 = The method {0}({1}) of type {2} is not applicable as the formal varargs element type {3} is not accessible here
 808 = The constructor {0}({1}) of type {2} is not applicable as the formal varargs element type {3} is not accessible here
+809 = The method {0}({1}) of type {2} cannot be invoked as it is overridden by an inapplicable method
 
 ### GENERIC JAVADOC
 850 = Bound mismatch: The generic method {0}({1}) of type {2} is not applicable for the arguments ({3}). The inferred type {4} is not a valid substitute for the bounded parameter <{5} extends {6}>
@@ -743,22 +756,34 @@
 895 = The target type of this expression is not a functional interface: more than one of the intersecting interfaces are functional
 896 = Static methods are allowed in interfaces only at source level 1.8 or above
 
+897 = Duplicate annotation of non-repeatable type @{0}. Only annotation types marked @Repeatable can be used multiple times at one target.
+898 = The annotation @{0} cannot be repeated at this location since its container annotation type @{1} is disallowed at this location
+899 = The repeatable annotation @{0} may not be repeated where its container annotation type @{1} is also used directly
+902 = The value method in the container annotation type @{0} must be of type {1}[] but is {2}
+903 = The container annotation type @{0} must declare a member value()
+904 = The container annotation type @{0} must declare a default value for the annotation attribute ''{1}''
+905 = Retention ''{1}'' of @{0} is longer than the retention of its container annotation type @{2}, which is ''{3}''
+906 = The container annotation type @{1} is allowed at targets where the repeatable annotation type @{0} is not: {2}
+907 = The repeatable annotation type @{0} is marked @Documented, but its container annotation type @{1} is not
+908 = The repeatable annotation type @{0} is marked @Inherited, but its container annotation type @{1} is not
+909 = The repeatable annotation @{0} may not be present where its container annotation type @{1} is repeated
+
 ### NULL ANNOTATIONS
 910 = Null type mismatch: required ''{0}'' but the provided value is null
 911 = Null type mismatch: required ''{0}'' but the provided value is inferred as @{1}
-912 = Null type safety: The expression of type {0} needs unchecked conversion to conform to ''{1}''
+912 = Null type safety: The expression of type ''{0}'' needs unchecked conversion to conform to ''{1}''
 913 = A default nullness annotation has not been specified for the package {0}
 914 = The return type is incompatible with the @{1} return from {0}
 915 = Illegal redefinition of parameter {0}, inherited method from {1} declares this parameter as @{2}
 916 = Illegal redefinition of parameter {0}, inherited method from {1} does not constrain this parameter
-917 = Missing non-null annotation: inherited method from {0} declares this parameter as @{1}
-918 = Missing nullable annotation: inherited method from {0} declares this parameter as @{1}
+917 = Missing non-null annotation: inherited method from {0} specifies this parameter as @{1}
+918 = Missing nullable annotation: inherited method from {0} specifies this parameter as @{1}
 919 = Potential null pointer access: The method {0} may return null
 920 = Redundant null check: The method {0} cannot return null
-921 = The method {0} from {1} cannot implement the corresponding method from {2} due to incompatible nullness constraints
+921 = The method {0}{1}({2}) from {3} cannot implement the corresponding method from {4} due to incompatible nullness constraints
 922 = The nullness annotation is redundant with a default that applies to this location
 923 = The nullness annotation @{0} is not applicable for the primitive type {1}
-924 = Potential null pointer access: The field {0} is declared as @{1}
+924 = Potential null pointer access: The field {0} is specified as @{1}
 925 = Nullness default is redundant with the global default
 926 = Nullness default is redundant with a default specified for the enclosing package {0}
 927 = Nullness default is redundant with a default specified for the enclosing type {0}
@@ -771,23 +796,36 @@
 934 = The @{0} field {1} may not have been initialized
 935 = The @{0} field {1} may not have been initialized. Note that a problem regarding missing ''default:'' on ''switch'' has been suppressed, which is perhaps related to this problem
 936 = Null comparison always yields false: The method {0} cannot return null
-937 = Redundant null check: The field {0} is declared as @{1}
-938 = Null comparison always yields false: The field {0} is declared as @{1}
+937 = Redundant null check: The field {0} is specified as @{1}
+938 = Null comparison always yields false: The field {0} is specified as @{1}
 939 = The default ''@{0}'' conflicts with the inherited ''@{1}'' annotation in the overridden method from {2} 
 940 = Conflict between inherited null annotations ''@{0}'' declared in {1} versus ''@{2}'' declared in {3} 
+941 = Redundant null check: The field {0} cannot be null at this location (ignoring concurrency)
+942 = Null comparison always yields false: The field {0} cannot be null at this location (ignoring concurrency)
 
 951 = Potential null pointer access: array element may be null
 952 = Potential null pointer access: this expression has a ''@{0}'' type
 953 = Null type mismatch (type annotations): required ''{0}'' but this expression has type ''{1}''
-954 = Null type mismatch (type annotations): the expression of type ''{1}'' needs unchecked conversion to conform to ''{0}''
-955 = Null type mismatch at parameter {0}: required ''{1}{2}'' but provided ''@{3} {4}'' via method descriptor {5}
-956 = Null type safety: parameter {0} provided via method descriptor {1} needs unchecked conversion to conform to ''@{2} {3}''
-957 = Null type mismatch at method return type: Method descriptor {0} promises ''@{1} {2}'' but referenced method provides ''{3}{4}''
-958 = Null type safety at method return type: Method descriptor {0} promises ''@{1} {2}'' but referenced method provides ''{3}{4}''
+954 = Null type mismatch (type annotations): required ''{0}'' but this expression has type ''{1}'', corresponding supertype is ''{2}''
+955 = Null type safety (type annotations): The expression of type ''{1}'' needs unchecked conversion to conform to ''{0}''
+956 = Null type safety (type annotations): The expression of type ''{1}'' needs unchecked conversion to conform to ''{0}'', corresponding supertype is ''{2}''
+957 = Null type mismatch at parameter {0}: required ''{1}'' but provided ''{2}'' via method descriptor {3}
+958 = Null type safety: parameter {0} provided via method descriptor {3} needs unchecked conversion to conform to ''{1}''
+959 = Null type mismatch at method return type: Method descriptor {0} promises ''@{1} {2}'' but referenced method provides ''{3}{4}''
+960 = Null type safety at method return type: Method descriptor {0} promises ''@{1} {2}'' but referenced method provides ''{3}{4}''
+961 = Redundant null check: comparing ''{0}'' against null
+962 = The nullness annotation ''{0}'' is not applicable at this location
+963 = Nullness annotations are not applicable at this location 
+964 = Null constraint mismatch: The type ''{2}'' is not a valid substitute for the type parameter ''{0}'' which is constrained as ''@{1}''
+965 = This nullness annotation conflicts with a ''@{0}'' annotation which is effective on the same type parameter 
+966 = Contradictory null annotations: method was inferred as ''{2} {3}({4})'', but only one of ''@{0}'' and ''@{1}'' can be effective at any location
+967 = Null type safety: Unchecked cast from {0} to {1}
+968 = Arguments controling the details of the nullness default are not yet evaluated by the analysis.
 
 # Java 8
 1001 = Syntax error, modifiers and annotations are not allowed for the lambda parameter {0} as its type is elided
 1002 = Syntax error, modifiers are not allowed here
+1003 = Explicit type arguments cannot be specified in raw constructor reference expression
 
 # Default methods:
 # variant of 359: 
@@ -799,6 +837,10 @@
 1055 = Illegal reference to super method {0} from type {1}, cannot bypass the more specific override from type {2}
 1056 = Illegal combination of modifiers for the interface method {0}; only one of abstract, default, or static permitted
 1057 = strictfp is not permitted for abstract interface method {0}
+1058 = Default methods are allowed only in interfaces with source level 1.8 or greater.
+
+1100 = Problem detected during type inference: {0}
+1101 = (Recovered) Internal inconsistency detected during lambda shape analysis
 
 ### ELABORATIONS
 ## Access restrictions
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/CompoundNameVector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/CompoundNameVector.class
index d74bb51..dbef3ad 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/CompoundNameVector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/CompoundNameVector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/FloatUtil.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/FloatUtil.class
index 83cefb3..a10d291 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/FloatUtil.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/FloatUtil.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter$1.class
index fb7f56c..ec1384f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter.class
index 443d910..ed9f712 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashSetOfInt.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashSetOfInt.class
index 1789ab7..13a1aec 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashSetOfInt.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashSetOfInt.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfInt.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfInt.class
index 6e8e6b5..83cddef 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfInt.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfInt.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfIntValues.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfIntValues.class
index b24fde7..e7699fb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfIntValues.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfIntValues.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfLong.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfLong.class
index 2515897..30b9cca 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfLong.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfLong.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObject.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObject.class
index 7171b04..6da0622 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObject.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObject.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObjectToInt.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObjectToInt.class
index 222c7c2..58f0fe7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObjectToInt.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObjectToInt.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObjectToIntArray.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObjectToIntArray.class
index f4b4e2b..c07f13f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObjectToIntArray.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfObjectToIntArray.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfPackage.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfPackage.class
index 745f48b..0475c40 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfPackage.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfPackage.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfType.class
index c686f7a..42f8517 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/ManifestAnalyzer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/ManifestAnalyzer.class
index 982ce7c..e3bd3d6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/ManifestAnalyzer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/ManifestAnalyzer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages$MessagesProperties.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages$MessagesProperties.class
index f1120a2..2bdf7eb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages$MessagesProperties.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages$MessagesProperties.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages.class
index e07ddff..91d737e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/ObjectVector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/ObjectVector.class
index 9204bce..9583f0b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/ObjectVector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/ObjectVector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleLookupTable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleLookupTable.class
index 916e4e0..e05231e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleLookupTable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleLookupTable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleNameVector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleNameVector.class
index f8562cb..7e8a4a8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleNameVector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleNameVector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleSet.class
index b46262c..bb3e86d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleSetOfCharArray.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleSetOfCharArray.class
index 0c80f27..2e54602 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleSetOfCharArray.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SimpleSetOfCharArray.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting$1.class
new file mode 100644
index 0000000..eb54e8c
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting.class
index 6a9079f..bd5df44 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SuffixConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SuffixConstants.class
index eef5bdb..fadb306 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SuffixConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/SuffixConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util$1.class
index ea0bb9e..c1fb55c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util$Displayable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util$Displayable.class
index 88c4ab1..159c13a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util$Displayable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util$Displayable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util.class
index 328f449..a3c811e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ASTHolderCUInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ASTHolderCUInfo.class
index 24aa28a..d90e271 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ASTHolderCUInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ASTHolderCUInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/AnnotatableInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/AnnotatableInfo.class
index b3288d0..f1acdb7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/AnnotatableInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/AnnotatableInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Annotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Annotation.class
index 8632a3a..11cc381 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Annotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Annotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/AnnotationInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/AnnotationInfo.class
index 813ce78..ae941e6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/AnnotationInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/AnnotationInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BasicCompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BasicCompilationUnit.class
index 1ef7517..6bc7d3c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BasicCompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BasicCompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BatchInitializationMonitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BatchInitializationMonitor.class
index ae97638..11a7723 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BatchInitializationMonitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BatchInitializationMonitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BatchOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BatchOperation.class
index 46a3f89..294c8f2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BatchOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BatchOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BecomeWorkingCopyOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BecomeWorkingCopyOperation.class
index 3b84965..026142e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BecomeWorkingCopyOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BecomeWorkingCopyOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryField.class
index 7288008..f9764d0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMember.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMember.class
index 69e8620..902daec 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMember.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMember.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod$1.class
index 3719d25..6c853e5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod$1ParametersNameCollector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod$1ParametersNameCollector.class
index d1541e2..72da329 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod$1ParametersNameCollector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod$1ParametersNameCollector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod.class
index cd84e69..b1c90d2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryType.class
index 3bba272..c756cc7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryTypeConverter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryTypeConverter.class
index cb055d0..50025dc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryTypeConverter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BinaryTypeConverter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Buffer$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Buffer$1.class
index fc0e4b0..6dcd456 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Buffer$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Buffer$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Buffer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Buffer.class
index a879c79..1889062 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Buffer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Buffer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferCache.class
index 3a105ce..b78696c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferFactoryWrapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferFactoryWrapper.class
index d1bb141..43c84b4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferFactoryWrapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferFactoryWrapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferManager$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferManager$1.class
index 287a22b..d7d9c33 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferManager$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferManager$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferManager.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferManager.class
index 2f371e8..5358f7e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferManager.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/BufferManager.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CancelableNameEnvironment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CancelableNameEnvironment.class
index 1502b95..e950b17 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CancelableNameEnvironment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CancelableNameEnvironment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CancelableProblemFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CancelableProblemFactory.class
index 5010356..9ddcc36 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CancelableProblemFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CancelableProblemFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ChangeClasspathOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ChangeClasspathOperation.class
index 5ecb854..144132c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ChangeClasspathOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ChangeClasspathOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFile$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFile$1.class
index 8c1d89b..06601a5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFile$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFile$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFile.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFile.class
index a0bccbb..464692e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFile.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFile.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo$1.class
index 7fdf1fd..c3cdfb9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo$2.class
index 1bfe554..9742d84 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo.class
index 617e881..1a4291a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileWorkingCopy.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileWorkingCopy.class
index 052af0a..8f55941 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileWorkingCopy.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClassFileWorkingCopy.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathAccessRule.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathAccessRule.class
index c16dd18..21d98e8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathAccessRule.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathAccessRule.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathAttribute.class
index c2a5a85..eba9edb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathChange.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathChange.class
index befe729..37be9b7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathChange.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathChange.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$1.class
index e4dde7d..0db7e14 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$AssertionFailedException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$AssertionFailedException.class
index 8a947cf..0d9fa11 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$AssertionFailedException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$AssertionFailedException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$UnknownXmlElements.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$UnknownXmlElements.class
index e182bbc..07d7c5c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$UnknownXmlElements.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry$UnknownXmlElements.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry.class
index fd7c0b0..a0068db 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathValidation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathValidation.class
index c1e67e3..f756866 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathValidation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ClasspathValidation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CommitWorkingCopyOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CommitWorkingCopyOperation.class
index ab4e850..adb08af 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CommitWorkingCopyOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CommitWorkingCopyOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$1.class
index 1deb09b..17b3239 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$2.class
index 78b79df..8a8504d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$3.class
index 56c2498..5ee1fa9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit.class
index 50ec8cc..a4545ac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitElementInfo.class
index 591703e..acb4897 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder$1.class
index bf8614c..6229a25 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder.class
index ef20e51..90dcfaa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor$1.class
index 5424193..60fea6c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.class
index 66bff7f..88836e1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyElementsOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyElementsOperation.class
index 441bc01..7709663 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyElementsOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyElementsOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyPackageFragmentRootOperation$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyPackageFragmentRootOperation$1.class
index b6bc04b..4e56faf 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyPackageFragmentRootOperation$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyPackageFragmentRootOperation$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyPackageFragmentRootOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyPackageFragmentRootOperation.class
index f22c116..938ee25 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyPackageFragmentRootOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyPackageFragmentRootOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyResourceElementsOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyResourceElementsOperation.class
index 2d805c8..edacd7f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyResourceElementsOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CopyResourceElementsOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateCompilationUnitOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateCompilationUnitOperation.class
index 205697f..3fa5b5d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateCompilationUnitOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateCompilationUnitOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateElementInCUOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateElementInCUOperation.class
index f9d753d..8c5095e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateElementInCUOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateElementInCUOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateFieldOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateFieldOperation.class
index 00f8044..faa7035 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateFieldOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateFieldOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateImportOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateImportOperation.class
index f79cc7a..b0eddfe 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateImportOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateImportOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateInitializerOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateInitializerOperation.class
index 7ecc42b..92f2483 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateInitializerOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateInitializerOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateMethodOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateMethodOperation.class
index cc6b8f2..c11dc28 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateMethodOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateMethodOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageDeclarationOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageDeclarationOperation.class
index 87d2e47..7425118 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageDeclarationOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageDeclarationOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageFragmentOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageFragmentOperation.class
index 1edd954..1e0a0a0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageFragmentOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageFragmentOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeHierarchyOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeHierarchyOperation.class
index f49349d..55786a8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeHierarchyOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeHierarchyOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeMemberOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeMemberOperation.class
index a7b1ba9..117dc78 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeMemberOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeMemberOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeOperation.class
index f1b3922..f4a941a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DefaultWorkingCopyOwner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DefaultWorkingCopyOwner.class
index dd322af..88cfe97 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DefaultWorkingCopyOwner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DefaultWorkingCopyOwner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeleteElementsOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeleteElementsOperation.class
index 4bfa8a4..c8bde4e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeleteElementsOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeleteElementsOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation$1.class
index 879972c..569a20e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation.class
index 1261ef2..5388abd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeleteResourceElementsOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeleteResourceElementsOperation.class
index 833fc5e..0419df7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeleteResourceElementsOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeleteResourceElementsOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState$1.class
index 903aae9..93ec360 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState.class
index 06d8b7d..7a82f2f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$1.class
index d46fa0e..b9412a1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$1FoundRelevantDeltaException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$1FoundRelevantDeltaException.class
index ab6399d..41b739e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$1FoundRelevantDeltaException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$1FoundRelevantDeltaException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$2.class
index 469f644..8dcf7a7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$3.class
index 90a36af..6fb62f7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$4.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$4.class
index 48279e0..46da860 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$5.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$5.class
index c70de13..a742615 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$5.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$5.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$OutputsInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$OutputsInfo.class
index 688e915..9c3ac9a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$OutputsInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$OutputsInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$RootInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$RootInfo.class
index b54bd99..f342c4a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$RootInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor$RootInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor.class
index 1375159..2474ee4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DiscardWorkingCopyOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DiscardWorkingCopyOperation.class
index 8b2fdd3..4187137 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DiscardWorkingCopyOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DiscardWorkingCopyOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DocumentAdapter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DocumentAdapter.class
index 4fb394f..a2f3d54 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DocumentAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/DocumentAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ElementCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ElementCache.class
index d8b407f..c71f35e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ElementCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ElementCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFolderChange.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFolderChange.class
index 43e9a07..8871bc3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFolderChange.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFolderChange.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager$RefreshJob.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager$RefreshJob.class
index 6810f2b..5ec50a3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager$RefreshJob.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager$RefreshJob.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager.class
index de257bc..8fd9e6a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalJavaProject.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalJavaProject.class
index 9d5d9e5..382d0d5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalJavaProject.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalJavaProject.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalPackageFragmentRoot.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalPackageFragmentRoot.class
index 4279fe7..3bb136a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalPackageFragmentRoot.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ExternalPackageFragmentRoot.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/IJavaElementRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/IJavaElementRequestor.class
index 4310d03..7d29455 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/IJavaElementRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/IJavaElementRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/INameEnvironmentWithProgress.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/INameEnvironmentWithProgress.class
index 210dda8..dea41c2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/INameEnvironmentWithProgress.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/INameEnvironmentWithProgress.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/INamingRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/INamingRequestor.class
index 57510aa..ca92a71 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/INamingRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/INamingRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/IPathRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/IPathRequestor.class
index 0e91f3b..3a29fdb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/IPathRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/IPathRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportContainer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportContainer.class
index f48d5c9..6332ea2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportContainer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportContainer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportContainerInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportContainerInfo.class
index 7487348..92792e2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportContainerInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportContainerInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportDeclaration.class
index 6a3b253..8f958e9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportDeclarationElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportDeclarationElementInfo.class
index 5dd11b7..0d906e8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportDeclarationElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ImportDeclarationElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Initializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Initializer.class
index 9d96c79..d4516d5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Initializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Initializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InitializerElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InitializerElementInfo.class
index 0790679..61d04af 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InitializerElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InitializerElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InitializerWithChildrenInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InitializerWithChildrenInfo.class
index 2dc997c..cd7b1b5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InitializerWithChildrenInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InitializerWithChildrenInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InternalNamingConventions.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InternalNamingConventions.class
index aad4e24..ee418f9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InternalNamingConventions.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/InternalNamingConventions.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryDirectory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryDirectory.class
index 309026a..0a40e3d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryDirectory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryDirectory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryFile.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryFile.class
index 8ba2728..439268a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryFile.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryFile.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryResource.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryResource.class
index 3e6b1de..123255b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryResource.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarEntryResource.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragment.class
index 5f4b38e..d0c8215 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentInfo.class
index f6351c7..2cf4ee1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.class
index aa08e43..1c8ed8e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRootInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRootInfo.class
index 0a4d42f..77e6f96 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRootInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRootInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.class
index ee995e5..2812f75 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceModifyListener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceModifyListener.class
index 886bd71..1ba450c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceModifyListener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceModifyListener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElement$1NoResourceSchedulingRule.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElement$1NoResourceSchedulingRule.class
index 59b7677..cd0605d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElement$1NoResourceSchedulingRule.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElement$1NoResourceSchedulingRule.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElement.class
index f55488a..62203c2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDelta.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDelta.class
index 0fc9439..42c90cb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDelta.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDelta.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder$ListItem.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder$ListItem.class
index ccfb5a2..c95c8d2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder$ListItem.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder$ListItem.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder.class
index 1b540d4..f669a7c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementInfo.class
index fdde594..5c17f12 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementRequestor.class
index ca5a959..d3b49a1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaElementRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModel.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModel.class
index 868d531..90b59a7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModel.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModel.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelCache.class
index 42355c9..88a41f7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelInfo.class
index 00c16ba..4ba17c8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$1.class
index 45d9765..2328000 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$10.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$10.class
index a8f6005..50d0364 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$10.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$10.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$11.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$11.class
index ebe44ba..834d45b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$11.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$11.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$12.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$12.class
index 4dbd0dd..646ba92 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$12.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$12.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$13.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$13.class
index 5649005..64a0df1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$13.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$13.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$14.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$14.class
index e655938..147c831 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$14.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$14.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$15.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$15.class
index 255254b..cc5df7d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$15.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$15.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$16.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$16.class
index fcadd52..a9a1fea 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$16.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$16.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$17$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$17$1.class
index 0902d45..a305b0a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$17$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$17$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$17.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$17.class
index 09e4a19..6e4d2e0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$17.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$17.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$2.class
index 7605145..d445095 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$3.class
index e1a078f..69f1f81 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$4.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$4.class
index 42ad0ce..7655d16 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$5.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$5.class
index b5e1cef..f86488b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$5.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$5.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$6.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$6.class
index 0e9d5d3..ccd5245 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$6.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$6.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$7.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$7.class
index 278b5a3..8d39a57 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$7.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$7.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$8.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$8.class
index f22cd7c..41e4017 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$8.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$8.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$9.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$9.class
index 8f25e08..76c4dee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$9.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$9.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants$1.class
index 8626d0c..d87fbcb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants$2.class
index 99b5141..49e4b65 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants.class
index e4aee4c..e381b1d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$CompilationParticipants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$EclipsePreferencesListener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$EclipsePreferencesListener.class
index 5461455..b1c61be 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$EclipsePreferencesListener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$EclipsePreferencesListener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PerProjectInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PerProjectInfo.class
index 4d8a009..046ce7b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PerProjectInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PerProjectInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PerWorkingCopyInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PerWorkingCopyInfo.class
index 5eb0fa7..950f6e6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PerWorkingCopyInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PerWorkingCopyInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PersistedClasspathContainer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PersistedClasspathContainer.class
index 3d5ae82..00f0bd7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PersistedClasspathContainer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$PersistedClasspathContainer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$VariablesAndContainersLoadHelper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$VariablesAndContainersLoadHelper.class
index cdc7de9..d0f4d74 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$VariablesAndContainersLoadHelper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$VariablesAndContainersLoadHelper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$VariablesAndContainersSaveHelper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$VariablesAndContainersSaveHelper.class
index 4b459be..c2749a9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$VariablesAndContainersSaveHelper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$VariablesAndContainersSaveHelper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$ZipCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$ZipCache.class
index f342099..9005173 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$ZipCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager$ZipCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager.class
index 96b3cd8..2533055 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation$IPostAction.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation$IPostAction.class
index 8395d36..11f06ca 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation$IPostAction.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation$IPostAction.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation.class
index 48c3e1b..2ba0ba8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelStatus.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelStatus.class
index fe618af..3eed659 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelStatus.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaModelStatus.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$1.class
index 267fda7..381d666 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$2.class
index bd5e70e..0a5f8c4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$3.class
index 225e704..c58c5c5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$ClasspathResolutionBreakpointListener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$ClasspathResolutionBreakpointListener.class
index 71398be..4f01748 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$ClasspathResolutionBreakpointListener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$ClasspathResolutionBreakpointListener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$ResolvedClasspath.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$ResolvedClasspath.class
index 2aaf73d..cb8cc54 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$ResolvedClasspath.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject$ResolvedClasspath.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject.class
index 0f20419..c20b511 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProject.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo$ProjectCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo$ProjectCache.class
index 1c23d61..80c0d2b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo$ProjectCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo$ProjectCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo.class
index 91e676d..a9b1362 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavadocConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavadocConstants.class
index 5d2683d..415a9c1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavadocConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavadocConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavadocContents.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavadocContents.class
index 4f79301..950d805 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavadocContents.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/JavadocContents.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator$LRUEnumeratorElement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator$LRUEnumeratorElement.class
index e32a74d..7901dc2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator$LRUEnumeratorElement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator$LRUEnumeratorElement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator.class
index c7c2d44..f35e773 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LambdaExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LambdaExpression.class
new file mode 100644
index 0000000..e5f87e6
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LambdaExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LambdaMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LambdaMethod.class
new file mode 100644
index 0000000..1c2683f
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LambdaMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable$1LocalVarAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable$1LocalVarAnnotation.class
index d1c442a..d24f53a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable$1LocalVarAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable$1LocalVarAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable.class
index d5fc6d2..dfc8ad1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Member.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Member.class
index 001b070..39f7060 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Member.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Member.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MemberElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MemberElementInfo.class
index 010f071..8005d02 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MemberElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MemberElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MemberValuePair.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MemberValuePair.class
index 20b480d..9de9b51 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MemberValuePair.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MemberValuePair.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ModelUpdater.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ModelUpdater.class
index 81a2737..73e3f9b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ModelUpdater.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ModelUpdater.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MoveElementsOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MoveElementsOperation.class
index 3fceef4..44e6b82 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MoveElementsOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MoveElementsOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MovePackageFragmentRootOperation$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MovePackageFragmentRootOperation$1.class
index 135d30c..75dddf5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MovePackageFragmentRootOperation$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MovePackageFragmentRootOperation$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MovePackageFragmentRootOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MovePackageFragmentRootOperation.class
index 6a549eb..cb39d05 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MovePackageFragmentRootOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MovePackageFragmentRootOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MoveResourceElementsOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MoveResourceElementsOperation.class
index a9cc451..1414450 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MoveResourceElementsOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MoveResourceElementsOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MultiOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MultiOperation.class
index d1b72bf..75c82cb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MultiOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/MultiOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NameLookup$Answer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NameLookup$Answer.class
index 52dee8c..ff46cff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NameLookup$Answer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NameLookup$Answer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NameLookup.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NameLookup.class
index b55f1fe..75e0f07 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NameLookup.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NameLookup.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NamedMember$1TypeResolveRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NamedMember$1TypeResolveRequestor.class
index ecd6c05..5594a1f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NamedMember$1TypeResolveRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NamedMember$1TypeResolveRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NamedMember.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NamedMember.class
index 9e55a29..e14f5bd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NamedMember.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NamedMember.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NonJavaResource.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NonJavaResource.class
index 0eb33cf..a378793 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NonJavaResource.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NonJavaResource.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NullBuffer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NullBuffer.class
index 4389824..bba0ef8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NullBuffer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/NullBuffer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Openable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Openable.class
index 5404caa..9fdb8bf 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Openable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Openable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OpenableElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OpenableElementInfo.class
index 3fae5bb..7a8c94d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OpenableElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OpenableElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache$1Temp.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache$1Temp.class
index 9d76a8b..0547edf 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache$1Temp.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache$1Temp.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache.class
index ace4487..c5e0f8d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageDeclaration.class
index 2fa978d..6f585ee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragment.class
index 4daa114..d32851c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentInfo.class
index 84e6266..450859e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRoot.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRoot.class
index b328eb5..468206e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRoot.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRoot.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.class
index 4d7bdf6..93078ba 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange$1.class
index c32f330..0161f06 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange.class
index 7579c9b..350b807 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation$1.class
index d18e88b..4cb0955 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation.class
index 77a9db5..bf5b0a3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Region.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Region.class
index 1959b33..5eeb33c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Region.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/Region.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/RenameElementsOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/RenameElementsOperation.class
index a20481c..9727990 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/RenameElementsOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/RenameElementsOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/RenameResourceElementsOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/RenameResourceElementsOperation.class
index e6cbb66..cb322ef 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/RenameResourceElementsOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/RenameResourceElementsOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryField.class
index d087315..9842bbc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryMethod.class
index ed2d67f..dc02af3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryType.class
index f88ceee..f669bb0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedBinaryType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedLambdaExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedLambdaExpression.class
new file mode 100644
index 0000000..d26a71b
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedLambdaExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceField.class
index 24ddff0..a8d3a46 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceMethod.class
index 8e5feb8..e71cc6e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceType.class
index 91859ca..d60c790 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/ResolvedSourceType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$1.class
index 4bb2902..65f117a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$2.class
index bf32742..42cd141 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$3.class
index 8353ec5..625064c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$4.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$4.class
index 53073c6..2b968a8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$5.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$5.class
index 5919b99..b5a59a6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$5.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$5.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$6.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$6.class
index 358321a..ff7f38b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$6.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment$6.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment.class
index b7c94a1..d33f542 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironmentRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironmentRequestor.class
index 3c99aa9..c2330fa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironmentRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SearchableEnvironmentRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SelectionRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SelectionRequestor.class
index 872eac5..6b99be8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SelectionRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SelectionRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetClasspathOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetClasspathOperation.class
index 53010ba..4e32bc1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetClasspathOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetClasspathOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation$1.class
index 28a1fc8..8045a6e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation$2.class
index 81827b5..42ab8e7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation.class
index ee8c81c..c2ebf4a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetContainerOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetVariablesOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetVariablesOperation.class
index 95d8cfd..a0ab1e1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetVariablesOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SetVariablesOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SimpleDelta.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SimpleDelta.class
index 9bf2e2c..01b4d4b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SimpleDelta.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SimpleDelta.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SingleTypeRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SingleTypeRequestor.class
index 1f3dee0..7b542e4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SingleTypeRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SingleTypeRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation$1.class
index b0342b7..3bc74a7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation$2.class
index 4615e46..1efc66d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation.class
index 715235d..c97b3c8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceAnnotationMethodInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceAnnotationMethodInfo.class
index 87c38fd..b84dfe4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceAnnotationMethodInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceAnnotationMethodInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceConstructorInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceConstructorInfo.class
index c08093d..967bdda 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceConstructorInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceConstructorInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceConstructorWithChildrenInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceConstructorWithChildrenInfo.class
index 5e7c9e6..95654e7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceConstructorWithChildrenInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceConstructorWithChildrenInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceField.class
index 5bfad9e..6f65f9f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceFieldElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceFieldElementInfo.class
index f029042..ebb85e6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceFieldElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceFieldElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceFieldWithChildrenInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceFieldWithChildrenInfo.class
index d2944e1..539b10b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceFieldWithChildrenInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceFieldWithChildrenInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper$1.class
index 2e0a35d..5da75f2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper$LocalVariableElementKey.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper$LocalVariableElementKey.class
index c74a118..433b8d8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper$LocalVariableElementKey.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper$LocalVariableElementKey.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper.class
index 55d39bf..270cedd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethod.class
index 51209e1..6b944a4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodElementInfo.class
index ba22ee1..bd94764 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodInfo.class
index 79c6285..5b1f9e0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodWithChildrenInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodWithChildrenInfo.class
index 8b67984..da16eb3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodWithChildrenInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceMethodWithChildrenInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceRefElement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceRefElement.class
index 37737d6..0f38af4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceRefElement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceRefElement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceRefElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceRefElementInfo.class
index ab4a8b9..ae2e817 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceRefElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceRefElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceType.class
index 75aa08d..626afb1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceTypeElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceTypeElementInfo.class
index 997291b..d53a30a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceTypeElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/SourceTypeElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeParameter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeParameter.class
index 5008c93..f604cff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeParameter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeParameter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeParameterElementInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeParameterElementInfo.class
index 8f545dc..aa069f0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeParameterElementInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeParameterElementInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeVector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeVector.class
index c727371..219a113 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeVector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/TypeVector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibrary.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibrary.class
index fc66a1e..dd71fa5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibrary.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibrary.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryClasspathContainer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryClasspathContainer.class
index 69a12cd..f8bba7c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryClasspathContainer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryClasspathContainer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryClasspathContainerInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryClasspathContainerInitializer.class
index f9cd207..e2e2f5d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryClasspathContainerInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryClasspathContainerInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryManager.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryManager.class
index 5d857be..71a50ac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryManager.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryManager.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/VerboseElementCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/VerboseElementCache.class
index 784d2bd..4392d16 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/VerboseElementCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/VerboseElementCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/XMLWriter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/XMLWriter.class
index 3c94110..717d646 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/XMLWriter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/XMLWriter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbortIncrementalBuildException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbortIncrementalBuildException.class
index 4cbabb2..743dc77 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbortIncrementalBuildException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbortIncrementalBuildException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder$1.class
index b6712cf..12f6505 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder.class
index 0bd45bd..8eb6c2b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AdditionalTypeCollection.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AdditionalTypeCollection.class
index 1f85720..378551d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AdditionalTypeCollection.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/AdditionalTypeCollection.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$1.class
index 27975c7..8eb2a86 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$2.class
index 9ba8592..96686f7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$3.class
index 6b1415a..4025402 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder.class
index 112c5ca..7a5e39e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BuildNotifier.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BuildNotifier.class
index f24c29a..5f1d5d7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BuildNotifier.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/BuildNotifier.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.class
index 5424984..6c0e454 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar$PackageCacheEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar$PackageCacheEntry.class
index bf709b6..91a72d7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar$PackageCacheEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar$PackageCacheEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar.class
index 7291e29..5901667 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathLocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathLocation.class
index ecf5ecb..28bc389 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathLocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathLocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.class
index e4e6410..38363b3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/CompilationParticipantResult.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/CompilationParticipantResult.class
index c4ec709..925eff9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/CompilationParticipantResult.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/CompilationParticipantResult.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ICompilationUnitLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ICompilationUnitLocator.class
index 0d7d2c6..c1d87e0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ICompilationUnitLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ICompilationUnitLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ImageBuilderInternalException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ImageBuilderInternalException.class
index 8495126..d446cb0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ImageBuilderInternalException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ImageBuilderInternalException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/IncrementalImageBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/IncrementalImageBuilder.class
index 7352f9b..777a824 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/IncrementalImageBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/IncrementalImageBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/JavaBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/JavaBuilder.class
index 069e42d..a88cab7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/JavaBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/JavaBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/MissingSourceFileException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/MissingSourceFileException.class
index 157b550..4611f37 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/MissingSourceFileException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/MissingSourceFileException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/NameEnvironment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/NameEnvironment.class
index ae7531b..fc1ce37 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/NameEnvironment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/NameEnvironment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/NameSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/NameSet.class
index 4a05203..a4df4e5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/NameSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/NameSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ProblemFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ProblemFactory.class
index 81c821d..c8365c6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ProblemFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ProblemFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/QualifiedNameSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/QualifiedNameSet.class
index 435cd2c..4080fdc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/QualifiedNameSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/QualifiedNameSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ReferenceCollection.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ReferenceCollection.class
index 1b8dc4a..ad6bb10 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ReferenceCollection.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/ReferenceCollection.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/SourceFile.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/SourceFile.class
index 63ad7b3..b19f19d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/SourceFile.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/SourceFile.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/State.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/State.class
index 85c82ba..3761813 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/State.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/State.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/StringSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/StringSet.class
index 10ec6c6..68a4c7c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/StringSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/StringSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/WorkQueue.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/WorkQueue.class
index d68ca9f..96da014 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/WorkQueue.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/builder/WorkQueue.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.class
index c931795..bd570f3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/SourceRangeVerifier.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/SourceRangeVerifier.class
index 78829a7..a29b3b2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/SourceRangeVerifier.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/SourceRangeVerifier.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$IASTRewriteAnalyzerFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$IASTRewriteAnalyzerFactory.class
index 91c8201..fcb2742 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$IASTRewriteAnalyzerFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$IASTRewriteAnalyzerFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ListRewriter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ListRewriter.class
index fb216a6..4224483 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ListRewriter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ListRewriter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ModifierRewriter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ModifierRewriter.class
index eb16281..cafee62 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ModifierRewriter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ModifierRewriter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ParagraphListRewriter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ParagraphListRewriter.class
index e1f6eda..4ad854d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ParagraphListRewriter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$ParagraphListRewriter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$SwitchListRewriter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$SwitchListRewriter.class
index 4c20396..45e2621 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$SwitchListRewriter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer$SwitchListRewriter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.class
index 537c2d7..224f946 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.class
index 2f72af7..60d3cb9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$1.class
index fa6b29d..fd1143a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockContext.class
index eafd755..6e81135 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockFormattingPrefix.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockFormattingPrefix.class
index 65c0445..4c18d28 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockFormattingPrefix.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockFormattingPrefix.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockFormattingPrefixSuffix.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockFormattingPrefixSuffix.class
index 86e8460..559a57f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockFormattingPrefixSuffix.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$BlockFormattingPrefixSuffix.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$ConstPrefix.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$ConstPrefix.class
index 2061ae5..68ecb93 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$ConstPrefix.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$ConstPrefix.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$ExtendedFlattener.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$ExtendedFlattener.class
index 6ad6c7e..3fed9b1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$ExtendedFlattener.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$ExtendedFlattener.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$FormattingPrefix.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$FormattingPrefix.class
index f0fdbbd..f4c84e8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$FormattingPrefix.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$FormattingPrefix.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$NodeMarker.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$NodeMarker.class
index 1db66f4..078ec82 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$NodeMarker.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$NodeMarker.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$Prefix.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$Prefix.class
index 6bcb6e5..6795476 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$Prefix.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter$Prefix.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter.class
index 2920e05..9ee3027 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$1.class
index 278081a..65250d5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$2.class
index c5cb851..39fcf12 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$3.class
index a145e12..4d2d1a5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$ImportDeclEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$ImportDeclEntry.class
index 8d54a58..be47ee7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$ImportDeclEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$ImportDeclEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$PackageEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$PackageEntry.class
index 2439a2b..1e7c590 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$PackageEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$PackageEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$PackageMatcher.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$PackageMatcher.class
index 9d45a06..50ff2db 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$PackageMatcher.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer$PackageMatcher.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.class
index f4acf67..ca34acc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineCommentEndOffsets.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineCommentEndOffsets.class
index 2d88ed5..a01c104 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineCommentEndOffsets.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineCommentEndOffsets.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation$1.class
index 34be81a..4cad9e7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation$2.class
index 7db32c1..fef9e12 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation.class
index 5cb1279..6066149 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineInformation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ListRewriteEvent.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ListRewriteEvent.class
index a4582fc..91c5fd4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ListRewriteEvent.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ListRewriteEvent.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$CopyPlaceholderData.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$CopyPlaceholderData.class
index d38cf8c..1ea22c3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$CopyPlaceholderData.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$CopyPlaceholderData.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$PlaceholderData.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$PlaceholderData.class
index 21d2cb5..ba7fef7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$PlaceholderData.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$PlaceholderData.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$StringPlaceholderData.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$StringPlaceholderData.class
index 1e216a7..80f1679 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$StringPlaceholderData.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore$StringPlaceholderData.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.class
index 20e58e3..ddfe421 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeRewriteEvent.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeRewriteEvent.class
index 14f431e..b31b470 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeRewriteEvent.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeRewriteEvent.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEvent.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEvent.class
index cdcb9a6..522b3fd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEvent.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEvent.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$CopySourceInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$CopySourceInfo.class
index ed528fd..69a62f0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$CopySourceInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$CopySourceInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$EventHolder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$EventHolder.class
index 283bdb5..afa86e3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$EventHolder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$EventHolder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$INodePropertyMapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$INodePropertyMapper.class
index 6b3c752..c4ee805 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$INodePropertyMapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$INodePropertyMapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$NodeRangeInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$NodeRangeInfo.class
index 4c9ef8d..0f87fc9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$NodeRangeInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$NodeRangeInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$ParentIterator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$ParentIterator.class
index bf5d3a2..7cf6f3b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$ParentIterator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$ParentIterator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$PropertyLocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$PropertyLocation.class
index e4a414a..2b9086e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$PropertyLocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore$PropertyLocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore.class
index 6a438d1..6bea1d9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/SourceModifier.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/SourceModifier.class
index fb047b4..2592d96 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/SourceModifier.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/SourceModifier.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/TokenScanner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/TokenScanner.class
index b71667f..f5fd482 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/TokenScanner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/TokenScanner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/TrackedNodePosition.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/TrackedNodePosition.class
index dff012d..6aece61 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/TrackedNodePosition.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/TrackedNodePosition.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper$1.class
index 9e339f4..5fd76cb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.class
index b15e4b1..14d72eb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/GlobalVariableWrapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/GlobalVariableWrapper.class
index 46c3dee..8928abc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/GlobalVariableWrapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/GlobalVariableWrapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/RequestorWrapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/RequestorWrapper.class
index 9d5ea54..34003cb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/RequestorWrapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/eval/RequestorWrapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/ChangeCollector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/ChangeCollector.class
index 76652e3..4e6acc4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/ChangeCollector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/ChangeCollector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBinaryType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBinaryType.class
index df5cfe0..93b4046 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBinaryType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBinaryType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder$1.class
index 90b767c..a1447f6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.class
index d627fb7..d6e5383 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.class
index 4f50e2c..81697c6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyType.class
index e73db6f..fbd5583 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$1.class
index 8dc832a..299942c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$1PathCollector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$1PathCollector.class
index 2f66b72..ac06172 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$1PathCollector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$1PathCollector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$2.class
index 919e911..e032740 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$3.class
index a3ff7c4..673fd76 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$Queue.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$Queue.class
index bf406cb..b0605fa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$Queue.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder$Queue.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.class
index 841e763..d8fb3ed 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.class
index 272d19b..1190a4a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy$1.class
index 7a6eb56..19b57a9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.class
index b365d65..8ddcb92 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy$1.class
index 650781a..c6509ca 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.class
index fcaef16..4c16ede 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex$IntList.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex$IntList.class
index da24d4e..b8967fd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex$IntList.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex$IntList.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex.class
index 75a7b51..236039a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/EntryResult.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/EntryResult.class
index 7a21921..7950daf 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/EntryResult.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/EntryResult.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/FileIndexLocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/FileIndexLocation.class
index 995925f..1f2e858 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/FileIndexLocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/FileIndexLocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/Index.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/Index.class
index 6b53f56..5667eeb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/Index.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/Index.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/IndexLocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/IndexLocation.class
index 6d4d894..e1e531d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/IndexLocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/IndexLocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/JarIndexLocation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/JarIndexLocation.class
index f88cda2..4ee50ee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/JarIndexLocation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/JarIndexLocation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/MemoryIndex.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/MemoryIndex.class
index 3058e28..8bb11d9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/MemoryIndex.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/index/MemoryIndex.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/AbstractDOMBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/AbstractDOMBuilder.class
index c3bae69..0a2d231 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/AbstractDOMBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/AbstractDOMBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/CompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/CompilationUnit.class
index 8e1935a..d18671c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/CompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/CompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMBuilder.class
index 2172b2b..92dea16 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMCompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMCompilationUnit.class
index f90ca7c..36d562b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMCompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMCompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMField.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMField.class
index 3141511..34d731e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMField.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMField.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMImport.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMImport.class
index 3565a1e..6e743df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMImport.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMImport.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMInitializer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMInitializer.class
index 9f2fb86..a66ba71 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMInitializer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMInitializer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMMember.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMMember.class
index f08d66c..74ce392 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMMember.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMMember.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMMethod.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMMethod.class
index e1648d4..77c028a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMMethod.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMMethod.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMNode.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMNode.class
index c73f4b1..a9d3eac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMNode.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMNode.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMPackage.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMPackage.class
index 196532a..693fe90 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMPackage.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMPackage.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMType.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMType.class
index 56e0340..e22d90a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMType.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMType.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/ILineStartFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/ILineStartFinder.class
index 7311ecc..8538f88 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/ILineStartFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/ILineStartFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/SiblingEnumeration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/SiblingEnumeration.class
index 65c7333..30d90a0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/SiblingEnumeration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/SiblingEnumeration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/SimpleDOMBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/SimpleDOMBuilder.class
index 39d7085..67c75f6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/SimpleDOMBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/jdom/SimpleDOMBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/AbstractJavaSearchScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/AbstractJavaSearchScope.class
index ad1ef66..57c3d70 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/AbstractJavaSearchScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/AbstractJavaSearchScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/AbstractSearchScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/AbstractSearchScope.class
index 3608256..bda95ac 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/AbstractSearchScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/AbstractSearchScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1.class
index 401d5d4..45cac63 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1AllConstructorDeclarationsVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1AllConstructorDeclarationsVisitor.class
index fca7cbd..82df37f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1AllConstructorDeclarationsVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1AllConstructorDeclarationsVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1AllTypeDeclarationsVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1AllTypeDeclarationsVisitor.class
index b1d10b5..85a5105 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1AllTypeDeclarationsVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$1AllTypeDeclarationsVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$2.class
index 437fa2d..c5218ad 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$2AllTypeDeclarationsVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$2AllTypeDeclarationsVisitor.class
index 1a715ba..fc51acd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$2AllTypeDeclarationsVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$2AllTypeDeclarationsVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$3.class
index f7bde64..ad397df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$4.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$4.class
index 02ef67a..d423fe0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine.class
index d936ce2..d3730cd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/HierarchyScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/HierarchyScope.class
index b6ad31f..132a7f4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/HierarchyScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/HierarchyScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IRestrictedAccessConstructorRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IRestrictedAccessConstructorRequestor.class
index 2e9fb1f..a9c485f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IRestrictedAccessConstructorRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IRestrictedAccessConstructorRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IRestrictedAccessTypeRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IRestrictedAccessTypeRequestor.class
index 6b953ef..734897c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IRestrictedAccessTypeRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IRestrictedAccessTypeRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IndexQueryRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IndexQueryRequestor.class
index 6e6969d..b0aa4f6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IndexQueryRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IndexQueryRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IndexSelector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IndexSelector.class
index df42664..e89f227 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IndexSelector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/IndexSelector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchDocument.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchDocument.class
index 1f030b7..1cdaa34 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchDocument.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchDocument.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.class
index 416d575..6b42f1c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchScope.class
index f4e0abd..fc19ee8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchTypeNameMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchTypeNameMatch.class
index ee9018a..da557ec 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchTypeNameMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchTypeNameMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.class
index ea63ee9..9cc3d3c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/PathCollector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/PathCollector.class
index d010b65..2f4ca52 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/PathCollector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/PathCollector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/PatternSearchJob.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/PatternSearchJob.class
index 494293a..8565145 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/PatternSearchJob.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/PatternSearchJob.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/StringOperation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/StringOperation.class
index 9b0899a..8f7489d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/StringOperation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/StringOperation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/SubTypeSearchJob.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/SubTypeSearchJob.class
index baa73be..8cc5055 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/SubTypeSearchJob.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/SubTypeSearchJob.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/TypeNameMatchRequestorWrapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/TypeNameMatchRequestorWrapper.class
index 88937d0..0dc4735 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/TypeNameMatchRequestorWrapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/TypeNameMatchRequestorWrapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/TypeNameRequestorWrapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/TypeNameRequestorWrapper.class
index dd66ea3..c7e49b3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/TypeNameRequestorWrapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/TypeNameRequestorWrapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.class
index 9161ad2..8f1b2dd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex$1.class
index 6e98a68..e088a37 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex$2.class
index ce72c70..4b1694c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex.class
index 6f2efd2..e373d3b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.class
index 9ed5a4a..640df01 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.class
index 2794474..00dad19 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/DefaultJavaIndexer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/DefaultJavaIndexer.class
index 86d2f92..8bc7991 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/DefaultJavaIndexer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/DefaultJavaIndexer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IIndexConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IIndexConstants.class
index f994b0b..44c7910 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IIndexConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IIndexConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject$1.class
index 4a8cc59..16bdc39 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject$2.class
index a50e1a8..b22effc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.class
index 779c424..48631a3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder$1.class
index 3ef3e3e..5246e55 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder$2.class
index b61da9a..a7fdce7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder.class
index 94dd8f8..92b8b2c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager$1.class
index 414ba86..328237c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager.class
index f89275b..5536582 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexRequest.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexRequest.class
index 25807d2..3d86edd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexRequest.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexRequest.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexingParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexingParser.class
index ddf047d..552e9fc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexingParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexingParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/ReadWriteMonitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/ReadWriteMonitor.class
index 652ab42..2a0cd30 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/ReadWriteMonitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/ReadWriteMonitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/RemoveFolderFromIndex.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/RemoveFolderFromIndex.class
index 07a8e96..08caa84 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/RemoveFolderFromIndex.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/RemoveFolderFromIndex.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/RemoveFromIndex.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/RemoveFromIndex.class
index df65e75..4388e63 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/RemoveFromIndex.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/RemoveFromIndex.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SaveIndex.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SaveIndex.class
index 8c7a873..e1a719c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SaveIndex.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SaveIndex.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexer.class
index 157d4c2..764b97b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexerRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexerRequestor.class
index 5ef8e7b..5c116b5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexerRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexerRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndLocator.class
index b89d3d5..19edc3f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndPattern.class
index 07730f3..09687f1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClassFileMatchLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClassFileMatchLocator.class
index 814b903..7195135 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClassFileMatchLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClassFileMatchLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClasspathSourceDirectory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClasspathSourceDirectory.class
index 29e10af..dcd43f3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClasspathSourceDirectory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClasspathSourceDirectory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorDeclarationPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorDeclarationPattern.class
index c0c9acb..7a08c02 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorDeclarationPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorDeclarationPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.class
index 223054b..6137424 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorPattern.class
index 8215472..1211d88 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfAccessedFieldsPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfAccessedFieldsPattern.class
index 2dfe195..11171ef 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfAccessedFieldsPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfAccessedFieldsPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfReferencedMethodsPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfReferencedMethodsPattern.class
index 10dbfc6..8b5c3f2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfReferencedMethodsPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfReferencedMethodsPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfReferencedTypesPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfReferencedTypesPattern.class
index 712c9c9..d9183e6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfReferencedTypesPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/DeclarationOfReferencedTypesPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/FieldLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/FieldLocator.class
index c21617b..b3726c8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/FieldLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/FieldLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/FieldPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/FieldPattern.class
index 13b138e..3fd4d25 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/FieldPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/FieldPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ImportMatchLocatorParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ImportMatchLocatorParser.class
index 6ece142..5efdd63 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ImportMatchLocatorParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ImportMatchLocatorParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/IntersectingPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/IntersectingPattern.class
index 8a115ba..ece69f6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/IntersectingPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/IntersectingPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.class
index e25d44a..17982ff 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchPattern.class
index 20d091a..796c094 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/LocalVariableLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/LocalVariableLocator.class
index 3e1620f..8fd8700 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/LocalVariableLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/LocalVariableLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/LocalVariablePattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/LocalVariablePattern.class
index aeadda3..05411aa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/LocalVariablePattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/LocalVariablePattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$1.class
index b5fa17b..fddf6be 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$WorkingCopyDocument.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$WorkingCopyDocument.class
index 485411c..b4d84b7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$WorkingCopyDocument.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$WorkingCopyDocument.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$WrappedCoreException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$WrappedCoreException.class
index 644de91..cea4c99 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$WrappedCoreException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator$WrappedCoreException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator.class
index 2144020..ee45804 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$ClassAndMethodDeclarationVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$ClassAndMethodDeclarationVisitor.class
index a5e0222..766bd5c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$ClassAndMethodDeclarationVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$ClassAndMethodDeclarationVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$ClassButNoMethodDeclarationVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$ClassButNoMethodDeclarationVisitor.class
index 599bbae..f9769fb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$ClassButNoMethodDeclarationVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$ClassButNoMethodDeclarationVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$MethodButNoClassDeclarationVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$MethodButNoClassDeclarationVisitor.class
index de8c31e..4097ce1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$MethodButNoClassDeclarationVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$MethodButNoClassDeclarationVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$NoClassNoMethodDeclarationVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$NoClassNoMethodDeclarationVisitor.class
index 8df359a..efcf7ae 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$NoClassNoMethodDeclarationVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser$NoClassNoMethodDeclarationVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.class
index 56d3ba1..d26388b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet$1.class
index c986ba4..13c42fc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet.class
index 2ce6b1e..44a07df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MemberDeclarationVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MemberDeclarationVisitor.class
index fda767f..43092a6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MemberDeclarationVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MemberDeclarationVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodLocator.class
index 3a9ef7a..613b7d5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodPattern.class
index 9752ecb..b7e1ea5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MultiTypeDeclarationPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MultiTypeDeclarationPattern.class
index 6e0dfee..6b0d704 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MultiTypeDeclarationPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MultiTypeDeclarationPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrLocator.class
index 3a9e793..5c7d2f9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrPattern.class
index e17e276..611afb1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageDeclarationLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageDeclarationLocator.class
index c6b3947..5722e40 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageDeclarationLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageDeclarationLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageDeclarationPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageDeclarationPattern.class
index 178fb26..a1ae1c2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageDeclarationPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageDeclarationPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageReferenceLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageReferenceLocator.class
index 8dccb8e..cd62a85 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageReferenceLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageReferenceLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageReferencePattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageReferencePattern.class
index 79a26ff..d2e5b4a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageReferencePattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PackageReferencePattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PatternLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PatternLocator.class
index 8f50281..467dd0f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PatternLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PatternLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PossibleMatch.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PossibleMatch.class
index 4813cbd..4686974 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PossibleMatch.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PossibleMatch.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PossibleMatchSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PossibleMatchSet.class
index f11e092..3206409 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PossibleMatchSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PossibleMatchSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/QualifiedTypeDeclarationPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/QualifiedTypeDeclarationPattern.class
index fbd517e..efe5f4c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/QualifiedTypeDeclarationPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/QualifiedTypeDeclarationPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SecondaryTypeDeclarationPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SecondaryTypeDeclarationPattern.class
index 17d2dda..266baed 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SecondaryTypeDeclarationPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SecondaryTypeDeclarationPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector$1.class
index 111f073..5664cf8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector$TypeDeclarationVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector$TypeDeclarationVisitor.class
index d5cc291..71bbf2d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector$TypeDeclarationVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector$TypeDeclarationVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector.class
index 9936291..95973ee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.class
index a2804dc..6d8f1a4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferencePattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferencePattern.class
index 5eaccbf..3a9dcd9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferencePattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferencePattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationLocator.class
index 3b0a252..7e61898 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationPattern$PackageNameSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationPattern$PackageNameSet.class
index 6e93518..b590919 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationPattern$PackageNameSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationPattern$PackageNameSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationPattern.class
index 600e0ec..5451b20 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeParameterLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeParameterLocator.class
index 0ab780d..3b0ed01 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeParameterLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeParameterLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeParameterPattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeParameterPattern.class
index 543f143..fed8fc8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeParameterPattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeParameterPattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferenceLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferenceLocator.class
index 28308f4..6977499 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferenceLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferenceLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferencePattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferencePattern.class
index 6fbc34c..757686f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferencePattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferencePattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/VariableLocator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/VariableLocator.class
index 7dbf0dc..57d2b3e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/VariableLocator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/VariableLocator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/VariablePattern.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/VariablePattern.class
index 66756b6..2bc11fd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/VariablePattern.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/matching/VariablePattern.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/IJob.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/IJob.class
index d8fb19f..01b5338 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/IJob.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/IJob.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/JobManager$1ProgressJob.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/JobManager$1ProgressJob.class
index 3497b76..2eada9d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/JobManager$1ProgressJob.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/JobManager$1ProgressJob.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/JobManager.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/JobManager.class
index d872486..f62d10c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/JobManager.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/search/processing/JobManager.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ASTNodeFinder$1Visitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ASTNodeFinder$1Visitor.class
index e45dc47..ab5c1e2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ASTNodeFinder$1Visitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ASTNodeFinder$1Visitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ASTNodeFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ASTNodeFinder.class
index b759f32..ace24cf 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ASTNodeFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ASTNodeFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Annotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Annotation.class
index e4961fc..12badbd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Annotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Annotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationComponent.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationComponent.class
index 9129ac9..d799152 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationComponent.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationComponent.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationComponentValue.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationComponentValue.class
index 32c8f7b..81c28ee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationComponentValue.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationComponentValue.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationDefaultAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationDefaultAttribute.class
index 300f058..93614c3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationDefaultAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/AnnotationDefaultAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser$Scanner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser$Scanner.class
index 4928bcf..4825a4e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser$Scanner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser$Scanner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser.class
index c3b5c58..a394d4e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver$1CaptureFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver$1CaptureFinder.class
index 14e0508..be4c4a2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver$1CaptureFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver$1CaptureFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver.class
index a96ed74..02dc343 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BootstrapMethodsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BootstrapMethodsAttribute.class
index 4c27962..04f5a69 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BootstrapMethodsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BootstrapMethodsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BootstrapMethodsEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BootstrapMethodsEntry.class
index 707b58b..07de7b3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BootstrapMethodsEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/BootstrapMethodsEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CharArrayBuffer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CharArrayBuffer.class
index 4765961..68fc8b1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CharArrayBuffer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CharArrayBuffer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileAttribute.class
index c22eb75..605181a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileReader.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileReader.class
index 591ddae..a9726f9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileReader.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileReader.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileStruct.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileStruct.class
index 9d1ded5..1c43e84 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileStruct.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileStruct.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CodeAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CodeAttribute.class
index 32b71cf..40bd4f0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CodeAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CodeAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CodeSnippetParsingUtil.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CodeSnippetParsingUtil.class
index ae8820d..654b88e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CodeSnippetParsingUtil.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CodeSnippetParsingUtil.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CommentRecorderParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CommentRecorderParser.class
index e82a184..cae9bde 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CommentRecorderParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/CommentRecorderParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPool.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPool.class
index e21e624..5244b7a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPool.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPool.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPoolEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPoolEntry.class
index 782e247..1b320ab 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPoolEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPoolEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPoolEntry2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPoolEntry2.class
index 95ca7ed..d9e865d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPoolEntry2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantPoolEntry2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantValueAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantValueAttribute.class
index fbc0cc1..0017991 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantValueAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ConstantValueAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DOMFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DOMFinder.class
index c6f012f..72864bc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DOMFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DOMFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DefaultBytecodeVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DefaultBytecodeVisitor.class
index 30b679e..8e19971 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DefaultBytecodeVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DefaultBytecodeVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DefaultStackMapFrame.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DefaultStackMapFrame.class
index f2ce484..4ae27de 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DefaultStackMapFrame.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/DefaultStackMapFrame.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Disassembler.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Disassembler.class
index a89c1ed..934f8cd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Disassembler.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Disassembler.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/EnclosingMethodAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/EnclosingMethodAttribute.class
index f187ba0..6059dab 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/EnclosingMethodAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/EnclosingMethodAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExceptionAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExceptionAttribute.class
index 1c3bb6d..a562c81 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExceptionAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExceptionAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExceptionTableEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExceptionTableEntry.class
index e922d5b..3187091 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExceptionTableEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExceptionTableEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExtendedAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExtendedAnnotation.class
index 6a8757a..e69cc2f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExtendedAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ExtendedAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/FieldInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/FieldInfo.class
index 1d194c5..850c954 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/FieldInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/FieldInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HandleFactory.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HandleFactory.class
index 9b6b43a..53d3544 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HandleFactory.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HandleFactory.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashSetOfArray.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashSetOfArray.class
index dedd8be..28aa13d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashSetOfArray.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashSetOfArray.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashSetOfCharArrayArray.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashSetOfCharArrayArray.class
index fb04c52..3d5bb56 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashSetOfCharArrayArray.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashSetOfCharArrayArray.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashtableOfArrayToObject.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashtableOfArrayToObject.class
index bd00a8b..3e8d29e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashtableOfArrayToObject.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/HashtableOfArrayToObject.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ICacheEnumeration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ICacheEnumeration.class
index daab1e4..5616122 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ICacheEnumeration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ICacheEnumeration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ILRUCacheable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ILRUCacheable.class
index 6a867b9..f495fe8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ILRUCacheable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ILRUCacheable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/InnerClassesAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/InnerClassesAttribute.class
index f69acf6..e2b30c7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/InnerClassesAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/InnerClassesAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/InnerClassesAttributeEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/InnerClassesAttributeEntry.class
index 4261a5a..2a171d6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/InnerClassesAttributeEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/InnerClassesAttributeEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/JavaElementFinder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/JavaElementFinder.class
index f5503fd..c7ef672 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/JavaElementFinder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/JavaElementFinder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/KeyKind.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/KeyKind.class
index bef5bd5..1e9268b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/KeyKind.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/KeyKind.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/KeyToSignature.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/KeyToSignature.class
index 9791cd0..56c384c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/KeyToSignature.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/KeyToSignature.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$1.class
index 05d6fb6..2c4cec5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$LRUCacheEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$LRUCacheEntry.class
index 6d8630b..1cd0b7c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$LRUCacheEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$LRUCacheEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$Stats.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$Stats.class
index 7271f1e..2ebaeb9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$Stats.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache$Stats.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache.class
index fa91e89..df05b07 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LineNumberAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LineNumberAttribute.class
index 303d563..15d2774 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LineNumberAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LineNumberAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableAttribute.class
index f313e33..075a013 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableReferenceInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableReferenceInfo.class
index 45559bc..37e04be 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableReferenceInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableReferenceInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTableEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTableEntry.class
index 590cc10..4db328b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTableEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTableEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTypeAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTypeAttribute.class
index 9a83ff1..1571e6a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTypeAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTypeAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTypeTableEntry.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTypeTableEntry.class
index d9749a3..45e371e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTypeTableEntry.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableTypeTableEntry.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MementoTokenizer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MementoTokenizer.class
index 7d56130..510baf6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MementoTokenizer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MementoTokenizer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Messages.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Messages.class
index 1bcfad9..d3be21d 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Messages.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Messages.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MethodInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MethodInfo.class
index 1047085..6eaf082 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MethodInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MethodInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MethodParametersAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MethodParametersAttribute.class
new file mode 100644
index 0000000..39dd4d3
--- /dev/null
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/MethodParametersAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ParameterAnnotation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ParameterAnnotation.class
index 188490b..c19a144 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ParameterAnnotation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ParameterAnnotation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/PublicScanner.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/PublicScanner.class
index 266eaa0..5f4994f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/PublicScanner.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/PublicScanner.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RecordedParsingInformation.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RecordedParsingInformation.class
index 44c8f3a..669a604 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RecordedParsingInformation.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RecordedParsingInformation.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ReferenceInfoAdapter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ReferenceInfoAdapter.class
index a7a7674..bc6810a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ReferenceInfoAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ReferenceInfoAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ResourceCompilationUnit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ResourceCompilationUnit.class
index 5e212cf..62a029e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ResourceCompilationUnit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ResourceCompilationUnit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleAnnotationsAttribute.class
index 5157778..8d82978 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleParameterAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleParameterAnnotationsAttribute.class
index d34cc5f..f878632 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleParameterAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleParameterAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleTypeAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleTypeAnnotationsAttribute.class
index 7476e9b..cd657aa 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleTypeAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleTypeAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleAnnotationsAttribute.class
index 73da2ce..89d64d9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleParameterAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleParameterAnnotationsAttribute.class
index d33c850..2e46563 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleParameterAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleParameterAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleTypeAnnotationsAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleTypeAnnotationsAttribute.class
index f194f80..57db055 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleTypeAnnotationsAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleTypeAnnotationsAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SignatureAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SignatureAttribute.class
index b75112f..56de7e1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SignatureAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SignatureAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SimpleDocument.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SimpleDocument.class
index e8435f8..9917ffb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SimpleDocument.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SimpleDocument.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SimpleWordSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SimpleWordSet.class
index 2e2c487..378f75e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SimpleWordSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SimpleWordSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SourceFileAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SourceFileAttribute.class
index c512587..29f72e2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SourceFileAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/SourceFileAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapAttribute.class
index dd6cca4..56cbba1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapFrame.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapFrame.class
index c483bbb..cb06057 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapFrame.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapFrame.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapTableAttribute.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapTableAttribute.class
index f864ef3..1d0aa6b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapTableAttribute.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/StackMapTableAttribute.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ToStringSorter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ToStringSorter.class
index f8f7122..b75b57f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ToStringSorter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/ToStringSorter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$1.class
index 4bb7ced..3e06f20 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$BindingsToNodesMap.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$BindingsToNodesMap.class
index e44ad66..51970e0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$BindingsToNodesMap.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$BindingsToNodesMap.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$Comparable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$Comparable.class
index 0ccbbbc..5fbb369 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$Comparable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$Comparable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$Comparer.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$Comparer.class
index 6aba88c..e21deb4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$Comparer.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util$Comparer.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util.class
index 05e789e..8ba49f4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/Util.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/VerificationInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/VerificationInfo.class
index 0dd5327..0163b60 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/VerificationInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/VerificationInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet$HashableWeakReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet$HashableWeakReference.class
index 87441a7..2b83d72 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet$HashableWeakReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet$HashableWeakReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet.class
index e87b8ac..06b5d59 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray$HashableWeakReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray$HashableWeakReference.class
index ab9f217..64bd785 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray$HashableWeakReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray$HashableWeakReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray.class
index 569b30f..217968a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/messages.properties b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/messages.properties
index 30fad38..383ff0f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/messages.properties
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/core/util/messages.properties
@@ -5,14 +5,12 @@
 # which accompanies this distribution, and is available at
 # http://www.eclipse.org/legal/epl-v10.html
 #
-# This is an implementation of an early-draft specification developed under the Java
-# Community Process (JCP) and is made available for testing and evaluation purposes
-# only. The code is not compatible with any specification of the JCP.
-#
 # Contributors:
 #     IBM Corporation - initial API and implementation
 #        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
 #                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+#        Jesper Steen Moeller - Contribution for
+#                          Bug 406973 - [compiler] Parse MethodParameters attribute
 ###############################################################################
 
 ### JavaModel messages.
@@ -270,6 +268,7 @@
 disassembler_opentypedeclaration =\ '{'
 disassembler_closetypedeclaration = }
 disassembler_parametername = arg
+disassembler_anonymousparametername = <anonymous>
 disassembler_localvariablename = local_{0}
 disassembler_endofmethodheader = ;
 disassembler_begincommentline = //\ 
@@ -279,6 +278,7 @@
 disassembler_enclosingmethodheader = Enclosing Method:
 disassembler_exceptiontableheader = Exception Table:
 disassembler_linenumberattributeheader = Line numbers:
+disassembler_methodparametersheader = Method Parameters:
 disassembler_localvariabletableattributeheader = Local variable table:
 disassembler_localvariabletypetableattributeheader = Local variable type table:
 disassembler_arraydimensions = []
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetAllocationExpression.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetAllocationExpression.class
index 63edc0c..c356801 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetAllocationExpression.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetAllocationExpression.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetClassFile.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetClassFile.class
index 4d039a6..99ca63c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetClassFile.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetClassFile.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetCompiler.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetCompiler.class
index 281e76c..5698d86 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetCompiler.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetCompiler.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEnvironment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEnvironment.class
index 22030da..323f713 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEnvironment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEnvironment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEvaluator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEvaluator.class
index e538880..cb55692 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEvaluator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEvaluator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetFieldReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetFieldReference.class
index cc97307..b5d98ea 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetFieldReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetFieldReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetMessageSend.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetMessageSend.class
index 29126a0..9dbf0a2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetMessageSend.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetMessageSend.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetParser.class
index fb5133a..8ace333 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.class
index 40e3192..843ccb0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetReturnStatement.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetReturnStatement.class
index 747c5cf..c595431 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetReturnStatement.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetReturnStatement.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetScope.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetScope.class
index dbaacf3..be5eb5b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetScope.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetScope.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.class
index 762ee4c..ef14c74 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton$BinaryMethodSkeleton.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton$BinaryMethodSkeleton.class
index 1a15cb9..0d2e143 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton$BinaryMethodSkeleton.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton$BinaryMethodSkeleton.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton.class
index 61ea3b1..9358a3c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSuperReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSuperReference.class
index 360250a..77613df 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSuperReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSuperReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetThisReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetThisReference.class
index 814b833..8eb2851 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetThisReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetThisReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper$1.class
index 1bd4c6d..a6ea28c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper$2.class
index 683983f..414ea0b 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper.class
index 5c442b9..7e18a23 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetTypeDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetTypeDeclaration.class
index 4ee02fe..2f83ab6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetTypeDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetTypeDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationConstants.class
index 5c7b103..80e515c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$1.class
index 9be8b5b..be79d92 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$1ForwardingRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$1ForwardingRequestor.class
index 6e0b847..653768f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$1ForwardingRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$1ForwardingRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$2.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$2.class
index 4e80aa8..9276186 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$2.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$2.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$3.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$3.class
index 48a08f7..a9dfeee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$3.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$3.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$4.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$4.class
index 170c2fa..e4f6ea7 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$4.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$4.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$5.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$5.class
index 6407c46..a250b85 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$5.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext$5.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext.class
index 39e1210..3dc9e74 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationResult.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationResult.class
index a78bc17..87e6be3 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationResult.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationResult.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator$1.class
index 3c7fdff..5312899 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator$1CompilerRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator$1CompilerRequestor.class
index 7e1d1ac..d67c3a0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator$1CompilerRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator$1CompilerRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator.class
index ff7194a..5ebdd3c 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/GlobalVariable.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/GlobalVariable.class
index 70ca656..1ed8a85 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/GlobalVariable.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/GlobalVariable.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/IRequestor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/IRequestor.class
index 8102025..33fdfb1 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/IRequestor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/IRequestor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/InstallException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/InstallException.class
index 55c1109..8d2c1ce 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/InstallException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/InstallException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/VariablesEvaluator.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/VariablesEvaluator.class
index 88cde53..e750087 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/VariablesEvaluator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/VariablesEvaluator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/VariablesInfo.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/VariablesInfo.class
index d05ef9f..28b18fc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/VariablesInfo.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/eval/VariablesInfo.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/AbortFormatting.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/AbortFormatting.class
index e5fd3bd..398f87e 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/AbortFormatting.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/AbortFormatting.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/BinaryExpressionFragmentBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/BinaryExpressionFragmentBuilder.class
index f083453..e8812a8 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/BinaryExpressionFragmentBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/BinaryExpressionFragmentBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CascadingMethodInvocationFragmentBuilder.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CascadingMethodInvocationFragmentBuilder.class
index 184882b..63e07f0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CascadingMethodInvocationFragmentBuilder.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CascadingMethodInvocationFragmentBuilder.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor$MultiFieldDeclaration.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor$MultiFieldDeclaration.class
index 9b647dd..a9188a6 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor$MultiFieldDeclaration.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor$MultiFieldDeclaration.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.class
index a3c80c3..537e4f5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.class
index 0a6824d..89ec20a 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.class
index 8c5e0ed..2eb04cd 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadoc.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadoc.class
index e4b6369..3667f11 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadoc.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadoc.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocBlock.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocBlock.class
index f6d431f..8098ed2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocBlock.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocBlock.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocNode.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocNode.class
index b01367c..06443eb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocNode.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocNode.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocReference.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocReference.class
index 4c9e35b..90ed457 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocReference.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocReference.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocText.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocText.class
index 7181628..4b6beae 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocText.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatJavadocText.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatterCommentParser.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatterCommentParser.class
index d4d863d..5894e52 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatterCommentParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/FormatterCommentParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/ICodeFormatterConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/ICodeFormatterConstants.class
index c25da3e..f02d91f 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/ICodeFormatterConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/ICodeFormatterConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Location.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Location.class
index 26c7287..978e3f2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Location.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Location.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/OptimizedReplaceEdit.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/OptimizedReplaceEdit.class
index 30593b9..5ce0088 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/OptimizedReplaceEdit.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/OptimizedReplaceEdit.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe$1.class
index afc59a4..71382f5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe$LineComment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe$LineComment.class
index 2e49827..7b290f5 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe$LineComment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe$LineComment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe.class
index 8f73e27..8b89503 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/align/Alignment.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/align/Alignment.class
index 8e2a087..512b1eb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/align/Alignment.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/align/Alignment.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/align/AlignmentException.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/align/AlignmentException.class
index af3b08a..58caae2 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/align/AlignmentException.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/align/AlignmentException.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil$1.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil$1.class
index cad9a44..57444ba 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil$1.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil$1.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil.class
index 6f975c6..c0c5212 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/HTMLEntity2JavaReader.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/HTMLEntity2JavaReader.class
index 930a090..3a65eee 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/HTMLEntity2JavaReader.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/HTMLEntity2JavaReader.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/IJavaDocTagConstants.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/IJavaDocTagConstants.class
index d5a2355..ad7d7a9 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/IJavaDocTagConstants.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/IJavaDocTagConstants.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/Java2HTMLEntityReader.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/Java2HTMLEntityReader.class
index b5f6dec..9a92927 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/Java2HTMLEntityReader.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/Java2HTMLEntityReader.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/SubstitutionTextReader.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/SubstitutionTextReader.class
index cc4a3f6..24509fc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/SubstitutionTextReader.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/comment/SubstitutionTextReader.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/old/CodeFormatter.class b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/old/CodeFormatter.class
index 9184e5f..51d4c20 100644
--- a/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/old/CodeFormatter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/org/eclipse/jdt/internal/formatter/old/CodeFormatter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/tools/ajc/Main.class b/org.aspectj.ajde/classes/org/aspectj/tools/ajc/Main.class
index 774cdd9..03d6a42 100644
--- a/org.aspectj.ajde/classes/org/aspectj/tools/ajc/Main.class
+++ b/org.aspectj.ajde/classes/org/aspectj/tools/ajc/Main.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/tools/ajdoc/HtmlDecorator.class b/org.aspectj.ajde/classes/org/aspectj/tools/ajdoc/HtmlDecorator.class
index c86104a..8197fcc 100644
--- a/org.aspectj.ajde/classes/org/aspectj/tools/ajdoc/HtmlDecorator.class
+++ b/org.aspectj.ajde/classes/org/aspectj/tools/ajdoc/HtmlDecorator.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/tools/ajdoc/Main.class b/org.aspectj.ajde/classes/org/aspectj/tools/ajdoc/Main.class
index c14bef4..ec5f1cb 100644
--- a/org.aspectj.ajde/classes/org/aspectj/tools/ajdoc/Main.class
+++ b/org.aspectj.ajde/classes/org/aspectj/tools/ajdoc/Main.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/Ajc11CompilerAdapter.class b/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/Ajc11CompilerAdapter.class
index 82c35ba..7cd79b0 100644
--- a/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/Ajc11CompilerAdapter.class
+++ b/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/Ajc11CompilerAdapter.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/AjcTask.class b/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/AjcTask.class
index 812ff63..a2fd797 100644
--- a/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/AjcTask.class
+++ b/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/AjcTask.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/Ajdoc.class b/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/Ajdoc.class
index 69b0d5f..3df1754 100644
--- a/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/Ajdoc.class
+++ b/org.aspectj.ajde/classes/org/aspectj/tools/ant/taskdefs/Ajdoc.class
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/ajdt/ajc/messages.properties b/org.aspectj.ajde/source/org/aspectj/ajdt/ajc/messages.properties
index c9a2bf4..64ca22c 100644
--- a/org.aspectj.ajde/source/org/aspectj/ajdt/ajc/messages.properties
+++ b/org.aspectj.ajde/source/org/aspectj/ajdt/ajc/messages.properties
@@ -5,7 +5,7 @@
      org/aspectj/weaver/XlintDefault.properties for the default behavior and a template to copy. 
 ### AspectJ-specific messages 
 compiler.name = AspectJ Compiler 1.8.0
-compiler.version = Eclipse Compiler BETA_JAVA8_3D6E745, 3.9
+compiler.version = Eclipse Compiler BETA_JAVA8_8661797, 3.9
 compiler.copyright = 
 
 ## this next one superceded by above...
@@ -63,8 +63,9 @@
 \    -1.5 -5 -5.0       use 1.5 compliance (-source 1.5 -target 1.5)\n\
 \    -1.6 -6 -6.0       use 1.6 compliance (-source 1.6 -target 1.6)\n\
 \    -1.7 -7 -7.0       use 1.7 compliance (-source 1.7 -target 1.7)\n\
-\    -source <version>  set source level: 1.3 to 1.7 (or 5, 5.0, etc)\n\
-\    -target <version>  set classfile target: 1.1 to 1.7 (or 5, 5.0, etc)\n\
+\    -1.8 -8 -8.0       use 1.8 compliance (-source 1.8 -target 1.8)\n\
+\    -source <version>  set source level: 1.3 to 1.8 (or 5, 5.0, etc)\n\
+\    -target <version>  set classfile target: 1.1 to 1.8 (or 5, 5.0, etc)\n\
 \ \n\
 \ Warning options:\n\
 \    -deprecation         + deprecation outside deprecated code\n\
diff --git a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/compiler/ast/Proceed.java b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/compiler/ast/Proceed.java
index 6e62843..364bbe3 100644
--- a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/compiler/ast/Proceed.java
+++ b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/compiler/ast/Proceed.java
@@ -1,6 +1,6 @@
 /* *******************************************************************
- * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
- *               2004 contributors
+ * Copyright (c) 2002-2014 Palo Alto Research Center, Incorporated (PARC) 
+ *               and Contributors
  * All rights reserved. 
  * This program and the accompanying materials are made available 
  * under the terms of the Eclipse Public License v1.0 
@@ -169,7 +169,8 @@
 		}
 		checkInvocationArguments(scope,null,this.actualReceiverType,binding,
 				this.arguments,binding.parameters,argsContainCast,this);
-		
+
+		this.resolvedType = binding.returnType;
 		return binding.returnType;
 	}
 
diff --git a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java
index 1692a66..4f0dc27 100644
--- a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java
+++ b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java
@@ -21,6 +21,7 @@
 import java.util.List;
 import java.util.Set;
 
+import org.aspectj.ajdt.internal.compiler.ast.AdviceDeclaration;
 import org.aspectj.ajdt.internal.compiler.ast.AspectDeclaration;
 import org.aspectj.ajdt.internal.compiler.ast.DeclareAnnotationDeclaration;
 import org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration;
@@ -48,6 +49,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.IPrivilegedHandler;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedMethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
@@ -506,6 +508,17 @@
 		}
 		super.unusedPrivateType(typeDecl);
 	}
+	private final static char[] thisJoinPointName = "thisJoinPoint".toCharArray();
+	
+	public void uninitializedLocalVariable(LocalVariableBinding binding, ASTNode location) {
+		if (CharOperation.equals(binding.name,thisJoinPointName)) {
+			// If in advice, this is not a problem
+			if (binding.declaringScope!=null && binding.declaringScope.referenceContext() instanceof AdviceDeclaration) {
+				return;
+			}
+		}
+		super.uninitializedLocalVariable(binding, location);
+	}
 	
 	public void abstractMethodInConcreteClass(SourceTypeBinding type) {
 		if (type.scope!=null && type.scope.referenceContext instanceof AspectDeclaration) {
@@ -737,12 +750,12 @@
 		}
 	}
 
-	public void duplicateMethodInType(SourceTypeBinding type, AbstractMethodDeclaration methodDecl, boolean equalParameters, int severity) {
+	public void duplicateMethodInType(AbstractMethodDeclaration methodDecl, boolean equalParameters, int severity) {
 		if (new String(methodDecl.selector).startsWith("ajc$interMethod")) {
 			// this is an ITD clash and will be reported in another way by AspectJ (173602)
 			return;
 		}
-		super.duplicateMethodInType(type, methodDecl, equalParameters, severity);
+		super.duplicateMethodInType(methodDecl, equalParameters, severity);
 	}
 
 	// pr246393 - if we are going to complain about privileged, we clearly don't know what is going on, so don't
diff --git a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java
index ffd2c61..c6cdd88 100644
--- a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java
+++ b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java
@@ -23,6 +23,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.StringTokenizer;
 
 import org.aspectj.ajdt.internal.compiler.CompilationResultDestinationManager;
 import org.aspectj.util.FileUtil;
@@ -59,6 +60,7 @@
 
 	private File configFile;
 	private String lintMode = AJLINT_DEFAULT;
+	private Map<String,String> lintOptionsMap = null;
 	private File lintSpecFile = null;
 
 	private int changes = EVERYTHING; // bitflags, see CompilerConfigurationChangeFlags
@@ -443,35 +445,71 @@
 	public String getLintMode() {
 		return lintMode;
 	}
+	
+	public Map<String,String> getLintOptionsMap() {
+		return lintOptionsMap;
+	}
 
 	// options...
 
 	public void setLintMode(String lintMode) {
-		this.lintMode = lintMode;
 		String lintValue = null;
+		this.lintMode = lintMode;
 		if (AJLINT_IGNORE.equals(lintMode)) {
 			lintValue = AjCompilerOptions.IGNORE;
 		} else if (AJLINT_WARN.equals(lintMode)) {
 			lintValue = AjCompilerOptions.WARNING;
 		} else if (AJLINT_ERROR.equals(lintMode)) {
 			lintValue = AjCompilerOptions.ERROR;
+		} else {
+			// Possibly a name=value comma separated list of configurations
+			if (lintMode.indexOf("=")!=-1) {
+				this.lintMode = AJLINT_DEFAULT;
+				lintOptionsMap = new HashMap<String,String>();
+				StringTokenizer tokenizer = new StringTokenizer(lintMode,",");
+				while (tokenizer.hasMoreElements()) {
+					String option = tokenizer.nextToken();
+					int equals = option.indexOf("=");
+					if (equals!=-1) {
+						String key = option.substring(0,equals);
+						String value = option.substring(equals+1);
+						lintOptionsMap.put(key,value);
+					}
+				}
+			}
 		}
 
-		if (lintValue != null) {
+		if (lintValue != null || lintOptionsMap != null ) {
 			Map<String, String> lintOptions = new HashMap<String, String>();
-			lintOptions.put(AjCompilerOptions.OPTION_ReportInvalidAbsoluteTypeName, lintValue);
-			lintOptions.put(AjCompilerOptions.OPTION_ReportInvalidWildcardTypeName, lintValue);
-			lintOptions.put(AjCompilerOptions.OPTION_ReportUnresolvableMember, lintValue);
-			lintOptions.put(AjCompilerOptions.OPTION_ReportTypeNotExposedToWeaver, lintValue);
-			lintOptions.put(AjCompilerOptions.OPTION_ReportShadowNotInStructure, lintValue);
-			lintOptions.put(AjCompilerOptions.OPTION_ReportUnmatchedSuperTypeInCall, lintValue);
-			lintOptions.put(AjCompilerOptions.OPTION_ReportCannotImplementLazyTJP, lintValue);
-			lintOptions.put(AjCompilerOptions.OPTION_ReportNeedSerialVersionUIDField, lintValue);
-			lintOptions.put(AjCompilerOptions.OPTION_ReportIncompatibleSerialVersion, lintValue);
+			setOption(AjCompilerOptions.OPTION_ReportInvalidAbsoluteTypeName, lintValue, lintOptions);
+			setOption(AjCompilerOptions.OPTION_ReportInvalidWildcardTypeName, lintValue, lintOptions);
+			setOption(AjCompilerOptions.OPTION_ReportUnresolvableMember, lintValue, lintOptions);
+			setOption(AjCompilerOptions.OPTION_ReportTypeNotExposedToWeaver, lintValue, lintOptions);
+			setOption(AjCompilerOptions.OPTION_ReportShadowNotInStructure, lintValue, lintOptions);
+			setOption(AjCompilerOptions.OPTION_ReportUnmatchedSuperTypeInCall, lintValue, lintOptions);
+			setOption(AjCompilerOptions.OPTION_ReportCannotImplementLazyTJP, lintValue, lintOptions);
+			setOption(AjCompilerOptions.OPTION_ReportNeedSerialVersionUIDField, lintValue, lintOptions);
+			setOption(AjCompilerOptions.OPTION_ReportIncompatibleSerialVersion, lintValue, lintOptions);
 			options.set(lintOptions);
 		}
 	}
 
+	private void setOption(String optionKey, String lintValue, Map<String,String> lintOptionsAccumulator) {
+		if (lintOptionsMap!=null && lintOptionsMap.containsKey(optionKey)) {
+			String v = lintOptionsMap.get(lintOptionsMap);
+			if (AJLINT_IGNORE.equals(v)) {
+				lintValue = AjCompilerOptions.IGNORE;
+			} else if (AJLINT_WARN.equals(v)) {
+				lintValue = AjCompilerOptions.WARNING;
+			} else if (AJLINT_ERROR.equals(v)) {
+				lintValue = AjCompilerOptions.ERROR;
+			}
+		}
+		if (lintValue != null) {
+			lintOptionsAccumulator.put(optionKey,lintValue);
+		}
+	}
+
 	public boolean isTerminateAfterCompilation() {
 		return options.terminateAfterCompilation;
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java
index dfa878d..76b9f5b 100644
--- a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java
+++ b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java
@@ -858,6 +858,9 @@
 		} else {
 			bcelWorld.getLint().setAll(buildConfig.getLintMode());
 		}
+		if (buildConfig.getLintOptionsMap() != null) {
+			bcelWorld.getLint().setFromMap(buildConfig.getLintOptionsMap());
+		}
 		if (buildConfig.getLintSpecFile() != null) {
 			bcelWorld.getLint().setFromProperties(buildConfig.getLintSpecFile());
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjState.java b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjState.java
index 88b81eb..965e877 100644
--- a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjState.java
+++ b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/AjState.java
@@ -35,6 +35,7 @@
 
 import org.aspectj.ajdt.internal.compiler.CompilationResultDestinationManager;
 import org.aspectj.ajdt.internal.compiler.InterimCompilationResult;
+import org.aspectj.ajdt.internal.compiler.lookup.AjLookupEnvironment;
 import org.aspectj.ajdt.internal.core.builder.AjBuildConfig.BinarySourceFile;
 import org.aspectj.apache.bcel.classfile.ClassParser;
 import org.aspectj.asm.AsmManager;
@@ -451,7 +452,7 @@
 			if (state != null) {
 				recordDecision("ClassFileChangeChecking: found state instance managing output location : " + dir);
 			} else {
-				recordDecision("ClassFileChangeChecking: failed to find a state instance managing output location : " + dir);
+				recordDecision("ClassFileChangeChecking: failed to find a state instance managing output location : " + dir + " (could be getting managed by JDT)");
 			}
 		}
 
@@ -1534,8 +1535,10 @@
 			// ignore local types since they're only visible inside a single method
 			if (!(reader.isLocal() || reader.isAnonymous())) {
 				if (hasStructuralChanges(reader, existingStructure)) {
-					if (world.forDEBUG_structuralChangesCode) {
-						System.err.println("Detected a structural change in " + thisTime.getFilename());
+					if (listenerDefined()) {
+//					if (world.forDEBUG_structuralChangesCode) {
+//						System.err.println("Detected a structural change in " + thisTime.getFilename());
+						printStructuralChanges(thisTime.getFilename(),reader, existingStructure);
 					}
 					structuralChangesSinceLastFullBuild.put(thisTime.getFilename(), new Long(currentBuildTime));
 					recordTypeChanged(new String(reader.getName()).replace('/', '.'));
@@ -1802,6 +1805,348 @@
 		return false;
 	}
 
+	private void logAnalysis(String filename, String info) {
+		if (listenerDefined()) {
+			getListener().recordDecision("StructuralAnalysis["+filename+"]: "+info);
+		}
+	}
+	
+	private boolean printStructuralChanges(String filename, ClassFileReader reader, CompactTypeStructureRepresentation existingType) {
+		logAnalysis(filename,"appears to have structurally changed, printing changes:");
+		if (existingType == null) {
+			logAnalysis(filename,"have not seen this type before");
+			return true;
+		}
+
+		// modifiers
+		if (!modifiersEqual(reader.getModifiers(), existingType.modifiers)) {
+			logAnalysis(filename,"modifiers changed.  old=0x"+Integer.toHexString(existingType.getModifiers())+" new=0x"+Integer.toHexString(reader.getModifiers()));
+			return true;
+		}
+
+		// generic signature
+		if (!CharOperation.equals(reader.getGenericSignature(), existingType.genericSignature)) {
+			logAnalysis(filename,"generic signature changed. old="+stringify(existingType.genericSignature)+" new="+stringify(reader.getGenericSignature()));
+			return true;
+		}
+
+		// superclass name
+		if (!CharOperation.equals(reader.getSuperclassName(), existingType.superclassName)) {
+			logAnalysis(filename,"superclass name changed. old="+stringify(existingType.superclassName)+" new="+stringify(reader.getSuperclassName()));
+			return true;
+		}
+
+		// have annotations changed on the type?
+		IBinaryAnnotation[] newAnnos = reader.getAnnotations();
+		if (newAnnos == null || newAnnos.length == 0) {
+			if (existingType.annotations != null && existingType.annotations.length != 0) {
+				logAnalysis(filename,"type used to have annotations and now does not: "+stringify(existingType.annotations));
+				return true;
+			}
+		} else {
+			IBinaryAnnotation[] existingAnnos = existingType.annotations;
+			if (existingAnnos == null || existingAnnos.length != newAnnos.length) {
+				logAnalysis(filename,"type now has annotations which it did not used to have: "+stringify(newAnnos));
+				return true;
+			}
+			// Does not allow for an order switch
+			// Does not cope with a change in values set on the annotation (hard to create a testcase where this is a problem tho)
+			for (int i = 0; i < newAnnos.length; i++) {
+				if (!CharOperation.equals(newAnnos[i].getTypeName(), existingAnnos[i].getTypeName())) {
+					logAnalysis(filename,"type annotation change at position "+i+" old="+new String(existingAnnos[i].getTypeName())+" new="+new String(newAnnos[i].getTypeName()));
+					return true;
+				}
+			}
+
+		}
+
+		// interfaces
+		char[][] existingIfs = existingType.interfaces;
+		char[][] newIfsAsChars = reader.getInterfaceNames();
+		if (newIfsAsChars == null) {
+			newIfsAsChars = EMPTY_CHAR_ARRAY;
+		} // damn I'm lazy...
+		if (existingIfs == null) {
+			existingIfs = EMPTY_CHAR_ARRAY;
+		}
+		if (existingIfs.length != newIfsAsChars.length) {
+			return true;
+		}
+		new_interface_loop: for (int i = 0; i < newIfsAsChars.length; i++) {
+			for (int j = 0; j < existingIfs.length; j++) {
+				if (CharOperation.equals(existingIfs[j], newIfsAsChars[i])) {
+					continue new_interface_loop;
+				}
+			}
+			logAnalysis(filename,"set of interfaces changed. old="+stringify(existingIfs)+" new="+stringify(newIfsAsChars));
+			return true;
+		}
+
+		// fields
+		// CompactMemberStructureRepresentation[] existingFields = existingType.fields;
+		IBinaryField[] newFields = reader.getFields();
+		if (newFields == null) {
+			newFields = CompactTypeStructureRepresentation.NoField;
+		}
+
+		// all redundant for now ... could be an optimization at some point...
+		// remove any ajc$XXX fields from those we compare with
+		// the existing fields - bug 129163
+		// List nonGenFields = new ArrayList();
+		// for (int i = 0; i < newFields.length; i++) {
+		// IBinaryField field = newFields[i];
+		// //if (!CharOperation.prefixEquals(NameMangler.AJC_DOLLAR_PREFIX,field.getName())) { // this would skip ajc$ fields
+		// //if ((field.getModifiers()&0x1000)==0) // 0x1000 => synthetic - this will skip synthetic fields (eg. this$0)
+		// nonGenFields.add(field);
+		// //}
+		// }
+		IBinaryField[] existingFs = existingType.binFields;
+		if (newFields.length != existingFs.length) {
+			logAnalysis(filename,"number of fields changed. old="+stringify(existingFs)+" new="+stringify(newFields));
+			return true;
+		}
+		new_field_loop: for (int i = 0; i < newFields.length; i++) {
+			IBinaryField field = newFields[i];
+			char[] fieldName = field.getName();
+			for (int j = 0; j < existingFs.length; j++) {
+				if (CharOperation.equals(existingFs[j].getName(), fieldName)) {
+					IBinaryField existing = existingFs[j];
+					if (!modifiersEqual(field.getModifiers(), existing.getModifiers())) {
+						logAnalysis(filename,"field modifiers changed '"+existing+"' old=0x"+Integer.toHexString(existing.getModifiers())+" new=0x"+Integer.toHexString(field.getModifiers()));
+						return true;
+					}
+					if (!CharOperation.equals(existing.getTypeName(), field.getTypeName())) {
+						logAnalysis(filename,"field type changed '"+existing+"' old="+new String(existing.getTypeName())+" new="+new String(field.getTypeName()));
+						return true;
+					}
+
+					char[] existingGSig = existing.getGenericSignature();
+					char[] fieldGSig = field.getGenericSignature();
+					if ((existingGSig == null && fieldGSig != null) || (existingGSig != null && fieldGSig == null)) {
+						logAnalysis(filename,"field generic sig changed '"+existing+"' old="+
+								(existingGSig==null?"null":new String(existingGSig))+" new="+(fieldGSig==null?"null":new String(fieldGSig)));
+						return true;
+					}
+					if (existingGSig != null) {
+						if (!CharOperation.equals(existingGSig, fieldGSig)) {
+							logAnalysis(filename,"field generic sig changed '"+existing+"' old="+
+									(existingGSig==null?"null":new String(existingGSig))+" new="+(fieldGSig==null?"null":new String(fieldGSig)));
+							return true;
+						}
+					}
+
+					continue new_field_loop;
+				}
+			}
+			logAnalysis(filename,"field changed. New field detected '"+field+"'");
+			return true;
+		}
+
+		// methods
+		// CompactMemberStructureRepresentation[] existingMethods = existingType.methods;
+		IBinaryMethod[] newMethods = reader.getMethods();
+		if (newMethods == null) {
+			newMethods = CompactTypeStructureRepresentation.NoMethod;
+		}
+
+		// all redundant for now ... could be an optimization at some point...
+
+		// Ctors in a non-static inner type have an 'extra parameter' of the enclosing type.
+		// If skippableDescriptorPrefix gets set here then it is set to the descriptor portion
+		// for this 'extra parameter'. For an inner class of pkg.Foo the skippable descriptor
+		// prefix will be '(Lpkg/Foo;' - so later when comparing <init> methods we know what to
+		// compare.
+		// IF THIS CODE NEEDS TO GET MORE COMPLICATED, I THINK ITS WORTH RIPPING IT ALL OUT AND
+		// CREATING THE STRUCTURAL CHANGES OBJECT BASED ON CLASSREADER OUTPUT RATHER THAN
+		// THE RESOLVEDTYPE - THEN THERE WOULD BE NO NEED TO TREAT SOME METHODS IN A PECULIAR
+		// WAY.
+		// char[] skippableDescriptorPrefix = null;
+		// char[] enclosingTypeName = reader.getEnclosingTypeName();
+		// boolean isStaticType = Modifier.isStatic(reader.getModifiers());
+		// if (!isStaticType && enclosingTypeName!=null) {
+		// StringBuffer sb = new StringBuffer();
+		// sb.append("(L").append(new String(enclosingTypeName)).append(";");
+		// skippableDescriptorPrefix = sb.toString().toCharArray();
+		// }
+		//
+		//
+		// // remove the aspectOf, hasAspect, clinit and ajc$XXX methods
+		// // from those we compare with the existing methods - bug 129163
+		// List nonGenMethods = new ArrayList();
+		// for (int i = 0; i < newMethods.length; i++) {
+		// IBinaryMethod method = newMethods[i];
+		// // if ((method.getModifiers() & 0x1000)!=0) continue; // 0x1000 => synthetic - will cause us to skip access$0 - is this
+		// always safe?
+		// char[] methodName = method.getSelector();
+		// // if (!CharOperation.equals(methodName,NameMangler.METHOD_ASPECTOF) &&
+		// // !CharOperation.equals(methodName,NameMangler.METHOD_HASASPECT) &&
+		// // !CharOperation.equals(methodName,NameMangler.STATIC_INITIALIZER) &&
+		// // !CharOperation.prefixEquals(NameMangler.AJC_DOLLAR_PREFIX,methodName) &&
+		// // !CharOperation.prefixEquals(NameMangler.CLINIT,methodName)) {
+		// nonGenMethods.add(method);
+		// // }
+		// }
+		IBinaryMethod[] existingMs = existingType.binMethods;
+		if (newMethods.length != existingMs.length) {
+			logAnalysis(filename,"number of methods changed. old="+stringify(existingMs)+" new="+stringify(newMethods));
+			return true;
+		}
+		new_method_loop: for (int i = 0; i < newMethods.length; i++) {
+			IBinaryMethod method = newMethods[i];
+			char[] methodName = method.getSelector();
+			for (int j = 0; j < existingMs.length; j++) {
+				if (CharOperation.equals(existingMs[j].getSelector(), methodName)) {
+					// candidate match
+					if (!CharOperation.equals(method.getMethodDescriptor(), existingMs[j].getMethodDescriptor())) {
+						// ok, the descriptors don't match, but is this a funky ctor on a non-static inner
+						// type?
+						// boolean mightBeOK =
+						// skippableDescriptorPrefix!=null && // set for inner types
+						// CharOperation.equals(methodName,NameMangler.INIT) && // ctor
+						// CharOperation.prefixEquals(skippableDescriptorPrefix,method.getMethodDescriptor()); // checking for
+						// prefix on the descriptor
+						// if (mightBeOK) {
+						// // OK, so the descriptor starts something like '(Lpkg/Foo;' - we now may need to look at the rest of the
+						// // descriptor if it takes >1 parameter.
+						// // eg. could be (Lpkg/C;Ljava/lang/String;) where the skippablePrefix is (Lpkg/C;
+						// char [] md = method.getMethodDescriptor();
+						// char[] remainder = CharOperation.subarray(md, skippableDescriptorPrefix.length, md.length);
+						// if (CharOperation.equals(remainder,BRACKET_V)) continue new_method_loop; // no other parameters to worry
+						// about
+						// char[] comparableSig = CharOperation.subarray(existingMethods[j].signature, 1,
+						// existingMethods[j].signature.length);
+						// boolean match = CharOperation.equals(comparableSig, remainder);
+						// if (match) continue new_method_loop;
+						// }
+						continue; // might be overloading
+					} else {
+						// matching sigs
+						IBinaryMethod existing = existingMs[j];
+						if (!modifiersEqual(method.getModifiers(), existing.getModifiers())) {
+							logAnalysis(filename,"method modifiers changed '"+existing+"' old=0x"+Integer.toHexString(existing.getModifiers())+" new=0x"+Integer.toHexString(method.getModifiers()));
+							return true;
+						}
+
+						if (exceptionClausesDiffer(existing, method)) {
+							logAnalysis(filename,"method exception clauses changed '"+existing+"' old="+existing+" new="+method);
+							return true;
+						}
+
+						char[] existingGSig = existing.getGenericSignature();
+						char[] methodGSig = method.getGenericSignature();
+						if ((existingGSig == null && methodGSig != null) || (existingGSig != null && methodGSig == null)) {
+							logAnalysis(filename,"method generic sig changed '"+existing+"' old="+
+									(existingGSig==null?"null":new String(existingGSig))+" new="+(methodGSig==null?"null":new String(methodGSig)));
+							return true;
+						}
+						if (existingGSig != null) {
+							if (!CharOperation.equals(existingGSig, methodGSig)) {
+								logAnalysis(filename,"method generic sig changed '"+existing+"' old="+
+										(existingGSig==null?"null":new String(existingGSig))+" new="+(methodGSig==null?"null":new String(methodGSig)));
+								return true;
+							}
+						}
+
+						continue new_method_loop;
+					}
+				}
+				// TODO missing a return true here? Meaning we have a field in the new that we can't find in the old!
+			}
+
+			logAnalysis(filename,"method changed. New method detected '"+stringify(method)+"' (might be a rename)");
+			return true; // (no match found)
+		}
+
+		// check for differences in inner types
+		// TODO could make order insensitive
+		IBinaryNestedType[] binaryNestedTypes = reader.getMemberTypes();
+		IBinaryNestedType[] existingBinaryNestedTypes = existingType.getMemberTypes();
+		if ((binaryNestedTypes == null && existingBinaryNestedTypes != null)
+				|| (binaryNestedTypes != null && existingBinaryNestedTypes == null)) {
+			logAnalysis(filename,"nested types changed");
+			return true;
+		}
+		if (binaryNestedTypes != null) {
+			int bnLength = binaryNestedTypes.length;
+			if (existingBinaryNestedTypes.length != bnLength) {
+				logAnalysis(filename,"nested types changed. old="+stringify(existingBinaryNestedTypes)+" new="+stringify(binaryNestedTypes));
+				return true;
+			}
+			for (int m = 0; m < bnLength; m++) {
+				IBinaryNestedType bnt = binaryNestedTypes[m];
+				IBinaryNestedType existingBnt = existingBinaryNestedTypes[m];
+				if (!CharOperation.equals(bnt.getName(), existingBnt.getName())) {
+					logAnalysis(filename,"nested type changed name at position "+m+" old="+stringify(existingBinaryNestedTypes)+" new="+stringify(binaryNestedTypes));
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	private String stringify(char[] chars) {
+		if (chars == null) {
+			return "null";
+		}
+		return new String(chars);
+	}
+
+	private String stringify(IBinaryNestedType[] binaryNestedTypes) {
+		StringBuilder buf = new StringBuilder();
+		for (IBinaryNestedType binaryNestedType: binaryNestedTypes) {
+			buf.append(binaryNestedType).append(" ");
+		}
+		return buf.toString().trim();
+	}
+
+	private String stringify(IBinaryMethod[] methods) {
+		StringBuilder buf = new StringBuilder();
+		for (IBinaryMethod method: methods) {
+			buf.append(stringify(method)).append(" ");
+		}
+		return "["+buf.toString().trim()+"]";
+	}
+
+	private String stringify(IBinaryMethod m) {
+		StringBuilder buf = new StringBuilder();
+		buf.append("0x").append(Integer.toHexString(m.getModifiers())).append(" ");
+		buf.append(m.getSelector()).append(m.getMethodDescriptor());
+		// IBinaryAnnotation[] annos = m.getAnnotations();
+		// TODO include annotations, generic sig, etc
+		return buf.toString().trim();
+	}
+
+	private String stringify(IBinaryField[] fields) {
+		StringBuilder buf = new StringBuilder();
+		for (IBinaryField field: fields) {
+			buf.append(stringify(field)).append(" ");
+		}
+		return "["+buf.toString().trim()+"]";
+	}
+
+	private Object stringify(IBinaryField f) {
+		StringBuilder buf = new StringBuilder();
+		buf.append("0x").append(Integer.toHexString(f.getModifiers())).append(" ");
+		buf.append(f.getTypeName()).append(f.getName());
+		return buf.toString().trim();
+	}
+
+	private String stringify(char[][] arrayOfCharArrays) {
+		StringBuilder buf = new StringBuilder();
+		for (char[] charArray: arrayOfCharArrays) {
+			buf.append(charArray).append(" ");
+		}
+		return buf.toString().trim();
+	}
+
+	private String stringify(IBinaryAnnotation[] annotations) {
+		StringBuilder buf = new StringBuilder();
+		for (IBinaryAnnotation anno: annotations) {
+			buf.append(anno).append(" ");
+		}
+		return buf.toString().trim();
+	}
+
 	/**
 	 * For two methods, discover if there has been a change in the exception types specified.
 	 * 
@@ -2204,8 +2549,7 @@
 			ClassParser parser = new ClassParser(f.toString());
 			return world.buildBcelDelegate(referenceType, parser.parse(), true, false);
 		} catch (IOException e) {
-			IMessage msg = new Message("Failed to recover " + referenceType, 
-					referenceType.getDelegate()==null?null:referenceType.getSourceLocation(), false);
+			IMessage msg = new Message("Failed to recover " + referenceType, referenceType.getDelegate()!=null?referenceType.getSourceLocation():null, false);
 			buildManager.handler.handleMessage(msg);
 		}
 		return null;
diff --git a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/CompactTypeStructureRepresentation.java b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/CompactTypeStructureRepresentation.java
index 3d8a462..6770b64 100644
--- a/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/CompactTypeStructureRepresentation.java
+++ b/org.aspectj.ajde/source/org/aspectj/ajdt/internal/core/builder/CompactTypeStructureRepresentation.java
@@ -18,6 +18,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryMethod;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryNestedType;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryType;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation;
 
 /**
  * Used to determine if a type has structurally changed during incremental compilation. At the end of compilation we create one of
@@ -54,6 +55,7 @@
 	IBinaryMethod[] binMethods;
 	IBinaryNestedType[] memberTypes;
 	IBinaryAnnotation[] annotations;
+	IBinaryTypeAnnotation[] typeAnnotations;
 	
 
 	public CompactTypeStructureRepresentation(ClassFileReader cfr, boolean isAspect) {
@@ -82,6 +84,7 @@
 		// references and which were real declarations
 		this.memberTypes = cfr.getMemberTypes(isAspect);
 		this.annotations = cfr.getAnnotations();
+		this.typeAnnotations = cfr.getTypeAnnotations();
 		this.sourceName = cfr.getSourceName();
 		this.className = cfr.getName(); // slashes...
 		this.modifiers = cfr.getModifiers();
@@ -174,4 +177,8 @@
 		return sourceName;
 	}
 
+	public IBinaryTypeAnnotation[] getTypeAnnotations() {
+		return typeAnnotations;
+	}
+
 }
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/CheckDebugAttributes.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/CheckDebugAttributes.java
index 6b17528..eb6d265 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/CheckDebugAttributes.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/CheckDebugAttributes.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
@@ -37,6 +37,7 @@
  * This is not intended to be subclassed by users.
  * @since 2.0
  */
+@SuppressWarnings("rawtypes")
 public final class CheckDebugAttributes extends Task {
 
 	private String file;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/CorrectionEngine.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/CorrectionEngine.java
index 74d1db0..78dbfa9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/CorrectionEngine.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/CorrectionEngine.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
@@ -29,6 +29,7 @@
  * @since 2.0
  * @noextend This class is not intended to be subclassed by clients.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class CorrectionEngine {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/Flags.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/Flags.java
index 8c97e44..2584604 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/Flags.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/Flags.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     IBM Corporation - added constant AccDefault
@@ -161,7 +157,7 @@
 	 * Note that this flag's value is internal and is not defined in the
 	 * Virtual Machine specification.
 	 * </p>
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final int AccDefaultMethod = ExtraCompilerModifiers.AccDefaultMethod;
 
@@ -172,7 +168,7 @@
 	 * Note that this flag's value is internal and is not defined in the
 	 * Virtual Machine specification.
 	 * </p>
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final int AccAnnotationDefault = ClassFileConstants.AccAnnotationDefault;
 	
@@ -392,7 +388,7 @@
 	 *
 	 * @return <code>true</code> if the <code>AccDefaultMethod</code> flag is included
 	 * @see #AccDefaultMethod
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static boolean isDefaultMethod(int flags) {
 		return (flags & AccDefaultMethod) != 0;
@@ -404,7 +400,7 @@
 	 *
 	 * @return <code>true</code> if the <code>AccAnnotationDefault</code> flag is included
 	 * @see #AccAnnotationDefault
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static boolean isAnnnotationDefault(int flags) {
 		return (flags & AccAnnotationDefault) != 0;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IField.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IField.java
index 8a06a87..5c5ea3a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IField.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IField.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
@@ -20,71 +20,17 @@
 
 /**
  * Returns the constant value associated with this field
- * or <code>null</code> if this field has none. The field needs to be static and final to have
- * a constant value.
- * Returns an instance of the wrapper type corresponding to the the type of the field.
- * <table border="1">
- * <tr>
- * <th>field type</th>
- * <th>wrapper type</th>
- * </tr>
- * <tr>
- * <td>int
- * </td>
- * <td>java.lang.Integer
- * </td>
- * </tr>
- * <tr>
- * <td>byte
- * </td>
- * <td>java.lang.Byte
- * </td>
- * </tr>
- * <tr>
- * <td>boolean
- * </td>
- * <td>java.lang.Boolean
- * </td>
- * </tr>
- * <tr>
- * <td>char
- * </td>
- * <td>java.lang.Character
- * </td>
- * </tr>
- * <tr>
- * <td>double
- * </td>
- * <td>java.lang.Double
- * </td>
- * </tr>
- * <tr>
- * <td>float
- * </td>
- * <td>java.lang.Float
- * </td>
- * </tr>
- * <tr>
- * <td>long
- * </td>
- * <td>java.lang.Long
- * </td>
- * </tr>
- * <tr>
- * <td>short
- * </td>
- * <td>java.lang.Short
- * </td>
- * </tr>
- * <tr>
- * <td>java.lang.String
- * </td>
- * <td>java.lang.String
- * </td>
- * </tr>
- * </table>
+ * or <code>null</code> if this field has none. To have a constant value, the field needs to be
+ * final and initialized with a compile-time constant expression.
+ * <p>
+ * For types from source, this currently only works if the field initializer is a literal (returns
+ * <code>null</code> for more complex constant expressions).
+ * </p>
+ * <p>
+ * For primitive types, returns the boxed value.
+ * </p>
  *
- * @return  the constant value associated with this field or <code>null</code> if this field has none.
+ * @return  the constant value associated with this field, or <code>null</code> if not available
  * @exception JavaModelException if this element does not exist or if an
  *      exception occurs while accessing its corresponding resource
  */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IJavaProject.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IJavaProject.java
index f9799b6..d41321b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IJavaProject.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IJavaProject.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
@@ -62,6 +62,7 @@
  * @see IClasspathEntry
  * @noimplement This interface is not intended to be implemented by clients.
  */
+@SuppressWarnings("rawtypes")
 public interface IJavaProject extends IParent, IJavaElement, IOpenable {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IMethod.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IMethod.java
index da1a9b4..6863199 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IMethod.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/IMethod.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -258,6 +258,15 @@
  * @return true if this method is a main method, false otherwise
  */
 boolean isMainMethod() throws JavaModelException;
+
+/**
+ * Returns whether this method represents a lambda expression.
+ *
+ * @since 3.10
+ * @return true if this method represents a lambda expression, false otherwise.
+ */
+boolean isLambdaMethod();
+
 /**
  * Returns whether this method represents a resolved method.
  * If a method is resolved, its key contains resolved information.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/JDTCompilerAdapter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/JDTCompilerAdapter.java
index c1cb0ec..65aff4c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/JDTCompilerAdapter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/JDTCompilerAdapter.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
@@ -50,6 +50,7 @@
  *
  * @since 2.0
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class JDTCompilerAdapter extends DefaultCompilerAdapter {
 	private static final char[] SEPARATOR_CHARS = new char[] { '/', '\\' };
 	private static final char[] ADAPTER_PREFIX = "#ADAPTER#".toCharArray(); //$NON-NLS-1$
@@ -149,14 +150,14 @@
 		// This is done to improve the compatibility to ant 1.5
 		Method getSourcepathMethod = null;
 		try {
-			getSourcepathMethod = javacClass.getMethod("getSourcepath", null); //$NON-NLS-1$
+			getSourcepathMethod = javacClass.getMethod("getSourcepath", (Class[]) null); //$NON-NLS-1$
 		} catch(NoSuchMethodException e) {
 			// if not found, then we cannot use this method (ant 1.5)
 		}
 		Path compileSourcePath = null;
 		if (getSourcepathMethod != null) {
 			try {
-				compileSourcePath = (Path) getSourcepathMethod.invoke(this.attributes, null);
+				compileSourcePath = (Path) getSourcepathMethod.invoke(this.attributes, (Object[]) null);
 			} catch (IllegalAccessException e) {
 				// should never happen
 			} catch (InvocationTargetException e) {
@@ -196,7 +197,7 @@
 			// This is done to improve the compatibility to ant 1.5
 			Method getDebugLevelMethod = null;
 			try {
-				getDebugLevelMethod = javacClass.getMethod("getDebugLevel", null); //$NON-NLS-1$
+				getDebugLevelMethod = javacClass.getMethod("getDebugLevel", (Class[]) null); //$NON-NLS-1$
 			} catch(NoSuchMethodException e) {
 				// if not found, then we cannot use this method (ant 1.5)
 				// debug level is only available with ant 1.5.x
@@ -204,7 +205,7 @@
 			String debugLevel = null;
 			if (getDebugLevelMethod != null) {
 				try {
-					debugLevel = (String) getDebugLevelMethod.invoke(this.attributes, null);
+					debugLevel = (String) getDebugLevelMethod.invoke(this.attributes, (Object[]) null);
 				} catch (IllegalAccessException e) {
 					// should never happen
 				} catch (InvocationTargetException e) {
@@ -349,7 +350,7 @@
 		// This is done to improve the compatibility to ant 1.5
 		Method getCurrentCompilerArgsMethod = null;
 		try {
-			getCurrentCompilerArgsMethod = javacClass.getMethod("getCurrentCompilerArgs", null); //$NON-NLS-1$
+			getCurrentCompilerArgsMethod = javacClass.getMethod("getCurrentCompilerArgs", (Class[]) null); //$NON-NLS-1$
 		} catch (NoSuchMethodException e) {
 			// if not found, then we cannot use this method (ant 1.5)
 			// debug level is only available with ant 1.5.x
@@ -357,7 +358,7 @@
 		String[] compilerArgs = null;
 		if (getCurrentCompilerArgsMethod != null) {
 			try {
-				compilerArgs = (String[]) getCurrentCompilerArgsMethod.invoke(this.attributes, null);
+				compilerArgs = (String[]) getCurrentCompilerArgsMethod.invoke(this.attributes, (Object[]) null);
 			} catch (IllegalAccessException e) {
 				// should never happen
 			} catch (InvocationTargetException e) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/JavaCore.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/JavaCore.java
index b950d1f..3b28c5c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/JavaCore.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/JavaCore.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     IBM Corporation - added the following constants:
@@ -102,7 +98,10 @@
  *									COMPILER_INHERIT_NULL_ANNOTATIONS
  *									COMPILER_PB_NONNULL_PARAMETER_ANNOTATION_DROPPED
  *									COMPILER_PB_SYNTACTIC_NULL_ANALYSIS_FOR_FIELDS
- *     Jesper S Moller  - Contributions for bug 381345 : [1.8] Take care of the Java 8 major version
+ *     Jesper S Moller   - Contributions for bug 381345 : [1.8] Take care of the Java 8 major version
+ *                       - added the following constants:
+ *									COMPILER_CODEGEN_METHOD_PARAMETERS_ATTR
+ *     
  *******************************************************************************/
 
 package org.aspectj.org.eclipse.jdt.core;
@@ -174,7 +173,8 @@
  * </p>
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
-public class JavaCore extends Plugin { // AspectJ Extension - made non-final
+@SuppressWarnings({ "unchecked", "rawtypes" })
+public /*final*/ class JavaCore extends Plugin {  // AspectJ Extension - made non-final
 
 	private static final IResource[] NO_GENERATED_RESOURCES = new IResource[0];
 
@@ -271,6 +271,19 @@
 	 */
 	public static final String COMPILER_CODEGEN_UNUSED_LOCAL = PLUGIN_ID + ".compiler.codegen.unusedLocal"; //$NON-NLS-1$
 	/**
+	 * Compiler option ID: Generating Method Parameters  Attribute.
+	 * <p>When generated, this attribute will enable parameter names to be accessed from reflection libraries, annotation processing,
+	 * code weaving, and in the debugger, from platform target level 1.8 and later.</p>
+	 * <dl>
+	 * <dt>Option id:</dt><dd><code>"org.aspectj.org.eclipse.jdt.core.compiler.codegen.methodParameters"</code></dd>
+	 * <dt>Possible values:</dt><dd><code>{ "generate", "do not generate" }</code></dd>
+	 * <dt>Default:</dt><dd><code>"do not generate"</code></dd>
+	 * </dl>
+	 * @since 3.10
+	 * @category CompilerOptionID
+	 */
+	public static final String COMPILER_CODEGEN_METHOD_PARAMETERS_ATTR = PLUGIN_ID + ".compiler.codegen.methodParameters"; //$NON-NLS-1$
+	/**
 	 * Compiler option ID: Defining Target Java Platform.
 	 * <p>For binary compatibility reason, .class files can be tagged to with certain VM versions and later.</p>
 	 * <p>Note that <code>"1.4"</code> target requires to toggle compliance mode to <code>"1.4"</code>, <code>"1.5"</code> target requires
@@ -932,9 +945,10 @@
 	 */
 	public static final String COMPILER_PB_RAW_TYPE_REFERENCE = PLUGIN_ID + ".compiler.problem.rawTypeReference"; //$NON-NLS-1$
 	/**
-	 * Compiler option ID: Reporting of Unavoidable Generic Type Problems.
-	 * <p> When enabled, the compiler will issue an error or warning even when it detects a generic type problem
-	 *     that could not have been avoided by the programmer. As an example, a type may be forced to use raw types
+	 * Compiler option ID: Reporting of Unavoidable Generic Type Problems due to raw APIs.
+	 * <p> When enabled, the compiler will issue an error or warning even when it detects a generics-related type problem
+	 *     that could not have been avoided by the programmer, because a referenced API already contains raw types.
+	 *     As an example, a type may be forced to use raw types
 	 *     in its method signatures and return types because the methods it overrides from a super type are declared to
 	 *     use raw types in the first place.</p>
 	 * <dl>
@@ -2646,7 +2660,7 @@
 	public static final String VERSION_1_7 = "1.7"; //$NON-NLS-1$
 	/**
 	 * Configurable option value: {@value}.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 * @category OptionValue
 	 */
 	public static final String VERSION_1_8 = "1.8"; //$NON-NLS-1$
@@ -4062,6 +4076,21 @@
 				// Creation of external folder project failed. Log it and continue;
 				Util.log(jme, "Error while processing external folders"); //$NON-NLS-1$
 			}
+
+			// ensure external jars are refreshed (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=93668)
+			// before search is initialized (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=405051)
+			final JavaModel model = manager.getJavaModel();
+			try {
+				if (monitor != null)
+					monitor.subTask(Messages.javamodel_refreshing_external_jars);
+				model.refreshExternalArchives(
+					null/*refresh all projects*/,
+					monitor == null ? null : new SubProgressMonitor(monitor, 1) // 1% of the time is spent in jar refresh
+				);
+			} catch (JavaModelException e) {
+				// refreshing failed: ignore
+			}
+
 			// initialize delta state
 			if (monitor != null)
 				monitor.subTask(Messages.javamodel_initializing_delta_state);
@@ -4116,7 +4145,6 @@
 			} catch (CoreException e) {
 				// could not read version number: consider it is new
 			}
-			final JavaModel model = manager.getJavaModel();
 			String newVersionNumber = Byte.toString(State.VERSION);
 			if (!newVersionNumber.equals(versionNumber)) {
 				// build state version number has changed: touch every projects to force a rebuild
@@ -4150,19 +4178,6 @@
 					Util.log(e, "Could not persist build state version number"); //$NON-NLS-1$
 				}
 			}
-
-			// ensure external jars are refreshed (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=93668)
-			try {
-				if (monitor != null)
-					monitor.subTask(Messages.javamodel_refreshing_external_jars);
-				model.refreshExternalArchives(
-					null/*refresh all projects*/,
-					monitor == null ? null : new SubProgressMonitor(monitor, 1) // 1% of the time is spent in jar refresh
-				);
-			} catch (JavaModelException e) {
-				// refreshing failed: ignore
-			}
-
 		} finally {
 			if (monitor != null) monitor.done();
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/Signature.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/Signature.java
index da99290..45a096d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/Signature.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/Signature.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
@@ -143,6 +143,7 @@
  * 
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public final class Signature {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/ToolFactory.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/ToolFactory.java
index 8050d12..97d1faf 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/ToolFactory.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/ToolFactory.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
@@ -50,6 +50,7 @@
  * @noinstantiate This class is not intended to be instantiated by clients.
  * @noextend This class is not intended to be subclassed by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ToolFactory {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/IProblem.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/IProblem.java
index 562ac4e..161ad23 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/IProblem.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/IProblem.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     IBM Corporation - added the following constants
@@ -161,7 +157,9 @@
  *									ArrayReferencePotentialNullReference
  *									DereferencingNullableExpression
  *									NullityMismatchingTypeAnnotation
- *									NullityMismatchingTypeAnnotationUnchecked
+ *									NullityMismatchingTypeAnnotationSuperHint
+ *									NullityUncheckedTypeAnnotationDetail
+ *									NullityUncheckedTypeAnnotationDetailSuperHint
  *									NullableFieldReference
  *									UninitializedNonNullField
  *									UninitializedNonNullFieldHintMissingDefault
@@ -170,8 +168,8 @@
  *									NonNullSpecdFieldComparisonYieldsFalse
  *									NonNullExpressionComparisonYieldsFalse
  *									RedundantNullCheckOnNonNullExpression
- *									ReferenceExpressionParameterMismatchPromisedNullable
- *									ReferenceExpressionParameterRequiredNonnullUnchecked
+ *									ReferenceExpressionParameterNullityMismatch
+ *									ReferenceExpressionParameterNullityUnchecked
  *									ReferenceExpressionReturnNullRedef
  *									ReferenceExpressionReturnNullRedefUnchecked
  *									DuplicateInheritedDefaultMethods
@@ -184,11 +182,31 @@
  *									NullUnboxing
  *									NullExpressionReference
  *									PotentialNullExpressionReference
+ *									RedundantNullCheckAgainstNonNullType
+ *									NullAnnotationUnsupportedLocation
+ *									NullAnnotationUnsupportedLocationAtType
+ *									NullityMismatchTypeArgument
+ *									ContradictoryNullAnnotationsOnBound
+ *									UnsafeNullnessCast
+ *									ContradictoryNullAnnotationsInferred
+ *									NonNullDefaultDetailIsNotEvaluated
  *      Jesper S Moller  - added the following constants
  *									TargetTypeNotAFunctionalInterface
  *									OuterLocalMustBeEffectivelyFinal
  *									IllegalModifiersForPackage
- *******************************************************************************/
+ *									DuplicateAnnotationNotMarkedRepeatable
+ *									DisallowedTargetForContainerAnnotation
+ *									RepeatedAnnotationWithContainerAnnotation
+ *									ContainingAnnotationMustHaveValue
+ *									ContainingAnnotationHasNonDefaultMembers
+ *									ContainingAnnotationHasWrongValueType
+ *								 	ContainingAnnotationHasShorterRetention
+ *									RepeatableAnnotationHasTargets
+ *									RepeatableAnnotationTargetMismatch
+ *									RepeatableAnnotationIsDocumented
+ *									RepeatableAnnotationIsInherited
+ *									RepeatableAnnotationWithRepeatingContainerAnnotation
+*******************************************************************************/
 package org.aspectj.org.eclipse.jdt.core.compiler;
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemReasons;
@@ -302,9 +320,21 @@
 
 
 	// AspectJ Extension
+    /**
+     * @since 3.10
+     */
 	void setSeeAlsoProblems(IProblem[] problems);
+    /**
+     * @since 3.10
+     */
 	IProblem[] seeAlso();
+    /**
+     * @since 3.10
+     */
 	void setSupplementaryMessageInfo(String msg);
+    /**
+     * @since 3.10
+     */
 	String getSupplementaryMessageInfo();
 	// End AspectJ Extension
 	
@@ -363,6 +393,9 @@
 	int TypeMismatch = TypeRelated + 17;
 	/** @since 3.0 */
 	int IndirectAccessToStaticType = Internal + TypeRelated + 18;
+	
+	/** @since 3.10 */
+	int ReturnTypeMismatch = TypeRelated + 19;
 
 	/**
 	 * Inner types related problems
@@ -437,7 +470,7 @@
 	int DuplicateBlankFinalFieldInitialization = FieldRelated + 82;
 	/** @since 3.6 */
 	int UnresolvedVariable = FieldRelated + 83;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int NonStaticOrAlienTypeReceiver = MethodRelated + 84;
 	// variable hiding
 	/** @since 3.0 */
@@ -454,11 +487,11 @@
 	int ArgumentHidingField = Internal + 95;
 	/** @since 3.1 */
 	int MissingSerialVersion = Internal + 96;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int LambdaRedeclaresArgument = Internal + 97;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int LambdaRedeclaresLocal = Internal + 98;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int LambdaDescriptorMentionsUnmentionable = 99;
 
 	// methods
@@ -490,17 +523,17 @@
 	int MethodCanBeStatic = Internal + MethodRelated + 121;
 	/** @since 3.7 */
 	int MethodCanBePotentiallyStatic = Internal + MethodRelated + 122;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int MethodReferenceSwingsBothWays = Internal + MethodRelated + 123;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int StaticMethodShouldBeAccessedStatically = Internal + MethodRelated + 124;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int InvalidArrayConstructorReference = Internal + MethodRelated + 125;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int ConstructedArrayIncompatible = Internal + MethodRelated + 126;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int DanglingReference = Internal + MethodRelated + 127;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int IncompatibleMethodReference = Internal + MethodRelated + 128;
 
 	// constructors
@@ -648,6 +681,9 @@
 	/** @since 2.1 */
 	int InvalidParenthesizedExpression = Syntax + Internal + 225;
 
+	/** @since 3.10 */
+	int NoSuperInInterfaceContext = Syntax + Internal + 226;
+
 	/** @since 3.0 */
 	int ParsingErrorInsertTokenBefore = Syntax + Internal + 230;
 	/** @since 3.0 */
@@ -707,6 +743,9 @@
 	/** @since 3.7.1 */
 	int IllegalHexaLiteral = Syntax + Internal + 270;
 
+	/** @since 3.10 */
+	int MissingTypeInLambda = MethodRelated + 271;
+
 	// type related problems
 	/** @since 3.1 */
 	int DiscouragedReference = TypeRelated + 280;
@@ -933,8 +972,11 @@
 	/** @since 3.2 */
 	int EnumConstantsCannotBeSurroundedByParenthesis = Syntax + Internal + 442;
 
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int IllegalUseOfUnderscoreAsAnIdentifier = Syntax + Internal + 443;
+	 /** @since 3.10 */
+	int UninternedIdentityComparison = Syntax + Internal + 444;
+
 	// detected task
 	/** @since 2.1 */
 	int Task = Internal + 450;
@@ -966,6 +1008,9 @@
 	int UndocumentedEmptyBlock = Internal + 460;
 	
 	/* AspectJ Extension */
+	/**
+	 * @since 3.10
+	 */
 	int SwallowedExceptionInCatchBlock = Internal + 699; 
 	/* End AspectJ Extension */
 	
@@ -1365,51 +1410,51 @@
 	int UnusedWarningToken = Internal + 635;
 	/** @since 3.6 */
 	int MissingOverrideAnnotationForInterfaceMethodImplementation = MethodRelated + 636;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
     int InvalidUsageOfTypeAnnotations = Syntax + Internal + 637;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int DisallowedExplicitThisParameter = Syntax + Internal + 638;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int MisplacedTypeAnnotations = Syntax + Internal + 639;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int IllegalTypeAnnotationsInStaticMemberAccess = Internal + Syntax + 640;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int IllegalUsageOfTypeAnnotations = Internal + Syntax + 641;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int IllegalDeclarationOfThisParameter = Internal + Syntax + 642;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int ExplicitThisParameterNotBelow18 = Internal + Syntax + 643;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int DefaultMethodNotBelow18 = Internal + Syntax + 644;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int LambdaExpressionNotBelow18 = Internal + Syntax + 645;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int MethodReferenceNotBelow18 = Internal + Syntax + 646;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int ConstructorReferenceNotBelow18 = Internal + Syntax + 647;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int ExplicitThisParameterNotInLambda = Internal + Syntax + 648;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int ExplicitAnnotationTargetRequired = TypeRelated + 649;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int IllegalTypeForExplicitThis = Internal + Syntax + 650;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int IllegalQualifierForExplicitThis = Internal + Syntax + 651;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int IllegalQualifierForExplicitThis2 = Internal + Syntax + 652;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int TargetTypeNotAFunctionalInterface = Internal + TypeRelated + 653;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int IllegalVarargInLambda = Internal + TypeRelated + 654;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int illFormedParameterizationOfFunctionalInterface = Internal + TypeRelated + 655;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int lambdaSignatureMismatched = Internal + TypeRelated + 656;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int lambdaParameterTypeMismatched = Internal + TypeRelated + 657;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int IncompatibleLambdaParameterType = Internal + TypeRelated + 658;
-    /** @since 3.9 BETA_JAVA8 */
+    /** @since 3.10 */
     int NoGenericLambda = Internal + TypeRelated + 659;
     /**
 	 * More problems in generics
@@ -1420,12 +1465,14 @@
 	int UnusedTypeParameter = TypeRelated + 661;
 	/** @since 3.9 */
 	int IllegalArrayOfUnionType = TypeRelated + 662;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int OuterLocalMustBeEffectivelyFinal = Internal + 663;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int InterfaceNotFunctionalInterface = Internal + TypeRelated + 664;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int ConstructionTypeMismatch = Internal + TypeRelated + 665;
+    /** @since 3.10 */
+    int ToleratedMisplacedTypeAnnotations = Syntax + Internal + 666;
 
 
 	/**
@@ -1531,6 +1578,9 @@
 	int VarargsElementTypeNotVisible = MethodRelated + 807;
 	/** @since 3.8 */
 	int VarargsElementTypeNotVisibleForConstructor = ConstructorRelated + 808;
+	/** @since 3.10 */
+	int ApplicableMethodOverriddenByInapplicable = MethodRelated + 809;
+
 	/**
 	 * Javadoc Generic
 	 */
@@ -1600,18 +1650,53 @@
 	int ExplicitlyClosedAutoCloseable = Internal + 889;
 	/** @since 3.8 */
 	int SwitchOnEnumNotBelow15 = TypeRelated + 890;	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=360317
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int IntersectionCastNotBelow18 = TypeRelated + 891;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int IllegalBasetypeInIntersectionCast = TypeRelated + 892;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int IllegalArrayTypeInIntersectionCast = TypeRelated + 893;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int DuplicateBoundInIntersectionCast = TypeRelated + 894;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int MultipleFunctionalInterfaces = TypeRelated + 895;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int StaticInterfaceMethodNotBelow18 = Internal + Syntax + 896;
+	/** @since 3.10 */
+	int DuplicateAnnotationNotMarkedRepeatable = TypeRelated + 897;
+	/** @since 3.10 */
+	int DisallowedTargetForContainerAnnotationType = TypeRelated + 898;
+	/** @since 3.10 */
+	int RepeatedAnnotationWithContainerAnnotation = TypeRelated + 899;
+	
+	/**
+	 * External problems -- These are problems defined by other plugins
+	 */
+
+	/** @since 3.2 */
+	int ExternalProblemNotFixable = 900;
+
+	// indicates an externally defined problem that has a quick-assist processor
+	// associated with it
+	/** @since 3.2 */
+	int ExternalProblemFixable = 901;
+	
+	/** @since 3.10 */
+	int ContainerAnnotationTypeHasWrongValueType = TypeRelated + 902;
+	/** @since 3.10 */
+	int ContainerAnnotationTypeMustHaveValue = TypeRelated + 903;
+	/** @since 3.10 */
+	int ContainerAnnotationTypeHasNonDefaultMembers = TypeRelated + 904;
+	/** @since 3.10 */
+	int ContainerAnnotationTypeHasShorterRetention = TypeRelated + 905;
+	/** @since 3.10 */
+	int RepeatableAnnotationTypeTargetMismatch = TypeRelated + 906;
+	/** @since 3.10 */
+	int RepeatableAnnotationTypeIsDocumented = TypeRelated + 907;
+	/** @since 3.10 */
+	int RepeatableAnnotationTypeIsInherited = TypeRelated + 908;
+	/** @since 3.10 */
+	int RepeatableAnnotationWithRepeatingContainerAnnotation = TypeRelated + 909;
 	
 	/**
 	 * Errors/warnings from annotation based null analysis
@@ -1678,61 +1763,84 @@
 	int ConflictingNullAnnotations = MethodRelated + 939;
 	/** @since 3.9 */
 	int ConflictingInheritedNullAnnotations = MethodRelated + 940;
+	/** @since 3.10 */
+	int RedundantNullCheckOnField = Internal + 941;
+	/** @since 3.10 */
+	int FieldComparisonYieldsFalse = Internal + 942;
 	
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int ArrayReferencePotentialNullReference = Internal + 951;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int DereferencingNullableExpression = Internal + 952;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int NullityMismatchingTypeAnnotation = Internal + 953;
-	/** @since 3.9 BETA_JAVA8 */
-	int NullityMismatchingTypeAnnotationUnchecked = Internal + 954;
-	/** @since 3.9 BETA_JAVA8 */
-	int ReferenceExpressionParameterMismatchPromisedNullable = MethodRelated + 955;
-	/** @since 3.9 BETA_JAVA8 */
-	int ReferenceExpressionParameterRequiredNonnullUnchecked = MethodRelated + 956;
-	/** @since 3.9 BETA_JAVA8 */
-	int ReferenceExpressionReturnNullRedef = MethodRelated + 957;
-	/** @since 3.9 BETA_JAVA8 */
-	int ReferenceExpressionReturnNullRedefUnchecked = MethodRelated + 958;
+	/** @since 3.10 */
+	int NullityMismatchingTypeAnnotationSuperHint = Internal + 954;
+	/** @since 3.10 */
+	int NullityUncheckedTypeAnnotationDetail = Internal + 955;
+	/** @since 3.10 */
+	int NullityUncheckedTypeAnnotationDetailSuperHint = Internal + 956;
+	/** @since 3.10 */
+	int ReferenceExpressionParameterNullityMismatch = MethodRelated + 957;
+	/** @since 3.10 */
+	int ReferenceExpressionParameterNullityUnchecked = MethodRelated + 958;
+	/** @since 3.10 */
+	int ReferenceExpressionReturnNullRedef = MethodRelated + 959;
+	/** @since 3.10 */
+	int ReferenceExpressionReturnNullRedefUnchecked = MethodRelated + 960;
+	/** @since 3.10 */
+	int RedundantNullCheckAgainstNonNullType = Internal + 961;
+	/** @since 3.10 */
+	int NullAnnotationUnsupportedLocation = Internal + 962;
+	/** @since 3.10 */
+	int NullAnnotationUnsupportedLocationAtType = Internal + 963;
+	/** @since 3.10 */
+	int NullityMismatchTypeArgument = Internal + 964;
+	/** @since 3.10 */
+	int ContradictoryNullAnnotationsOnBound = Internal + 965;
+	/** @since 3.10 */
+	int ContradictoryNullAnnotationsInferred = Internal + 966;
+	/** @since 3.10 */
+	int UnsafeNullnessCast = Internal + 967;
+	/** @since 3.10 */
+	int NonNullDefaultDetailIsNotEvaluated = 968;
 
 	// Java 8 work
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int IllegalModifiersForElidedType = Internal + 1001;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int IllegalModifiers = Internal + 1002;
 
+	/** @since 3.10 */
+	int IllegalTypeArgumentsInRawConstructorReference = TypeRelated + 1003;
+
 	// default methods:
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int IllegalModifierForInterfaceMethod18 = MethodRelated + 1050;
 
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int DefaultMethodOverridesObjectMethod = MethodRelated + 1051;
 	
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int InheritedDefaultMethodConflictsWithOtherInherited = MethodRelated + 1052;
 	
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int DuplicateInheritedDefaultMethods = MethodRelated + 1053;
 
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int SuperAccessCannotBypassDirectSuper = TypeRelated + 1054;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int SuperCallCannotBypassOverride = MethodRelated + 1055;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int IllegalModifierCombinationForInterfaceMethod = MethodRelated + 1056;
-	/** @since 3.9 BETA_JAVA8 */
+	/** @since 3.10 */
 	int IllegalStrictfpForAbstractInterfaceMethod = MethodRelated + 1057;
+	/** @since 3.10 */
+	int IllegalDefaultModifierSpecification = MethodRelated + 1058;
 
-	/**
-	 * External problems -- These are problems defined by other plugins
-	 */
-
-	/** @since 3.2 */
-	int ExternalProblemNotFixable = 900;
-
-	// indicates an externally defined problem that has a quick-assist processor
-	// associated with it
-	/** @since 3.2 */
-	int ExternalProblemFixable = 901;
+	/** @since 3.10 */
+	int GenericInferenceError = 1100; 	// FIXME: This is just a stop-gap measure, be more specific via https://bugs.eclipse.org/404675
+	
+	/** @since 3.10 */
+	int LambdaShapeComputationError = 1101;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/ITerminalSymbols.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/ITerminalSymbols.java
index 7779175..52070e9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/ITerminalSymbols.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/ITerminalSymbols.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -169,11 +165,11 @@
 	int TokenNamegoto = 404;  // goto not found in Java ? :)
 
 	/**
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	int TokenNameARROW = 405;
 	/**
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	int TokenNameCOLON_COLON = 406;
 	
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/ReconcileContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/ReconcileContext.java
index 764de34..3ff41dd 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/ReconcileContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/compiler/ReconcileContext.java
@@ -46,6 +46,7 @@
  * @noinstantiate This class is not intended to be instantiated by clients.
  * @noextend This class is not intended to be subclassed by clients.
  */
+@SuppressWarnings({"rawtypes"})
 public class ReconcileContext {
 
 	private ReconcileWorkingCopyOperation operation;
@@ -162,7 +163,7 @@
  * <ul>
  * <li> The working copy does not exist (ELEMENT_DOES_NOT_EXIST)</li>
  * </ul>
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  */
 public org.aspectj.org.eclipse.jdt.core.dom.CompilationUnit getAST8() throws JavaModelException {
 	if (this.operation.astLevel != AST.JLS8 || !this.operation.resolveBindings) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AST.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AST.java
index 05a3bc5..4e9d8d8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AST.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AST.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -96,6 +92,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 // AspectJ Extension - made non-final
 public class AST {
 	/**
@@ -172,7 +169,7 @@
 	/**
 	 * Internal synonym for {@link #JLS4}. Use to alleviate
 	 * deprecation warnings.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	/*package*/ static final int JLS4_INTERNAL = JLS4;
 	
@@ -188,7 +185,7 @@
 	 * up to and including Java SE 8 (aka JDK 1.8).
 	 * </p>
 	 *
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final int JLS8 = 8;
 
@@ -679,7 +676,7 @@
      * (AST) following the specified set of API rules.
      *
  	 * @param level the API level; one of the <code>JLS*</code> level constants
-     * @since 3.0
+	 * @since 3.10 // Up'd from 3.0 because of @since check due to raising visibility
 	 */
 	protected AST(int level) {  // AspectJ - raised to protected
 		switch(level) {
@@ -1005,6 +1002,14 @@
 	}
 
 	/**
+	 * A local method to workaround calling deprecated method in array type.
+	 * @deprecated
+	 */
+	private void setArrayComponentType(ArrayType arrayType, Type type) {
+		arrayType.setComponentType(type);
+	}
+
+	/**
 	 * Creates and returns a new unparented annotation type declaration
 	 * node for an unspecified, but legal, name; no modifiers; no javadoc;
 	 * and an empty list of member declarations.
@@ -1115,54 +1120,86 @@
 
 	/**
 	 * Creates and returns a new unparented array type node with the given
-	 * component type, which may be another array type.
+	 * element type, which cannot be an array type for API levels JLS8 and later.
+	 * By default, the array type has one non-annotated dimension.
+	 * <p>
+	 * For JLS4 and before, the given component type may be another array type.
 	 *
-	 * @param componentType the component type (possibly another array type)
+	 * @param elementType element type for API level JLS8 and later, or the
+	 * component type (possibly another array type) for levels less than JLS8
 	 * @return a new unparented array type node
 	 * @exception IllegalArgumentException if:
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
 	 * <li>the node already has a parent</li>
+	 * <li>API level is JLS8 or later and type is an array type</li>
 	 * </ul>
 	 */
-	public ArrayType newArrayType(Type componentType) {
-		ArrayType result = new ArrayType(this);
-		result.setComponentType(componentType);
+	public ArrayType newArrayType(Type elementType) {
+		ArrayType result;
+		if (this.apiLevel < AST.JLS8) {
+			result = new ArrayType(this);
+			setArrayComponentType(result, elementType);
+			return result;
+		}
+		if (elementType.isArrayType()) {
+			throw new IllegalArgumentException();
+		}
+		result = new ArrayType(this);
+		result.setElementType(elementType);
 		return result;
 	}
 
 	/**
 	 * Creates and returns a new unparented array type node with the given
-	 * element type and number of (additional) dimensions.
+	 * element type and number of dimensions.
 	 * <p>
-	 * Note that if the element type passed in is an array type, the
+	 * For JLS4 and before, the element type passed in can be an array type, but in that case, the
 	 * element type of the result will not be the same as what was passed in.
+	 * For JLS4 and before, the dimensions cannot be 0.
 	 * </p>
 	 *
-	 * @param elementType the element type (can be an array type)
-	 * @param dimensions the number of dimensions, a positive number
+	 * @param elementType the element type (cannot be an array type for JLS8 and later)
+	 * @param dimensions the number of dimensions, a non-negative number
 	 * @return a new unparented array type node
 	 * @exception IllegalArgumentException if:
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
 	 * <li>the node already has a parent</li>
 	 * <li>the element type is null</li>
-	 * <li>the number of dimensions is lower than 1</li>
-	 * <li>the number of dimensions is greater than 1000</li>
+	 * <li>the number of dimensions is lower than 0 (for JLS4 and before: lower than 1)</li>
+	 * <li>the number of dimensions is greater than 255</li>
+	 * <li>for levels from JLS8 and later, if the element type is an array type </li>
 	 * </ul>
 	 */
 	public ArrayType newArrayType(Type elementType, int dimensions) {
 		if (elementType == null) {
 			throw new IllegalArgumentException();
 		}
-		if (dimensions < 1 || dimensions > 1000) {
-			// we would blow our stacks anyway with a 1000-D array
+		if (dimensions < 0 || dimensions > 255) {
+			// max as per Java VM spec
 			throw new IllegalArgumentException();
 		}
-		ArrayType result = new ArrayType(this);
-		result.setComponentType(elementType);
-		for (int i = 2; i <= dimensions; i++) {
-			result = newArrayType(result);
+		ArrayType result;
+		if (this.apiLevel < AST.JLS8) {
+			if (dimensions < 1) {
+				throw new IllegalArgumentException();
+			}
+			result = new ArrayType(this);
+			setArrayComponentType(result, elementType);
+			for (int i = 2; i <= dimensions; i++) {
+				result = newArrayType(result);
+			}
+			return result;
+		}
+		//level >= JLS8
+		if (elementType.isArrayType()) {
+			throw new IllegalArgumentException();
+		}
+		result = new ArrayType(this, 0);
+		result.setElementType(elementType);
+		for (int i = 0; i < dimensions; ++i) {
+			result.dimensions().add(new Dimension(this));
 		}
 		return result;
 
@@ -1357,7 +1394,7 @@
 	 * 
 	 * @return a new unparented creation reference expression node
 	 * @exception UnsupportedOperationException if this operation is used in a JLS2, JLS3 or JLS4 AST
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public CreationReference newCreationReference() {
 		CreationReference result = new CreationReference(this);
@@ -1438,7 +1475,7 @@
 	 * 
 	 * @return a new unparented expression method reference expression node
 	 * @exception UnsupportedOperationException if this operation is used in a JLS2, JLS3 or JLS4 AST
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public ExpressionMethodReference newExpressionMethodReference() {
 		ExpressionMethodReference result = new ExpressionMethodReference(this);
@@ -1471,10 +1508,10 @@
 	}
 
 	/**
-	 * Creates and returns a new unparented annotatable extra dimension node
+	 * Creates and returns a new unparented annotatable dimension node
 	 * (Supported only in JLS8 level).
 	 *
-	 * @return a new unparented annotatable extra dimension node
+	 * @return a new unparented annotatable dimension node
 	 * @exception IllegalArgumentException if:
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
@@ -1482,10 +1519,10 @@
 	 * </ul>
 	 * @exception UnsupportedOperationException if this operation is used
 	 *            in a JLS2, JLS3 or JLS4 AST
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
-	public ExtraDimension newExtraDimension() {
-		ExtraDimension result = new ExtraDimension(this);
+	public Dimension newDimension() {
+		Dimension result = new Dimension(this);
 		return result;
 	}
 
@@ -1633,7 +1670,7 @@
 	 * 
 	 * @return a new unparented lambda expression node
 	 * @exception UnsupportedOperationException if this operation is used in a JLS2, JLS3 or JLS4 AST
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public LambdaExpression newLambdaExpression() {
 		LambdaExpression result = new LambdaExpression(this);
@@ -1940,6 +1977,29 @@
 	}
 
 	/**
+	 * Creates and returns a new unparented name qualified type node with
+	 * the given qualifier and name.
+	 *
+	 * @param qualifier the name qualifier name node
+	 * @param name the simple name being qualified
+	 * @return a new unparented qualified type node
+	 * @exception IllegalArgumentException if:
+	 * <ul>
+	 * <li>the node belongs to a different AST</li>
+	 * <li>the node already has a parent</li>
+	 * </ul>
+	 * @exception UnsupportedOperationException if this operation is used in
+	 * a JLS2, JLS3 and JLS4 AST
+	 * @since 3.10
+	 */
+	public NameQualifiedType newNameQualifiedType(Name qualifier, SimpleName name) {
+		NameQualifiedType result = new NameQualifiedType(this);
+		result.setQualifier(qualifier);
+		result.setName(name);
+		return result;
+	}
+
+	/**
 	 * Creates and returns a new unparented normal annotation node with
 	 * an unspecified type name and an empty list of member value
 	 * pairs.
@@ -2004,29 +2064,6 @@
 	}
 
 	/**
-	 * Creates and returns a new unparented package qualified type node with
-	 * the given qualifier and name.
-	 *
-	 * @param qualifier the package qualifier type node
-	 * @param name the simple name being qualified
-	 * @return a new unparented qualified type node
-	 * @exception IllegalArgumentException if:
-	 * <ul>
-	 * <li>the node belongs to a different AST</li>
-	 * <li>the node already has a parent</li>
-	 * </ul>
-	 * @exception UnsupportedOperationException if this operation is used in
-	 * a JLS2, JLS3 and JLS4 AST
-	 * @since 3.9 BETA_JAVA8
-	 */
-	public PackageQualifiedType newPackageQualifiedType(Name qualifier, SimpleName name) {
-		PackageQualifiedType result = new PackageQualifiedType(this);
-		result.setQualifier(qualifier);
-		result.setName(name);
-		return result;
-	}
-
-	/**
 	 * Creates and returns a new unparented parameterized type node with the
 	 * given type and an empty list of type arguments.
 	 *
@@ -2282,7 +2319,7 @@
 	 * and there is no qualifier and no type arguments.
 	 *
 	 * @return a new unparented super method reference node
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public SuperMethodReference newSuperMethodReference() {
 		SuperMethodReference result = new SuperMethodReference(this);
@@ -2481,7 +2518,7 @@
 	 * 
 	 * @return a new unparented type method reference node
 	 * @exception UnsupportedOperationException if this operation is used in a JLS2, JLS3 or JLS4 AST
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public TypeMethodReference newTypeMethodReference() {
 		TypeMethodReference result = new TypeMethodReference(this);
@@ -2522,7 +2559,7 @@
 	 * @return a new unparented IntersectionType node
 	 * @exception UnsupportedOperationException if this operation is used in
 	 * a JLS2, JLS3 or JLS4 AST
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public IntersectionType newIntersectionType() {
 		return new IntersectionType(this);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter.java
index 573714c..3d152e1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTConverter.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
@@ -17,7 +13,6 @@
 
 package org.aspectj.org.eclipse.jdt.core.dom;
 
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -61,8 +56,6 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.PackageBinding;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveryScanner;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.Scanner;
@@ -72,7 +65,9 @@
 
 /**
  * Internal class for converting internal compiler ASTs into public ASTs.
+ * @since 3.10 // Added due to raised visibility
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 //AspectJ extension - raised to public visibility
 public class ASTConverter {
 	
@@ -102,7 +97,7 @@
 		return astConverterFactory.getASTConverter(options,resolveBindings,monitor);
 	}
 	// AspectJ Extension end
-
+	
 	protected AST ast;
 	private ASTNode referenceContext;
 	protected Comment[] commentsTable;
@@ -380,6 +375,13 @@
 			}
 		}
 	}
+
+	private void checkAndSetMalformed(ASTNode spannedNode, ASTNode spanningNode) {
+		if ((spannedNode.getFlags() & ASTNode.MALFORMED) != 0) {
+			spanningNode.setFlags(spanningNode.getFlags() | ASTNode.MALFORMED);
+		}
+	}
+
 	/** 
 	 * Internal access method to SingleVariableDeclaration#setExtraDimensions() for avoiding deprecated warnings
 	 *
@@ -494,15 +496,27 @@
 
 	protected void completeRecord(ArrayType arrayType, org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode astNode) {
 		ArrayType array = arrayType;
+		this.recordNodes(arrayType, astNode);
+		if (this.ast.apiLevel() >= AST.JLS8) {
+			this.recordNodes(arrayType.getElementType(), astNode);
+			return;
+		}
 		int dimensions = array.getDimensions();
 		for (int i = 0; i < dimensions; i++) {
-			Type componentType = array.getComponentType();
+			Type componentType = componentType(array);
 			this.recordNodes(componentType, astNode);
 			if (componentType.isArrayType()) {
 				array = (ArrayType) componentType;
 			}
 		}
 	}
+	
+	/**
+	 * @deprecated
+	 */
+	private Type componentType(ArrayType array) {
+		return array.getComponentType();
+	}
 
 	public ASTNode convert(boolean isInterface, org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration methodDeclaration) {
 		checkCanceled();
@@ -594,9 +608,9 @@
 				Type returnType = convertType(typeReference);
 				// get the positions of the right parenthesis
 				int rightParenthesisPosition = retrieveEndOfRightParenthesisPosition(end, method.bodyEnd);
-				int extraDimensions = retrieveExtraDimension(rightParenthesisPosition, method.bodyEnd);
+				int extraDimensions = typeReference.extraDimensions();
 				if (this.ast.apiLevel >= AST.JLS8) {
-					setExtraAnnotatedDimensions(rightParenthesisPosition, this.scanner.currentPosition, typeReference,
+					setExtraAnnotatedDimensions(rightParenthesisPosition, method.bodyEnd, typeReference,
 												methodDecl.extraDimensions(), extraDimensions);
 				} else {
 					internalSetExtraDimensions(methodDecl, extraDimensions);
@@ -896,7 +910,7 @@
 				recordNodes(name, receiver);
 			}
 		}
-		AnnotatableType type = (AnnotatableType) convertType(receiver.type);
+		Type type = convertType(receiver.type);
 		methodDecl.setReceiverType(type);
 		if (receiver.modifiers != 0) {
 			methodDecl.setFlags(methodDecl.getFlags() | ASTNode.MALFORMED);
@@ -912,14 +926,18 @@
 		setModifiers(variableDecl, argument);
 		final SimpleName name = new SimpleName(this.ast);
 		name.internalSetIdentifier(new String(argument.name));
+		if (argument instanceof Receiver) {
+			name.setFlags(name.getFlags() | ASTNode.MALFORMED);
+		}
 		int start = argument.sourceStart;
 		int nameEnd = argument.sourceEnd;
 		name.setSourceRange(start, nameEnd - start + 1);
 		variableDecl.setName(name);
 		final int typeSourceEnd = argument.type.sourceEnd;
-		final int extraDimensions = retrieveExtraDimension(nameEnd + 1, typeSourceEnd);
+		TypeReference typeReference = argument.type;
+		final int extraDimensions = typeReference.extraDimensions();
 		if (this.ast.apiLevel >= AST.JLS8) {
-			setExtraAnnotatedDimensions(nameEnd + 1, this.scanner.currentPosition, argument.type,
+			setExtraAnnotatedDimensions(nameEnd + 1, typeSourceEnd, typeReference,
 										variableDecl.extraDimensions(), extraDimensions);
 		} else {
 			internalSetExtraDimensions(variableDecl, extraDimensions);
@@ -937,14 +955,23 @@
 		 * See PR http://bugs.eclipse.org/bugs/show_bug.cgi?id=23284
 		 */
 		if (isVarArgs) {
+			Dimension lastDimension = null;
+			if (this.ast.apiLevel() >= AST.JLS8) {
+				if (type.isArrayType()) { // should always be true
+					List dimensions = ((ArrayType) type).dimensions();
+					if (!dimensions.isEmpty()) {
+						lastDimension = (Dimension) dimensions.get(dimensions.size() - 1);
+					}
+				}
+			}
 			setTypeForSingleVariableDeclaration(variableDecl, type, extraDimensions + 1);
 			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=391898
-			if (type.isAnnotatable()) {
-				AnnotatableType annotatableType = (AnnotatableType) type;
-				if (this.ast.apiLevel() >= AST.JLS8 && !annotatableType.annotations().isEmpty()) {
-					Iterator annotations = annotatableType.annotations().iterator();
-					while (annotations.hasNext()) {
-						Annotation annotation = (Annotation) annotations.next();
+			if (this.ast.apiLevel() >= AST.JLS8) {
+				if (lastDimension != null) { // should always be true
+					List annotations = lastDimension.annotations();
+					Iterator iter = annotations.iterator();
+					while (iter.hasNext()) {
+						Annotation annotation = (Annotation) iter.next();
 						annotation.setParent(null, null);
 						variableDecl.varargsAnnotations().add(annotation);
 					}
@@ -1011,27 +1038,19 @@
 		ArrayType arrayType = null;
 		if (type.isArrayType()) {
 			arrayType = (ArrayType) type;
+			if (expression.annotationsOnDimensions != null) {
+				if (this.ast.apiLevel() < AST.JLS8) {
+					arrayType.setFlags(arrayType.getFlags() | ASTNode.MALFORMED);
+				} else {
+					setTypeAnnotationsAndSourceRangeOnArray(arrayType, expression.annotationsOnDimensions);
+				}
+			}
 		} else {
-			arrayType = this.ast.newArrayType(type, dimensionsLength);
-			if (this.resolveBindings) {
-				completeRecord(arrayType, expression);
-			}
-			int start = type.getStartPosition();
-			int end = type.getStartPosition() + type.getLength();
-			int previousSearchStart = end - 1;
-			ArrayType componentType = (ArrayType) type.getParent();
-			for (int i = 0; i < dimensionsLength; i++) {
-				previousSearchStart = retrieveRightBracketPosition(previousSearchStart + 1, this.compilationUnitSourceLength);
-				componentType.setSourceRange(start, previousSearchStart - start + 1);
-				componentType = (ArrayType) componentType.getParent();
-			}
-		}
-		if (expression.annotationsOnDimensions != null) {
-			annotateType(arrayType, expression.annotationsOnDimensions);
+			arrayType = convertToArray(type, type.getStartPosition(), -1, dimensionsLength, expression.annotationsOnDimensions);
 		}
 		arrayCreation.setType(arrayType);
 		if (this.resolveBindings) {
-			recordNodes(arrayType, expression);
+			completeRecord(arrayType, expression);
 		}
 		if (expression.initializer != null) {
 			arrayCreation.setInitializer(convert(expression.initializer));
@@ -2231,7 +2250,7 @@
 		if (this.resolveBindings) {
 			recordNodes(lambdaExpression, lambda);
 		}
-		org.aspectj.org.eclipse.jdt.internal.compiler.ast.Argument[] arguments = lambda.arguments;
+		org.aspectj.org.eclipse.jdt.internal.compiler.ast.Argument[] arguments = lambda.arguments();
 		if (arguments != null) {
 			int argumentsLength = arguments.length;
 			for (int i = 0; i < argumentsLength; i++) {
@@ -2246,6 +2265,7 @@
 					if (this.resolveBindings) {
 						recordNodes(simpleName, argument);
 						recordNodes(variableDeclarationFragment, argument);
+						variableDeclarationFragment.resolveBinding();
 					}
 					variableDeclarationFragment.setName(simpleName);
 					variableDeclarationFragment.setSourceRange(start, end - start + 1);
@@ -2256,10 +2276,11 @@
 				}
 			}
 		}
-		if (lambda.body instanceof org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression) {
-			lambdaExpression.setBody(convert((org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression) lambda.body));
+		final org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement body = lambda.body();
+		if (body instanceof org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression) {
+			lambdaExpression.setBody(convert((org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression) body));
 		} else {
-			lambdaExpression.setBody(convert((org.aspectj.org.eclipse.jdt.internal.compiler.ast.Block) lambda.body));
+			lambdaExpression.setBody(convert((org.aspectj.org.eclipse.jdt.internal.compiler.ast.Block) body));
 		}
 		int sourceStart = lambda.sourceStart;
 		lambdaExpression.setSourceRange(sourceStart, lambda.sourceEnd - sourceStart + 1);
@@ -3161,6 +3182,30 @@
 		return packageDeclaration;
 	}
 
+	private ArrayType convertToArray(Type elementType, int sourceStart, int length, int dimensions, org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] annotationsOnDimensions) {
+		ArrayType arrayType = this.ast.newArrayType(elementType, dimensions);
+		if (length > 0) arrayType.setSourceRange(sourceStart, length);
+		if (this.ast.apiLevel() < AST.JLS8) {
+			if (annotationsOnDimensions != null) {
+				arrayType.setFlags(arrayType.getFlags() | ASTNode.MALFORMED);
+			}
+			ArrayType subarrayType = arrayType;
+			int index = dimensions - 1;
+			int arrayEnd = retrieveProperRightBracketPosition(dimensions, sourceStart);
+			while (index > 0) {
+				subarrayType = (ArrayType) componentType(subarrayType);
+				int end = retrieveProperRightBracketPosition(index, sourceStart);
+				subarrayType.setSourceRange(sourceStart, end - sourceStart + 1);
+				index--;
+			}
+			if (length < arrayEnd - sourceStart) arrayType.setSourceRange(sourceStart, arrayEnd - sourceStart + 1);
+			return arrayType;
+		}
+
+		setTypeAnnotationsAndSourceRangeOnArray(arrayType, annotationsOnDimensions);
+		return arrayType;
+	}
+
 	// AspectJ Extension - raised to protected
 	protected EnumDeclaration convertToEnumDeclaration(org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration typeDeclaration) {
 		checkCanceled();
@@ -3252,9 +3297,10 @@
 		int nameEnd = localDeclaration.sourceEnd;
 		name.setSourceRange(start, nameEnd - start + 1);
 		variableDecl.setName(name);
-		final int extraDimensions = retrieveExtraDimension(nameEnd + 1, localDeclaration.type.sourceEnd);
+		TypeReference typeReference = localDeclaration.type;
+		final int extraDimensions = typeReference.extraDimensions();
 		if (this.ast.apiLevel >= AST.JLS8) {
-			setExtraAnnotatedDimensions(nameEnd + 1, this.scanner.currentPosition, localDeclaration.type,
+			setExtraAnnotatedDimensions(nameEnd + 1, localDeclaration.declarationSourceEnd, typeReference,
 					variableDecl.extraDimensions(), extraDimensions);
 		} else {
 			internalSetExtraDimensions(variableDecl, extraDimensions);
@@ -3280,9 +3326,9 @@
 		return variableDecl;
 	}
 
-	private ExtraDimension convertToExtraDimensions(int start, int end, org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[] annotation) {
+	private Dimension convertToDimensions(int start, int end, org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[] annotation) {
 		int length = annotation == null ? 0 : annotation.length;
-		ExtraDimension dimension = this.ast.newExtraDimension();
+		Dimension dimension = this.ast.newDimension();
 		for (int i = 0; i < length; i++) {
 			Annotation annot = convert(annotation[i]);
 			dimension.annotations().add(annot);
@@ -3299,10 +3345,11 @@
 		variableDeclarationFragment.setName(name);
 		int start = fieldDeclaration.sourceEnd;
 		int end = start;
-		int extraDimensions = retrieveExtraDimension(fieldDeclaration.sourceEnd + 1, fieldDeclaration.declarationSourceEnd );
+		TypeReference typeReference = fieldDeclaration.type;
+		int extraDimensions = typeReference.extraDimensions();
 		if (this.ast.apiLevel >= AST.JLS8) {
-			setExtraAnnotatedDimensions(fieldDeclaration.sourceEnd + 1, this.scanner.currentPosition,
-					fieldDeclaration.type, variableDeclarationFragment.extraDimensions(), extraDimensions);
+			setExtraAnnotatedDimensions(fieldDeclaration.sourceEnd + 1, fieldDeclaration.declarationSourceEnd,
+					typeReference, variableDeclarationFragment.extraDimensions(), extraDimensions);
 		} else {
 			internalSetExtraDimensions(variableDeclarationFragment, extraDimensions);
 		}
@@ -3342,10 +3389,11 @@
 		variableDeclarationFragment.setName(name);
 		int start = localDeclaration.sourceEnd;
 		org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression initialization = localDeclaration.initialization;
-		int extraDimension = retrieveExtraDimension(localDeclaration.sourceEnd + 1, this.compilationUnitSourceLength);
+		TypeReference typeReference = localDeclaration.type;
+		int extraDimension = typeReference.extraDimensions();
 		if (this.ast.apiLevel >= AST.JLS8) {
-			setExtraAnnotatedDimensions(localDeclaration.sourceEnd + 1, this.scanner.currentPosition,
-					localDeclaration.type, variableDeclarationFragment.extraDimensions(), extraDimension);
+			setExtraAnnotatedDimensions(localDeclaration.sourceEnd + 1, this.compilationUnitSourceLength,
+					typeReference, variableDeclarationFragment.extraDimensions(), extraDimension);
 		} else {
 			internalSetExtraDimensions(variableDeclarationFragment, extraDimension);
 		}
@@ -3382,16 +3430,44 @@
 
 	protected void setExtraAnnotatedDimensions(int start, int end, TypeReference type, final List extraAnnotatedDimensions, int extraDimension) {
 		if (extraDimension > 0) {
-			org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] annotationsOnDims = type.getAnnotationsOnDimensions();
+			org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] annotationsOnDims = type.getAnnotationsOnDimensions(true);
 			int length = (annotationsOnDims == null) ? 0 : annotationsOnDims.length;
 			for (int i = (length - extraDimension); i < length; i++) {
-				ExtraDimension dim = convertToExtraDimensions(start, end, (annotationsOnDims == null) ? null : annotationsOnDims[i]);
+				Dimension dim = convertToDimensions(start, end, (annotationsOnDims == null) ? null : annotationsOnDims[i]);
 				extraAnnotatedDimensions.add(dim);
 				start = dim.getStartPosition() + dim.getLength();
 			}
 		}
 	}
 
+	private void setTypeAnnotationsOnDimension(Dimension currentDimension, org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] annotationsOnDimensions, int dimension) {
+		if (annotationsOnDimensions == null) return;
+		org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[] annotations = annotationsOnDimensions[dimension];
+		if (annotations != null) {
+			for (int j = 0, length = annotations.length; j < length; j++) {
+				Annotation annotation = convert(annotations[j]);
+				currentDimension.annotations().add(annotation);
+			}
+		}
+	}
+	
+	private void setTypeAnnotationsAndSourceRangeOnArray(ArrayType arrayType, org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] annotationsOnDimensions) {
+		List dimensions = arrayType.dimensions();
+		Type elementType = arrayType.getElementType();
+		int start = elementType.getStartPosition();
+		int endElement = start + elementType.getLength();
+		int end = retrieveProperRightBracketPosition(dimensions.size(), endElement);
+		arrayType.setSourceRange(start, end - start + 1);
+		
+		start = endElement;
+		for (int i = 0; i < dimensions.size(); i++) {
+			Dimension currentDimension = (Dimension) dimensions.get(i);
+			setTypeAnnotationsOnDimension(currentDimension, annotationsOnDimensions, i);
+			retrieveDimensionAndSetPositions(start, end, currentDimension);
+			start = currentDimension.getStartPosition() + currentDimension.getLength();
+		}
+	}
+
 	protected VariableDeclarationStatement convertToVariableDeclarationStatement(org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration localDeclaration) {
 		final VariableDeclarationFragment variableDeclarationFragment = convertToVariableDeclarationFragment(localDeclaration);
 		final VariableDeclarationStatement variableDeclarationStatement = new VariableDeclarationStatement(this.ast);
@@ -3408,7 +3484,8 @@
 		return variableDeclarationStatement;
 	}
 
-	private void annotateType(AnnotatableType type, org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[] annotations) {
+	private int annotateType(AnnotatableType type, org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[] annotations) {
+		int annotationsEnd = 0;
 		switch(this.ast.apiLevel) {
 			case AST.JLS2_INTERNAL :
 			case AST.JLS3_INTERNAL :
@@ -3416,28 +3493,27 @@
 				type.setFlags(type.getFlags() | ASTNode.MALFORMED);
 				break;
 			default:
+				if (annotations == null) break;
+				int start = type.getStartPosition();
+				int length = type.getLength();
 				int annotationsLength = annotations.length;
 				for (int i = 0; i < annotationsLength; i++) {
 					org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation typeAnnotation = annotations[i];
 					if (typeAnnotation != null) {
 						Annotation annotation = convert(typeAnnotation);
 						type.annotations().add(annotation);
+						annotationsEnd = annotation.getStartPosition() + annotation.getLength();
 					}
 				}
+				int annotationsStart;
+				if (annotations[0] != null && (annotationsStart = annotations[0].sourceStart) < start && annotationsStart > 0) {
+					length +=  start - annotationsStart;
+					start = annotationsStart;
+				}
+				type.setSourceRange(start, length);
 		}
+		return annotationsEnd;
 	}
-	private void annotateType(Type type, org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] annotations) {
-		int level = annotations.length - 1;
-		while(type.isArrayType()) {
-			ArrayType arrayType = (ArrayType) type;
-			org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[] typeAnnotations = annotations[level--];
-			if (typeAnnotations != null) {
-				annotateType(arrayType, typeAnnotations);
-			}
-			type = arrayType.getComponentType();
-		}
-	}
-
 	private void annotateTypeParameter(TypeParameter typeParameter, org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[] annotations) {
 		switch(this.ast.apiLevel) {
 			case AST.JLS2_INTERNAL :
@@ -3451,7 +3527,7 @@
 					org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation typeAnnotation = annotations[i];
 					if (typeAnnotation != null) {
 						Annotation annotation = convert(typeAnnotation);
-						typeParameter.annotations().add(annotation);
+						typeParameter.modifiers().add(annotation);
 					}
 				}
 		}
@@ -3481,17 +3557,18 @@
 			return wildcardType;
 		}
 		Type type = null;
-		int sourceStart = -1;
+		int sourceStart = typeReference.sourceStart;
 		int length = 0;
 		int dimensions = typeReference.dimensions();
 		if (typeReference instanceof org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleTypeReference) {
+			annotations = typeReference.annotations != null ? typeReference.annotations[0] : null;
+			int annotationsEnd = annotations != null ? annotations[annotations.length - 1].declarationSourceEnd + 1 : -1;
 			// this is either an ArrayTypeReference or a SingleTypeReference
 			char[] name = ((org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleTypeReference) typeReference).getTypeName()[0];
-			sourceStart = typeReference.sourceStart;
 			length = typeReference.sourceEnd - typeReference.sourceStart + 1;
 			// need to find out if this is an array type of primitive types or not
 			if (isPrimitiveType(name)) {
-				int[] positions = retrieveEndOfElementTypeNamePosition(sourceStart, sourceStart + length);
+				int[] positions = retrieveEndOfElementTypeNamePosition(sourceStart < annotationsEnd ? annotationsEnd : sourceStart, sourceStart + length);
 				int end = positions[1];
 				if (end == -1) {
 					end = sourceStart + length - 1;
@@ -3507,7 +3584,7 @@
 				ParameterizedSingleTypeReference parameterizedSingleTypeReference = (ParameterizedSingleTypeReference) typeReference;
 				final SimpleName simpleName = new SimpleName(this.ast);
 				simpleName.internalSetIdentifier(new String(name));
-				int[] positions = retrieveEndOfElementTypeNamePosition(sourceStart, sourceStart + length);
+				int[] positions = retrieveEndOfElementTypeNamePosition(sourceStart < annotationsEnd ? annotationsEnd : sourceStart, sourceStart + length);
 				int end = positions[1];
 				if (end == -1) {
 					end = sourceStart + length - 1;
@@ -3536,6 +3613,9 @@
 						if (typeReference.annotations != null && (annotations = typeReference.annotations[0]) != null) {
 							annotateType(simpleType, annotations);
 						}
+						int newSourceStart = simpleType.getStartPosition();
+						if (newSourceStart > 0 && newSourceStart < sourceStart) 
+							sourceStart = newSourceStart;
 						final ParameterizedType parameterizedType = new ParameterizedType(this.ast);
 						parameterizedType.setType(simpleType);
 						type = parameterizedType;
@@ -3562,7 +3642,7 @@
 				simpleName.internalSetIdentifier(new String(name));
 				// we need to search for the starting position of the first brace in order to set the proper length
 				// PR http://dev.eclipse.org/bugs/show_bug.cgi?id=10759
-				int[] positions = retrieveEndOfElementTypeNamePosition(sourceStart, sourceStart + length);
+				int[] positions = retrieveEndOfElementTypeNamePosition(sourceStart < annotationsEnd ? annotationsEnd : sourceStart, sourceStart + length);
 				int end = positions[1];
 				if (end == -1) {
 					end = sourceStart + length - 1;
@@ -3585,23 +3665,7 @@
 				}
 			}
 			if (dimensions != 0) {
-				org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] annotationsOnDimensions = typeReference.getAnnotationsOnDimensions();
-				type = this.ast.newArrayType(type, dimensions);
-				type.setSourceRange(sourceStart, length);
-				ArrayType subarrayType = (ArrayType) type;
-				int index = dimensions - 1;
-				while (index > 0) {
-					if (annotationsOnDimensions != null && (annotations = annotationsOnDimensions[index]) != null) {
-						annotateType(subarrayType, annotations);
-					}
-					subarrayType = (ArrayType) subarrayType.getComponentType();
-					int end = retrieveProperRightBracketPosition(index, sourceStart);
-					subarrayType.setSourceRange(sourceStart, end - sourceStart + 1);
-					index--;
-				}
-				if (annotationsOnDimensions != null && (annotations = annotationsOnDimensions[0]) != null) {
-					annotateType(subarrayType, annotations);
-				}
+				type = convertToArray(type, sourceStart, length, dimensions, typeReference.getAnnotationsOnDimensions(true));
 				if (this.resolveBindings) {
 					// store keys for inner types
 					completeRecord((ArrayType) type, typeReference);
@@ -3617,7 +3681,6 @@
 				int lenth = tokens.length;
 				int firstTypeIndex = lenth - 1;
 				long[] positions = parameterizedQualifiedTypeReference.sourcePositions;
-				sourceStart = (int)(positions[0]>>>32);
 				switch(this.ast.apiLevel) {
 					case AST.JLS2_INTERNAL : {
 						char[][] name = ((org.aspectj.org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference) typeReference).getTypeName();
@@ -3633,40 +3696,23 @@
 					}
 					break;
 					default :
+						boolean isTypeArgumentBased = false;
 						for (int i = 0; i < lenth; ++i) {
 							if (typeArguments != null && typeArguments[i] != null) {
 								firstTypeIndex = i;
+								isTypeArgumentBased = true;
 								break;
 							}
 							if (typeAnnotations != null && typeAnnotations[i] != null) {
 								firstTypeIndex = i;
+								isTypeArgumentBased = false;
 								break;
 							}
 						}						
+						int start = (int) (positions[0] >>> 32);
+						int end = (int) positions[firstTypeIndex];
 						
-						Name name = null;						
-						if (firstTypeIndex == 0) {
-							final SimpleName simpleName = new SimpleName(this.ast);
-							simpleName.setIdentifier(new String(tokens[0]));
-							recordPendingNameScopeResolution(simpleName);
-							int start = (int) (positions[0] >>> 32);
-							int end = (int) positions[0];
-							simpleName.setSourceRange(start, end - start + 1);
-							simpleName.index = 1;
-							name = simpleName;
-							if (this.resolveBindings) {
-								recordNodes(simpleName, typeReference);
-							}
-						} else {
-							name = this.setQualifiedNameNameAndSourceRanges(tokens, positions, firstTypeIndex, typeReference);
-						}
-						
-						SimpleType simpleType = new SimpleType(this.ast);
-						simpleType.setName(name);
-						int start = (int)(positions[0] >>> 32);
-						int end = (int)positions[firstTypeIndex];
-						setSourceRangeAnnotationsAndRecordNodes(typeReference, simpleType, positions, typeAnnotations, firstTypeIndex, 0, firstTypeIndex);
-						Type currentType = simpleType;						
+						Type currentType = createBaseType(typeReference, positions, typeAnnotations, tokens, lenth, firstTypeIndex, isTypeArgumentBased);
 						int indexOfEnclosingType = 1;
 						if (typeArguments != null && (arguments = typeArguments[firstTypeIndex]) != null) {
 							int arglen = arguments.length;
@@ -3683,6 +3729,8 @@
 							}
 							end = type2 != null ? type2.getStartPosition() + type2.getLength() - 1 : end;
 							end = retrieveClosingAngleBracketPosition(end + 1);
+							int baseStart = currentType.getStartPosition();
+							start = start <= baseStart ? start : baseStart;
 							parameterizedType.setSourceRange(start, end - start + 1);
 							currentType = parameterizedType;
 						}
@@ -3698,16 +3746,20 @@
 							QualifiedType qualifiedType = new QualifiedType(this.ast);
 							qualifiedType.setQualifier(currentType);
 							qualifiedType.setName(simpleName);
+							start = currentType.getStartPosition();
+							end = simpleName.getStartPosition() + simpleName.getLength() - 1;
+							qualifiedType.setSourceRange(start, end - start + 1);
 							if (typeAnnotations != null &&  (annotations = typeAnnotations[i]) != null) {
-								annotateType(qualifiedType, annotations);
+								int nextPosition = annotateType(qualifiedType, annotations);
+								if (simpleName.getStartPosition() < nextPosition && nextPosition <= end) {
+									simpleName.setSourceRange(nextPosition, end - nextPosition + 1);
+									trimWhiteSpacesAndComments(simpleName);
+								}
 							}
 							if (this.resolveBindings) {
 								recordNodes(simpleName, typeReference);
 								recordNodes(qualifiedType, typeReference);
 							}
-							start = currentType.getStartPosition();
-							end = simpleName.getStartPosition() + simpleName.getLength() - 1;
-							qualifiedType.setSourceRange(start, end - start + 1);
 							currentType = qualifiedType;
 							indexOfEnclosingType++;
 							
@@ -3751,47 +3803,10 @@
 						}
 					}
 				}  
-				sourceStart = (int)(positions[0]>>>32);
-				Name name = null;
-				Type currentType = null;
-				if (firstTypeIndex == lenth) {//Just a QualifiedName
-					name = setQualifiedNameNameAndSourceRanges(tokens, positions, lenth - 1, typeReference);
-					currentType = createSimpleType(name, typeReference, positions, 0, lenth - 1);
-				} else {
-					if (firstTypeIndex <= 1) {
-						name = createSimpleName(typeReference, positions, tokens, 0 );
-						firstTypeIndex = 1;
-					} else {
-						name = setQualifiedNameNameAndSourceRanges(tokens, positions, firstTypeIndex - 1, typeReference);
-					}						
-
-					org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding typeBinding = typeReference.resolvedType;
-					boolean createPackageQualifiedType = false;
-					if (typeBinding instanceof ReferenceBinding) {
-						ReferenceBinding referenceBinding = (ReferenceBinding)typeBinding;			
-						PackageBinding packageBinding = referenceBinding.getPackage();
-						if (packageBinding != null && Arrays.equals(name.toString().toCharArray(), packageBinding.readableName())) {
-							createPackageQualifiedType = true;
-						}
-					}
-					
-					if (createPackageQualifiedType && this.ast.apiLevel >= AST.JLS8) {
-						PackageQualifiedType packageQualifiedType = new PackageQualifiedType(this.ast);
-						packageQualifiedType.setQualifier(name);
-						packageQualifiedType.setName(createSimpleName(typeReference, positions, tokens, firstTypeIndex));
-						setSourceRangeAnnotationsAndRecordNodes(typeReference, packageQualifiedType, positions, typeAnnotations, firstTypeIndex, 0, firstTypeIndex);
-						currentType = packageQualifiedType;																	
-					} else {
-						SimpleType simpleType = this.ast.newSimpleType(name);	
-						setSourceRangeAnnotationsAndRecordNodes(typeReference, simpleType, positions, typeAnnotations, 0, 0, name.index > 0 ? name.index - 1 : 0);
-						currentType = createQualifiedType(typeReference, positions,  typeAnnotations, tokens, firstTypeIndex, simpleType);
-						if (createPackageQualifiedType) 
-							currentType.setFlags(currentType.getFlags() | ASTNode.MALFORMED);
-					}
-					for (int i = firstTypeIndex + 1; i < lenth; ++i) {
-						currentType = createQualifiedType(typeReference, positions,  typeAnnotations, tokens, i, currentType);
-					}					
-				}
+				Type currentType = createBaseType(typeReference, positions, typeAnnotations, tokens, lenth, firstTypeIndex, false);
+				for (int i = firstTypeIndex + 1; i < lenth; ++i) {
+					currentType = createQualifiedType(typeReference, positions,  typeAnnotations, tokens, i, currentType);
+				}					
 				type = currentType;
 			} else if (typeReference instanceof UnionTypeReference){
 				TypeReference[] typeReferences = ((org.aspectj.org.eclipse.jdt.internal.compiler.ast.UnionTypeReference) typeReference).typeReferences;
@@ -3853,31 +3868,10 @@
 
 			length = typeReference.sourceEnd - sourceStart + 1;
 			if (dimensions != 0) {
-				org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] annotationsOnDimensions = typeReference.getAnnotationsOnDimensions();
-				type = this.ast.newArrayType(type, dimensions);
+				type = convertToArray(type, sourceStart, length, dimensions, typeReference.getAnnotationsOnDimensions(true));
 				if (this.resolveBindings) {
 					completeRecord((ArrayType) type, typeReference);
 				}
-				int end = retrieveEndOfDimensionsPosition(sourceStart+length, this.compilationUnitSourceLength);
-				if (end != -1) {
-					type.setSourceRange(sourceStart, end - sourceStart + 1);
-				} else {
-					type.setSourceRange(sourceStart, length);
-				}
-				ArrayType subarrayType = (ArrayType) type;
-				int index = dimensions - 1;
-				while (index > 0) {
-					if (annotationsOnDimensions != null  && (annotations = annotationsOnDimensions[index]) != null) {
-						annotateType(subarrayType, annotations);
-					}
-					subarrayType = (ArrayType) subarrayType.getComponentType();
-					end = retrieveProperRightBracketPosition(index, sourceStart);
-					subarrayType.setSourceRange(sourceStart, end - sourceStart + 1);
-					index--;
-				}
-				if (annotationsOnDimensions != null  && (annotations = annotationsOnDimensions[0]) != null) {
-					annotateType(subarrayType, annotations);
-				}
 			}
 		}
 		if (this.resolveBindings) {
@@ -3908,6 +3902,46 @@
 		return type;
 	}
 
+	private Type createBaseType(TypeReference typeReference, long[] positions,
+			org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] typeAnnotations, char[][] tokens, int lenth,
+			int firstTypeIndex, boolean isTypeArgumentBased) {
+		Type currentType;
+		Name name = null;
+		if (firstTypeIndex == 0) {
+			name = createSimpleName(typeReference, positions, tokens, 0 );
+			currentType = createSimpleType(name, typeReference, positions, 0, 0);
+			setSourceRangeAnnotationsAndRecordNodes(typeReference, (SimpleType) currentType, positions, typeAnnotations, 0, 0, name.index > 0 ? name.index - 1 : 0);
+		} else if (firstTypeIndex == lenth) {//Just a QualifiedName
+			name = setQualifiedNameNameAndSourceRanges(tokens, positions, firstTypeIndex - 1, typeReference);
+			currentType = createSimpleType(name, typeReference, positions, 0, firstTypeIndex - 1);
+		} else if (isTypeArgumentBased && (typeAnnotations == null || typeAnnotations[firstTypeIndex] == null)) {
+			name = setQualifiedNameNameAndSourceRanges(tokens, positions, firstTypeIndex, typeReference);
+			currentType = createSimpleType(name, typeReference, positions, 0, firstTypeIndex);
+		} else {
+			if (firstTypeIndex == 1) {
+				name = createSimpleName(typeReference, positions, tokens, 0 );
+			} else {
+				name = setQualifiedNameNameAndSourceRanges(tokens, positions, firstTypeIndex - 1, typeReference);
+			}
+
+			boolean createNameQualifiedType = typeAnnotations != null && typeAnnotations[firstTypeIndex] != null;
+			if (createNameQualifiedType && this.ast.apiLevel >= AST.JLS8) {
+				NameQualifiedType nameQualifiedType = new NameQualifiedType(this.ast);
+				nameQualifiedType.setQualifier(name);
+				nameQualifiedType.setName(createSimpleName(typeReference, positions, tokens, firstTypeIndex));
+				setSourceRangeAnnotationsAndRecordNodes(typeReference, nameQualifiedType, positions, typeAnnotations, firstTypeIndex, 0, firstTypeIndex);
+				currentType = nameQualifiedType;																	
+			} else {
+				SimpleType simpleType = this.ast.newSimpleType(name);	
+				setSourceRangeAnnotationsAndRecordNodes(typeReference, simpleType, positions, typeAnnotations, 0, 0, name.index > 0 ? name.index - 1 : 0);
+				currentType = createQualifiedType(typeReference, positions,  typeAnnotations, tokens, firstTypeIndex, simpleType);
+				if (createNameQualifiedType) 
+					currentType.setFlags(currentType.getFlags() | ASTNode.MALFORMED);
+			}
+		}
+		return currentType;
+	}
+
 	private QualifiedType createQualifiedType(TypeReference typeReference, long[] positions,
 			org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] typeAnnotations, char[][] tokens, int index,
 			Type qualifier) {
@@ -3937,16 +3971,11 @@
 	private void setSourceRangeAnnotationsAndRecordNodes(TypeReference typeReference, AnnotatableType annotatableType,
 			org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] typeAnnotations, int index, int start, int end) {
 		org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[] annotations;
-		int annotationsStart = start;
 		int length = end - start + 1;
+		annotatableType.setSourceRange(start, length);
 		if (typeAnnotations != null && (annotations = typeAnnotations[index]) != null) {
 			annotateType(annotatableType, annotations);
-			if (annotations[0] != null && (annotationsStart = annotations[0].sourceStart) < start) {
-				length += annotationsStart > 0 ? start - annotationsStart : 0;
-				start = annotationsStart;
-			}
 		}
-		annotatableType.setSourceRange(start, length);
 		if (this.resolveBindings) {
 			recordNodes(annotatableType, typeReference);
 		}
@@ -4452,11 +4481,23 @@
 	 * Remove whitespaces and comments before and after the expression.
 	 */
 	private void trimWhiteSpacesAndComments(org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression expression) {
-		int start = expression.sourceStart;
-		int end = expression.sourceEnd;
+		int[] positions = trimWhiteSpacesAndComments(expression.sourceStart, expression.sourceEnd);
+		expression.sourceStart = positions[0];
+		expression.sourceEnd = positions[1];
+	}
+	private void trimWhiteSpacesAndComments(ASTNode node) {
+		int start = node.getStartPosition();
+		int end = start + node.getLength() - 1;
+		int[] positions = trimWhiteSpacesAndComments(start, end);
+		start = positions[0];
+		end = positions[1];
+		node.setSourceRange(start, end - start + 1);
+	}
+	private int [] trimWhiteSpacesAndComments(int start, int end) {
+		int [] positions = new int[]{start, end};
 		int token;
-		int trimLeftPosition = expression.sourceStart;
-		int trimRightPosition = expression.sourceEnd;
+		int trimLeftPosition = start;
+		int trimRightPosition = end;
 		boolean first = true;
 		Scanner removeBlankScanner = this.ast.scanner;
 		try {
@@ -4478,9 +4519,9 @@
 						}
 						break;
 					case TerminalTokens.TokenNameEOF :
-						expression.sourceStart = trimLeftPosition;
-						expression.sourceEnd = trimRightPosition;
-						return;
+						positions[0] = trimLeftPosition;
+						positions[1] = trimRightPosition;
+						return positions;
 					default :
 						/*
 						 * if we find something else than a whitespace or a comment,
@@ -4494,6 +4535,7 @@
 		} catch (InvalidInputException e){
 			// ignore
 		}
+		return positions;
 	}
 
 	/**
@@ -4644,58 +4686,24 @@
 	}
 
 	/**
-	 * This method is used to retrieve the ending position for a type declaration when the dimension is right after the type
-	 * name.
-	 * For example:
-	 *    int[] i; => return 5, but int i[] => return -1;
-	 * @return int the dimension found
-	 */
-	protected int retrieveEndOfDimensionsPosition(int start, int end) {
-		this.scanner.resetTo(start, end);
-		int foundPosition = -1;
-		try {
-			int token;
-			while ((token = this.scanner.getNextToken()) != TerminalTokens.TokenNameEOF) {
-				switch(token) {
-					case TerminalTokens.TokenNameLBRACKET:
-					case TerminalTokens.TokenNameCOMMENT_BLOCK:
-					case TerminalTokens.TokenNameCOMMENT_JAVADOC:
-					case TerminalTokens.TokenNameCOMMENT_LINE:
-						break;
-					case TerminalTokens.TokenNameRBRACKET://166
-						foundPosition = this.scanner.currentPosition - 1;
-						break;
-					default:
-						return foundPosition;
-				}
-			}
-		} catch(InvalidInputException e) {
-			// ignore
-		}
-		return foundPosition;
-	}
-
-	/**
 	 * This method is used to retrieve the start and end position of a name or primitive type token.
 	 * 
 	 * @return int[] a single dimensional array, with two elements, for the start and end positions of the name respectively
 	 */
 	protected int[] retrieveEndOfElementTypeNamePosition(int start, int end) {
 		this.scanner.resetTo(start, end);
-		boolean isAnnotation = false;
 		try {
 			int token;
+			int count = 0;
 			while ((token = this.scanner.getNextToken()) != TerminalTokens.TokenNameEOF) {
 				switch(token) {
-					case TerminalTokens.TokenNameAT:
-						isAnnotation = true;
+					case TerminalTokens.TokenNameLPAREN:
+						++count;
+						break;
+					case TerminalTokens.TokenNameRPAREN:
+						--count;
 						break;
 					case TerminalTokens.TokenNameIdentifier:
-						if (isAnnotation) {
-							isAnnotation = false;
-							break;
-						}
-						//$FALL-THROUGH$
 					case TerminalTokens.TokenNamebyte:
 					case TerminalTokens.TokenNamechar:
 					case TerminalTokens.TokenNamedouble:
@@ -4704,6 +4712,7 @@
 					case TerminalTokens.TokenNamelong:
 					case TerminalTokens.TokenNameshort:
 					case TerminalTokens.TokenNameboolean:
+						if (count > 0) break;
 						return new int[]{this.scanner.startPosition, this.scanner.currentPosition - 1};
 				}
 			}
@@ -4741,70 +4750,39 @@
 		return -1;
 	}
 
-	/**
-	 * This method is used to retrieve the array dimension declared after the
-	 * name of a local or a field declaration.
-	 * For example:
-	 *    int i, j[] = null, k[][] = {{}};
-	 *    It should return 0 for i, 1 for j and 2 for k.
-	 * @return int the dimension found
-	 */
-	protected int retrieveExtraDimension(int start, int end) {
-		this.scanner.resetTo(start, end);
-		int dimensions = 0;
-		try {
-			int token;
-			boolean isAnnotation = false;
-			while ((token = this.scanner.getNextToken()) != TerminalTokens.TokenNameEOF) {
-				switch(token) {
-					case TerminalTokens.TokenNameLBRACKET:
-					case TerminalTokens.TokenNameCOMMENT_BLOCK:
-					case TerminalTokens.TokenNameCOMMENT_JAVADOC:
-					case TerminalTokens.TokenNameCOMMENT_LINE:
-						isAnnotation = false;
-						break;
-					case TerminalTokens.TokenNameAT:
-						isAnnotation = true;
-						break;
-					case TerminalTokens.TokenNameIdentifier:
-						if (!isAnnotation) {
-							return dimensions;
-						}
-						isAnnotation = false;
-						break;
-					case TerminalTokens.TokenNameRBRACKET://166
-						isAnnotation = false;
-						dimensions++;
-						break;
-					default:
-						return dimensions;
-				}
-			}
-		} catch(InvalidInputException e) {
-			// ignore
-		}
-		return dimensions;
-	}
-
-	protected void retrieveDimensionAndSetPositions(int start, int end, ExtraDimension dim) {
+	protected void retrieveDimensionAndSetPositions(int start, int end, Dimension dim) {
 		this.scanner.resetTo(start, end);
 		int token;
+		int count = 0, lParenCount = 0;
 		boolean startSet = false;
 		try {
 			while((token = this.scanner.getNextToken()) != TerminalTokens.TokenNameEOF)  {
-				switch(token) {
-					case TerminalTokens.TokenNameWHITESPACE:
-						break;
-					case TerminalTokens.TokenNameRBRACKET:
-						int endDim = this.scanner.currentPosition - 1;
-						dim.setSourceRange(start, endDim - start + 1);
-						return;
-					default:
-						if (!startSet) {
-							start = this.scanner.startPosition;
-							startSet = true;
-						}
-						break;
+				if (token != TerminalTokens.TokenNameWHITESPACE) {
+					if (!startSet) {
+						start = this.scanner.startPosition;
+						startSet = true;
+					}
+					switch(token) {
+						case TerminalTokens.TokenNameRBRACKET:
+							if (lParenCount > 0) break;
+							--count;
+							if (count > 0) break;
+							int endDim = this.scanner.currentPosition - 1;
+							dim.setSourceRange(start, endDim - start + 1);
+							return;
+						case TerminalTokens.TokenNameLBRACKET:
+							if (lParenCount > 0) break;
+							count++;
+							break;
+						case TerminalTokens.TokenNameLPAREN:
+							lParenCount++;
+							break;
+						case TerminalTokens.TokenNameRPAREN:
+							--lParenCount;
+							break;
+						default:
+							break;
+					}
 				}
 			}
 		} catch(InvalidInputException e) {
@@ -4882,10 +4860,22 @@
 		int balance = 0;
 		int pos = initializerEnd > nameEnd ? initializerEnd - 1 : nameEnd;
 		try {
-			int token;
+			int token, lParenCount = 0;
+			boolean hasAnnotations = false;
 			while ((token = this.scanner.getNextToken()) != TerminalTokens.TokenNameEOF) {
 				hasTokens = true;
+				if (hasAnnotations) {
+					if (token == TerminalTokens.TokenNameLPAREN) ++lParenCount;
+					else if (token == TerminalTokens.TokenNameRPAREN) {
+						--lParenCount; 
+						continue;
+					}
+					if (lParenCount > 0) continue;
+				}
 				switch(token) {
+					case TerminalTokens.TokenNameAT:
+						hasAnnotations = true;
+						break;
 					case TerminalTokens.TokenNameLBRACE :
 					case TerminalTokens.TokenNameLBRACKET :
 						balance++;
@@ -4915,10 +4905,25 @@
 	protected int retrieveProperRightBracketPosition(int bracketNumber, int start) {
 		this.scanner.resetTo(start, this.compilationUnitSourceLength);
 		try {
-			int token, count = 0;
+			int token, count = 0, lParentCount = 0, balance = 0;
 			while ((token = this.scanner.getNextToken()) != TerminalTokens.TokenNameEOF) {
 				switch(token) {
+					case TerminalTokens.TokenNameLPAREN:
+						++lParentCount;
+						break;
+					case TerminalTokens.TokenNameRPAREN:
+						--lParentCount;
+						break;
+					case TerminalTokens.TokenNameLBRACKET:
+						++balance;
+						break;
+					case TerminalTokens.TokenNameELLIPSIS:
+						++balance; // special case for varargs - simulate lbracket found
+						//$FALL-THROUGH$
 					case TerminalTokens.TokenNameRBRACKET:
+						--balance;
+						if (lParentCount > 0) break;
+						if (balance > 0) break;
 						count++;
 						if (count == bracketNumber) {
 							return this.scanner.currentPosition - 1;
@@ -4974,32 +4979,6 @@
 	}
 
 	/**
-	 * This method is used to retrieve the position of the right bracket.
-	 * @return int the dimension found, -1 if none
-	 */
-	protected int retrieveRightBracketPosition(int start, int end) {
-		this.scanner.resetTo(start, end);
-		try {
-			int token;
-			int balance = 0;
-			while ((token = this.scanner.getNextToken()) != TerminalTokens.TokenNameEOF) {
-				switch(token) {
-					case TerminalTokens.TokenNameLBRACKET :
-						balance++;
-						break;
-					case TerminalTokens.TokenNameRBRACKET :
-						balance--;
-						if (balance == 0) return this.scanner.currentPosition - 1;
-						break;
-				}
-			}
-		} catch(InvalidInputException e) {
-			// ignore
-		}
-		return -1;
-	}
-
-	/**
 	 * This method is used to retrieve the start position of the block.
 	 * @return int the dimension found, -1 if none
 	 */
@@ -5684,26 +5663,16 @@
 					this.ast.getBindingResolver().updateKey(type, elementType);
 					fieldDeclaration.setType(elementType);
 				} else {
-					int start = type.getStartPosition();
-					ArrayType subarrayType = arrayType;
-					int index = extraDimension;
-					while (index > 0) {
-						subarrayType = (ArrayType) subarrayType.getComponentType();
-						index--;
-					}
-					int end = retrieveProperRightBracketPosition(remainingDimensions, start);
-					subarrayType.setSourceRange(start, end - start + 1);
-					// cut the child loose from its parent (without creating garbage)
-					subarrayType.setParent(null, null);
+					ArrayType subarrayType = extractSubArrayType(arrayType, remainingDimensions, extraDimension);
 					fieldDeclaration.setType(subarrayType);
-					updateInnerPositions(subarrayType, remainingDimensions);
 					this.ast.getBindingResolver().updateKey(type, subarrayType);
 				}
+				checkAndSetMalformed(type, fieldDeclaration);
 			} else {
 				fieldDeclaration.setType(type);
 			}
 		} else {
-			if (type.isArrayType()) {
+			if (type.isArrayType() && (this.ast.apiLevel() < AST.JLS8)) {
 				// update positions of the component types of the array type
 				int dimensions = ((ArrayType) type).getDimensions();
 				updateInnerPositions(type, dimensions);
@@ -5712,6 +5681,35 @@
 		}
 	}
 
+	/** extracts the subArrayType for a given declaration for AST levels less
+	 * @param arrayType parent type
+	 * @param remainingDimensions 
+	 * @param dimensionsToRemove
+	 * @return an ArrayType
+	 */
+	private ArrayType extractSubArrayType(ArrayType arrayType, int remainingDimensions, int dimensionsToRemove) {
+		ArrayType subArrayType = arrayType;
+		int start = subArrayType.getStartPosition();
+		if (this.ast.apiLevel() < AST.JLS8) {
+			while (dimensionsToRemove > 0 ) {
+				subArrayType = (ArrayType) componentType(subArrayType);
+				dimensionsToRemove--;
+			}
+			updateInnerPositions(subArrayType, remainingDimensions);
+		} else {
+			List dimensions = subArrayType.dimensions();
+			while (dimensionsToRemove > 0 ) {
+				dimensions.remove(dimensions.size() - 1);
+				dimensionsToRemove--;
+			}
+		}
+		int end = retrieveProperRightBracketPosition(remainingDimensions, start);
+		subArrayType.setSourceRange(start, end - start + 1);
+		// cut the child loose from its parent (without creating garbage)
+		subArrayType.setParent(null, null);
+		return subArrayType;
+	}
+
 	protected void setTypeForMethodDeclaration(MethodDeclaration methodDeclaration, Type type, int extraDimension) {
 		if (extraDimension != 0) {
 			if (type.isArrayType()) {
@@ -5732,18 +5730,7 @@
 						break;
 					}
 				} else {
-					int start = type.getStartPosition();
-					ArrayType subarrayType = arrayType;
-					int index = extraDimension;
-					while (index > 0) {
-						subarrayType = (ArrayType) subarrayType.getComponentType();
-						index--;
-					}
-					int end = retrieveProperRightBracketPosition(remainingDimensions, start);
-					subarrayType.setSourceRange(start, end - start + 1);
-					// cut the child loose from its parent (without creating garbage)
-					subarrayType.setParent(null, null);
-					updateInnerPositions(subarrayType, remainingDimensions);
+					ArrayType subarrayType = extractSubArrayType(arrayType, remainingDimensions, extraDimension);
 					switch(this.ast.apiLevel) {
 						case AST.JLS2_INTERNAL :
 							methodDeclaration.internalSetReturnType(subarrayType);
@@ -5754,6 +5741,7 @@
 					}
 					this.ast.getBindingResolver().updateKey(type, subarrayType);
 				}
+				checkAndSetMalformed(type, methodDeclaration);
 			} else {
 				switch(this.ast.apiLevel) {
 					case AST.JLS2_INTERNAL :
@@ -5793,21 +5781,12 @@
 					this.ast.getBindingResolver().updateKey(type, elementType);
 					singleVariableDeclaration.setType(elementType);
 				} else {
-					int start = type.getStartPosition();
-					ArrayType subarrayType = arrayType;
-					int index = extraDimension;
-					while (index > 0) {
-						subarrayType = (ArrayType) subarrayType.getComponentType();
-						index--;
-					}
-					int end = retrieveProperRightBracketPosition(remainingDimensions, start);
-					subarrayType.setSourceRange(start, end - start + 1);
-					// cut the child loose from its parent (without creating garbage)
-					subarrayType.setParent(null, null);
-					updateInnerPositions(subarrayType, remainingDimensions);
-					singleVariableDeclaration.setType(subarrayType);
+					ArrayType subarrayType = extractSubArrayType(arrayType, remainingDimensions, extraDimension);
 					this.ast.getBindingResolver().updateKey(type, subarrayType);
+					singleVariableDeclaration.setType(subarrayType);
 				}
+				checkAndSetMalformed(type, singleVariableDeclaration);
+					
 			} else {
 				singleVariableDeclaration.setType(type);
 			}
@@ -5829,21 +5808,11 @@
 					this.ast.getBindingResolver().updateKey(type, elementType);
 					variableDeclarationExpression.setType(elementType);
 				} else {
-					int start = type.getStartPosition();
-					ArrayType subarrayType = arrayType;
-					int index = extraDimension;
-					while (index > 0) {
-						subarrayType = (ArrayType) subarrayType.getComponentType();
-						index--;
-					}
-					int end = retrieveProperRightBracketPosition(remainingDimensions, start);
-					subarrayType.setSourceRange(start, end - start + 1);
-					// cut the child loose from its parent (without creating garbage)
-					subarrayType.setParent(null, null);
-					updateInnerPositions(subarrayType, remainingDimensions);
+					ArrayType subarrayType = extractSubArrayType(arrayType, remainingDimensions, extraDimension);
 					variableDeclarationExpression.setType(subarrayType);
 					this.ast.getBindingResolver().updateKey(type, subarrayType);
 				}
+				checkAndSetMalformed(type, variableDeclarationExpression);
 			} else {
 				variableDeclarationExpression.setType(type);
 			}
@@ -5865,21 +5834,11 @@
 					this.ast.getBindingResolver().updateKey(type, elementType);
 					variableDeclarationStatement.setType(elementType);
 				} else {
-					int start = type.getStartPosition();
-					ArrayType subarrayType = arrayType;
-					int index = extraDimension;
-					while (index > 0) {
-						subarrayType = (ArrayType) subarrayType.getComponentType();
-						index--;
-					}
-					int end = retrieveProperRightBracketPosition(remainingDimensions, start);
-					subarrayType.setSourceRange(start, end - start + 1);
-					// cut the child loose from its parent (without creating garbage)
-					subarrayType.setParent(null, null);
-					updateInnerPositions(subarrayType, remainingDimensions);
+					ArrayType subarrayType = extractSubArrayType(arrayType, remainingDimensions, extraDimension);
 					variableDeclarationStatement.setType(subarrayType);
 					this.ast.getBindingResolver().updateKey(type, subarrayType);
 				}
+				checkAndSetMalformed(type, variableDeclarationStatement);
 			} else {
 				variableDeclarationStatement.setType(type);
 			}
@@ -5892,13 +5851,13 @@
 		if (dimensions > 1) {
 			// need to set positions for intermediate array type see 42839
 			int start = type.getStartPosition();
-			Type currentComponentType = ((ArrayType) type).getComponentType();
+			Type currentComponentType = componentType(((ArrayType) type));
 			int searchedDimension = dimensions - 1;
 			int rightBracketEndPosition = start;
 			while (currentComponentType.isArrayType()) {
 				rightBracketEndPosition = retrieveProperRightBracketPosition(searchedDimension, start);
 				currentComponentType.setSourceRange(start, rightBracketEndPosition - start + 1);
-				currentComponentType = ((ArrayType) currentComponentType).getComponentType();
+				currentComponentType = componentType(((ArrayType) currentComponentType));
 				searchedDimension--;
 			}
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTMatcher.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTMatcher.java
index 08f1a10..5c7fda9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTMatcher.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTMatcher.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -47,6 +43,7 @@
  * @see org.aspectj.org.eclipse.jdt.core.dom.ASTNode#subtreeMatch(ASTMatcher, Object)
  * @since 2.0
  */
+@SuppressWarnings("rawtypes")
 public class ASTMatcher {
 
 	/**
@@ -164,6 +161,13 @@
 	}
 
 	/**
+	 * @deprecated
+	 */
+	private Type componentType(ArrayType array) {
+		return array.getComponentType();
+	}
+
+	/**
 	 * Returns whether the given node and the other object match.
 	 * <p>
 	 * The default implementation provided by this class tests whether the
@@ -331,8 +335,11 @@
 		}
 		ArrayType o = (ArrayType) other;
 		int level = node.getAST().apiLevel;
-		return safeSubtreeMatch(node.getComponentType(), o.getComponentType())
-				&& (level >= AST.JLS8 ? safeSubtreeListMatch(node.annotations(), o.annotations()) : true);
+		if (level < AST.JLS8) {
+			return safeSubtreeMatch(componentType(node), componentType(o));
+		}
+		return safeSubtreeMatch(node.getElementType(), o.getElementType())
+				&& safeSubtreeListMatch(node.dimensions(), o.dimensions());
 	}
 
 	/**
@@ -700,7 +707,7 @@
 	 * @return <code>true</code> if the subtree matches, or
 	 *   <code>false</code> if they do not match or the other object has a
 	 *   different node type or is <code>null</code>
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean match(CreationReference node, Object other) {
 		if (!(other instanceof CreationReference)) {
@@ -725,6 +732,29 @@
 	 * @return <code>true</code> if the subtree matches, or
 	 *   <code>false</code> if they do not match or the other object has a
 	 *   different node type or is <code>null</code>
+	 * @since 3.10
+	 */
+	public boolean match(Dimension node, Object other) {
+		if (!(other instanceof Dimension)) {
+			return false;
+		}
+		Dimension o = (Dimension) other;
+		return safeSubtreeListMatch(node.annotations(), o.annotations());
+	}
+
+	/**
+	 * Returns whether the given node and the other object match.
+	 * <p>
+	 * The default implementation provided by this class tests whether the
+	 * other object is a node of the same type with structurally isomorphic
+	 * child subtrees. Subclasses may override this method as needed.
+	 * </p>
+	 *
+	 * @param node the node
+	 * @param other the other object, or <code>null</code>
+	 * @return <code>true</code> if the subtree matches, or
+	 *   <code>false</code> if they do not match or the other object has a
+	 *   different node type or is <code>null</code>
 	 */
 	public boolean match(DoStatement node, Object other) {
 		if (!(other instanceof DoStatement)) {
@@ -857,7 +887,7 @@
 	 * @return <code>true</code> if the subtree matches, or
 	 *   <code>false</code> if they do not match or the other object has a
 	 *   different node type or is <code>null</code>
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean match(ExpressionMethodReference node, Object other) {
 		if (!(other instanceof ExpressionMethodReference)) {
@@ -905,29 +935,6 @@
 	 * @return <code>true</code> if the subtree matches, or
 	 *   <code>false</code> if they do not match or the other object has a
 	 *   different node type or is <code>null</code>
-	 * @since 3.9 BETA_JAVA8
-	 */
-	public boolean match(ExtraDimension node, Object other) {
-		if (!(other instanceof ExtraDimension)) {
-			return false;
-		}
-		ExtraDimension o = (ExtraDimension) other;
-		return safeSubtreeListMatch(node.annotations(), o.annotations());
-	}
-
-	/**
-	 * Returns whether the given node and the other object match.
-	 * <p>
-	 * The default implementation provided by this class tests whether the
-	 * other object is a node of the same type with structurally isomorphic
-	 * child subtrees. Subclasses may override this method as needed.
-	 * </p>
-	 *
-	 * @param node the node
-	 * @param other the other object, or <code>null</code>
-	 * @return <code>true</code> if the subtree matches, or
-	 *   <code>false</code> if they do not match or the other object has a
-	 *   different node type or is <code>null</code>
 	 */
 	public boolean match(FieldAccess node, Object other) {
 		if (!(other instanceof FieldAccess)) {
@@ -1161,7 +1168,7 @@
 	 * @return <code>true</code> if the subtree matches, or
 	 *   <code>false</code> if they do not match or the other object has a
 	 *   different node type or is <code>null</code>
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean match(IntersectionType node, Object other) {
 		if (!(other instanceof IntersectionType)) {
@@ -1260,7 +1267,7 @@
 	 * @return <code>true</code> if the subtree matches, or
 	 *   <code>false</code> if they do not match or the other object has a
 	 *   different node type or is <code>null</code>
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean match(LambdaExpression node, Object other) {
 		if (!(other instanceof LambdaExpression)) {
@@ -1546,6 +1553,31 @@
 	 * @return <code>true</code> if the subtree matches, or
 	 *   <code>false</code> if they do not match or the other object has a
 	 *   different node type or is <code>null</code>
+	 * @since 3.10
+	 */
+	public boolean match(NameQualifiedType node, Object other) {
+		if (!(other instanceof NameQualifiedType)) {
+			return false;
+		}
+		NameQualifiedType o = (NameQualifiedType) other;
+		return safeSubtreeMatch(node.getQualifier(), o.getQualifier())
+				&& safeSubtreeListMatch(node.annotations(), o.annotations())
+				&& safeSubtreeMatch(node.getName(), o.getName());
+	}
+
+	/**
+	 * Returns whether the given node and the other object match.
+	 * <p>
+	 * The default implementation provided by this class tests whether the
+	 * other object is a node of the same type with structurally isomorphic
+	 * child subtrees. Subclasses may override this method as needed.
+	 * </p>
+	 *
+	 * @param node the node
+	 * @param other the other object, or <code>null</code>
+	 * @return <code>true</code> if the subtree matches, or
+	 *   <code>false</code> if they do not match or the other object has a
+	 *   different node type or is <code>null</code>
 	 * @since 3.1
 	 */
 	public boolean match(NormalAnnotation node, Object other) {
@@ -1643,31 +1675,6 @@
 	 * @return <code>true</code> if the subtree matches, or
 	 *   <code>false</code> if they do not match or the other object has a
 	 *   different node type or is <code>null</code>
-	 * @since 3.9 BETA_JAVA8
-	 */
-	public boolean match(PackageQualifiedType node, Object other) {
-		if (!(other instanceof PackageQualifiedType)) {
-			return false;
-		}
-		PackageQualifiedType o = (PackageQualifiedType) other;
-		return safeSubtreeMatch(node.getQualifier(), o.getQualifier())
-				&& safeSubtreeListMatch(node.annotations(), o.annotations())
-				&& safeSubtreeMatch(node.getName(), o.getName());
-	}
-
-	/**
-	 * Returns whether the given node and the other object match.
-	 * <p>
-	 * The default implementation provided by this class tests whether the
-	 * other object is a node of the same type with structurally isomorphic
-	 * child subtrees. Subclasses may override this method as needed.
-	 * </p>
-	 *
-	 * @param node the node
-	 * @param other the other object, or <code>null</code>
-	 * @return <code>true</code> if the subtree matches, or
-	 *   <code>false</code> if they do not match or the other object has a
-	 *   different node type or is <code>null</code>
 	 * @since 3.1
 	 */
 	public boolean match(ParameterizedType node, Object other) {
@@ -2074,7 +2081,7 @@
 	 *   <code>false</code> if they do not match or the other object has a
 	 *   different node type or is <code>null</code>
 	 *   
-	 *   @since 3.9 BETA_JAVA8
+	 *   @since 3.10
 	 */
 	public boolean match(SuperMethodReference node, Object other) {
 		if (!(other instanceof SuperMethodReference)) {
@@ -2383,7 +2390,7 @@
 	 * @return <code>true</code> if the subtree matches, or
 	 *   <code>false</code> if they do not match or the other object has a
 	 *   different node type or is <code>null</code>
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean match(TypeMethodReference node, Object other) {
 		if (!(other instanceof TypeMethodReference)) {
@@ -2417,7 +2424,7 @@
 		}
 		TypeParameter o = (TypeParameter) other;
 		int level = node.getAST().apiLevel;
-		return (level >= AST.JLS8 ? safeSubtreeListMatch(node.annotations(), o.annotations()) : true)
+		return (level >= AST.JLS8 ? safeSubtreeListMatch(node.modifiers(), o.modifiers()) : true)
 				&& safeSubtreeMatch(node.getName(), o.getName())
 				&& safeSubtreeListMatch(node.typeBounds(), o.typeBounds());
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTNode.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTNode.java
index ab6d13d..7eade59 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTNode.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTNode.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -126,6 +122,7 @@
  * @since 2.0
  * @noextend This class is not intended to be subclassed by clients.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public abstract class ASTNode {
 	/*
 	 * ATTENTION: When doing anything to the ASTNode hierarchy, do not try to
@@ -835,18 +832,18 @@
 
 	/**
 	 * Node type constant indicating a node of type
-	 * <code>ExtraDimension</code>.
+	 * <code>Dimension</code>.
 	 *
-	 * @see ExtraDimension
-	 * @since 3.9 BETA_JAVA8
+	 * @see Dimension
+	 * @since 3.10
 	 */
-	public static final int EXTRA_DIMENSION = 85;
+	public static final int DIMENSION = 85;
 
 	/**
 	 * Node type constant indicating a node of type
 	 * <code>LambdaExpression</code>.
 	 * @see LambdaExpression
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final int LAMBDA_EXPRESSION = 86;
 
@@ -855,23 +852,23 @@
 	 * <code>IntersectionType</code>.
 	 *
 	 * @see IntersectionType
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final int INTERSECTION_TYPE = 87;
 
 	/**
 	 * Node type constant indicating a node of type
-	 * <code>QualifiedType</code>.
-	 * @see QualifiedType
-	 * @since 3.9 BETA_JAV8
+	 * <code>NameQualifiedType</code>.
+	 * @see NameQualifiedType
+	 * @since 3.10
 	 */
-	public static final int PACKAGE_QUALIFIED_TYPE = 88;
+	public static final int NAME_QUALIFIED_TYPE = 88;
 
 	/**
 	 * Node type constant indicating a node of type
 	 * <code>CreationReference</code>.
 	 * @see CreationReference
-	 * @since 3.9 BETA_JAV8
+	 * @since 3.10
 	 */
 	public static final int CREATION_REFERENCE = 89;
 
@@ -879,7 +876,7 @@
 	 * Node type constant indicating a node of type
 	 * <code>ExpressionMethodReference</code>.
 	 * @see ExpressionMethodReference
-	 * @since 3.9 BETA_JAV8
+	 * @since 3.10
 	 */
 	public static final int EXPRESSION_METHOD_REFERENCE = 90;
 
@@ -887,7 +884,7 @@
 	 * Node type constant indicating a node of type
 	 * <code>SuperMethhodReference</code>.
 	 * @see SuperMethodReference
-	 * @since 3.9 BETA_JAV8
+	 * @since 3.10
 	 */
 	public static final int SUPER_METHOD_REFERENCE = 91;
 
@@ -895,7 +892,7 @@
 	 * Node type constant indicating a node of type
 	 * <code>TypeMethodReference</code>.
 	 * @see TypeMethodReference
-	 * @since 3.9 BETA_JAV8
+	 * @since 3.10
 	 */
 	public static final int TYPE_METHOD_REFERENCE = 92;
 
@@ -955,8 +952,8 @@
 				return ContinueStatement.class;
 			case CREATION_REFERENCE :
 				return CreationReference.class;
-			case UNION_TYPE :
-				return UnionType.class;
+			case DIMENSION:
+				return Dimension.class;
 			case DO_STATEMENT :
 				return DoStatement.class;
 			case EMPTY_STATEMENT :
@@ -971,8 +968,6 @@
 				return ExpressionMethodReference.class;
 			case EXPRESSION_STATEMENT :
 				return ExpressionStatement.class;
-			case EXTRA_DIMENSION:
-				return ExtraDimension.class;
 			case FIELD_ACCESS :
 				return FieldAccess.class;
 			case FIELD_DECLARATION :
@@ -1015,6 +1010,8 @@
 				return MethodRefParameter.class;
 			case MODIFIER :
 				return Modifier.class;
+			case NAME_QUALIFIED_TYPE :
+				return NameQualifiedType.class;
 			case NORMAL_ANNOTATION :
 				return NormalAnnotation.class;
 			case NULL_LITERAL :
@@ -1023,8 +1020,6 @@
 				return NumberLiteral.class;
 			case PACKAGE_DECLARATION :
 				return PackageDeclaration.class;
-			case PACKAGE_QUALIFIED_TYPE :
-				return PackageQualifiedType.class;
 			case PARAMETERIZED_TYPE :
 				return ParameterizedType.class;
 			case PARENTHESIZED_EXPRESSION :
@@ -1085,6 +1080,8 @@
 				return TypeLiteral.class;
 			case TYPE_PARAMETER :
 				return TypeParameter.class;
+			case UNION_TYPE :
+				return UnionType.class;
 			case VARIABLE_DECLARATION_EXPRESSION :
 				return VariableDeclarationExpression.class;
 			case VARIABLE_DECLARATION_FRAGMENT :
@@ -1229,11 +1226,15 @@
 	private StructuralPropertyDescriptor location = null;
 
 	/** Internal convenience constant indicating that there is definite risk of cycles.
+	 * @see ChildPropertyDescriptor#cycleRisk()
+	 * @see ChildListPropertyDescriptor#cycleRisk()
 	 * @since 3.0
 	 */
 	static final boolean CYCLE_RISK = true;
 
 	/** Internal convenience constant indicating that there is no risk of cycles.
+	 * @see ChildPropertyDescriptor#cycleRisk()
+	 * @see ChildListPropertyDescriptor#cycleRisk()
 	 * @since 3.0
 	 */
 	static final boolean NO_CYCLE_RISK = false;
@@ -1960,7 +1961,7 @@
      * </p>
      * 
 	 * @exception UnsupportedOperationException if this operation is used below JLS8
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	final void unsupportedIn2_3_4() {
 		if (this.ast.apiLevel < AST.JLS8) {
@@ -1993,7 +1994,7 @@
      * </p>
      * 
 	 * @exception UnsupportedOperationException if this operation is used in an AST later than JLS4
-     * @since 3.9 BETA_JAVA8
+     * @since 3.10
      */
 	// In API Javadocs, add: * @deprecated In the JLS8 API, this method is replaced by {@link #replacement()}.
 	final void supportedOnlyIn2_3_4() {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTParser.java
index ee9e594..6ff4721 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTParser.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2013 IBM Corporation and others.
+ * Copyright (c) 2004, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -91,6 +87,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class ASTParser {
 
     // AspectJ Extension start 
@@ -112,10 +109,16 @@
 		}
 	}
 
+	/**
+	 * @since 3.10
+	 */
 	public interface IASTFactory {
 		public AST getAST(int level);
 	}
 
+	/**
+	 * @since 3.10
+	 */
 	public static AST getAST(int level) {
 		if (astFactory == null) {
 		  return AST.newAST(level);
@@ -419,7 +422,7 @@
 	 * Requests that the compiler should provide binding information for
 	 * the AST nodes it creates.
 	 * <p>
-	 * Default to <code>false</code> (no bindings).
+	 * Defaults to <code>false</code> (no bindings).
 	 * </p>
 	 * <p>
 	 * If {@link #setResolveBindings(boolean) setResolveBindings(true)}, the various names
@@ -442,12 +445,12 @@
 	 * <code>resolveBinding</code> methods return <code>null</code> from the outset.
 	 * </p>
 	 * <p>
-	 * When bindings are requested, instead of considering compilation units on disk only
-	 * one can supply a <code>WorkingCopyOwner</code>. Working copies owned
+	 * When bindings are requested, instead of considering compilation units on disk only,
+	 * one can also supply a <code>WorkingCopyOwner</code>. Working copies owned
 	 * by this owner take precedence over the underlying compilation units when looking
 	 * up names and drawing the connections.
 	 * </p>
-	 * <p>Note that working copy owner are used only if the <code>org.aspectj.org.eclipse.jdt.core</code>
+	 * <p>Note that working copy owners are used only if the <code>org.aspectj.org.eclipse.jdt.core</code>
 	 * bundle is initialized.</p>
 	 * <p>
 	 * Binding information is obtained from the Java model.
@@ -750,7 +753,7 @@
 	}
 
     /**
-     * Sets the working copy owner using when resolving bindings, where
+     * Sets the working copy owner used when resolving bindings, where
      * <code>null</code> means the primary owner. Defaults to the primary owner.
      *
 	 * @param owner the owner of working copies that take precedence over underlying
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTRecoveryPropagator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTRecoveryPropagator.java
index 29f3440..3877b96 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTRecoveryPropagator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTRecoveryPropagator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2008 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
@@ -25,6 +25,7 @@
 /**
  * Internal AST visitor for propagating syntax errors.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 class ASTRecoveryPropagator extends DefaultASTVisitor {
 	private static final int NOTHING = -1;
 	HashtableOfObjectToIntArray endingTokens = new HashtableOfObjectToIntArray();
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTVisitor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTVisitor.java
index d961788..88faf78 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTVisitor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ASTVisitor.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -542,7 +538,7 @@
 	 * @return <code>true</code> if the children of this node should be
 	 * visited, and <code>false</code> if the children of this node should
 	 * be skipped
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean visit(CreationReference node) {
 		return true;
@@ -559,6 +555,23 @@
 	 * @return <code>true</code> if the children of this node should be
 	 * visited, and <code>false</code> if the children of this node should
 	 * be skipped
+	 * @since 3.10
+	 */
+	public boolean visit(Dimension node) {
+		return true;
+	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 *
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 */
 	public boolean visit(DoStatement node) {
 		return true;
@@ -642,7 +655,7 @@
 	 * @return <code>true</code> if the children of this node should be
 	 * visited, and <code>false</code> if the children of this node should
 	 * be skipped
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean visit(ExpressionMethodReference node) {
 		return true;
@@ -675,23 +688,6 @@
 	 * @return <code>true</code> if the children of this node should be
 	 * visited, and <code>false</code> if the children of this node should
 	 * be skipped
-	 * @since 3.9 BETA_JAVA8
-	 */
-	public boolean visit(ExtraDimension node) {
-		return true;
-	}
-
-	/**
-	 * Visits the given type-specific AST node.
-	 * <p>
-	 * The default implementation does nothing and return true.
-	 * Subclasses may reimplement.
-	 * </p>
-	 *
-	 * @param node the node to visit
-	 * @return <code>true</code> if the children of this node should be
-	 * visited, and <code>false</code> if the children of this node should
-	 * be skipped
 	 */
 	public boolean visit(FieldAccess node) {
 		return true;
@@ -820,7 +816,7 @@
 	 * @return <code>true</code> if the children of this node should be
 	 * visited, and <code>false</code> if the children of this node should
 	 * be skipped
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean visit(IntersectionType node) {
 		return true;
@@ -876,7 +872,7 @@
 	 * @return <code>true</code> if the children of this node should be
 	 * visited, and <code>false</code> if the children of this node should
 	 * be skipped
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean visit(LambdaExpression node) {
 		return true;
@@ -1045,6 +1041,22 @@
 		return true;
 	}
 
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 *
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 * @since 3.10
+	 */
+	public boolean visit(NameQualifiedType node) {
+		return true;
+	}
 
 	/**
 	 * Visits the given type-specific AST node.
@@ -1111,24 +1123,6 @@
 		return true;
 	}
 
-
-	/**
-	 * Visits the given type-specific AST node.
-	 * <p>
-	 * The default implementation does nothing and return true.
-	 * Subclasses may reimplement.
-	 * </p>
-	 *
-	 * @param node the node to visit
-	 * @return <code>true</code> if the children of this node should be
-	 * visited, and <code>false</code> if the children of this node should
-	 * be skipped
-	 * @since 3.9 BETA_JAVA8
-	 */
-	public boolean visit(PackageQualifiedType node) {
-		return true;
-	}
-
 	/**
 	 * Visits the given type-specific AST node.
 	 * <p>
@@ -1401,7 +1395,7 @@
 	 * @return <code>true</code> if the children of this node should be
 	 * visited, and <code>false</code> if the children of this node should
 	 * be skipped
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean visit(SuperMethodReference node) {
 		return true;
@@ -1599,7 +1593,7 @@
 	 * visited, and <code>false</code> if the children of this node should
 	 * be skipped
 	 * 
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean visit(TypeMethodReference node) {
 		return true;
@@ -1987,7 +1981,7 @@
 	 * </p>
 	 *
 	 * @param node the node to visit
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public void endVisit(CreationReference node) {
 		// default implementation: do nothing
@@ -2063,7 +2057,7 @@
 	 * </p>
 	 *
 	 * @param node the node to visit
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public void endVisit(ExpressionMethodReference node) {
 		// default implementation: do nothing
@@ -2088,9 +2082,9 @@
 	 * </p>
 	 *
 	 * @param node the node to visit
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
-	public void endVisit(ExtraDimension node) {
+	public void endVisit(Dimension node) {
 		// do nothing by default
 	}
 
@@ -2221,7 +2215,7 @@
 	 * </p>
 	 *
 	 * @param node the node to visit
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public void endVisit(LambdaExpression node) {
 		// default implementation: do nothing
@@ -2354,6 +2348,19 @@
 	 * </p>
 	 *
 	 * @param node the node to visit
+	 * @since 3.10
+	 */
+	public void endVisit(NameQualifiedType node) {
+		// default implementation: do nothing
+	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 *
+	 * @param node the node to visit
 	 * @since 3.1
 	 */
 	public void endVisit(NormalAnnotation node) {
@@ -2403,19 +2410,6 @@
 	 * </p>
 	 *
 	 * @param node the node to visit
-	 * @since 3.9 BETA_JAVA8
-	 */
-	public void endVisit(PackageQualifiedType node) {
-		// default implementation: do nothing
-	}
-
-	/**
-	 * End of visit the given type-specific AST node.
-	 * <p>
-	 * The default implementation does nothing. Subclasses may reimplement.
-	 * </p>
-	 *
-	 * @param node the node to visit
 	 * @since 3.1
 	 */
 	public void endVisit(ParameterizedType node) {
@@ -2611,7 +2605,7 @@
 	 * </p>
 	 *
 	 * @param node the node to visit
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public void endVisit(SuperMethodReference node) {
 		// default implementation: do nothing
@@ -2758,7 +2752,7 @@
 	 *
 	 * @param node the node to visit
 	 * 
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public void endVisit(TypeMethodReference node) {
 		// default implementation: do nothing
@@ -2797,7 +2791,7 @@
 	 * </p>
 	 *
 	 * @param node the node to visit
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public void endVisit(IntersectionType node) {
 		// default implementation: do nothing
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.java
index db2bc97..4c476cc 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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,7 @@
  *
  * @since 3.0
  */
+@SuppressWarnings("rawtypes")
 public abstract class AbstractTypeDeclaration extends BodyDeclaration {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotatableType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotatableType.java
index f8e9b69..b164e8f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotatableType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotatableType.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -20,10 +16,18 @@
  * Abstract base class of AST nodes that represent an annotatable type (added in JLS8 API).
  * <p>
  * Introduced in JLS8, type references that can be annotated are represented by 
- * AnnotatableType. For the list of types extending AnnotatableType, see {@link Type}.</p>
+ * AnnotatableType. For the list of types extending AnnotatableType, see {@link Type}.
+ * </p>
+ * <p>
+ * Note that type annotations ({@link ITypeBinding#getTypeAnnotations()}) that semantically
+ * belong to a resolved type reference don't always show up in {@link AnnotatableType#annotations()}.
+ * Syntactically, type annotations can also be part of an associated declaration node's
+ * <code>modifiers()</code> list.
+ * </p>
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  */
+@SuppressWarnings({"rawtypes"})
 public abstract class AnnotatableType extends Type {
 	
 	/**
@@ -78,9 +82,16 @@
 
 	/**
 	 * Returns the live ordered list of annotations for this Type node (added in JLS8 API).
-	 *
+	 * <p>
+	 * Note that type annotations ({@link ITypeBinding#getTypeAnnotations()}) that semantically
+	 * belong to a resolved type reference don't always show up in this list.
+	 * Syntactically, type annotations can also be part of an associated declaration node's
+	 * <code>modifiers()</code> list.
+	 * </p>
+	 * 
 	 * @return the live list of annotations (element type: {@link Annotation})
 	 * @exception UnsupportedOperationException if this operation is used below JLS8
+	 * @see ITypeBinding#getTypeAnnotations()
 	 */
 	public List annotations() {
 		// more efficient than just calling unsupportedIn2_3_4() to check
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Annotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Annotation.java
index 22b9e1d..63f6801 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Annotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Annotation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -22,6 +22,7 @@
  * </p>
  * @since 3.1
  */
+@SuppressWarnings("rawtypes")
 public abstract class Annotation extends Expression implements IExtendedModifier {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.java
index cc279a1..601c68c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -43,6 +43,7 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes"})
 public class AnnotationTypeDeclaration extends AbstractTypeDeclaration {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.java
index 178a85d..5689f16 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.java
@@ -37,6 +37,7 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes"})
 public class AnnotationTypeMemberDeclaration extends BodyDeclaration {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.java
index 0522caf..b091241 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.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
@@ -29,6 +29,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class AnonymousClassDeclaration extends ASTNode {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayAccess.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayAccess.java
index 4969dd2..851bb88 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayAccess.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayAccess.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class ArrayAccess extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayCreation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayCreation.java
index 947fb73..b70501c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayCreation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayCreation.java
@@ -37,6 +37,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ArrayCreation extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayInitializer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayInitializer.java
index 71322b6..dd81caf 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayInitializer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayInitializer.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ArrayInitializer extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayType.java
index 198d09b..94fc4f7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ArrayType.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,33 +17,58 @@
 /**
  * Type node for an array type.
  * <p>
- * Array types are expressed in a recursive manner, one dimension at a time.
+ * In JLS8 and later, array types are represented by a base element type (which cannot
+ * be an array type) and a list of dimensions, each of which may have a list of annotations.
  * </p>
  * <pre>
- * ArrayType:
- *    Type { Annotation } <b>'['</b> <b>']'</b>
+ * ArrayType: 
+ *    Type Dimension <b>{</b> Dimension <b>}</b>
  * </pre>
+ * 
+ * In JLS4 and before, array types were expressed in a recursive manner, one dimension at a time:
+ * <pre>
+ * ArrayType:
+ *    Type <b>[</b> <b>]</b></pre>
  *
+ * This structure became untenable with the advent of type-use annotations,
+ * because in the language model, the base type binds with array dimensions from right to left,
+ * whereas a recursive structure binds from left to right (inside out).
+ * <p>
+ * Example:<br>
+ * <code><u>int @A[] @B[] @C[]</u></code>
+ * is an <u><code>@A</code></u>-array of<br>
+ * <code><u>int </u>&nbsp;&nbsp;&nbsp;&nbsp;<u> @B[] @C[]</u></code>,
+ * but such a component type is not representable by nested <code>ArrayType</code>s with contiguous source ranges.
+ * 
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
-public class ArrayType extends AnnotatableType {
+@SuppressWarnings({"rawtypes", "unchecked"})
+public class ArrayType extends Type {
 
 	/**
 	 * The "componentType" structural property of this node type (child type: {@link Type}).
+	 * @deprecated In the JLS8 API, this property is replaced by {@link #ELEMENT_TYPE_PROPERTY} and {@link #DIMENSIONS_PROPERTY}.
 	 * @since 3.0
 	 */
 	public static final ChildPropertyDescriptor COMPONENT_TYPE_PROPERTY =
 		new ChildPropertyDescriptor(ArrayType.class, "componentType", Type.class, MANDATORY, CYCLE_RISK); //$NON-NLS-1$
 
 	/**
-	 * The "annotations" structural property of this node type (element type: {@link Annotation}).
-	 * @since 3.9 BETA_JAVA8
+	 * The "elementType" structural property of this node type (child type: {@link Type}) (added in JLS8 API).
+	 * Cannot be an array type.
+	 * @since 3.10
 	 */
-	public static final ChildListPropertyDescriptor ANNOTATIONS_PROPERTY =
-			internalAnnotationsPropertyFactory(ArrayType.class);
+	public static final ChildPropertyDescriptor ELEMENT_TYPE_PROPERTY =
+			new ChildPropertyDescriptor(ArrayType.class, "elementType", Type.class, MANDATORY, CYCLE_RISK); //$NON-NLS-1$	
 	
 	/**
+	 * The "dimensions" structural property of this node type (element type: {@link Dimension}) (added in JLS8 API).
+	 * @since 3.10
+	 */
+	public static final ChildListPropertyDescriptor DIMENSIONS_PROPERTY =
+			new ChildListPropertyDescriptor(ArrayType.class, "dimensions", Dimension.class, CYCLE_RISK); //$NON-NLS-1$	
+	/**
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
@@ -57,7 +78,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static final List PROPERTY_DESCRIPTORS_8_0;
 
@@ -69,8 +90,8 @@
 
 		propertyList = new ArrayList(3);
 		createPropertyList(ArrayType.class, propertyList);
-		addProperty(COMPONENT_TYPE_PROPERTY, propertyList);
-		addProperty(ANNOTATIONS_PROPERTY, propertyList);
+		addProperty(ELEMENT_TYPE_PROPERTY, propertyList);
+		addProperty(DIMENSIONS_PROPERTY, propertyList);
 		PROPERTY_DESCRIPTORS_8_0 = reapPropertyList(propertyList);
 	}
 
@@ -97,10 +118,20 @@
 	}
 
 	/**
-	 * The component type; lazily initialized; defaults to a simple type with
+	 * The element type (before JLS8: component type); lazily initialized; defaults to a simple type with
 	 * an unspecified, but legal, name.
 	 */
-	private Type componentType = null;
+	private Type type = null;
+
+	/**
+	 * List of dimensions this node has with optional annotations
+	 * (element type: {@link Dimension}).
+	 * Null before JLS8. Added in JLS8; defaults to a list with one element
+	 * (see constructor).
+	 * 
+	 * @since 3.10
+	 */
+	private ASTNode.NodeList dimensions = null;
 
 	/**
 	 * Creates a new unparented node for an array type owned by the given AST.
@@ -113,14 +144,31 @@
 	 */
 	ArrayType(AST ast) {
 		super(ast);
+		if (ast.apiLevel >= AST.JLS8) {
+			this.dimensions = new ASTNode.NodeList(DIMENSIONS_PROPERTY);
+			// single dimension array is the default
+			this.dimensions().add(this.ast.newDimension());
+		}
 	}
 
-	/* (omit javadoc for this method)
-	 * Method declared on AnnotatableType.
-	 * @since 3.9 BETA_JAVA8
-	 */
-	final ChildListPropertyDescriptor internalAnnotationsProperty() {
-		return ANNOTATIONS_PROPERTY;
+	/**
+	* Creates a new unparented node for an array type owned by the given AST.
+	* <p>
+	* N.B. This constructor is package-private.
+	* </p>
+	*
+	* @param ast the AST that is to own this node
+	* @param dimensions no of dimensions - can be zero
+	*
+	* @since 3.10
+	*/
+	ArrayType(AST ast, int dimensions) {
+		super(ast);
+		unsupportedIn2_3_4();
+		this.dimensions = new ASTNode.NodeList(DIMENSIONS_PROPERTY);
+		for (int i = 0; i < dimensions; ++i) {
+			this.dimensions().add(this.ast.newDimension());
+		}
 	}
 
 	/* (omit javadoc for this method)
@@ -134,8 +182,8 @@
 	 * Method declared on ASTNode.
 	 */
 	final List internalGetChildListProperty(ChildListPropertyDescriptor property) {
-		if (property == ANNOTATIONS_PROPERTY) {
-			return annotations();
+		if (property == DIMENSIONS_PROPERTY) {
+			return dimensions();
 		}
 		// allow default implementation to flag the error
 		return super.internalGetChildListProperty(property);
@@ -152,6 +200,13 @@
 				setComponentType((Type) child);
 				return null;
 			}
+		} else if (property == ELEMENT_TYPE_PROPERTY) {
+			if (get) {
+				return getElementType();
+			} else {
+				setElementType((Type) child);
+				return null;
+			}
 		}
 		// allow default implementation to flag the error
 		return super.internalGetSetChildProperty(property, get, child);
@@ -168,13 +223,17 @@
 	 * Method declared on ASTNode.
 	 */
 	ASTNode clone0(AST target) {
-		ArrayType result = new ArrayType(target);
-		result.setSourceRange(getStartPosition(), getLength());
-		result.setComponentType((Type) getComponentType().clone(target));
-		if (this.ast.apiLevel >= AST.JLS8) {
-			result.annotations().addAll(
-					ASTNode.copySubtrees(target, annotations()));
+		ArrayType result;
+		if (this.ast.apiLevel < AST.JLS8) {
+			result = new ArrayType(target);
+			result.setComponentType((Type) getComponentType().clone(target));			
+		} else {
+			result = new ArrayType(target, 0);
+			result.setElementType((Type) getElementType().clone(target));
+			result.dimensions().addAll(
+					ASTNode.copySubtrees(target, dimensions()));
 		}
+		result.setSourceRange(getStartPosition(), getLength());
 		return result;
 	}
 
@@ -193,9 +252,11 @@
 		boolean visitChildren = visitor.visit(this);
 		if (visitChildren) {
 			// visit children in normal left to right reading order
-			acceptChild(visitor, getComponentType());
-			if (this.ast.apiLevel >= AST.JLS8) {
-				acceptChildren(visitor, this.annotations);
+			if (this.ast.apiLevel < AST.JLS8) {
+				acceptChild(visitor, getComponentType());				
+			} else {
+				acceptChild(visitor, getElementType());
+				acceptChildren(visitor, this.dimensions);
 			}
 		}
 		visitor.endVisit(this);
@@ -206,19 +267,28 @@
 	 * may be another array type.
 	 *
 	 * @return the component type node
+	 * @exception UnsupportedOperationException if this operation is used in
+	 * an AST later than JLS4
+	 * @see #dimensions()
+	 * @deprecated In the JLS8 API, the recursive structure is not valid.
 	 */
 	public Type getComponentType() {
-		if (this.componentType == null) {
+		supportedOnlyIn2_3_4();
+		return internalGetType(COMPONENT_TYPE_PROPERTY);
+	}
+
+	private Type internalGetType(ChildPropertyDescriptor property) {
+		if (this.type == null) {
 			// lazy init must be thread-safe for readers
 			synchronized (this) {
-				if (this.componentType == null) {
+				if (this.type == null) {
 					preLazyInit();
-					this.componentType = new SimpleType(this.ast);
-					postLazyInit(this.componentType, COMPONENT_TYPE_PROPERTY);
+					this.type = new SimpleType(this.ast);
+					postLazyInit(this.type, property);
 				}
 			}
 		}
-		return this.componentType;
+		return this.type;
 	}
 
 	/**
@@ -232,52 +302,108 @@
 	 * <li>the node already has a parent</li>
 	 * <li>a cycle in would be created</li>
 	 * </ul>
+	 * @exception UnsupportedOperationException if this operation is used in
+	 * an AST later than JLS4
+	 * @deprecated In the JLS8 API, the recursive structure is not valid.
 	 */
 	public void setComponentType(Type componentType) {
+		supportedOnlyIn2_3_4();
 		if (componentType == null) {
 			throw new IllegalArgumentException();
 		}
-		ASTNode oldChild = this.componentType;
-		preReplaceChild(oldChild, componentType, COMPONENT_TYPE_PROPERTY);
-		this.componentType = componentType;
-		postReplaceChild(oldChild, componentType, COMPONENT_TYPE_PROPERTY);
+		internalSetType(componentType, COMPONENT_TYPE_PROPERTY);
+	}
+
+	private void internalSetType(Type componentType, ChildPropertyDescriptor property) {
+		ASTNode oldChild = this.type;
+		preReplaceChild(oldChild, componentType, property);
+		this.type = componentType;
+		postReplaceChild(oldChild, componentType, property);
 	}
 
 	/**
 	 * Returns the element type of this array type. The element type is
 	 * never an array type.
 	 * <p>
-	 * This is a convenience method that descends a chain of nested array types
+	 * In JLS4 and earlier, this is a convenience method that descends a chain of nested array types
 	 * until it reaches a non-array type.
 	 * </p>
 	 *
-	 * @return the component type node
+	 * @return the element type node
 	 */
 	public Type getElementType() {
-		Type t = getComponentType();
-		while (t.isArrayType()) {
-			t = ((ArrayType) t).getComponentType();
+		if (this.ast.apiLevel() < AST.JLS8) {
+			Type t = getComponentType();
+			while (t.isArrayType()) {
+				t = ((ArrayType) t).getComponentType();
+			}
+			return t;
 		}
-		return t;
+		return internalGetType(ELEMENT_TYPE_PROPERTY);
+	}
+
+	/**
+	 * Sets the element type of the array.
+	 *
+	 * @param type the new type
+	 * @exception IllegalArgumentException if:
+	 * <ul>
+	 * <li>the node belongs to a different AST</li>
+	 * <li>the node already has a parent</li>
+	 * <li>the node is an array type</li>
+	 * </ul>
+	 * @exception UnsupportedOperationException if this operation is used below JLS8
+	 * @since 3.10
+	 */
+	public void setElementType(Type type) {
+		unsupportedIn2_3_4();
+		if (type == null || type instanceof ArrayType) {
+			throw new IllegalArgumentException();
+		}
+		internalSetType(type, ELEMENT_TYPE_PROPERTY);
 	}
 
 	/**
 	 * Returns the number of dimensions in this array type.
 	 * <p>
-	 * This is a convenience method that descends a chain of nested array types
+	 * In JLS8 and later, this is a convenience method that returns <code>dimensions().size()</code>.
+	 * </p>
+	 * <p>
+	 * In JLS4 and earlier, this is a convenience method that descends a chain of nested array types
 	 * until it reaches a non-array type.
 	 * </p>
 	 *
 	 * @return the number of dimensions (always positive)
 	 */
 	public int getDimensions() {
+		if (this.ast.apiLevel() >= AST.JLS8) {
+			return dimensions().size();
+		}
 		Type t = getComponentType();
-		int dimensions = 1; // always include this array type
+		int dimension = 1; // always include this array type
 		while (t.isArrayType()) {
-			dimensions++;
+			dimension++;
 			t = ((ArrayType) t).getComponentType();
 		}
-		return dimensions;
+		return dimension;			
+	}
+
+	/**
+	 * Returns the live ordered list of dimensions with optional annotations (added in JLS8 API).
+	 * <p>
+	 * For the array type to be plausible, the list should contain at least one element.
+	 * </p>
+	 * 
+	 * @return the live list of dimensions with optional annotations (element type: {@link Dimension})
+	 * @exception UnsupportedOperationException if this operation is used below JLS8
+	 * @since 3.10
+	 */
+	public List dimensions() {
+		// more efficient than just calling unsupportedIn2_3_4() to check
+		if (this.dimensions == null) {
+			unsupportedIn2_3_4();
+		}
+		return this.dimensions;
 	}
 
 	/* (omit javadoc for this method)
@@ -293,8 +419,8 @@
 	int treeSize() {
 		return
 			memSize()
-			+ (this.componentType == null ? 0 : getComponentType().treeSize())
-			+ (this.annotations == null ? 0 : this.annotations.listSize());
+			+ (this.type == null ? 0 : (this.ast.apiLevel() < AST.JLS8 ? getComponentType().treeSize() : getElementType().treeSize())
+			+ (this.dimensions == null ? 0 : this.dimensions.listSize()));
 	}
 }
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AssertStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AssertStatement.java
index 5e271d5..e46c160 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AssertStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/AssertStatement.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class AssertStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Assignment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Assignment.java
index 8495a82..b6df623 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Assignment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Assignment.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
@@ -27,6 +27,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class Assignment extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BindingComparator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BindingComparator.java
index b548765..2d44a6e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BindingComparator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BindingComparator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -30,6 +30,7 @@
  *
  * @since 3.1
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 class BindingComparator {
 	/**
 	 * @param bindings
@@ -172,7 +173,7 @@
 		return true;
 	}
 	static boolean isEqual(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding typeBinding, org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding typeBinding2, HashSet visitedTypes) {
-		if (typeBinding == typeBinding2)
+		if (org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.equalsEquals(typeBinding, typeBinding2))
 			return true;
 		if (typeBinding == null || typeBinding2 == null)
 			return false;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BindingResolver.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BindingResolver.java
index 2471d37..796aa38 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BindingResolver.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BindingResolver.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -596,7 +592,7 @@
 	 * @param methodReference the  method reference of interest
 	 * @return the binding for the given  method reference, or
 	 *    <code>null</code> if no binding is available
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	IMethodBinding resolveMethod(MethodReference methodReference) {
 		return null;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Block.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Block.java
index 22c01ff..8f1e411 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Block.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Block.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class Block extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BlockComment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BlockComment.java
index eaf1a2a..aaae9a9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BlockComment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BlockComment.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -33,6 +33,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public final class BlockComment extends Comment {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BodyDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BodyDeclaration.java
index 80d996a..6557d80 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BodyDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BodyDeclaration.java
@@ -42,6 +42,7 @@
  *
  * @since 2.0
  */
+@SuppressWarnings("rawtypes")
 public abstract class BodyDeclaration extends ASTNode {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BooleanLiteral.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BooleanLiteral.java
index 5c24cc1..7f4d40d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BooleanLiteral.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BooleanLiteral.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
@@ -26,6 +26,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class BooleanLiteral extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BreakStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BreakStatement.java
index 5e8fdc1..ead8c9a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BreakStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/BreakStatement.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class BreakStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CastExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CastExpression.java
index 1c531c1..66e2db4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CastExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CastExpression.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class CastExpression extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CatchClause.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CatchClause.java
index 174a6d7..6b814c6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CatchClause.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CatchClause.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
@@ -26,6 +26,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class CatchClause extends ASTNode {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CharacterLiteral.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CharacterLiteral.java
index 82aa795..6698518 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CharacterLiteral.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CharacterLiteral.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class CharacterLiteral extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ChildListPropertyDescriptor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ChildListPropertyDescriptor.java
index 000019d..bbe9607 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ChildListPropertyDescriptor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ChildListPropertyDescriptor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 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,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public final class ChildListPropertyDescriptor extends StructuralPropertyDescriptor {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ChildPropertyDescriptor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ChildPropertyDescriptor.java
index 9a14dd7b..94317f1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ChildPropertyDescriptor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ChildPropertyDescriptor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -20,6 +20,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public final class ChildPropertyDescriptor extends StructuralPropertyDescriptor {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ClassInstanceCreation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ClassInstanceCreation.java
index 5043df6..78364a2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ClassInstanceCreation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ClassInstanceCreation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -31,25 +31,13 @@
  * simple, qualified, or parameterized type.
  * </p>
  * <p>
- * A type like "A.B" can be represented either of two ways:
- * <ol>
- * <li>
- * <code>QualifiedType(SimpleType(SimpleName("A")),SimpleName("B"))</code>
- * </li>
- * <li>
- * <code>SimpleType(QualifiedName(SimpleName("A"),SimpleName("B")))</code>
- * </li>
- * </ol>
- * The first form is preferred when "A" is known to be a type (as opposed
- * to a package). However, a parser cannot always determine this. Clients
- * should be prepared to handle either rather than make assumptions.
- * (Note also that the first form became possible as of JLS3; only the second
- * form existed in JLS2.)
+ * {@link QualifiedType} discusses typical representations of qualified type references.
  * </p>
  *
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ClassInstanceCreation extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnit.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnit.java
index 52f5dcc..2fdff24 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnit.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnit.java
@@ -42,6 +42,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class CompilationUnit extends ASTNode {
 
 	/**
@@ -868,16 +869,20 @@
 	 * representing the corresponding edits to the original
 	 * source code string.
 	 * <p>
-	 * Note that this way of manipulating an AST only allows a single line of modifications.
-	 * To modify an AST in a non-destructive way, use an external {@link ASTRewrite}.
-	 * As an added benefit, you can then also use
-	 * {@link ASTRewrite#createStringPlaceholder(String, int) string placeholders} and
-	 * {@link ASTRewrite#createCopyTarget(ASTNode) copy} nodes including comments and formatting.
+	 * Note that this way of manipulating an AST only allows a single line of modifications,
+	 * and it lacks important functionality like
+	 * {@link ASTRewrite#createStringPlaceholder(String, int) string placeholders} and support for
+	 * {@link ASTRewrite#createCopyTarget(ASTNode) copying} nodes including comments and formatting.
+	 * </p>
+	 * <p>
+	 * To future-proof your code, <em>consider using an external {@link ASTRewrite} instead</em>,
+	 * which doesn't suffer from these limitations and allows to modify an AST in a non-destructive way.
 	 * </p>
 	 *
 	 * @exception IllegalArgumentException if this compilation unit is
 	 * marked as unmodifiable, or if this compilation unit has already
 	 * been tampered with, or recording has already been enabled
+	 * @see ASTRewrite
 	 * @since 3.0
 	 */
 	public void recordModifications() {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver.java
index 2f1d3f3..049a2e6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CompilationUnitResolver.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for bug 363858 - [dom] early throwing of AbortCompilation causes NPE in CompilationUnitResolver
@@ -69,6 +65,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.util.CommentRecorderParser;
 import org.aspectj.org.eclipse.jdt.internal.core.util.DOMFinder;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 class CompilationUnitResolver extends Compiler {
 	public static final int RESOLVE_BINDING = 0x1;
 	public static final int PARTIAL = 0x2;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ConditionalExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ConditionalExpression.java
index 3679d08..124702f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ConditionalExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ConditionalExpression.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class ConditionalExpression extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ConstructorInvocation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ConstructorInvocation.java
index 5725a86..3427bd4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ConstructorInvocation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ConstructorInvocation.java
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ConstructorInvocation extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ContinueStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ContinueStatement.java
index 018288c..048c50f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ContinueStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ContinueStatement.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class ContinueStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CreationReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CreationReference.java
index 51c4276..4481e60 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CreationReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/CreationReference.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,9 +23,10 @@
  *         <b>new</b>
  * </pre>
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class CreationReference extends MethodReference {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DefaultASTVisitor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DefaultASTVisitor.java
index c036dcd..a9cf08b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DefaultASTVisitor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DefaultASTVisitor.java
@@ -95,6 +95,10 @@
 	public void endVisit(CreationReference node) {
 		endVisitNode(node);
 	}
+	public void endVisit(Dimension node) {
+		endVisitNode(node);
+	}
+
 	public void endVisit(DoStatement node) {
 		endVisitNode(node);
 	}
@@ -116,9 +120,6 @@
 	public void endVisit(ExpressionStatement node) {
 		endVisitNode(node);
 	}
-	public void endVisit(ExtraDimension node) {
-		endVisitNode(node);
-	}
 	public void endVisit(FieldAccess node) {
 		endVisitNode(node);
 	}
@@ -182,6 +183,10 @@
 	public void endVisit(Modifier node) {
 		endVisitNode(node);
 	}
+	public void endVisit(NameQualifiedType node) {
+		endVisitNode(node);
+	}
+
 	public void endVisit(NormalAnnotation node) {
 		endVisitNode(node);
 	}
@@ -194,9 +199,6 @@
 	public void endVisit(PackageDeclaration node) {
 		endVisitNode(node);
 	}
-	public void endVisit(PackageQualifiedType node) {
-		endVisitNode(node);
-	}
 	public void endVisit(ParameterizedType node) {
 		endVisitNode(node);
 	}
@@ -377,6 +379,10 @@
 	public boolean visit(CreationReference node) {
 		return visitNode(node);
 	}
+	public boolean visit(Dimension node) {
+		return visitNode(node);
+	}
+
 	public boolean visit(DoStatement node) {
 		return visitNode(node);
 	}
@@ -398,9 +404,6 @@
 	public boolean visit(ExpressionStatement node) {
 		return visitNode(node);
 	}
-	public boolean visit(ExtraDimension node) {
-		return visitNode(node);
-	}
 	public boolean visit(FieldAccess node) {
 		return visitNode(node);
 	}
@@ -468,6 +471,10 @@
 	public boolean visit(MethodRefParameter node) {
 		return visitNode(node);
 	}
+	public boolean visit(NameQualifiedType node) {
+		return visitNode(node);
+	}
+
 	public boolean visit(NormalAnnotation node) {
 		return visitNode(node);
 	}
@@ -480,9 +487,6 @@
 	public boolean visit(PackageDeclaration node) {
 		return visitNode(node);
 	}
-	public boolean visit(PackageQualifiedType node) {
-		return visitNode(node);
-	}
 	public boolean visit(ParameterizedType node) {
 		return visitNode(node);
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
index f17297c..7e8fa09 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for Bug 342671 - ClassCastException: org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding cannot be cast to org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding
@@ -17,6 +13,7 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.aspectj.org.eclipse.jdt.core.WorkingCopyOwner;
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
@@ -27,10 +24,10 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldReference;
-import org.aspectj.org.eclipse.jdt.internal.compiler.ast.JavadocImplicitTypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ImportReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.JavadocAllocationExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.JavadocFieldReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.JavadocImplicitTypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.JavadocMessageSend;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.JavadocQualifiedTypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.JavadocSingleNameReference;
@@ -66,6 +63,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.VoidTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
@@ -81,6 +79,7 @@
  * threads, the methods are synchronized on the DefaultBindingResolver instance.
  * </p>
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 class DefaultBindingResolver extends BindingResolver {
 
 	/*
@@ -100,8 +99,8 @@
 		Map compilerBindingsToASTBindings;
 
 		BindingTables() {
-			this.compilerBindingsToASTBindings = new HashMap();
-			this.bindingKeysToBindings = new HashMap();
+			this.compilerBindingsToASTBindings = new ConcurrentHashMap();
+			this.bindingKeysToBindings = new ConcurrentHashMap();
 		}
 
 	}
@@ -883,7 +882,7 @@
 		Object oldNode = this.newAstToOldAst.get(lambda);
 		if (oldNode instanceof org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression) {
 			org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression lambdaExpression = (org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression) oldNode;
-			IMethodBinding methodBinding = getMethodBinding(lambdaExpression.binding);
+			IMethodBinding methodBinding = getMethodBinding(lambdaExpression.getMethodBinding());
 			if (methodBinding == null) {
 				return null;
 			}
@@ -934,7 +933,7 @@
 		Object oldNode = this.newAstToOldAst.get(methodReference);
 		if (oldNode instanceof org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression) {
 			org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression referenceExpression = (org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression) oldNode;
-			IMethodBinding methodBinding = getMethodBinding(referenceExpression.binding);
+			IMethodBinding methodBinding = getMethodBinding(referenceExpression.getMethodBinding());
 			if (methodBinding == null) {
 				return null;
 			}
@@ -1122,6 +1121,9 @@
 		} else if (node instanceof QualifiedSuperReference) {
 			QualifiedSuperReference qualifiedSuperReference = (QualifiedSuperReference) node;
 			return this.getTypeBinding(qualifiedSuperReference.qualification.resolvedType);
+		} else if (node instanceof Receiver) {
+			org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding receiver = ((Receiver) node).type.resolvedType;
+			return this.getTypeBinding(receiver);
 		} else if (node instanceof LocalDeclaration) {
 			IVariableBinding variable = this.getVariableBinding(((LocalDeclaration)node).binding);
 			if (variable == null) return null;
@@ -1166,7 +1168,7 @@
 			return method.getReturnType();
 		} else if (node instanceof org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression) {
 			org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression referenceExpression = (org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression) node;
-			IMethodBinding method = getMethodBinding(referenceExpression.binding);
+			IMethodBinding method = getMethodBinding(referenceExpression.getMethodBinding());
 			if (method == null) return null;
 			return method.getReturnType();
 		}
@@ -1431,7 +1433,7 @@
 			return getMethodBinding(memberValuePair.binding);
 		} else if (node instanceof org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression) {
 			org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression referenceExpression = (org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression) node;
-			return getMethodBinding(referenceExpression.binding);
+			return getMethodBinding(referenceExpression.getMethodBinding());
 		}
 		return null;
 	}
@@ -1603,7 +1605,11 @@
 					}
 					ArrayType arrayType = (ArrayType) type;
 					ArrayBinding arrayBinding = (ArrayBinding) typeBinding;
-					return getTypeBinding(this.scope.createArrayType(arrayBinding.leafComponentType, arrayType.getDimensions()));
+					int dimensions = arrayType.getDimensions();
+					boolean isVarargs = typeReference.isVarargs();
+					if (dimensions == arrayBinding.dimensions)
+						return getTypeBinding(arrayBinding); // reuse.
+					return getTypeBinding(this.scope.createArrayType(arrayBinding.leafComponentType, dimensions, getTypeAnnotations(dimensions, arrayBinding, isVarargs)));
 				}
 				if (typeBinding.isArrayType()) {
 					// 'typeBinding' can still be an array type because 'node' may be "larger" than 'type' (see comment of newAstToOldAst).
@@ -1629,10 +1635,12 @@
 					binding = typeBinding;
 				}
 			} else if (node instanceof TypeReference) {
-				if (type instanceof QualifiedType) {
+				if (type instanceof SimpleType && node instanceof QualifiedTypeReference) {
+					return resolveTypeBindingForName(((SimpleType)type).getName());
+				} else if (type instanceof QualifiedType) {
 					return resolveTypeBindingForName(((QualifiedType)type).getName());
-				} else if (type instanceof PackageQualifiedType){
-					return resolveTypeBindingForName(((PackageQualifiedType)type).getName());
+				} else if (type instanceof NameQualifiedType){
+					return resolveTypeBindingForName(((NameQualifiedType)type).getName());
 				}
 				TypeReference typeReference = (TypeReference) node;
 				binding = typeReference.resolvedType;
@@ -1650,7 +1658,11 @@
 						return null;
 					}
 					ArrayBinding arrayBinding = (ArrayBinding) binding;
-					return getTypeBinding(this.scope.createArrayType(arrayBinding.leafComponentType, arrayType.getDimensions()));
+					int dimensions = arrayType.getDimensions();
+					boolean isVarargs = node instanceof TypeReference && ((TypeReference) node).isVarargs();
+					if (dimensions == arrayBinding.dimensions)
+						return getTypeBinding(arrayBinding); // reuse
+					return getTypeBinding(this.scope.createArrayType(arrayBinding.leafComponentType, dimensions, getTypeAnnotations(dimensions, arrayBinding, isVarargs)));
 				} else if (binding.isArrayType()) {
 					// 'binding' can still be an array type because 'node' may be "larger" than 'type' (see comment of newAstToOldAst).
 					ArrayBinding arrayBinding = (ArrayBinding) binding;
@@ -1669,6 +1681,27 @@
 		return null;
 	}
 
+	private org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] getTypeAnnotations(int dimensions, ArrayBinding arrayBinding, boolean isVarargs) {
+		org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding [] oldies = arrayBinding.getTypeAnnotations();
+		org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] newbies = Binding.NO_ANNOTATIONS;
+		// Skip past extended dimensions encoded ahead of base dimensions. Dimension for variable argument array comes after the base dimensions.
+		int extendedDimensions = arrayBinding.dimensions - dimensions - (isVarargs ? 1 : 0);
+		int i, length;
+		for (i = 0, length = oldies == null ? 0 : oldies.length; i < length && extendedDimensions > 0 ; i++) {
+			if (oldies[i] == null)
+				extendedDimensions--;
+		}
+		int cells = 0;
+		for (int j = i; j < length && dimensions > 0 ; j++) {
+			if (oldies[j] == null)
+				dimensions--;
+			cells ++;
+		}
+		if (cells > 0)
+			System.arraycopy(oldies, i, newbies = new org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[cells], 0, cells);
+		return newbies;
+	}
+
 	/*
 	 * Method declared on BindingResolver.
 	 */
@@ -1888,41 +1921,43 @@
 			leafComponentType = typeBinding.getElementType();
 			actualDimensions += typeBinding.getDimensions();
 		}
- 		org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding leafTypeBinding = null;
- 		if (leafComponentType.isPrimitive()) {
- 	 		String name = leafComponentType.getBinaryName();
-			switch(name.charAt(0)) {
-				case 'I' :
-					leafTypeBinding = org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.INT;
-					break;
-				case 'B' :
-					leafTypeBinding = org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.BYTE;
-					break;
-				case 'Z' :
-					leafTypeBinding = org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.BOOLEAN;
-					break;
-				case 'C' :
-					leafTypeBinding = org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.CHAR;
-					break;
-				case 'J' :
-					leafTypeBinding = org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.LONG;
-					break;
-				case 'S' :
-					leafTypeBinding = org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.SHORT;
-					break;
-				case 'D' :
-					leafTypeBinding = org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.DOUBLE;
-					break;
-				case 'F' :
-					leafTypeBinding = org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.FLOAT;
-					break;
-				case 'V' :
-					throw new IllegalArgumentException();
+		if (!(leafComponentType instanceof TypeBinding)) return null;
+		org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding leafTypeBinding = 
+											((TypeBinding) leafComponentType).binding;
+		if (leafTypeBinding instanceof VoidTypeBinding) {
+			throw new IllegalArgumentException();
+		}
+		if (typeBinding.isArray()) {
+			return this.getTypeBinding(lookupEnvironment().createArrayType(
+											leafTypeBinding,
+											actualDimensions,
+											insertAnnotations((((TypeBinding) typeBinding).binding).getTypeAnnotations(), dimensions)));
+		} else {
+			return this.getTypeBinding(lookupEnvironment().createArrayType(
+											leafTypeBinding,
+											actualDimensions));
+		}
+	}
+	
+	private org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] insertAnnotations(
+							org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] annots, int dimensions) {
+		if (dimensions == 0 || annots == null || annots.length == 0) {
+			return annots;
+		}
+		int index = 0;
+		if (dimensions < 0) {
+			for (int i = 0; i < annots.length; i++) {
+				index++;
+				if (annots[i] == null) {
+					if(++dimensions == 0) break;
+				}
 			}
- 		} else {
- 			if (!(leafComponentType instanceof TypeBinding)) return null;
- 			leafTypeBinding = ((TypeBinding) leafComponentType).binding;
- 		}
-		return this.getTypeBinding(lookupEnvironment().createArrayType(leafTypeBinding, actualDimensions));
+			if (dimensions < 0) dimensions = 0; // Just means there were no annotations
+		}
+		org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] newAnnots = 
+				new org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[annots.length - index + dimensions];
+
+		System.arraycopy(annots, index, newAnnots, dimensions, annots.length - index);
+		return newAnnots;
 	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExtraDimension.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Dimension.java
similarity index 77%
rename from org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExtraDimension.java
rename to org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Dimension.java
index 71158dd..5605784 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExtraDimension.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Dimension.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -18,29 +14,32 @@
 import java.util.List;
 
 /**
- * The extra dimension node. An extra dimension, represented as <b>[]</b>, can have
- * type annotations. This node type is supported only in JLS8 or later.
+ * AST node for an array dimension (added in JLS8 API).
  * <p>
- * The extra dimension node is used to represent an extra dimension in the following node types:
- * {@link SingleVariableDeclaration}, {@link VariableDeclarationFragment}, {@link MethodDeclaration}.
- * It is not used for annotations on an {@link ArrayType}, since that type extends {@link AnnotatableType} now.
+ * A dimension, represented as <b>[]</b>, can have type annotations. The dimension node is used for:
  * </p>
+ * <ul>
+ * <li>the dimensions of an {@link ArrayType}</li>
+ * <li>extra dimension in the following node types:
+ * {@link SingleVariableDeclaration}, {@link VariableDeclarationFragment}, {@link MethodDeclaration}</li>
+ * </ul>
  * 
  * <pre>
- * ExtraDimension:
+ * Dimension:
  * 	{ Annotation } <b>[]</b>
  * </pre>
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
-public class ExtraDimension extends ASTNode {
+@SuppressWarnings({"rawtypes", "unchecked"})
+public class Dimension extends ASTNode {
 
 	/**
 	 * The "annotations" structural property of this node type (element type: {@link Annotation}).
 	 */
 	public static final ChildListPropertyDescriptor ANNOTATIONS_PROPERTY =
-		new ChildListPropertyDescriptor(ExtraDimension.class, "annotations", Annotation.class, NO_CYCLE_RISK); //$NON-NLS-1$
+		new ChildListPropertyDescriptor(Dimension.class, "annotations", Annotation.class, NO_CYCLE_RISK); //$NON-NLS-1$
 
 	/**
 	 * A list of property descriptors (element type:
@@ -51,7 +50,7 @@
 
 	static {
 		List propertyList = new ArrayList(2);
-		createPropertyList(ExtraDimension.class, propertyList);
+		createPropertyList(Dimension.class, propertyList);
 		addProperty(ANNOTATIONS_PROPERTY, propertyList);
 		PROPERTY_DESCRIPTORS_8_0 = reapPropertyList(propertyList);
 	}
@@ -76,8 +75,7 @@
 	private ASTNode.NodeList annotations = new ASTNode.NodeList(ANNOTATIONS_PROPERTY);
 
 	/**
-	 * Creates a new extra dimension node (Supported only in level
-	 * JLS8 or above).
+	 * Creates a new dimension node (supported only in level JLS8 or above).
 	 * <p>
 	 * N.B. This constructor is package-private.
 	 * </p>
@@ -86,7 +84,7 @@
 	 * @exception UnsupportedOperationException if this operation is used
 	 *            in a JLS2, JLS3 or JLS4 AST
 	 */
-	ExtraDimension(AST ast) {
+	Dimension(AST ast) {
 		super(ast);
 		unsupportedIn2_3_4();
 	}
@@ -113,14 +111,14 @@
 	 * Method declared on ASTNode.
 	 */
 	final int getNodeType0() {
-		return EXTRA_DIMENSION;
+		return DIMENSION;
 	}
 
 	/* (omit javadoc for this method)
 	 * Method declared on ASTNode.
 	 */
 	ASTNode clone0(AST target) {
-		ExtraDimension result = new ExtraDimension(target);
+		Dimension result = new Dimension(target);
 		result.annotations().addAll(
 				ASTNode.copySubtrees(target, annotations()));
 		return result;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DoStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DoStatement.java
index edd0ae6..5635df9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DoStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DoStatement.java
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class DoStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DocCommentParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DocCommentParser.java
index 849cdc8..509b743 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DocCommentParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/DocCommentParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2012 IBM Corporation and others.
+ * Copyright (c) 2004, 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 @@
  *
  * @since 3.0
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 class DocCommentParser extends AbstractCommentParser {
 
 	private Javadoc docComment;
@@ -118,22 +119,34 @@
 			Type argType = null;
 			if (node.getNodeType() == ASTNode.PRIMITIVE_TYPE) {
 				argType = (PrimitiveType) node;
-//				if (dim > 0) {
-//					argType = this.ast.newArrayType(argType, dim);
-//					argType.setSourceRange(argStart, ((int) dimPositions[dim-1])-argStart+1);
-//				}
 			} else {
 				Name argTypeName = (Name) node;
 				argType = this.ast.newSimpleType(argTypeName);
 				argType.setSourceRange(argStart, node.getLength());
 			}
 			if (dim > 0 && !isVarargs) {
-				for (int i=0; i<dim; i++) {
-					argType = this.ast.newArrayType(argType);
-					argType.setSourceRange(argStart, ((int) dimPositions[i])-argStart+1);
+				if (this.ast.apiLevel <= AST.JLS4_INTERNAL) {
+					for (int i=0; i<dim; i++) {
+						argType = this.ast.newArrayType(argType);
+						argType.setSourceRange(argStart, ((int) dimPositions[i])-argStart+1);
+					}
+				} else {
+					ArrayType argArrayType = this.ast.newArrayType(argType, 0);
+					argType = argArrayType;
+					argType.setSourceRange(argStart, ((int) dimPositions[dim-1])-argStart+1);
+					for (int i=0; i<dim; i++) {
+						Dimension dimension = this.ast.newDimension();
+						int dimStart = (int) (dimPositions[i] >>> 32);
+						int dimEnd = (int) dimPositions[i];
+						dimension.setSourceRange(dimStart, dimEnd-dimStart+1);
+						argArrayType.dimensions().add(dimension);
+					}
 				}
 			}
 			argument.setType(argType);
+			if (this.ast.apiLevel > AST.JLS8) {
+				argument.setVarargs(isVarargs);
+			}
 			argument.setSourceRange(argStart, argEnd - argStart + 1);
 			return argument;
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EmptyStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EmptyStatement.java
index 7d85587..b159add 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EmptyStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EmptyStatement.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class EmptyStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnhancedForStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnhancedForStatement.java
index 2c1053b..3eed817 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnhancedForStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnhancedForStatement.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
@@ -29,6 +29,7 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class EnhancedForStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java
index 279fcd4..3c80247 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnumConstantDeclaration.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
@@ -39,6 +39,7 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class EnumConstantDeclaration extends BodyDeclaration {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnumDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnumDeclaration.java
index 18e0a49..876c179 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnumDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/EnumDeclaration.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
@@ -41,6 +41,7 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class EnumDeclaration extends AbstractTypeDeclaration {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Expression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Expression.java
index 3f38ed9..e2a399f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Expression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Expression.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExpressionMethodReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExpressionMethodReference.java
index 84f92b4..3f124af 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExpressionMethodReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExpressionMethodReference.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,9 +22,10 @@
  *         Identifier
  * </pre>
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ExpressionMethodReference extends MethodReference {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExpressionStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExpressionStatement.java
index a8875b3..a0d8916 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExpressionStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ExpressionStatement.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
@@ -28,6 +28,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class ExpressionStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/FieldAccess.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/FieldAccess.java
index 2901ad6..44417c2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/FieldAccess.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/FieldAccess.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
@@ -55,6 +55,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class FieldAccess extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/FieldDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/FieldDeclaration.java
index 4d0565d..3f5130a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/FieldDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/FieldDeclaration.java
@@ -36,6 +36,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class FieldDeclaration extends BodyDeclaration {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ForStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ForStatement.java
index c08374c..35bacb7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ForStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ForStatement.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
@@ -41,6 +41,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ForStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IBinding.java
index fccac89..fe0ee8b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,9 +17,9 @@
 /**
  * A binding represents a named entity in the Java language. The world of
  * bindings provides an integrated picture of the structure of the program as
- * seen from the compiler's point of view. This interface declare protocol
+ * seen from the compiler's point of view. This interface declares protocols
  * common to the various different kinds of named entities in the Java language:
- * packages, types, fields, methods, constructors, and local variables.
+ * packages, types, fields, methods, constructors, local variables, and annotations.
  *
  * @see IPackageBinding
  * @see ITypeBinding
@@ -89,7 +89,7 @@
 	public static final int MEMBER_VALUE_PAIR = 6;
 
 	/**
-	 * Return the resolved annotations associated with this binding.
+	 * Returns the resolved declaration annotations associated with this binding.
 	 * <ul>
 	 * <li>Package bindings - these are annotations on a package declaration.
 	 * </li>
@@ -104,9 +104,14 @@
 	 * <li>Annotation bindings - an empty array is always returned</li>
 	 * <li>Member value pair bindings - an empty array is always returned</li>
 	 * </ul>
+	 * <p>
+	 * <b>Note:</b> This method only returns declaration annotations.
+	 * <em>Type annotations</em> in the sense of JLS8 9.7.4 are <em>not</em> returned.
+	 * Type annotations can be retrieved via {@link ITypeBinding#getTypeAnnotations()}. 
+	 * </p>
 	 *
-	 * @return the list of resolved annotations, or the empty list if there are no
-	 * annotations associated with the object
+	 * @return the list of resolved declaration annotations, or the empty list if there are no
+	 *    declaration annotations associated with the entity represented by this binding
 	 * @since 3.2
 	 */
 	public IAnnotationBinding[] getAnnotations();
@@ -140,7 +145,7 @@
 	/**
 	 * Returns the modifiers for this binding.
 	 * <p>
-	 * Note that deprecated is not included among the modifiers.
+	 * Note that 'deprecated' is not included among the modifiers.
 	 * Use <code>isDeprecated</code> to find out whether a binding is deprecated.
 	 * </p>
 	 *
@@ -208,6 +213,7 @@
 	 * <li>the default constructor of a source class</li>
 	 * <li>the constructor of an anonymous class</li>
 	 * <li>member value pairs</li>
+	 * <li>synthetic bindings</li>
 	 * </ul>
 	 * For all other kind of type, method, variable, annotation and package bindings,
 	 * this method returns non-<code>null</code>.
@@ -222,11 +228,11 @@
 	/**
 	 * Returns the key for this binding.
 	 * <p>
-	 * Within a connected cluster of bindings (for example, all bindings
-	 * reachable from a given AST), each binding will have a distinct keys.
+	 * Within a single cluster of bindings (produced by the same call to an
+	 * {@code ASTParser#create*(*)} method)), each binding has a distinct key.
 	 * The keys are generated in a manner that is predictable and as
 	 * stable as possible. This last property makes these keys useful for
-	 * comparing bindings between disconnected clusters of bindings (for example,
+	 * comparing bindings between different clusters of bindings (for example,
 	 * the bindings between the "before" and "after" ASTs of the same
 	 * compilation unit).
 	 * </p>
@@ -251,7 +257,7 @@
 	 *   declaring block relative to its parent, the key of its method</li>
 	 * <li>local types - the name of the type, the index of the declaring
 	 *   block relative to its parent, the key of its method</li>
-	 * <li>anonymous types - the occurence count of the anonymous
+	 * <li>anonymous types - the occurrence count of the anonymous
 	 *   type relative to its declaring type, the key of its declaring type</li>
 	 * <li>enum types - treated like classes</li>
 	 * <li>annotation types - treated like interfaces</li>
@@ -275,8 +281,13 @@
 	 * the annotation type</li>
 	 * </ul>
 	 * </p>
+	 * <p>
+	 * The key for a type binding does <em>not</em> contain {@link ITypeBinding#getTypeAnnotations() type annotations},
+	 * so type bindings with different type annotations may have the same key (iff they denote the same un-annotated type).
+	 * By construction, this also applies to method bindings if their declaring types contain type annotations.
+	 * </p>
 	 * <p>Note that the key for member value pair bindings is
-	 * not yet implemented. This returns <code>null</code> for this kind of bindings.<br>
+	 * not yet implemented. This method returns <code>null</code> for that kind of bindings.<br>
 	 * Recovered bindings have a unique key.
 	 * </p>
 	 *
@@ -287,23 +298,40 @@
 	/**
 	 * There is no special definition of equality for bindings; equality is
 	 * simply object identity.  Within the context of a single cluster of
-	 * bindings, each binding is represented by a distinct object. However,
+	 * bindings (produced by the same call to an {@code ASTParser#create*(*)} method),
+	 * each binding is represented by a separate object. However,
 	 * between different clusters of bindings, the binding objects may or may
 	 * not be different; in these cases, the client should compare bindings
-	 * using {@link #isEqualTo(IBinding)}, which checks their keys.
+	 * using {@link #isEqualTo(IBinding)}, which is functionally equivalent to
+	 * checking their keys for equality.
+	 * <p>
+	 * Since JLS8, type bindings can contain {@link ITypeBinding#getTypeAnnotations() type annotations}.
+	 * Note that type bindings that denote the same un-annotated type have the same {@link #getKey() key},
+	 * but they are not identical if they contain different type annotations.
+	 * Type bindings that contain the same type annotations may or may not be identical.
+	 * </p>
 	 *
 	 * @param obj {@inheritDoc}
 	 * @return {@inheritDoc}
+	 * @see ITypeBinding#getTypeDeclaration()
 	 */
 	public boolean equals(Object obj);
 
 	/**
 	 * Returns whether this binding has the same key as that of the given
-	 * binding. Within the context of a single cluster of bindings, each
+	 * binding. Within the context of a single cluster of bindings
+	 * (produced by the same call to an {@code ASTParser#create*(*)} method), each
 	 * binding is represented by a distinct object. However, between
 	 * different clusters of bindings, the binding objects may or may
 	 * not be different objects; in these cases, the binding keys
 	 * are used where available.
+	 * 
+	 * <p>
+	 * Note that type bindings that only differ in their {@link ITypeBinding#getTypeAnnotations() type annotations}
+	 * have the same {@link IBinding#getKey() key}, and hence this method returns
+	 * <code>true</code> for such type bindings. By construction of the key, this also applies
+	 * to method bindings if their declaring types contain type annotations.
+	 * </p>
 	 *
 	 * @param binding the other binding, or <code>null</code>
 	 * @return <code>true</code> if the given binding is the identical
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IMethodBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IMethodBinding.java
index 4caabb0..5488e68 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IMethodBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IMethodBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -109,12 +109,18 @@
 	public Object getDefaultValue();
 
 	/**
-	 * Returns the resolved annotations of a parameter of this method.
+	 * Returns the resolved declaration annotations of a parameter of this method.
 	 * The result returned is the same regardless of whether
 	 * this is a parameterized method.
+	 * <p>
+	 * <b>Note:</b> This method only returns declaration annotations.
+	 * <em>Type annotations</em> in the sense of JLS8 9.7.4 are <em>not</em> returned.
+	 * Type annotations can be retrieved from a parameter type 
+	 * via {@link ITypeBinding#getTypeAnnotations()}. 
+	 * </p>
 	 *
 	 * @param paramIndex the index of the parameter of interest
-	 * @return the resolved annotations of the <code>paramIndex</code>th parameter,
+	 * @return the resolved declaration annotations of the <code>paramIndex</code>th parameter,
 	 * or an empty list if there are none
 	 * @throws ArrayIndexOutOfBoundsException if <code>paramIndex</code> is
 	 * not a valid index
@@ -137,7 +143,7 @@
 	 * </p>
 	 * <p>
 	 * Note: The result does not include synthetic parameters introduced by
-	 * inner class emulation.
+	 * inner class emulation. Explicit receiver parameters are also not included.
 	 * </p>
 	 *
 	 * @return a (possibly empty) list of type bindings for the formal
@@ -146,8 +152,26 @@
 	public ITypeBinding[] getParameterTypes();
 
 	/**
+	 * Returns the type of this method's receiver or <code>null</code> 
+	 * if there is no receiver declared explicitly.
+	 * 
+	 * @return the type of this method's receiver or <code>null</code> 
+	 * if there is no receiver declared explicitly.
+	 * 
+	 * @since 3.10
+	 */
+	public ITypeBinding getDeclaredReceiverType();
+	
+	/**
 	 * Returns the binding for the return type of this method. Returns the
 	 * special primitive <code>void</code> return type for constructors.
+	 * <p>
+	 * For methods, the type binding that is returned contains type annotations 
+	 * if any. For e.g. the following code would get the type annotations on a 
+	 * method: <br><br>
+	 *  <code> IAnnotationBinding[] annots = getReturnType().getTypeAnnotations() </code>
+	 * </p>
+	 * For a constructor, the returned binding does not include type annotations.
 	 *
 	 * @return the binding for the return type of this method, or the
 	 *    <code>void</code> return type for constructors
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ITypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ITypeBinding.java
index 4a57570e..cda59da 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ITypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ITypeBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -86,6 +86,7 @@
 	 * @return the bound of this wildcard type, or <code>null</code> if none
 	 * @see #isWildcardType()
 	 * @see #isUpperbound()
+	 * @see #getTypeBounds()
 	 * @since 3.1
 	 */
 	public ITypeBinding getBound();
@@ -114,11 +115,12 @@
 	/**
 	 * Returns the binding representing the component type of this array type,
 	 * or <code>null</code> if this is not an array type binding. The component
-	 * type of an array might be an array type.
-	 * <p>This is subject to change before 3.2 release.</p>
+	 * type of an array might be an array type (with one dimension less than
+	 * this array type).
 	 *
 	 * @return the component type binding, or <code>null</code> if this is
 	 *   not an array type
+	 * @see #getElementType()
 	 * @since 3.2
 	 */
 	public ITypeBinding getComponentType();
@@ -173,6 +175,10 @@
 	 * @return the bit-wise or of <code>Modifier</code> constants
 	 * @see #getModifiers()
 	 * @see Modifier
+	 * @deprecated  Use {@link #getModifiers()} instead.
+	 * This method was never implemented properly and historically has simply
+	 * delegated to the method <code>getModifiers</code>. Clients should call
+	 * <code>getModifiers</code> method directly.
 	 */
 	public int getDeclaredModifiers();
 
@@ -256,7 +262,7 @@
 	/**
 	 * Returns the binding representing the element type of this array type,
 	 * or <code>null</code> if this is not an array type binding. The element
-	 * type of an array is never itself an array type.
+	 * type of an array type is never itself an array type.
 	 *
 	 * @return the element type binding, or <code>null</code> if this is
 	 *   not an array type
@@ -290,6 +296,23 @@
 	 * @since 3.1
 	 */
 	public ITypeBinding getErasure();
+	
+	/**
+	 * Returns the single abstract method that constitutes the single function 
+	 * contract (aside from any redeclarations of methods of <code>java.lang.Object</code>) 
+	 * of the receiver interface type or <code>null</code> if there is no such contract or if the receiver 
+	 * is not an interface.
+	 * <p>
+	 * The returned method binding may be synthetic and its {@link #getDeclaringClass() declaring type}
+	 * may be a super interface type of this type binding.
+	 * </p>
+	 * 
+	 * @return the single abstract method that represents the single function contract, or
+	 * <code>null</code> if the receiver is not a functional interface type
+	 *
+	 * @since 3.10
+	 */
+	public IMethodBinding getFunctionalInterfaceMethod();
 
 	/**
 	 * Returns a list of type bindings representing the direct superinterfaces
@@ -328,15 +351,13 @@
 	 * or annotation type binding.
 	 * The result may not correspond to the modifiers as declared in the
 	 * original source, since the compiler may change them (in particular,
-	 * for inner class emulation). The <code>getDeclaredModifiers</code> method
-	 * should be used if the original modifiers are needed.
+	 * for inner class emulation).
 	 * Returns 0 if this type does not represent a class, an interface, an enum, an annotation
 	 * type or a recovered type.
 	 *
 	 * @return the compiled modifiers for this type binding or 0
 	 * if this type does not represent a class, an interface, an enum, an annotation
 	 * type or a recovered type.
-	 * @see #getDeclaredModifiers()
 	 */
 	public int getModifiers();
 
@@ -494,6 +515,27 @@
 	public ITypeBinding getSuperclass();
 
 	/**
+	 * Returns the type annotations that this type reference is annotated with. Since JLS8, 
+	 * multiple instances of type bindings may be created if they are annotated with 
+	 * different type use annotations.
+	 * <p>
+	 * For example, the following three type references would produce three distinct type 
+	 * bindings for java.lang.String that share the same key:
+	 * <ul>
+	 * <li>java.lang.@Marker1 String</li>
+	 * <li>java.lang.@Marker2 String</li>
+	 * <li>java.lang.String</li>
+	 * </ul>
+	 * </p>
+	 * @return type annotations specified on this type reference, or an empty array if
+	 * no type use annotations are found.
+	 * @see #getTypeDeclaration()
+	 * @see #getKey()
+	 * @since 3.10
+	 */
+	public IAnnotationBinding[] getTypeAnnotations();
+
+	/**
 	 * Returns the type arguments of this generic type instance, or the
 	 * empty list for other type bindings.
 	 * <p>
@@ -516,8 +558,8 @@
 	public ITypeBinding[] getTypeArguments();
 
 	/**
-	 * Returns the declared type bounds of this type variable or capture. If the
-	 * variable or the capture had no explicit bound, then it returns an empty list.
+	 * Returns the upper type bounds of this type variable, wildcard, or capture. If the
+	 * variable, wildcard, or capture had no explicit bound, then it returns an empty list.
      * <p>
      * Note that per construction, it can only contain one class or array type,
      * at most, and then it is located in first position.
@@ -527,10 +569,11 @@
      * binding, e.g. <code>capture-of ? extends Object[]</code>
      * </p>
 	 *
-	 * @return the list of type bindings for this type variable or capture,
+	 * @return the list of upper bounds for this type variable, wildcard, or capture,
      * or otherwise the empty list
+     * @see #isTypeVariable()
+     * @see #isWildcardType()
 	 * @see #isCapture()
-	 * @see #isTypeVariable()
 	 * @since 3.1
 	 */
 	public ITypeBinding[] getTypeBounds();
@@ -540,16 +583,20 @@
 	 * binding.
 	 * <p>For parameterized types ({@link #isParameterizedType()})
 	 * and most raw types ({@link #isRawType()}), this method returns the binding
-	 * for the corresponding generic type.</p>
+	 * for the corresponding generic type ({@link #isGenericType()}.</p>
 	 * <p>For raw member types ({@link #isRawType()}, {@link #isMember()})
 	 * of a raw declaring class, the type declaration is a generic or a non-generic
 	 * type.</p>
 	 * <p>A different non-generic binding will be returned when one of the declaring
 	 * types/methods was parameterized.</p>
-	 * <p>For other type bindings, this returns the same binding.</p>
+	 * <p>For other type bindings, this method returns the binding for the type declaration
+	 * corresponding to this type binding. In particular, for type bindings that
+	 * contain a {@link #getTypeAnnotations() type annotation}, this method returns the binding for the type
+	 * declaration, which does not contain the type annotations from the use site.</p>
 	 *
-	 * @return the type binding
+	 * @return the declaration type binding
 	 * @since 3.1
+	 * @see #isEqualTo(IBinding)
 	 */
 	public ITypeBinding getTypeDeclaration();
 
@@ -568,7 +615,6 @@
 	 * @see #isTypeVariable()
 	 * @since 3.1
 	 */
-	// TODO (jeem) - clarify whether binding for a generic type instance carries a copy of the generic type's type parameters as well as type arguments
 	public ITypeBinding[] getTypeParameters();
 
 	/**
@@ -939,10 +985,10 @@
 	 * Returns whether this type binding represents a wildcard type. A wildcard
 	 * type occurs only as an argument to a parameterized type reference.
 	 * <p>
-	 * For example, a AST type like
-	 * <code>Collection&lt;? extends Object&gt;</code> typically resolves to a
+	 * For example, an AST type like
+	 * <code>Collection&lt;? extends Number&gt;</code> typically resolves to a
 	 * parameterized type binding whose type argument is a wildcard type
-	 * with upper type bound <code>java.util.Object</code>.
+	 * with upper type bound <code>java.lang.Number</code>.
 	 * </p>
 	 *
 	 * @return <code>true</code> if this object represents a wildcard type,
@@ -952,4 +998,5 @@
 	 * @see #isUpperbound()
 	 */
 	public boolean isWildcardType();
+	
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IVariableBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IVariableBinding.java
index 130c1d3..7eec980 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IVariableBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IVariableBinding.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
@@ -158,4 +158,14 @@
 	 */
 	public IVariableBinding getVariableDeclaration();
 
+	/**
+	 * Returns whether this binding corresponds to an effectively final local
+	 * variable (JLS8 4.12.4). A variable is said to be effectively final if
+	 * it is not final and never assigned to after its initialization.
+	 *
+	 * @return <code>true</code> if this is an effectively final local variable
+	 * 				and <code>false</code> otherwise
+	 * @since 3.10
+	 */
+	public boolean isEffectivelyFinal();
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IfStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IfStatement.java
index 3dab071..6b7b734 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IfStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IfStatement.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
@@ -24,6 +24,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class IfStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ImportDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ImportDeclaration.java
index 569f99b..45dcb59 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ImportDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ImportDeclaration.java
@@ -24,6 +24,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class ImportDeclaration extends ASTNode {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression.java
index 3907727..e65a716 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InfixExpression.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
@@ -26,6 +26,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class InfixExpression extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Initializer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Initializer.java
index bcabe74..0eaf604 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Initializer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Initializer.java
@@ -24,6 +24,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes"})
 public class Initializer extends BodyDeclaration {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InstanceofExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InstanceofExpression.java
index 6a5491b..6f2cbe5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InstanceofExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InstanceofExpression.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
@@ -24,6 +24,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class InstanceofExpression extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite.java
index 9f60122..81c328c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/InternalASTRewrite.java
@@ -37,6 +37,7 @@
  * Internal class: not intended to be used by client.
  * When AST modifications recording is enabled, all changes are recorded by this class.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 class InternalASTRewrite extends NodeEventHandler {
 
 	/** root node for the rewrite: Only nodes under this root are accepted */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IntersectionType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IntersectionType.java
index 98b2f02..0ee2dc5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IntersectionType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/IntersectionType.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,9 +24,10 @@
  * This kind of node is used only inside a cast expression.
  * </p>
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class IntersectionType extends Type {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Javadoc.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Javadoc.java
index 8864985..4a91f67 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Javadoc.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Javadoc.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
@@ -28,6 +28,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class Javadoc extends Comment {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LabeledStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LabeledStatement.java
index 018b833..9cd7b8f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LabeledStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LabeledStatement.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class LabeledStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LambdaExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LambdaExpression.java
index 98e71e6..97ab36c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LambdaExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LambdaExpression.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -31,9 +27,10 @@
  * while the third form uses {@link SingleVariableDeclaration}.</p>
  *<p>The Body can be either a {@link Block} or an {@link Expression}.</p>
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  * @noinstantiate This class is not intended to be instantiated by clients 
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class LambdaExpression extends Expression {
 
 	/**
@@ -233,14 +230,14 @@
 	}
 
 	/**
-	 * Sets whether this lambda expression should have parentheses around its parameters or not.
+	 * Sets whether this lambda expression has parentheses around its parameters or not.
 	 * <p>
 	 * Note that parentheses are required unless {@link #parameters()} contains
 	 * just a single {@link VariableDeclarationFragment}.
 	 * ASTRewrite may ignore this property if necessary.
 	 * </p>
 	 *
-	 * @param hasParentheses <code>true</code> if this lambda expression should have parentheses around its parameters
+	 * @param hasParentheses <code>true</code> if this lambda expression has parentheses around its parameters
 	 *  and <code>false</code> otherwise
 	 */
 	public void setParentheses(boolean hasParentheses) {
@@ -251,12 +248,14 @@
 
 	/**
 	 * Returns the live ordered list of formal parameters of this lambda expression.
-	 * <p>
-	 * Note that all elements must be of the same type, either all {@link SingleVariableDeclaration} or all {@link VariableDeclarationFragment}.
-	 * </p>
+	 * Note that all elements must be of the same type, either
+	 * <ul>
+	 * <li>all {@link SingleVariableDeclaration} (explicit type), or</li>
+	 * <li>all {@link VariableDeclarationFragment} (inferred type).</li>
+	 * </ul>
 	 *
 	 * @return the live list of formal parameters of this lambda expression
-	 *    (element type: {@link VariableDeclaration} 
+	 *    (element type: {@link VariableDeclaration})
 	 */
 	public List parameters() {
 		return this.parameters;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LineComment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LineComment.java
index 92563b2..7f00cb7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LineComment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/LineComment.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -30,6 +30,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public final class LineComment extends Comment {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MarkerAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MarkerAnnotation.java
index d1275bc..3c61490 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MarkerAnnotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MarkerAnnotation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public final class MarkerAnnotation extends Annotation {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MemberRef.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MemberRef.java
index 4b86c62..cab5c9a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MemberRef.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MemberRef.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -28,6 +28,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class MemberRef extends ASTNode implements IDocElement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePair.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePair.java
index 1a664d3..e9e33a3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePair.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MemberValuePair.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -29,6 +29,7 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class MemberValuePair extends ASTNode {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodBinding.java
index 39a615a..e64eabc 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
@@ -31,7 +32,7 @@
 
 	private static final int VALID_MODIFIERS = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
 		Modifier.ABSTRACT | Modifier.STATIC | Modifier.FINAL | Modifier.SYNCHRONIZED | Modifier.NATIVE |
-		Modifier.STRICTFP;
+		Modifier.STRICTFP | Modifier.DEFAULT;
 	private static final ITypeBinding[] NO_TYPE_BINDINGS = new ITypeBinding[0];
 	private org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding binding;
 	private BindingResolver resolver;
@@ -100,27 +101,7 @@
 			return this.annotations;
 		}
 		org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] internalAnnotations = this.binding.getAnnotations();
-		int length = internalAnnotations == null ? 0 : internalAnnotations.length;
-		if (length != 0) {
-			IAnnotationBinding[] tempAnnotations = new IAnnotationBinding[length];
-			int convertedAnnotationCount = 0;
-			for (int i = 0; i < length; i++) {
-				org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding internalAnnotation = internalAnnotations[i];
-				final IAnnotationBinding annotationInstance = this.resolver.getAnnotationInstance(internalAnnotation);
-				if (annotationInstance == null) {
-					continue;
-				}
-				tempAnnotations[convertedAnnotationCount++] = annotationInstance;
-			}
-			if (convertedAnnotationCount != length) {
-				if (convertedAnnotationCount == 0) {
-					return this.annotations = AnnotationBinding.NoAnnotations;
-				}
-				System.arraycopy(tempAnnotations, 0, (tempAnnotations = new IAnnotationBinding[convertedAnnotationCount]), 0, convertedAnnotationCount);
-			}
-			return this.annotations = tempAnnotations;
-		}
-		return this.annotations = AnnotationBinding.NoAnnotations;
+		return this.annotations = filterTypeAnnotations(internalAnnotations);
 	}
 
 	/**
@@ -198,6 +179,12 @@
 	}
 
 	/**
+	 * @see IMethodBinding#getDeclaredReceiverType()
+	 */
+	public ITypeBinding getDeclaredReceiverType() {
+		return this.resolver.getTypeBinding(this.binding.receiver);
+	}
+	/**
 	 * @see IMethodBinding#getReturnType()
 	 */
 	public ITypeBinding getReturnType() {
@@ -207,6 +194,35 @@
 		return this.returnType;
 	}
 
+	protected IAnnotationBinding[] filterTypeAnnotations(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] internalAnnotations) {
+		int length = internalAnnotations == null ? 0 : internalAnnotations.length;
+		if (length != 0) {
+			IAnnotationBinding[] tempAnnotations = new IAnnotationBinding[length];
+			int convertedAnnotationCount = 0;
+			final boolean isConstructor = this.isConstructor();
+			for (int i = 0; i < length; i++) {
+				org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding internalAnnotation = internalAnnotations[i];
+				final ReferenceBinding annotationType = internalAnnotation.getAnnotationType();
+				long metaTagBits = annotationType.getAnnotationTagBits();
+
+				if (isConstructor && (metaTagBits & TagBits.AnnotationForConstructor) == 0)
+					continue; // must be type use.
+				
+				final IAnnotationBinding annotationInstance = this.resolver.getAnnotationInstance(internalAnnotation);
+				if (annotationInstance == null) {
+					continue;
+				}
+				tempAnnotations[convertedAnnotationCount++] = annotationInstance;
+			}
+			if (convertedAnnotationCount == length) return tempAnnotations;
+			if (convertedAnnotationCount == 0) return AnnotationBinding.NoAnnotations;
+			
+			System.arraycopy(tempAnnotations, 0, (tempAnnotations = new IAnnotationBinding[convertedAnnotationCount]), 0, convertedAnnotationCount);
+			return tempAnnotations;
+		}
+		return AnnotationBinding.NoAnnotations;
+	}
+
 	public Object getDefaultValue() {
 		if (isAnnotationMember())
 			return MemberValuePairBinding.buildDOMValue(this.binding.getDefaultValue(), this.resolver);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodDeclaration.java
index 4a452a5..2e00b8c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodDeclaration.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,19 +23,19 @@
  *    [ Javadoc ] { ExtendedModifier } [ <b>&lt;</b> TypeParameter { <b>,</b> TypeParameter } <b>&gt;</b> ] ( Type | <b>void</b> )
  *        Identifier <b>(</b>
  *            [ ReceiverParameter <b>,</b> ] [ FormalParameter { <b>,</b> FormalParameter } ]
- *        <b>)</b> { ExtraDimension }
+ *        <b>)</b> { Dimension }
  *        [ <b>throws</b> Type { <b>,</b> Type } ]
  *        ( Block | <b>;</b> )
  * ConstructorDeclaration:
  *    [ Javadoc ] { ExtendedModifier } [ <b>&lt;</b> TypeParameter { <b>,</b> TypeParameter } <b>&gt;</b> ]
  *        Identifier <b>(</b>
  *            [ ReceiverParameter <b>,</b> ] [ FormalParameter { <b>,</b> FormalParameter } ]
- *        <b>)</b> { ExtraDimension }
+ *        <b>)</b> { Dimension }
  *        [ <b>throws</b> Type { <b>,</b> Type } ]
  *        ( Block | <b>;</b> )
  * </pre>
  * <p>
- * The ReceiverParameter is represented as: <code>AnnotatableType [ SimpleName <b>.</b> ] <b>this</b></code><br>
+ * The ReceiverParameter is represented as: <code>Type [ SimpleName <b>.</b> ] <b>this</b></code><br>
  * The FormalParameter is represented by a {@link SingleVariableDeclaration}.
  * </p>
  * <p>
@@ -57,6 +53,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class MethodDeclaration extends BodyDeclaration {
 
 	/**
@@ -120,11 +117,11 @@
 		new SimplePropertyDescriptor(MethodDeclaration.class, "extraDimensions", int.class, MANDATORY); //$NON-NLS-1$
 	
 	/**
-	 * The "extraDimensions2" structural property of this node type (element type: {@link ExtraDimension}) (added in JLS8 API).
-	 * @since 3.9 BETA_JAVA8
+	 * The "extraDimensions2" structural property of this node type (element type: {@link Dimension}) (added in JLS8 API).
+	 * @since 3.10
 	 */
 	public static final ChildListPropertyDescriptor EXTRA_DIMENSIONS2_PROPERTY =
-			new ChildListPropertyDescriptor(MethodDeclaration.class, "extraDimensions2", ExtraDimension.class, NO_CYCLE_RISK); //$NON-NLS-1$
+			new ChildListPropertyDescriptor(MethodDeclaration.class, "extraDimensions2", Dimension.class, NO_CYCLE_RISK); //$NON-NLS-1$
 
 	/**
 	 * The "typeParameters" structural property of this node type (element type: {@link TypeParameter}) (added in JLS3 API).
@@ -141,15 +138,15 @@
 		new ChildListPropertyDescriptor(MethodDeclaration.class, "parameters", SingleVariableDeclaration.class, CYCLE_RISK); //$NON-NLS-1$
 
 	/**
-	 * The "receiverType" structural property of this node type (child type: {@link AnnotatableType}) (added in JLS8 API).
-	 * @since 3.9 BETA_JAVA8
+	 * The "receiverType" structural property of this node type (child type: {@link Type}) (added in JLS8 API).
+	 * @since 3.10
 	 */
 	public static final ChildPropertyDescriptor RECEIVER_TYPE_PROPERTY =
-			new ChildPropertyDescriptor(MethodDeclaration.class, "receiverType", AnnotatableType.class, OPTIONAL, NO_CYCLE_RISK); //$NON-NLS-1$
+			new ChildPropertyDescriptor(MethodDeclaration.class, "receiverType", Type.class, OPTIONAL, NO_CYCLE_RISK); //$NON-NLS-1$
 	
 	/**
 	 * The "receiverQualifier" structural property of this node type (child type: {@link SimpleName}) (added in JLS8 API).
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final ChildPropertyDescriptor RECEIVER_QUALIFIER_PROPERTY =
 			new ChildPropertyDescriptor(MethodDeclaration.class, "receiverQualifier", SimpleName.class, OPTIONAL, NO_CYCLE_RISK); //$NON-NLS-1$
@@ -164,7 +161,7 @@
 
 	/**
 	 * The "thrownExceptionTypes" structural property of this node type (element type: {@link Type}) (added in JLS8 API).
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final ChildListPropertyDescriptor THROWN_EXCEPTION_TYPES_PROPERTY =
 		new ChildListPropertyDescriptor(MethodDeclaration.class, "thrownExceptionTypes", Type.class, NO_CYCLE_RISK); //$NON-NLS-1$
@@ -196,7 +193,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static final List PROPERTY_DESCRIPTORS_8_0;
 
@@ -279,14 +276,14 @@
 	/**
 	 * The explicit receiver type, or <code>null</code> if none.
 	 * Defaults to none.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
-	private AnnotatableType optionalReceiverType = null;
+	private Type optionalReceiverType = null;
 	
 	/**
 	 * Qualifying name of the explicit </code>this</code> parameter, or <code>null</code> if none.
 	 * Defaults to none.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private SimpleName optionalReceiverQualifier = null;
 
@@ -294,6 +291,7 @@
 	 * The parameter declarations
 	 * (element type: {@link SingleVariableDeclaration}).
 	 * Defaults to an empty list.
+	 * @since 3.10 // Added because of @since check due to raising visibility
 	 */
 	// AspectJ extension - made protected instead of private
 	protected ASTNode.NodeList parameters =
@@ -332,11 +330,11 @@
 
 	/**
 	 * List of extra dimensions this node has with optional annotations
-	 * (element type: {@link ExtraDimension}).
+	 * (element type: {@link Dimension}).
 	 * Null before JLS8. Added in JLS8; defaults to an empty list
 	 * (see constructor).
 	 * 
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private ASTNode.NodeList extraDimensions = null;
 
@@ -353,7 +351,7 @@
 	 * Null before JLS8. Added in JLS8; defaults to an empty list
 	 * (see constructor).
 	 * 
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private ASTNode.NodeList thrownExceptionTypes = null;
 
@@ -479,7 +477,7 @@
 			if (get) {
 				return getReceiverType();
 			} else {
-				setReceiverType((AnnotatableType) child);
+				setReceiverType((Type) child);
 				return null;
 			}
 		}
@@ -580,7 +578,7 @@
 		result.setConstructor(isConstructor());
 		result.setName((SimpleName) getName().clone(target));
 		if (this.ast.apiLevel >= AST.JLS8) {
-			result.setReceiverType((AnnotatableType) ASTNode.copySubtree(target, getReceiverType()));
+			result.setReceiverType((Type) ASTNode.copySubtree(target, getReceiverType()));
 			result.setReceiverQualifier((SimpleName) ASTNode.copySubtree(target, getReceiverQualifier()));
 		}
 		result.parameters().addAll(
@@ -733,9 +731,9 @@
 	 *
 	 * @return the receiver type or <code>null</code> if receiver is not declared explicitly
 	 * @exception UnsupportedOperationException if this operation is used below JLS8
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
-	public AnnotatableType getReceiverType() {
+	public Type getReceiverType() {
 		unsupportedIn2_3_4();
 		return this.optionalReceiverType;
 	}
@@ -748,9 +746,9 @@
 	 * 
 	 * @param receiverType type of the explicit receiver parameter, or <code>null</code> if there is none
 	 * @exception UnsupportedOperationException if this operation is used below JLS8
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
-	public void setReceiverType(AnnotatableType receiverType) {
+	public void setReceiverType(Type receiverType) {
 		unsupportedIn2_3_4();
 		ASTNode oldChild = this.optionalReceiverType;
 		preReplaceChild(oldChild, receiverType, RECEIVER_TYPE_PROPERTY);
@@ -766,7 +764,7 @@
 	 * 
 	 * @returns the qualifying name or <code>null</code> if a qualifier was not specified
 	 * @exception UnsupportedOperationException if this operation is used below JLS8
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public SimpleName getReceiverQualifier() {
 		unsupportedIn2_3_4();
@@ -778,7 +776,7 @@
 	 * 
 	 * @param receiverQualifier explicit receiver parameter to be added to the method declaration
 	 * @exception UnsupportedOperationException if this operation is used below JLS8
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public void setReceiverQualifier(SimpleName receiverQualifier) {
 		unsupportedIn2_3_4();
@@ -843,7 +841,7 @@
 	 * deprecation warnings.
 	 * @exception UnsupportedOperationException if this operation is used in
 	 *    a JLS8 or later AST
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	/*package*/	List internalThrownExceptions() {
 		// more efficient than just calling supportedOnlyIn2_3_4() to check
@@ -861,7 +859,7 @@
 	 *    (element type: {@link Type})
 	 * @exception UnsupportedOperationException if this operation is used
 	 *            in a JLS2, JLS3 or JLS4 AST    
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public List thrownExceptionTypes()  {
 		if (this.thrownExceptionTypes == null) {
@@ -1066,7 +1064,7 @@
 	 * a JLS8 or later AST 
 	 * @since 2.1
 	 * @deprecated In the JLS8 API, this method is replaced by
-	 * {@link #extraDimensions()} which contains a list of {@link ExtraDimension} nodes.
+	 * {@link #extraDimensions()} which contains a list of {@link Dimension} nodes.
 	 */
 	public void setExtraDimensions(int dimensions) {
 		// more efficient than just calling supportedOnlyIn2_3_4() to check
@@ -1084,9 +1082,9 @@
 	/**
 	 * Returns the live ordered list of extra dimensions with optional annotations (added in JLS8 API).
 	 * 
-	 * @return the live list of extra dimensions with optional annotations (element type: {@link ExtraDimension})
+	 * @return the live list of extra dimensions with optional annotations (element type: {@link Dimension})
 	 * @exception UnsupportedOperationException if this operation is used below JLS8
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public List extraDimensions() {
 		// more efficient than just calling unsupportedIn2_3_4() to check
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodInvocation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodInvocation.java
index 78d4760..f16d43b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodInvocation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodInvocation.java
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class MethodInvocation extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodRef.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodRef.java
index 7b24b0e..0d6d704 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodRef.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodRef.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -28,6 +28,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class MethodRef extends ASTNode implements IDocElement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodRefParameter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodRefParameter.java
index 6134d6b..d50f830 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodRefParameter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodRefParameter.java
@@ -33,6 +33,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class MethodRefParameter extends ASTNode {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodReference.java
index 07fa9e9..123df3e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/MethodReference.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -38,8 +34,9 @@
  * @see ExpressionMethodReference
  * @see SuperMethodReference
  * @see TypeMethodReference
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  */
+@SuppressWarnings({"rawtypes"})
 public abstract class MethodReference extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Modifier.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Modifier.java
index a3e3de2..dcdd041 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Modifier.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Modifier.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -48,6 +44,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public final class Modifier extends ASTNode implements IExtendedModifier {
 
 	/**
@@ -101,7 +98,7 @@
 		 * Note that the value of this modifier is
 		 * internal and is not specified in the Java Virtual Machine Specification.
 		 * </p>
-		 * @since 3.9 BETA_JAVA8
+		 * @since 3.10
 		 */
 		public static final ModifierKeyword DEFAULT_KEYWORD = new ModifierKeyword("default", DEFAULT);//$NON-NLS-1$
 
@@ -317,7 +314,7 @@
 	 * Note that the value of this flag is internal and is not
 	 * specified in the Java Virtual Machine Specification.
 	 * </p>
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final int DEFAULT = 0x10000;
 
@@ -473,12 +470,12 @@
 
 	/**
 	 * Returns whether the given flags includes the "default" modifier.
-	 * Applicable only to methods.
+	 * Applicable only to methods in interfaces.
 	 *
 	 * @param flags the modifier flags
 	 * @return <code>true</code> if the <code>DEFAULT</code> bit is set
 	 * and <code>false</code> otherwise
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static boolean isDefault(int flags) {
 		return (flags & DEFAULT) != 0;
@@ -708,7 +705,7 @@
 	/**
 	 * Answer true if the receiver is the default modifier, false otherwise.
 	 * @return true if the receiver is the default modifier, false otherwise
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean isDefault() {
 		return this.modifierKeyword == ModifierKeyword.DEFAULT_KEYWORD;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageQualifiedType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NameQualifiedType.java
similarity index 82%
rename from org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageQualifiedType.java
rename to org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NameQualifiedType.java
index a389dee..e00647d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageQualifiedType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NameQualifiedType.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,15 +15,18 @@
 import java.util.List;
 
 /**
- * Node for a package qualified type (added in JLS8 API).
+ * Node for a name-qualified type (added in JLS8 API).
  * 
  * <pre>
- * PackageQualifiedType:
+ * NameQualifiedType:
  *    Name <b>.</b> { Annotation } SimpleName
  * </pre>
  * 
  * <p>
- * Note that if no annotation is present, then a package-qualified type can
+ * The qualifier can resolve to a type or to a package.
+ * </p>
+ * <p>
+ * Note that if no annotation is present, then a name-qualified type can
  * also be represented by a SimpleType or a QualifiedType, see the discussion
  * in {@link QualifiedType}.
  * </p>
@@ -35,28 +34,29 @@
  * @see SimpleType
  * @see QualifiedType
  * 
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
-public class PackageQualifiedType extends AnnotatableType {
+@SuppressWarnings({"rawtypes"})
+public class NameQualifiedType extends AnnotatableType {
 
 	/**
 	 * The "qualifier" structural property of this node type (child type: {@link Name}).
 	 */
 	public static final ChildPropertyDescriptor QUALIFIER_PROPERTY =
-		new ChildPropertyDescriptor(PackageQualifiedType.class, "qualifier", Name.class, MANDATORY, NO_CYCLE_RISK); //$NON-NLS-1$
+		new ChildPropertyDescriptor(NameQualifiedType.class, "qualifier", Name.class, MANDATORY, NO_CYCLE_RISK); //$NON-NLS-1$
 
 	/**
 	 * The "annotations" structural property of this node type (element type: {@link Annotation}).
 	 */
 	public static final ChildListPropertyDescriptor ANNOTATIONS_PROPERTY =
-			internalAnnotationsPropertyFactory(PackageQualifiedType.class);
+			internalAnnotationsPropertyFactory(NameQualifiedType.class);
 	
 	/**
 	 * The "name" structural property of this node type (child type: {@link SimpleName}).
 	 */
 	public static final ChildPropertyDescriptor NAME_PROPERTY =
-		new ChildPropertyDescriptor(PackageQualifiedType.class, "name", SimpleName.class, MANDATORY, NO_CYCLE_RISK); //$NON-NLS-1$
+		new ChildPropertyDescriptor(NameQualifiedType.class, "name", SimpleName.class, MANDATORY, NO_CYCLE_RISK); //$NON-NLS-1$
 	
 	/**
 	 * A list of property descriptors (element type:
@@ -67,7 +67,7 @@
 
 	static {
 		List propertyList = new ArrayList(4);
-		createPropertyList(PackageQualifiedType.class, propertyList);
+		createPropertyList(NameQualifiedType.class, propertyList);
 		addProperty(QUALIFIER_PROPERTY, propertyList);
 		addProperty(ANNOTATIONS_PROPERTY, propertyList);
 		addProperty(NAME_PROPERTY, propertyList);
@@ -100,7 +100,7 @@
 	private SimpleName name = null;
 
 	/**
-	 * Creates a new unparented node for a package qualified type owned by the
+	 * Creates a new unparented node for a name-qualified type owned by the
 	 * given AST. By default, an unspecified, but legal, qualifier and name.
 	 * <p>
 	 * N.B. This constructor is package-private.
@@ -108,7 +108,7 @@
 	 *
 	 * @param ast the AST that is to own this node
 	 */
-	PackageQualifiedType(AST ast) {
+	NameQualifiedType(AST ast) {
 		super(ast);
 	    unsupportedIn2_3_4();
 	}
@@ -163,7 +163,7 @@
 	}
 
 	final int getNodeType0() {
-		return PACKAGE_QUALIFIED_TYPE;
+		return NAME_QUALIFIED_TYPE;
 	}
 
 	final boolean subtreeMatch0(ASTMatcher matcher, Object other) {
@@ -172,7 +172,7 @@
 	}
 
 	ASTNode clone0(AST target) {
-		PackageQualifiedType result = new PackageQualifiedType(target);
+		NameQualifiedType result = new NameQualifiedType(target);
 		result.setSourceRange(getStartPosition(), getLength());
 		result.setQualifier((Name) ((ASTNode) getQualifier()).clone(target));
 		result.annotations().addAll(ASTNode.copySubtrees(target, annotations()));
@@ -195,9 +195,9 @@
 	}
 
 	/**
-	 * Returns the qualifier of this package qualified type.
+	 * Returns the qualifier of this name-qualified type.
 	 *
-	 * @return the qualifier of this package qualified type
+	 * @return the qualifier of this name-qualified type
 	 */
 	public Name getQualifier() {
 		if (this.qualifier == null) {
@@ -214,9 +214,9 @@
 	}
 
 	/**
-	 * Sets the qualifier of this package qualified type to the given name.
+	 * Sets the qualifier of this name-qualified type to the given name.
 	 *
-	 * @param name the new qualifier of this package qualified type
+	 * @param name the new qualifier of this name-qualified type
 	 * @exception IllegalArgumentException if:
 	 * <ul>
 	 * <li>the node belongs to a different AST</li>
@@ -234,7 +234,7 @@
 	}
 
 	/**
-	 * Returns the name part of this package qualified type.
+	 * Returns the name part of this name-qualified type.
 	 *
 	 * @return the name being qualified
 	 */
@@ -253,7 +253,7 @@
 	}
 
 	/**
-	 * Sets the name part of this package qualified type to the given simple name.
+	 * Sets the name part of this name-qualified type to the given simple name.
 	 *
 	 * @param name the identifier of this qualified name
 	 * @exception IllegalArgumentException if:
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder.java
index 162d601..7d4f214 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NodeFinder.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
@@ -20,7 +20,7 @@
 import org.aspectj.org.eclipse.jdt.core.compiler.InvalidInputException;
 
 /**
- * For a given range, finds the covered node and the covering node.
+ * For a given selection range, finds the covered node and the covering node.
  *
  * @since 3.5
  */
@@ -79,22 +79,21 @@
 		}
 	}
 	/**
-	 * Maps a selection to a given ASTNode, where the selection is defined using a start and a length.
+	 * Maps a selection to an ASTNode, where the selection is defined using a start and a length.
 	 * The result node is determined as follows:
 	 * <ul>
-	 *   <li>first the visitor tries to find a node with the exact <code>start</code> and <code>length</code></li>
-	 *   <li>if no such node exists then the node that encloses the range defined by
-	 *       <code>start</code> and <code>length</code> is returned.</li>
-	 *   <li>if the length is zero then also nodes are considered where the node's
-	 *       start or end position matches <code>start</code>.</li>
-	 *   <li>otherwise <code>null</code> is returned.</li>
+	 *   <li>First, tries to find a node whose range is the exactly the given selection.
+	 *       If multiple matching nodes are found, the innermost is returned.</li>
+	 *   <li>If no such node exists, then the last node in a preorder traversal of the AST is returned, where
+	 *       the node range fully contains the selection.
+	 *       If the length is zero, then ties between adjacent nodes are broken by choosing the right side.</li>
 	 * </ul>
 	 *
 	 * @param root the root node from which the search starts
-	 * @param start the given start
-	 * @param length the given length
+	 * @param start the start of the selection
+	 * @param length the length of the selection
 	 *
-	 * @return the found node
+	 * @return the innermost node that exactly matches the selection, or the first node that contains the selection
 	 */
 	public static ASTNode perform(ASTNode root, int start, int length) {
 		NodeFinder finder = new NodeFinder(root, start, length);
@@ -106,10 +105,12 @@
 	}
 
 	/**
-	 * Maps a selection to a given ASTNode, where the selection is defined using a source range.
-	 * It calls <code>perform(root, range.getOffset(), range.getLength())</code>.
+	 * Maps a selection to an ASTNode, where the selection is defined using a source range.
+	 * Calls <code>perform(root, range.getOffset(), range.getLength())</code>.
 	 * 
-	 * @return the result node
+	 * @param root the root node from which the search starts
+	 * @param range the selection range
+	 * @return the innermost node that exactly matches the selection, or the first node that contains the selection
 	 * @see #perform(ASTNode, int, int)
 	 */
 	public static ASTNode perform(ASTNode root, ISourceRange range) {
@@ -117,23 +118,18 @@
 	}
 
 	/**
-	 * Maps a selection to a given ASTNode, where the selection is given by a start and a length.
+	 * Maps a selection to an ASTNode, where the selection is given by a start and a length.
 	 * The result node is determined as follows:
 	 * <ul>
-	 *   <li>first the visitor tries to find a node that is covered by <code>start</code> and
-	 *       <code>length</code> where either <code>start</code> and <code>length</code> exactly
-	 *       matches the node or where the text covered before and after the node only consists
-	 *       of white spaces or comments.</li>
-	 *   <li>if no such node exists then the node that encloses the range defined by
-	 *       <code>start</code> and <code>length</code> is returned.</li>
-	 *   <li>if the length is zero then also nodes are considered where the node's
-	 *       start or end position matches <code>start</code>.</li>
-	 *   <li>otherwise <code>null</code> is returned.</li>
+	 *   <li>If {@link #getCoveredNode()} doesn't find a node, returns <code>null</code>.</li>
+	 *   <li>Otherwise, iff the selection only contains the covered node and optionally some whitespace or comments
+	 *       on either side of the node, returns the node.</li>
+	 *   <li>Otherwise, returns the {@link #getCoveringNode() covering} node.</li>
 	 * </ul>
 	 *
 	 * @param root the root node from which the search starts
-	 * @param start the given start
-	 * @param length the given length
+	 * @param start the start of the selection
+	 * @param length the length of the selection
 	 * @param source the source of the compilation unit
 	 *
 	 * @return the result node
@@ -188,18 +184,27 @@
 		this.fCoveringNode = nodeFinderVisitor.getCoveringNode();
 	}
 	/**
-	 * Returns the covered node. If more than one nodes are covered by the selection, the
-	 * returned node is first covered node found in a top-down traversal of the AST.
+	 * If the AST contains nodes whose range is equal to the selection, returns the innermost of those nodes.
+	 * Otherwise, returns the first node in a preorder traversal of the AST, where the complete node range is covered by the selection.
+	 * <p>
+	 * Example: For a {@link SimpleType} whose name is a {@link SimpleName} and a selection that equals both nodes' range,
+	 * the covered node is the <code>SimpleName</code>.
+	 * But if the selection is expanded to include a whitespace before or after the <code>SimpleType</code>,
+	 * then the covered node is the <code>SimpleType</code>.
+	 * </p>
 	 *
-	 * @return the covered node
+	 * @return the covered node, or <code>null</code> if the selection is empty or too short to cover an entire node
 	 */
 	public ASTNode getCoveredNode() {
 		return this.fCoveredNode;
 	}
 
 	/**
-	 * Returns the covering node. If more than one nodes are covering the selection, the
-	 * returned node is last covering node found in a top-down traversal of the AST.
+	 * Returns the innermost node that fully contains the selection. A node also contains the zero-length selection on either end.
+	 * <p>
+	 * If more than one node covers the selection, the returned node is the last covering node found in a preorder traversal of the AST.
+	 * This implies that for a zero-length selection between two adjacent sibling nodes, the node on the right is returned.
+	 * </p>
 	 *
 	 * @return the covering node
 	 */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NormalAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NormalAnnotation.java
index 62df72f..7468a17 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NormalAnnotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NormalAnnotation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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,7 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public final class NormalAnnotation extends Annotation {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NullLiteral.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NullLiteral.java
index 60eeb98..c45c811 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NullLiteral.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NullLiteral.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
@@ -20,6 +20,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class NullLiteral extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NumberLiteral.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NumberLiteral.java
index 2c0e06d..5882dcd 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NumberLiteral.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/NumberLiteral.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
@@ -24,6 +24,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class NumberLiteral extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageBinding.java
index 211e1ce..970d457 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageBinding.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
@@ -37,6 +37,7 @@
 /**
  * Internal implementation of package bindings.
  */
+@SuppressWarnings("rawtypes")
 class PackageBinding implements IPackageBinding {
 
 	private static final String[] NO_NAME_COMPONENTS = CharOperation.NO_STRINGS;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageDeclaration.java
index 683bd81..70dc123 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PackageDeclaration.java
@@ -28,6 +28,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class PackageDeclaration extends ASTNode {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ParameterizedType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ParameterizedType.java
index 5403a78..ea360b1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ParameterizedType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ParameterizedType.java
@@ -28,6 +28,7 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ParameterizedType extends Type {
     /**
      * This index represents the position inside a parameterized qualified type.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ParenthesizedExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ParenthesizedExpression.java
index 5ffa639..4faecb3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ParenthesizedExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ParenthesizedExpression.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class ParenthesizedExpression extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression.java
index 233fdd6..c326bbc 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PostfixExpression.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
@@ -27,6 +27,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class PostfixExpression extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression.java
index ce2fd81..5991f23 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PrefixExpression.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
@@ -27,6 +27,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class PrefixExpression extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType.java
index 76b488a..6aba9e2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/PrimitiveType.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -43,6 +39,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class PrimitiveType extends AnnotatableType {
 
 	/**
@@ -160,7 +157,7 @@
 
 	/**
 	 * The "annotations" structural property of this node type (element type: {@link Annotation}).
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final ChildListPropertyDescriptor ANNOTATIONS_PROPERTY =
 			internalAnnotationsPropertyFactory(PrimitiveType.class);
@@ -182,7 +179,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static final List PROPERTY_DESCRIPTORS_8_0;
 	static {
@@ -235,7 +232,7 @@
 
 	/* (omit javadoc for this method)
 	 * Method declared on AnnotatableType.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	final ChildListPropertyDescriptor internalAnnotationsProperty() {
 		return ANNOTATIONS_PROPERTY;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/QualifiedName.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/QualifiedName.java
index 88c1c82..908c744 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/QualifiedName.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/QualifiedName.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
@@ -32,6 +32,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class QualifiedName extends Name {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/QualifiedType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/QualifiedType.java
index cfd458b..017b39a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/QualifiedType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/QualifiedType.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2013 IBM Corporation and others.
+ * Copyright (c) 2003, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,42 +24,49 @@
  * <p>
  * Not all node arrangements will represent legal Java constructs. In particular,
  * it is nonsense if the type is an array type or primitive type. The normal use
- * is when the type is a simple or parameterized type.
+ * is when the type is a ParameterizedType, an annotated QualifiedType, or a
+ * NameQualifiedType.
  * </p>
  * <p>
- * A type like "A.B" can be represented either of two ways:
- * <ol>
- * <li>
- * <code>QualifiedType(SimpleType(SimpleName("A")),SimpleName("B"))</code>
- * </li>
- * <li>
- * <code>SimpleType(QualifiedName(SimpleName("A"),SimpleName("B")))</code>
- * </li>
- * </ol>
- * The first form is preferred when "A" is known to be a type. However, a
- * parser cannot always determine this. Clients should be prepared to handle
- * either rather than make assumptions. (Note also that the first form
- * became possible as of JLS3; only the second form existed in JLS2 API;
- * the ASTParser currently prefers the second form).
+ * A "."-separated type like "A.B" can be represented in three ways:
+ * <pre>
+ * 1.    SimpleType       | 2. NameQualifiedType   | 3.  QualifiedType
+ *     QualifiedName      | SimpleName  SimpleName | SimpleType  SimpleName
+ * SimpleName  SimpleName |     "A"         "B"    | SimpleName      "B"
+ *     "A"         "B"    |                        |     "A"
+ * </pre>
+ * <p>
+ * The ASTParser creates the SimpleType form (wrapping a name) if possible. The
+ * SimpleType form doesn't support any embedded Annotations nor ParameterizedTypes.
+ * The NameQualifiedType form is only available since JLS8 and the
+ * QualifiedType form only since JLS3. The NameQualifiedType and QualifiedType forms
+ * allow Annotations on the last SimpleName. The QualifiedType form cannot be used if
+ * the qualifier represents a package name.
  * </p>
  * <p>
- * Since JLS8, it's also possible to annotate qualified type names.
- * A type like "a.@X B" cannot be represented in either of
- * the old ways, because "a" is not a type, but a package.
- * Such types are represented as:
+ * The part before the last "." is called the <em>qualifier</em> of a type. If
+ * the name after the last "." has annotations or if the qualifier is not a
+ * (possibly qualified) name, then the ASTParser creates either a
+ * NameQualifiedType or a QualifiedType:
  * </p>
- * <ol start="3">
+ * <ul>
  * <li>
- * <code>PackageQualifiedType(SimpleName("a"),MarkerAnnotation("X"),SimpleName("B"))</code>
+ * If the qualifier is a (possibly qualified) name, then a NameQualifiedType is
+ * created.
  * </li>
- * </ol>
+ * <li>
+ * Otherwise, a QualifiedType is created and its qualifier is built using the
+ * same rules.
+ * </li>
+ * </ul>
  * 
  * @see SimpleType
- * @see PackageQualifiedType
+ * @see NameQualifiedType
  * 
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class QualifiedType extends AnnotatableType {
     /**
      * This index represents the position inside a parameterized qualified type.
@@ -78,7 +81,7 @@
 
 	/**
 	 * The "annotations" structural property of this node type (element type: {@link Annotation}).
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final ChildListPropertyDescriptor ANNOTATIONS_PROPERTY =
 			internalAnnotationsPropertyFactory(QualifiedType.class);
@@ -99,7 +102,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static final List PROPERTY_DESCRIPTORS_8_0;
 
@@ -166,7 +169,7 @@
 
 	/* (omit javadoc for this method)
 	 * Method declared on AnnotatableType.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	final ChildListPropertyDescriptor internalAnnotationsProperty() {
 		return ANNOTATIONS_PROPERTY;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java
index caf36a3..99c7891 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2013 IBM Corporation and others.
+ * Copyright (c) 2007, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -30,6 +26,7 @@
 /**
  * This class represents the recovered binding for a type
  */
+@SuppressWarnings("rawtypes")
 class RecoveredTypeBinding implements ITypeBinding {
 
 	private VariableDeclaration variableDeclaration;
@@ -130,6 +127,7 @@
 
 	/* (non-Javadoc)
 	 * @see org.aspectj.org.eclipse.jdt.core.dom.ITypeBinding#getDeclaredModifiers()
+	 * @deprecated Use ITypeBinding#getModifiers() instead
 	 */
 	public int getDeclaredModifiers() {
 		return 0;
@@ -186,7 +184,7 @@
 		}
 		return null;
 	}
-
+	
 	/* (non-Javadoc)
 	 * @see org.aspectj.org.eclipse.jdt.core.dom.ITypeBinding#getErasure()
 	 */
@@ -195,6 +193,14 @@
 	}
 
 	/* (non-Javadoc)
+	 * @see org.aspectj.org.eclipse.jdt.core.dom.ITypeBinding#getFunctionalInterfaceMethod
+	 */
+	@Override
+	public IMethodBinding getFunctionalInterfaceMethod() {
+		return null;
+	}
+	
+	/* (non-Javadoc)
 	 * @see org.aspectj.org.eclipse.jdt.core.dom.ITypeBinding#getInterfaces()
 	 */
 	public ITypeBinding[] getInterfaces() {
@@ -667,9 +673,9 @@
 			case ASTNode.QUALIFIED_TYPE :
 				QualifiedType qualifiedType = (QualifiedType) type;
 				return qualifiedType.getName().getIdentifier();
-			case ASTNode.PACKAGE_QUALIFIED_TYPE :
-				PackageQualifiedType packageQualifiedType = (PackageQualifiedType) type;
-				return packageQualifiedType.getName().getIdentifier();
+			case ASTNode.NAME_QUALIFIED_TYPE :
+				NameQualifiedType nameQualifiedType = (NameQualifiedType) type;
+				return nameQualifiedType.getName().getIdentifier();
 			case ASTNode.SIMPLE_TYPE :
 				SimpleType simpleType = (SimpleType) type;
 				Name name = simpleType.getName();
@@ -708,4 +714,8 @@
 		}
 		return null; // should not happen
 	}
+
+	public IAnnotationBinding[] getTypeAnnotations() {
+		return AnnotationBinding.NoAnnotations;
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/RecoveredVariableBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/RecoveredVariableBinding.java
index 2085720..986c74a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/RecoveredVariableBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/RecoveredVariableBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2009 IBM Corporation and others.
+ * Copyright (c) 2007, 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
@@ -125,4 +125,7 @@
 	public boolean isSynthetic() {
 		return false;
 	}
+	public boolean isEffectivelyFinal() {
+		return false;
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ReturnStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ReturnStatement.java
index b657973..f191f83 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ReturnStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ReturnStatement.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class ReturnStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimpleName.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimpleName.java
index 05d20aa..2d27968 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimpleName.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimpleName.java
@@ -30,6 +30,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class SimpleName extends Name {
 
 	/**
@@ -191,14 +192,16 @@
 			try {
 				int tokenType = scanner.scanIdentifier();
 				if (tokenType != TerminalTokens.TokenNameIdentifier) {
-					throw new IllegalArgumentException();
+					throw new IllegalArgumentException("Invalid identifier : >" + identifier + "<");  //$NON-NLS-1$//$NON-NLS-2$
 				}
 				if (scanner.currentPosition != length) {
 					// this is the case when there is only one identifier see 87849
-					throw new IllegalArgumentException();
+					throw new IllegalArgumentException("Invalid identifier : >" + identifier + "<");  //$NON-NLS-1$//$NON-NLS-2$
 				}
-			} catch(InvalidInputException e) {
-				throw new IllegalArgumentException();
+			} catch (InvalidInputException e) {
+				IllegalArgumentException iae = new IllegalArgumentException("Invalid identifier : >" + identifier + "<"); //$NON-NLS-1$//$NON-NLS-2$
+				iae.initCause(e);
+				throw iae; 
 			}
 		} finally {
 			this.ast.scanner.sourceLevel = sourceLevel;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimplePropertyDescriptor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimplePropertyDescriptor.java
index 6fe321e..74ab90d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimplePropertyDescriptor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimplePropertyDescriptor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -22,6 +22,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public final class SimplePropertyDescriptor extends StructuralPropertyDescriptor {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimpleType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimpleType.java
index ab97a55..1c9c56d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimpleType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SimpleType.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -31,19 +27,20 @@
  *
  * In JLS8 and later, the SimpleType may have optional annotations.
  * If annotations are present, then the name must be a {@link SimpleName}.
- * Annotated qualified names are represented as {@link QualifiedType} or {@link PackageQualifiedType}.
+ * Annotated qualified names are represented as {@link QualifiedType} or {@link NameQualifiedType}.
  * 
  * @see QualifiedType
- * @see PackageQualifiedType
+ * @see NameQualifiedType
  * 
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class SimpleType extends AnnotatableType {
 
 	/**
 	 * The "annotations" structural property of this node type (element type: {@link Annotation}).
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final ChildListPropertyDescriptor ANNOTATIONS_PROPERTY =
 			internalAnnotationsPropertyFactory(SimpleType.class);
@@ -65,7 +62,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static final List PROPERTY_DESCRIPTORS_8_0;
 
@@ -124,7 +121,7 @@
 
 	/* (omit javadoc for this method)
 	 * Method declared on AnnotatableType.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	final ChildListPropertyDescriptor internalAnnotationsProperty() {
 		return ANNOTATIONS_PROPERTY;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SingleMemberAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SingleMemberAnnotation.java
index 160ff84..df3b8a5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SingleMemberAnnotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SingleMemberAnnotation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -28,6 +28,7 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public final class SingleMemberAnnotation extends Annotation {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SingleVariableDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SingleVariableDeclaration.java
index 1b3d563..02a00ec 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SingleVariableDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SingleVariableDeclaration.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,7 +22,7 @@
  * and regular variable declaration statements.
  * <pre>
  * SingleVariableDeclaration:
- *    { ExtendedModifier } Type {Annotation} [ <b>...</b> ] Identifier { ExtraDimension } [ <b>=</b> Expression ]
+ *    { ExtendedModifier } Type {Annotation} [ <b>...</b> ] Identifier { Dimension } [ <b>=</b> Expression ]
  * </pre>
  * <p>
  * Note: There's currently no construct in the Java language that allows an initializer on a SingleVariableDeclaration.
@@ -35,6 +31,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SingleVariableDeclaration extends VariableDeclaration {
 
 	/**
@@ -62,7 +59,7 @@
 	/**
 	 * The "varargsAnnotations" structural property of variable arguments of this node type (element type: {@link Annotation})
 	 * (added in JLS8 API).
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final ChildListPropertyDescriptor VARARGS_ANNOTATIONS_PROPERTY =
 			new ChildListPropertyDescriptor(SingleVariableDeclaration.class, "varargsAnnotations", Annotation.class, CYCLE_RISK); //$NON-NLS-1$
@@ -92,8 +89,8 @@
 			internalExtraDimensionsPropertyFactory(SingleVariableDeclaration.class);
 
 	/**
-	 * The "extraDimensions2" structural property of this node type (element type: {@link ExtraDimension}) (added in JLS8 API).
-	 * @since 3.9 BETA_JAVA8
+	 * The "extraDimensions2" structural property of this node type (element type: {@link Dimension}) (added in JLS8 API).
+	 * @since 3.10
 	 */
 	public static final ChildListPropertyDescriptor EXTRA_DIMENSIONS2_PROPERTY =
 			internalExtraDimensions2PropertyFactory(SingleVariableDeclaration.class);
@@ -125,7 +122,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static final List PROPERTY_DESCRIPTORS_8_0;
 
@@ -207,7 +204,7 @@
 	 * Null before JLS8. Added in JLS8; defaults to an empty list
 	 * (see constructor).
 	 * 
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private ASTNode.NodeList varargsAnnotations = null;
 
@@ -258,7 +255,7 @@
 
 	/* (omit javadoc for this method)
 	 * Method declared on VariableDeclaration.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	final ChildListPropertyDescriptor internalExtraDimensions2Property() {
 		return EXTRA_DIMENSIONS2_PROPERTY;
@@ -610,7 +607,7 @@
 	 * @return the list of annotations on the varargs token (element type: {@link Annotation})
 	 * @exception UnsupportedOperationException if this operation is used
 	 *            in a JLS2, JLS3 or JLS4 AST
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public List varargsAnnotations() {
 		if (this.varargsAnnotations == null) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/StringLiteral.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/StringLiteral.java
index 4bbf280..8c98a39 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/StringLiteral.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/StringLiteral.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
@@ -24,6 +24,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class StringLiteral extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/StructuralPropertyDescriptor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/StructuralPropertyDescriptor.java
index 90ab3ad..bb40441 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/StructuralPropertyDescriptor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/StructuralPropertyDescriptor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -29,6 +29,7 @@
  * @since 3.0
  * @noextend This class is not intended to be subclassed by clients.
  */
+@SuppressWarnings("rawtypes")
 public abstract class StructuralPropertyDescriptor {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperConstructorInvocation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperConstructorInvocation.java
index e211c0b..56dcf13 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperConstructorInvocation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperConstructorInvocation.java
@@ -26,6 +26,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SuperConstructorInvocation extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperFieldAccess.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperFieldAccess.java
index 51685eb..cc2e822 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperFieldAccess.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperFieldAccess.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
@@ -31,6 +31,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class SuperFieldAccess extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodInvocation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodInvocation.java
index 9bd3a41..0091e7a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodInvocation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodInvocation.java
@@ -26,6 +26,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SuperMethodInvocation extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodReference.java
index 173f117..1121be7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SuperMethodReference.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -27,9 +23,10 @@
  *         Identifier
  * </pre>
  * 
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  * @noinstantiate This class is not intended to be instantiated by clients
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SuperMethodReference extends MethodReference {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SwitchCase.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SwitchCase.java
index 5bc6126..6956d7f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SwitchCase.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SwitchCase.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
@@ -28,6 +28,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class SwitchCase extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SwitchStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SwitchStatement.java
index 277a79d..1455ca8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SwitchStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SwitchStatement.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
@@ -32,6 +32,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SwitchStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SynchronizedStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SynchronizedStatement.java
index 77b12b7..69e147a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SynchronizedStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/SynchronizedStatement.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class SynchronizedStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TagElement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TagElement.java
index 441a613..39fbefd 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TagElement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TagElement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -33,6 +33,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public final class TagElement extends ASTNode implements IDocElement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TextElement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TextElement.java
index a4151af..5dfeae3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TextElement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TextElement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -27,6 +27,7 @@
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public final class TextElement extends ASTNode implements IDocElement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ThisExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ThisExpression.java
index cf3a2f6..743ca5f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ThisExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ThisExpression.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
@@ -30,6 +30,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class ThisExpression extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ThrowStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ThrowStatement.java
index 42c0c5b..9440462 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ThrowStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/ThrowStatement.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class ThrowStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TryStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TryStatement.java
index 3e99f26..e5bfa5a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TryStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TryStatement.java
@@ -31,6 +31,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class TryStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Type.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Type.java
index 08743e9..2f2f76a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Type.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/Type.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -17,10 +13,10 @@
 
 
 /**
- * Abstract base class of all type AST node types. A type node represents a
+ * Abstract base class of all type reference AST node types. A type node represents a
  * reference to a primitive type (including void), to an array type, or to a
  * simple named type (or type variable), to a qualified type, to a
- * parameterized type, to a union type, or to a wildcard type. Note that not all of these
+ * parameterized type, to a union type, to an intersection type, or to a wildcard type. Note that not all of these
  * are meaningful in all contexts; for example, a wildcard type is only
  * meaningful in the type argument position of a parameterized type.
  * UnionType got introduced in JLS4 to support common catch blocks for disjunctive types.
@@ -30,11 +26,11 @@
  * Type:
  *    AnnotatableType:
  *       PrimitiveType
- *       ArrayType
  *       SimpleType
  *       QualifiedType
- *       PackageQualifiedType
+ *       NameQualifiedType
  *       WildcardType
+ *    ArrayType
  *    ParameterizedType
  *    UnionType
  *    IntersectionType
@@ -50,12 +46,12 @@
  *    { Annotation } <b>boolean</b>
  *    { Annotation } <b>void</b>
  * {@link ArrayType}:
- *    Type { Annotation } <b>'['</b> <b>']'</b>
+ *    Type Dimension <b>{</b> Dimension <b>}</b>
  * {@link SimpleType}:
  *    { Annotation } TypeName
  * {@link QualifiedType}:
  *    Type <b>.</b> {Annotation} SimpleName
- * {@link PackageQualifiedType}:
+ * {@link NameQualifiedType}:
  *    Name <b>.</b> { Annotation } SimpleName
  * {@link WildcardType}:
  *    { Annotation } <b>?</b> [ ( <b>extends</b> | <b>super</b>) Type ]
@@ -118,15 +114,15 @@
 	}
 
 	/**
-	 * Returns whether this type is a package qualified type
-	 * ({@link PackageQualifiedType}).
+	 * Returns whether this type is a name qualified type
+	 * ({@link NameQualifiedType}).
 	 *
-	 * @return <code>true</code> if this is a package qualified type, and
+	 * @return <code>true</code> if this is a name qualified type, and
 	 *    <code>false</code> otherwise
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
-	public final boolean isPackageQualifiedType() {
-		return (this instanceof PackageQualifiedType);
+	public final boolean isNameQualifiedType() {
+		return (this instanceof NameQualifiedType);
 	}
 
 	/**
@@ -187,7 +183,7 @@
 	 *
 	 * @return <code>true</code> if this is an intersection type, and
 	 * 		<code>false</code> otherwise
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public final boolean isIntersectionType() {
 		return (this instanceof IntersectionType);
@@ -216,7 +212,7 @@
 	 * @return <code>true</code> if this type is an instance of {@link AnnotatableType}, and
 	 * <code>false</code> otherwise
 	 * 			
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean isAnnotatable() {
 		return (this instanceof AnnotatableType);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeBinding.java
index c6dcf4e..3f52f6d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -31,6 +31,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.WildcardBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
@@ -54,10 +55,12 @@
 		Modifier.ABSTRACT | Modifier.STATIC | Modifier.FINAL | Modifier.STRICTFP;
 
 	org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding binding;
+	private TypeBinding prototype = null;
 	private String key;
 	private BindingResolver resolver;
 	private IVariableBinding[] fields;
 	private IAnnotationBinding[] annotations;
+	private IAnnotationBinding[] typeAnnotations;
 	private IMethodBinding[] methods;
 	private ITypeBinding[] members;
 	private ITypeBinding[] interfaces;
@@ -68,6 +71,8 @@
 	public TypeBinding(BindingResolver resolver, org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding binding) {
 		this.binding = binding;
 		this.resolver = resolver;
+		org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding compilerPrototype = binding.prototype();
+		this.prototype = (TypeBinding) (compilerPrototype == null || compilerPrototype == binding ? null : resolver.getTypeBinding(compilerPrototype)); //$IDENTITY-COMPARISON$
 	}
 
 	public ITypeBinding createArrayType(int dimension) {
@@ -80,6 +85,9 @@
 	}
 
 	public IAnnotationBinding[] getAnnotations() {
+		if (this.prototype != null) {
+			return this.prototype.getAnnotations();
+		}
 		if (this.annotations != null) {
 			return this.annotations;
 		}
@@ -90,30 +98,36 @@
 			refType = (org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding) this.binding;
 		}
 		if (refType != null) {
-			org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] internalAnnotations = refType.getAnnotations();
-			int length = internalAnnotations == null ? 0 : internalAnnotations.length;
-			if (length != 0) {
-				IAnnotationBinding[] tempAnnotations = new IAnnotationBinding[length];
-				int convertedAnnotationCount = 0;
-				for (int i = 0; i < length; i++) {
-					org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding internalAnnotation = internalAnnotations[i];
-					IAnnotationBinding annotationInstance = this.resolver.getAnnotationInstance(internalAnnotation);
-					if (annotationInstance == null) {
-						continue;
-					}
-					tempAnnotations[convertedAnnotationCount++] = annotationInstance;
-				}
-				if (convertedAnnotationCount != length) {
-					if (convertedAnnotationCount == 0) {
-						return this.annotations = AnnotationBinding.NoAnnotations;
-					}
-					System.arraycopy(tempAnnotations, 0, (tempAnnotations = new IAnnotationBinding[convertedAnnotationCount]), 0, convertedAnnotationCount);
-				}
-				return this.annotations = tempAnnotations;
-			}
+			return this.annotations = resolveAnnotationBindings(refType.getAnnotations(), false);
 		}
 		return this.annotations = AnnotationBinding.NoAnnotations;
 	}
+	private IAnnotationBinding[] resolveAnnotationBindings(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] internalAnnotations, boolean isTypeUse) {
+		int length = internalAnnotations == null ? 0 : internalAnnotations.length;
+		if (length != 0) {
+			IAnnotationBinding[] tempAnnotations = new IAnnotationBinding[length];
+			int convertedAnnotationCount = 0;
+			for (int i = 0; i < length; i++) {
+				org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding internalAnnotation = internalAnnotations[i];
+				if (isTypeUse && internalAnnotation == null) {
+					break;
+				}
+				IAnnotationBinding annotationInstance = this.resolver.getAnnotationInstance(internalAnnotation);
+				if (annotationInstance == null) {
+					continue;
+				}
+				tempAnnotations[convertedAnnotationCount++] = annotationInstance;
+			}
+			if (convertedAnnotationCount != length) {
+				if (convertedAnnotationCount == 0) {
+					return this.annotations = AnnotationBinding.NoAnnotations;
+				}
+				System.arraycopy(tempAnnotations, 0, (tempAnnotations = new IAnnotationBinding[convertedAnnotationCount]), 0, convertedAnnotationCount);
+			}
+			return tempAnnotations;
+		}
+		return AnnotationBinding.NoAnnotations;
+	}
 
 	/*
 	 * @see ITypeBinding#getBinaryName()
@@ -215,6 +229,9 @@
 	 * @see ITypeBinding#getDeclaredFields()
 	 */
 	public synchronized IVariableBinding[] getDeclaredFields() {
+		if (this.prototype != null) {
+			return this.prototype.getDeclaredFields();
+		}
 		if (this.fields != null) {
 			return this.fields;
 		}
@@ -258,6 +275,9 @@
 	 * @see ITypeBinding#getDeclaredMethods()
 	 */
 	public synchronized IMethodBinding[] getDeclaredMethods() {
+		if (this.prototype != null) {
+			return this.prototype.getDeclaredMethods();
+		}
 		if (this.methods != null) {
 			return this.methods;
 		}
@@ -301,6 +321,7 @@
 
 	/*
 	 * @see ITypeBinding#getDeclaredModifiers()
+	 * @deprecated Use ITypeBinding#getModifiers() instead
 	 */
 	public int getDeclaredModifiers() {
 		return getModifiers();
@@ -309,7 +330,7 @@
 	/*
 	 * @see ITypeBinding#getDeclaredTypes()
 	 */
-	public synchronized ITypeBinding[] getDeclaredTypes() {
+	public synchronized ITypeBinding[] getDeclaredTypes() { // should not deflect to prototype.
 		if (this.members != null) {
 			return this.members;
 		}
@@ -444,17 +465,34 @@
 	public ITypeBinding getTypeDeclaration() {
 		if (this.binding instanceof ParameterizedTypeBinding)
 			return this.resolver.getTypeBinding(((ParameterizedTypeBinding)this.binding).genericType());
-		return this;
+		return this.resolver.getTypeBinding(this.binding.unannotated());
 	}
-
+	
 	/* (non-Javadoc)
 	 * @see org.aspectj.org.eclipse.jdt.core.dom.ITypeBinding#getErasure()
 	 */
 	public ITypeBinding getErasure() {
 		return this.resolver.getTypeBinding(this.binding.erasure());
 	}
+	
+	/* (non-Javadoc)
+	 * @see org.aspectj.org.eclipse.jdt.core.dom.ITypeBinding#getFunctionalInterfaceMethod
+	 */
+	@Override
+	public IMethodBinding getFunctionalInterfaceMethod() {
+		Scope scope = this.resolver.scope();
+		if (this.binding == null || scope == null)
+			return null;
+		MethodBinding sam = this.binding.getSingleAbstractMethod(scope, true);
+		if (sam == null || !sam.isValidBinding())
+			return null;
+		return this.resolver.getMethodBinding(sam);
+	}
 
 	public synchronized ITypeBinding[] getInterfaces() {
+		if (this.prototype != null) {
+			return this.prototype.getInterfaces();
+		}
 		if (this.interfaces != null) {
 			return this.interfaces;
 		}
@@ -825,6 +863,9 @@
 	 * @see org.aspectj.org.eclipse.jdt.core.dom.ITypeBinding#getTypeArguments()
 	 */
 	public ITypeBinding[] getTypeArguments() {
+		if (this.prototype != null) {
+			return this.prototype.getTypeArguments();
+		}
 		if (this.typeArguments != null) {
 			return this.typeArguments;
 		}
@@ -849,16 +890,30 @@
 	 * @see org.aspectj.org.eclipse.jdt.core.dom.ITypeBinding#getTypeBounds()
 	 */
 	public ITypeBinding[] getTypeBounds() {
+		if (this.prototype != null) {
+			return this.prototype.getTypeBounds();
+		}
 		if (this.bounds != null) {
 			return this.bounds;
 		}
+		TypeVariableBinding typeVariableBinding = null;
 		if (this.binding instanceof TypeVariableBinding) {
-			TypeVariableBinding typeVariableBinding = (TypeVariableBinding) this.binding;
+			typeVariableBinding = (TypeVariableBinding) this.binding;
+		} else if (this.binding instanceof WildcardBinding) {
+			WildcardBinding wildcardBinding = (WildcardBinding) this.binding;
+			typeVariableBinding = wildcardBinding.typeVariable();
+		}
+		if (typeVariableBinding != null) {
 			ReferenceBinding varSuperclass = typeVariableBinding.superclass();
 			org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding firstClassOrArrayBound = typeVariableBinding.firstBound;
 			int boundsLength = 0;
-			if (firstClassOrArrayBound != null) {
-				if (firstClassOrArrayBound == varSuperclass) {
+			if (firstClassOrArrayBound == null) {
+				if (varSuperclass != null && varSuperclass.id != TypeIds.T_JavaLangObject) {
+					firstClassOrArrayBound = varSuperclass;
+					boundsLength++;
+				}
+			} else  {
+				if (org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.equalsEquals(firstClassOrArrayBound, varSuperclass)) {
 					boundsLength++;
 				} else if (firstClassOrArrayBound.isArrayType()) { // capture of ? extends/super arrayType
 					boundsLength++;
@@ -901,6 +956,9 @@
 	 * @see org.aspectj.org.eclipse.jdt.core.dom.ITypeBinding#getTypeParameters()
 	 */
 	public ITypeBinding[] getTypeParameters() {
+		if (this.prototype != null) {
+			return this.prototype.getTypeParameters();
+		}
 		if (this.typeParameters != null) {
 			return this.typeParameters;
 		}
@@ -980,7 +1038,7 @@
 	 */
 	public boolean isAssignmentCompatible(ITypeBinding type) {
 		try {
-			if (this == type) return true;
+			if (this == type) return true; //$IDENTITY-COMPARISON$
 			if (!(type instanceof TypeBinding)) return false;
 			TypeBinding other = (TypeBinding) type;
 			Scope scope = this.resolver.scope();
@@ -1067,6 +1125,9 @@
 			return false;
 		}
 		org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding otherBinding = ((TypeBinding) other).binding;
+		if (org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding.equalsEquals(otherBinding.unannotated(), this.binding.unannotated())) {
+			return true;
+		}
 		// check return type
 		return BindingComparator.isEqual(this.binding, otherBinding);
 	}
@@ -1201,7 +1262,7 @@
 	 */
 	public boolean isSubTypeCompatible(ITypeBinding type) {
 		try {
-			if (this == type) return true;
+			if (this == type) return true; //$IDENTITY-COMPARISON$
 			if (this.binding.isBaseType()) return false;
 			if (!(type instanceof TypeBinding)) return false;
 			TypeBinding other = (TypeBinding) type;
@@ -1266,4 +1327,15 @@
 	public String toString() {
 		return this.binding.toString();
 	}
+
+	/*
+	 * @see ITypeBinding#getTypeUseAnnotations()
+	 */
+	public IAnnotationBinding[] getTypeAnnotations() {
+		if (this.typeAnnotations != null) {
+			return this.typeAnnotations;
+		}
+		this.typeAnnotations = resolveAnnotationBindings(this.binding.getTypeAnnotations(), true);
+		return this.typeAnnotations;
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration.java
index f15f8b2..ea86c90 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclaration.java
@@ -48,6 +48,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class TypeDeclaration extends AbstractTypeDeclaration {
 
 	// AspectJ Extension start
@@ -68,11 +69,17 @@
 			//throw new ExceptionInInitializerError(ex.getMessage());
 		}
 	}
-
+	
+	/**
+	 * @since 3.10
+	 */
 	public interface ITypeDeclFactory {
 		public TypeDeclaration createTypeFor(AST ast);
 	}
 	
+	/**
+	 * @since 3.10
+	 */
 	public static TypeDeclaration getTypeDeclaration(AST ast) {
 		return declarationFactory.createTypeFor(ast);
 	}
@@ -162,7 +169,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.0
+	 * @since 3.10 // Up'd from 3.0 because of @since check due to raising visibility
 	 */
 	// AspectJ extension, modified not to be private or final
 	protected /*private*/ static /*final*/ List PROPERTY_DESCRIPTORS_2_0;
@@ -171,7 +178,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.1
+	 * @since 3.10 // Up'd from 3.1 because of @since check due to raising visibility
 	 */
 	// AspectJ extension, modified not to be private or final
 	protected /*private*/ static /*final*/ List PROPERTY_DESCRIPTORS_3_0;
@@ -230,7 +237,7 @@
 	 * The type parameters (element type: {@link TypeParameter}).
 	 * Null in JLS2. Added in JLS3; defaults to an empty list
 	 * (see constructor).
-	 * @since 3.1
+	 * @since 3.10 // Up'd from 3.1 because of @since check due to raising visibility
 	 */
     // AspectJ Extension, was private, now protected
 	protected ASTNode.NodeList typeParameters = null;
@@ -246,7 +253,7 @@
 	 * The superinterface names (element type: {@link Name}).
 	 * JLS2 only; defaults to an empty list. Not used in JLS3.
 	 * (see constructor).
-	 *
+	 * @since 3.10 // Added because of @since check due to raising visibility
 	 */
     // AspectJ Extension, was private, now protected
 	protected ASTNode.NodeList superInterfaceNames = null;
@@ -263,7 +270,7 @@
 	 * The superinterface types (element type: {@link Type}).
 	 * Null in JLS2. Added in JLS3; defaults to an empty list
 	 * (see constructor).
-	 * @since 3.1
+	 * @since 3.10 // Up'd from 3.1 because of @since check due to raising visibility
 	 */
     // AspectJ Extension, was private, now protected
 	protected ASTNode.NodeList superInterfaceTypes = null;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclarationStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclarationStatement.java
index c0eedc1..d11034d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclarationStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeDeclarationStatement.java
@@ -32,6 +32,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class TypeDeclarationStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeLiteral.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeLiteral.java
index e2c02e9..6b89d11 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeLiteral.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeLiteral.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class TypeLiteral extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeMethodReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeMethodReference.java
index 9d3c240..6b3753e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeMethodReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeMethodReference.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -26,9 +22,10 @@
  *         Identifier
  * </pre>
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class TypeMethodReference extends MethodReference {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeParameter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeParameter.java
index bf218d3..033d1f2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeParameter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/TypeParameter.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2013 IBM Corporation and others.
+ * Copyright (c) 2003, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,24 +15,25 @@
 import java.util.List;
 
 /**
- * Type parameter node (added in JLS3 API).
+ * Type parameter declaration node (added in JLS3 API).
  * 
  * <pre>
  * TypeParameter:
- *    { Annotation } TypeVariable [ <b>extends</b> Type { <b>&</b> Type } ]
+ *    { ExtendedModifier } Identifier [ <b>extends</b> Type { <b>&</b> Type } ]
  * </pre>
  *
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class TypeParameter extends ASTNode {
 
 	/**
-	 * The "annotations" structural property of this node type (element type: {@link Annotation}) (added in JLS8 API).
-	 * @since 3.9 BETA_JAVA8
+	 * The "modifiers" structural property of this node type (element type: {@link IExtendedModifier}) (added in JLS8 API).
+	 * @since 3.10
 	 */
-	public static final ChildListPropertyDescriptor ANNOTATIONS_PROPERTY =
-			new ChildListPropertyDescriptor(TypeParameter.class, "annotations", Annotation.class, CYCLE_RISK); //$NON-NLS-1$
+	public static final ChildListPropertyDescriptor MODIFIERS_PROPERTY =
+			new ChildListPropertyDescriptor(TypeParameter.class, "modifiers", IExtendedModifier.class, CYCLE_RISK); //$NON-NLS-1$
 	
 	/**
 	 * The "name" structural property of this node type (child type: {@link SimpleName}).
@@ -60,7 +57,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static final List PROPERTY_DESCRIPTORS_8_0;
 
@@ -73,7 +70,7 @@
 		
 		propertyList = new ArrayList(4);
 		createPropertyList(TypeParameter.class, propertyList);
-		addProperty(ANNOTATIONS_PROPERTY, propertyList);
+		addProperty(MODIFIERS_PROPERTY, propertyList);
 		addProperty(NAME_PROPERTY, propertyList);
 		addProperty(TYPE_BOUNDS_PROPERTY, propertyList);
 		PROPERTY_DESCRIPTORS_8_0 = reapPropertyList(propertyList);
@@ -114,11 +111,11 @@
 		new ASTNode.NodeList(TYPE_BOUNDS_PROPERTY);
 
 	/**
-	 * The type annotations (element type: {@link Annotation}).
+	 * The modifiers (element type: {@link IExtendedModifier}).
 	 * Null in JLS < 8. Added in JLS8; defaults to an empty list
 	 * (see constructor).
 	 */
-	private ASTNode.NodeList annotations = null;
+	private ASTNode.NodeList modifiers = null;
 	
 	/**
 	 * Creates a new unparented node for a parameterized type owned by the
@@ -134,7 +131,7 @@
 		super(ast);
 	    unsupportedIn2();
 	    if (ast.apiLevel >= AST.JLS8) {
-			this.annotations = new ASTNode.NodeList(ANNOTATIONS_PROPERTY);
+			this.modifiers = new ASTNode.NodeList(MODIFIERS_PROPERTY);
 		}
 	}
 
@@ -165,8 +162,8 @@
 	 * Method declared on ASTNode.
 	 */
 	final List internalGetChildListProperty(ChildListPropertyDescriptor property) {
-		if (property == ANNOTATIONS_PROPERTY) {
-			return annotations();
+		if (property == MODIFIERS_PROPERTY) {
+			return modifiers();
 		}
 		if (property == TYPE_BOUNDS_PROPERTY) {
 			return typeBounds();
@@ -189,8 +186,8 @@
 		TypeParameter result = new TypeParameter(target);
 		result.setSourceRange(getStartPosition(), getLength());
 		if (this.ast.apiLevel >= AST.JLS8) {
-			result.annotations().addAll(
-					ASTNode.copySubtrees(target, annotations()));
+			result.modifiers().addAll(
+					ASTNode.copySubtrees(target, modifiers()));
 		}
 		result.setName((SimpleName) ((ASTNode) getName()).clone(target));
 		result.typeBounds().addAll(
@@ -214,7 +211,7 @@
 		if (visitChildren) {
 			// visit children in normal left to right reading order
 			if (this.ast.apiLevel >= AST.JLS8) {
-				acceptChildren(visitor, this.annotations);
+				acceptChildren(visitor, this.modifiers);
 			}
 			acceptChild(visitor, getName());
 			acceptChildren(visitor, this.typeBounds);
@@ -291,19 +288,19 @@
 	}
 	
 	/**
-	 * Returns the live ordered list of annotations for this TypeParameter node (added in JLS8 API).
+	 * Returns the live ordered list of modifiers for this TypeParameter node (added in JLS8 API).
 	 *
-	 * @return the live list of annotations (element type: {@link Annotation})
+	 * @return the live list of modifiers (element type: {@link IExtendedModifier})
 	 * @exception UnsupportedOperationException if this operation is used
 	 *            in a JLS2, JLS3 or JLS4 AST
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
-	public List annotations() {
+	public List modifiers() {
 		// more efficient than just calling unsupportedIn2_3_4() to check
-		if (this.annotations == null) {
+		if (this.modifiers == null) {
 			unsupportedIn2_3_4();
 		}
-		return this.annotations;
+		return this.modifiers;
 	}
 
 	/* (omit javadoc for this method)
@@ -320,7 +317,7 @@
 	int treeSize() {
 		return
 			memSize()
-			+ (this.annotations == null ? 0 : this.annotations.listSize())
+			+ (this.modifiers == null ? 0 : this.modifiers.listSize())
 			+ (this.typeVariableName == null ? 0 : getName().treeSize())
 			+ this.typeBounds.listSize();
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/UnionType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/UnionType.java
index c85fd01..e3a23cb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/UnionType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/UnionType.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
@@ -27,6 +27,7 @@
  * @since 3.7.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class UnionType extends Type {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableBinding.java
index dfcb939..a3372fc 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/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
@@ -417,6 +417,14 @@
 	}
 
 	/*
+	 * (non-Javadoc)
+	 * @see org.aspectj.org.eclipse.jdt.core.dom.IVariableBinding.isEffectivelyFinal()
+	 */
+	public boolean isEffectivelyFinal() {
+		return (!this.binding.isFinal() && this.binding.isEffectivelyFinal());
+	}
+
+	/*
 	 * For debugging purpose only.
 	 * @see java.lang.Object#toString()
 	 */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclaration.java
index adad9bc..ee942d2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclaration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -28,6 +28,7 @@
  * @see VariableDeclarationFragment
  * @since 2.0
  */
+@SuppressWarnings({"rawtypes"})
 public abstract class VariableDeclaration extends ASTNode {
 
 	/**
@@ -47,11 +48,11 @@
 
 	/**
 	 * List of extra dimensions this node has with optional annotations
-	 * (element type: {@link ExtraDimension}).
+	 * (element type: {@link Dimension}).
 	 * Null before JLS8. Added in JLS8; defaults to an empty list
 	 * (see constructor).
 	 * 
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	ASTNode.NodeList extraDimensions = null;
 
@@ -84,12 +85,12 @@
 	
 	/**
 	 * Creates and returns a structural property descriptor for the
-	 * "extraDimensions2" property declared on the given concrete node type (element type: {@link ExtraDimension}).
+	 * "extraDimensions2" property declared on the given concrete node type (element type: {@link Dimension}).
 	 *
 	 * @return the property descriptor
 	 */
 	static final ChildListPropertyDescriptor internalExtraDimensions2PropertyFactory(Class nodeClass) {
-		return 	new ChildListPropertyDescriptor(nodeClass, "extraDimensions2", ExtraDimension.class, CYCLE_RISK); //$NON-NLS-1$
+		return 	new ChildListPropertyDescriptor(nodeClass, "extraDimensions2", Dimension.class, CYCLE_RISK); //$NON-NLS-1$
 	}
 	
 	/**
@@ -147,19 +148,19 @@
 
 	/**
 	 * Returns the structural property descriptor for the "extraDimensions" property
-	 * of this node (element type: {@link ExtraDimension}) (added in JLS8 API).
+	 * of this node (element type: {@link Dimension}) (added in JLS8 API).
 	 *
 	 * @return the property descriptor
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	abstract ChildListPropertyDescriptor internalExtraDimensions2Property();
 	
 	/**
 	 * Returns the structural property descriptor for the "extraDimensions" property
-	 * of this node (element type: {@link ExtraDimension}) (added in JLS8 API).
+	 * of this node (element type: {@link Dimension}) (added in JLS8 API).
 	 *
 	 * @return the property descriptor
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public final ChildListPropertyDescriptor getExtraDimensions2Property() {
 		return internalExtraDimensions2Property();
@@ -288,7 +289,7 @@
 	 * @exception UnsupportedOperationException if this operation is used in
 	 * a JLS8 or later AST 
 	 * @deprecated In the JLS8 API, this method is replaced by
-	 * {@link #extraDimensions()} which contains a list of {@link ExtraDimension} nodes.
+	 * {@link #extraDimensions()} which contains a list of {@link Dimension} nodes.
 	 * @since 2.1
 	 */
 	public void setExtraDimensions(int dimensions) {
@@ -298,7 +299,7 @@
 	/**
 	 * Internal synonym for deprecated method. Used to avoid
 	 * deprecation warnings.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	final void internalSetExtraDimensions(int dimensions) {
 		// more efficient than just calling supportedOnlyIn2_3_4() to check
@@ -317,9 +318,9 @@
 	/**
 	 * Returns the live ordered list of extra dimensions with optional annotations (added in JLS8 API).
 	 *
-	 * @return the live list of extra dimensions with optional annotations (element type: {@link ExtraDimension})
+	 * @return the live list of extra dimensions with optional annotations (element type: {@link Dimension})
 	 * @exception UnsupportedOperationException if this operation is used below JLS8
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public List extraDimensions() {
 		// more efficient than just calling unsupportedIn2_3_4() to check
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationExpression.java
index 05ed02a..e65fee2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationExpression.java
@@ -34,6 +34,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class VariableDeclarationExpression extends Expression {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationFragment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationFragment.java
index 739ca7b..ccd4c4c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationFragment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationFragment.java
@@ -16,18 +16,20 @@
 
 /**
  * Variable declaration fragment AST node type, used in field declarations,
- * local variable declarations, and <code>ForStatement</code> initializers.
+ * local variable declarations, <code>ForStatement</code> initializers,
+ * and <code>LambdaExpression</code> parameters.
  * In contrast to <code>SingleVariableDeclaration</code>, fragments are
- * missing the modifiers and the type; these are located in the fragment's
- * parent node.
+ * missing the modifiers and the type; these are either located in the fragment's
+ * parent node, or inferred (for lambda parameters).
  *
  * <pre>
  * VariableDeclarationFragment:
- *    Identifier { ExtraDimension } [ <b>=</b> Expression ]
+ *    Identifier { Dimension } [ <b>=</b> Expression ]
  * </pre>
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class VariableDeclarationFragment extends VariableDeclaration {
 
 	/**
@@ -47,8 +49,8 @@
 			internalExtraDimensionsPropertyFactory(VariableDeclarationFragment.class);
 
 	/**
-	 * The "extraDimensions2" structural property of this node type (element type: {@link ExtraDimension}) (added in JLS8 API).
-	 * @since 3.9 BETA_JAVA8
+	 * The "extraDimensions2" structural property of this node type (element type: {@link Dimension}) (added in JLS8 API).
+	 * @since 3.10
 	 */
 	public static final ChildListPropertyDescriptor EXTRA_DIMENSIONS2_PROPERTY =
 			internalExtraDimensions2PropertyFactory(VariableDeclarationFragment.class);
@@ -72,7 +74,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static final List PROPERTY_DESCRIPTORS_8_0;
 
@@ -142,7 +144,7 @@
 
 	/* (omit javadoc for this method)
 	 * Method declared on VariableDeclaration.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	final ChildListPropertyDescriptor internalExtraDimensions2Property() {
 		return EXTRA_DIMENSIONS2_PROPERTY;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationStatement.java
index c80bfb7..9a1e9f8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/VariableDeclarationStatement.java
@@ -37,6 +37,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class VariableDeclarationStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/WhileStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/WhileStatement.java
index dd9729e..650d93c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/WhileStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/WhileStatement.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
@@ -25,6 +25,7 @@
  * @since 2.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class WhileStatement extends Statement {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/WildcardType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/WildcardType.java
index aa7f323..5872e96 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/WildcardType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/WildcardType.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2013 IBM Corporation and others.
+ * Copyright (c) 2003, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -33,11 +29,12 @@
  * @since 3.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public class WildcardType extends AnnotatableType {
 
 	/**
 	 * The "annotations" structural property of this node type (element type: {@link Annotation}).
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final ChildListPropertyDescriptor ANNOTATIONS_PROPERTY =
 			internalAnnotationsPropertyFactory(WildcardType.class);
@@ -64,7 +61,7 @@
 	 * A list of property descriptors (element type:
 	 * {@link StructuralPropertyDescriptor}),
 	 * or null if uninitialized.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static final List PROPERTY_DESCRIPTORS_8_0;
 
@@ -133,7 +130,7 @@
 
 	/* (omit javadoc for this method)
 	 * Method declared on AnnotatableType.
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	final ChildListPropertyDescriptor internalAnnotationsProperty() {
 		return ANNOTATIONS_PROPERTY;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java
index dd2ae43..74bc38e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java
@@ -54,9 +54,7 @@
  * several alternate sets of changes on the same AST (e.g., for calculating
  * quick fix proposals). The rewrite infrastructure tries to generate minimal
  * text changes, preserve existing comments and indentation, and follow code
- * formatter settings. If the freedom to explore multiple alternate changes is
- * not required, consider using the AST's built-in rewriter
- * (see {@link org.aspectj.org.eclipse.jdt.core.dom.CompilationUnit#rewrite(IDocument, Map)}).
+ * formatter settings.
  * <p>
  * The following code snippet illustrated usage of this class:
  * </p>
@@ -87,12 +85,18 @@
  * // are new source range for "class X {}" in document.get()
  * </pre>
  * <p>
+ * If you are sure never have to explore multiple alternate changes and you never need
+ * to create {@link #createCopyTarget(ASTNode) copies} or {@link #createStringPlaceholder(String, int) string placeholders},
+ * then you can also try {@link CompilationUnit#recordModifications()} instead.
+ * </p>
+ * <p>
  * This class is not intended to be subclassed.
  * </p>
  * @since 3.0
  * @noinstantiate This class is not intended to be instantiated by clients.
  * @noextend This class is not intended to be subclassed by clients.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class ASTRewrite {
 	/** root node for the rewrite: Only nodes under this root are accepted */
 	private final AST ast;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java
index 28a992d..917c92d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -58,6 +58,7 @@
  * </p>
  * @since 3.2
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public final class ImportRewrite {
 
 	/**
@@ -407,6 +408,66 @@
 		}
 		return ImportRewriteContext.RES_NAME_UNKNOWN;
 	}
+
+	/**
+	 * Adds the necessary imports for the given annotation binding to the rewriter's record
+	 * and returns an {@link Annotation} that can be used in the code.
+	 * <p>
+	 * No imports are added for types that are already known. If an import for a type is recorded to be removed, this record is discarded instead.
+	 * </p>
+	 * <p>
+	 * The content of the compilation unit itself is actually not modified
+	 * in any way by this method; rather, the rewriter just records newly added imports.
+	 * </p>
+	 * @param annotation the annotation to be added
+	 * @param ast the AST to create the returned annotation for
+	 * @param context an optional context that knows about types visible in the current scope or <code>null</code>
+	 * to use the default context (only using the available imports)
+	 * @return an annotation node. The returned annotation contains unqualified type names where
+	 * an import could be added or was already known. Type names are fully qualified if an import conflict prevented an import.
+	 * 
+	 * @since 3.10
+	 */
+	public Annotation addAnnotation(IAnnotationBinding annotation, AST ast, ImportRewriteContext context) {
+		Type type = addImport(annotation.getAnnotationType(), ast, context);
+		Name name;
+		if (type instanceof SimpleType) {
+			SimpleType simpleType = (SimpleType) type;
+			name = simpleType.getName();
+			// cut 'name' loose from its parent, so that it can be reused
+			simpleType.setName(ast.newName("a")); //$NON-NLS-1$
+		} else {
+			name = ast.newName("invalid"); //$NON-NLS-1$
+		}
+
+		IMemberValuePairBinding[] mvps= annotation.getDeclaredMemberValuePairs();
+		if (mvps.length == 0) {
+			MarkerAnnotation result = ast.newMarkerAnnotation();
+			result.setTypeName(name);
+			return result;
+		} else if (mvps.length == 1 && "value".equals(mvps[0].getName())) { //$NON-NLS-1$
+			SingleMemberAnnotation result= ast.newSingleMemberAnnotation();
+			result.setTypeName(name);
+			Object value = mvps[0].getValue();
+			if (value != null)
+				result.setValue(addAnnotation(ast, value, context));
+			return result;
+		} else {
+			NormalAnnotation result = ast.newNormalAnnotation();
+			result.setTypeName(name);
+			for (int i= 0; i < mvps.length; i++) {
+				IMemberValuePairBinding mvp = mvps[i];
+				MemberValuePair mvpNode = ast.newMemberValuePair();
+				mvpNode.setName(ast.newSimpleName(mvp.getName()));
+				Object value = mvp.getValue();
+				if (value != null)
+					mvpNode.setValue(addAnnotation(ast, value, context));
+				result.values().add(mvpNode);
+			}
+			return result;
+		}
+	}
+
 	/**
 	 * Adds a new import to the rewriter's record and returns a {@link Type} node that can be used
 	 * in the code as a reference to the type. The type binding can be an array binding, type variable or wildcard.
@@ -422,8 +483,8 @@
 	 * </p>
 	 * @param typeSig the signature of the type to be added.
 	 * @param ast the AST to create the returned type for.
-	 * @return returns a type to which the type binding can be assigned to. The returned type contains is unqualified
-	 * when an import could be added or was already known. It is fully qualified, if an import conflict prevented the import.
+	 * @return a type node for the given type signature. Type names are simple names if an import could be used,
+	 * or else qualified names if an import conflict prevented an import.
 	 */
 	public Type addImportFromSignature(String typeSig, AST ast) {
 		return addImportFromSignature(typeSig, ast, this.defaultContext);
@@ -446,8 +507,8 @@
 	 * @param ast the AST to create the returned type for.
 	 * @param context an optional context that knows about types visible in the current scope or <code>null</code>
 	 * to use the default context only using the available imports.
-	 * @return returns a type to which the type binding can be assigned to. The returned type contains is unqualified
-	 * when an import could be added or was already known. It is fully qualified, if an import conflict prevented the import.
+	 * @return a type node for the given type signature. Type names are simple names if an import could be used,
+	 * or else qualified names if an import conflict prevented an import.
 	 */
 	public Type addImportFromSignature(String typeSig, AST ast, ImportRewriteContext context) {
 		if (typeSig == null || typeSig.length() == 0) {
@@ -507,7 +568,7 @@
 	 * in the code. The type binding can be an array binding, type variable or wildcard.
 	 * If the binding is a generic type, the type parameters are ignored. For parameterized types, also the type
 	 * arguments are processed and imports added if necessary. Anonymous types inside type arguments are normalized to their base type, wildcard
-	 * of wildcards are ignored.
+	 * of wildcards are ignored. Type annotations are ignored.
 	 * 	<p>
  	 * No imports are added for types that are already known. If a import for a type is recorded to be removed, this record is discarded instead.
 	 * </p>
@@ -516,8 +577,8 @@
 	 * in any way by this method; rather, the rewriter just records that a new import has been added.
 	 * </p>
 	 * @param binding the signature of the type to be added.
-	 * @return returns a type to which the type binding can be assigned to. The returned type contains is unqualified
-	 * when an import could be added or was already known. It is fully qualified, if an import conflict prevented the import.
+	 * @return a type reference for the given type binding. Type names are simple names if an import could be used,
+	 * or else qualified names if an import conflict prevented an import.
 	 */
 	public String addImport(ITypeBinding binding) {
 		return addImport(binding, this.defaultContext);
@@ -528,7 +589,7 @@
 	 * in the code. The type binding can be an array binding, type variable or wildcard.
 	 * If the binding is a generic type, the type parameters are ignored. For parameterized types, also the type
 	 * arguments are processed and imports added if necessary. Anonymous types inside type arguments are normalized to their base type, wildcard
-	 * of wildcards are ignored.
+	 * of wildcards are ignored. Type annotations are ignored.
 	 * 	<p>
  	 * No imports are added for types that are already known. If a import for a type is recorded to be removed, this record is discarded instead.
 	 * </p>
@@ -539,8 +600,8 @@
 	 * @param binding the signature of the type to be added.
 	 * @param context an optional context that knows about types visible in the current scope or <code>null</code>
 	 * to use the default context only using the available imports.
-	 * @return returns a type to which the type binding can be assigned to. The returned type contains is unqualified
-	 * when an import could be added or was already known. It is fully qualified, if an import conflict prevented the import.
+	 * @return a type reference for the given type binding. Type names are simple names if an import could be used,
+	 * or else qualified names if an import conflict prevented an import.
 	 */
 	public String addImport(ITypeBinding binding, ImportRewriteContext context) {
 		if (binding.isPrimitive() || binding.isTypeVariable() || binding.isRecovered()) {
@@ -651,7 +712,8 @@
 	 * in the code. The type binding can be an array binding, type variable or wildcard.
 	 * If the binding is a generic type, the type parameters are ignored. For parameterized types, also the type
 	 * arguments are processed and imports added if necessary. Anonymous types inside type arguments are normalized to their base type, wildcard
-	 * of wildcards are ignored.
+	 * of wildcards are ignored. If type annotations or type arguments are present at any point, the import is added up to that point and 
+	 * the type is retained from that point with type annotations and type arguments.
 	 * 	<p>
  	 * No imports are added for types that are already known. If a import for a type is recorded to be removed, this record is discarded instead.
 	 * </p>
@@ -661,8 +723,8 @@
 	 * </p>
 	 * @param binding the signature of the type to be added.
 	 * @param ast the AST to create the returned type for.
-	 * @return returns a type to which the type binding can be assigned to. The returned type contains is unqualified
-	 * when an import could be added or was already known. It is fully qualified, if an import conflict prevented the import.
+	 * @return a type node for the given type binding. Type names are simple names if an import could be used,
+	 * or else qualified names if an import conflict prevented an import.
 	 */
 	public Type addImport(ITypeBinding binding, AST ast) {
 		return addImport(binding, ast, this.defaultContext);
@@ -673,7 +735,8 @@
 	 * in the code. The type binding can be an array binding, type variable or wildcard.
 	 * If the binding is a generic type, the type parameters are ignored. For parameterized types, also the type
 	 * arguments are processed and imports added if necessary. Anonymous types inside type arguments are normalized to their base type, wildcard
-	 * of wildcards are ignored.
+	 * of wildcards are ignored. If type annotations or type arguments are present at any point, the import is added up to that point and 
+	 * the type is retained from that point with type annotations and type arguments
 	 * 	<p>
  	 * No imports are added for types that are already known. If a import for a type is recorded to be removed, this record is discarded instead.
 	 * </p>
@@ -685,63 +748,18 @@
 	 * @param ast the AST to create the returned type for.
 	 * @param context an optional context that knows about types visible in the current scope or <code>null</code>
 	 * to use the default context only using the available imports.
-	 * @return returns a type to which the type binding can be assigned to. The returned type contains is unqualified
-	 * when an import could be added or was already known. It is fully qualified, if an import conflict prevented the import.
+	 * @return a type node for the given type binding. Type names are simple names if an import could be used,
+	 * or else qualified names if an import conflict prevented an import.
 	 */
 	public Type addImport(ITypeBinding binding, AST ast, ImportRewriteContext context) {
-		if (binding.isPrimitive()) {
-			return ast.newPrimitiveType(PrimitiveType.toCode(binding.getName()));
+		ITypeBinding bindingPoint = checkAnnotationAndGenerics(binding);
+		Type type = internalAddImport(bindingPoint == null ? binding : bindingPoint, ast, context, null, /* getBase */ true);
+		if (bindingPoint != null && !bindingPoint.equals(binding)) {
+			type = buildType(binding, bindingPoint, ast, context, type);
 		}
-
-		ITypeBinding normalizedBinding= normalizeTypeBinding(binding);
-		if (normalizedBinding == null) {
-			return ast.newSimpleType(ast.newSimpleName("invalid")); //$NON-NLS-1$
-		}
-
-		if (normalizedBinding.isTypeVariable()) {
-			// no import
-			return ast.newSimpleType(ast.newSimpleName(binding.getName()));
-		}
-		if (normalizedBinding.isWildcardType()) {
-			WildcardType wcType= ast.newWildcardType();
-			ITypeBinding bound= normalizedBinding.getBound();
-			if (bound != null && !bound.isWildcardType() && !bound.isCapture()) { // bug 96942
-				Type boundType= addImport(bound, ast, context);
-				wcType.setBound(boundType, normalizedBinding.isUpperbound());
-			}
-			return wcType;
-		}
-
-		if (normalizedBinding.isArray()) {
-			Type elementType= addImport(normalizedBinding.getElementType(), ast, context);
-			return ast.newArrayType(elementType, normalizedBinding.getDimensions());
-		}
-
-		String qualifiedName= getRawQualifiedName(normalizedBinding);
-		if (qualifiedName.length() > 0) {
-			String res= internalAddImport(qualifiedName, context);
-
-			ITypeBinding[] typeArguments= normalizedBinding.getTypeArguments();
-			if (typeArguments.length > 0) {
-				Type erasureType= ast.newSimpleType(ast.newName(res));
-				ParameterizedType paramType= ast.newParameterizedType(erasureType);
-				List arguments= paramType.typeArguments();
-				for (int i= 0; i < typeArguments.length; i++) {
-					ITypeBinding curr= typeArguments[i];
-					if (containsNestedCapture(curr, false)) { // see bug 103044
-						arguments.add(ast.newWildcardType());
-					} else {
-						arguments.add(addImport(curr, ast, context));
-					}
-				}
-				return paramType;
-			}
-			return ast.newSimpleType(ast.newName(res));
-		}
-		return ast.newSimpleType(ast.newName(getRawName(normalizedBinding)));
+		return type;
 	}
 
-
 	/**
 	 * Adds a new import to the rewriter's record and returns a type reference that can be used
 	 * in the code. The type binding can only be an array or non-generic type.
@@ -755,8 +773,8 @@
 	 * @param qualifiedTypeName the qualified type name of the type to be added
 	 * @param context an optional context that knows about types visible in the current scope or <code>null</code>
 	 * to use the default context only using the available imports.
-	 * @return returns a type to which the type binding can be assigned to. The returned type contains is unqualified
-	 * when an import could be added or was already known. It is fully qualified, if an import conflict prevented the import.
+	 * @return a type reference for the given qualified type name. The type name is a simple name if an import could be used,
+	 * or else a qualified name if an import conflict prevented an import.
 	 */
 	public String addImport(String qualifiedTypeName, ImportRewriteContext context) {
 		int angleBracketOffset= qualifiedTypeName.indexOf('<');
@@ -781,17 +799,16 @@
 	 * in any way by this method; rather, the rewriter just records that a new import has been added.
 	 * </p>
 	 * @param qualifiedTypeName the qualified type name of the type to be added
-	 * @return returns a type to which the type binding can be assigned to. The returned type contains is unqualified
-	 * when an import could be added or was already known. It is fully qualified, if an import conflict prevented the import.
+	 * @return a type reference for the given qualified type name. The type name is a simple name if an import could be used,
+	 * or else a qualified name if an import conflict prevented an import.
 	 */
 	public String addImport(String qualifiedTypeName) {
 		return addImport(qualifiedTypeName, this.defaultContext);
 	}
 
 	/**
-	 * Adds a new static import to the rewriter's record and returns a reference that can be used in the code. The reference will
-	 * be fully qualified if an import conflict prevented the import or unqualified if the import succeeded or was already
-	 * existing.
+	 * Adds a new static import to the rewriter's record and returns a name - single member name if
+	 * import is successful, else qualified name.
 	 * 	<p>
  	 * No imports are added for members that are already known. If a import for a type is recorded to be removed, this record is discarded instead.
 	 * </p>
@@ -800,8 +817,8 @@
 	 * in any way by this method; rather, the rewriter just records that a new import has been added.
 	 * </p>
 	 * @param binding The binding of the static field or method to be added.
-	 * @return returns either the simple member name if the import was successful or else the qualified name if
-	 * an import conflict prevented the import.
+	 * @return either the simple member name if the import was successful or else the qualified name if
+	 * an import conflict prevented the import
 	 * @throws IllegalArgumentException an {@link IllegalArgumentException} is thrown if the binding is not a static field
 	 * or method.
 	 */
@@ -810,9 +827,8 @@
 	}
 
 	/**
-	 * Adds a new static import to the rewriter's record and returns a reference that can be used in the code. The reference will
-	 * be fully qualified if an import conflict prevented the import or unqualified if the import succeeded or was already
-	 * existing.
+	 * Adds a new static import to the rewriter's record and returns a name - single member name if
+	 * import is successful, else qualified name.
 	 * 	<p>
  	 * No imports are added for members that are already known. If a import for a type is recorded to be removed, this record is discarded instead.
 	 * </p>
@@ -823,8 +839,8 @@
 	 * @param binding The binding of the static field or method to be added.
 	 * @param context an optional context that knows about members visible in the current scope or <code>null</code>
 	 * to use the default context only using the available imports.
-	 * @return returns either the simple member name if the import was successful or else the qualified name if
-	 * an import conflict prevented the import.
+	 * @return either the simple member name if the import was successful or else the qualified name if
+	 * an import conflict prevented the import
 	 * @throws IllegalArgumentException an {@link IllegalArgumentException} is thrown if the binding is not a static field
 	 * or method.
 	 */
@@ -845,9 +861,8 @@
 	}
 
 	/**
-	 * Adds a new static import to the rewriter's record and returns a reference that can be used in the code. The reference will
-	 * be fully qualified if an import conflict prevented the import or unqualified if the import succeeded or was already
-	 * existing.
+	 * Adds a new static import to the rewriter's record and returns a name - single member name if
+	 * import is successful, else qualified name.
 	 * 	<p>
  	 * No imports are added for members that are already known. If a import for a type is recorded to be removed, this record is discarded instead.
 	 * </p>
@@ -859,17 +874,16 @@
 	 * @param simpleName the simple name of the member; either a field or a method name.
 	 * @param isField <code>true</code> specifies that the member is a field, <code>false</code> if it is a
 	 * method.
-	 * @return returns either the simple member name if the import was successful or else the qualified name if
-	 * an import conflict prevented the import.
+	 * @return either the simple member name if the import was successful or else the qualified name if
+	 * an import conflict prevented the import
 	 */
 	public String addStaticImport(String declaringTypeName, String simpleName, boolean isField) {
 		return addStaticImport(declaringTypeName, simpleName, isField, this.defaultContext);
 	}
 
 	/**
-	 * Adds a new static import to the rewriter's record and returns a reference that can be used in the code. The reference will
-	 * be fully qualified if an import conflict prevented the import or unqualified if the import succeeded or was already
-	 * existing.
+	 * Adds a new static import to the rewriter's record and returns a name - single member name if
+	 * import is successful, else qualified name.
 	 * 	<p>
  	 * No imports are added for members that are already known. If a import for a type is recorded to be removed, this record is discarded instead.
 	 * </p>
@@ -883,8 +897,8 @@
 	 * method.
 	 * @param context an optional context that knows about members visible in the current scope or <code>null</code>
 	 * to use the default context only using the available imports.
-	 * @return returns either the simple member name if the import was successful or else the qualified name if
-	 * an import conflict prevented the import.
+	 * @return either the simple member name if the import was successful or else the qualified name if
+	 * an import conflict prevented the import
 	 */
 	public String addStaticImport(String declaringTypeName, String simpleName, boolean isField, ImportRewriteContext context) {
 		String key = declaringTypeName + '.' + simpleName;
@@ -1158,4 +1172,196 @@
 		return (String[]) res.toArray(new String[res.size()]);
 	}
 
+	private void annotateList(List annotations, IAnnotationBinding [] annotationBindings, AST ast, ImportRewriteContext context) {
+		for (int i = 0; i< annotationBindings.length; i++) {
+			Annotation annotation = addAnnotation(annotationBindings[i], ast, context);
+			if (annotation != null) annotations.add(annotation);
+		}
+	}
+
+	private Type annotateType(ITypeBinding binding, AST ast, ImportRewriteContext context, Type type) {
+		IAnnotationBinding [] annotationBindings = binding.getTypeAnnotations();
+		if (annotationBindings != null && annotationBindings.length > 0 && type instanceof AnnotatableType) {
+			annotateList(((AnnotatableType) type).annotations(), annotationBindings, ast, context);
+		}
+		return type;
+	}
+
+	private Type buildType(ITypeBinding binding, ITypeBinding bindingPoint, AST ast, ImportRewriteContext context, Type qualifier) {
+		if (binding.equals(bindingPoint)) {
+			return qualifier;
+		}
+		// build the type recursively from left to right
+		Type type = binding.isMember() ? buildType(binding.getDeclaringClass(), bindingPoint, ast, context, qualifier) : null;
+		type = internalAddImport(binding, ast, context, type, false);
+		return type;
+	}
+
+	private ITypeBinding checkAnnotationAndGenerics(ITypeBinding binding) {
+		ITypeBinding bindingPoint = null;
+		while (binding != null) {
+			IAnnotationBinding annotationBinding [] = binding.getTypeAnnotations();
+			ITypeBinding []  typeArguments = binding.getTypeArguments();
+			if ((annotationBinding != null && annotationBinding.length > 0) ||
+					(typeArguments != null && typeArguments.length > 0)) {
+				bindingPoint = binding;
+			}
+			if (binding.isMember()) {
+				binding = binding.getDeclaringClass();
+			} else {
+				break;
+			}
+		}
+		return bindingPoint;
+	}
+
+	private Type createBaseType(AST ast, ImportRewriteContext context, ITypeBinding normalizedBinding) {
+		Type type;
+		IAnnotationBinding annotationBinding [] = normalizedBinding.getTypeAnnotations();
+		boolean annotsPresent = annotationBinding != null && annotationBinding.length > 0;
+
+		String qualifiedName= getRawQualifiedName(normalizedBinding);
+		String res = qualifiedName.length() > 0 ? internalAddImport(qualifiedName, context) : getRawName(normalizedBinding);
+	
+		if (annotsPresent) {
+			int dotIndex = res != null ? res.lastIndexOf('.') : -1;
+			if (dotIndex > 0) {
+				Name nameQualifier = ast.newName(res.substring(0, dotIndex));
+				SimpleName simpleName = ast.newSimpleName(res.substring(dotIndex + 1));
+				type = ast.newNameQualifiedType(nameQualifier, simpleName);
+			} else {
+				type = ast.newSimpleType(ast.newName(res));
+			}
+			annotateList(((AnnotatableType) type).annotations(), annotationBinding, ast, context);
+		} else {
+			type = ast.newSimpleType(ast.newName(res));
+		}
+		return type;
+	}
+
+	private Type getArrayType(Type elementType, AST ast, ImportRewriteContext context, ITypeBinding normalizedBinding) {
+		int noDimensions = normalizedBinding.getDimensions();
+		ArrayType arrayType = ast.newArrayType(elementType, noDimensions);
+		if (ast.apiLevel() >= AST.JLS8) {
+			for (int i = 0; i < noDimensions; i++) {
+				IAnnotationBinding[] typeAnnotations = normalizedBinding.getTypeAnnotations();
+				if (typeAnnotations.length > 0) {
+					Dimension dimension = (Dimension) arrayType.dimensions().get(i);
+					annotateList(dimension.annotations(), typeAnnotations, ast, context);
+				}
+				normalizedBinding = normalizedBinding.getComponentType();
+			}
+		}
+		return arrayType;
+	}
+
+	private Type internalAddImport(ITypeBinding binding, AST ast, ImportRewriteContext context, Type currentType, boolean getBase) {
+		Type type = null;
+		ITypeBinding normalizedBinding = null;
+		
+		if (binding.isPrimitive()) {
+			type = ast.newPrimitiveType(PrimitiveType.toCode(binding.getName()));
+			normalizedBinding= binding;
+		} else {
+			normalizedBinding= normalizeTypeBinding(binding);
+			if (normalizedBinding == null) {
+				type = ast.newSimpleType(ast.newSimpleName("invalid")); //$NON-NLS-1$
+			} else if (normalizedBinding.isTypeVariable()) {
+					// no import
+				type = ast.newSimpleType(ast.newSimpleName(binding.getName()));
+			} else if (normalizedBinding.isWildcardType()) {
+				WildcardType wcType= ast.newWildcardType();
+				ITypeBinding bound= normalizedBinding.getBound();
+				if (bound != null && !bound.isWildcardType() && !bound.isCapture()) { // bug 96942
+					Type boundType= addImport(bound, ast, context);
+					wcType.setBound(boundType, normalizedBinding.isUpperbound());
+				}
+				type = wcType;
+			} else if (normalizedBinding.isArray()) {
+				Type elementType= addImport(normalizedBinding.getElementType(), ast, context);
+				type = getArrayType(elementType, ast, context, normalizedBinding);
+			}
+		}
+
+		if (type != null) {
+			return annotateType(normalizedBinding, ast, context, type);
+		}
+
+		if (getBase) {
+			type = createBaseType(ast, context, normalizedBinding);
+		} else  {
+			type = currentType != null ? (Type) ast.newQualifiedType(currentType, ast.newSimpleName(getRawName(normalizedBinding))) : 
+				ast.newSimpleType(ast.newName(getRawName(normalizedBinding)));
+			type = annotateType(normalizedBinding, ast, context, type);
+		}
+
+		ITypeBinding[] typeArguments = normalizedBinding.getTypeArguments();
+		if (typeArguments.length > 0) {
+			ParameterizedType paramType = ast.newParameterizedType(type);
+			List arguments = paramType.typeArguments();
+			for (int i = 0; i < typeArguments.length; i++) {
+				ITypeBinding curr = typeArguments[i];
+				if (containsNestedCapture(curr, false)) { // see bug 103044
+					arguments.add(ast.newWildcardType());
+				} else {
+					arguments.add(addImport(curr, ast, context));
+				}
+			}
+			type = paramType;
+		}
+		return type;
+	}
+
+	private Expression addAnnotation(AST ast, Object value, ImportRewriteContext context) {
+		if (value instanceof Boolean) {
+			return ast.newBooleanLiteral(((Boolean) value).booleanValue());
+		} else if (value instanceof Byte || value instanceof Short || value instanceof Integer || value instanceof Long
+				|| value instanceof Float || value instanceof Double) {
+			return ast.newNumberLiteral(value.toString());
+		} else if (value instanceof Character) {
+			CharacterLiteral result = ast.newCharacterLiteral();
+			result.setCharValue(((Character) value).charValue());
+			return result;
+		} else if (value instanceof ITypeBinding) {
+			TypeLiteral result = ast.newTypeLiteral();
+			result.setType(addImport((ITypeBinding) value, ast, context));
+			return result;
+		} else if (value instanceof String) {
+			StringLiteral result = ast.newStringLiteral();
+			result.setLiteralValue((String) value);
+			return result;
+		} else if (value instanceof IVariableBinding) {
+			IVariableBinding variable = (IVariableBinding) value;
+
+			FieldAccess result = ast.newFieldAccess();
+			result.setName(ast.newSimpleName(variable.getName()));
+			Type type = addImport(variable.getType(), ast, context);
+			Name name;
+			if (type instanceof SimpleType) {
+				SimpleType simpleType = (SimpleType) type;
+				name = simpleType.getName();
+				// cut 'name' loose from its parent, so that it can be reused
+				simpleType.setName(ast.newSimpleName("a")); //$NON-NLS-1$
+			} else {
+				name = ast.newName("invalid"); //$NON-NLS-1$
+			}
+			result.setExpression(name);
+			return result;
+		} else if (value instanceof IAnnotationBinding) {
+			return addAnnotation((IAnnotationBinding) value, ast, context);
+		} else if (value instanceof Object[]) {
+			Object[] values = (Object[]) value;
+			if (values.length == 1)
+				return addAnnotation(ast, values[0], context);
+
+			ArrayInitializer initializer = ast.newArrayInitializer();
+			List expressions = initializer.expressions();
+			int size = values.length;
+			for (int i = 0; i < size; i++)
+				expressions.add(addAnnotation(ast, values[i], context));
+			return initializer;
+		} else {
+			return null;
+		}
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ListRewrite.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ListRewrite.java
index 620f7d0..a083928 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ListRewrite.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/dom/rewrite/ListRewrite.java
@@ -34,6 +34,7 @@
  * @see ASTRewrite#getListRewrite(ASTNode, ChildListPropertyDescriptor)
  * @since 3.0
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public final class ListRewrite {
 
 	private ASTNode parent;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication.java
index 6893e24..a80ce1d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/CodeFormatterApplication.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- *  Copyright (c) 2005, 2011 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
@@ -50,6 +50,7 @@
  * @noinstantiate This class is not intended to be instantiated by clients.
  * @noextend This class is not intended to be subclassed by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class CodeFormatterApplication implements IApplication {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.java
index 7314cc9..bc96071 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation  - initial API and implementation
  *     Brock Janiczak   - Contribution for bug 150741
@@ -31,6 +27,7 @@
  * @noinstantiate This class is not intended to be instantiated by clients.
  * @noextend This class is not intended to be subclassed by clients.
  */
+@SuppressWarnings("rawtypes")
 public class DefaultCodeFormatterConstants {
 
 	/**
@@ -624,7 +621,7 @@
 	 * @see #NEXT_LINE
 	 * @see #NEXT_LINE_SHIFTED
 	 * @see #NEXT_LINE_ON_WRAP
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final String FORMATTER_BRACE_POSITION_FOR_LAMBDA_BODY = JavaCore.PLUGIN_ID + ".formatter.brace_position_for_lambda_body";	//$NON-NLS-1$
 
@@ -1407,6 +1404,18 @@
 
 	/**
 	 * <pre>
+	 * FORMATTER / Option to insert a new line after a type annotation
+	 *     - option id:         "org.aspectj.org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation"
+	 *     - possible values:   { INSERT, DO_NOT_INSERT }
+	 *     - default:           DO_NOT_INSERT
+	 * </pre>
+	 * @see JavaCore#INSERT
+	 * @see JavaCore#DO_NOT_INSERT
+	 * @since 3.10
+	 */
+	public static final String FORMATTER_INSERT_NEW_LINE_AFTER_TYPE_ANNOTATION = JavaCore.PLUGIN_ID + ".formatter.insert_new_line_after_type_annotation";//$NON-NLS-1$
+	/**
+	 * <pre>
 	 * FORMATTER / Option to insert a new line after an annotation on a parameter
 	 *     - option id:         "org.aspectj.org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter"
 	 *     - possible values:   { INSERT, DO_NOT_INSERT }
@@ -2030,7 +2039,7 @@
 	 * </pre>
 	 * @see JavaCore#INSERT
 	 * @see JavaCore#DO_NOT_INSERT
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final String FORMATTER_INSERT_SPACE_AFTER_LAMBDA_ARROW  = JavaCore.PLUGIN_ID + ".formatter.insert_space_after_lambda_arrow";	//$NON-NLS-1$
 	/**
@@ -2967,7 +2976,7 @@
 	 * </pre>
 	 * @see JavaCore#INSERT
 	 * @see JavaCore#DO_NOT_INSERT
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public static final String FORMATTER_INSERT_SPACE_BEFORE_LAMBDA_ARROW = JavaCore.PLUGIN_ID + ".formatter.insert_space_before_lambda_arrow";	//$NON-NLS-1$
 	/**
@@ -3985,7 +3994,7 @@
 	 * @param wrapStyle the given wrapping style
 	 * @param indentStyle the given indent style
 	 *
-	 * @return the new alignement value
+	 * @return the new alignment value
 	 */
 	public static String createAlignmentValue(boolean forceSplit, int wrapStyle, int indentStyle) {
 		int alignmentValue = 0;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/IndentManipulation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/IndentManipulation.java
index c3ee02f..3559d16 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/IndentManipulation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/formatter/IndentManipulation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2009 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
@@ -30,6 +30,7 @@
  * @since 3.2
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public final class IndentManipulation {
 
 	private IndentManipulation() {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication.java
index f5fd949..7fdad1b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/index/JavaIndexerApplication.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
@@ -33,6 +33,7 @@
  * @noinstantiate This class is not intended to be instantiated by clients.
  * @noextend This class is not intended to be subclassed by clients.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaIndexerApplication implements IApplication {
 
 	private final static class Messages extends NLS {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/jdom/IDOMNode.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/jdom/IDOMNode.java
index 006f31a..49352ed 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/jdom/IDOMNode.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/jdom/IDOMNode.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
@@ -57,6 +57,7 @@
  * org.aspectj.org.eclipse.jdt.core.dom package.
  * @noimplement This interface is not intended to be implemented by clients.
  */
+@SuppressWarnings("rawtypes")
 public interface IDOMNode extends Cloneable  {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/search/SearchDocument.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/search/SearchDocument.java
index c345d14..0892ced 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/search/SearchDocument.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/search/SearchDocument.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -28,6 +28,7 @@
 	private SourceElementParser parser;
 	private String documentPath;
 	private SearchParticipant participant;
+	private boolean shouldIndexResolvedDocument = false;
 
 	/**
 	 * Creates a new search document. The given document path is a string that uniquely identifies the document.
@@ -163,4 +164,22 @@
 	public void setParser(SourceElementParser sourceElementParser) {
 		this.parser = sourceElementParser;
 	}
+
+	/** Flags the document as requiring indexing after symbol and type resolution. A participant would be asked 
+	 *  to resolve the document via {@link SearchParticipant#resolveDocument} and to index the document adding 
+	 *  additional entries via {@link SearchParticipant#indexResolvedDocument} 
+	 *  
+	 * @since 3.10 
+	 */
+	public void requireIndexingResolvedDocument() {
+		this.shouldIndexResolvedDocument = true;
+	}
+	
+	/**
+	 * @nooverride This method is not intended to be re-implemented or extended by clients.
+	 * @noreference This method is not intended to be referenced by clients.
+	 */
+	public boolean shouldIndexResolvedDocument() {
+		return this.shouldIndexResolvedDocument;
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/search/SearchParticipant.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/search/SearchParticipant.java
index 5947077..0f62394 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/search/SearchParticipant.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/search/SearchParticipant.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -134,6 +134,35 @@
 	public abstract void indexDocument(SearchDocument document, IPath indexLocation);
 
 	/**
+	 * Indexes the given resolved document in the given index. A search participant
+	 * asked to index a resolved document should process it and call
+	 * {@link SearchDocument#addIndexEntry(char[], char[])} as many times as
+	 * needed to add only those additional index entries which could not have been originally added
+	 * to the index during a call to {@link SearchParticipant#indexDocument}. If delegating to another
+	 * participant, it should use the original index location (and not the
+	 * delegatee's one). In the particular case of delegating to the default
+	 * search participant (see {@link SearchEngine#getDefaultSearchParticipant()}),
+	 * the provided document's path must be a path ending with one of the
+	 * {@link org.aspectj.org.eclipse.jdt.core.JavaCore#getJavaLikeExtensions() Java-like extensions}
+	 * or with '.class'.
+	 * <p>
+	 * The given index location must represent a path in the file system to a file that
+	 * either already exists or is going to be created. If it exists, it must be an index file,
+	 * otherwise its data might be overwritten.
+	 * </p><p>
+	 * Clients are not expected to call this method.
+	 * </p>
+	 *
+	 * @param document the document to index
+	 * @param indexLocation the location in the file system to the index
+	 * 
+	 * @since 3.10
+	 */
+	public void indexResolvedDocument(SearchDocument document, IPath indexLocation) {
+		// do nothing, subtypes should do the "appropriate thing"
+	}
+
+	/**
 	 * Locates the matches in the given documents using the given search pattern
 	 * and search scope, and reports them to the given search requestor. This
 	 * method is called by the search engine once it has search documents
@@ -180,6 +209,23 @@
 	}
 
 	/**
+	 * Resolves the given document. A search participant asked to resolve a document should parse it and 
+	 * resolve the types and preserve enough state to be able to tend to a indexResolvedDocument call
+	 * subsequently. This API is invoked without holding any index related locks or monitors.
+	 * <p>
+	 * Clients are not expected to call this method.
+	 * </p>
+	 *
+	 * @param document the document to resolve
+	 * @since 3.10
+	 * @see SearchParticipant#indexResolvedDocument
+	 * @see SearchDocument#requireIndexingResolvedDocument
+	 */
+	public void resolveDocument(SearchDocument document) {
+		// do nothing, subtypes should do the "appropriate thing"
+	}
+	
+	/**
 	 * Schedules the indexing of the given document.
 	 * Once the document is ready to be indexed,
 	 * {@link #indexDocument(SearchDocument, IPath) indexDocument(document, indexPath)}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/CompilationUnitSorter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/CompilationUnitSorter.java
index 8e475ee..882a529 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/CompilationUnitSorter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/CompilationUnitSorter.java
@@ -33,6 +33,7 @@
  * @since 2.1
  * @noinstantiate This class is not intended to be instantiated by clients.
  */
+@SuppressWarnings("rawtypes")
 public final class CompilationUnitSorter {
 
  	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IAttributeNamesConstants.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IAttributeNamesConstants.java
index 5db469d..7351ff6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IAttributeNamesConstants.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IAttributeNamesConstants.java
@@ -5,14 +5,12 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *        Jesper Steen Moller - Contributions for
+ *							Bug 406973 - [compiler] Parse MethodParameters attribute
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.core.util;
 
@@ -149,13 +147,13 @@
 	
  	/**
 	 * "RuntimeVisibleTypeAnnotations" attribute (added in jsr 308).
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	char[] RUNTIME_VISIBLE_TYPE_ANNOTATIONS = "RuntimeVisibleTypeAnnotations".toCharArray(); //$NON-NLS-1$
 
 	/**
 	 * "RuntimeInvisibleTypeAnnotations" attribute (added in jsr 308).
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	char[] RUNTIME_INVISIBLE_TYPE_ANNOTATIONS = "RuntimeInvisibleTypeAnnotations".toCharArray(); //$NON-NLS-1$
 
@@ -165,4 +163,10 @@
 	 * @since 3.8
 	 */
 	char[] BOOTSTRAP_METHODS = "BootstrapMethods".toCharArray(); //$NON-NLS-1$
+
+	/**
+	 * "MethodParameters" attribute (added in jep118).
+	 * @since 3.10
+	 */
+	char[] METHOD_PARAMETERS = "MethodParameters".toCharArray(); //$NON-NLS-1$
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotation.java
index a018449..24ed34a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotation.java
@@ -5,14 +5,11 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409250 - [1.8][compiler] Various loose ends in 308 code generation
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.core.util;
 
@@ -22,7 +19,7 @@
  *
  * This interface may be implemented by clients.
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  */
 public interface IExtendedAnnotation extends IAnnotation {
 	/**
@@ -73,7 +70,7 @@
 	 * Answer back the local variable reference info table length of this entry as specified in
 	 * the JVM specifications.
 	 * 
-	 * <p>This is defined only for annotations related a local variable.</p>
+	 * <p>This is defined only for annotations related to a local variable.</p>
 	 *
 	 * @return the local variable reference info table length of this entry as specified in
 	 * the JVM specifications
@@ -84,7 +81,7 @@
 	 * Answer back the local variable reference info table of this entry as specified in
 	 * the JVM specifications. Answer an empty array if none.
 	 * 
-	 * <p>This is defined only for annotations related a local variable.</p>
+	 * <p>This is defined only for annotations related to a local variable.</p>
 	 *
 	 * @return the local variable reference info table of this entry as specified in
 	 * the JVM specifications. Answer an empty array if none
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotationConstants.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotationConstants.java
index 962e0a8..a69ce4d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotationConstants.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IExtendedAnnotationConstants.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
@@ -22,7 +18,7 @@
  * Description of an extended annotation target types constants as described in the JVM specifications
  * (added in JavaSE-1.8).
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
  */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableReferenceInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableReferenceInfo.java
index 492a802..54aeff9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableReferenceInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/ILocalVariableReferenceInfo.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
@@ -21,7 +17,7 @@
  *
  * This interface may be implemented by clients.
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  */
 public interface ILocalVariableReferenceInfo {
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IMethodParametersAttribute.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IMethodParametersAttribute.java
new file mode 100644
index 0000000..becccae
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IMethodParametersAttribute.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Jesper Steen Moeller and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Jesper Steen Moeller - initial API and implementation
+ *******************************************************************************/
+package org.aspectj.org.eclipse.jdt.core.util;
+
+/**
+ * Description of a method's parameters names as described in the JVM specifications.
+ *
+ * This interface may be implemented by clients.
+ *
+ * @since 3.10
+ */
+public interface IMethodParametersAttribute extends IClassFileAttribute {
+
+	/**
+	 * Answer back the number of parameters for this method as specified in
+	 * the JVM specifications.
+	 *
+	 * @return the number of parameters for this method as specified in
+	 * the JVM specifications
+	 */
+	int getMethodParameterLength();
+
+	/**
+	 * Answer back the name for the i'th parameter. Answer null if no
+	 * name is available.
+	 *
+	 * @return back the name for the i'th parameter. Returns null if no
+	 * name is available.
+	 */
+	char[] getParameterName(int i);
+
+	/**
+	 * Answer back the access flags for the i'th parameter, a mask of
+	 * <code>ACC_FINAL</code>, <code>ACC_SYNTHETIC</code>, and <code>ACC_MANDATED</code>.
+	 *
+	 * @return the access flags for the i'th parameter.
+	 */
+	short getAccessFlags(int i);
+
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IModifierConstants.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IModifierConstants.java
index 137d8bc..e10de0d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IModifierConstants.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IModifierConstants.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * 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
  * http://www.eclipse.org/legal/epl-v10.html
  *
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Jesper Steen Moeller - Contribution for bug 406973 - [compiler] Parse MethodParameters attribute
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.core.util;
 
@@ -44,7 +46,7 @@
 	int ACC_ABSTRACT     = 0x0400;
 	int ACC_STRICT       = 0x0800;
 	/**
-	 * Indicates a synthetic member.
+	 * Indicates a synthetic member or method parameter.
 	 * @since 3.0
 	 */
 	int ACC_SYNTHETIC    = 0x1000;
@@ -60,4 +62,10 @@
 	 * @since 3.0
 	 */
 	int ACC_ENUM         = 0x4000;
+
+	/**
+	 * Indicates a mandated parameter, such as this$1 (added in Java SE 8).
+	 * @since 3.10
+	 */
+	int ACC_MANDATED     = 0x8000;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleTypeAnnotationsAttribute.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleTypeAnnotationsAttribute.java
index d4040f2..a3764b8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleTypeAnnotationsAttribute.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IRuntimeInvisibleTypeAnnotationsAttribute.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
@@ -22,7 +18,7 @@
  *
  * This interface may be implemented by clients.
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  */
 public interface IRuntimeInvisibleTypeAnnotationsAttribute extends IClassFileAttribute {
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleTypeAnnotationsAttribute.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleTypeAnnotationsAttribute.java
index 74f1afb..3503647 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleTypeAnnotationsAttribute.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/core/util/IRuntimeVisibleTypeAnnotationsAttribute.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
@@ -22,7 +18,7 @@
  *
  * This interface may be implemented by clients.
  *
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  */
 public interface IRuntimeVisibleTypeAnnotationsAttribute extends IClassFileAttribute {
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
index 39012e5..dbb2f4a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
@@ -1,16 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.codeassist;
 
@@ -30,6 +28,7 @@
 import org.aspectj.org.eclipse.jdt.core.IMethod;
 import org.aspectj.org.eclipse.jdt.core.IType;
 import org.aspectj.org.eclipse.jdt.core.ITypeRoot;
+import org.aspectj.org.eclipse.jdt.core.JavaCore;
 import org.aspectj.org.eclipse.jdt.core.JavaModelException;
 import org.aspectj.org.eclipse.jdt.core.Signature;
 import org.aspectj.org.eclipse.jdt.core.WorkingCopyOwner;
@@ -57,6 +56,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
+import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleSetOfCharArray;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SuffixConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.HashtableOfObject;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.ObjectVector;
@@ -72,12 +72,14 @@
 import org.aspectj.org.eclipse.jdt.internal.core.SourceTypeElementInfo;
 import org.aspectj.org.eclipse.jdt.internal.core.search.matching.JavaSearchNameEnvironment;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Messages;
+import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
 /**
  * This class is the entry point for source completions.
  * It contains two public APIs used to call CodeAssist on a given source with
  * a given environment, assisting position and storage (and possibly options).
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public final class CompletionEngine
 	extends Engine
 	implements ISearchRequestor, TypeConstants , TerminalTokens , RelevanceConstants, SuffixConstants {
@@ -501,8 +503,6 @@
 	private final static int SUPERTYPE = 1;
 	private final static int SUBTYPE = 2;
 	
-	private final static char[] DOT_ENUM = ".enum".toCharArray(); //$NON-NLS-1$
-	
 	int expectedTypesPtr = -1;
 	TypeBinding[] expectedTypes = new TypeBinding[1];
 	int expectedTypesFilter;
@@ -554,6 +554,10 @@
 	int startPosition, actualCompletionPosition, endPosition, offset;
 	int tokenStart, tokenEnd;
 	int javadocTagPosition; // Position of previous tag while completing in javadoc
+	String sourceLevel;
+	String complianceLevel;
+	SimpleSetOfCharArray validPackageNames = new SimpleSetOfCharArray(10);
+	SimpleSetOfCharArray invalidPackageNames = new SimpleSetOfCharArray(1);
 	HashtableOfObject knownPkgs = new HashtableOfObject(10);
 	HashtableOfObject knownTypes = new HashtableOfObject(10);
 	
@@ -621,8 +625,10 @@
 		public void setFieldIndex(int depth){/* empty */}
 		public int sourceEnd() { return 0; 	}
 		public int sourceStart() { return 0; 	}
-		public TypeBinding expectedType() { return null; }
-		public boolean receiverIsImplicitThis() { return false;}
+		public TypeBinding invocationTargetType() { return null; }
+		public boolean receiverIsImplicitThis() { return false; }
+		public InferenceContext18 freshInferenceContext(Scope scope) { return null; }
+		public ExpressionContext getExpressionContext() { return ExpressionContext.VANILLA_CONTEXT; }
 	};
 
 	private int foundTypesCount;
@@ -661,6 +667,8 @@
 		this.nameEnvironment = nameEnvironment;
 		this.typeCache = new HashtableOfObject(5);
 		this.openedBinaryTypes = 0;
+		this.sourceLevel = javaProject.getOption(JavaCore.COMPILER_SOURCE, true);
+		this.complianceLevel = javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
 
 		this.problemFactory = new CompletionProblemFactory(Locale.getDefault());
 		this.problemReporter = new ProblemReporter(
@@ -670,7 +678,7 @@
 		this.lookupEnvironment =
 			new LookupEnvironment(this, this.compilerOptions, this.problemReporter, nameEnvironment);
 		this.parser =
-			new CompletionParser(this.problemReporter, this.requestor.isExtendedContextRequired());
+			new CompletionParser(this.problemReporter, this.requestor.isExtendedContextRequired(), monitor);
 		this.owner = owner;
 		this.monitor = monitor;
 	}
@@ -1111,6 +1119,8 @@
 
 		if (this.knownPkgs.containsKey(packageName)) return;
 
+		if (!isValidPackageName(packageName)) return;
+
 		this.knownPkgs.put(packageName, this);
 
 		char[] completion;
@@ -1198,7 +1208,7 @@
 			}
 		}
 		
-		if (isForbiddenType(packageName, simpleTypeName, enclosingTypeNames)) {
+		if (isForbidden(packageName, simpleTypeName, enclosingTypeNames)) {
 			return;
 		}
 
@@ -1452,7 +1462,7 @@
 
 		// do not add twice the same type
 		for (int i = 0; i <= this.expectedTypesPtr; i++) {
-			if (this.expectedTypes[i] == type) return;
+			if (TypeBinding.equalsEquals(this.expectedTypes[i], type)) return;
 		}
 
 		int length = this.expectedTypes.length;
@@ -1460,7 +1470,7 @@
 			System.arraycopy(this.expectedTypes, 0, this.expectedTypes = new TypeBinding[length * 2], 0, length);
 		this.expectedTypes[this.expectedTypesPtr] = type;
 
-		if(type == scope.getJavaLangObject()) {
+		if(TypeBinding.equalsEquals(type, scope.getJavaLangObject())) {
 			this.hasJavaLangObjectAsExpectedType = true;
 		}
 	}
@@ -1493,12 +1503,12 @@
 			if (paramLength == argLength) { // accept X[] but not X or X[][]
 				TypeBinding varArgType = parameters[lastIndex]; // is an ArrayBinding by definition
 				TypeBinding lastArgument = arguments[lastIndex];
-				if (varArgType != lastArgument && !lastArgument.isCompatibleWith(varArgType))
+				if (TypeBinding.notEquals(varArgType, lastArgument) && !lastArgument.isCompatibleWith(varArgType))
 					return false;
 			} else if (paramLength < argLength) { // all remainig argument types must be compatible with the elementsType of varArgType
 				TypeBinding varArgType = ((ArrayBinding) parameters[lastIndex]).elementsType();
 				for (int i = lastIndex; i < argLength; i++)
-					if (varArgType != arguments[i] && !arguments[i].isCompatibleWith(varArgType))
+					if (TypeBinding.notEquals(varArgType, arguments[i]) && !arguments[i].isCompatibleWith(varArgType))
 						return false;
 			} else if (lastIndex != argLength) { // can call foo(int i, X ... x) with foo(1) but NOT foo();
 				return false;
@@ -1509,7 +1519,7 @@
 				return false;
 		}
 		for (int i = 0; i < lastIndex; i++)
-			if (parameters[i] != arguments[i] && !arguments[i].isCompatibleWith(parameters[i]))
+			if (TypeBinding.notEquals(parameters[i], arguments[i]) && !arguments[i].isCompatibleWith(parameters[i]))
 				return false;
 		return true;
 	}
@@ -1630,6 +1640,17 @@
 						context.setTokenLocation(CompletionContext.TL_STATEMENT_START);
 					}
 				}
+			} else if (referenceContext instanceof LambdaExpression) {
+				LambdaExpression expression = (LambdaExpression)referenceContext;
+				if (expression.body().sourceStart <= astNode.sourceStart &&
+						astNode.sourceEnd <= expression.body().sourceEnd) {
+					// completion is inside a method body
+					if (astNodeParent == null &&
+							astNode instanceof CompletionOnSingleNameReference &&
+							!((CompletionOnSingleNameReference)astNode).isPrecededByModifiers) {
+						context.setTokenLocation(CompletionContext.TL_STATEMENT_START);
+					}
+				}
 			} else if (referenceContext instanceof TypeDeclaration) {
 				TypeDeclaration typeDeclaration = (TypeDeclaration) referenceContext;
 				FieldDeclaration[] fields = typeDeclaration.fields;
@@ -1722,6 +1743,8 @@
 			completionOnBranchStatementLabel(astNode);
 		} else if(astNode instanceof CompletionOnMessageSendName) {
 			completionOnMessageSendName(astNode, qualifiedBinding, scope);
+		} else if (astNode instanceof CompletionOnReferenceExpressionName) {
+			completionOnReferenceExpressionName(astNode, qualifiedBinding, scope);
 		// Completion on Javadoc nodes
 		} else if ((astNode.bits & ASTNode.InsideJavadoc) != 0) {
 			if (astNode instanceof CompletionOnJavadocSingleTypeReference) {
@@ -2469,8 +2492,10 @@
 	private void completionOnMarkerAnnotationName(ASTNode astNode, Binding qualifiedBinding, Scope scope) {
 		CompletionOnMarkerAnnotationName annot = (CompletionOnMarkerAnnotationName) astNode;
 
-		CompletionOnAnnotationOfType fakeType = (CompletionOnAnnotationOfType)scope.parent.referenceContext();
-		if (fakeType.annotations[0] == annot) {
+		// When completion is inside lambda body, the fake type cannot be attached to the lambda.
+		ReferenceContext referenceContext = scope.parent.referenceContext();
+		CompletionOnAnnotationOfType fakeType = (CompletionOnAnnotationOfType) (referenceContext instanceof CompletionOnAnnotationOfType ? referenceContext : null);
+		if (fakeType != null && fakeType.annotations[0] == annot) {
 			// When the completion is inside a method body the annotation cannot be accuratly attached to the correct node by completion recovery.
 			// So 'targetedElement' is not computed in this case.
 			if (scope.parent.parent == null || !(scope.parent.parent instanceof MethodScope)) {
@@ -2487,7 +2512,7 @@
 
 			if (scope.parent.parent != null &&
 					!(scope.parent.parent instanceof MethodScope) &&
-					!fakeType.isParameter) {
+					fakeType != null && !fakeType.isParameter) {
 
 				if (this.completionToken.length <= Keywords.INTERFACE.length
 					&& CharOperation.prefixEquals(this.completionToken, Keywords.INTERFACE, false /* ignore case */
@@ -2765,6 +2790,40 @@
 			}
 		}
 	}
+	private void completionOnReferenceExpressionName(ASTNode astNode, Binding qualifiedBinding, Scope scope) {
+		if (!this.requestor.isIgnored(CompletionProposal.METHOD_NAME_REFERENCE)) {
+			CompletionOnReferenceExpressionName referenceExpression = (CompletionOnReferenceExpressionName) astNode;
+			this.insideQualifiedReference = true;
+			this.completionToken = referenceExpression.selector;
+			boolean onlyStatic = false;
+			
+			TypeBinding receiverType = (TypeBinding) qualifiedBinding;
+			if (receiverType != null && receiverType instanceof ReferenceBinding) {
+				findMethods(
+						this.completionToken,
+						referenceExpression.resolvedTypeArguments,
+						null,
+						(ReferenceBinding)receiverType.capture(scope, referenceExpression.sourceEnd),
+						scope,
+						new ObjectVector(),
+						onlyStatic,
+						false,
+						referenceExpression,
+						scope,
+						false,
+						false,
+						false,
+						null,
+						null,
+						null,
+						false,
+						null,
+						-1,
+						-1);
+			}
+		}
+	}
+
 	
 	private void completionOnMethodName(ASTNode astNode, Scope scope) {
 		if (!this.requestor.isIgnored(CompletionProposal.VARIABLE_DECLARATION)) {
@@ -3409,7 +3468,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -3450,7 +3509,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -3494,6 +3553,12 @@
 				if(binding != null) {
 					addExpectedType(binding, scope);
 				}
+			} else if (scope.methodScope().referenceContext instanceof LambdaExpression) {
+				MethodBinding methodBinding = ((LambdaExpression) scope.methodScope().referenceContext).getMethodBinding();
+				TypeBinding binding = methodBinding  == null ? null : methodBinding.returnType;
+				if (binding != null) {
+					addExpectedType(binding, scope);
+				}
 			}
 		} else if(parent instanceof CastExpression) {
 			TypeReference e = ((CastExpression)parent).type;
@@ -3918,7 +3983,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -3979,7 +4044,7 @@
 		if (isStatic) {
 			completion.append(declarationType.sourceName());
 
-		} else if (declarationType == invocationType) {
+		} else if (TypeBinding.equalsEquals(declarationType, invocationType)) {
 			completion.append(THIS);
 
 		} else {
@@ -4069,7 +4134,7 @@
 				this.expectedTypes != null) {
 			for (int i = 0; i <= this.expectedTypesPtr; i++) {
 				if (proposalType.isEnum() &&
-						proposalType == this.expectedTypes[i]) {
+						TypeBinding.equalsEquals(proposalType, this.expectedTypes[i])) {
 					return R_ENUM + R_ENUM_CONSTANT;
 				}
 
@@ -4151,7 +4216,7 @@
 	}
 
 	private int computeRelevanceForInheritance(ReferenceBinding receiverType, ReferenceBinding declaringClass) {
-		if (receiverType == declaringClass) return R_NON_INHERITED;
+		if (TypeBinding.equalsEquals(receiverType, declaringClass)) return R_NON_INHERITED;
 		return 0;
 	}
 
@@ -4261,7 +4326,7 @@
 			CompletionOnMemberAccess access = (CompletionOnMemberAccess) site;
 			if (access.isSuperAccess() && this.parser.assistNodeParent == null) {
 				ReferenceContext referenceContext = scope.referenceContext();
-				if (referenceContext instanceof AbstractMethodDeclaration) {
+				if (referenceContext instanceof AbstractMethodDeclaration) {  // LE is anonymous.
 					MethodBinding binding = ((AbstractMethodDeclaration) referenceContext).binding;
 					if (binding != null) {
 						if (CharOperation.equals(binding.selector, method.selector)) {
@@ -4283,9 +4348,9 @@
 		if (annotatedElement instanceof TypeDeclaration) {
 			TypeDeclaration annotatedTypeDeclaration = (TypeDeclaration) annotatedElement;
 			if (TypeDeclaration.kind(annotatedTypeDeclaration.modifiers) == TypeDeclaration.ANNOTATION_TYPE_DECL) {
-				return TagBits.AnnotationForAnnotationType | TagBits.AnnotationForType;
+				return TagBits.AnnotationForAnnotationType | TagBits.AnnotationForType | TagBits.AnnotationForTypeUse;
 			}
-			return TagBits.AnnotationForType;
+			return TagBits.AnnotationForType | TagBits.AnnotationForTypeUse;
 		} else if (annotatedElement instanceof FieldDeclaration) {
 			if (fakeNode.isParameter) {
 				return TagBits.AnnotationForParameter;
@@ -4724,20 +4789,20 @@
 	private void createTypeVariable(TypeVariableBinding typeVariable, Scope scope, StringBuffer completion) {
 		completion.append(typeVariable.sourceName);
 
-		if (typeVariable.superclass != null && typeVariable.firstBound == typeVariable.superclass) {
+		if (typeVariable.superclass != null && TypeBinding.equalsEquals(typeVariable.firstBound, typeVariable.superclass)) {
 		    completion.append(' ');
 		    completion.append(EXTENDS);
 		    completion.append(' ');
 		    createType(typeVariable.superclass, scope, completion);
 		}
 		if (typeVariable.superInterfaces != null && typeVariable.superInterfaces != Binding.NO_SUPERINTERFACES) {
-		   if (typeVariable.firstBound != typeVariable.superclass) {
+		   if (TypeBinding.notEquals(typeVariable.firstBound, typeVariable.superclass)) {
 			   completion.append(' ');
 			   completion.append(EXTENDS);
 			   completion.append(' ');
 		   }
 		   for (int i = 0, length = typeVariable.superInterfaces.length; i < length; i++) {
-			   if (i > 0 || typeVariable.firstBound == typeVariable.superclass) {
+			   if (i > 0 || TypeBinding.equalsEquals(typeVariable.firstBound, typeVariable.superclass)) {
 				   completion.append(' ');
 				   completion.append(EXTENDS);
 				   completion.append(' ');
@@ -5863,9 +5928,9 @@
 
 		if (searchSuperClasses) {
 			ReferenceBinding javaLangThrowable = scope.getJavaLangThrowable();
-			if (exceptionType != javaLangThrowable) {
+			if (TypeBinding.notEquals(exceptionType, javaLangThrowable)) {
 				ReferenceBinding superClass = exceptionType.superclass();
-				while(superClass != null && superClass != javaLangThrowable) {
+				while(superClass != null && TypeBinding.notEquals(superClass, javaLangThrowable)) {
 					findExceptionFromTryStatement(typeName, superClass, receiverType, invocationType, scope, typesFound, false);
 					superClass = superClass.superclass();
 				}
@@ -5901,7 +5966,7 @@
 		for (int j = typesFound.size; --j >= 0;) {
 			ReferenceBinding otherType = (ReferenceBinding) typesFound.elementAt(j);
 
-			if (exceptionType == otherType)
+			if (TypeBinding.equalsEquals(exceptionType, otherType))
 				return;
 
 			if (CharOperation.equals(exceptionType.sourceName, otherType.sourceName, true)) {
@@ -5954,7 +6019,7 @@
 								SourceTypeBinding localType =
 									((ClassScope) blockScope.subscopes[j]).referenceContext.binding;
 
-								if (localType == exceptionType) {
+								if (TypeBinding.equalsEquals(localType, exceptionType)) {
 									isQualified = false;
 									break done;
 								}
@@ -5967,7 +6032,7 @@
 						ReferenceBinding[] memberTypes = type.memberTypes();
 						if (memberTypes != null) {
 							for (int j = 0; j < memberTypes.length; j++) {
-								if (memberTypes[j] == exceptionType) {
+								if (TypeBinding.equalsEquals(memberTypes[j], exceptionType)) {
 									isQualified = false;
 									break done;
 								}
@@ -5981,7 +6046,7 @@
 						SourceTypeBinding[] types = ((CompilationUnitScope)currentScope).topLevelTypes;
 						if (types != null) {
 							for (int j = 0; j < types.length; j++) {
-								if (types[j] == exceptionType) {
+								if (TypeBinding.equalsEquals(types[j], exceptionType)) {
 									isQualified = false;
 									break done;
 								}
@@ -6244,13 +6309,13 @@
 				Object[] other = (Object[])fieldsFound.elementAt(i);
 				FieldBinding otherField = (FieldBinding) other[0];
 				ReferenceBinding otherReceiverType = (ReferenceBinding) other[1];
-				if (field == otherField && receiverType == otherReceiverType)
+				if (field == otherField && TypeBinding.equalsEquals(receiverType, otherReceiverType))
 					continue next;
 				if (CharOperation.equals(field.name, otherField.name, true)) {
 					if (field.declaringClass.isSuperclassOf(otherField.declaringClass))
 						continue next;
 					if (otherField.declaringClass.isInterface()) {
-						if (field.declaringClass == scope.getJavaLangObject())
+						if (TypeBinding.equalsEquals(field.declaringClass, scope.getJavaLangObject()))
 							continue next;
 						if (field.declaringClass.implementsInterface(otherField.declaringClass, true))
 							continue next;
@@ -6271,7 +6336,7 @@
 
 				if (CharOperation.equals(field.name, local.name, true)) {
 					SourceTypeBinding declarationType = scope.enclosingSourceType();
-					if (declarationType.isAnonymousType() && declarationType != invocationScope.enclosingSourceType()) {
+					if (declarationType.isAnonymousType() && TypeBinding.notEquals(declarationType, invocationScope.enclosingSourceType())) {
 						continue next;
 					}
 					if(canBePrefixed) {
@@ -6490,7 +6555,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -6555,7 +6620,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -7900,7 +7965,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -7974,7 +8039,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -8418,6 +8483,7 @@
 		int receiverStart,
 		int receiverEnd) {
 
+		boolean completionOnReferenceExpressionName = invocationSite instanceof ReferenceExpression;
 		ObjectVector newMethodsFound =  new ObjectVector();
 		// Inherited methods which are hidden by subclasses are filtered out
 		// No visibility checks can be performed without the scope & invocationSite
@@ -8489,11 +8555,11 @@
 				Object[] other = (Object[]) methodsFound.elementAt(i);
 				MethodBinding otherMethod = (MethodBinding) other[0];
 				ReferenceBinding otherReceiverType = (ReferenceBinding) other[1];
-				if (method == otherMethod && receiverType == otherReceiverType)
+				if (method == otherMethod && TypeBinding.equalsEquals(receiverType, otherReceiverType))
 					continue next;
 
 				if (CharOperation.equals(method.selector, otherMethod.selector, true)) {
-					if (receiverType == otherReceiverType) {
+					if (TypeBinding.equalsEquals(receiverType, otherReceiverType)) {
 						if (this.lookupEnvironment.methodVerifier().isMethodSubsignature(otherMethod, method)) {
 							if (!superCall || !otherMethod.declaringClass.isInterface()) {
 								continue next;
@@ -8516,7 +8582,7 @@
 			newMethodsFound.add(new Object[]{method, receiverType});
 
 			ReferenceBinding superTypeWithSameErasure = (ReferenceBinding)receiverType.findSuperTypeOriginatingFrom(method.declaringClass);
-			if (method.declaringClass != superTypeWithSameErasure) {
+			if (TypeBinding.notEquals(method.declaringClass, superTypeWithSameErasure)) {
 				MethodBinding[] otherMethods = superTypeWithSameErasure.getMethods(method.selector);
 				for (int i = 0; i < otherMethods.length; i++) {
 					if(otherMethods[i].original() == method.original()) {
@@ -8529,11 +8595,11 @@
 			char[][] parameterPackageNames = new char[length][];
 			char[][] parameterTypeNames = new char[length][];
 
-			for (int i = 0; i < length; i++) {
-				TypeBinding type = method.original().parameters[i];
-				parameterPackageNames[i] = type.qualifiedPackageName();
-				parameterTypeNames[i] = type.qualifiedSourceName();
-			}
+				for (int i = 0; i < length; i++) {
+					TypeBinding type = method.original().parameters[i];
+					parameterPackageNames[i] = type.qualifiedPackageName();
+					parameterTypeNames[i] = type.qualifiedSourceName();
+				}
 			char[][] parameterNames = findMethodParameterNames(method,parameterTypeNames);
 
 			char[] completion = CharOperation.NO_CHAR;
@@ -8593,11 +8659,13 @@
 			} else {
 				// nothing to insert - do not want to replace the existing selector & arguments
 				if (!exactMatch) {
-					if (this.source != null
+					if (completionOnReferenceExpressionName)
+						completion = method.selector;
+					else if (this.source != null
 						&& this.source.length > this.endPosition
 						&& this.source[this.endPosition] == '(')
 						completion = method.selector;
-					else
+					else 
 						completion = CharOperation.concat(method.selector, new char[] { '(', ')' });
 
 					if (castedReceiver != null) {
@@ -8639,7 +8707,7 @@
 			if (castedReceiver == null) {
 				// Standard proposal
 				if(!this.isIgnored(CompletionProposal.METHOD_REF, missingElements != null) && (this.assistNodeInJavadoc & CompletionOnJavadoc.ONLY_INLINE_TAG) == 0) {
-					InternalCompletionProposal proposal =  createProposal(CompletionProposal.METHOD_REF, this.actualCompletionPosition);
+					InternalCompletionProposal proposal =  createProposal(completionOnReferenceExpressionName ? CompletionProposal.METHOD_NAME_REFERENCE : CompletionProposal.METHOD_REF, this.actualCompletionPosition);
 					proposal.setDeclarationSignature(getSignature(method.declaringClass));
 					proposal.setSignature(getSignature(method));
 					MethodBinding original = method.original();
@@ -8667,7 +8735,10 @@
 					}
 					proposal.setCompletion(completion);
 					proposal.setFlags(method.modifiers);
-					proposal.setReplaceRange(this.startPosition - this.offset, this.endPosition - this.offset);
+					if (completionOnReferenceExpressionName)
+						proposal.setReplaceRange(this.endPosition - this.offset - methodLength, this.endPosition - this.offset);
+					else 
+						proposal.setReplaceRange(this.startPosition - this.offset, this.endPosition - this.offset);
 					proposal.setTokenRange(this.tokenStart - this.offset, this.tokenEnd - this.offset);
 					proposal.setRelevance(relevance);
 					if(parameterNames != null) proposal.setParameterNames(parameterNames);
@@ -8801,7 +8872,7 @@
 					if (method == otherMethod) continue next;
 
 					if (CharOperation.equals(method.selector, otherMethod.selector, true)) {
-						if (otherMethod.declaringClass == method.declaringClass &&
+						if (TypeBinding.equalsEquals(otherMethod.declaringClass, method.declaringClass) &&
 								this.lookupEnvironment.methodVerifier().isMethodSubsignature(otherMethod, method)) {
 							continue next;
 						}
@@ -8844,7 +8915,7 @@
 				methodsFoundFromFavorites.add(new Object[]{method, receiverType});
 
 				ReferenceBinding superTypeWithSameErasure = (ReferenceBinding)receiverType.findSuperTypeOriginatingFrom(method.declaringClass);
-				if (method.declaringClass != superTypeWithSameErasure) {
+				if (TypeBinding.notEquals(method.declaringClass, superTypeWithSameErasure)) {
 					MethodBinding[] otherMethods = superTypeWithSameErasure.getMethods(method.selector);
 					for (int i = 0; i < otherMethods.length; i++) {
 						if(otherMethods[i].original() == method.original()) {
@@ -9073,7 +9144,7 @@
 				Object[] other = (Object[]) methodsFound.elementAt(i);
 				MethodBinding otherMethod = (MethodBinding) other[0];
 				ReferenceBinding otherReceiverType = (ReferenceBinding) other[1];
-				if (method == otherMethod && receiverType == otherReceiverType)
+				if (method == otherMethod && TypeBinding.equalsEquals(receiverType, otherReceiverType))
 					continue next;
 
 				if (CharOperation.equals(method.selector, otherMethod.selector, true)) {
@@ -9385,7 +9456,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -9413,7 +9484,7 @@
 		if(proposeAllMemberTypes) {
 			ReferenceBinding[] memberTypes = receiverType.memberTypes();
 			for (int i = 0; i < memberTypes.length; i++) {
-				if(memberTypes[i] != typeToIgnore) {
+				if(TypeBinding.notEquals(memberTypes[i], typeToIgnore)) {
 					findSubMemberTypes(
 						typeName,
 						memberTypes[i],
@@ -9454,7 +9525,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -9549,7 +9620,7 @@
 			for (int i = typesFound.size; --i >= 0;) {
 				ReferenceBinding otherType = (ReferenceBinding) typesFound.elementAt(i);
 
-				if (memberType == otherType)
+				if (TypeBinding.equalsEquals(memberType, otherType))
 					continue next;
 
 				if (CharOperation.equals(memberType.sourceName, otherType.sourceName, true)) {
@@ -10062,7 +10133,7 @@
 								for (int j = typesFound.size; --j >= 0;) {
 									ReferenceBinding otherType = (ReferenceBinding) typesFound.elementAt(j);
 
-									if (localType == otherType)
+									if (TypeBinding.equalsEquals(localType, otherType))
 										continue next;
 								}
 
@@ -10267,7 +10338,7 @@
 	private void findTrueOrFalseKeywords(char[][] choices) {
 		if(choices == null || choices.length == 0) return;
 
-		if(this.expectedTypesPtr != 0 || this.expectedTypes[0] != TypeBinding.BOOLEAN) return;
+		if(this.expectedTypesPtr != 0 || TypeBinding.notEquals(this.expectedTypes[0], TypeBinding.BOOLEAN)) return;
 
 		for (int i = 0; i < choices.length; i++) {
 			if (CharOperation.equals(choices[i], Keywords.TRUE) ||
@@ -10416,7 +10487,7 @@
 				if(isForbidden(sourceType)) continue next;
 
 				if(proposeAllMemberTypes &&
-					sourceType != outerInvocationType) {
+					TypeBinding.notEquals(sourceType, outerInvocationType)) {
 					findSubMemberTypes(
 							token,
 							sourceType,
@@ -10443,7 +10514,7 @@
 				for (int j = typesFound.size; --j >= 0;) {
 					ReferenceBinding otherType = (ReferenceBinding) typesFound.elementAt(j);
 
-					if (sourceType == otherType) continue next;
+					if (TypeBinding.equalsEquals(sourceType, otherType)) continue next;
 				}
 				
 				typesFound.add(sourceType);
@@ -10850,7 +10921,7 @@
 
 					for (int j = 0; j < typesFound.size(); j++) {
 						ReferenceBinding typeFound = (ReferenceBinding)typesFound.elementAt(j);
-						if (typeFound == refBinding.erasure()) {
+						if (TypeBinding.equalsEquals(typeFound, refBinding.erasure())) {
 							continue next;
 						}
 					}
@@ -11198,6 +11269,17 @@
 					md.bodyEnd,
 					discouragedNames,
 					nameRequestor);
+		} else if (referenceContext instanceof LambdaExpression) {
+			LambdaExpression expression = (LambdaExpression) referenceContext;
+			UnresolvedReferenceNameFinder nameFinder = new UnresolvedReferenceNameFinder(this);
+			nameFinder.findAfter(
+					this.completionToken,
+					expression.scope,
+					expression.scope.classScope(),
+					from,
+					expression.body().sourceEnd,
+					discouragedNames,
+					nameRequestor);
 		} else if (referenceContext instanceof TypeDeclaration) {
 			TypeDeclaration typeDeclaration = (TypeDeclaration) referenceContext;
 			FieldDeclaration[] fields = typeDeclaration.fields;
@@ -11538,7 +11620,7 @@
 			TypeBinding tb = type.resolvedType;
 
 			if (tb.problemId() == ProblemReasons.NoError &&
-					tb != Scope.getBaseType(VOID)) {
+					TypeBinding.notEquals(tb, Scope.getBaseType(VOID))) {
 				findVariableName(
 					name,
 					tb.leafComponentType().qualifiedPackageName(),
@@ -11992,18 +12074,18 @@
 			if(target != 0 && (target & TagBits.AnnotationForPackage) == 0) {
 				return false;
 			}
-		} else if ((this.targetedElement & TagBits.AnnotationForType) != 0) {
+		} else if ((this.targetedElement & (TagBits.AnnotationForType | TagBits.AnnotationForTypeUse)) != 0) {
 			if (scope.parent != null &&
 					scope.parent.parent != null &&
 					scope.parent.referenceContext() instanceof CompletionOnAnnotationOfType &&
 					scope.parent.parent instanceof CompilationUnitScope) {
 				long target = typeBinding.getAnnotationTagBits() & TagBits.AnnotationTargetMASK;
 				if ((this.targetedElement & TagBits.AnnotationForAnnotationType) != 0) {
-					if(target != 0 && (target &(TagBits.AnnotationForType | TagBits.AnnotationForAnnotationType)) == 0) {
+					if(target != 0 && (target &(TagBits.AnnotationForType | TagBits.AnnotationForAnnotationType | TagBits.AnnotationForTypeUse)) == 0) {
 						return false;
 					}
 				} else {
-					if(target != 0 && (target &(TagBits.AnnotationForType)) == 0) {
+					if (target != 0 && (target & (TagBits.AnnotationForType | TagBits.AnnotationForTypeUse)) == 0) {
 						return false;
 					}
 				}
@@ -12034,16 +12116,19 @@
 	private boolean isAllowingLongComputationProposals() {
 		return this.monitor != null;
 	}
-	private boolean isForbidden(Binding binding) {
+	private boolean isForbidden(ReferenceBinding binding) {
 		for (int i = 0; i <= this.forbbidenBindingsPtr; i++) {
 			if(this.forbbidenBindings[i] == binding) {
 				return true;
 			}
 		}
+		if (!isValidPackageName(binding.qualifiedPackageName())) {
+			return true;
+		}
 		return false;
 	}
 
-	private boolean isForbiddenType(char[] givenPkgName, char[] givenTypeName, char[][] enclosingTypeNames) {
+	private boolean isForbidden(char[] givenPkgName, char[] givenTypeName, char[][] enclosingTypeNames) {
 		// CharOperation.concatWith() handles the cases where input args are null/empty
 		char[] fullTypeName = CharOperation.concatWith(enclosingTypeNames, givenTypeName, '.');
 		for (int i = 0; i <= this.forbbidenBindingsPtr; i++) {
@@ -12059,11 +12144,8 @@
 			}
 		}
 		
-		// filter packages ending with enum for projects above 1.5 
-		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=317264
-		if (this.compilerOptions.sourceLevel >= ClassFileConstants.JDK1_5 &&
-				CharOperation.endsWith(givenPkgName, DOT_ENUM)) { //note: it should be .enum and not just enum
-				return true;
+		if (!isValidPackageName(givenPkgName)) {
+			return true;
 		}
 		
 		return false;
@@ -12081,6 +12163,28 @@
 		return this.requestor.isIgnored(kind) ||
 			!this.requestor.isAllowingRequiredProposals(kind, requiredProposalKind);
 	}
+
+	private boolean isValidPackageName(char[] packageName) {
+		if (this.validPackageNames.includes(packageName)) {
+			return true;
+		}
+
+		if (this.invalidPackageNames.includes(packageName)) {
+			return false;
+		}
+
+		char[][] names = CharOperation.splitOn('.', packageName);
+		for (int i = 0, length = names.length; i < length; i++) {
+			if (!Util.isValidFolderNameForPackage(new String(names[i]), this.sourceLevel, this.complianceLevel)) {
+				this.invalidPackageNames.add(packageName);
+				return false;
+			}
+		}
+
+		this.validPackageNames.add(packageName);
+		return true;
+	}
+
 	private boolean isValidParent(ASTNode parent, ASTNode node, Scope scope){
 
 		if(parent instanceof ParameterizedSingleTypeReference) {
@@ -12150,7 +12254,7 @@
 					for (int i = 0; i < memberTypes.length; i++) {
 						if (CharOperation.equals(memberTypes[i].sourceName, type.sourceName()) &&
 								memberTypes[i].canBeSeenBy(scope)) {
-							return memberTypes[i] != type;
+							return TypeBinding.notEquals(memberTypes[i], type);
 						}
 					}
 				}
@@ -12748,6 +12852,8 @@
 	protected void reset() {
 
 		super.reset(false);
+		this.validPackageNames = new SimpleSetOfCharArray(10);
+		this.invalidPackageNames = new SimpleSetOfCharArray(1);
 		this.knownPkgs = new HashtableOfObject(10);
 		this.knownTypes = new HashtableOfObject(10);
 		if (this.noCacheNameEnvironment != null) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java
index e54a999..442ab1c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java
@@ -54,6 +54,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.SourceType;
 import org.aspectj.org.eclipse.jdt.internal.core.TypeParameter;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class CompletionUnitStructureRequestor extends CompilationUnitStructureRequestor {
 	private ASTNode assistNode;
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext.java
index a66234f..640e18a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/InternalExtendedCompletionContext.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2011 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
@@ -7,6 +7,8 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								Bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.codeassist;
 
@@ -28,6 +30,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Initializer;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;
@@ -35,6 +38,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeParameter;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.TypeAnnotationWalker;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
@@ -61,6 +65,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.LocalVariable;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class InternalExtendedCompletionContext {
 	private static Util.BindingsToNodesMap EmptyNodeMap = new Util.BindingsToNodesMap() {
 		public ASTNode get(Binding binding) {
@@ -177,7 +182,7 @@
 			this.visibleMethods = new ObjectVector();
 	
 			ReferenceContext referenceContext = scope.referenceContext();
-			if (referenceContext instanceof AbstractMethodDeclaration) {
+			if (referenceContext instanceof AbstractMethodDeclaration || referenceContext instanceof LambdaExpression) {
 				// completion is inside a method body
 				searchVisibleVariablesAndMethods(scope, this.visibleLocalVariables, this.visibleFields, this.visibleMethods, notInJavadoc);
 			} else if (referenceContext instanceof TypeDeclaration) {
@@ -195,7 +200,7 @@
 							}
 						} else {
 							FieldDeclaration fieldDeclaration = fields[i];							
-							if (fieldDeclaration.initialization != null) {
+							if (fieldDeclaration.initialization != null && fieldDeclaration.binding != null) {
 								boolean isInsideInitializer = false;
 								if (fieldDeclaration.initialization.sourceEnd > 0) {
 									if (fieldDeclaration.initialization.sourceStart <= astNode.sourceStart &&
@@ -332,7 +337,8 @@
 		try {
 
 			SignatureWrapper wrapper = new SignatureWrapper(replacePackagesDot(typeSignature.toCharArray()));
-			assignableTypeBinding = this.lookupEnvironment.getTypeFromTypeSignature(wrapper, typeVariables, this.assistScope.enclosingClassScope().referenceContext.binding, null);
+			// FIXME(stephan): do we interpret type annotations here?
+			assignableTypeBinding = this.lookupEnvironment.getTypeFromTypeSignature(wrapper, typeVariables, this.assistScope.enclosingClassScope().referenceContext.binding, null, TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER);
 			assignableTypeBinding = BinaryTypeBinding.resolveType(assignableTypeBinding, this.lookupEnvironment, true);
 		} catch (AbortCompilation e) {
 			assignableTypeBinding = null;
@@ -512,7 +518,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -558,7 +564,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -600,7 +606,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser.java
index 28c4442..ecb81e9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/MissingTypesGuesser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2009 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
@@ -29,6 +29,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.HashtableOfObjectToInt;
 import org.aspectj.org.eclipse.jdt.internal.core.SearchableEnvironment;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class MissingTypesGuesser extends ASTVisitor {
 	public static interface GuessedTypeRequestor {
 		public void accept(
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine.java
index 39f9a69..7e477a5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/SelectionEngine.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -65,6 +65,7 @@
  * attempt. If this was the desired behavior, a call to the CompletionEngine should be
  * performed instead.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public final class SelectionEngine extends Engine implements ISearchRequestor {
 	
 	private static class SelectionTypeNameMatchRequestorWrapper extends TypeNameMatchRequestorWrapper {
@@ -499,7 +500,7 @@
 				null/*taskPriorities*/,
 				true /*taskCaseSensitive*/);
 		scanner.setSource(source);
-
+		
 		int lastIdentifierStart = -1;
 		int lastIdentifierEnd = -1;
 		char[] lastIdentifier = null;
@@ -574,6 +575,7 @@
 				switch (token) {
 					case TerminalTokens.TokenNamethis:
 					case TerminalTokens.TokenNamesuper:
+					case TerminalTokens.TokenNamenew:
 					case TerminalTokens.TokenNameIdentifier:
 						if (scanner.startPosition <= selectionStart && selectionStart <= scanner.currentPosition) {
 							if (scanner.currentPosition == scanner.eofPosition) {
@@ -591,6 +593,19 @@
 				}
 			} while (token != TerminalTokens.TokenNameEOF);
 		} else {
+			if (selectionStart == selectionEnd) { // Widen the selection to scan -> || :: if needed. No unicode handling for now.
+				if (selectionStart > 0 && selectionEnd < source.length - 1) {
+					if ((source[selectionStart] == '>' && source[selectionStart - 1] == '-') ||
+							source[selectionStart] == ':' && source[selectionStart - 1] == ':') { 
+						selectionStart--;
+					} else {
+						if ((source[selectionStart] == '-' && source[selectionEnd + 1] == '>') ||
+								source[selectionStart] == ':' && source[selectionEnd + 1] == ':') {
+							selectionEnd++;
+						}
+					}
+				}  
+			} // there could be some innocuous widening, shouldn't matter.
 			scanner.resetTo(selectionStart, selectionEnd);
 
 			boolean expectingIdentifier = true;
@@ -603,6 +618,7 @@
 				switch (token) {
 					case TerminalTokens.TokenNamethis :
 					case TerminalTokens.TokenNamesuper :
+					case TerminalTokens.TokenNamenew :
 					case TerminalTokens.TokenNameIdentifier :
 						if (!expectingIdentifier)
 							return false;
@@ -615,6 +631,14 @@
 						}
 						expectingIdentifier = false;
 						break;
+					case TerminalTokens.TokenNameCOLON_COLON:	
+						if (selectionStart >= scanner.startPosition && selectionEnd < scanner.currentPosition) {
+							this.actualSelectionStart = selectionStart;
+							this.actualSelectionEnd = selectionEnd;
+							this.selectedIdentifier = CharOperation.NO_CHAR;
+							return true;		
+						}
+						//$FALL-THROUGH$
 					case TerminalTokens.TokenNameDOT :
 						if (expectingIdentifier)
 							return false;
@@ -632,6 +656,14 @@
 						if(scanner.startPosition != scanner.initialPosition)
 							return false;
 						break;
+					case TerminalTokens.TokenNameARROW:
+						if (selectionStart >= scanner.startPosition && selectionEnd < scanner.currentPosition) {
+							this.actualSelectionStart = selectionStart;
+							this.actualSelectionEnd = selectionEnd;
+							this.selectedIdentifier = CharOperation.NO_CHAR;
+							return true;		
+						}
+						return false;
 					default :
 						return false;
 				}
@@ -941,7 +973,7 @@
 									System.out.println(e.binding.toString());
 								}
 								// if null then we found a problem in the selection node
-								selectFrom(e.binding, parsedUnit, e.isDeclaration);
+								selectFrom(e.binding, parsedUnit, sourceUnit, e.isDeclaration);
 							}
 						}
 					}
@@ -1046,6 +1078,9 @@
 	}
 
 	private void selectFrom(Binding binding, CompilationUnitDeclaration parsedUnit, boolean isDeclaration) {
+		selectFrom(binding, parsedUnit, null, isDeclaration);
+	}
+	private void selectFrom(Binding binding, CompilationUnitDeclaration parsedUnit, ICompilationUnit unit, boolean isDeclaration) {
 		if(binding instanceof TypeVariableBinding) {
 			TypeVariableBinding typeVariableBinding = (TypeVariableBinding) binding;
 			Binding enclosingElement = typeVariableBinding.declaringElement;
@@ -1145,7 +1180,7 @@
 					typeParameterNames[i] = typeVariable.sourceName;
 					if (typeVariable.firstBound == null) {
 						typeParameterBoundNames[i] = new char[0][];
-					} else if (typeVariable.firstBound == typeVariable.superclass) {
+					} else if (TypeBinding.equalsEquals(typeVariable.firstBound, typeVariable.superclass)) {
 						int boundCount = 1 + (typeVariable.superInterfaces == null ? 0 : typeVariable.superInterfaces.length);
 						typeParameterBoundNames[i] = new char[boundCount][];
 						typeParameterBoundNames[i][0] = typeVariable.superclass.sourceName;
@@ -1226,7 +1261,7 @@
 			}
 		} else if (binding instanceof LocalVariableBinding) {
 			if (this.requestor instanceof SelectionRequestor) {
-				((SelectionRequestor)this.requestor).acceptLocalVariable((LocalVariableBinding)binding);
+				((SelectionRequestor)this.requestor).acceptLocalVariable((LocalVariableBinding)binding, unit);
 				this.acceptedAnswer = true;
 			} else {
 				// open on the type of the variable
@@ -1345,15 +1380,6 @@
 				typeName = Signature.toCharArray(typeSig);
 			}
 
-			// find the outer most type
-			IType outerType = context;
-			IType parent = context.getDeclaringType();
-			while (parent != null) {
-				outerType = parent;
-				parent = parent.getDeclaringType();
-			}
-
-			// compute parse tree for this most outer type
 			CompilationUnitDeclaration parsedUnit = null;
 			TypeDeclaration typeDeclaration = null;
 			org.aspectj.org.eclipse.jdt.core.ICompilationUnit cu = context.getCompilationUnit();
@@ -1364,8 +1390,7 @@
 			 	for (int i = 0; i < length; i++) {
 					topLevelInfos[i] = (SourceTypeElementInfo) ((SourceType)topLevelTypes[i]).getElementInfo();
 				}
-				ISourceType outerTypeInfo = (ISourceType) ((SourceType) outerType).getElementInfo();
-				CompilationResult result = new CompilationResult(outerTypeInfo.getFileName(), 1, 1, this.compilerOptions.maxProblemsPerUnit);
+				CompilationResult result = new CompilationResult((org.aspectj.org.eclipse.jdt.internal.compiler.env.ICompilationUnit) cu, 1, 1, this.compilerOptions.maxProblemsPerUnit);
 				int flags = SourceTypeConverter.FIELD_AND_METHOD | SourceTypeConverter.MEMBER_TYPE;
 				if (context.isAnonymous() || context.isLocal())
 					flags |= SourceTypeConverter.LOCAL_TYPE;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/ThrownExceptionFinder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/ThrownExceptionFinder.java
index 4e8ce98..2b5160e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/ThrownExceptionFinder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/ThrownExceptionFinder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2011 IBM Corporation and others.
+ * Copyright (c) 2007, 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
@@ -29,6 +29,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleSet;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ThrownExceptionFinder extends ASTVisitor {
 
 	private SimpleSet thrownExceptions;
@@ -211,7 +212,7 @@
 		for (int i = 0; i < exceptions.length; i++) {
 			ReferenceBinding exception = (ReferenceBinding)exceptions[i];
 			if (exception != null) {
-				if (exception == caughtException) {
+				if (TypeBinding.equalsEquals(exception, caughtException)) {
 					this.thrownExceptions.remove(exception);
 				} else if (caughtException.isSuperclassOf(exception)) {
 					// catching the sub-exception when super has been caught already will give an error
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadoc.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadoc.java
index b247c7a..85ef2f7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadoc.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadoc.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
@@ -271,7 +271,7 @@
 				boolean found = false;
 				int paramNameRefCount = 0;
 				for (int j = 0; j < paramTypeParamLength && !found; j++) {
-					if (parameter.binding == this.paramTypeParameters[j].resolvedType) {
+					if (TypeBinding.equalsEquals(parameter.binding, this.paramTypeParameters[j].resolvedType)) {
 						if (parameter.binding == paramNameRefBinding) { // do not count first occurence of param nmae reference
 							paramNameRefCount++;
 							found = paramNameRefCount > 1;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadocParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadocParser.java
index 4963d86..7f819ed 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadocParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionJavadocParser.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
@@ -25,6 +25,7 @@
 /**
  * Parser specialized for decoding javadoc comments which includes cursor location for code completion.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class CompletionJavadocParser extends JavadocParser {
 
 	// Initialize lengthes for block and inline tags tables
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnArgumentName.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnArgumentName.java
index ba6eaa9..03f11a7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnArgumentName.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnArgumentName.java
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.codeassist.complete;
 
@@ -30,7 +32,7 @@
 		this.realName = name;
 	}
 
-	public void bind(MethodScope scope, TypeBinding typeBinding, boolean used) {
+	public TypeBinding bind(MethodScope scope, TypeBinding typeBinding, boolean used) {
 
 		super.bind(scope, typeBinding, used);
 		throw new CompletionNodeFound(this, scope);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSend.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSend.java
index d427f9c..392e8bd 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSend.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSend.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSendName.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSendName.java
index b6f28f3..1759fae 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSendName.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSendName.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedAllocationExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedAllocationExpression.java
index 6eca95b..dd4054e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedAllocationExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedAllocationExpression.java
@@ -1,10 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *******************************************************************************/
@@ -66,7 +66,7 @@
 		}
 		this.resolvedType = ((SingleTypeReference) this.type).resolveTypeEnclosing(scope, (ReferenceBinding) enclosingType);
 		if (isDiamond && (this.resolvedType instanceof ParameterizedTypeBinding)) {
-			TypeBinding [] inferredTypes = inferElidedTypes(((ParameterizedTypeBinding) this.resolvedType).genericType(), null, argumentTypes, scope);
+			TypeBinding [] inferredTypes = inferElidedTypes((ParameterizedTypeBinding) this.resolvedType, null, argumentTypes, scope);
 			if (inferredTypes != null) {
 				this.resolvedType = this.type.resolvedType = scope.environment().createParameterizedType(((ParameterizedTypeBinding) this.resolvedType).genericType(), inferredTypes, ((ParameterizedTypeBinding) this.resolvedType).enclosingType());
 			} else {
@@ -81,7 +81,7 @@
 	} else {
 	 	this.resolvedType = this.type.resolveType(scope, true /* check bounds*/);
 	 	if (isDiamond && (this.resolvedType instanceof ParameterizedTypeBinding)) {
-			TypeBinding [] inferredTypes = inferElidedTypes(((ParameterizedTypeBinding) this.resolvedType).genericType(), null, argumentTypes, scope);
+			TypeBinding [] inferredTypes = inferElidedTypes((ParameterizedTypeBinding) this.resolvedType, null, argumentTypes, scope);
 			if (inferredTypes != null) {
 				this.resolvedType = this.type.resolvedType = scope.environment().createParameterizedType(((ParameterizedTypeBinding) this.resolvedType).genericType(), inferredTypes, ((ParameterizedTypeBinding) this.resolvedType).enclosingType());
 			} else {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.java
index 8c2efdd..ce4734a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -56,13 +52,7 @@
 /*
  * No expansion of the completion reference into an array one
  */
-public TypeReference copyDims(int dim){
-	return this;
-}
-/*
- * No expansion of the completion reference into an array one
- */
-public TypeReference copyDims(int dim, Annotation[][] annotationsOnDimensions){
+public TypeReference augmentTypeWithAdditionalDimensions(int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs) {
 	return this;
 }
 protected TypeBinding getTypeBinding(Scope scope) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnReferenceExpressionName.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnReferenceExpressionName.java
new file mode 100644
index 0000000..34174f3
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnReferenceExpressionName.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2014 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.aspectj.org.eclipse.jdt.internal.codeassist.complete;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+
+public class CompletionOnReferenceExpressionName extends ReferenceExpression {
+	
+	@Override
+	public TypeBinding resolveType(BlockScope scope) {
+		
+		final CompilerOptions compilerOptions = scope.compilerOptions();
+		TypeBinding lhsType;
+		boolean typeArgumentsHaveErrors;
+
+		this.constant = Constant.NotAConstant;
+		lhsType = this.lhs.resolveType(scope);
+		if (this.typeArguments != null) {
+			int length = this.typeArguments.length;
+			typeArgumentsHaveErrors = compilerOptions.sourceLevel < ClassFileConstants.JDK1_5;
+			this.resolvedTypeArguments = new TypeBinding[length];
+			for (int i = 0; i < length; i++) {
+				TypeReference typeReference = this.typeArguments[i];
+				if ((this.resolvedTypeArguments[i] = typeReference.resolveType(scope, true /* check bounds*/)) == null) {
+					typeArgumentsHaveErrors = true;
+				}
+				if (typeArgumentsHaveErrors && typeReference instanceof Wildcard) { // resolveType on wildcard always return null above, resolveTypeArgument is the real workhorse.
+					scope.problemReporter().illegalUsageOfWildcard(typeReference);
+				}
+			}
+			if (typeArgumentsHaveErrors || lhsType == null)
+				throw new CompletionNodeFound();
+		}
+    	
+		if (lhsType != null && lhsType.isValidBinding())
+			throw new CompletionNodeFound(this, lhsType, scope);
+		throw new CompletionNodeFound();
+	}
+
+	@Override
+	public StringBuffer printExpression(int tab, StringBuffer output) {
+		output.append("<CompletionOnReferenceExpressionName:"); //$NON-NLS-1$
+		this.lhs.print(0, output);
+		output.append("::"); //$NON-NLS-1$
+		if (this.typeArguments != null) {
+			output.append('<');
+			int max = this.typeArguments.length - 1;
+			for (int j = 0; j < max; j++) {
+				this.typeArguments[j].print(0, output);
+				output.append(", ");//$NON-NLS-1$
+			}
+			this.typeArguments[max].print(0, output);
+			output.append('>');
+		}
+		output.append(this.selector);
+		return output.append('>');
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleTypeReference.java
index 3bcdef9..734eea4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleTypeReference.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -56,13 +52,7 @@
 /*
  * No expansion of the completion reference into an array one
  */
-public TypeReference copyDims(int dim){
-	return this;
-}
-/*
- * No expansion of the completion reference into an array one
- */
-public TypeReference copyDims(int dim, Annotation[][] annotationsOnDimensions){
+public TypeReference augmentTypeWithAdditionalDimensions(int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs) {
 	return this;
 }
 protected TypeBinding getTypeBinding(Scope scope) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
index a77fb03..e183425 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *		IBM Corporation - initial API and implementation
  *		Stephan Herrmann - Contribution for
@@ -28,10 +24,10 @@
 
 import java.util.HashSet;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.*;
-
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.*;
@@ -40,6 +36,7 @@
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.codeassist.impl.*;
 
+@SuppressWarnings("rawtypes")
 public class CompletionParser extends AssistParser {
 	// OWNER
 	protected static final int COMPLETION_PARSER = 1024;
@@ -156,6 +153,7 @@
 	int labelPtr = -1;
 
 	boolean isAlreadyAttached;
+	boolean shouldStackAssistNode;
 
 	public boolean record = false;
 	public boolean skipRecord = false;
@@ -171,6 +169,8 @@
 	private boolean storeSourceEnds;
 	public HashtableOfObjectToInt sourceEnds;
 	private boolean inReferenceExpression;
+	private IProgressMonitor monitor;
+	private int resumeOnSyntaxError = 0;
 
 public CompletionParser(ProblemReporter problemReporter, boolean storeExtraSourceEnds) {
 	super(problemReporter);
@@ -182,6 +182,10 @@
 		this.sourceEnds = new HashtableOfObjectToInt();
 	}
 }
+public CompletionParser(ProblemReporter problemReporter, boolean storeExtraSourceEnds, IProgressMonitor monitor) {
+	this(problemReporter, storeExtraSourceEnds);
+	this.monitor = monitor;
+}
 private void addPotentialName(char[] potentialVariableName, int start, int end) {
 	int length = this.potentialVariableNames.length;
 	if (this.potentialVariableNamesPtr >= length - 1) {
@@ -226,6 +230,14 @@
 public char[] assistIdentifier(){
 	return ((CompletionScanner)this.scanner).completionIdentifier;
 }
+@Override
+protected ASTNode assistNodeParent() {
+	return this.assistNodeParent;
+}
+@Override
+protected ASTNode enclosingNode() {
+	return this.enclosingNode;
+}
 protected void attachOrphanCompletionNode(){
 	if(this.assistNode == null || this.isAlreadyAttached) return;
 
@@ -1068,8 +1080,8 @@
 	} else {
 		if(this.currentElement instanceof RecoveredField && !(this.currentElement instanceof RecoveredInitializer)
 			&& ((RecoveredField) this.currentElement).fieldDeclaration.initialization == null) {
-
-			this.assistNodeParent = ((RecoveredField) this.currentElement).fieldDeclaration;
+			if (lastIndexOfElement(K_LAMBDA_EXPRESSION_DELIMITER) <= lastIndexOfElement(K_FIELD_INITIALIZER_DELIMITER))
+				this.assistNodeParent = ((RecoveredField) this.currentElement).fieldDeclaration;
 			this.currentElement = this.currentElement.add(buildMoreCompletionEnclosingContext(statement), 0);
 		} else if(this.currentElement instanceof RecoveredLocalVariable
 			&& ((RecoveredLocalVariable) this.currentElement).localDeclaration.initialization == null) {
@@ -2407,6 +2419,16 @@
 	// DimWithOrWithOutExpr ::= '[' ']'
 	pushOnExpressionStack(null);
 }
+protected void consumeEmptyStatement() {
+	super.consumeEmptyStatement();
+	/* Sneak in the assist node. The reason we can't do that when we see the assist node is that 
+	   we don't know whether it is the first or subsequent statement in a block to be able to
+	   decide whether to call contactNodeLists. See Parser.consumeBlockStatement(s) 
+	*/
+	if (this.shouldStackAssistNode && this.assistNode != null)
+		this.astStack[this.astPtr] = this.assistNode;
+	this.shouldStackAssistNode = false;
+}
 protected void consumeEnhancedForStatement() {
 	super.consumeEnhancedForStatement();
 
@@ -2580,8 +2602,9 @@
 		this.cursorLocation > variable.initialization.sourceEnd) {
 		variable.initialization = null;
 	} else if (this.assistNode != null && this.assistNode == variable.initialization) {
-		this.assistNodeParent = variable;
+			this.assistNodeParent = variable;
 	}
+	triggerRecoveryUponLambdaClosure(variable, false);
 }
 protected void consumeExitVariableWithoutInitialization() {
 	// ExitVariableWithoutInitialization ::= $empty
@@ -2663,18 +2686,13 @@
 		int firstDimensions = this.intStack[this.intPtr--];
 		TypeReference type = getTypeReference(firstDimensions);
 		
-		final int typeDimensions = firstDimensions + extendedDimensions + (isVarArgs ? 1 : 0);
-		if (typeDimensions != firstDimensions) {
-			// jsr308 type annotations management
-			Annotation [][] annotationsOnFirstDimensions = firstDimensions == 0 ? null : type.getAnnotationsOnDimensions();
-			Annotation [][] annotationsOnAllDimensions = annotationsOnFirstDimensions;
-			if (annotationsOnExtendedDimensions != null) {
-				annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(firstDimensions, annotationsOnFirstDimensions, extendedDimensions, annotationsOnExtendedDimensions);
+		if (isVarArgs || extendedDimensions != 0) {
+			if (isVarArgs) {
+				type = augmentTypeWithAdditionalDimensions(type, 1, varArgsAnnotations != null ? new Annotation[][] { varArgsAnnotations } : null, true);	
 			}
-			if (varArgsAnnotations != null) {
-				annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(firstDimensions + extendedDimensions, annotationsOnAllDimensions, 1, new Annotation[][]{varArgsAnnotations});
+			if (extendedDimensions != 0) { // combination illegal.
+				type = augmentTypeWithAdditionalDimensions(type, extendedDimensions, annotationsOnExtendedDimensions, false);
 			}
-			type = copyDims(type, typeDimensions, annotationsOnAllDimensions);
 			type.sourceEnd = type.isParameterizedTypeReference() ? this.endStatementPosition : this.endPosition;
 		}
 		if (isVarArgs) {
@@ -2816,9 +2834,12 @@
 			this.skipRecord = true;
 			super.consumeInsideCastExpressionLL1WithBounds();
 			if (this.record) {
-				Expression typeReference = this.expressionStack[this.expressionPtr];
-				if (!isAlreadyPotentialName(typeReference.sourceStart)) {
-					addPotentialName(null, typeReference.sourceStart, typeReference.sourceEnd);
+				int length =  this.expressionLengthStack[this.expressionLengthPtr];
+				for (int i = 0; i < length; i++) {
+					Expression typeReference = this.expressionStack[this.expressionPtr - length + i + 1];
+					if (!isAlreadyPotentialName(typeReference.sourceStart)) {
+						addPotentialName(null, typeReference.sourceStart, typeReference.sourceEnd);
+					}
 				}
 			}
 		} finally {
@@ -3018,6 +3039,7 @@
 		this.identifierLengthPtr--;
 		//type
 		md.returnType = getTypeReference(this.intStack[this.intPtr--]);
+		md.bits |= (md.returnType.bits & ASTNode.HasTypeAnnotations);
 		//modifiers
 		md.declarationSourceStart = this.intStack[this.intPtr--];
 		md.modifiers = this.intStack[this.intPtr--];
@@ -3297,11 +3319,11 @@
 	super.consumeMethodHeader();
 	pushOnElementStack(K_BLOCK_DELIMITER);
 }
-protected void consumeMethodDeclaration(boolean isNotAbstract) {
+protected void consumeMethodDeclaration(boolean isNotAbstract, boolean isDefaultMethod) {
 	if (!isNotAbstract) {
 		popElement(K_BLOCK_DELIMITER);
 	}
-	super.consumeMethodDeclaration(isNotAbstract);
+	super.consumeMethodDeclaration(isNotAbstract, isDefaultMethod);
 }
 protected void consumeModifiers() {
 	super.consumeModifiers();
@@ -3475,6 +3497,8 @@
 					case K_MEMBER_VALUE_ARRAY_INITIALIZER:
 						popElement(K_MEMBER_VALUE_ARRAY_INITIALIZER);
 						break;
+					case K_LAMBDA_EXPRESSION_DELIMITER:
+						break; // will be popped when the containing block statement is reduced.
 					default:
 						popElement(K_ARRAY_INITIALIZER);
 						break;
@@ -3681,6 +3705,8 @@
 							case TokenNamedo:
 								pushOnElementStack(K_BLOCK_DELIMITER, DO);
 								break;
+							case TokenNameARROW:
+								break;
 							default :
 								pushOnElementStack(K_BLOCK_DELIMITER);
 								break;
@@ -3979,6 +4005,10 @@
 		}
 	}
 }
+protected void consumeInvocationExpression() { // on error, a message send's error reductions will take the expression path rather than the statement path since that is a dead end.
+	super.consumeInvocationExpression();
+	triggerRecoveryUponLambdaClosure(this.expressionStack[this.expressionPtr], false);
+}
 protected void consumeIdentifierOrNew(boolean newForm) {
 	this.inReferenceExpression = false;
 	super.consumeIdentifierOrNew(newForm);
@@ -4509,21 +4539,11 @@
 	}
 	return super.createStringLiteral(token, start, end, lineNumber);
 }
-protected TypeReference copyDims(TypeReference typeRef, int dim) {
+protected TypeReference augmentTypeWithAdditionalDimensions(TypeReference typeRef, int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs) {
 	if (this.assistNode == typeRef) {
 		return typeRef;
 	}
-	TypeReference result = super.copyDims(typeRef, dim);
-	if (this.assistNodeParent == typeRef) {
-		this.assistNodeParent = result;
-	}
-	return result;
-}
-protected TypeReference copyDims(TypeReference typeRef, int dim, Annotation[][] annotationsOnDimensions) {
-	if (this.assistNode == typeRef) {
-		return typeRef;
-	}
-	TypeReference result = super.copyDims(typeRef, dim, annotationsOnDimensions);
+	TypeReference result = super.augmentTypeWithAdditionalDimensions(typeRef, additionalDimensions, additionalAnnotations, isVarargs);
 	if (this.assistNodeParent == typeRef) {
 		this.assistNodeParent = result;
 	}
@@ -4619,11 +4639,23 @@
 	this.labelPtr = -1;
 	initializeForBlockStatements();
 }
-public void initialize(boolean initializeNLS) {
-	super.initialize(initializeNLS);
+public void initialize(boolean parsingCompilationUnit) {
+	super.initialize(parsingCompilationUnit);
 	this.labelPtr = -1;
 	initializeForBlockStatements();
 }
+public void copyState(CommitRollbackParser from) {
+
+	super.copyState(from);
+	
+	CompletionParser parser = (CompletionParser) from;
+	
+	this.invocationType = parser.invocationType;
+	this.qualifier = parser.qualifier;
+	this.inReferenceExpression = parser.inReferenceExpression;
+	this.hasUnusedModifiers = parser.hasUnusedModifiers;
+	this.canBeExplicitConstructor = parser.canBeExplicitConstructor;
+}
 /*
  * Initializes the state of the parser that is about to go for BlockStatements.
  */
@@ -4755,6 +4787,15 @@
 	}
 	return false;
 }
+public ReferenceExpression newReferenceExpression() {
+	char[] selector = this.identifierStack[this.identifierPtr];
+	if (selector != assistIdentifier()){
+		return super.newReferenceExpression();
+	}
+	ReferenceExpression referenceExpression = new CompletionOnReferenceExpressionName();
+	this.assistNode = referenceExpression;
+	return referenceExpression;
+}
 public CompilationUnitDeclaration parse(ICompilationUnit sourceUnit, CompilationResult compilationResult, int cursorLoc) {
 
 	this.cursorLocation = cursorLoc;
@@ -4969,6 +5010,10 @@
 			break;
 	}
 }
+
+protected CommitRollbackParser createSnapShotParser() {
+	return new CompletionParser(this.problemReporter, this.storeSourceEnds);
+}
 /*
  * Reset internal state after completion is over
  */
@@ -4996,6 +5041,17 @@
 	this.cursorLocation = state[0];
 	completionScanner.cursorLocation = state[1];
 }
+@Override
+protected int resumeOnSyntaxError() {
+	if (this.monitor != null) {
+		if (++this.resumeOnSyntaxError > 100) {
+			this.resumeOnSyntaxError = 0;
+			if (this.monitor.isCanceled()) 
+				return HALT;
+		}
+	}
+	return super.resumeOnSyntaxError();
+}
 /*
  * Reset context so as to resume to regular parse loop
  * If unable to reset for resuming, answers false.
@@ -5003,13 +5059,21 @@
  * Move checkpoint location, reset internal stacks and
  * decide which grammar goal is activated.
  */
-protected boolean resumeAfterRecovery() {
+protected int resumeAfterRecovery() {
 	this.hasUnusedModifiers = false;
 	if (this.assistNode != null) {
+		
+		if (requireExtendedRecovery()) {
+			if (this.unstackedAct != ERROR_ACTION) {
+				return RESUME;
+			}
+			return super.resumeAfterRecovery();
+		}
+		
 		/* if reached [eof] inside method body, but still inside nested type,
 			or inside a field initializer, should continue in diet mode until
 			the end of the method body or compilation unit */
-		if ((this.scanner.eofPosition == this.cursorLocation+1)
+		if ((this.scanner.eofPosition >= this.cursorLocation+1)
 			&& (!(this.referenceContext instanceof CompilationUnitDeclaration)
 			|| isIndirectlyInsideFieldInitialization()
 			|| this.assistNodeParent instanceof FieldDeclaration && !(this.assistNodeParent instanceof Initializer))) {
@@ -5037,6 +5101,7 @@
 				}
 			}
 			*/
+
 			/* restart in diet mode for finding sibling constructs */
 			if (this.currentElement instanceof RecoveredType
 				|| this.currentElement.enclosingType() != null){
@@ -5050,7 +5115,7 @@
 				this.scanner.eofPosition = end < Integer.MAX_VALUE ? end + 1 : end;
 			} else {
 				resetStacks();
-				return false;
+				return HALT;
 			}
 		}
 	}
@@ -5059,6 +5124,11 @@
 public void setAssistIdentifier(char[] assistIdent){
 	((CompletionScanner)this.scanner).completionIdentifier = assistIdent;
 }
+
+protected void shouldStackAssistNode() {
+	this.shouldStackAssistNode = true;
+}
+
 public  String toString() {
 	StringBuffer buffer = new StringBuffer();
 	buffer.append("elementKindStack : int[] = {"); //$NON-NLS-1$
@@ -5085,7 +5155,15 @@
 
 	/* may be able to retrieve completionNode as an orphan, and then attach it */
 	completionIdentifierCheck();
+	// attachOrphanCompletionNode pops various stacks to construct astNodeParent and enclosingNode. This does not gel well with extended recovery.
+	CommitRollbackParser parser = null;
+	if (lastIndexOfElement(K_LAMBDA_EXPRESSION_DELIMITER) >= 0) {
+		parser = createSnapShotParser();
+		parser.copyState(this);
+	}
 	attachOrphanCompletionNode();
+	if (parser != null)
+		this.copyState(parser);
 
 	// if an assist node has been found and a recovered element exists,
 	// mark enclosing blocks as to be preserved
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.java
index 6d4f36c..127e955 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -56,6 +52,15 @@
 		null/*taskPriorities*/,
 		true/*taskCaseSensitive*/);
 }
+protected boolean isAtAssistIdentifier() {
+	if (this.cursorLocation < this.startPosition && this.currentPosition == this.startPosition) { // fake empty identifier got issued
+		return true;
+	}
+	if (this.cursorLocation+1 >= this.startPosition && this.cursorLocation < this.currentPosition) {
+		return true;
+	}
+	return false;
+}
 /*
  * Truncate the current identifier if it is containing the cursor location. Since completion is performed
  * on an identifier prefix.
@@ -199,6 +204,7 @@
 					this.currentPosition = this.startPosition; // for being detected as empty free identifier
 					return TokenNameIdentifier;
 				}
+				this.currentPosition = this.startPosition; // fake EOF should not drown the real next token.
 				return TokenNameEOF;
 			}
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistAnnotation.java
index 61ed93e..7c0b005 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistAnnotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistAnnotation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 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
@@ -17,6 +17,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.Annotation;
 import org.aspectj.org.eclipse.jdt.internal.core.JavaElement;
 
+@SuppressWarnings("rawtypes")
 public class AssistAnnotation extends Annotation {
 	private Map infoCache;
 	public AssistAnnotation(JavaElement parent, String name, Map infoCache) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistCompilationUnit.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistCompilationUnit.java
index 040458b..f61db11 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistCompilationUnit.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistCompilationUnit.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 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
@@ -23,6 +23,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.JavaElementInfo;
 import org.aspectj.org.eclipse.jdt.internal.core.PackageFragment;
 
+@SuppressWarnings("rawtypes")
 public class AssistCompilationUnit extends CompilationUnit {
 	private Map infoCache;
 	private Map bindingCache;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportContainer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportContainer.java
index c570f9f..21418b1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportContainer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportContainer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 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
@@ -18,6 +18,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.CompilationUnit;
 import org.aspectj.org.eclipse.jdt.internal.core.ImportContainer;
 
+@SuppressWarnings("rawtypes")
 public class AssistImportContainer extends ImportContainer {
 	private Map infoCache;
 	public AssistImportContainer(CompilationUnit parent, Map infoCache) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportDeclaration.java
index 8324dd2..689d8fb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistImportDeclaration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 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
@@ -17,6 +17,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.ImportContainer;
 import org.aspectj.org.eclipse.jdt.internal.core.ImportDeclaration;
 
+@SuppressWarnings("rawtypes")
 public class AssistImportDeclaration extends ImportDeclaration {
 	private Map infoCache;
 	public AssistImportDeclaration(ImportContainer parent, String name, boolean isOnDemand, Map infoCache) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistInitializer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistInitializer.java
index 303bcf2..170532e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistInitializer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistInitializer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 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
@@ -18,6 +18,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.Initializer;
 import org.aspectj.org.eclipse.jdt.internal.core.JavaElement;
 
+@SuppressWarnings("rawtypes")
 public class AssistInitializer extends Initializer {
 	private Map bindingCache;
 	private Map infoCache;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistOptions.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistOptions.java
index a28365a..1fc07ff 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistOptions.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistOptions.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,6 +14,7 @@
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 
+@SuppressWarnings("rawtypes")
 public class AssistOptions {
 	/**
 	 * Option IDs
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistPackageDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistPackageDeclaration.java
index bcceaa6..7d4b053 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistPackageDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistPackageDeclaration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 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
@@ -18,6 +18,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.CompilationUnit;
 import org.aspectj.org.eclipse.jdt.internal.core.PackageDeclaration;
 
+@SuppressWarnings("rawtypes")
 public class AssistPackageDeclaration extends PackageDeclaration {
 	private Map infoCache;
 	public AssistPackageDeclaration(CompilationUnit parent, String name, Map infoCache) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
index 0da0dea..bdc540c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,24 +15,50 @@
  *
  */
 
-import org.aspectj.org.eclipse.jdt.internal.compiler.ast.*;
+import java.util.HashSet;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Block;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ForeachStatement;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ImportReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Initializer;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MessageSend;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NameReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SuperReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
+import org.aspectj.org.eclipse.jdt.internal.compiler.parser.CommitRollbackParser;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.Parser;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveredBlock;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveredElement;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveredField;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveredInitializer;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveredMethod;
+import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveredStatement;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveredType;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveredUnit;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
-
+@SuppressWarnings({"rawtypes"})
 public abstract class AssistParser extends Parser {
 	public ASTNode assistNode;
 	public boolean isOrphanCompletionNode;
+	private boolean resumedAfterRepair = false;
 	// last modifiers info
 	protected int lastModifiers = ClassFileConstants.AccDefault;
 	protected int lastModifiersStart = -1;
@@ -72,7 +94,8 @@
 	protected static final int K_FIELD_INITIALIZER_DELIMITER = ASSIST_PARSER + 4; // whether we are inside a field initializer
 	protected static final int K_ATTRIBUTE_VALUE_DELIMITER = ASSIST_PARSER + 5; // whether we are inside a annotation attribute valuer
 	protected static final int K_ENUM_CONSTANT_DELIMITER = ASSIST_PARSER + 6; // whether we are inside a field initializer
-
+	protected static final int K_LAMBDA_EXPRESSION_DELIMITER = ASSIST_PARSER + 7; // whether we are inside a lambda expression
+	
 	// selector constants
 	protected static final int THIS_CONSTRUCTOR = -1;
 	protected static final int SUPER_CONSTRUCTOR = -2;
@@ -80,9 +103,13 @@
 	// enum constant constants
 	protected static final int NO_BODY = 0;
 	protected static final int WITH_BODY = 1;
+	
+	protected static final int EXPRESSION_BODY = 0;
+	protected static final int BLOCK_BODY = 1;
 
 	protected boolean isFirst = false;
 
+
 public AssistParser(ProblemReporter problemReporter) {
 	super(problemReporter, true);
 	this.javadocParser.checkDocComment = false;
@@ -90,8 +117,34 @@
 	setMethodsFullRecovery(false);
 	setStatementsRecovery(false);
 }
+
 public abstract char[] assistIdentifier();
 
+public void copyState(CommitRollbackParser from) {
+	
+	super.copyState(from);
+
+	AssistParser parser = (AssistParser) from;
+	
+	this.previousToken = parser.previousToken;
+	this.previousIdentifierPtr = parser.previousIdentifierPtr;
+	
+	this.lastModifiers = parser.lastModifiers;
+	this.lastModifiersStart = parser.lastModifiersStart;
+	
+	this.bracketDepth = parser.bracketDepth;
+	this.elementPtr = parser.elementPtr;
+	
+	int length;
+	System.arraycopy(parser.blockStarts, 0, this.blockStarts = new int [length = parser.blockStarts.length], 0, length);
+	System.arraycopy(parser.elementKindStack, 0, this.elementKindStack = new int [length = parser.elementKindStack.length], 0, length);
+	System.arraycopy(parser.elementInfoStack, 0, this.elementInfoStack = new int [length = parser.elementInfoStack.length], 0, length);
+	System.arraycopy(parser.elementObjectInfoStack, 0, this.elementObjectInfoStack = new Object [length = parser.elementObjectInfoStack.length], 0, length);
+	
+	this.previousKind = parser.previousKind;
+	this.previousInfo = parser.previousInfo;
+	this.previousObjectInfo = parser.previousObjectInfo;
+}
 /**
  * The parser become a simple parser which behave like a Parser
  * @return the state of the assist parser to be able to restore the assist parser state
@@ -122,6 +175,7 @@
 		RecoveredElement element = super.buildInitialRecoveryState();
 		flushAssistState();
 		flushElementStack();
+		this.snapShot = null;
 		return element;
 	}
 
@@ -162,13 +216,12 @@
 	element = element.add(block, 1);
 	int blockIndex = 1;	// ignore first block start, since manually rebuilt here
 
-	for(int i = 0; i <= this.astPtr; i++){
-		ASTNode node = this.astStack[i];
-
+	ASTNode node = null, lastNode = null;
+	for (int i = 0; i <= this.astPtr; i++, lastNode = node) {
+		node = this.astStack[i];
 		if(node instanceof ForeachStatement && ((ForeachStatement)node).action == null) {
 			node = ((ForeachStatement)node).elementVariable;
 		}
-
 		/* check for intermediate block creation, so recovery can properly close them afterwards */
 		int nodeStart = node.sourceStart;
 		for (int j = blockIndex; j <= this.realBlockPtr; j++){
@@ -178,7 +231,7 @@
 					break;
 				}
 				if (this.blockStarts[j] != lastStart){ // avoid multiple block if at same position
-					block = new Block(0);
+					block = new Block(0, lastNode instanceof LambdaExpression);
 					block.sourceStart = lastStart = this.blockStarts[j];
 					element = element.add(block, 1);
 				}
@@ -193,6 +246,7 @@
 			}
 			blockIndex = j+1; // shift the index to the new block
 		}
+		
 		if (node instanceof LocalDeclaration){
 			LocalDeclaration local = (LocalDeclaration) node;
 			if (local.declarationSourceEnd == 0){
@@ -256,24 +310,38 @@
 			}
 			continue;
 		}
+		if (this.assistNode != null && node instanceof Statement) {
+			Statement stmt = (Statement) node;
+			if (!(stmt instanceof Expression) || ((Expression) stmt).statementExpression()) {
+				if (this.assistNode.sourceStart >= stmt.sourceStart && this.assistNode.sourceEnd <= stmt.sourceEnd) {
+					element.add(stmt, 0);
+					this.lastCheckPoint = stmt.sourceEnd + 1;
+					this.isOrphanCompletionNode = false;
+				}
+			}
+			continue;
+		}
 		if (node instanceof ImportReference){
 			ImportReference importRef = (ImportReference) node;
 			element = element.add(importRef, 0);
 			this.lastCheckPoint = importRef.declarationSourceEnd + 1;
 		}
 	}
-	if (this.currentToken == TokenNameRBRACE) {
+	if (this.currentToken == TokenNameRBRACE && !isIndirectlyInsideLambdaExpression()) {
 		this.currentToken = 0; // closing brace has already been taken care of
 	}
 
 	/* might need some extra block (after the last reduced node) */
+	/* For block bodied lambdas we should create a block even though the lambda header appears before it, so elements from within don't get misattributed. */
 	int pos = this.assistNode == null ? this.lastCheckPoint : this.assistNode.sourceStart;
+	boolean createLambdaBlock = lastNode instanceof LambdaExpression && ((LambdaExpression) node).body() instanceof Block;
 	for (int j = blockIndex; j <= this.realBlockPtr; j++){
 		if (this.blockStarts[j] >= 0) {
-			if ((this.blockStarts[j] < pos) && (this.blockStarts[j] != lastStart)){ // avoid multiple block if at same position
-				block = new Block(0);
+			if ((this.blockStarts[j] < pos || createLambdaBlock) && (this.blockStarts[j] != lastStart)){ // avoid multiple block if at same position
+				block = new Block(0, createLambdaBlock);
 				block.sourceStart = lastStart = this.blockStarts[j];
 				element = element.add(block, 1);
+				createLambdaBlock = false;
 			}
 		} else {
 			if ((this.blockStarts[j] < pos)){ // avoid multiple block if at same position
@@ -359,10 +427,95 @@
 	super.consumeExitMemberValue();
 	popElement(K_ATTRIBUTE_VALUE_DELIMITER);
 }
+
 protected void consumeExplicitConstructorInvocation(int flag, int recFlag) {
 	super.consumeExplicitConstructorInvocation(flag, recFlag);
 	popElement(K_SELECTOR);
 }
+
+protected boolean triggerRecoveryUponLambdaClosure(Statement statement, boolean shouldCommit) {
+	// Last block statement reduced is required to be on the AST stack top.
+	boolean lambdaClosed = false;
+	int statementStart, statementEnd;
+	statementStart = statement.sourceStart;
+	statementEnd = statement instanceof AbstractVariableDeclaration ? ((AbstractVariableDeclaration)statement).declarationSourceEnd : statement.sourceEnd;
+	for (int i = this.elementPtr; i >= 0; --i) {
+		if (this.elementKindStack[i] != K_LAMBDA_EXPRESSION_DELIMITER)
+			continue;
+		LambdaExpression expression = (LambdaExpression) this.elementObjectInfoStack[i];
+		if (expression.sourceStart >= statementStart && expression.sourceEnd <= statementEnd) {
+			this.elementPtr = i - 1;
+			lambdaClosed = true;
+		} else {
+			if (shouldCommit) {
+				int stackLength = this.stack.length;
+				if (++this.stateStackTop >= stackLength) {
+					System.arraycopy(
+							this.stack, 0,
+							this.stack = new int[stackLength + StackIncrement], 0,
+							stackLength);
+				}
+				this.stack[this.stateStackTop] = this.unstackedAct;
+				commit();
+				this.stateStackTop --;
+			}
+			return false;
+		}
+	}
+	
+	if (lambdaClosed && this.currentElement != null) {
+		this.restartRecovery = true;
+		if (!(statement instanceof AbstractVariableDeclaration)) { // added already as part of standard recovery since these contribute a name to the scope prevailing at the cursor.
+			/* See if CompletionParser.attachOrphanCompletionNode has already added bits and pieces of AST to the recovery tree. If so, we want to
+			   replace those fragments with the fuller statement that provides target type for the lambda that got closed just now. There is prior
+			   art/precedent in the Java 7 world to this: Search for recoveredBlock.statements[--recoveredBlock.statementCount] = null;
+			   See also that this concern does not arise in the case of field/local initialization since the initializer is replaced with full tree by consumeExitVariableWithInitialization.
+			*/
+			ASTNode assistNodeParent = this.assistNodeParent();
+			ASTNode enclosingNode = this.enclosingNode();
+			if (assistNodeParent != null || enclosingNode != null) {
+				RecoveredBlock recoveredBlock = (RecoveredBlock) (this.currentElement instanceof RecoveredBlock ? this.currentElement : 
+													(this.currentElement.parent instanceof RecoveredBlock) ? this.currentElement.parent : null);
+				if (recoveredBlock != null) {
+					RecoveredStatement recoveredStatement = recoveredBlock.statementCount > 0 ? recoveredBlock.statements[recoveredBlock.statementCount - 1] : null;
+					ASTNode parseTree = recoveredStatement != null ? recoveredStatement.updatedStatement(0, new HashSet()) : null;
+					if (parseTree == assistNodeParent || parseTree == enclosingNode) {
+						recoveredBlock.statements[--recoveredBlock.statementCount] = null;
+						this.currentElement = recoveredBlock;
+					}
+				}
+			}
+			this.currentElement.add(statement, 0);
+		}
+	}
+	this.snapShot = null;
+	return lambdaClosed;
+}
+protected ASTNode assistNodeParent() {
+	return null;
+}
+protected ASTNode enclosingNode() {
+	return null;
+}
+
+protected boolean isAssistParser() {
+	return true;
+}
+protected void consumeBlockStatement() {
+	super.consumeBlockStatement();
+	triggerRecoveryUponLambdaClosure((Statement) this.astStack[this.astPtr], true);
+}
+protected void consumeBlockStatements() {
+	super.consumeBlockStatements();
+	triggerRecoveryUponLambdaClosure((Statement) this.astStack[this.astPtr], true);
+}
+protected void consumeFieldDeclaration() {
+	super.consumeFieldDeclaration();
+	if (triggerRecoveryUponLambdaClosure((Statement) this.astStack[this.astPtr], true)) {
+		if (this.currentElement instanceof RecoveredType)
+			popUntilElement(K_TYPE_DELIMITER);
+	}
+}
 protected void consumeForceNoDiet() {
 	super.consumeForceNoDiet();
 	// if we are not in a method (i.e. we are not in a local variable initializer)
@@ -385,15 +538,21 @@
 	super.consumeInterfaceHeader();
 	pushOnElementStack(K_TYPE_DELIMITER);
 }
+@Override
+protected void consumeNestedLambda() {
+	super.consumeNestedLambda();
+	LambdaExpression lexp = (LambdaExpression) this.astStack[this.astPtr];
+	pushOnElementStack(K_LAMBDA_EXPRESSION_DELIMITER, EXPRESSION_BODY, lexp);
+}
 protected void consumeMethodBody() {
 	super.consumeMethodBody();
 	popElement(K_METHOD_DELIMITER);
 }
-protected void consumeMethodDeclaration(boolean isNotAbstract) {
+protected void consumeMethodDeclaration(boolean isNotAbstract, boolean isDefaultMethod) {
 	if (!isNotAbstract) {
 		popElement(K_METHOD_DELIMITER);
 	}
-	super.consumeMethodDeclaration(isNotAbstract);
+	super.consumeMethodDeclaration(isNotAbstract, isDefaultMethod);
 }
 protected void consumeMethodHeader() {
 	super.consumeMethodHeader();
@@ -453,16 +612,32 @@
 }
 protected void consumeOpenBlock() {
 	// OpenBlock ::= $empty
-
 	super.consumeOpenBlock();
+
 	int stackLength = this.blockStarts.length;
 	if (this.realBlockPtr >= stackLength) {
 		System.arraycopy(
-			this.blockStarts, 0,
-			this.blockStarts = new int[stackLength + StackIncrement], 0,
-			stackLength);
+				this.blockStarts, 0,
+				this.blockStarts = new int[stackLength + StackIncrement], 0,
+				stackLength);
 	}
 	this.blockStarts[this.realBlockPtr] = this.scanner.startPosition;
+	if (requireExtendedRecovery()) {
+		// This is an epsilon production: We are in the state with kernel item: Block ::= .OpenBlock LBRACE BlockStatementsopt RBRACE
+		if (this.currentToken == TokenNameLBRACE && this.unstackedAct > NUM_RULES) { // wait for chain reductions to finish before commit.
+			stackLength = this.stack.length;
+			if (++this.stateStackTop >= stackLength - 1) {   // Need two slots.
+				System.arraycopy(
+						this.stack, 0,
+						this.stack = new int[stackLength + StackIncrement], 0,
+						stackLength);
+			}
+			this.stack[this.stateStackTop++] = this.unstackedAct; // transition to Block ::= OpenBlock  .LBRACE BlockStatementsopt RBRACE
+			this.stack[this.stateStackTop] = tAction(this.unstackedAct, this.currentToken); // transition to Block ::= OpenBlock LBRACE  .BlockStatementsopt RBRACE 
+			commit();
+			this.stateStackTop -= 2;
+		}
+	}
 }
 protected void consumeOpenFakeBlock() {
 	// OpenBlock ::= $empty
@@ -789,6 +964,10 @@
 				}
 				break;
 			case TokenNameLBRACE:
+				if (this.previousToken == TokenNameARROW) {
+					popElement(K_LAMBDA_EXPRESSION_DELIMITER);
+					pushOnElementStack(K_LAMBDA_EXPRESSION_DELIMITER, BLOCK_BODY, this.previousObjectInfo);
+				}
 				this.bracketDepth++;
 				break;
 			case TokenNameLBRACKET:
@@ -1174,8 +1353,8 @@
 	this.previousIdentifierPtr = -1;
 	this.bracketDepth = 0;
 }
-public void initialize(boolean initializeNLS) {
-	super.initialize(initializeNLS);
+public void initialize(boolean parsingCompilationUnit) {
+	super.initialize(parsingCompilationUnit);
 	flushAssistState();
 	flushElementStack();
 	this.previousIdentifierPtr = -1;
@@ -1200,6 +1379,15 @@
 	}
 	return false;
 }
+protected boolean isIndirectlyInsideLambdaExpression(){
+	int i = this.elementPtr;
+	while (i > -1) {
+		if (this.elementKindStack[i] == K_LAMBDA_EXPRESSION_DELIMITER)
+			return true;
+		i--;
+	}
+	return false;
+}
 protected boolean isIndirectlyInsideType(){
 	int i = this.elementPtr;
 	while(i > -1) {
@@ -1401,6 +1589,7 @@
 		initializer.bits |= ASTNode.HasLocalType;
 	}
 }
+
 /**
  * Parse the block statements inside the given method declaration and try to complete at the
  * cursor location.
@@ -1462,21 +1651,41 @@
 	}
 
 }
-protected void popElement(int kind){
-	if(this.elementPtr < 0 || this.elementKindStack[this.elementPtr] != kind) return;
 
-	this.previousKind = this.elementKindStack[this.elementPtr];
-	this.previousInfo = this.elementInfoStack[this.elementPtr];
-	this.previousObjectInfo = this.elementObjectInfoStack[this.elementPtr];
-
-	this.elementObjectInfoStack[this.elementPtr] = null;
-
-	switch (kind) {
-		default :
-			this.elementPtr--;
-			break;
+// the name is a misnomer, we allow "pop"s not just at the TOS. Lambda wants to be sticky till fully reduced, however we do want other elements poppped at the right point, so ... 
+protected void popElement(int kind) {
+	
+	if (this.elementPtr < 0)
+		return;
+	
+	int stackPointer = this.elementPtr;
+	
+	if (this.elementKindStack[stackPointer] == K_LAMBDA_EXPRESSION_DELIMITER) {
+		if (kind == K_FIELD_INITIALIZER_DELIMITER) // wait until lambda is reduced.
+			return;
 	}
-}
+	
+	if (kind != K_LAMBDA_EXPRESSION_DELIMITER) {
+		while (this.elementKindStack[stackPointer] == K_LAMBDA_EXPRESSION_DELIMITER) {
+			stackPointer --;
+		}
+	}
+	if (stackPointer < 0 || this.elementKindStack[stackPointer] != kind)
+		return;
+	
+	this.previousKind = this.elementKindStack[stackPointer];
+	this.previousInfo = this.elementInfoStack[stackPointer];
+	this.previousObjectInfo = this.elementObjectInfoStack[stackPointer];
+
+	final int length = this.elementPtr - stackPointer;
+	if (length > 0) {
+		System.arraycopy(this.elementKindStack, stackPointer + 1, this.elementKindStack, stackPointer, length);
+		System.arraycopy(this.elementInfoStack, stackPointer + 1, this.elementInfoStack, stackPointer, length);
+		System.arraycopy(this.elementObjectInfoStack, stackPointer + 1, this.elementObjectInfoStack, stackPointer, length);
+	}
+	this.elementObjectInfoStack[this.elementPtr] = null;
+	this.elementPtr--;
+ }
 protected void popUntilElement(int kind){
 	if(this.elementPtr < 0) return;
 	int i = this.elementPtr;
@@ -1532,6 +1741,11 @@
 		flushElementStack();
 	}
 }
+
+public boolean requireExtendedRecovery() {
+	return lastIndexOfElement(K_LAMBDA_EXPRESSION_DELIMITER) >= 0;
+}
+
 protected void pushOnElementStack(int kind){
 	this.pushOnElementStack(kind, 0, null);
 }
@@ -1594,7 +1808,7 @@
 			break;
 		case TokenNameRBRACE :
 			super.recoveryTokenCheck();
-			if(this.currentElement != oldElement && !isInsideAttributeValue()) {
+			if(this.currentElement != oldElement && !isInsideAttributeValue() && !isIndirectlyInsideLambdaExpression()) {
 				if(oldElement instanceof RecoveredInitializer
 					|| oldElement instanceof RecoveredMethod
 					|| (oldElement instanceof RecoveredBlock && oldElement.parent instanceof RecoveredInitializer)
@@ -1626,8 +1840,19 @@
  * Move checkpoint location, reset internal stacks and
  * decide which grammar goal is activated.
  */
-protected boolean resumeAfterRecovery() {
-
+protected int resumeAfterRecovery() {
+	if (requireExtendedRecovery()) {
+		if (this.unstackedAct == ERROR_ACTION) {
+			int mode = fallBackToSpringForward((Statement) null);
+			this.resumedAfterRepair = mode == RESUME;
+			if (mode == RESUME || mode == HALT)
+				return mode;
+			// else fall through and RESTART
+		} else {
+			return RESUME;
+		}
+	}
+		
 	// reset internal stacks
 	this.astPtr = -1;
 	this.astLengthPtr = -1;
@@ -1635,15 +1860,20 @@
 	this.expressionLengthPtr = -1;
 	this.typeAnnotationLengthPtr = -1;
 	this.typeAnnotationPtr = -1;
+	
 	this.identifierPtr = -1;
 	this.identifierLengthPtr	= -1;
 	this.intPtr = -1;
+	
+	
 	this.dimensions = 0 ;
 	this.recoveredStaticInitializerStart = 0;
 
 	this.genericsIdentifiersLengthPtr = -1;
 	this.genericsLengthPtr = -1;
 	this.genericsPtr = -1;
+	
+	this.valueLambdaNestDepth = -1;
 
 	this.modifiers = ClassFileConstants.AccDefault;
 	this.modifiersSourceStart = -1;
@@ -1652,7 +1882,12 @@
 	if (this.diet) this.dietInt = 0;
 
 	/* attempt to move checkpoint location */
-	if (!moveRecoveryCheckpoint()) return false;
+	if (this.unstackedAct != ERROR_ACTION && this.resumedAfterRepair) {
+		this.scanner.ungetToken(this.currentToken);  // effectively move recovery checkpoint *backwards*.
+	} else {
+		if (!moveRecoveryCheckpoint()) return HALT;
+	}
+	this.resumedAfterRepair = false;
 
 	// only look for headers
 	if (this.referenceContext instanceof CompilationUnitDeclaration
@@ -1673,7 +1908,7 @@
 			goForHeaders();
 			this.diet = true; // passed this point, will not consider method bodies
 		}
-		return true;
+		return RESTART;
 	}
 	if (this.referenceContext instanceof AbstractMethodDeclaration
 		|| this.referenceContext instanceof TypeDeclaration){
@@ -1685,10 +1920,10 @@
 			prepareForBlockStatements();
 			goForBlockStatementsOrCatchHeader();
 		}
-		return true;
+		return RESTART;
 	}
 	// does not know how to restart
-	return false;
+	return HALT;
 }
 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=292087
 // To be implemented in children viz. CompletionParser that are aware of array initializers
@@ -1761,4 +1996,4 @@
 		return ast;
 	}
 }
-}
+}
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceField.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceField.java
index 0ce1bc6..62d2099 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceField.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceField.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 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
@@ -20,6 +20,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.JavaElement;
 import org.aspectj.org.eclipse.jdt.internal.core.ResolvedSourceField;
 
+@SuppressWarnings("rawtypes")
 public class AssistSourceField extends ResolvedSourceField {
 	private Map bindingCache;
 	private Map infoCache;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceMethod.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceMethod.java
index cfd15eb..1bc24db 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceMethod.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceMethod.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 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
@@ -21,6 +21,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.JavaElement;
 import org.aspectj.org.eclipse.jdt.internal.core.ResolvedSourceMethod;
 
+@SuppressWarnings("rawtypes")
 public class AssistSourceMethod extends ResolvedSourceMethod {
 	private Map bindingCache;
 	private Map infoCache;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceType.java
index 40cde79..f78802b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistSourceType.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 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
@@ -24,6 +24,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.JavaElement;
 import org.aspectj.org.eclipse.jdt.internal.core.ResolvedSourceType;
 
+@SuppressWarnings("rawtypes")
 public class AssistSourceType extends ResolvedSourceType {
 	private Map bindingCache;
 	private Map infoCache;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistTypeParameter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistTypeParameter.java
index c5f996f..9cd5bc4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistTypeParameter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/AssistTypeParameter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 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
@@ -17,6 +17,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.JavaElement;
 import org.aspectj.org.eclipse.jdt.internal.core.TypeParameter;
 
+@SuppressWarnings("rawtypes")
 public class AssistTypeParameter extends TypeParameter {
 	private Map infoCache;
 	public AssistTypeParameter(JavaElement parent, String name, Map infoCache) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Engine.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Engine.java
index cf7d78c..6ab13d9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Engine.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/impl/Engine.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
@@ -25,6 +25,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.NameLookup;
 import org.aspectj.org.eclipse.jdt.internal.core.SearchableEnvironment;
 
+@SuppressWarnings("rawtypes")
 public abstract class Engine implements ITypeRequestor {
 
 	public LookupEnvironment lookupEnvironment;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnArgumentName.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnArgumentName.java
index a146112..8561660 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnArgumentName.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnArgumentName.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.codeassist.select;
 
@@ -23,7 +25,10 @@
 		super(name, posNom, tr, modifiers);
 	}
 
-	public void bind(MethodScope scope, TypeBinding typeBinding, boolean used) {
+	public SelectionOnArgumentName(char[] name , long posNom , TypeReference tr , int modifiers, boolean typeElided){
+		super(name, posNom, tr, modifiers, typeElided);
+	}
+	public TypeBinding bind(MethodScope scope, TypeBinding typeBinding, boolean used) {
 
 		super.bind(scope, typeBinding, used);
 		throw new SelectionNodeFound(this.binding);
@@ -47,4 +52,9 @@
 		super.resolve(scope);
 		throw new SelectionNodeFound(this.binding);
 	}
+	
+	public TypeBinding resolveForCatch(BlockScope scope) {
+		super.resolveForCatch(scope);
+		throw new SelectionNodeFound(this.binding);
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnLambdaExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnLambdaExpression.java
new file mode 100644
index 0000000..18ddb34
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnLambdaExpression.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2014 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.aspectj.org.eclipse.jdt.internal.codeassist.select;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+
+public class SelectionOnLambdaExpression extends LambdaExpression {
+	public SelectionOnLambdaExpression(LambdaExpression expression) {
+		// Where is object derivation when I need it ???
+		super(expression.compilationResult(), true);
+		// copy all state created by the parser.
+		this.sourceStart = expression.sourceStart;
+		this.sourceEnd = expression.sourceEnd;
+		this.hasParentheses = expression.hasParentheses;
+		this.statementEnd = expression.statementEnd;
+		this.setBody(expression.body());
+		this.setArguments(expression.arguments());
+		this.setArrowPosition(expression.arrowPosition());
+	}
+	@Override
+	public TypeBinding resolveType(BlockScope blockScope) {
+		TypeBinding resolveType = super.resolveType(blockScope);
+		if (this.expectedType != null && this.original == this) {  // final resolution.
+			throw new SelectionNodeFound(this.descriptor);
+		}
+		return resolveType;
+	}
+}
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnMessageSend.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnMessageSend.java
index e4a8e37..7cf1de0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnMessageSend.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnMessageSend.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
@@ -67,7 +67,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpression.java
new file mode 100644
index 0000000..76fc020
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpression.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014 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.aspectj.org.eclipse.jdt.internal.codeassist.select;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+
+public class SelectionOnReferenceExpression extends ReferenceExpression {
+	
+	public SelectionOnReferenceExpression(ReferenceExpression referenceExpression) {
+		initialize(referenceExpression.compilationResult, referenceExpression.lhs, referenceExpression.typeArguments, referenceExpression.selector, referenceExpression.sourceEnd);
+	}
+	
+	@Override
+	public TypeBinding resolveType(BlockScope scope) {
+		TypeBinding resolveType = super.resolveType(scope);
+		if (this.expectedType != null && !this.trialResolution)
+			throw new SelectionNodeFound(this.descriptor);
+		return resolveType;
+	}
+}
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpressionName.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpressionName.java
new file mode 100644
index 0000000..0ee69b4
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionOnReferenceExpressionName.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * 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.aspectj.org.eclipse.jdt.internal.codeassist.select;
+
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+
+public class SelectionOnReferenceExpressionName extends ReferenceExpression {
+
+	public SelectionOnReferenceExpressionName() {
+		super();
+	}
+
+	public StringBuffer printExpression(int indent, StringBuffer output) {
+		output.append("<SelectionOnReferenceExpressionName:"); //$NON-NLS-1$
+		super.printExpression(indent, output);
+		return output.append('>');
+	}
+	
+	// See SelectionScanner#scanIdentifierOrKeyword
+	public boolean isConstructorReference() {
+		return CharOperation.equals(this.selector, "new".toCharArray()); //$NON-NLS-1$
+	}
+	
+	// See SelectionScanner#scanIdentifierOrKeyword
+	public boolean isMethodReference() {
+		return !CharOperation.equals(this.selector, "new".toCharArray()); //$NON-NLS-1$
+	}
+
+	public TypeBinding resolveType(BlockScope scope) {
+		TypeBinding type = super.resolveType(scope);
+		if (type instanceof PolyTypeBinding)
+			return type;
+		MethodBinding method = getMethodBinding();
+		if (method != null && method.isValidBinding() && !method.isSynthetic())
+			throw new SelectionNodeFound(this.actualMethodBinding);
+		throw new SelectionNodeFound();
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
index ae999be..e553203 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -24,17 +20,48 @@
  *  n  means completion behind the n-th character
  */
 
-import org.aspectj.org.eclipse.jdt.internal.compiler.*;
-import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
-import org.aspectj.org.eclipse.jdt.internal.compiler.env.*;
-
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
-import org.aspectj.org.eclipse.jdt.internal.codeassist.impl.*;
-import org.aspectj.org.eclipse.jdt.internal.compiler.ast.*;
+import org.aspectj.org.eclipse.jdt.internal.codeassist.impl.AssistParser;
+import org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AllocationExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Argument;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CaseStatement;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CastExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ImportReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MemberValuePair;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MessageSend;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NameReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NormalAnnotation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Reference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReturnStatement;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleNameReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SuperReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SwitchStatement;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
-import org.aspectj.org.eclipse.jdt.internal.compiler.parser.*;
-import org.aspectj.org.eclipse.jdt.internal.compiler.problem.*;
+import org.aspectj.org.eclipse.jdt.internal.compiler.parser.CommitRollbackParser;
+import org.aspectj.org.eclipse.jdt.internal.compiler.parser.JavadocParser;
+import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveredType;
+import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
 public class SelectionParser extends AssistParser {
@@ -53,7 +80,6 @@
 	/* public fields */
 
 	public int selectionStart, selectionEnd;
-
 	public static final char[] SUPER = "super".toCharArray(); //$NON-NLS-1$
 	public static final char[] THIS = "this".toCharArray(); //$NON-NLS-1$
 
@@ -86,10 +112,13 @@
 		if (orphan instanceof Expression) {
 			buildMoreCompletionContext((Expression)orphan);
 		} else {
-			Statement statement = (Statement) orphan;
-			this.currentElement = this.currentElement.add(statement, 0);
+			if (lastIndexOfElement(K_LAMBDA_EXPRESSION_DELIMITER) < 0) { // lambdas are recovered up to the containing expression statement and will carry along the assist node anyways.
+				Statement statement = (Statement) orphan;
+				this.currentElement = this.currentElement.add(statement, 0);
+			}
 		}
-		this.currentToken = 0; // given we are not on an eof, we do not want side effects caused by looked-ahead token
+		if (!isIndirectlyInsideLambdaExpression())
+			this.currentToken = 0; // given we are not on an eof, we do not want side effects caused by looked-ahead token
 	}
 }
 private void buildMoreCompletionContext(Expression expression) {
@@ -147,12 +176,15 @@
 				break nextElement;
 		}
 	}
-	if(parentNode != null) {
-		this.currentElement = this.currentElement.add((Statement)parentNode, 0);
-	} else {
-		this.currentElement = this.currentElement.add((Statement)wrapWithExplicitConstructorCallIfNeeded(expression), 0);
-		if(this.lastCheckPoint < expression.sourceEnd) {
-			this.lastCheckPoint = expression.sourceEnd + 1;
+	// Do not add assist node/parent into the recovery system if we are inside a lambda. The lambda will be fully recovered including the containing statement and added.
+	if (lastIndexOfElement(K_LAMBDA_EXPRESSION_DELIMITER) < 0) {
+		if(parentNode != null) {
+			this.currentElement = this.currentElement.add((Statement)parentNode, 0);
+		} else {
+			this.currentElement = this.currentElement.add((Statement)wrapWithExplicitConstructorCallIfNeeded(expression), 0);
+			if(this.lastCheckPoint < expression.sourceEnd) {
+				this.lastCheckPoint = expression.sourceEnd + 1;
+			}
 		}
 	}
 }
@@ -307,6 +339,7 @@
 		long namePositions = this.identifierPositionStack[this.identifierPtr--];
 		this.intPtr--; // dimension from the variabledeclaratorid
 		TypeReference type = (TypeReference) this.astStack[this.astPtr--];
+		this.astLengthPtr --;
 		int modifierPositions = this.intStack[this.intPtr--];
 		this.intPtr--;
 		Argument arg =
@@ -378,7 +411,6 @@
 		char [] oldIdent = assistIdentifier();
 		setAssistIdentifier(null);
 		alloc.type = getTypeReference(0);
-		rejectIllegalLeadingTypeAnnotations(alloc.type);
 		checkForDiamond(alloc.type);
 
 		setAssistIdentifier(oldIdent);
@@ -443,7 +475,6 @@
 		char [] oldIdent = assistIdentifier();
 		setAssistIdentifier(null);
 		alloc.type = getTypeReference(0);
-		rejectIllegalLeadingTypeAnnotations(alloc.type);
 		checkForDiamond(alloc.type);
 
 		setAssistIdentifier(oldIdent);
@@ -520,7 +551,8 @@
 	if (!this.diet){
 		this.restartRecovery	= true;	// force to restart in recovery mode
 		this.lastIgnoredToken = -1;
-		this.currentToken = 0; // opening brace already taken into account
+		if (!isIndirectlyInsideLambdaExpression())
+			this.currentToken = 0; // opening brace already taken into account
 		this.hasReportedError = true;
 	}
 
@@ -530,7 +562,8 @@
 	if (this.currentElement != null){
 		this.lastCheckPoint = anonymousType.bodyStart;
 		this.currentElement = this.currentElement.add(anonymousType, 0);
-		this.currentToken = 0; // opening brace already taken into account
+		if (!isIndirectlyInsideLambdaExpression())
+			this.currentToken = 0; // opening brace already taken into account
 		this.lastIgnoredToken = -1;
 	}
 }
@@ -559,9 +592,9 @@
 	int end =  variable.initialization.sourceEnd;
 	if ((this.selectionStart < start) &&  (this.selectionEnd < start) ||
 			(this.selectionStart > end) && (this.selectionEnd > end)) {
-		variable.initialization = null;
+			variable.initialization = null;
 	}
-
+	triggerRecoveryUponLambdaClosure(variable, false);
 }
 
 protected void consumeFieldAccess(boolean isSuperAccess) {
@@ -634,18 +667,13 @@
 		int firstDimensions = this.intStack[this.intPtr--];
 		TypeReference type = getTypeReference(firstDimensions);
 
-		final int typeDimensions = firstDimensions + extendedDimensions + (isVarArgs ? 1 : 0);
-		if (typeDimensions != firstDimensions) {
-			// jsr308 type annotations management
-			Annotation [][] annotationsOnFirstDimensions = firstDimensions == 0 ? null : type.getAnnotationsOnDimensions();
-			Annotation [][] annotationsOnAllDimensions = annotationsOnFirstDimensions;
-			if (annotationsOnExtendedDimensions != null) {
-				annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(firstDimensions, annotationsOnFirstDimensions, extendedDimensions, annotationsOnExtendedDimensions);
+		if (isVarArgs || extendedDimensions != 0) {
+			if (isVarArgs) {
+				type = augmentTypeWithAdditionalDimensions(type, 1, varArgsAnnotations != null ? new Annotation[][] { varArgsAnnotations } : null, true);	
+			} 
+			if (extendedDimensions != 0) { // combination illegal.
+				type = augmentTypeWithAdditionalDimensions(type, extendedDimensions, annotationsOnExtendedDimensions, false);
 			}
-			if (varArgsAnnotations != null) {
-				annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(firstDimensions + extendedDimensions, annotationsOnAllDimensions, 1, new Annotation[][]{varArgsAnnotations});
-			}
-			type = copyDims(type, typeDimensions, annotationsOnAllDimensions);
 			type.sourceEnd = type.isParameterizedTypeReference() ? this.endStatementPosition : this.endPosition;
 		}
 		if (isVarArgs) {
@@ -729,6 +757,31 @@
 		this.lastIgnoredToken = -1;
 	}
 }
+@Override
+protected void consumeLambdaExpression() {
+	super.consumeLambdaExpression();
+	LambdaExpression expression = (LambdaExpression) this.expressionStack[this.expressionPtr];
+	int arrowEnd = expression.arrowPosition();
+	int arrowStart = arrowEnd - 1;
+	if (this.selectionStart == arrowStart || this.selectionStart == arrowEnd) {
+		if (this.selectionEnd == arrowStart || this.selectionEnd == arrowEnd) {
+			this.expressionStack[this.expressionPtr] = new SelectionOnLambdaExpression(expression);
+		}
+	}
+}
+@Override
+protected void consumeReferenceExpression(ReferenceExpression referenceExpression) {
+	int kolonKolonStart = this.colonColonStart;
+	int kolonKolonEnd = kolonKolonStart + 1;
+	this.colonColonStart = -1;
+	if (this.selectionStart == kolonKolonStart || this.selectionStart == kolonKolonEnd) {
+		if (this.selectionEnd == kolonKolonStart || this.selectionEnd == kolonKolonEnd) {
+			referenceExpression = new SelectionOnReferenceExpression(referenceExpression);
+		}
+	}
+	super.consumeReferenceExpression(referenceExpression);
+}
+
 protected void consumeLocalVariableDeclarationStatement() {
 	super.consumeLocalVariableDeclarationStatement();
 
@@ -1162,6 +1215,9 @@
 		this.restartRecovery = true; // used to avoid branching back into the regular automaton
 	}
 }
+protected CommitRollbackParser createSnapShotParser() {
+	return new SelectionParser(this.problemReporter);
+}
 public ImportReference createAssistImportReference(char[][] tokens, long[] positions, int mod){
 	return new SelectionOnImportReference(tokens, positions, mod);
 }
@@ -1316,6 +1372,15 @@
 public void initializeScanner(){
 	this.scanner = new SelectionScanner(this.options.sourceLevel);
 }
+public ReferenceExpression newReferenceExpression() {
+	char[] selector = this.identifierStack[this.identifierPtr];
+	if (selector != assistIdentifier()){
+		return super.newReferenceExpression();
+	}
+	ReferenceExpression referenceExpression = new SelectionOnReferenceExpressionName();
+	this.assistNode = referenceExpression;
+	return referenceExpression;
+}
 protected MessageSend newMessageSend() {
 	// '(' ArgumentListopt ')'
 	// the arguments are on the expression stack
@@ -1381,6 +1446,7 @@
 	selectionScanner.selectionEnd = end;
 	return super.parse(sourceUnit, compilationResult, -1, -1/*parse without reseting the scanner*/);
 }
+
 /*
  * Reset context so as to resume to regular parse loop
  * If unable to reset for resuming, answers false.
@@ -1388,23 +1454,29 @@
  * Move checkpoint location, reset internal stacks and
  * decide which grammar goal is activated.
  */
-protected boolean resumeAfterRecovery() {
+protected int resumeAfterRecovery() {
 
 	/* if reached assist node inside method body, but still inside nested type,
 		should continue in diet mode until the end of the method body */
 	if (this.assistNode != null
 		&& !(this.referenceContext instanceof CompilationUnitDeclaration)){
 		this.currentElement.preserveEnclosingBlocks();
+		if (requireExtendedRecovery()) {
+			if (this.unstackedAct != ERROR_ACTION) {
+				return RESUME;
+			}
+			return super.resumeAfterRecovery();
+		}
 		if (this.currentElement.enclosingType() == null) {
-			if(!(this.currentElement instanceof RecoveredType)) {
+			if (!(this.currentElement instanceof RecoveredType)) {
 				resetStacks();
-				return false;
+				return HALT;
 			}
 
-			RecoveredType recoveredType = (RecoveredType)this.currentElement;
-			if(recoveredType.typeDeclaration != null && recoveredType.typeDeclaration.allocation == this.assistNode){
+			RecoveredType recoveredType = (RecoveredType) this.currentElement;
+			if (recoveredType.typeDeclaration != null && recoveredType.typeDeclaration.allocation == this.assistNode) {
 				resetStacks();
-				return false;
+				return HALT;
 			}
 		}
 	}
@@ -1441,7 +1513,26 @@
 	*/
 	recoveryTokenCheck();
 }
+protected Argument typeElidedArgument() {
+	char[] selector = this.identifierStack[this.identifierPtr];
+	if (selector != assistIdentifier()){
+		return super.typeElidedArgument();
+	}	
+	this.identifierLengthPtr--;
+	char[] identifierName = this.identifierStack[this.identifierPtr];
+	long namePositions = this.identifierPositionStack[this.identifierPtr--];
 
+	Argument argument =
+		new SelectionOnArgumentName(
+			identifierName,
+			namePositions,
+			null, // elided type
+			ClassFileConstants.AccDefault,
+			true);
+	argument.declarationSourceStart = (int) (namePositions >>> 32);
+	this.assistNode = argument;
+	return argument;
+}
 public  String toString() {
 	String s = Util.EMPTY_STRING;
 	s = s + "elementKindStack : int[] = {"; //$NON-NLS-1$
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionScanner.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionScanner.java
index 20122bd..88f7382 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionScanner.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/codeassist/select/SelectionScanner.java
@@ -32,6 +32,10 @@
 	super(false /*comment*/, false /*whitespace*/, false /*nls*/, sourceLevel, null /*taskTags*/, null/*taskPriorities*/, true/*taskCaseSensitive*/);
 }
 
+protected boolean isAtAssistIdentifier() {
+	return this.selectionStart == this.startPosition && this.selectionEnd == this.currentPosition - 1;
+}
+
 public char[] getCurrentIdentifierSource() {
 
 	if (this.selectionIdentifier == null){
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ASTVisitor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ASTVisitor.java
index 84ddabf..0bb58f4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ASTVisitor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ASTVisitor.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile.java
index 97a8677..9303e1a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ClassFile.java
@@ -1,20 +1,25 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Contributions for
  *							Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335             
- *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *							Bug 406982 - [1.8][compiler] Generation of MethodParameters Attribute in classfile
+ *							Bug 416885 - [1.8][compiler]IncompatibleClassChange error (edit)
+ *							Bug 412149 - [1.8][compiler] Emit repeated annotations into the designated container
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409236 - [1.8][compiler] Type annotations on intersection cast types dropped by code generator
+ *                          Bug 409246 - [1.8][compiler] Type annotations on catch parameters not handled properly
+ *                          Bug 415541 - [1.8][compiler] Type annotations in the body of static initializer get dropped
+ *                          Bug 415399 - [1.8][compiler] Type annotations on constructor results dropped by the code generator
+ *                          Bug 415470 - [1.8][compiler] Type annotations on class declaration go vanishing
+ *                          Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler;
 
@@ -61,7 +66,6 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.CodeStream;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.ConstantPool;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.ExceptionLabel;
-import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.MultiCatchExceptionLabel;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.Opcodes;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.StackMapFrame;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.StackMapFrameCodeStream;
@@ -111,6 +115,7 @@
  *      information. Those bytes are decodable with a regular class file reader,
  *      such as DietClassFileReader
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ClassFile implements TypeConstants, TypeIds {
 
 	private byte[] bytes;
@@ -203,30 +208,28 @@
 		System.arraycopy(problems, 0, problemsCopy, 0, problemsLength);
 
 		AbstractMethodDeclaration[] methodDecls = typeDeclaration.methods;
+		boolean abstractMethodsOnly = false;
 		if (methodDecls != null) {
 			if (typeBinding.isInterface()) {
-				// we cannot create problem methods for an interface. So we have to generate a clinit
-				// which should contain all the problem
+				if (typeBinding.scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_8)
+					abstractMethodsOnly = true;
+				// We generate a clinit which contains all the problems, since we may not be able to generate problem methods (< 1.8) and problem constructors (all levels).
 				classFile.addProblemClinit(problemsCopy);
-				for (int i = 0, length = methodDecls.length; i < length; i++) {
-					AbstractMethodDeclaration methodDecl = methodDecls[i];
-					MethodBinding method = methodDecl.binding;
-					if (method == null || method.isConstructor()) continue;
+			}
+			for (int i = 0, length = methodDecls.length; i < length; i++) {
+				AbstractMethodDeclaration methodDecl = methodDecls[i];
+				MethodBinding method = methodDecl.binding;
+				if (method == null) continue;
+				if (abstractMethodsOnly) {
 					method.modifiers = ClassFileConstants.AccPublic | ClassFileConstants.AccAbstract;
-					classFile.addAbstractMethod(methodDecl, method);
 				}
-			} else {
-				for (int i = 0, length = methodDecls.length; i < length; i++) {
-					AbstractMethodDeclaration methodDecl = methodDecls[i];
-					MethodBinding method = methodDecl.binding;
-					if (method == null) continue;
-					if (method.isConstructor()) {
-						classFile.addProblemConstructor(methodDecl, method, problemsCopy);
-					} else if (method.isAbstract()) {
-						classFile.addAbstractMethod(methodDecl, method);
-					} else {
-						classFile.addProblemMethod(methodDecl, method, problemsCopy);
-					}
+				if (method.isConstructor()) {
+					if (typeBinding.isInterface()) continue;
+					classFile.addProblemConstructor(methodDecl, method, problemsCopy);
+				} else if (method.isAbstract()) {
+					classFile.addAbstractMethod(methodDecl, method);
+				} else {
+					classFile.addProblemMethod(methodDecl, method, problemsCopy);
 				}
 			}
 			// add abstract methods
@@ -270,6 +273,9 @@
 			if (this.targetJDK >= ClassFileConstants.JDK1_8) {
 				this.produceAttributes |= ClassFileConstants.ATTR_TYPE_ANNOTATION;
 				this.codeStream = new TypeAnnotationCodeStream(this);
+				if (options.produceMethodParameters) {
+					this.produceAttributes |= ClassFileConstants.ATTR_METHOD_PARAMETERS;
+				}
 			} else {
 				this.codeStream = new StackMapFrameCodeStream(this);
 			}
@@ -357,7 +363,14 @@
 				if (annotations == null) annotations = typeDeclaration.annotations;
 				// End AspectJ Extension
 				if (annotations != null) {
-					attributesNumber += generateRuntimeAnnotations(annotations);
+					long targetMask;
+					if (typeDeclaration.isPackageInfo())
+						targetMask = TagBits.AnnotationForPackage;
+					else if (this.referenceBinding.isAnnotationType())
+						targetMask = TagBits.AnnotationForType | TagBits.AnnotationForAnnotationType;
+					else
+						targetMask = TagBits.AnnotationForType | TagBits.AnnotationForTypeUse;
+					attributesNumber += generateRuntimeAnnotations(annotations, targetMask); 
 				}
 			}
 		}
@@ -465,7 +478,7 @@
 			if (fieldDeclaration != null) {
 				Annotation[] annotations = fieldDeclaration.annotations;
 				if (annotations != null) {
-					attributesNumber += generateRuntimeAnnotations(annotations);
+					attributesNumber += generateRuntimeAnnotations(annotations, TagBits.AnnotationForField);
 				}
 
 				if ((this.produceAttributes & ClassFileConstants.ATTR_TYPE_ANNOTATION) != 0) {
@@ -691,6 +704,10 @@
 		AbstractMethodDeclaration method,
 		MethodBinding methodBinding,
 		CategorizedProblem[] problems) {
+		
+		if (methodBinding.declaringClass.isInterface()) {
+			method.abort(ProblemSeverities.AbortType, null);
+		}
 
 		// always clear the strictfp/native/abstract bit for a problem method
 		generateMethodInfoHeader(methodBinding, methodBinding.modifiers & ~(ClassFileConstants.AccStrictfp | ClassFileConstants.AccNative | ClassFileConstants.AccAbstract));
@@ -935,6 +952,10 @@
 						case SyntheticMethodBinding.FactoryMethod:
 							addSyntheticFactoryMethod(syntheticMethod);
 							break;	
+						case SyntheticMethodBinding.DeserializeLambda:
+							// TODO [andy] do we need to do this after the loop to ensure it is done last?
+							addSyntheticDeserializeLambda(syntheticMethod,this.referenceBinding.syntheticMethods()); 
+							break;
 					}
 				}
 				emittedSyntheticsCount = currentSyntheticsCount;
@@ -1067,6 +1088,9 @@
 				.compilationResult
 				.getLineSeparatorPositions());
 		// update the number of attributes
+		if ((this.produceAttributes & ClassFileConstants.ATTR_METHOD_PARAMETERS) != 0) {
+			attributeNumber += generateMethodParameters(methodBinding);
+		}
 		this.contents[methodAttributeOffset++] = (byte) (attributeNumber >> 8);
 		this.contents[methodAttributeOffset] = (byte) attributeNumber;
 	}
@@ -1422,17 +1446,10 @@
 		}
 		
 		ExceptionLabel[] exceptionLabels = this.codeStream.exceptionLabels;
-		int tableIndex = 0;
 		for (int i = 0, max = this.codeStream.exceptionLabelsCounter; i < max; i++) {
 			ExceptionLabel exceptionLabel = exceptionLabels[i];
-			if (exceptionLabel instanceof MultiCatchExceptionLabel) {
-				MultiCatchExceptionLabel multiCatchExceptionLabel = (MultiCatchExceptionLabel)exceptionLabel;
-				tableIndex += multiCatchExceptionLabel.getAllAnnotationContexts(tableIndex, allTypeAnnotationContexts);
-			} else {
-				if (exceptionLabel.exceptionTypeReference != null) { // ignore those which cannot be annotated
-					exceptionLabel.exceptionTypeReference.getAllAnnotationContexts(AnnotationTargetTypeConstants.EXCEPTION_PARAMETER, tableIndex, allTypeAnnotationContexts);
-				}
-				tableIndex++;
+			if (exceptionLabel.exceptionTypeReference != null && (exceptionLabel.exceptionTypeReference.bits & ASTNode.HasTypeAnnotations) != 0) {
+				exceptionLabel.exceptionTypeReference.getAllAnnotationContexts(AnnotationTargetTypeConstants.EXCEPTION_PARAMETER, i, allTypeAnnotationContexts, exceptionLabel.se7Annotations);
 			}
 		}
 		
@@ -1590,6 +1607,10 @@
 					true);
 		}
 
+		if ((this.produceAttributes & ClassFileConstants.ATTR_TYPE_ANNOTATION) != 0) {
+			attributesNumber += generateTypeAnnotationsOnCodeAttribute();
+		}
+
 		// update the number of attributes
 		// ensure first that there is enough space available inside the contents array
 		if (codeAttributeAttributeOffset + 2 >= this.contents.length) {
@@ -1700,6 +1721,10 @@
 					true);
 		}
 
+		if ((this.produceAttributes & ClassFileConstants.ATTR_TYPE_ANNOTATION) != 0) {
+			attributesNumber += generateTypeAnnotationsOnCodeAttribute();
+		}
+		
 		// update the number of attributes
 		// ensure first that there is enough space available inside the contents array
 		if (codeAttributeAttributeOffset + 2 >= this.contents.length) {
@@ -2106,7 +2131,7 @@
 					}
 				}
 				Annotation[] annotations = methodDeclaration.annotations;
-				if (annotations != null && binding.returnType.id != T_void) {
+				if (annotations != null && !methodDeclaration.isClinit() && (methodDeclaration.isConstructor() || binding.returnType.id != T_void)) {
 					methodDeclaration.getAllAnnotationContexts(AnnotationTargetTypeConstants.METHOD_RETURN, allTypeAnnotationContexts);
 				}
 				if (!methodDeclaration.isConstructor() && !methodDeclaration.isClinit() && binding.returnType.id != T_void) {
@@ -2151,6 +2176,9 @@
 						invisibleTypeAnnotationsCounter);
 			}
 		}
+		if ((this.produceAttributes & ClassFileConstants.ATTR_METHOD_PARAMETERS) != 0) {
+			attributesNumber += generateMethodParameters(binding);
+		}
 		// update the number of attributes
 		this.contents[methodAttributeOffset++] = (byte) (attributesNumber >> 8);
 		this.contents[methodAttributeOffset] = (byte) attributesNumber;
@@ -2212,8 +2240,7 @@
 				// bytecode offset
 				this.contents[this.contentsOffset++] = (byte) (annotationContext.info >> 8);
 				this.contents[this.contentsOffset++] = (byte) annotationContext.info;
-				// type_argument_index not set for cast
-				this.contents[this.contentsOffset++] = (byte)0;
+				this.contents[this.contentsOffset++] = (byte) annotationContext.info2;
 				break;
 				
 			case AnnotationTargetTypeConstants.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT :
@@ -2844,52 +2871,150 @@
 		if (methodHandlesLookup == null) return 0; // skip bootstrap section, class path problem already reported, just avoid NPE.
 		recordInnerClasses(methodHandlesLookup); // Should be done, it's what javac does also
 		ReferenceBinding javaLangInvokeLambdaMetafactory = this.referenceBinding.scope.getJavaLangInvokeLambdaMetafactory(); 
-		int indexForMetaFactory = this.constantPool.literalIndexForMethodHandle(ClassFileConstants.MethodHandleRefKindInvokeStatic, javaLangInvokeLambdaMetafactory, 
-				ConstantPool.METAFACTORY, ConstantPool.JAVA_LANG_INVOKE_LAMBDAMETAFACTORY_METAFACTORY_SIGNATURE, false);
+		
+		// Depending on the complexity of the expression it may be necessary to use the altMetafactory() rather than the metafactory()
+		int indexForMetaFactory = 0;
+		int indexForAltMetaFactory = 0;
 
 		int numberOfBootstraps = functionalExpressionList.size();
 		int localContentsOffset = this.contentsOffset;
 		// Generate the boot strap attribute - since we are only making lambdas and
 		// functional expressions, we know the size ahead of time - this less general
 		// than the full invokedynamic scope, but fine for Java 8
+		
 		int exSize = 10 * numberOfBootstraps + 8;
 		if (exSize + localContentsOffset >= this.contents.length) {
 			resizeContents(exSize);
 		}
-		this.contentsOffset += exSize;
 		
 		int attributeNameIndex =
 			this.constantPool.literalIndex(AttributeNamesConstants.BootstrapMethodsName);
 		this.contents[localContentsOffset++] = (byte) (attributeNameIndex >> 8);
 		this.contents[localContentsOffset++] = (byte) attributeNameIndex;
-		int value = (numberOfBootstraps * 10) + 2;
-		this.contents[localContentsOffset++] = (byte) (value >> 24);
-		this.contents[localContentsOffset++] = (byte) (value >> 16);
-		this.contents[localContentsOffset++] = (byte) (value >> 8);
-		this.contents[localContentsOffset++] = (byte) value;
+		// leave space for attribute_length and remember where to insert it
+		int attributeLengthPosition = localContentsOffset;
+		localContentsOffset += 4;
 		this.contents[localContentsOffset++] = (byte) (numberOfBootstraps >> 8);
 		this.contents[localContentsOffset++] = (byte) numberOfBootstraps;
 		for (int i = 0; i < numberOfBootstraps; i++) {
 			FunctionalExpression functional = (FunctionalExpression) functionalExpressionList.get(i);
-			this.contents[localContentsOffset++] = (byte) (indexForMetaFactory >> 8);
-			this.contents[localContentsOffset++] = (byte) indexForMetaFactory;
-			
-			this.contents[localContentsOffset++] = 0;
-			this.contents[localContentsOffset++] = (byte) 3;
-			
-			int functionalDescriptorIndex = this.constantPool.literalIndexForMethodHandle(functional.descriptor.original());
-			this.contents[localContentsOffset++] = (byte) (functionalDescriptorIndex >> 8);
-			this.contents[localContentsOffset++] = (byte) functionalDescriptorIndex;
+			MethodBinding [] bridges = functional.getRequiredBridges();
+			TypeBinding[] markerInterfaces = null;
+			if (functional instanceof LambdaExpression && 
+				   (((markerInterfaces=((LambdaExpression)functional).getMarkerInterfaces()) != null) ||
+				   	((LambdaExpression)functional).isSerializable) ||
+				   	bridges != null) {
+				
+				LambdaExpression lambdaEx = (LambdaExpression)functional;
+				// may need even more space
+				int extraSpace = 2; // at least 2 more than when the normal metafactory is used, for the bitflags entry
+				if (markerInterfaces != null) {
+					// 2 for the marker interface list size then 2 per marker interface index
+					extraSpace += (2 + 2 * markerInterfaces.length);
+				}
+				if (bridges != null) {
+					// 2 for bridge count then 2 per bridge method type.
+					extraSpace += (2 + 2 * bridges.length);
+				}
+				if (extraSpace + localContentsOffset >= this.contents.length) {
+					resizeContents(extraSpace);
+				} 
+				
+				if (indexForAltMetaFactory == 0) {
+					indexForAltMetaFactory = 
+						this.constantPool.literalIndexForMethodHandle(ClassFileConstants.MethodHandleRefKindInvokeStatic, javaLangInvokeLambdaMetafactory, 
+						ConstantPool.ALTMETAFACTORY, ConstantPool.JAVA_LANG_INVOKE_LAMBDAMETAFACTORY_ALTMETAFACTORY_SIGNATURE, false);
+				}
+				this.contents[localContentsOffset++] = (byte) (indexForAltMetaFactory >> 8);
+				this.contents[localContentsOffset++] = (byte) indexForAltMetaFactory;
+				
+				// u2 num_bootstrap_arguments
+				this.contents[localContentsOffset++] = 0;
+				this.contents[localContentsOffset++] = (byte) (4 + (markerInterfaces==null?0:1+markerInterfaces.length) + 
+						                                                   (bridges == null ? 0 : 1 + bridges.length));
+				
+				int functionalDescriptorIndex = this.constantPool.literalIndexForMethodType(functional.descriptor.original().signature());
+				this.contents[localContentsOffset++] = (byte) (functionalDescriptorIndex >> 8);
+				this.contents[localContentsOffset++] = (byte) functionalDescriptorIndex;
+	
+				int methodHandleIndex = this.constantPool.literalIndexForMethodHandle(functional.binding.original()); // Speak of " implementation" (erased) version here, adaptations described below.
+				this.contents[localContentsOffset++] = (byte) (methodHandleIndex >> 8);
+				this.contents[localContentsOffset++] = (byte) methodHandleIndex;
+	
+				char [] instantiatedSignature = functional.descriptor.signature();
+				int methodTypeIndex = this.constantPool.literalIndexForMethodType(instantiatedSignature);
+				this.contents[localContentsOffset++] = (byte) (methodTypeIndex >> 8);
+				this.contents[localContentsOffset++] = (byte) methodTypeIndex;
 
-			int methodHandleIndex = this.constantPool.literalIndexForMethodHandle(functional.binding.original()); // Speak of " implementation" (erased) version here, adaptations described below.
-			this.contents[localContentsOffset++] = (byte) (methodHandleIndex >> 8);
-			this.contents[localContentsOffset++] = (byte) methodHandleIndex;
-
-			char [] instantiatedSignature = functional.descriptor.signature();
-			int methodTypeIndex = this.constantPool.literalIndexForMethodType(instantiatedSignature);
-			this.contents[localContentsOffset++] = (byte) (methodTypeIndex >> 8);
-			this.contents[localContentsOffset++] = (byte) methodTypeIndex;
+				int bitflags = 0;
+				if (lambdaEx.isSerializable) {
+					bitflags |= ClassFileConstants.FLAG_SERIALIZABLE;
+				}
+				if (markerInterfaces!=null) {
+					bitflags |= ClassFileConstants.FLAG_MARKERS;
+				}
+				if (bridges != null) {
+					bitflags |= ClassFileConstants.FLAG_BRIDGES;
+				}
+				int indexForBitflags = this.constantPool.literalIndex(bitflags);
+				
+				this.contents[localContentsOffset++] = (byte)(indexForBitflags>>8);
+				this.contents[localContentsOffset++] = (byte)(indexForBitflags);
+				
+				if (markerInterfaces != null) {
+					int markerInterfaceCountIndex =  this.constantPool.literalIndex(markerInterfaces.length);
+					this.contents[localContentsOffset++] = (byte)(markerInterfaceCountIndex>>8);
+					this.contents[localContentsOffset++] = (byte)(markerInterfaceCountIndex);
+					for (int m = 0, maxm = markerInterfaces.length; m < maxm; m++) {
+						int classTypeIndex = this.constantPool.literalIndexForType(markerInterfaces[m]);
+						this.contents[localContentsOffset++] = (byte)(classTypeIndex>>8);
+						this.contents[localContentsOffset++] = (byte)(classTypeIndex);
+					}					
+				}
+				if (bridges != null) {
+					int bridgeCountIndex =  this.constantPool.literalIndex(bridges.length);
+					this.contents[localContentsOffset++] = (byte) (bridgeCountIndex >> 8);
+					this.contents[localContentsOffset++] = (byte) (bridgeCountIndex);
+					for (int m = 0, maxm = bridges.length; m < maxm; m++) {
+						char [] bridgeSignature = bridges[m].signature();
+						int bridgeMethodTypeIndex = this.constantPool.literalIndexForMethodType(bridgeSignature);
+						this.contents[localContentsOffset++] = (byte) (bridgeMethodTypeIndex >> 8);
+						this.contents[localContentsOffset++] = (byte) bridgeMethodTypeIndex;
+					}					
+				}
+			} else {
+				if (indexForMetaFactory == 0) {
+					indexForMetaFactory = this.constantPool.literalIndexForMethodHandle(ClassFileConstants.MethodHandleRefKindInvokeStatic, javaLangInvokeLambdaMetafactory, 
+							ConstantPool.METAFACTORY, ConstantPool.JAVA_LANG_INVOKE_LAMBDAMETAFACTORY_METAFACTORY_SIGNATURE, false);
+				}
+				this.contents[localContentsOffset++] = (byte) (indexForMetaFactory >> 8);
+				this.contents[localContentsOffset++] = (byte) indexForMetaFactory;
+				
+				// u2 num_bootstrap_arguments
+				this.contents[localContentsOffset++] = 0;
+				this.contents[localContentsOffset++] = (byte) 3;
+				
+				int functionalDescriptorIndex = this.constantPool.literalIndexForMethodType(functional.descriptor.original().signature());
+				this.contents[localContentsOffset++] = (byte) (functionalDescriptorIndex >> 8);
+				this.contents[localContentsOffset++] = (byte) functionalDescriptorIndex;
+	
+				int methodHandleIndex = this.constantPool.literalIndexForMethodHandle(functional.binding.original()); // Speak of " implementation" (erased) version here, adaptations described below.
+				this.contents[localContentsOffset++] = (byte) (methodHandleIndex >> 8);
+				this.contents[localContentsOffset++] = (byte) methodHandleIndex;
+	
+				char [] instantiatedSignature = functional.descriptor.signature();
+				int methodTypeIndex = this.constantPool.literalIndexForMethodType(instantiatedSignature);
+				this.contents[localContentsOffset++] = (byte) (methodTypeIndex >> 8);
+				this.contents[localContentsOffset++] = (byte) methodTypeIndex;				
+			}
 		}
+
+		int attributeLength = localContentsOffset - attributeLengthPosition - 4;
+		this.contents[attributeLengthPosition++] = (byte) (attributeLength >> 24);
+		this.contents[attributeLengthPosition++] = (byte) (attributeLength >> 16);
+		this.contents[attributeLengthPosition++] = (byte) (attributeLength >> 8);
+		this.contents[attributeLengthPosition++] = (byte) attributeLength;
+		this.contentsOffset = localContentsOffset;
 		return 1;
 	}
 	private int generateLineNumberAttribute() {
@@ -3199,7 +3324,7 @@
 			if (methodDeclaration != null) {
 				Annotation[] annotations = methodDeclaration.annotations;
 				if (annotations != null) {
-					attributesNumber += generateRuntimeAnnotations(annotations);
+					attributesNumber += generateRuntimeAnnotations(annotations, methodBinding.isConstructor() ? TagBits.AnnotationForConstructor : TagBits.AnnotationForMethod);
 				}
 				if ((methodBinding.tagBits & TagBits.HasParameterAnnotations) != 0) {
 					Argument[] arguments = methodDeclaration.arguments;
@@ -3211,7 +3336,7 @@
 				LambdaExpression lambda = methodBinding.sourceLambda();
 				if (lambda != null) {
 					if ((methodBinding.tagBits & TagBits.HasParameterAnnotations) != 0) {
-						Argument[] arguments = lambda.arguments;
+						Argument[] arguments = lambda.arguments();
 						if (arguments != null) {
 							int parameterCount = methodBinding.parameters.length;
 							int argumentCount = arguments.length;
@@ -3305,6 +3430,33 @@
 		this.contents[this.contentsOffset++] = (byte) (descriptorIndex >> 8);
 		this.contents[this.contentsOffset++] = (byte) descriptorIndex;
 	}
+	
+	public void addSyntheticDeserializeLambda(SyntheticMethodBinding methodBinding, SyntheticMethodBinding[] syntheticMethodBindings ) {
+		generateMethodInfoHeader(methodBinding);
+		int methodAttributeOffset = this.contentsOffset;
+		// this will add exception attribute, synthetic attribute, deprecated attribute,...
+		int attributeNumber = generateMethodInfoAttributes(methodBinding);
+		// Code attribute
+		int codeAttributeOffset = this.contentsOffset;
+		attributeNumber++; // add code attribute
+		generateCodeAttributeHeader();
+		this.codeStream.init(this);
+		this.codeStream.generateSyntheticBodyForDeserializeLambda(methodBinding, syntheticMethodBindings);
+		completeCodeAttributeForSyntheticMethod(
+			methodBinding,
+			codeAttributeOffset,
+			((SourceTypeBinding) methodBinding.declaringClass)
+				.scope
+				.referenceCompilationUnit()
+				.compilationResult
+				.getLineSeparatorPositions());
+		// update the number of attributes
+		if ((this.produceAttributes & ClassFileConstants.ATTR_METHOD_PARAMETERS) != 0) {
+			attributeNumber += generateMethodParameters(methodBinding);
+		}
+		this.contents[methodAttributeOffset++] = (byte) (attributeNumber >> 8);
+		this.contents[methodAttributeOffset] = (byte) attributeNumber;
+	}	
 
 	/**
 	 * INTERNAL USE-ONLY
@@ -3418,19 +3570,25 @@
 
 	/**
 	 * @param annotations
+	 * @param targetMask allowed targets
 	 * @return the number of attributes created while dumping the annotations in the .class file
 	 */
-	private int generateRuntimeAnnotations(final Annotation[] annotations) {
+	private int generateRuntimeAnnotations(final Annotation[] annotations, final long targetMask) {
 		int attributesNumber = 0;
 		final int length = annotations.length;
 		int visibleAnnotationsCounter = 0;
 		int invisibleAnnotationsCounter = 0;
-
 		for (int i = 0; i < length; i++) {
-			Annotation annotation = annotations[i];
-			if (annotation.isRuntimeInvisible()) {
+			Annotation annotation;
+			if ((annotation = annotations[i].getPersistibleAnnotation()) == null) continue; // already packaged into container.
+			long annotationMask = annotation.resolvedType != null ? annotation.resolvedType.getAnnotationTagBits() & TagBits.AnnotationTargetMASK : 0;
+			// AspectJ Extension: this prevents a Type targeting annotation being stashed on a
+			// method representing an 'declare @type'. So don't enforce this restriction
+//			if (annotationMask != 0 && (annotationMask & targetMask) == 0) continue;
+			// AspectJ Extension: End
+			if (annotation.isRuntimeInvisible() || annotation.isRuntimeTypeInvisible()) {
 				invisibleAnnotationsCounter++;
-			} else if (annotation.isRuntimeVisible()) {
+			} else if (annotation.isRuntimeVisible() || annotation.isRuntimeTypeVisible()) {
 				visibleAnnotationsCounter++;
 			}
 		}
@@ -3455,8 +3613,14 @@
 			int counter = 0;
 			loop: for (int i = 0; i < length; i++) {
 				if (invisibleAnnotationsCounter == 0) break loop;
-				Annotation annotation = annotations[i];
-				if (annotation.isRuntimeInvisible()) {
+				Annotation annotation;
+				if ((annotation = annotations[i].getPersistibleAnnotation()) == null) continue; // already packaged into container.
+				long annotationMask = annotation.resolvedType != null ? annotation.resolvedType.getAnnotationTagBits() & TagBits.AnnotationTargetMASK : 0;
+				// AspectJ Extension: this prevents a Type targeting annotation being stashed on a
+				// method representing an 'declare @type'. So don't enforce this restriction
+//				if (annotationMask != 0 && (annotationMask & targetMask) == 0) continue;
+				// AspectJ Extension: end
+				if (annotation.isRuntimeInvisible() || annotation.isRuntimeTypeInvisible()) {
 					int currentAnnotationOffset = this.contentsOffset;
 					generateAnnotation(annotation, currentAnnotationOffset);
 					invisibleAnnotationsCounter--;
@@ -3502,8 +3666,14 @@
 			int counter = 0;
 			loop: for (int i = 0; i < length; i++) {
 				if (visibleAnnotationsCounter == 0) break loop;
-				Annotation annotation = annotations[i];
-				if (annotation.isRuntimeVisible()) {
+				Annotation annotation;
+				if ((annotation = annotations[i].getPersistibleAnnotation()) == null) continue; // already packaged into container.
+				long annotationMask = annotation.resolvedType != null ? annotation.resolvedType.getAnnotationTagBits() & TagBits.AnnotationTargetMASK : 0;
+				// AspectJ Extension: this prevents a Type targeting annotation being stashed on a
+				// method representing an 'declare @type'. So don't enforce this restriction
+//				if (annotationMask != 0 && (annotationMask & targetMask) == 0) continue;
+				// AspectJ Extension: end
+				if (annotation.isRuntimeVisible() || annotation.isRuntimeTypeVisible()) {
 					visibleAnnotationsCounter--;
 					int currentAnnotationOffset = this.contentsOffset;
 					generateAnnotation(annotation, currentAnnotationOffset);
@@ -3529,6 +3699,7 @@
 		}
 		return attributesNumber;
 	}
+	
 	private int generateRuntimeAnnotationsForParameters(Argument[] arguments) {
 		final int argumentsLength = arguments.length;
 		final int VISIBLE_INDEX = 0;
@@ -3541,7 +3712,10 @@
 			Annotation[] annotations = argument.annotations;
 			if (annotations != null) {
 				for (int j = 0, max2 = annotations.length; j < max2; j++) {
-					Annotation annotation = annotations[j];
+					Annotation annotation;
+					if ((annotation = annotations[j].getPersistibleAnnotation()) == null) continue; // already packaged into container.
+					long annotationMask = annotation.resolvedType != null ? annotation.resolvedType.getAnnotationTagBits() & TagBits.AnnotationTargetMASK : 0;
+					if (annotationMask != 0 && (annotationMask & TagBits.AnnotationForParameter) == 0) continue;
 					if (annotation.isRuntimeInvisible()) {
 						annotationsCounters[i][INVISIBLE_INDEX]++;
 						invisibleParametersAnnotationsCounter++;
@@ -3584,7 +3758,10 @@
 						Argument argument = arguments[i];
 						Annotation[] annotations = argument.annotations;
 						for (int j = 0, max = annotations.length; j < max; j++) {
-							Annotation annotation = annotations[j];
+							Annotation annotation;
+							if ((annotation = annotations[j].getPersistibleAnnotation()) == null) continue; // already packaged into container.
+							long annotationMask = annotation.resolvedType != null ? annotation.resolvedType.getAnnotationTagBits() & TagBits.AnnotationTargetMASK : 0;
+							if (annotationMask != 0 && (annotationMask & TagBits.AnnotationForParameter) == 0) continue;
 							if (annotation.isRuntimeInvisible()) {
 								int currentAnnotationOffset = this.contentsOffset;
 								generateAnnotation(annotation, currentAnnotationOffset);
@@ -3642,7 +3819,10 @@
 						Argument argument = arguments[i];
 						Annotation[] annotations = argument.annotations;
 						for (int j = 0, max = annotations.length; j < max; j++) {
-							Annotation annotation = annotations[j];
+							Annotation annotation;
+							if ((annotation = annotations[j].getPersistibleAnnotation()) == null) continue; // already packaged into container.
+							long annotationMask = annotation.resolvedType != null ? annotation.resolvedType.getAnnotationTagBits() & TagBits.AnnotationTargetMASK : 0;
+							if (annotationMask != 0 && (annotationMask & TagBits.AnnotationForParameter) == 0) continue;
 							if (annotation.isRuntimeVisible()) {
 								int currentAnnotationOffset = this.contentsOffset;
 								generateAnnotation(annotation, currentAnnotationOffset);
@@ -3783,6 +3963,120 @@
 		return attributesNumber;
 	}
 
+	/**
+	 * @param binding the given method binding
+	 * @return the number of attributes created while dumping he method's parameters in the .class file (0 or 1)
+	 */
+	private int generateMethodParameters(final MethodBinding binding) {
+		
+		int initialContentsOffset = this.contentsOffset;
+		int length = 0; // count of actual parameters
+		
+		AbstractMethodDeclaration methodDeclaration = binding.sourceMethod();
+		
+		boolean isConstructor = binding.isConstructor();
+		TypeBinding[] targetParameters = binding.parameters;
+		ReferenceBinding declaringClass = binding.declaringClass;
+
+		if (declaringClass.isEnum()) {
+			if (isConstructor) { // insert String name,int ordinal
+				length = writeArgumentName(ConstantPool.EnumName, ClassFileConstants.AccSynthetic, length);
+				length = writeArgumentName(ConstantPool.EnumOrdinal, ClassFileConstants.AccSynthetic, length);
+			} else if (CharOperation.equals(ConstantPool.ValueOf, binding.selector)) { // insert String name
+				length = writeArgumentName(ConstantPool.Name, ClassFileConstants.AccMandated, length);
+				targetParameters =  Binding.NO_PARAMETERS; // Override "unknown" synthetics below
+			}
+		}
+
+		boolean needSynthetics = isConstructor && declaringClass.isNestedType();
+		if (needSynthetics) {
+			// Take into account the synthetic argument names
+			// This tracks JLS8, paragraph 8.8.9
+			boolean anonymousWithLocalSuper = declaringClass.isAnonymousType() && declaringClass.superclass().isLocalType();
+			boolean anonymousWithNestedSuper = declaringClass.isAnonymousType() && declaringClass.superclass().isNestedType();
+			boolean isImplicitlyDeclared = ((! declaringClass.isPrivate()) || declaringClass.isAnonymousType()) && !anonymousWithLocalSuper;
+			ReferenceBinding[] syntheticArgumentTypes = declaringClass.syntheticEnclosingInstanceTypes();
+			if (syntheticArgumentTypes != null) {
+				for (int i = 0, count = syntheticArgumentTypes.length; i < count; i++) {
+					// This behaviour tracks JLS 15.9.5.1
+					// This covers that the parameter ending up in a nested class must be mandated "on the way in", even if it
+					// isn't the first. The practical relevance of this is questionable, since the constructor call will be
+					// generated by the same constructor.
+					boolean couldForwardToMandated = anonymousWithNestedSuper ? declaringClass.superclass().enclosingType().equals(syntheticArgumentTypes[i]) : true;
+					int modifier = couldForwardToMandated && isImplicitlyDeclared ? ClassFileConstants.AccMandated : ClassFileConstants.AccSynthetic;
+					char[] name = CharOperation.concat(
+							TypeConstants.SYNTHETIC_ENCLOSING_INSTANCE_PREFIX,
+							String.valueOf(i).toCharArray()); // cannot use depth, can be identical
+					length = writeArgumentName(name, modifier | ClassFileConstants.AccFinal, length);
+				}
+			}
+			if (binding instanceof SyntheticMethodBinding) {
+				targetParameters = ((SyntheticMethodBinding)binding).targetMethod.parameters;
+				methodDeclaration = ((SyntheticMethodBinding)binding).targetMethod.sourceMethod();
+			}
+		}
+		if (targetParameters != Binding.NO_PARAMETERS) {
+			for (int i = 0, max = targetParameters.length; i < max; i++) {
+				if (methodDeclaration != null && methodDeclaration.arguments != null && methodDeclaration.arguments.length > i && methodDeclaration.arguments[i] != null) {
+					Argument argument = methodDeclaration.arguments[i];
+					length = writeArgumentName(argument.name, argument.binding.modifiers, length);
+				} else {
+					length = writeArgumentName(null, ClassFileConstants.AccSynthetic, length);
+				}
+			}
+		}
+		if (needSynthetics) {
+			SyntheticArgumentBinding[] syntheticOuterArguments = declaringClass.syntheticOuterLocalVariables();
+			int count = syntheticOuterArguments == null ? 0 : syntheticOuterArguments.length;
+			for (int i = 0; i < count; i++) {
+				length = writeArgumentName(syntheticOuterArguments[i].name, syntheticOuterArguments[i].modifiers  | ClassFileConstants.AccSynthetic, length);
+			}
+			// move the extra padding arguments of the synthetic constructor invocation to the end
+			for (int i = targetParameters.length, extraLength = binding.parameters.length; i < extraLength; i++) {
+				TypeBinding parameter = binding.parameters[i];
+				length = writeArgumentName(parameter.constantPoolName(), ClassFileConstants.AccSynthetic, length);
+			}
+		}
+
+		if (length > 0) {
+			// so we actually output the parameter
+	 		int attributeLength = 1 + 4 * length; // u1 for count, u2+u2 per parameter
+			if (this.contentsOffset + 6 + attributeLength >= this.contents.length) {
+				resizeContents(6 + attributeLength);
+			}
+			int methodParametersNameIndex = this.constantPool.literalIndex(AttributeNamesConstants.MethodParametersName);
+			this.contents[initialContentsOffset++] = (byte) (methodParametersNameIndex >> 8);
+			this.contents[initialContentsOffset++] = (byte) methodParametersNameIndex;
+			this.contents[initialContentsOffset++] = (byte) (attributeLength >> 24);
+			this.contents[initialContentsOffset++] = (byte) (attributeLength >> 16);
+			this.contents[initialContentsOffset++] = (byte) (attributeLength >> 8);
+			this.contents[initialContentsOffset++] = (byte) attributeLength;
+			this.contents[initialContentsOffset++] = (byte) length;
+			return 1;
+		}
+		else {
+			return 0;
+		}
+	}
+	private int writeArgumentName(char[] name, int modifiers, int oldLength) {
+		int ensureRoomForBytes = 4;
+		if (oldLength == 0) {
+			// Make room for 
+			ensureRoomForBytes += 7;
+			this.contentsOffset += 7; // Make room for attribute header + count byte
+		}
+		if (this.contentsOffset + ensureRoomForBytes > this.contents.length) {
+				resizeContents(ensureRoomForBytes);
+		}
+		int parameterNameIndex = name == null ? 0 : this.constantPool.literalIndex(name);
+		this.contents[this.contentsOffset++] = (byte) (parameterNameIndex >> 8);
+		this.contents[this.contentsOffset++] = (byte) parameterNameIndex;
+		int flags = modifiers & (ClassFileConstants.AccFinal | ClassFileConstants.AccSynthetic | ClassFileConstants.AccMandated);
+		this.contents[this.contentsOffset++] = (byte) (flags >> 8);
+		this.contents[this.contentsOffset++] = (byte) flags;
+		return oldLength + 1;
+	}
+
 	private int generateSignatureAttribute(char[] genericSignature) {
 		int localContentsOffset = this.contentsOffset;
 		if (localContentsOffset + 8 >= this.contents.length) {
@@ -4383,19 +4677,15 @@
 	}
 	
 	private void generateTypeAnnotation(AnnotationContext annotationContext, int currentOffset) {
-		if (annotationContext.wildcard != null) {
-			generateWildcardTypeAnnotation(annotationContext, currentOffset);
+		Annotation annotation = annotationContext.annotation.getPersistibleAnnotation();
+		if (annotation == null || annotation.resolvedType == null)
 			return;
-		}
 		
 		int targetType = annotationContext.targetType;
 
 		int[] locations = Annotation.getLocations(
 			annotationContext.typeReference,
-			annotationContext.primaryAnnotations,
-			annotationContext.annotation,
-			annotationContext.annotationsOnDimensions,
-			annotationContext.dimensions);
+			annotationContext.annotation);
 
 		if (this.contentsOffset + 5 >= this.contents.length) {
 			resizeContents(5);
@@ -4403,30 +4693,9 @@
 		this.contents[this.contentsOffset++] = (byte) targetType;
 		dumpTargetTypeContents(targetType, annotationContext);
 		dumpLocations(locations);
-		
-		// common part between type annotation and annotation
-		generateAnnotation(annotationContext.annotation, currentOffset);
+		generateAnnotation(annotation, currentOffset);
 	}
 
-	private void generateWildcardTypeAnnotation(AnnotationContext annotationContext, int currentOffset) {
-		int targetType = annotationContext.targetType;
-
-		int[] locations = Annotation.getLocations(
-				annotationContext.typeReference,
-				null,
-				annotationContext.annotation,
-				null,
-				0);
-		// reserve enough space
-		if (this.contentsOffset + 5 >= this.contents.length) {
-			resizeContents(5);
-		}
-		this.contents[this.contentsOffset++] = (byte) targetType;
-		dumpTargetTypeContents(targetType, annotationContext);
-		dumpLocations(locations);
-		generateAnnotation(annotationContext.annotation, currentOffset);
-	}
-	
 	private int generateTypeAnnotationAttributeForTypeDeclaration() {
 		TypeDeclaration typeDeclaration = this.referenceBinding.scope.referenceContext;
 		if ((typeDeclaration.bits & ASTNode.HasTypeAnnotations) == 0) {
@@ -4848,6 +5117,12 @@
 				if ((arguments = methodBinding.parameters) != null) {
 					for (int i = 0, max = arguments.length; i < max; i++) {
 						final TypeBinding typeBinding = arguments[i];
+						// For the branching complexities in the generated $deserializeLambda$ we need the local variable
+						LocalVariableBinding localVariableBinding = new LocalVariableBinding((" synthetic"+i).toCharArray(), typeBinding, 0, true); //$NON-NLS-1$
+						localVariableBinding.resolvedPosition = i;
+						this.codeStream.record(localVariableBinding);
+						localVariableBinding.recordInitializationStartPC(0);
+						localVariableBinding.recordInitializationEndPC(codeLength);
 						frame.putLocal(resolvedPosition,
 								new VerificationTypeInfo(typeBinding));
 						switch (typeBinding.id) {
@@ -4916,11 +5191,11 @@
 			this.innerClassesBindings = new HashSet(INNER_CLASSES_SIZE);
 		}
 		ReferenceBinding innerClass = (ReferenceBinding) binding;
-		this.innerClassesBindings.add(innerClass.erasure());
+		this.innerClassesBindings.add(innerClass.erasure().unannotated());  // should not emit yet another inner class for Outer.@Inner Inner.
 		ReferenceBinding enclosingType = innerClass.enclosingType();
 		while (enclosingType != null
 				&& enclosingType.isNestedType()) {
-			this.innerClassesBindings.add(enclosingType.erasure());
+			this.innerClassesBindings.add(enclosingType.erasure().unannotated());
 			enclosingType = enclosingType.enclosingType();
 		}
 	}
@@ -4930,6 +5205,8 @@
 			this.bootstrapMethods = new ArrayList();
 		}
 		this.bootstrapMethods.add(expression);
+		// Record which bootstrap method was assigned to the expression
+		expression.bootstrapMethodNumber = this.bootstrapMethods.size() - 1;
 		return this.bootstrapMethods.size() - 1;
 	}
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult.java
index cd44558..7dd3867 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/CompilationResult.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -50,6 +50,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.RecoveryScannerData;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class CompilationResult {
 
 	public CategorizedProblem problems[];
@@ -64,6 +65,7 @@
 	public char[][] simpleNameReferences;
 	public char[][] rootReferences;
 	public boolean hasAnnotations = false;
+	public boolean hasFunctionalTypes = false;
 	public int lineSeparatorPositions[];
 	public RecoveryScannerData recoveryScannerData;
 	public Map compiledTypes = new Hashtable(11);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler.java
index dfff9e2..6838eaf 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/Compiler.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,7 @@
 import java.io.*;
 import java.util.*;
 
+@SuppressWarnings("rawtypes")
 public class Compiler implements ITypeRequestor, ProblemSeverities {
 	public Parser parser;
 	public ICompilerRequestor requestor;
@@ -427,7 +428,7 @@
 			if (this.annotationProcessorManager == null) {
 				beginToCompile(sourceUnits);
 			} else {
-				ICompilationUnit[] originalUnits = (ICompilationUnit[]) sourceUnits.clone(); // remember source units in case a source type collision occurs
+				ICompilationUnit[] originalUnits = sourceUnits.clone(); // remember source units in case a source type collision occurs
 				try {
 					beginToCompile(sourceUnits);
 
@@ -840,7 +841,7 @@
 			binaryTypeBindingsTemp = newClassFiles;
 			newClassFilesSize = newClassFiles.length;
 			if (newUnitSize != 0) {
-				ICompilationUnit[] newProcessedUnits = (ICompilationUnit[]) newUnits.clone(); // remember new units in case a source type collision occurs
+				ICompilationUnit[] newProcessedUnits = newUnits.clone(); // remember new units in case a source type collision occurs
 				try {
 					this.lookupEnvironment.isProcessingAnnotations = true;
 					internalBeginToCompile(newUnits, newUnitSize);
@@ -864,7 +865,7 @@
 		ICompilationUnit[] newUnits = this.annotationProcessorManager.getNewUnits();
 		newUnitSize = newUnits.length;
 		if (newUnitSize != 0) {
-			ICompilationUnit[] newProcessedUnits = (ICompilationUnit[]) newUnits.clone(); // remember new units in case a source type collision occurs
+			ICompilationUnit[] newProcessedUnits = newUnits.clone(); // remember new units in case a source type collision occurs
 			try {
 				this.lookupEnvironment.isProcessingAnnotations = true;
 				internalBeginToCompile(newUnits, newUnitSize);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies.java
index e6af624..64c9938 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/DocumentElementParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/DocumentElementParser.java
index 41fdac0..8686c81 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/DocumentElementParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/DocumentElementParser.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -471,7 +467,6 @@
 	this.identifierLengthPtr--;
 	TypeReference type;
 	int variableIndex = this.variablesCounter[this.nestedType];
-	int typeDim = 0;
 	if (variableIndex == 0) {
 		// first variable of the declaration (FieldDeclaration or LocalDeclaration)
 		if (this.nestedMethod[this.nestedType] != 0) {
@@ -479,11 +474,11 @@
 			declaration.declarationSourceStart = this.intStack[this.intPtr--];
 			declaration.modifiersSourceStart = this.intStack[this.intPtr--];
 			declaration.modifiers = this.intStack[this.intPtr--];
-			type = getTypeReference(typeDim = this.intStack[this.intPtr--]); // type dimension
+			type = getTypeReference(this.intStack[this.intPtr--]); // type dimension
 			pushOnAstStack(type);
 		} else {
 			// field declaration
-			type = getTypeReference(typeDim = this.intStack[this.intPtr--]); // type dimension
+			type = getTypeReference(this.intStack[this.intPtr--]); // type dimension
 			pushOnAstStack(type);
 			declaration.declarationSourceStart = this.intStack[this.intPtr--];
 			declaration.modifiersSourceStart = this.intStack[this.intPtr--];
@@ -501,7 +496,6 @@
 		}
 	} else {
 		type = (TypeReference) this.astStack[this.astPtr - variableIndex];
-		typeDim = type.dimensions();
 		AbstractVariableDeclaration previousVariable =
 			(AbstractVariableDeclaration) this.astStack[this.astPtr];
 		declaration.declarationSourceStart = previousVariable.declarationSourceStart;
@@ -514,17 +508,9 @@
 		}
 	}
 
-	if (extendedTypeDimension == 0) {
-		declaration.type = type;
-	} else {
-		int dimension = typeDim + extendedTypeDimension;
-		Annotation [][] annotationsOnAllDimensions = null;
-		Annotation[][] annotationsOnDimensions = type.getAnnotationsOnDimensions();
-		if (annotationsOnDimensions != null || annotationsOnExtendedDimensions != null) {
-			annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(typeDim, annotationsOnDimensions, extendedTypeDimension, annotationsOnExtendedDimensions); 
-		}
-		declaration.type = copyDims(type, dimension, annotationsOnAllDimensions);
-	}
+	declaration.type = extendedTypeDimension != 0 ? augmentTypeWithAdditionalDimensions(type, extendedTypeDimension, annotationsOnExtendedDimensions, false) : type;
+	declaration.bits |= (type.bits & ASTNode.HasTypeAnnotations);
+	
 	this.variablesCounter[this.nestedType]++;
 	this.nestedMethod[this.nestedType]++;
 	pushOnAstStack(declaration);
@@ -620,7 +606,8 @@
 	this.identifierLengthPtr--;
 	//type
 	md.returnType = getTypeReference(this.intStack[this.intPtr--]);
-	rejectIllegalLeadingTypeAnnotations(md.returnType);
+	if (isAnnotationMethod)
+		rejectIllegalLeadingTypeAnnotations(md.returnType);
 	md.bits |= (md.returnType.bits & ASTNode.HasTypeAnnotations);
 	// consume type parameters
 	int length = this.genericsLengthStack[this.genericsLengthPtr--];
@@ -748,19 +735,13 @@
 	int firstDimensions = this.intStack[this.intPtr--];
 	TypeReference type = getTypeReference(firstDimensions);
 
-	final int typeDimensions = firstDimensions + extendedDimensions + (isVarArgs ? 1 : 0);
-	if (typeDimensions != firstDimensions) {
-		// jsr308 type annotations management
-		Annotation [][] annotationsOnFirstDimensions = firstDimensions == 0 ? null : type.getAnnotationsOnDimensions();
-		Annotation [][] annotationsOnAllDimensions = annotationsOnFirstDimensions;
-		if (annotationsOnExtendedDimensions != null) {
-			annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(firstDimensions, annotationsOnFirstDimensions, extendedDimensions, annotationsOnExtendedDimensions); 
+	if (isVarArgs || extendedDimensions != 0) {
+		if (isVarArgs) {
+			type = augmentTypeWithAdditionalDimensions(type, 1, varArgsAnnotations != null ? new Annotation[][] { varArgsAnnotations } : null, true);	
+		} 
+		if (extendedDimensions != 0) { // combination illegal.
+			type = augmentTypeWithAdditionalDimensions(type, extendedDimensions, annotationsOnExtendedDimensions, false);
 		}
-		if (varArgsAnnotations != null) {
-			annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(firstDimensions + extendedDimensions, annotationsOnAllDimensions, 
-																				1, new Annotation[][]{varArgsAnnotations});
-		}
-		type = copyDims(type, typeDimensions, annotationsOnAllDimensions);
 		type.sourceEnd = type.isParameterizedTypeReference() ? this.endStatementPosition : this.endPosition;
 	}
 	if (isVarArgs) {
@@ -942,10 +923,10 @@
  *
  * INTERNAL USE-ONLY
  */
-protected void consumeMethodDeclaration(boolean isNotAbstract) {
+protected void consumeMethodDeclaration(boolean isNotAbstract, boolean isDefaultMethod) {
 	// MethodDeclaration ::= MethodHeader MethodBody
 	// AbstractMethodDeclaration ::= MethodHeader ';'
-	super.consumeMethodDeclaration(isNotAbstract);
+	super.consumeMethodDeclaration(isNotAbstract, isDefaultMethod);
 	if (isLocalDeclaration()) {
 		// we ignore the local variable declarations
 		return;
@@ -1045,17 +1026,9 @@
 	int extendedDims = this.intStack[this.intPtr--];
 	this.extendsDim = extendedDims;
 	if (extendedDims != 0) {
-		TypeReference returnType = md.returnType;
 		md.sourceEnd = this.endPosition;
-		int dims = returnType.dimensions() + extendedDims;
-		Annotation [][] annotationsOnDimensions = returnType.getAnnotationsOnDimensions();
-		Annotation [][] annotationsOnExtendedDimensions = getAnnotationsOnDimensions(extendedDims);
-		Annotation [][] annotationsOnAllDimensions = null;
-		if (annotationsOnDimensions != null || annotationsOnExtendedDimensions != null) {
-			annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(returnType.dimensions(), annotationsOnDimensions, extendedDims, annotationsOnExtendedDimensions);
-		}	
-		md.returnType = copyDims(returnType, dims, annotationsOnAllDimensions);
-
+		md.returnType = augmentTypeWithAdditionalDimensions(md.returnType, extendedDims, getAnnotationsOnDimensions(extendedDims), false);
+		md.bits |= (md.returnType.bits & ASTNode.HasTypeAnnotations);
 		if (this.currentToken == TokenNameLBRACE) {
 			md.bodyStart = this.endPosition + 1;
 		}
@@ -1075,6 +1048,7 @@
 	this.identifierLengthPtr--;
 	//type
 	md.returnType = getTypeReference(this.typeDims = this.intStack[this.intPtr--]);
+	md.bits |= (md.returnType.bits & ASTNode.HasTypeAnnotations);
 	//modifiers
 	md.declarationSourceStart = this.intStack[this.intPtr--];
 	md.modifiersSourceStart = this.intStack[this.intPtr--];
@@ -1306,10 +1280,10 @@
 	}
 	return super.endParse(act);
 }
-public void initialize(boolean initializeNLS) {
+public void initialize(boolean parsingCompilationUnit) {
 	//positionning the parser for a new compilation unit
 	//avoiding stack reallocation and all that....
-	super.initialize(initializeNLS);
+	super.initialize(parsingCompilationUnit);
 	this.intArrayPtr = -1;
 }
 public void initialize() {
@@ -1535,8 +1509,8 @@
  * Syntax error was detected. Will attempt to perform some recovery action in order
  * to resume to the regular parse loop.
  */
-protected boolean resumeOnSyntaxError() {
-	return false;
+protected int resumeOnSyntaxError() {
+	return HALT;
 }
 /*
  * Answer a char array representation of the type name formatted like:
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/IErrorHandlingPolicy.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/IErrorHandlingPolicy.java
index ae4b5b4..f993496 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/IErrorHandlingPolicy.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/IErrorHandlingPolicy.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor.java
index ebcb25c..7b33c5b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ISourceElementRequestor.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
@@ -43,10 +43,11 @@
  * other simpler elements (package, import) are read all at once: - accept
  * <Element>
  */
-
+@SuppressWarnings("rawtypes")
 public interface ISourceElementRequestor {
 
 	public static class TypeInfo {
+		public boolean typeAnnotated;
 		public int declarationStart;
 		public int modifiers;
 		public char[] name;
@@ -74,6 +75,7 @@
 	}
 
 	public static class MethodInfo {
+		public boolean typeAnnotated;
 		public boolean isConstructor;
 		public boolean isAnnotation;
 		public int declarationStart;
@@ -104,6 +106,7 @@
 		public char[] name;
 	}
 	public static class FieldInfo {
+		public boolean typeAnnotated;
 		public int declarationStart;
 		public int modifiers;
 		public char[] type;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ReadManager.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ReadManager.java
index 11c2d44..c9afe43 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ReadManager.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ReadManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2010 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
@@ -15,6 +15,7 @@
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ReadManager implements Runnable {
 	ICompilationUnit[] units;
 	int nextFileToRead;
@@ -38,7 +39,7 @@
 		Class runtime = Class.forName("java.lang.Runtime"); //$NON-NLS-1$
 		java.lang.reflect.Method m = runtime.getDeclaredMethod("availableProcessors", new Class[0]); //$NON-NLS-1$
 		if (m != null) {
-			Integer result = (Integer) m.invoke(Runtime.getRuntime(), null);
+			Integer result = (Integer) m.invoke(Runtime.getRuntime(), (Object[]) null);
 			threadCount = result.intValue() + 1;
 			if (threadCount < 2)
 				threadCount = 0;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier.java
index eb080d9..6576963 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementNotifier.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -54,6 +50,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.HashtableOfObjectToInt;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SourceElementNotifier {
 	/**
 	 * An ast visitor that visits local type declarations.
@@ -273,6 +270,9 @@
 	boolean isVarArgs = false;
 	Argument[] arguments = methodDeclaration.arguments;
 	ParameterInfo[] parameterInfos = null; 
+	ISourceElementRequestor.MethodInfo methodInfo = new ISourceElementRequestor.MethodInfo();
+	methodInfo.typeAnnotated = ((methodDeclaration.bits & ASTNode.HasTypeAnnotations) != 0);
+
 	if (arguments != null) {
 		Object[][] argumentInfos = getArgumentInfos(arguments);
 		parameterInfos = (ParameterInfo[]) argumentInfos[0];
@@ -294,7 +294,6 @@
 			if (hasDeprecatedAnnotation(methodDeclaration.annotations))
 				currentModifiers |= ClassFileConstants.AccDeprecated;
 
-			ISourceElementRequestor.MethodInfo methodInfo = new ISourceElementRequestor.MethodInfo();
 			methodInfo.isConstructor = true;
 			methodInfo.declarationStart = methodDeclaration.declarationSourceStart;
 			methodInfo.modifiers = currentModifiers;
@@ -353,7 +352,6 @@
 		TypeReference returnType = methodDeclaration instanceof MethodDeclaration
 			? ((MethodDeclaration) methodDeclaration).returnType
 			: null;
-		ISourceElementRequestor.MethodInfo methodInfo = new ISourceElementRequestor.MethodInfo();
 		methodInfo.isAnnotation = methodDeclaration instanceof AnnotationMethodDeclaration;
 		methodInfo.declarationStart = methodDeclaration.declarationSourceStart;
 		methodInfo.modifiers = currentModifiers;
@@ -514,6 +512,7 @@
 					typeName = CharOperation.concatWith(fieldDeclaration.type.getParameterizedTypeName(), '.');
 				}
 				ISourceElementRequestor.FieldInfo fieldInfo = new ISourceElementRequestor.FieldInfo();
+				fieldInfo.typeAnnotated = ((fieldDeclaration.bits & ASTNode.HasTypeAnnotations) != 0);
 				fieldInfo.declarationStart = fieldDeclaration.declarationSourceStart;
 				fieldInfo.name = fieldDeclaration.name;
 				fieldInfo.modifiers = deprecated ? (currentModifiers & ExtraCompilerModifiers.AccJustFlag) | ClassFileConstants.AccDeprecated : currentModifiers & ExtraCompilerModifiers.AccJustFlag;
@@ -597,6 +596,8 @@
 		char[][] interfaceNames = getInterfaceNames(typeDeclaration);
 		int kind = TypeDeclaration.kind(typeDeclaration.modifiers);
 		char[] implicitSuperclassName = TypeConstants.CharArray_JAVA_LANG_OBJECT;
+		ISourceElementRequestor.TypeInfo typeInfo = new ISourceElementRequestor.TypeInfo();
+		typeInfo.typeAnnotated = ((typeDeclaration.bits & ASTNode.HasTypeAnnotations) != 0);
 		if (isInRange) {
 			int currentModifiers = typeDeclaration.modifiers;
 
@@ -611,7 +612,6 @@
 			} else {
 				superclassName = getSuperclassName(typeDeclaration);
 			}
-			ISourceElementRequestor.TypeInfo typeInfo = new ISourceElementRequestor.TypeInfo();
 			if (typeDeclaration.allocation == null) {
 				typeInfo.declarationStart = typeDeclaration.declarationSourceStart;
 			} else if (isEnumInit) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser.java
index 868ba9f..ba07fed 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/SourceElementParser.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -47,6 +43,7 @@
  *
  * Any (parsing) problem encountered is also provided.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SourceElementParser extends CommentRecorderParser {
 
 	ISourceElementRequestor requestor;
@@ -394,6 +391,10 @@
 	// the declarationSourceStart to be set
 	flushCommentsDefinedPriorTo(this.scanner.currentPosition);
 }
+protected void consumeTypeElidedLambdaParameter(boolean parenthesized) {
+	super.consumeTypeElidedLambdaParameter(parenthesized);
+	flushCommentsDefinedPriorTo(this.scanner.currentPosition);
+}
 protected void consumeInterfaceHeaderName1() {
 	int currentAstPtr = this.astPtr;
 	super.consumeInterfaceHeaderName1();
@@ -535,6 +536,7 @@
 	super.consumeSingleMemberAnnotation(isTypeAnnotation);
 	SingleMemberAnnotation member = (SingleMemberAnnotation) (isTypeAnnotation ? this.typeAnnotationStack[this.typeAnnotationPtr] : this.expressionStack[this.expressionPtr]);
 	if (this.reportReferenceInfo) {
+		this.requestor.acceptAnnotationTypeReference(member.type.getTypeName(), member.sourceStart, member.sourceEnd);
 		this.requestor.acceptMethodReference(TypeConstants.VALUE, 0, member.sourceStart);
 	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ASTNode.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ASTNode.java
index 8b6c132..ff6b2be 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ASTNode.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ASTNode.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -20,17 +16,61 @@
  *								bug 374605 - Unreasonable warning for enum-based switch statements
  *								bug 384870 - [compiler] @Deprecated annotation not detected if preceded by other annotation
  *								bug 393719 - [compiler] inconsistent warnings on iteration variables
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 424742 - [1.8] NPE in LambdaExpression.isCompatibleWith
+ *								Bug 424710 - [1.8][compiler] CCE in SingleNameReference.localVariableBinding
+ *								Bug 424205 - [1.8] Cannot infer type for diamond type with lambda on method invocation
+ *								Bug 424415 - [1.8][compiler] Eventual resolution of ReferenceExpression is not seen to be happening.
+ *								Bug 426366 - [1.8][compiler] Type inference doesn't handle multiple candidate target types in outer overload context
+ *								Bug 427282 - [1.8][compiler] AIOOB (-1) at org.aspectj.org.eclipse.jdt.internal.compiler.ClassFile.traverse(ClassFile.java:6209)
+ *								Bug 427483 - [Java 8] Variables in lambdas sometimes can't be resolved
+ *								Bug 428352 - [1.8][compiler] Resolution errors don't always surface
+ *								Bug 427163 - [1.8][null] bogus error "Contradictory null specification" on varags
  *     Jesper S Moller - Contributions for
  *								bug 382721 - [1.8][compiler] Effectively final variables needs special treatment
+ *								bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
+ *								bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
+ *								bug 412149 - [1.8][compiler] Emit repeated annotations into the designated container
+ *								bug 419209 - [1.8] Repeating container annotations should be rejected in the presence of annotation it contains
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.AccessRestriction;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.*;
-import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.PackageBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedMethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemReasons;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.WildcardBinding;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class ASTNode implements TypeConstants, TypeIds {
 
 	public int sourceStart, sourceEnd;
@@ -218,8 +258,8 @@
 	// for if statement
 	public static final int IsElseIfStatement = Bit30;
 	public static final int ThenExit = Bit31;
-	public static final int IsElseStatementUnreachable = Bit8;
-	public static final int IsThenStatementUnreachable = Bit9;
+	public static final int IsElseStatementUnreachable = Bit8; // as computed by control flow analysis or null analysis.
+	public static final int IsThenStatementUnreachable = Bit9; // as computed by control flow analysis or null analysis
 
 	// for type reference
 	public static final int IsSuperType = Bit5;
@@ -276,6 +316,9 @@
 	// for annotation reference, signal if annotation was created from a default:
 	public static final int IsSynthetic = ASTNode.Bit7;
 	
+	// for all reference context entries.
+	public static final int HasFunctionalInterfaceTypes = ASTNode.Bit22;
+	
 	public static final Argument [] NO_ARGUMENTS = new Argument [0];
 
 	public ASTNode() {
@@ -292,7 +335,7 @@
 			}
 		}
 		TypeBinding checkedParameterType = parameterType; // originalParameterType == null ? parameterType : originalParameterType;
-		if (argumentType != checkedParameterType && argumentType.needsUncheckedConversion(checkedParameterType)) {
+		if (TypeBinding.notEquals(argumentType, checkedParameterType) && argumentType.needsUncheckedConversion(checkedParameterType)) {
 			scope.problemReporter().unsafeTypeConversion(argument, argumentType, checkedParameterType);
 			return INVOCATION_ARGUMENT_UNCHECKED;
 		}
@@ -369,8 +412,8 @@
 						if (varargsType.dimensions < dimensions) {
 							scope.problemReporter().varargsArgumentNeedCast(method, lastArgType, invocationSite);
 						} else if (varargsType.dimensions == dimensions
-										&& lastArgType != varargsType
-										&& lastArgType.leafComponentType().erasure() != varargsType.leafComponentType.erasure()
+										&& TypeBinding.notEquals(lastArgType, varargsType)
+										&& TypeBinding.notEquals(lastArgType.leafComponentType().erasure(), varargsType.leafComponentType.erasure())
 										&& lastArgType.isCompatibleWith(varargsType.elementsType())
 										&& lastArgType.isCompatibleWith(varargsType)) {
 							scope.problemReporter().varargsArgumentNeedCast(method, lastArgType, invocationSite);
@@ -500,6 +543,10 @@
 
 		return false;
 	}
+	
+	public boolean isUnqualifiedSuper() {
+		return false;
+	}
 
 	/* Answer true if the type use is considered deprecated.
 	* An access in the same compilation unit is allowed.
@@ -591,59 +638,153 @@
 			output.append("native "); //$NON-NLS-1$
 		if ((modifiers & ClassFileConstants.AccAbstract) != 0)
 			output.append("abstract "); //$NON-NLS-1$
+		if ((modifiers & ExtraCompilerModifiers.AccDefaultMethod) != 0)
+			output.append("default "); //$NON-NLS-1$
 		return output;
 	}
 
-	public static boolean polyExpressionsHaveErrors(BlockScope scope, MethodBinding methodBinding, Expression [] arguments, TypeBinding[] argumentTypes) {
-		boolean polyExpressionsHaveErrors = false;
+	/**
+	 * After method lookup has produced 'methodBinding' but when poly expressions have been seen as arguments,
+	 * inspect the arguments to trigger another round of resolving with improved target types from the methods parameters.
+	 * If this resolving produces better types for any arguments, update the 'argumentTypes' array in-place as an
+	 * intended side effect that will feed better type information in checkInvocationArguments() and others.
+	 * @param invocation the outer invocation which is being resolved
+	 * @param methodBinding the method produced by lookup (possibly involving type inference).
+	 * @param argumentTypes the argument types as collected from first resolving the invocation arguments and as used for
+	 * 	the method lookup.
+	 * @param scope scope for error reporting
+	 */
+	public static void resolvePolyExpressionArguments(Invocation invocation, MethodBinding methodBinding, TypeBinding[] argumentTypes, Scope scope) {
+		if (!invocation.innersNeedUpdate())
+			return;
+		int problemReason = 0;
 		MethodBinding candidateMethod;
 		if (methodBinding.isValidBinding()) {
 			candidateMethod = methodBinding;
 		} else if (methodBinding instanceof ProblemMethodBinding) {
+			problemReason = methodBinding.problemId();
 			candidateMethod = ((ProblemMethodBinding) methodBinding).closestMatch;
 		} else {
 			candidateMethod = null;
 		}
 		if (candidateMethod != null) {
 			boolean variableArity = candidateMethod.isVarargs();
+			InferenceContext18 infCtx = null;
+			if (candidateMethod instanceof ParameterizedMethodBinding) {
+				infCtx = invocation.getInferenceContext((ParameterizedMethodBinding) candidateMethod);
+				if (infCtx != null) {
+					if (infCtx.stepCompleted != InferenceContext18.TYPE_INFERRED) {
+						// only work in the exact state of TYPE_INFERRED
+						// - below we're not yet ready
+						// - above we're already done-done
+						return;
+					}
+					variableArity &= infCtx.isVarArgs(); // TODO: if no infCtx is available, do we have to re-check if this is a varargs invocation?
+				}
+			} else if (invocation instanceof AllocationExpression) {
+				if (((AllocationExpression)invocation).suspendedResolutionState != null)
+					return; // not yet ready
+			}
+			
 			final TypeBinding[] parameters = candidateMethod.parameters;
-			final int parametersLength = parameters.length;
+			Expression[] innerArguments = invocation.arguments();
+			Expression [] arguments = innerArguments;
+			if (infCtx == null && variableArity && parameters.length == arguments.length) { // re-check
+				TypeBinding lastParam = parameters[parameters.length-1];
+				Expression lastArg = arguments[arguments.length-1];
+				if (lastArg.isCompatibleWith(lastParam, null)) {
+					variableArity = false;
+				}
+			}
 			for (int i = 0, length = arguments == null ? 0 : arguments.length; i < length; i++) {
-				if (argumentTypes[i] instanceof PolyTypeBinding) {
-					Expression argument = arguments[i];
-					TypeBinding parameterType = i < parametersLength ? parameters[i] : variableArity ? parameters[parametersLength - 1] : null;
-					argument.setExpressionContext(parameterType != null ? ExpressionContext.INVOCATION_CONTEXT: ExpressionContext.ASSIGNMENT_CONTEXT); // force the errors to surface.
-					if (variableArity && i >= parametersLength - 1)
-						argument.tagAsEllipsisArgument();
-					argument.setExpectedType(parameterType);
-					TypeBinding argumentType = argument.resolveType(scope);
-					if (argumentType == null || !argumentType.isValidBinding())
-						polyExpressionsHaveErrors = true;
-					if (argument instanceof LambdaExpression && ((LambdaExpression) argument).hasErrors())
-						polyExpressionsHaveErrors = true;
+				Expression argument = arguments[i];
+				TypeBinding updatedArgumentType = null;
+				TypeBinding parameterType = InferenceContext18.getParameter(parameters, i, variableArity);
+				if (parameterType == null && problemReason != ProblemReasons.NoError)
+					continue; // not much we can do without a target type, assume it only happens after some resolve error
+
+				if (argument instanceof LambdaExpression && ((LambdaExpression) argument).hasErrors())
+					continue; // don't update if inner poly has errors
+
+				if (argument instanceof Invocation) {
+					Invocation innerInvocation = (Invocation)argument;
+					MethodBinding binding = innerInvocation.binding(parameterType, true, scope);
+					if (binding instanceof ParameterizedGenericMethodBinding) {
+						ParameterizedGenericMethodBinding parameterizedMethod = (ParameterizedGenericMethodBinding) binding;
+						InferenceContext18 innerContext = innerInvocation.getInferenceContext(parameterizedMethod);
+						if (innerContext != null) {
+							if (!innerContext.hasResultFor(parameterType)) {
+								argument.setExpectedType(parameterType);
+								MethodBinding improvedBinding = innerContext.inferInvocationType(innerInvocation, parameterizedMethod);
+								if (!improvedBinding.isValidBinding()) {
+									innerContext.reportInvalidInvocation(innerInvocation, improvedBinding);
+								}
+								if (innerInvocation.updateBindings(improvedBinding, parameterType)) {
+									resolvePolyExpressionArguments(innerInvocation, improvedBinding, scope);
+								}
+							} else if (innerContext.stepCompleted < InferenceContext18.BINDINGS_UPDATED) {
+								innerContext.rebindInnerPolies(parameterizedMethod, innerInvocation);
+							}
+						}
+						continue; // otherwise these have been dealt with during inner method lookup
+					}
+				}
+
+				if (argument.isPolyExpression()) {
+					// poly expressions in an invocation context may need to be resolved now:
+					if (infCtx != null && infCtx.stepCompleted == InferenceContext18.BINDINGS_UPDATED)
+						updatedArgumentType = argument.resolvedType; // in this case argument was already resolved via InferenceContext18.acceptPendingPolyArguments()
+					else
+						updatedArgumentType = argument.checkAgainstFinalTargetType(parameterType, scope);
+
+					if (problemReason == ProblemReasons.NoError // preserve errors
+							&& updatedArgumentType != null					// do we have a relevant update? ...
+							&& !(updatedArgumentType instanceof PolyTypeBinding))
+					{
+						// update the argumentTypes array (supposed to be owned by the calling method)
+						// in order to give better information for subsequent checks
+						argumentTypes[i] = updatedArgumentType;
+					}
 				}
 			}
 		}
-		return polyExpressionsHaveErrors;
+		invocation.innerUpdateDone();
 	}
+
+	public static void resolvePolyExpressionArguments(Invocation invocation, MethodBinding methodBinding, Scope scope) {
+		TypeBinding[] argumentTypes = null;
+		Expression[] innerArguments = invocation.arguments();
+		if (innerArguments != null) {
+			argumentTypes = new TypeBinding[innerArguments.length];
+			for (int i = 0; i < innerArguments.length; i++)
+				argumentTypes[i] = innerArguments[i].resolvedType;
+		}
+		resolvePolyExpressionArguments(invocation, methodBinding, argumentTypes, scope);
+	}
+
+	public static void resolveAnnotations(BlockScope scope, Annotation[] sourceAnnotations, Binding recipient) {
+		resolveAnnotations(scope, sourceAnnotations, recipient, false);
+	}
+	
 	/**
 	 * Resolve annotations, and check duplicates, answers combined tagBits
-	 * for recognized standard annotations
+	 * for recognized standard annotations. Return null if nothing new is
+	 * resolved.
 	 */
-	public static void resolveAnnotations(BlockScope scope, Annotation[] sourceAnnotations, Binding recipient) {
+	public static AnnotationBinding [] resolveAnnotations(BlockScope scope, Annotation[] sourceAnnotations, Binding recipient, boolean copySE8AnnotationsToType) {
 		AnnotationBinding[] annotations = null;
 		int length = sourceAnnotations == null ? 0 : sourceAnnotations.length;
 		if (recipient != null) {
 			switch (recipient.kind()) {
 				case Binding.PACKAGE :
 					PackageBinding packageBinding = (PackageBinding) recipient;
-					if ((packageBinding.tagBits & TagBits.AnnotationResolved) != 0) return;
+					if ((packageBinding.tagBits & TagBits.AnnotationResolved) != 0) return annotations;
 					packageBinding.tagBits |= (TagBits.AnnotationResolved | TagBits.DeprecatedAnnotationResolved);
 					break;
 				case Binding.TYPE :
 				case Binding.GENERIC_TYPE :
 					ReferenceBinding type = (ReferenceBinding) recipient;
-					if ((type.tagBits & TagBits.AnnotationResolved) != 0) return;
+					if ((type.tagBits & TagBits.AnnotationResolved) != 0) return annotations;
 					type.tagBits |= (TagBits.AnnotationResolved | TagBits.DeprecatedAnnotationResolved);
 					if (length > 0) {
 						annotations = new AnnotationBinding[length];
@@ -652,7 +793,7 @@
 					break;
 				case Binding.METHOD :
 					MethodBinding method = (MethodBinding) recipient;
-					if ((method.tagBits & TagBits.AnnotationResolved) != 0) return;
+					if ((method.tagBits & TagBits.AnnotationResolved) != 0) return annotations;
 					method.tagBits |= (TagBits.AnnotationResolved | TagBits.DeprecatedAnnotationResolved);
 					if (length > 0) {
 						annotations = new AnnotationBinding[length];
@@ -661,7 +802,7 @@
 					break;
 				case Binding.FIELD :
 					FieldBinding field = (FieldBinding) recipient;
-					if ((field.tagBits & TagBits.AnnotationResolved) != 0) return;
+					if ((field.tagBits & TagBits.AnnotationResolved) != 0) return annotations;
 					field.tagBits |= (TagBits.AnnotationResolved | TagBits.DeprecatedAnnotationResolved);
 					if (length > 0) {
 						annotations = new AnnotationBinding[length];
@@ -670,7 +811,7 @@
 					break;
 				case Binding.LOCAL :
 					LocalVariableBinding local = (LocalVariableBinding) recipient;
-					if ((local.tagBits & TagBits.AnnotationResolved) != 0) return;
+					if ((local.tagBits & TagBits.AnnotationResolved) != 0) return annotations;
 					local.tagBits |= (TagBits.AnnotationResolved | TagBits.DeprecatedAnnotationResolved);
 					if (length > 0) {
 						annotations = new AnnotationBinding[length];
@@ -678,36 +819,30 @@
 					}
 					break;
 				case Binding.TYPE_PARAMETER :
-					// jsr308
-					ReferenceBinding typeVariableBinding = (ReferenceBinding) recipient;
-					if ((typeVariableBinding.tagBits & TagBits.AnnotationResolved) != 0) return;
-					typeVariableBinding.tagBits |= (TagBits.AnnotationResolved | TagBits.DeprecatedAnnotationResolved);
-					if (length > 0) {
-						annotations = new AnnotationBinding[length];
-						typeVariableBinding.setAnnotations(annotations);
-					}
-					break;
 				case Binding.TYPE_USE :
-					ReferenceBinding typeUseBinding = (ReferenceBinding) recipient;
-					if ((typeUseBinding.tagBits & TagBits.AnnotationResolved) != 0) return;
-					typeUseBinding.tagBits |= (TagBits.AnnotationResolved | TagBits.DeprecatedAnnotationResolved);
-					if (length > 0) {
-						annotations = new AnnotationBinding[length];
-						typeUseBinding.setAnnotations(annotations);
-					}
+					// deliberately don't set the annotation resolved tagbits, it is not material and also we are working with a dummy static object.
+					annotations = new AnnotationBinding[length];
 					break;
 				default :
-					return;
+					return annotations;
 			}
 		}
 		if (sourceAnnotations == null)
-			return;
+			return annotations;
 		for (int i = 0; i < length; i++) {
 			Annotation annotation = sourceAnnotations[i];
 			final Binding annotationRecipient = annotation.recipient;
 			if (annotationRecipient != null && recipient != null) {
-				// only local and field can share annnotations
+				// only local and field can share annnotations and their types.
 				switch (recipient.kind()) {
+					case Binding.TYPE_USE:
+						if (annotations != null) {
+							// need to fill the instances array
+							for (int j = 0; j < length; j++) {
+								annotations[j] = sourceAnnotations[j].getCompilerAnnotation();
+							}
+						}
+						break;
 					case Binding.FIELD :
 						FieldBinding field = (FieldBinding) recipient;
 						field.tagBits = ((FieldBinding) annotationRecipient).tagBits;
@@ -755,7 +890,7 @@
 						}
 						break;
 				}
-				return;
+				return annotations;
 			} else {
 				annotation.recipient = recipient;
 				// MERGECONFLICT:
@@ -773,31 +908,222 @@
 				}
 			}
 		}
+
+		/* See if the recipient is meta-annotated with @Repeatable and if so validate constraints. We can't do this during resolution of @Repeatable itself as @Target and 
+		   @Retention etc could come later
+		*/   
+		if (recipient != null && recipient.isTaggedRepeatable()) {
+			for (int i = 0; i < length; i++) {
+				Annotation annotation = sourceAnnotations[i];
+				ReferenceBinding annotationType = annotations[i] != null ? annotations[i].getAnnotationType() : null;
+				if (annotationType != null && annotationType.id == TypeIds.T_JavaLangAnnotationRepeatable)
+					annotation.checkRepeatableMetaAnnotation(scope);
+			}
+		}
+		
 		// check duplicate annotations
-		if (annotations != null) {
+		if (annotations != null && length > 1) {
 			AnnotationBinding[] distinctAnnotations = annotations; // only copy after 1st duplicate is detected
+			Map implicitContainerAnnotations = null;
 			for (int i = 0; i < length; i++) {
 				AnnotationBinding annotation = distinctAnnotations[i];
 				if (annotation == null) continue;
-				TypeBinding annotationType = annotation.getAnnotationType();
+				ReferenceBinding annotationType = annotation.getAnnotationType();
 				boolean foundDuplicate = false;
+				ContainerAnnotation container = null;
 				for (int j = i+1; j < length; j++) {
 					AnnotationBinding otherAnnotation = distinctAnnotations[j];
 					if (otherAnnotation == null) continue;
-					if (otherAnnotation.getAnnotationType() == annotationType) {
-						foundDuplicate = true;
+					if (TypeBinding.equalsEquals(otherAnnotation.getAnnotationType(), annotationType)) {
 						if (distinctAnnotations == annotations) {
 							System.arraycopy(distinctAnnotations, 0, distinctAnnotations = new AnnotationBinding[length], 0, length);
 						}
-						distinctAnnotations[j] = null; // report it only once
-						scope.problemReporter().duplicateAnnotation(sourceAnnotations[j]);
+						distinctAnnotations[j] = null; // report/process it only once
+						if (annotationType.isRepeatableAnnotationType()) {
+							Annotation persistibleAnnotation = sourceAnnotations[i].getPersistibleAnnotation();
+							if (persistibleAnnotation instanceof ContainerAnnotation)
+								container = (ContainerAnnotation) persistibleAnnotation;
+							if (container == null) {  // first encounter with a duplicate.
+								ReferenceBinding containerAnnotationType = annotationType.containerAnnotationType();
+								container = new ContainerAnnotation(sourceAnnotations[i], containerAnnotationType, scope);
+								if (implicitContainerAnnotations == null) implicitContainerAnnotations = new HashMap(3);
+								implicitContainerAnnotations.put(containerAnnotationType, sourceAnnotations[i]);
+								Annotation.checkForInstancesOfRepeatableWithRepeatingContainerAnnotation(scope, annotationType, sourceAnnotations);
+							}
+							container.addContainee(sourceAnnotations[j]);
+						} else {
+							foundDuplicate = true;
+							scope.problemReporter().duplicateAnnotation(sourceAnnotations[j], scope.compilerOptions().sourceLevel);
+						}
 					}
 				}
+				if (container != null) {
+					container.resolveType(scope);
+				}
 				if (foundDuplicate) {
-					scope.problemReporter().duplicateAnnotation(sourceAnnotations[i]);
+					scope.problemReporter().duplicateAnnotation(sourceAnnotations[i], scope.compilerOptions().sourceLevel);
+				}
+			}
+			// Check for presence of repeating annotation together with the containing annotation
+			if (implicitContainerAnnotations != null) {
+				for (int i = 0; i < length; i++) {
+					if (distinctAnnotations[i] == null) continue;
+					Annotation annotation = sourceAnnotations[i];
+					ReferenceBinding annotationType = distinctAnnotations[i].getAnnotationType();
+					if (implicitContainerAnnotations.containsKey(annotationType)) {
+						scope.problemReporter().repeatedAnnotationWithContainer((Annotation) implicitContainerAnnotations.get(annotationType), annotation);
+					}
 				}
 			}
 		}
+		if (copySE8AnnotationsToType)
+			copySE8AnnotationsToType(scope, recipient, sourceAnnotations);
+		return annotations;
+	}
+	
+	/**	Resolve JSR308 annotations on a type reference, array creation expression or a wildcard. Type parameters go directly to the subroutine,
+	    By construction the bindings associated with QTR, PQTR etc get resolved first and then annotations for different levels get resolved
+	    and applied at one go. Likewise for multidimensional arrays.
+	    
+	    @Returns the annotated type binding. 
+	*/
+	public static TypeBinding resolveAnnotations(BlockScope scope, Annotation[][] sourceAnnotations, TypeBinding type) {
+		int levels = sourceAnnotations == null ? 0 : sourceAnnotations.length;
+		if (type == null || levels == 0)
+			return type;
+		AnnotationBinding [][] annotationBindings = new AnnotationBinding [levels][];
+
+		for (int i = 0; i < levels; i++) {
+			Annotation[] annotations = sourceAnnotations[i];
+			if (annotations != null && annotations.length > 0) {
+				annotationBindings[i] = resolveAnnotations(scope, annotations, TypeBinding.TYPE_USE_BINDING, false);
+			}
+		}
+		return scope.environment().createAnnotatedType(type, annotationBindings);
+	}
+
+	// When SE8 annotations feature in SE7 locations, they get attributed to the declared entity. Copy/move these to the type of the declared entity (field, local, argument etc.)
+	public static void copySE8AnnotationsToType(BlockScope scope, Binding recipient, Annotation[] annotations) {
+		
+		if (annotations == null || annotations.length == 0 || recipient == null)
+			return;
+		
+		long recipientTargetMask = 0;
+		switch (recipient.kind()) {
+			case Binding.LOCAL:
+				recipientTargetMask = recipient.isParameter() ? TagBits.AnnotationForParameter : TagBits.AnnotationForLocalVariable;
+				break;
+			case Binding.FIELD:
+				recipientTargetMask = TagBits.AnnotationForField;
+				break;
+			case Binding.METHOD:
+				recipientTargetMask = TagBits.AnnotationForMethod;
+				break;
+			default:
+				return;
+		}
+		
+		AnnotationBinding [] se8Annotations = null;
+		int se8count = 0;
+		long se8nullBits = 0;
+		Annotation se8NullAnnotation = null;
+		for (int i = 0, length = annotations.length; i < length; i++) {
+			AnnotationBinding annotation = annotations[i].getCompilerAnnotation();
+			if (annotation == null) continue;
+			final ReferenceBinding annotationType = annotation.getAnnotationType();
+			long metaTagBits = annotationType.getAnnotationTagBits();
+			if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
+				if (se8Annotations == null) {
+					se8Annotations = new AnnotationBinding[] { annotation };
+					se8count = 1;
+				} else {
+					System.arraycopy(se8Annotations, 0, se8Annotations = new AnnotationBinding[se8count + 1], 0, se8count);
+					se8Annotations[se8count++] = annotation;
+				}
+				if (annotationType.id == TypeIds.T_ConfiguredAnnotationNonNull) {
+					se8nullBits = TagBits.AnnotationNonNull;
+					se8NullAnnotation = annotations[i];
+				} else if (annotationType.id == TypeIds.T_ConfiguredAnnotationNullable) {
+					se8nullBits = TagBits.AnnotationNullable;
+					se8NullAnnotation = annotations[i];
+				}
+			}
+		}
+		if (se8Annotations != null) {
+			switch (recipient.kind()) {
+				case Binding.LOCAL:
+					LocalVariableBinding local = (LocalVariableBinding) recipient;
+					TypeReference typeRef = local.declaration.type;
+					if (Annotation.isTypeUseCompatible(typeRef, scope)) { // discard hybrid annotations on name qualified types.
+						local.declaration.bits |= HasTypeAnnotations;
+						typeRef.bits |= HasTypeAnnotations;
+						local.type = mergeAnnotationsIntoType(scope, se8Annotations, se8nullBits, se8NullAnnotation, typeRef, local.type);
+					}
+					break;
+				case Binding.FIELD:
+					FieldBinding field = (FieldBinding) recipient;
+					SourceTypeBinding sourceType = (SourceTypeBinding) field.declaringClass;
+					FieldDeclaration fieldDeclaration = sourceType.scope.referenceContext.declarationOf(field);
+					if (Annotation.isTypeUseCompatible(fieldDeclaration.type, scope)) { // discard hybrid annotations on name qualified types.
+						fieldDeclaration.bits |= HasTypeAnnotations;
+						fieldDeclaration.type.bits |= HasTypeAnnotations;
+						field.type = mergeAnnotationsIntoType(scope, se8Annotations, se8nullBits, se8NullAnnotation, fieldDeclaration.type, field.type);
+					}
+					break;
+				case Binding.METHOD:
+					MethodBinding method = (MethodBinding) recipient;
+					if (!method.isConstructor()) {
+						sourceType = (SourceTypeBinding) method.declaringClass;
+						MethodDeclaration methodDecl = (MethodDeclaration) sourceType.scope.referenceContext.declarationOf(method);
+						if (Annotation.isTypeUseCompatible(methodDecl.returnType, scope)) {
+							methodDecl.bits |= HasTypeAnnotations;
+							methodDecl.returnType.bits |= HasTypeAnnotations;
+							method.returnType = mergeAnnotationsIntoType(scope, se8Annotations, se8nullBits, se8NullAnnotation, methodDecl.returnType, method.returnType);
+						}
+					}
+					break;
+			}
+			AnnotationBinding [] recipientAnnotations = recipient.getAnnotations();
+			int length = recipientAnnotations == null ? 0 : recipientAnnotations.length;
+			int newLength = 0;
+			for (int i = 0; i < length; i++) {
+				final AnnotationBinding recipientAnnotation = recipientAnnotations[i];
+				if (recipientAnnotation == null)
+					continue;
+				long annotationTargetMask = recipientAnnotation.getAnnotationType().getAnnotationTagBits() & TagBits.AnnotationTargetMASK;
+				if (annotationTargetMask == 0 || (annotationTargetMask & recipientTargetMask) != 0)
+					recipientAnnotations[newLength++] = recipientAnnotation;
+			}
+			if (newLength != length) {
+				System.arraycopy(recipientAnnotations, 0, recipientAnnotations = new AnnotationBinding[newLength],  0, newLength);
+				recipient.setAnnotations(recipientAnnotations, scope);
+			}
+		}
+	}
+
+	private static TypeBinding mergeAnnotationsIntoType(BlockScope scope, AnnotationBinding[] se8Annotations, long se8nullBits, Annotation se8NullAnnotation,
+			TypeReference typeRef, TypeBinding existingType) 
+	{
+		if (existingType == null || !existingType.isValidBinding()) return existingType;
+		TypeReference unionRef = typeRef.isUnionType() ? ((UnionTypeReference) typeRef).typeReferences[0] : null;
+		
+		// for arrays: @T X[] SE7 associates @T to the type, but in SE8 it affects the leaf component type
+		long prevNullBits = existingType.leafComponentType().tagBits & TagBits.AnnotationNullMASK;
+		if (se8nullBits != 0 && prevNullBits != se8nullBits && ((prevNullBits | se8nullBits) == TagBits.AnnotationNullMASK)) {
+			scope.problemReporter().contradictoryNullAnnotations(se8NullAnnotation);
+		}
+		TypeBinding oldLeafType = (unionRef == null) ? existingType.leafComponentType() : unionRef.resolvedType;
+		AnnotationBinding [][] goodies = new AnnotationBinding[typeRef.getAnnotatableLevels()][];
+		goodies[0] = se8Annotations;  // @T X.Y.Z local; ==> @T should annotate X
+		TypeBinding newLeafType = scope.environment().createAnnotatedType(oldLeafType, goodies);
+
+		if (unionRef == null) {
+			typeRef.resolvedType = existingType.isArrayType() ? scope.environment().createArrayType(newLeafType, existingType.dimensions(), existingType.getTypeAnnotations()) : newLeafType;
+		} else {
+			unionRef.resolvedType = newLeafType;
+			unionRef.bits |= HasTypeAnnotations;
+		}
+		return typeRef.resolvedType;
 	}
 
 /**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.java
index 33d129f..2450c9d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Palo Alto Research Center, Incorporated - AspectJ adaptation
@@ -21,6 +17,11 @@
  *								bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
  *								bug 401030 - [1.8][null] Null analysis support for lambda methods.
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 403216 - [1.8][null] TypeReference#captureTypeAnnotations treats type annotations as type argument annotations
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -98,17 +99,15 @@
 	}
 	// version for invocation from LambdaExpression:
 	static void createArgumentBindings(Argument[] arguments, MethodBinding binding, MethodScope scope) {
+		boolean useTypeAnnotations = scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8;
 		if (arguments != null && binding != null) {
 			for (int i = 0, length = arguments.length; i < length; i++) {
 				Argument argument = arguments[i];
-				argument.createBinding(scope, binding.parameters[i]);
+				binding.parameters[i] = argument.createBinding(scope, binding.parameters[i]);
+				if (useTypeAnnotations)
+					continue; // no business with SE7 null annotations in the 1.8 case.
 				// createBinding() has resolved annotations, now transfer nullness info from the argument to the method:
-				// prefer type annotation:
-				long argTypeTagBits = (argument.type.resolvedType.tagBits & TagBits.AnnotationNullMASK);
-				// if none found try SE7 annotation:
-				if (argTypeTagBits == 0) {
-					argTypeTagBits = (argument.binding.tagBits & TagBits.AnnotationNullMASK);
-				}
+				long argTypeTagBits = (argument.binding.tagBits & TagBits.AnnotationNullMASK);
 				if (argTypeTagBits != 0) {
 					if (binding.parameterNonNullness == null) {
 						binding.parameterNonNullness = new Boolean[arguments.length];
@@ -137,7 +136,7 @@
 			AnnotationBinding[][] paramAnnotations = null;
 			for (int i = 0, length = this.arguments.length; i < length; i++) {
 				Argument argument = this.arguments[i];
-				argument.bind(this.scope, this.binding.parameters[i], used);
+				this.binding.parameters[i] = argument.bind(this.scope, this.binding.parameters[i], used);
 				if (argument.annotations != null) {
 					if (paramAnnotations == null) {
 						paramAnnotations = new AnnotationBinding[length][];
@@ -218,6 +217,27 @@
 		}
 	}
 
+	/**
+	 * Feed null information from argument annotations into the analysis and mark arguments as assigned.
+	 * Variant for Java 8 using type annotations
+	 */
+	static void analyseArguments18(FlowInfo flowInfo, Argument[] methodArguments, MethodBinding methodBinding) {
+		if (methodArguments != null) {
+			int length = Math.min(methodBinding.parameters.length, methodArguments.length);
+			for (int i = 0; i < length; i++) {
+				// leverage null type annotations:
+				long tagBits = methodBinding.parameters[i].tagBits & TagBits.AnnotationNullMASK;
+				if (tagBits == TagBits.AnnotationNonNull)
+					flowInfo.markAsDefinitelyNonNull(methodArguments[i].binding);
+				else if (tagBits == TagBits.AnnotationNullable)
+					flowInfo.markPotentiallyNullBit(methodArguments[i].binding);
+	
+				// tag parameters as being set:
+				flowInfo.markAsDefinitelyAssigned(methodArguments[i].binding);
+			}
+		}
+	}
+
 	public CompilationResult compilationResult() {
 
 		return this.compilationResult;
@@ -505,13 +525,16 @@
 			bindThrownExceptions();
 			resolveJavadoc();
 			resolveAnnotations(this.scope, this.annotations, this.binding);
-			validateNullAnnotations();
+			
+			long sourceLevel = this.scope.compilerOptions().sourceLevel;
+			validateNullAnnotations(sourceLevel);
+
 			resolveStatements();
 			// check @Deprecated annotation presence
 			if (this.binding != null
 					&& (this.binding.getAnnotationTagBits() & TagBits.AnnotationDeprecated) == 0
 					&& (this.binding.modifiers & ClassFileConstants.AccDeprecated) != 0
-					&& this.scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5) {
+					&& sourceLevel >= ClassFileConstants.JDK1_5) {
 				this.scope.problemReporter().missingDeprecatedAnnotationForMethod(this);
 			}
 		} catch (AbortMethod e) {
@@ -536,7 +559,6 @@
 		/* neither static methods nor methods in anonymous types can have explicit 'this' */
 		if (this.isStatic() || declaringClass.isAnonymousType()) {
 			this.scope.problemReporter().disallowedThisParameter(this.receiver);
-			this.receiver = null;
 			return; // No need to do further validation
 		}
 
@@ -546,7 +568,6 @@
 			if (declaringClass.isStatic()
 					|| (declaringClass.tagBits & (TagBits.IsLocalType | TagBits.IsMemberType)) == 0) { /* neither member nor local type */
 				this.scope.problemReporter().disallowedThisParameter(this.receiver);
-				this.receiver = null;
 				return; // No need to do further validation
 			}
 			enclosingReceiver = enclosingReceiver.enclosingType();
@@ -563,9 +584,12 @@
 			this.receiver.qualifyingName = null;
 		}
 
-		if (enclosingReceiver != resolvedReceiverType) {
+		if (TypeBinding.notEquals(enclosingReceiver, resolvedReceiverType)) {
 			this.scope.problemReporter().illegalTypeForExplicitThis(this.receiver, enclosingReceiver);
-			this.receiver = null;
+		}
+
+		if (resolvedReceiverType.hasNullTypeAnnotations()) {
+			this.scope.problemReporter().nullAnnotationUnsupportedLocation(this.receiver.type);
 		}
 	}
 	public void resolveJavadoc() {
@@ -622,17 +646,28 @@
 	    return null;
 	}
 
-	void validateNullAnnotations() {
+	void validateNullAnnotations(long sourceLevel) {
+		if (this.binding == null) return;
 		// null annotations on parameters?
-		if (this.binding != null && this.binding.parameterNonNullness != null) {
-			int length = this.binding.parameters.length;
-			for (int i=0; i<length; i++) {
-				if (this.binding.parameterNonNullness[i] != null) {
-					long nullAnnotationTagBit =  this.binding.parameterNonNullness[i].booleanValue()
-							? TagBits.AnnotationNonNull : TagBits.AnnotationNullable;
-					this.scope.validateNullAnnotation(nullAnnotationTagBit, this.arguments[i].type, this.arguments[i].annotations);
+		if (sourceLevel < ClassFileConstants.JDK1_8) {
+			if (this.binding.parameterNonNullness != null) {
+				int length = this.binding.parameters.length;
+				for (int i=0; i<length; i++) {
+					if (this.binding.parameterNonNullness[i] != null) {
+						long nullAnnotationTagBit =  this.binding.parameterNonNullness[i].booleanValue()
+								? TagBits.AnnotationNonNull : TagBits.AnnotationNullable;
+						if (!this.scope.validateNullAnnotation(nullAnnotationTagBit, this.arguments[i].type, this.arguments[i].annotations))
+							this.binding.parameterNonNullness[i] = null;
+					}
 				}
 			}
+		} else {
+			int length = this.binding.parameters.length;
+			for (int i=0; i<length; i++) {
+				this.scope.validateNullAnnotation(this.binding.parameters[i].tagBits, this.arguments[i].type, this.arguments[i].annotations);
+// TODO(stephan) remove once we're sure:
+//					this.binding.parameters[i] = this.binding.parameters[i].unannotated();
+			}			
 		}
 	}
 	//*********************************************************************
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractVariableDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractVariableDeclaration.java
index f012312..fa2bc80 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractVariableDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AbstractVariableDeclaration.java
@@ -1,27 +1,28 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowInfo;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 
-public abstract class AbstractVariableDeclaration extends Statement implements InvocationSite, ExpressionContext {
+public abstract class AbstractVariableDeclaration extends Statement implements InvocationSite {
 	public int declarationEnd;
 	/**
 	 * For local declarations (outside of for statement initialization) and field declarations,
@@ -64,6 +65,10 @@
 	 */
 	public abstract int getKind();
 
+	public InferenceContext18 freshInferenceContext(Scope scope) {
+		return null;
+	}
+
 	/* (non-Javadoc)
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite#isSuperAccess()
 	 */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
index 198fe75..7e5dedb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -22,24 +18,48 @@
  *							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
+ *							Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *							Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *							Bug 424727 - [compiler][null] NullPointerException in nullAnnotationUnsupportedLocation(ProblemReporter.java:5708)
+ *							Bug 424710 - [1.8][compiler] CCE in SingleNameReference.localVariableBinding
+ *							Bug 425152 - [1.8] [compiler] Lambda Expression not resolved but flow analyzed leading to NPE.
+ *							Bug 424205 - [1.8] Cannot infer type for diamond type with lambda on method invocation
+ *							Bug 424415 - [1.8][compiler] Eventual resolution of ReferenceExpression is not seen to be happening.
+ *							Bug 426366 - [1.8][compiler] Type inference doesn't handle multiple candidate target types in outer overload context
+ *							Bug 426290 - [1.8][compiler] Inference + overloading => wrong method resolution ?
+ *							Bug 426764 - [1.8] Presence of conditional expression as method argument confuses compiler
+ *							Bug 424930 - [1.8][compiler] Regression: "Cannot infer type arguments" error from compiler.
+ *							Bug 427483 - [Java 8] Variables in lambdas sometimes can't be resolved
+ *							Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *							Bug 426996 - [1.8][inference] try to avoid method Expression.unresolve()? 
+ *							Bug 428352 - [1.8][compiler] Resolution errors don't always surface
+ *							Bug 429203 - [1.8][compiler] NPE in AllocationExpression.binding
+ *							Bug 429430 - [1.8] Lambdas and method reference infer wrong exception type with generics (RuntimeException instead of IOException)
  *     Jesper S Moller <jesper@selskabet.org> - Contributions for
  *							bug 378674 - "The method can be declared as static" is wrong
- *        Andy Clement - Contributions for
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409245 - [1.8][compiler] Type annotations dropped when call is routed through a synthetic bridge method
+ *     Till Brychcy - Contributions for
+ *     						bug 413460 - NonNullByDefault is not inherited to Constructors when accessed via Class File
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.*;
+
 import org.aspectj.org.eclipse.jdt.core.compiler.IProblem;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.*;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.*;
-import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
+import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
 
-public class AllocationExpression extends Expression implements InvocationSite {
+public class AllocationExpression extends Expression implements Invocation {
 
 	public TypeReference type;
 	public Expression[] arguments;
@@ -54,6 +74,32 @@
 	public FakedTrackingVariable closeTracker;	// when allocation a Closeable store a pre-liminary tracking variable here
 	private ExpressionContext expressionContext = VANILLA_CONTEXT;
 
+	 // hold on to this context from invocation applicability inference until invocation type inference (per method candidate):
+	private SimpleLookupTable/*<PMB,IC18>*/ inferenceContexts;
+	protected InnerInferenceHelper innerInferenceHelper;
+
+	/** Record to keep state between different parts of resolution. */
+	ResolutionState suspendedResolutionState;
+	class ResolutionState {
+		BlockScope scope;
+		boolean isDiamond;
+		boolean diamondNeedsDeferring;
+		boolean argsContainCast;
+		boolean cannotInferDiamond; // request the an error be reported in due time
+		TypeBinding[] argumentTypes;
+		boolean hasReportedError;
+
+		ResolutionState(BlockScope scope, boolean isDiamond, boolean diamonNeedsDeferring,
+				boolean argsContainCast, TypeBinding[] argumentTypes)
+		{
+			this.scope = scope;
+			this.isDiamond = isDiamond;
+			this.diamondNeedsDeferring = diamonNeedsDeferring;
+			this.argsContainCast = argsContainCast;
+			this.argumentTypes = argumentTypes;
+		}
+	}
+
 public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo) {
 	// check captured variables are initialized in current context (26134)
 	checkCapturedLocalInitializationIfNecessary((ReferenceBinding)this.binding.declaringClass.erasure(), currentScope, flowInfo);
@@ -193,7 +239,7 @@
 			i++) {
 			codeStream.aconst_null();
 		}
-		codeStream.invoke(Opcodes.OPC_invokespecial, this.syntheticAccessor, null /* default declaringClass */);
+		codeStream.invoke(Opcodes.OPC_invokespecial, this.syntheticAccessor, null /* default declaringClass */, this.typeArguments);
 	}
 	if (valueRequired) {
 		codeStream.generateImplicitConversion(this.implicitConversion);
@@ -268,7 +314,7 @@
 	MethodBinding codegenBinding = this.binding.original();
 
 	ReferenceBinding declaringClass;
-	if (codegenBinding.isPrivate() && currentScope.enclosingSourceType() != (declaringClass = codegenBinding.declaringClass)) {
+	if (codegenBinding.isPrivate() && TypeBinding.notEquals(currentScope.enclosingSourceType(), (declaringClass = codegenBinding.declaringClass))) {
 
 		// from 1.4 on, local type constructor can lose their private flag to ease emulation
 		if ((declaringClass.tagBits & TagBits.IsLocalType) != 0 && currentScope.compilerOptions().complianceLevel >= ClassFileConstants.JDK1_4) {
@@ -310,12 +356,28 @@
 
 public TypeBinding resolveType(BlockScope scope) {
 	// Propagate the type checking to the arguments, and check if the constructor is defined.
-	this.constant = Constant.NotAConstant;
-	if (this.type == null) {
-		// initialization of an enum constant
-		this.resolvedType = scope.enclosingReceiverType();
+	final boolean isDiamond = this.type != null && (this.type.bits & ASTNode.IsDiamond) != 0;
+	final CompilerOptions compilerOptions = scope.compilerOptions();
+	boolean diamondNeedsDeferring = false;
+	long sourceLevel = compilerOptions.sourceLevel;
+	if (this.constant != Constant.NotAConstant) {
+		this.constant = Constant.NotAConstant;
+		if (this.type == null) {
+			// initialization of an enum constant
+			this.resolvedType = scope.enclosingReceiverType();
+		} else {
+			this.resolvedType = this.type.resolveType(scope, true /* check bounds*/);
+			if (isDiamond && this.typeExpected == null && this.expressionContext == INVOCATION_CONTEXT && sourceLevel >= ClassFileConstants.JDK1_8) {
+				if (this.resolvedType != null && this.resolvedType.isValidBinding())
+					diamondNeedsDeferring = true;
+			}
+		}
 	} else {
-		this.resolvedType = this.type.resolveType(scope, true /* check bounds*/);
+		this.resolvedType = this.type.resolvedType;
+	}
+
+	if (this.type != null) {
+		checkIllegalNullAnnotation(scope, this.resolvedType);
 		checkParameterizedAllocation: {
 			if (this.type instanceof ParameterizedQualifiedTypeReference) { // disallow new X<String>.Y<Integer>()
 				ReferenceBinding currentType = (ReferenceBinding)this.resolvedType;
@@ -337,11 +399,10 @@
 	}
 	// will check for null after args are resolved
 
-	final boolean isDiamond = this.type != null && (this.type.bits & ASTNode.IsDiamond) != 0;
 	// resolve type arguments (for generic constructor call)
 	if (this.typeArguments != null) {
 		int length = this.typeArguments.length;
-		boolean argHasError = scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_5;
+		boolean argHasError = sourceLevel < ClassFileConstants.JDK1_5;
 		this.genericTypeArguments = new TypeBinding[length];
 		for (int i = 0; i < length; i++) {
 			TypeReference typeReference = this.typeArguments[i];
@@ -369,12 +430,10 @@
 	// buffering the arguments' types
 	boolean argsContainCast = false;
 	TypeBinding[] argumentTypes = Binding.NO_PARAMETERS;
-	boolean polyExpressionSeen = false;
 	if (this.arguments != null) {
 		boolean argHasError = false;
 		int length = this.arguments.length;
 		argumentTypes = new TypeBinding[length];
-		TypeBinding argumentType;
 		for (int i = 0; i < length; i++) {
 			Expression argument = this.arguments[i];
 			if (argument instanceof CastExpression) {
@@ -382,11 +441,15 @@
 				argsContainCast = true;
 			}
 			argument.setExpressionContext(INVOCATION_CONTEXT);
-			if ((argumentType = argumentTypes[i] = argument.resolveType(scope)) == null) {
+			if (this.arguments[i].resolvedType != null) 
+				scope.problemReporter().genericInferenceError("Argument was unexpectedly found resolved", this); //$NON-NLS-1$
+			if ((argumentTypes[i] = argument.resolveType(scope)) == null) {
 				argHasError = true;
 			}
-			if (argumentType != null && argumentType.kind() == Binding.POLY_TYPE)
-				polyExpressionSeen = true;
+			if (sourceLevel >= ClassFileConstants.JDK1_8 && argument.isPolyExpression()) {
+				if (this.innerInferenceHelper == null)
+					this.innerInferenceHelper = new InnerInferenceHelper();
+			}
 		}
 		if (argHasError) {
 			/* https://bugs.eclipse.org/bugs/show_bug.cgi?id=345359, if arguments have errors, completely bail out in the <> case.
@@ -402,7 +465,7 @@
 				for (int i = length; --i >= 0;) {
 					pseudoArgs[i] = argumentTypes[i] == null ? TypeBinding.NULL : argumentTypes[i]; // replace args with errors with null type
 				}
-				this.binding = scope.findMethod((ReferenceBinding) this.resolvedType, TypeConstants.INIT, pseudoArgs, this);
+				this.binding = scope.findMethod((ReferenceBinding) this.resolvedType, TypeConstants.INIT, pseudoArgs, this, false);
 				if (this.binding != null && !this.binding.isValidBinding()) {
 					MethodBinding closestMatch = ((ProblemMethodBinding)this.binding).closestMatch;
 					// record the closest match, for clients who may still need hint about possible method match
@@ -432,20 +495,51 @@
 		scope.problemReporter().cannotInstantiate(this.type, this.resolvedType);
 		return this.resolvedType;
 	}
-	if (isDiamond) {
-		TypeBinding [] inferredTypes = inferElidedTypes(((ParameterizedTypeBinding) this.resolvedType).genericType(), null, argumentTypes, scope);
-		if (inferredTypes == null) {
-			scope.problemReporter().cannotInferElidedTypes(this);
-			return this.resolvedType = null;
-		}
-		this.resolvedType = this.type.resolvedType = scope.environment().createParameterizedType(((ParameterizedTypeBinding) this.resolvedType).genericType(), inferredTypes, ((ParameterizedTypeBinding) this.resolvedType).enclosingType());
- 	}
-	
-	ReferenceBinding allocationType = (ReferenceBinding) this.resolvedType;
-	this.binding = scope.getConstructor(allocationType, argumentTypes, this);
-	if (polyExpressionSeen && polyExpressionsHaveErrors(scope, this.binding, this.arguments, argumentTypes))
+	ResolutionState state = new ResolutionState(scope, isDiamond, diamondNeedsDeferring, argsContainCast, argumentTypes);
+	if (diamondNeedsDeferring) {
+		this.suspendedResolutionState = state; // resolving to be continued later (via binding(TypeBinding targetType)).
+		return new PolyTypeBinding(this);
+	}
+
+	if (!resolvePart2(state))
 		return null;
-	
+	return resolvePart3(state);
+}
+
+/** Second part of resolving that may happen multiple times during overload resolution. */
+boolean resolvePart2(ResolutionState state) {
+	// TODO: all information persisted during this method may need to be stored per targetType?
+	if (state.isDiamond) {
+		ReferenceBinding genericType = ((ParameterizedTypeBinding) this.resolvedType).genericType();
+		TypeBinding [] inferredTypes = inferElidedTypes((ParameterizedTypeBinding) this.resolvedType, this.resolvedType.enclosingType(), state.argumentTypes, state.scope);
+		if (inferredTypes == null) {
+			if (!state.diamondNeedsDeferring) {
+				state.scope.problemReporter().cannotInferElidedTypes(this);
+				state.hasReportedError = true;
+				this.resolvedType = null;
+			} else {
+				state.cannotInferDiamond = true; // defer reporting
+			}
+			return false;
+		}
+		this.resolvedType = this.type.resolvedType = state.scope.environment().createParameterizedType(genericType, inferredTypes, ((ParameterizedTypeBinding) this.resolvedType).enclosingType());
+		state.cannotInferDiamond = false;
+ 	}
+	ReferenceBinding receiverType = (ReferenceBinding) this.resolvedType;
+	this.binding = findConstructorBinding(state.scope, this, receiverType, state.argumentTypes);
+	return true;
+}
+
+/** Final part of resolving (once): check and report various error conditions. */
+TypeBinding resolvePart3(ResolutionState state) {
+	if (this.suspendedResolutionState != null && this.suspendedResolutionState.hasReportedError)
+		return this.resolvedType;
+	this.suspendedResolutionState = null;
+	if (state.cannotInferDiamond) {
+		state.scope.problemReporter().cannotInferElidedTypes(this);
+		return this.resolvedType = null;
+	}
+	ReferenceBinding allocationType = (ReferenceBinding) this.resolvedType;
 	if (!this.binding.isValidBinding()) {
 		if (this.binding.declaringClass == null) {
 			this.binding.declaringClass = allocationType;
@@ -453,27 +547,49 @@
 		if (this.type != null && !this.type.resolvedType.isValidBinding()) {
 			return null;
 		}
-		scope.problemReporter().invalidConstructor(this, this.binding);
+		state.scope.problemReporter().invalidConstructor(this, this.binding);
 		return this.resolvedType;
 	}
 	if ((this.binding.tagBits & TagBits.HasMissingType) != 0) {
-		scope.problemReporter().missingTypeInConstructor(this, this.binding);
+		state.scope.problemReporter().missingTypeInConstructor(this, this.binding);
 	}
-	if (isMethodUseDeprecated(this.binding, scope, true))
-		scope.problemReporter().deprecatedMethod(this.binding, this);
-	if (checkInvocationArguments(scope, null, allocationType, this.binding, this.arguments, argumentTypes, argsContainCast, this)) {
+	if (isMethodUseDeprecated(this.binding, state.scope, true)) {
+		state.scope.problemReporter().deprecatedMethod(this.binding, this);
+	}
+	if (checkInvocationArguments(state.scope, null, allocationType, this.binding, this.arguments, state.argumentTypes, state.argsContainCast, this)) {
 		this.bits |= ASTNode.Unchecked;
 	}
 	if (this.typeArguments != null && this.binding.original().typeVariables == Binding.NO_TYPE_VARIABLES) {
-		scope.problemReporter().unnecessaryTypeArgumentsForMethodInvocation(this.binding, this.genericTypeArguments, this.typeArguments);
+		state.scope.problemReporter().unnecessaryTypeArgumentsForMethodInvocation(this.binding, this.genericTypeArguments, this.typeArguments);
 	}
-	if (!isDiamond && this.resolvedType.isParameterizedTypeWithActualArguments()) {
- 		checkTypeArgumentRedundancy((ParameterizedTypeBinding) this.resolvedType, null, argumentTypes, scope);
+	if (!state.isDiamond && this.resolvedType.isParameterizedTypeWithActualArguments()) {
+ 		checkTypeArgumentRedundancy((ParameterizedTypeBinding) this.resolvedType, this.resolvedType.enclosingType(), state.argumentTypes, state.scope);
  	}
+	CompilerOptions compilerOptions = state.scope.compilerOptions();
+	if (compilerOptions.isAnnotationBasedNullAnalysisEnabled && (this.binding.tagBits & TagBits.IsNullnessKnown) == 0) {
+		new ImplicitNullAnnotationVerifier(state.scope.environment(), compilerOptions.inheritNullAnnotations)
+				.checkImplicitNullAnnotations(this.binding, null/*srcMethod*/, false, state.scope);
+	}
+	recordExceptionsForEnclosingLambda(state.scope, this.binding.thrownExceptions);
 	return allocationType;
 }
 
-public TypeBinding[] inferElidedTypes(ReferenceBinding allocationType, ReferenceBinding enclosingType, TypeBinding[] argumentTypes, final BlockScope scope) {
+/**
+ * Check if 'allocationType' illegally has a top-level null annotation.
+ */
+void checkIllegalNullAnnotation(BlockScope scope, TypeBinding allocationType) {
+	if (allocationType != null) {
+		// only check top-level null annotation (annots on details are OK):
+		long nullTagBits = allocationType.tagBits & TagBits.AnnotationNullMASK;
+		if (nullTagBits != 0) {
+			Annotation annotation = this.type.findAnnotation(nullTagBits);
+			if (annotation != null)
+				scope.problemReporter().nullAnnotationUnsupportedLocation(annotation);
+		}
+	}
+}
+
+public TypeBinding[] inferElidedTypes(ParameterizedTypeBinding allocationType, ReferenceBinding enclosingType, TypeBinding[] argumentTypes, final BlockScope scope) {
 	/* Given the allocation type and the arguments to the constructor, see if we can synthesize a generic static factory
 	   method that would, given the argument types and the invocation site, manufacture a parameterized object of type allocationType.
 	   If we are successful then by design and construction, the parameterization of the return type of the factory method is identical
@@ -483,14 +599,24 @@
 	if (factory instanceof ParameterizedGenericMethodBinding && factory.isValidBinding()) {
 		ParameterizedGenericMethodBinding genericFactory = (ParameterizedGenericMethodBinding) factory;
 		this.inferredReturnType = genericFactory.inferredReturnType;
+		// this is our last chance to inspect the result of the inference that is connected to the throw-away factory binding
+		InferenceContext18 infCtx18 = getInferenceContext(genericFactory);
+		if (infCtx18 != null && infCtx18.stepCompleted == InferenceContext18.BINDINGS_UPDATED) {
+			// refresh argumentTypes from updated bindings in arguments:
+			// (this shouldn't be strictly necessary, as FunctionExpression.isCompatibleWith() should give the same result,
+			//  but it's probably be a good idea to avoid the necessity to call isCompatibleWith() in the first place). 
+			for (int i = 0; i < argumentTypes.length; i++) {
+				if (argumentTypes[i] instanceof PolyTypeBinding)
+					argumentTypes[i] = this.arguments[i].resolvedType;
+			}
+		}
 		return ((ParameterizedTypeBinding)factory.returnType).arguments;
 	}
 	return null;
 }
 
 public void checkTypeArgumentRedundancy(ParameterizedTypeBinding allocationType, ReferenceBinding enclosingType, TypeBinding[] argumentTypes, final BlockScope scope) {
-	ProblemReporter reporter = scope.problemReporter();
-	if ((reporter.computeSeverity(IProblem.RedundantSpecificationOfTypeArguments) == ProblemSeverities.Ignore) || scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_7) return;
+	if ((scope.problemReporter().computeSeverity(IProblem.RedundantSpecificationOfTypeArguments) == ProblemSeverities.Ignore) || scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_7) return;
 	if (allocationType.arguments == null) return;  // raw binding
 	if (this.genericTypeArguments != null) return; // diamond can't occur with explicit type args for constructor
 	if (argumentTypes == Binding.NO_PARAMETERS && this.typeExpected instanceof ParameterizedTypeBinding) {
@@ -500,24 +626,34 @@
 			// eg. X<String> x = new X<String>()
 			int i;
 			for (i = 0; i < allocationType.arguments.length; i++) {
-				if (allocationType.arguments[i] != expected.arguments[i])
+				if (TypeBinding.notEquals(allocationType.arguments[i], expected.arguments[i]))
 					break;
 			}
 			if (i == allocationType.arguments.length) {
-				reporter.redundantSpecificationOfTypeArguments(this.type, allocationType.arguments);
+				scope.problemReporter().redundantSpecificationOfTypeArguments(this.type, allocationType.arguments);
 				return;
 			}	
 		}
 	}
-	TypeBinding [] inferredTypes = inferElidedTypes(allocationType.genericType(), enclosingType, argumentTypes, scope);
+	TypeBinding [] inferredTypes;
+	int previousBits = this.type.bits;
+	try {
+		// checking for redundant type parameters must fake a diamond, 
+		// so we infer the same results as we would get with a diamond in source code:
+		this.type.bits |= IsDiamond;
+		inferredTypes = inferElidedTypes(allocationType, enclosingType, argumentTypes, scope);
+	} finally {
+		// reset effects of inference
+		this.type.bits = previousBits;
+	}
 	if (inferredTypes == null) {
 		return;
 	}
 	for (int i = 0; i < inferredTypes.length; i++) {
-		if (inferredTypes[i] != allocationType.arguments[i])
+		if (TypeBinding.notEquals(inferredTypes[i], allocationType.arguments[i]))
 			return;
 	}
-	reporter.redundantSpecificationOfTypeArguments(this.type, allocationType.arguments);
+	scope.problemReporter().redundantSpecificationOfTypeArguments(this.type, allocationType.arguments);
 }
 
 public void setActualReceiverType(ReferenceBinding receiverType) {
@@ -561,17 +697,17 @@
 }
 
 public boolean isPolyExpression() {
+	return isPolyExpression(this.binding);
+}
+public boolean isPolyExpression(MethodBinding method) {
 	return (this.expressionContext == ASSIGNMENT_CONTEXT || this.expressionContext == INVOCATION_CONTEXT) &&
 			this.type != null && (this.type.bits & ASTNode.IsDiamond) != 0;
 }
 
-public boolean tIsMoreSpecific(TypeBinding t, TypeBinding s) {
-	return isPolyExpression() ? !t.isBaseType() && s.isBaseType() : super.tIsMoreSpecific(t, s);
-}
 /**
- * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite#expectedType()
+ * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite#invocationTargetType()
  */
-public TypeBinding expectedType() {
+public TypeBinding invocationTargetType() {
 	return this.typeExpected;
 }
 
@@ -579,4 +715,91 @@
 	return true;
 }
 
+//-- interface Invocation: --
+public MethodBinding binding(TypeBinding targetType, boolean reportErrors, Scope scope) {
+	if (this.suspendedResolutionState != null && targetType != null) {
+		setExpectedType(targetType);
+		if (!resolvePart2(this.suspendedResolutionState)) {
+			if (reportErrors && !this.suspendedResolutionState.hasReportedError) {
+				if (this.suspendedResolutionState.cannotInferDiamond)
+					scope.problemReporter().cannotInferElidedTypes(this);
+				else
+					scope.problemReporter().genericInferenceError("constructor is unexpectedly unresolved", this); //$NON-NLS-1$
+				this.suspendedResolutionState.hasReportedError = true;
+			}
+			return null;
+		}
+	}
+	if (reportErrors && this.binding != null && !this.binding.isValidBinding()) {
+		if (this.binding.declaringClass == null)
+			this.binding.declaringClass = (ReferenceBinding) this.resolvedType;
+		if (this.suspendedResolutionState != null) {
+			scope.problemReporter().invalidConstructor(this, this.binding);
+			this.suspendedResolutionState.hasReportedError = true;
+		}
+	}
+	return this.binding;
+}
+public TypeBinding checkAgainstFinalTargetType(TypeBinding targetType, Scope scope) {
+	if (this.suspendedResolutionState != null) {
+		return resolvePart3(this.suspendedResolutionState);
+		// also: should this trigger any propagation to inners, too?
+	}
+	return super.checkAgainstFinalTargetType(targetType, scope);
+}
+public Expression[] arguments() {
+	return this.arguments;
+}
+
+public boolean updateBindings(MethodBinding updatedBinding, TypeBinding targetType) {
+	boolean hasUpdate = this.binding != updatedBinding;
+	if (this.inferenceContexts != null && this.binding.original() == updatedBinding.original()) {
+		InferenceContext18 ctx = (InferenceContext18)this.inferenceContexts.get(this.binding);
+		if (ctx != null && updatedBinding instanceof ParameterizedGenericMethodBinding) {
+			this.inferenceContexts.put(updatedBinding, ctx);
+			// solution may have come from an outer inference, mark now that this (inner) is done (but not deep inners):
+			hasUpdate |= ctx.registerSolution(targetType, updatedBinding);
+		}
+	}
+	this.binding = updatedBinding;
+	this.resolvedType = updatedBinding.declaringClass;
+	return hasUpdate;
+}
+public void registerInferenceContext(ParameterizedGenericMethodBinding method, InferenceContext18 infCtx18) {
+	if (this.inferenceContexts == null)
+		this.inferenceContexts = new SimpleLookupTable();
+	this.inferenceContexts.put(method, infCtx18);
+	MethodBinding original = method.original();
+	if (original instanceof SyntheticFactoryMethodBinding) {
+		SyntheticFactoryMethodBinding synthOriginal = (SyntheticFactoryMethodBinding)original;
+		ParameterizedMethodBinding parameterizedCtor = synthOriginal.applyTypeArgumentsOnConstructor(method.typeArguments);
+		this.inferenceContexts.put(parameterizedCtor, infCtx18);
+	}
+}
+public boolean usesInference() {
+	return (this.binding instanceof ParameterizedGenericMethodBinding) 
+			&& getInferenceContext((ParameterizedGenericMethodBinding) this.binding) != null;
+}
+public InferenceContext18 getInferenceContext(ParameterizedMethodBinding method) {
+	if (this.inferenceContexts == null)
+		return null;
+	return (InferenceContext18) this.inferenceContexts.get(method);
+}
+public boolean innersNeedUpdate() {
+	return this.innerInferenceHelper != null;
+}
+public void innerUpdateDone() {
+	this.innerInferenceHelper = null;
+}
+public InnerInferenceHelper innerInferenceHelper() {
+	return this.innerInferenceHelper;
+}
+
+//-- interface InvocationSite: --
+public ExpressionContext getExpressionContext() {
+	return this.expressionContext;
+}
+public InferenceContext18 freshInferenceContext(Scope scope) {
+	return new InferenceContext18(scope, this.arguments, this);
+}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation.java
index 9add44e..8906f8f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Annotation.java
@@ -1,22 +1,33 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
  *								bug 186342 - [compiler][null] Using annotations for null checking
  *								bug 365662 - [compiler][null] warn on contradictory and redundant null annotations
  *								bug 331649 - [compiler][null] consider null annotations for fields
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 415850 - [1.8] Ensure RunJDTCoreTests can cope with null annotations enabled
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 424728 - [1.8][null] Unexpected error: The nullness annotation 'XXXX' is not applicable at this location
+ *								Bug 392245 - [1.8][compiler][null] Define whether / how @NonNullByDefault applies to TYPE_USE locations
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409517 - [1.8][compiler] Type annotation problems on more elaborate array references
+ *                          Bug 415397 - [1.8][compiler] Type Annotations on wildcard type argument dropped
+ *                          Bug 414384 - [1.8] type annotation on abbreviated inner class is not marked as inner type
+ *      Jesper S Moller <jesper@selskabet.org> -  Contributions for
+ *                          Bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
+ *                          Bug 412151 - [1.8][compiler] Check repeating annotation's collection type
+ *                          Bug 412149 - [1.8][compiler] Emit repeated annotations into the designated container
+ *                          Bug 419209 - [1.8] Repeating container annotations should be rejected in the presence of annotation it contains
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -33,384 +44,154 @@
 /**
  * Annotation
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class Annotation extends Expression {
-
+	
+	Annotation persistibleAnnotation = this;  // Emit this into class file, unless this is a repeating annotation, in which case package this into the designated container.
+	
 	/**
 	 * Return the location for the corresponding annotation inside the type reference, <code>null</code> if none.
 	 */
 	public static int[] getLocations(
-			final TypeReference reference,
-			final Annotation[] primaryAnnotation,
-			final Annotation annotation,
-			final Annotation[][] annotationsOnDimensionsOnExpression,
-			final int dimensions) {
+			final Expression reference,
+			final Annotation annotation) {
 	
 		class LocationCollector extends ASTVisitor {
 			Stack typePathEntries;
-			Annotation currentAnnotation;
-			boolean search = true;
+			Annotation searchedAnnotation;
+			boolean continueSearch = true;
 			
 			public LocationCollector(Annotation currentAnnotation) {
 				this.typePathEntries = new Stack();
-				this.currentAnnotation = currentAnnotation;
+				this.searchedAnnotation = currentAnnotation;
+			}
+			
+			private int[] computeNestingDepth(TypeReference typeReference) {
+				TypeBinding type = typeReference.resolvedType == null ? null : typeReference.resolvedType.leafComponentType(); 
+				int[] nestingDepths = new int[typeReference.getAnnotatableLevels()];
+				if (type != null && type.isNestedType()) {
+					int depth = 0;
+					TypeBinding currentType = type;
+					while (currentType != null) {
+						depth += (currentType.isStatic()) ? 0 : 1;
+						currentType = currentType.enclosingType();
+					}
+					// Work backwards computing whether a INNER_TYPE entry is required for each level
+					int counter = nestingDepths.length - 1;
+					while (type != null && counter >= 0) {
+						nestingDepths[counter--] = depth;
+						depth -= type.isStatic() ? 0 : 1;
+						type = type.enclosingType();
+					}
+				}
+				return nestingDepths;
+			}
+			
+
+			private void inspectAnnotations(Annotation [] annotations) {
+				for (int i = 0, length = annotations == null ? 0 : annotations.length; this.continueSearch && i < length; i++) {
+					if (annotations[i] == this.searchedAnnotation)
+						this.continueSearch = false;
+				}
+			}
+
+			private void inspectArrayDimensions(Annotation [][] annotationsOnDimensions, int dimensions) {
+				for (int i = 0; this.continueSearch && i < dimensions; i++) {
+					Annotation[] annotations = annotationsOnDimensions == null ? null : annotationsOnDimensions[i];
+					inspectAnnotations(annotations);
+					if (!this.continueSearch) return;
+					this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
+				}
+			}
+			
+			private void inspectTypeArguments(TypeReference[] typeReferences) {
+				for (int i = 0, length = typeReferences == null ? 0 : typeReferences.length; this.continueSearch && i < length; i++) {
+					int size = this.typePathEntries.size();
+					this.typePathEntries.add(new int[]{3,i});
+					typeReferences[i].traverse(this, (BlockScope) null);
+					if (!this.continueSearch) return;
+					this.typePathEntries.setSize(size);
+				}
+			}
+			
+			public boolean visit(TypeReference typeReference, BlockScope scope) {
+				if (this.continueSearch) {
+					inspectArrayDimensions(typeReference.getAnnotationsOnDimensions(), typeReference.dimensions());
+					if (this.continueSearch) {
+						int[] nestingDepths = computeNestingDepth(typeReference);
+						Annotation[][] annotations = typeReference.annotations;
+						TypeReference [][] typeArguments = typeReference.getTypeArguments();
+						int levels = typeReference.getAnnotatableLevels();
+						int size = this.typePathEntries.size();
+						for (int i = levels - 1; this.continueSearch && i >= 0; i--) {  // traverse outwards, see comment below about type annotations from SE7 locations.
+							this.typePathEntries.setSize(size);
+							for (int j = 0, depth = nestingDepths[i]; j < depth; j++)
+								this.typePathEntries.add(TYPE_PATH_INNER_TYPE);
+							if (annotations != null)
+								inspectAnnotations(annotations[i]);
+							if (this.continueSearch && typeArguments != null) {
+								inspectTypeArguments(typeArguments[i]);
+							}
+						}
+					}
+				}
+				return false; // if annotation is not found in the type reference, it must be one from SE7 location, typePathEntries captures the proper path entries for them. 
+			}	
+			public boolean visit(SingleTypeReference typeReference, BlockScope scope) {
+				return visit((TypeReference) typeReference, scope);
+			}
+			
+			public boolean visit(ArrayTypeReference typeReference, BlockScope scope) {
+				return visit((TypeReference) typeReference, scope);
 			}
 			
 			public boolean visit(ParameterizedSingleTypeReference typeReference, BlockScope scope) {
-				if (!this.search) return false;
-								
-				Annotation[][] annotationsOnDimensions = typeReference.annotationsOnDimensions;
-				if (annotationsOnDimensions != null) {
-					for (int i = 0, max = annotationsOnDimensions.length; i < max; i++) {
-						Annotation[] annotations = annotationsOnDimensions[i];
-						if (annotations != null) {
-							for (int j = 0, max2 = annotations.length; j < max2; j++) {
-								Annotation current = annotations[j];
-								if (current == this.currentAnnotation) {
-									// found it, push any relevant type path entries
-									for (int k = 0; k < i; k++) {
-										this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-									}
-									this.search = false;
-									return false;
-								}
-							}
-						}
-						
-					}
-				}
-				
-				// Example cases handled here: @B(1) List<String>[]
-				Annotation[][] annotations = typeReference.annotations;
-				if (annotations == null) {
-					annotations = new Annotation[][] { primaryAnnotation };
-				}
-				int annotationsLevels = annotations.length;
-				for (int i = 0; i < annotationsLevels; i++) {
-					Annotation [] current = annotations[i];
-					int annotationsLength = current == null ? 0 : current.length;
-					for (int j = 0; j < annotationsLength; j++) {
-						if (current[j] == this.currentAnnotation) {
-							this.search = false;
-							// Found it, insert any necessary type path elements
-							for (int k = 0; k < typeReference.dimensions; k++) {
-								this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-							}
-							return false;
-						}
-					}
-				}
-				
-				// If a type argument is annotated it is necessary jump past the array elements
-				if (typeReference.dimensions != 0) {
-					for (int k = 0, maxk = typeReference.dimensions; k < maxk; k++) {
-						this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-					}
-				}
-				TypeReference[] typeReferences = typeReference.typeArguments;
-				for (int i = 0, max = typeReferences.length; i < max; i++) {
-					this.typePathEntries.add(new int[]{3,i});
-					typeReferences[i].traverse(this, scope);
-					if (!this.search) {
-						return false;
-					} else {
-						this.typePathEntries.pop();
-					}
-				}
-				if (typeReference.dimensions != 0) {
-					for (int k = 0, maxk = typeReference.dimensions; k < maxk; k++) {
-						this.typePathEntries.pop();
-					}					
-				}
-				return true;
+				return visit((TypeReference) typeReference, scope);
 			}
 
-			public boolean visit(SingleTypeReference typeReference, BlockScope scope) {
-				if (!this.search) return false;
-
-				// depth allows for the syntax "outerInstance.new @A InnerType();"
-				int depth = 0;
-				if (typeReference.resolvedType instanceof ReferenceBinding) {
-					depth = getInnerDepth((ReferenceBinding)typeReference.resolvedType);
-				}
-				
-				if (dimensions != 0) {
-					for (int k = 0; k < dimensions; k++) {
-						this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-					}
-				}
-				Annotation[][] annotations = typeReference.annotations;
-				int annotationsLevels = annotations == null ? 0 : annotations.length;
-				for (int i = 0; i < annotationsLevels; i++) {
-					Annotation [] current = annotations[i];
-					int annotationsLength = current == null ? 0 : current.length;
-					for (int j = 0; j < annotationsLength; j++) {
-						if (current[j] == this.currentAnnotation) {
-							// Found
-							this.search = false;
-							if (depth != 0) {
-								for (int k = 0; k<depth; k++) {
-									this.typePathEntries.add(TYPE_PATH_INNER_TYPE);
-								}
-							}
-							return false;
-						}
-					}
-				}
-				if (dimensions != 0) {
-					for (int k = 0; k < dimensions; k++) {
-						this.typePathEntries.pop();
+			public boolean visit(QualifiedTypeReference typeReference, BlockScope scope) {
+				return visit((TypeReference) typeReference, scope);
+			}
+			
+			public boolean visit(ArrayQualifiedTypeReference typeReference, BlockScope scope) {
+				return visit((TypeReference) typeReference, scope);
+			}
+			
+			public boolean visit(ParameterizedQualifiedTypeReference typeReference, BlockScope scope) {
+				return visit((TypeReference) typeReference, scope);
+			}
+			
+			public boolean visit(Wildcard typeReference, BlockScope scope) {
+				visit((TypeReference) typeReference, scope);
+				if (this.continueSearch) {
+					TypeReference bound = typeReference.bound;
+					if (bound != null) {
+						int size = this.typePathEntries.size();
+						this.typePathEntries.push(TYPE_PATH_ANNOTATION_ON_WILDCARD_BOUND);
+						bound.traverse(this, scope);
+						if (this.continueSearch)
+							this.typePathEntries.setSize(size);
 					}
 				}
 				return false;
 			}
 
-			public boolean visit(ArrayTypeReference typeReference, BlockScope scope) {
-				if (!this.search) return false;
-				
-				Annotation[][] annotationsOnDimensions = typeReference.annotationsOnDimensions;
-				if (annotationsOnDimensions != null) {
-					for (int i = 0, max = annotationsOnDimensions.length; i < max; i++) {
-						Annotation[] annotations = annotationsOnDimensions[i];
-						if (annotations != null) {
-							for (int j = 0, max2 = annotations.length; j < max2; j++) {
-								Annotation current = annotations[j];
-								if (current == this.currentAnnotation) {
-									for (int k = 0; k < i; k++) {
-										this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-									}
-									this.search = false;
-									return false;
-								}
-							}
-						}
+			public boolean visit(ArrayAllocationExpression allocationExpression, BlockScope scope) {
+				if (this.continueSearch) {
+					inspectArrayDimensions(allocationExpression.getAnnotationsOnDimensions(), allocationExpression.dimensions.length);
+					if (this.continueSearch) {
+						allocationExpression.type.traverse(this, scope);
+					}
+					if (this.continueSearch) throw new IllegalStateException();
+				}
+				return false;
+			}
 						
-					}
-				}
-				Annotation[][] annotations = typeReference.annotations;
-				if (annotations == null) {
-					annotations = new Annotation[][] { primaryAnnotation };
-				}
-				int annotationsLevels = annotations.length;
-				for (int i = 0; i < annotationsLevels; i++) {
-					Annotation [] current = annotations[i];
-					int annotationsLength = current == null ? 0 : current.length;
-					for (int j = 0; j < annotationsLength; j++) {
-						if (current[j] == this.currentAnnotation) {
-							for (int k = 0, maxk=typeReference.dimensions; k < maxk; k++) {
-								this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-							}
-							this.search = false;
-							return false;
-						}
-					}
-				}
-				return true;
-			}
-			
-			public boolean visit(ArrayQualifiedTypeReference typeReference, BlockScope scope) {
-				if (!this.search) return false;
-				Annotation[][] annotationsOnDimensions = typeReference.annotationsOnDimensions;
-				if (annotationsOnDimensions != null) {
-					for (int i = 0, max = annotationsOnDimensions.length; i < max; i++) {
-						Annotation[] annotations = annotationsOnDimensions[i];
-						if (annotations != null) {
-							for (int j = 0, max2 = annotations.length; j < max2; j++) {
-								Annotation current = annotations[j];
-								if (current == this.currentAnnotation) {
-									this.search = false;
-									// Found it, insert relevant type path elements
-									for (int k = 0, maxk = i; k < maxk; k++) {
-										this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-									}
-									return false;
-								}
-							}
-						}
-					}
-				}
-				Annotation[][] annotations = typeReference.annotations;
-				if (annotations == null) {
-					annotations = new Annotation[][] { primaryAnnotation };
-				}
-				int annotationsLevels = annotations.length;
-				for (int i = 0; i < annotationsLevels; i++) {
-					Annotation [] current = annotations[i];
-					int annotationsLength = current == null ? 0 : current.length;
-					for (int j = 0; j < annotationsLength; j++) {
-						if (current[j] == this.currentAnnotation) {
-							this.search = false;
-							for (int k = 0, maxk=typeReference.dimensions; k < maxk; k++) {
-								this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-							}
-							return false;
-						}
-					}
-				}
-				return true;
-			}
-			
-			public boolean visit(ParameterizedQualifiedTypeReference typeReference, BlockScope scope) {
-				if (!this.search) return false;
-				
-				// Example case handled by this block: java.util.List<String>[]@A[]
-				Annotation[][] annotationsOnDimensions = typeReference.annotationsOnDimensions;
-				if (annotationsOnDimensions != null) {
-					for (int i = 0, max = annotationsOnDimensions.length; i < max; i++) {
-						Annotation[] annotations = annotationsOnDimensions[i];
-						if (annotations != null) {
-							for (int j = 0, max2 = annotations.length; j < max2; j++) {
-								Annotation current = annotations[j];
-								if (current == this.currentAnnotation) {
-									this.search = false;
-									// Found it, insert relevant type path elements
-									for (int k = 0, maxk = i; k < maxk; k++) {
-										this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-									}
-									return false;
-								}
-							}
-						}
-					}
-				}
-
-				boolean[] needsInnerEntryInfo = computeInnerEntryInfo(typeReference);
-
-				// Example cases handled by this block:
-				// java.util.@A List<String>[][], com.demo.@A Outer.@B Inner<String>, java.util.Map.@A Entry<String,String>
-				Annotation[][] annotations = typeReference.annotations;
-				if (annotations == null) {
-					annotations = new Annotation[][] { primaryAnnotation };
-				}
-				int annotationsLevels = annotations.length;
-				for (int i = 0; i < annotationsLevels; i++) {
-					Annotation [] current = annotations[i];
-					int annotationsLength = current == null ? 0 : current.length;
-					for (int j = 0; j < annotationsLength; j++) {
-						if (current[j] == this.currentAnnotation) {
-							this.search = false;
-							// Found, insert any relevant type path elements
-							for (int k = 0, maxk = typeReference.dimensions; k < maxk; k++) {
-								this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-							}
-							// Found, insert any relevant type path elements
-							if (needsInnerEntryInfo != null) {
-								for (int k = 0; k <= i; k++) {
-									if (needsInnerEntryInfo[k]) {
-										this.typePathEntries.push(TYPE_PATH_INNER_TYPE);
-									}
-								}
-							}
-							return false;
-						}
-					}
-				}
-				
-				// Example cases handled by this block:
-				// java.util.List<@A String>
-				if (typeReference.dimensions != 0) {
-					for (int k = 0, maxk = typeReference.dimensions; k < maxk; k++) {
-						this.typePathEntries.push(TYPE_PATH_ELEMENT_ARRAY);
-					}
-				}
-				int toPop = 0;
-				for (int i = 0, max = typeReference.typeArguments.length; i < max; i++) {
-					TypeReference[] typeArgumentsForComponent = typeReference.typeArguments[i];
-					if (needsInnerEntryInfo != null && needsInnerEntryInfo[i]) { 
-						this.typePathEntries.push(TYPE_PATH_INNER_TYPE);
-						toPop++;
-					}
-					if (typeArgumentsForComponent != null) {
-						for (int j = 0, max2 = typeArgumentsForComponent.length; j < max2; j++) {
-							this.typePathEntries.push(new int[]{3,j});
-							typeArgumentsForComponent[j].traverse(this,scope);
-							if (!this.search) return false;
-							this.typePathEntries.pop();
-						}
-					}
-				}
-				toPop += typeReference.dimensions;
-				for (int k = 0, maxk = toPop; k < maxk; k++) {
-					this.typePathEntries.pop();
-				}
-				return true;
-			}
-			
-			public boolean visit(Wildcard typeReference, BlockScope scope) {
-				if (!this.search) return false;
-				TypeReference bound = typeReference.bound;
-				this.typePathEntries.push(TYPE_PATH_ANNOTATION_ON_WILDCARD_BOUND);
-				bound.traverse(this, scope);
-				if (!this.search) {
-					return false;
-				}
-				this.typePathEntries.pop();
-				return true;
-			}
-			
-			private boolean[] computeInnerEntryInfo(QualifiedTypeReference typeReference) {
-				ReferenceBinding resolvedType = (ReferenceBinding) 
-						(typeReference.resolvedType instanceof ArrayBinding ? typeReference.resolvedType.leafComponentType() : typeReference.resolvedType);
-				boolean[] needsInnerEntryInfo = null;
-				if (resolvedType != null && resolvedType.isNestedType()) {
-					// Work backwards computing whether a INNER_TYPE entry is required for each level
-					needsInnerEntryInfo = new boolean[typeReference.tokens.length];
-					int counter = needsInnerEntryInfo.length - 1;
-					ReferenceBinding type = resolvedType;//resolvedType.enclosingType();
-					while (type != null) {
-						needsInnerEntryInfo[counter--] = !type.isStatic();
-						type = type.enclosingType();
-					}
-				}
-				return needsInnerEntryInfo;
-			}
-			
-			private int getInnerDepth(ReferenceBinding resolvedType) {
-				int depth = 0;
-				ReferenceBinding type = resolvedType;
-				while (type != null) {
-					depth += (type.isStatic())?0:1;
-					type = type.enclosingType();
-				}
-				return depth;
-			}
-			
-			public boolean visit(QualifiedTypeReference typeReference, BlockScope scope) {
-				if (!this.search) return false;
-				boolean[] needsInnerEntryInfo = computeInnerEntryInfo(typeReference);
-				
-				// Example cases handled by this block:
-				// java.util.@A List, com.demo.@A Outer.@B Inner, java.util.Map.@A Entry
-				Annotation[][] annotations = typeReference.annotations;
-				if (annotations == null) {
-					annotations = new Annotation[][] { primaryAnnotation };
-				}
-				int annotationsLevels = annotations.length;
-				for (int i = 0; i < annotationsLevels; i++) {
-					Annotation [] current = annotations[i];
-					int annotationsLength = current == null ? 0 : current.length;
-					for (int j = 0; j < annotationsLength; j++) {
-						if (current[j] == this.currentAnnotation) {
-							this.search = false;
-							// Found, insert any relevant type path elements
-							if (needsInnerEntryInfo != null) {
-								for (int k = 0; k <= i; k++) {
-									if (needsInnerEntryInfo[k]) {
-										this.typePathEntries.push(TYPE_PATH_INNER_TYPE);
-									}
-								}
-							}
-							return false;
-						}
-					}
-				}
-				return true;
-			}
-			
 			public String toString() {
 				StringBuffer buffer = new StringBuffer();
 				buffer
 					.append("search location for ") //$NON-NLS-1$
-					.append(this.currentAnnotation)
+					.append(this.searchedAnnotation)
 					.append("\ncurrent type_path entries : "); //$NON-NLS-1$
 				for (int i = 0, maxi = this.typePathEntries.size(); i < maxi; i++) {
 					int[] typePathEntry = (int[]) this.typePathEntries.get(i);
@@ -440,24 +221,8 @@
 		}
 		return result;
 	}
-		
-    // jsr 308
-	public static class TypeUseBinding extends ReferenceBinding {
-		private int kind;
-		public TypeUseBinding(int kind) {
-			this.tagBits = 0L;
-			this.kind = kind;
-		}
-		public int kind() {
-			return this.kind;
-		}
-		public boolean hasTypeBit(int bit) {
-			return false;
-		}
-	}
 
 	final static MemberValuePair[] NoValuePairs = new MemberValuePair[0];
-	private static final long TAGBITS_NULLABLE_OR_NONNULL = TagBits.AnnotationNullable|TagBits.AnnotationNonNull;
 
 	static final int[] TYPE_PATH_ELEMENT_ARRAY = new int[]{0,0};
 	static final int[] TYPE_PATH_INNER_TYPE = new int[]{1,0};
@@ -470,7 +235,7 @@
 	/**
 	 *  The representation of this annotation in the type system.
 	 */
-	private AnnotationBinding compilerAnnotation = null;
+	protected AnnotationBinding compilerAnnotation = null;
 
 	public static long getRetentionPolicy(char[] policyName) {
 		if (policyName == null || policyName.length == 0)
@@ -606,6 +371,9 @@
 			case TypeIds.T_JavaLangFunctionalInterface :
 				tagBits |= TagBits.AnnotationFunctionalInterface;
 				break;
+			case TypeIds.T_JavaLangAnnotationRepeatable:
+				tagBits |= TagBits.AnnotationRepeatable;
+				break;
 			case TypeIds.T_JavaLangSuppressWarnings :
 				tagBits |= TagBits.AnnotationSuppressWarnings;
 				break;
@@ -622,12 +390,21 @@
 				tagBits |= TagBits.AnnotationNonNull;
 				break;
 			case TypeIds.T_ConfiguredAnnotationNonNullByDefault :
-				if (valueAttribute != null 
-					&& valueAttribute.value instanceof FalseLiteral) 
-				{
-					// parameter 'false' means: this annotation cancels any defaults
-					tagBits |= TagBits.AnnotationNullUnspecifiedByDefault;
-					break;
+				if (valueAttribute != null) {
+					if (valueAttribute.value instanceof FalseLiteral) {
+						// parameter 'false' means: this annotation cancels any defaults
+						tagBits |= TagBits.AnnotationNullUnspecifiedByDefault;
+						break;
+					} else if (valueAttribute.compilerElementPair != null) {
+						Object value = valueAttribute.compilerElementPair.value;
+						if (value instanceof Object[] && ((Object[])value).length == 0) {
+							// empty parameter means: this annotation cancels any defaults
+							tagBits |= TagBits.AnnotationNullUnspecifiedByDefault;
+							break;
+						} else {
+							scope.problemReporter().nonNullDefaultDetailNotEvaluated(valueAttribute);
+						}
+					}
 				}
 				tagBits |= TagBits.AnnotationNonNullByDefault;
 				break;
@@ -635,6 +412,165 @@
 		return tagBits;
 	}
 
+	static String getRetentionName(long tagBits) {
+		if ((tagBits & TagBits.AnnotationRuntimeRetention) == TagBits.AnnotationRuntimeRetention) {
+			// TagBits.AnnotationRuntimeRetention combines both TagBits.AnnotationClassRetention & TagBits.AnnotationSourceRetention
+			return new String(UPPER_RUNTIME);
+		} else if ((tagBits & TagBits.AnnotationSourceRetention) != 0) {
+			return new String(UPPER_SOURCE);
+		} else {
+			return new String(TypeConstants.UPPER_CLASS);
+		}
+	}
+
+	private static long getAnnotationRetention(ReferenceBinding binding) {
+		long retention = binding.getAnnotationTagBits() & TagBits.AnnotationRetentionMASK;
+		// Retention defaults to CLASS
+		return retention != 0 ? retention : TagBits.AnnotationClassRetention;
+	}
+
+	public void checkRepeatableMetaAnnotation(BlockScope scope) {
+		
+		// `this' is the @Repeatable meta annotation, its recipient is the *repeatable* annotation type - we are at the declaration site, not the repeating use site.
+		
+		ReferenceBinding repeatableAnnotationType = (ReferenceBinding) this.recipient; // know it to be an annotation type. On target miss we don't get here
+		
+		MemberValuePair[] valuePairs = this.memberValuePairs();
+		if (valuePairs == null || valuePairs.length != 1)
+			return;
+		
+		Object value = valuePairs[0].compilerElementPair.value;
+		if (!(value instanceof ReferenceBinding))
+			return; // Has deeper problems, will bark elsewhere.
+		ReferenceBinding containerAnnotationType = (ReferenceBinding) value;
+		if (!containerAnnotationType.isAnnotationType())
+			return; // Has deeper problems, will bark elsewhere.
+		
+		repeatableAnnotationType.setContainerAnnotationType(containerAnnotationType); // For now. May be reset later to PRB in case of problems.
+		checkContainerAnnotationType(valuePairs[0], scope, containerAnnotationType, repeatableAnnotationType, false); // false => not use site, i.e declaration site error reporting requested.
+	}
+
+	public static void checkContainerAnnotationType(ASTNode culpritNode, BlockScope scope, ReferenceBinding containerAnnotationType, ReferenceBinding repeatableAnnotationType, boolean useSite) {
+		MethodBinding[] annotationMethods = containerAnnotationType.methods();
+		boolean sawValue = false;
+		for (int i = 0, length = annotationMethods.length; i < length; ++i) {
+			MethodBinding method = annotationMethods[i];
+			if (CharOperation.equals(method.selector, TypeConstants.VALUE)) {
+				sawValue = true;
+				if (method.returnType.isArrayType() && method.returnType.dimensions() == 1) {
+					ArrayBinding array = (ArrayBinding) method.returnType;
+					if (TypeBinding.equalsEquals(array.elementsType(), repeatableAnnotationType)) continue;
+				}
+				repeatableAnnotationType.tagAsHavingDefectiveContainerType();
+				scope.problemReporter().containerAnnotationTypeHasWrongValueType(culpritNode, containerAnnotationType, repeatableAnnotationType, method.returnType);
+			} else {
+				// Not the value() - must have default (or else isn't suitable as container)
+				if ((method.modifiers & ClassFileConstants.AccAnnotationDefault) == 0) {
+					repeatableAnnotationType.tagAsHavingDefectiveContainerType();
+					scope.problemReporter().containerAnnotationTypeHasNonDefaultMembers(culpritNode, containerAnnotationType, method.selector);
+				}
+			}
+		}
+		if (!sawValue) {
+			repeatableAnnotationType.tagAsHavingDefectiveContainerType();
+			scope.problemReporter().containerAnnotationTypeMustHaveValue(culpritNode, containerAnnotationType);
+		}
+
+		if (useSite)
+			checkContainingAnnotationTargetAtUse((Annotation) culpritNode, scope, containerAnnotationType, repeatableAnnotationType);
+		else 
+			checkContainerAnnotationTypeTarget(culpritNode, scope, containerAnnotationType, repeatableAnnotationType);
+		
+		long annotationTypeBits = getAnnotationRetention(repeatableAnnotationType);
+		long containerTypeBits = getAnnotationRetention(containerAnnotationType); 
+		// Due to clever layout of the bits, we can compare the absolute value directly
+		if (containerTypeBits < annotationTypeBits) {
+			repeatableAnnotationType.tagAsHavingDefectiveContainerType();
+			scope.problemReporter().containerAnnotationTypeHasShorterRetention(culpritNode, repeatableAnnotationType, getRetentionName(annotationTypeBits), containerAnnotationType, getRetentionName(containerTypeBits));
+		}
+		
+		if ((repeatableAnnotationType.getAnnotationTagBits() & TagBits.AnnotationDocumented) != 0 && (containerAnnotationType.getAnnotationTagBits() & TagBits.AnnotationDocumented) == 0) {
+			repeatableAnnotationType.tagAsHavingDefectiveContainerType();
+			scope.problemReporter().repeatableAnnotationTypeIsDocumented(culpritNode, repeatableAnnotationType, containerAnnotationType);
+		}
+		
+		if ((repeatableAnnotationType.getAnnotationTagBits() & TagBits.AnnotationInherited) != 0 && (containerAnnotationType.getAnnotationTagBits() & TagBits.AnnotationInherited) == 0) {
+			repeatableAnnotationType.tagAsHavingDefectiveContainerType();
+			scope.problemReporter().repeatableAnnotationTypeIsInherited(culpritNode, repeatableAnnotationType, containerAnnotationType);
+		}
+	}
+	
+	// This is for error reporting for bad targets at annotation type declaration site (as opposed to the repeat site)
+	private static void checkContainerAnnotationTypeTarget(ASTNode culpritNode, Scope scope, ReferenceBinding containerType, ReferenceBinding repeatableAnnotationType) {
+		long tagBits = repeatableAnnotationType.getAnnotationTagBits();
+		if ((tagBits & TagBits.AnnotationTargetMASK) == 0)
+			tagBits = TagBits.SE7AnnotationTargetMASK; // absence of @Target meta-annotation implies all SE7 targets not all targets.
+		
+		long containerAnnotationTypeTypeTagBits = containerType.getAnnotationTagBits();
+		if ((containerAnnotationTypeTypeTagBits & TagBits.AnnotationTargetMASK) == 0)
+			containerAnnotationTypeTypeTagBits = TagBits.SE7AnnotationTargetMASK;
+
+		final long targets = tagBits & TagBits.AnnotationTargetMASK;
+		final long containerAnnotationTypeTargets = containerAnnotationTypeTypeTagBits & TagBits.AnnotationTargetMASK;
+
+		if ((containerAnnotationTypeTargets & ~targets) != 0) {
+			class MissingTargetBuilder {
+				StringBuffer targetBuffer = new StringBuffer();
+				void check(long targetMask, char[] targetName) {
+					if ((containerAnnotationTypeTargets & targetMask & ~targets) != 0) {
+						add(targetName);
+					}
+				}
+				void checkAnnotationType(char[] targetName) {
+					if ((containerAnnotationTypeTargets & TagBits.AnnotationForAnnotationType) != 0 &&
+							((targets & (TagBits.AnnotationForAnnotationType | TagBits.AnnotationForType))) == 0) {
+						add(targetName);
+					}
+				}
+				private void add(char[] targetName) {
+					if (this.targetBuffer.length() != 0) {
+						this.targetBuffer.append(", "); //$NON-NLS-1$
+					}
+					this.targetBuffer.append(targetName);
+				}
+				public String toString() {
+					return this.targetBuffer.toString();
+				}
+				public boolean hasError() {
+					return this.targetBuffer.length() != 0;
+				}
+			}
+			MissingTargetBuilder builder = new MissingTargetBuilder();
+
+			builder.check(TagBits.AnnotationForType, TypeConstants.TYPE);
+			builder.check(TagBits.AnnotationForField, TypeConstants.UPPER_FIELD);
+			builder.check(TagBits.AnnotationForMethod, TypeConstants.UPPER_METHOD);
+			builder.check(TagBits.AnnotationForParameter, TypeConstants.UPPER_PARAMETER);
+			builder.check(TagBits.AnnotationForConstructor, TypeConstants.UPPER_CONSTRUCTOR);
+			builder.check(TagBits.AnnotationForLocalVariable, TypeConstants.UPPER_LOCAL_VARIABLE);
+			builder.checkAnnotationType(TypeConstants.UPPER_ANNOTATION_TYPE);
+			builder.check(TagBits.AnnotationForPackage, TypeConstants.UPPER_PACKAGE);
+			builder.check(TagBits.AnnotationForTypeParameter, TypeConstants.TYPE_PARAMETER_TARGET);
+			builder.check(TagBits.AnnotationForTypeUse, TypeConstants.TYPE_USE_TARGET);
+			if (builder.hasError()) {
+				repeatableAnnotationType.tagAsHavingDefectiveContainerType();
+				scope.problemReporter().repeatableAnnotationTypeTargetMismatch(culpritNode, repeatableAnnotationType, containerType, builder.toString());
+			}
+		}
+	}
+	
+	// This is for error reporting for bad targets at the repeated annotation use site (as opposed to repeatable annotation type declaration site) - Leads to better message.
+	public static void checkContainingAnnotationTargetAtUse(Annotation repeatingAnnotation, BlockScope scope, TypeBinding containerAnnotationType, TypeBinding repeatingAnnotationType) {
+		// check (meta)target compatibility
+		if (!repeatingAnnotationType.isValidBinding()) {
+			// no need to check annotation usage if missing
+			return;
+		}
+		if (! isAnnotationTargetAllowed(repeatingAnnotation, scope, containerAnnotationType, repeatingAnnotation.recipient.kind())) {
+			scope.problemReporter().disallowedTargetForContainerAnnotation(repeatingAnnotation, containerAnnotationType);
+		}
+	}
+
 	public AnnotationBinding getCompilerAnnotation() {
 		return this.compilerAnnotation;
 	}
@@ -868,15 +804,11 @@
 					case Binding.PACKAGE :
 						((PackageBinding)this.recipient).tagBits |= tagBits;
 						break;
-					case Binding.TYPE_PARAMETER:
-					case Binding.TYPE_USE:
-						ReferenceBinding typeAnnotationRecipient = (ReferenceBinding) this.recipient;
-						typeAnnotationRecipient.tagBits |= tagBits;
-						break;
 					case Binding.TYPE :
 					case Binding.GENERIC_TYPE :
 						SourceTypeBinding sourceType = (SourceTypeBinding) this.recipient;
-						sourceType.tagBits |= tagBits;
+						if ((tagBits & TagBits.AnnotationRepeatable) == 0 || sourceType.isAnnotationType()) // don't set AnnotationRepeatable on non-annotation types.
+							sourceType.tagBits |= tagBits;
 						if ((tagBits & TagBits.AnnotationSuppressWarnings) != 0) {
 							TypeDeclaration typeDeclaration =  sourceType.scope.referenceContext;
 							int start;
@@ -896,9 +828,16 @@
 							AbstractMethodDeclaration methodDeclaration = sourceType.scope.referenceContext.declarationOf(sourceMethod);
 							recordSuppressWarnings(scope, methodDeclaration.declarationSourceStart, methodDeclaration.declarationSourceEnd, scope.compilerOptions().suppressWarnings);
 						}
-						if ((sourceMethod.tagBits & TAGBITS_NULLABLE_OR_NONNULL) == TAGBITS_NULLABLE_OR_NONNULL) {
+						long nullBits = sourceMethod.tagBits & TagBits.AnnotationNullMASK;
+						if (nullBits == TagBits.AnnotationNullMASK) {
 							scope.problemReporter().contradictoryNullAnnotations(this);
-							sourceMethod.tagBits &= ~TAGBITS_NULLABLE_OR_NONNULL; // avoid secondary problems
+							sourceMethod.tagBits &= ~TagBits.AnnotationNullMASK; // avoid secondary problems
+						}
+						if (nullBits != 0 && sourceMethod.isConstructor()) {
+							if (scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8)
+								scope.problemReporter().nullAnnotationUnsupportedLocation(this);
+							// for declaration annotations the inapplicability will be reported below
+							sourceMethod.tagBits &= ~TagBits.AnnotationNullMASK;
 						}
 						break;
 					case Binding.FIELD :
@@ -909,137 +848,180 @@
 							FieldDeclaration fieldDeclaration = sourceType.scope.referenceContext.declarationOf(sourceField);
 							recordSuppressWarnings(scope, fieldDeclaration.declarationSourceStart, fieldDeclaration.declarationSourceEnd, scope.compilerOptions().suppressWarnings);
 						}
-						if ((sourceField.tagBits & TAGBITS_NULLABLE_OR_NONNULL) == TAGBITS_NULLABLE_OR_NONNULL) {
+						// fields don't yet have their type resolved, in 1.8 null annotations
+						// will be transfered from the field to its type during STB.resolveTypeFor().
+						if ((sourceField.tagBits & TagBits.AnnotationNullMASK) == TagBits.AnnotationNullMASK) {
 							scope.problemReporter().contradictoryNullAnnotations(this);
-							sourceField.tagBits &= ~TAGBITS_NULLABLE_OR_NONNULL; // avoid secondary problems
+							sourceField.tagBits &= ~TagBits.AnnotationNullMASK; // avoid secondary problems
 						}
 						break;
 					case Binding.LOCAL :
 						LocalVariableBinding variable = (LocalVariableBinding) this.recipient;
 						variable.tagBits |= tagBits;
+						if ((variable.tagBits & TagBits.AnnotationNullMASK) == TagBits.AnnotationNullMASK) {
+							scope.problemReporter().contradictoryNullAnnotations(this);
+							variable.tagBits &= ~TagBits.AnnotationNullMASK; // avoid secondary problems
+						}
 						if ((tagBits & TagBits.AnnotationSuppressWarnings) != 0) {
-							 LocalDeclaration localDeclaration = variable.declaration;
+							LocalDeclaration localDeclaration = variable.declaration;
 							recordSuppressWarnings(scope, localDeclaration.declarationSourceStart, localDeclaration.declarationSourceEnd, scope.compilerOptions().suppressWarnings);
 						}
-						if ((variable.tagBits & TAGBITS_NULLABLE_OR_NONNULL) == TAGBITS_NULLABLE_OR_NONNULL) {
-							scope.problemReporter().contradictoryNullAnnotations(this);
-							variable.tagBits &= ~TAGBITS_NULLABLE_OR_NONNULL; // avoid secondary problems
-						}
 						break;
 				}
 			}
-			// check (meta)target compatibility
-			checkTargetCompatibility: {
-				if (!annotationType.isValidBinding()) {
-					// no need to check annotation usage if missing
-					break checkTargetCompatibility;
-				}
-
-				long metaTagBits = annotationType.getAnnotationTagBits(); // could be forward reference
-				if ((metaTagBits & TagBits.AnnotationTargetMASK) == 0) {
-					// does not specify any target restriction - all locations supported in Java 7 and before are possible
-					if (kind == Binding.TYPE_PARAMETER || kind == Binding.TYPE_USE) {
-						scope.problemReporter().explitAnnotationTargetRequired(this);
-					}
-					break checkTargetCompatibility;
-				}
-
-				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=391201
-				if ((metaTagBits & TagBits.SE7AnnotationTargetMASK) == 0
-						&& (metaTagBits & (TagBits.AnnotationForTypeUse | TagBits.AnnotationForTypeParameter)) != 0) {
-					if (scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_8) {
-						switch (kind) {
-							case Binding.PACKAGE :
-							case Binding.TYPE :
-							case Binding.GENERIC_TYPE :
-							case Binding.METHOD :
-							case Binding.FIELD :
-							case Binding.LOCAL :
-								scope.problemReporter().invalidUsageOfTypeAnnotations(this);
-						}
-					}
-				}
-				switch (kind) {
-					case Binding.PACKAGE :
-						if ((metaTagBits & TagBits.AnnotationForPackage) != 0)
-							break checkTargetCompatibility;
-						break;
-					case Binding.TYPE_USE :
-						if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
-							// jsr 308
-							break checkTargetCompatibility;
-						}
-						break;
-					case Binding.TYPE :
-					case Binding.GENERIC_TYPE :
-						if (((ReferenceBinding)this.recipient).isAnnotationType()) {
-							if ((metaTagBits & (TagBits.AnnotationForAnnotationType | TagBits.AnnotationForType)) != 0)
-							break checkTargetCompatibility;
-						} else if ((metaTagBits & (TagBits.AnnotationForType | TagBits.AnnotationForTypeUse)) != 0) {
-							break checkTargetCompatibility;
-						} else if ((metaTagBits & TagBits.AnnotationForPackage) != 0) {
-							if (CharOperation.equals(((ReferenceBinding)this.recipient).sourceName, TypeConstants.PACKAGE_INFO_NAME))
-								break checkTargetCompatibility;
-						}
-						break;
-					case Binding.METHOD :
-						MethodBinding methodBinding = (MethodBinding) this.recipient;
-						if (methodBinding.isConstructor()) {
-							if ((metaTagBits & (TagBits.AnnotationForConstructor | TagBits.AnnotationForTypeUse)) != 0)
-								break checkTargetCompatibility;
-						} else if ((metaTagBits & TagBits.AnnotationForMethod) != 0) {
-							break checkTargetCompatibility;
-						} else if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
-							SourceTypeBinding sourceType = (SourceTypeBinding) methodBinding.declaringClass;
-							MethodDeclaration methodDecl = (MethodDeclaration) sourceType.scope.referenceContext.declarationOf(methodBinding);
-							if (isTypeUseCompatible(methodDecl.returnType, scope)) {
-								break checkTargetCompatibility;
-							}
-						}
-						break;
-					case Binding.FIELD :
-						if ((metaTagBits & TagBits.AnnotationForField) != 0) {
-							break checkTargetCompatibility;
-						} else if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
-							FieldBinding sourceField = (FieldBinding) this.recipient;
-							SourceTypeBinding sourceType = (SourceTypeBinding) sourceField.declaringClass;
-							FieldDeclaration fieldDeclaration = sourceType.scope.referenceContext.declarationOf(sourceField);
-							if (isTypeUseCompatible(fieldDeclaration.type, scope)) {
-								break checkTargetCompatibility;
-							}
-						}
-						break;
-					case Binding.LOCAL :
-						LocalVariableBinding localVariableBinding = (LocalVariableBinding)this.recipient;
-						if ((localVariableBinding.tagBits & TagBits.IsArgument) != 0) {
-							if ((metaTagBits & TagBits.AnnotationForParameter) != 0) {
-								break checkTargetCompatibility;
-							} else if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
-								if (isTypeUseCompatible(localVariableBinding.declaration.type, scope)) {
-									break checkTargetCompatibility;
-								}
-							}
-						} else if ((annotationType.tagBits & TagBits.AnnotationForLocalVariable) != 0) {
-							break checkTargetCompatibility;
-						} else if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
-							if (isTypeUseCompatible(localVariableBinding.declaration.type, scope)) {
-								break checkTargetCompatibility;
-							}
-						}
-						break;
-					case Binding.TYPE_PARAMETER : // jsr308
-						// https://bugs.eclipse.org/bugs/show_bug.cgi?id=391196
-						if ((metaTagBits & (TagBits.AnnotationForTypeParameter | TagBits.AnnotationForTypeUse)) != 0) {
-							break checkTargetCompatibility;
-						}
-					}
-				scope.problemReporter().disallowedTargetForAnnotation(this);
-			}
+			checkAnnotationTarget(this, scope, annotationType, kind);
 		}
 		return this.resolvedType;
 	}
-	private boolean isTypeUseCompatible(TypeReference reference, Scope scope) {
-		if (!(reference instanceof SingleTypeReference)) {
+
+	static boolean isAnnotationTargetAllowed(Annotation annotation, BlockScope scope, TypeBinding annotationType, int kind) {
+		long metaTagBits = annotationType.getAnnotationTagBits(); // could be forward reference
+		if ((metaTagBits & TagBits.AnnotationTargetMASK) == 0) {
+			// does not specify any target restriction - all locations supported in Java 7 and before are possible
+			if (kind == Binding.TYPE_PARAMETER || kind == Binding.TYPE_USE) {
+				scope.problemReporter().explitAnnotationTargetRequired(annotation);
+			}
+			return true;
+		}
+
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=391201
+		if ((metaTagBits & TagBits.SE7AnnotationTargetMASK) == 0
+				&& (metaTagBits & (TagBits.AnnotationForTypeUse | TagBits.AnnotationForTypeParameter)) != 0) {
+			if (scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_8) {
+				switch (kind) {
+					case Binding.PACKAGE :
+					case Binding.TYPE :
+					case Binding.GENERIC_TYPE :
+					case Binding.METHOD :
+					case Binding.FIELD :
+					case Binding.LOCAL :
+						scope.problemReporter().invalidUsageOfTypeAnnotations(annotation);
+				}
+			}
+		}
+		switch (kind) {
+			case Binding.PACKAGE :
+				if ((metaTagBits & TagBits.AnnotationForPackage) != 0)
+					return true;
+				break;
+			case Binding.TYPE_USE :
+				if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
+					// jsr 308
+					return true;
+				}
+				if (scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_8) {
+					// already reported as syntax error; don't report secondary problems
+					return true;
+				}
+				break;
+			case Binding.TYPE :
+			case Binding.GENERIC_TYPE :
+				if (((ReferenceBinding)annotation.recipient).isAnnotationType()) {
+					if ((metaTagBits & (TagBits.AnnotationForAnnotationType | TagBits.AnnotationForType | TagBits.AnnotationForTypeUse)) != 0)
+					return true;
+				} else if ((metaTagBits & (TagBits.AnnotationForType | TagBits.AnnotationForTypeUse)) != 0) {
+					return true;
+				} else if ((metaTagBits & TagBits.AnnotationForPackage) != 0) {
+					if (CharOperation.equals(((ReferenceBinding) annotation.recipient).sourceName, TypeConstants.PACKAGE_INFO_NAME))
+						return true;
+				}
+				break;
+			case Binding.METHOD :
+				MethodBinding methodBinding = (MethodBinding) annotation.recipient;
+				if (methodBinding.isConstructor()) {
+					if ((metaTagBits & (TagBits.AnnotationForConstructor | TagBits.AnnotationForTypeUse)) != 0)
+						return true;
+				} else if ((metaTagBits & TagBits.AnnotationForMethod) != 0) {
+					return true;
+				} else if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
+					SourceTypeBinding sourceType = (SourceTypeBinding) methodBinding.declaringClass;
+					MethodDeclaration methodDecl = (MethodDeclaration) sourceType.scope.referenceContext.declarationOf(methodBinding);
+					if (isTypeUseCompatible(methodDecl.returnType, scope)) {
+						return true;
+					}
+				}
+				break;
+			case Binding.FIELD :
+				if ((metaTagBits & TagBits.AnnotationForField) != 0) {
+					return true;
+				} else if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
+					FieldBinding sourceField = (FieldBinding) annotation.recipient;
+					SourceTypeBinding sourceType = (SourceTypeBinding) sourceField.declaringClass;
+					FieldDeclaration fieldDeclaration = sourceType.scope.referenceContext.declarationOf(sourceField);
+					if (isTypeUseCompatible(fieldDeclaration.type, scope)) {
+						return true;
+					}
+				}
+				break;
+			case Binding.LOCAL :
+				LocalVariableBinding localVariableBinding = (LocalVariableBinding) annotation.recipient;
+				if ((localVariableBinding.tagBits & TagBits.IsArgument) != 0) {
+					if ((metaTagBits & TagBits.AnnotationForParameter) != 0) {
+						return true;
+					} else if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
+						if (isTypeUseCompatible(localVariableBinding.declaration.type, scope)) {
+							return true;
+						}
+					}
+				} else if ((annotationType.tagBits & TagBits.AnnotationForLocalVariable) != 0) {
+					return true;
+				} else if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0) {
+					if (isTypeUseCompatible(localVariableBinding.declaration.type, scope)) {
+						return true;
+					}
+				}
+				break;
+			case Binding.TYPE_PARAMETER : // jsr308
+				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=391196
+				if ((metaTagBits & (TagBits.AnnotationForTypeParameter | TagBits.AnnotationForTypeUse)) != 0) {
+					return true;
+				}
+		}
+		return false;
+	}
+
+	static void checkAnnotationTarget(Annotation annotation, BlockScope scope, ReferenceBinding annotationType, int kind) {
+		// check (meta)target compatibility
+		if (!annotationType.isValidBinding()) {
+			// no need to check annotation usage if missing
+			return;
+		}
+		if (! isAnnotationTargetAllowed(annotation, scope, annotationType, kind)) {
+			scope.problemReporter().disallowedTargetForAnnotation(annotation);
+		}
+	}
+
+	/**
+	 * Check to see if a repeating annotation is in fact of a container annotation type for an annotation which is also present at the same target.
+	 * @param scope The scope (for error reporting)
+	 * @param repeatedAnnotationType Type of annotation which has been repeated (to check for possibly being a container for a repeatable annotation)
+	 * @param sourceAnnotations The annotations to check
+	 */
+	public static void checkForInstancesOfRepeatableWithRepeatingContainerAnnotation(BlockScope scope, ReferenceBinding repeatedAnnotationType, Annotation[] sourceAnnotations) {
+		// Fail fast if the repeating annotation type can't be a container, anyway
+		MethodBinding[] valueMethods = repeatedAnnotationType.getMethods(TypeConstants.VALUE);
+		if (valueMethods.length != 1) return; // No violations possible
+		
+		TypeBinding methodReturnType = valueMethods[0].returnType;
+		// value must be an array 
+		if (! methodReturnType.isArrayType() || methodReturnType.dimensions() != 1) return;
+		
+		ArrayBinding array = (ArrayBinding) methodReturnType;
+		TypeBinding elementsType = array.elementsType();
+		if (! elementsType.isRepeatableAnnotationType()) return; // Can't be a problem, then
+		
+		for (int i= 0; i < sourceAnnotations.length; ++i) {
+			Annotation annotation = sourceAnnotations[i];
+			if (TypeBinding.equalsEquals(elementsType, annotation.resolvedType)) {
+				scope.problemReporter().repeatableAnnotationWithRepeatingContainer(annotation, repeatedAnnotationType);
+				return; // One is enough for this annotation type
+			}
+		}
+	}
+
+	// Check and answer if an attempt to annotate a package is being made. Error should be reported by caller.
+	public static boolean isTypeUseCompatible(TypeReference reference, Scope scope) {
+		if (reference != null && !(reference instanceof SingleTypeReference)) {
 			Binding binding = scope.getPackage(reference.getTypeName());
 			// In case of ProblemReferenceBinding, don't report additional error
 			if (binding instanceof PackageBinding) {
@@ -1048,8 +1030,50 @@
 		}
 		return true;
 	}
+	
+	// Complain if an attempt to annotate the enclosing type of a static member type is being made.
+	public static void isTypeUseCompatible(TypeReference reference, Scope scope, Annotation[] annotations) {
+		if (annotations == null || reference == null || reference.getAnnotatableLevels() == 1)
+			return;
+		if (scope.environment().globalOptions.sourceLevel < ClassFileConstants.JDK1_8)
+			return;
+
+		TypeBinding resolvedType = reference.resolvedType == null ? null : reference.resolvedType.leafComponentType();
+		if (resolvedType == null || !resolvedType.isNestedType())
+			return;
+
+		nextAnnotation:
+			for (int i = 0, annotationsLength = annotations.length; i < annotationsLength; i++) {
+				Annotation annotation = annotations[i];
+				long metaTagBits = annotation.resolvedType.getAnnotationTagBits();
+				if ((metaTagBits & TagBits.AnnotationForTypeUse) != 0 && (metaTagBits & TagBits.SE7AnnotationTargetMASK) == 0) {
+					ReferenceBinding currentType = (ReferenceBinding) resolvedType;
+					while (currentType.isNestedType()) {
+						if (currentType.isStatic()) {
+							QualifiedTypeReference.rejectAnnotationsOnStaticMemberQualififer(scope, currentType, new Annotation [] { annotation });
+							continue nextAnnotation;
+						} else {
+							int id = annotation.resolvedType.id;
+							if (id == TypeIds.T_ConfiguredAnnotationNonNull || id == TypeIds.T_ConfiguredAnnotationNullable) {
+								scope.problemReporter().nullAnnotationUnsupportedLocation(annotation);
+								continue nextAnnotation;
+							}
+						}
+						currentType = currentType.enclosingType();
+					}
+				}
+			}
+	}
 
 	public abstract void traverse(ASTVisitor visitor, BlockScope scope);
 
 	public abstract void traverse(ASTVisitor visitor, ClassScope scope);
+
+	public Annotation getPersistibleAnnotation() {
+		return this.persistibleAnnotation;      // will be this for non-repeating annotation, the container for the first of the repeating ones and null for the followers.
+	}
+	
+	public void setPersistibleAnnotation(ContainerAnnotation container) {
+		this.persistibleAnnotation = container; // will be a legitimate container for the first of the repeating ones and null for the followers.
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AnnotationMethodDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AnnotationMethodDeclaration.java
index 080f288..9d135f4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AnnotationMethodDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/AnnotationMethodDeclaration.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Argument.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Argument.java
index f808e39..941eaf2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Argument.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Argument.java
@@ -1,19 +1,19 @@
 /*******************************************************************************
- * 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
  *								bug 186342 - [compiler][null] Using annotations for null checking
  *								bug 365519 - editorial cleanup after bug 186342 and bug 365387
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 409246 - [1.8][compiler] Type annotations on catch parameters not handled properly
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -52,10 +52,10 @@
 		this.bits |= (IsLocalDeclarationReachable | IsArgument | IsTypeElided);
 	}
 
-	public void createBinding(MethodScope scope, TypeBinding typeBinding) {
+	public TypeBinding createBinding(MethodScope scope, TypeBinding typeBinding) {
 		if (this.binding == null) {
 			// for default constructors and fake implementation of abstract methods 
-			this.binding = new LocalVariableBinding(this, typeBinding, this.modifiers, true /*isArgument*/);
+			this.binding = new LocalVariableBinding(this, typeBinding, this.modifiers, scope);
 		} else if (!this.binding.type.isValidBinding()) {
 			AbstractMethodDeclaration methodDecl = scope.referenceMethod();
 			if (methodDecl != null) {
@@ -65,12 +65,19 @@
 				}
 			}
 		}
-		resolveAnnotations(scope, this.annotations, this.binding);
+		if ((this.binding.tagBits & TagBits.AnnotationResolved) == 0) {
+			resolveAnnotations(scope, this.annotations, this.binding, true);
+			if (scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8) {
+				Annotation.isTypeUseCompatible(this.type, scope, this.annotations);
+				scope.validateNullAnnotation(this.binding.tagBits, this.type, this.annotations);
+			}
+		}
 		this.binding.declaration = this;
+		return this.binding.type; // might have been updated during resolveAnnotations (for typeAnnotations)
 	}
 
-	public void bind(MethodScope scope, TypeBinding typeBinding, boolean used) {
-		createBinding(scope, typeBinding); // basically a no-op if createBinding() was called before
+	public TypeBinding bind(MethodScope scope, TypeBinding typeBinding, boolean used) {
+		TypeBinding newTypeBinding = createBinding(scope, typeBinding); // basically a no-op if createBinding() was called before
 
 		// record the resolved type into the type reference
 		Binding existingVariable = scope.getBinding(this.name, Binding.VARIABLE, this, false /*do not resolve hidden field*/);
@@ -97,6 +104,7 @@
 		}
 		scope.addLocalVariable(this.binding);
 		this.binding.useFlag = used ? LocalVariableBinding.USED : LocalVariableBinding.UNUSED;
+		return newTypeBinding;
 	}
 
 	/**
@@ -186,7 +194,11 @@
 		} else {
 			this.binding = new CatchParameterBinding(this, exceptionType, this.modifiers, false); // argument decl, but local var  (where isArgument = false)
 		}
-		resolveAnnotations(scope, this.annotations, this.binding);
+		resolveAnnotations(scope, this.annotations, this.binding, true);
+		Annotation.isTypeUseCompatible(this.type, scope, this.annotations);
+		if (this.type.resolvedType != null && this.type.resolvedType.hasNullTypeAnnotations()) {
+			scope.problemReporter().nullAnnotationUnsupportedLocation(this.type);
+		}
 
 		scope.addLocalVariable(this.binding);
 		this.binding.setConstant(Constant.NotAConstant);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java
index d9c6e7d..3983caa 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java
@@ -1,32 +1,34 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     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
+ *								Bug 417758 - [1.8][null] Null safety compromise during array creation.
+ *								Bug 427163 - [1.8][null] bogus error "Contradictory null specification" on varags
  *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
- *
+ *                          Bug 409247 - [1.8][compiler] Verify error with code allocating multidimensional array
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import java.util.List;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.*;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationCollector;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.*;
 
+@SuppressWarnings({"rawtypes"})
 public class ArrayAllocationExpression extends Expression {
 
 	public TypeReference type;
@@ -61,7 +63,7 @@
 		int pc = codeStream.position;
 
 		if (this.initializer != null) {
-			this.initializer.generateCode(this.type, this.annotationsOnDimensions, currentScope, codeStream, valueRequired);
+			this.initializer.generateCode(this.type, this, currentScope, codeStream, valueRequired);
 			return;
 		}
 
@@ -76,10 +78,10 @@
 		// array allocation
 		if (explicitDimCount == 1) {
 			// Mono-dimensional array
-			codeStream.newArray(this.type, this.annotationsOnDimensions, (ArrayBinding)this.resolvedType);
+			codeStream.newArray(this.type, this, (ArrayBinding)this.resolvedType);
 		} else {
 			// Multi-dimensional array
-			codeStream.multianewarray(this.type, this.resolvedType, this.dimensions.length, this.annotationsOnDimensions);
+			codeStream.multianewarray(this.type, this.resolvedType, explicitDimCount, this);
 		}
 		if (valueRequired) {
 			codeStream.generateImplicitConversion(this.implicitConversion);
@@ -168,8 +170,26 @@
 			if (this.dimensions.length > 255) {
 				scope.problemReporter().tooManyDimensions(this);
 			}
+			if (this.type.annotations != null
+					&& (referenceType.tagBits & TagBits.AnnotationNullMASK) == TagBits.AnnotationNullMASK)
+			{
+				scope.problemReporter().contradictoryNullAnnotations(this.type.annotations[this.type.annotations.length-1]);
+			}
 			this.resolvedType = scope.createArrayType(referenceType, this.dimensions.length);
 
+			if (this.annotationsOnDimensions != null) {
+				this.resolvedType = resolveAnnotations(scope, this.annotationsOnDimensions, this.resolvedType);
+				long[] nullTagBitsPerDimension = ((ArrayBinding)this.resolvedType).nullTagBitsPerDimension;
+				if (nullTagBitsPerDimension != null) {
+					for (int i = 0; i < this.annotationsOnDimensions.length; i++) {
+						if ((nullTagBitsPerDimension[i] & TagBits.AnnotationNullMASK) == TagBits.AnnotationNullMASK) {
+							scope.problemReporter().contradictoryNullAnnotations(this.annotationsOnDimensions[i]);
+							nullTagBitsPerDimension[i] = 0;
+						}
+					}
+				}
+			}
+
 			// check the initializer
 			if (this.initializer != null) {
 				if ((this.initializer.resolveTypeExpecting(scope, this.resolvedType)) != null)
@@ -179,12 +199,6 @@
 				return null;
 			}
 		}
-		if (this.annotationsOnDimensions != null) {
-			for (int i = 0, max = this.annotationsOnDimensions.length; i < max; i++) {
-				Annotation[] annotations = this.annotationsOnDimensions[i];
-				resolveAnnotations(scope, annotations, new Annotation.TypeUseBinding(Binding.TYPE_USE));
-			}
-		}
 		return this.resolvedType;
 	}
 
@@ -194,6 +208,11 @@
 			int dimensionsLength = this.dimensions.length;
 			this.type.traverse(visitor, scope);
 			for (int i = 0; i < dimensionsLength; i++) {
+				Annotation [] annotations = this.annotationsOnDimensions == null ? null : this.annotationsOnDimensions[i];
+				int annotationsLength = annotations == null ? 0 : annotations.length;
+				for (int j = 0; j < annotationsLength; j++) {
+					annotations[j].traverse(visitor, scope);
+				}
 				if (this.dimensions[i] != null)
 					this.dimensions[i].traverse(visitor, scope);
 			}
@@ -202,4 +221,23 @@
 		}
 		visitor.endVisit(this, scope);
 	}
+
+	public void getAllAnnotationContexts(int targetType, int info, List allTypeAnnotationContexts) {
+		AnnotationCollector collector = new AnnotationCollector(this, targetType, info, allTypeAnnotationContexts);
+		this.type.traverse(collector, (BlockScope) null);
+		if (this.annotationsOnDimensions != null)  {
+			int dimensionsLength = this.dimensions.length;
+			for (int i = 0; i < dimensionsLength; i++) {
+				Annotation [] annotations = this.annotationsOnDimensions[i];
+				int annotationsLength = annotations == null ? 0 : annotations.length;
+				for (int j = 0; j < annotationsLength; j++) {
+					annotations[j].traverse(collector, (BlockScope) null);
+				}
+			}
+		}
+	}
+
+	public Annotation[][] getAnnotationsOnDimensions() {
+		return this.annotationsOnDimensions;
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.java
index 17385e9..1637f89 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.java
@@ -1,28 +1,30 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for 
  *								bug 368546 - [compiler][resource] Avoid remaining false positives found when compiling the Eclipse SDK
  *								bug 370639 - [compiler][resource] restore the default for resource leak warnings
  *								bug 388996 - [compiler][resource] Incorrect 'potential resource leak'
+ *								Bug 417758 - [1.8][null] Null safety compromise during array creation.
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.ASSIGNMENT_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.*;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.*;
 
@@ -42,13 +44,19 @@
 	public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo) {
 
 		if (this.expressions != null) {
-			boolean analyseResources = currentScope.compilerOptions().analyseResourceLeaks;
+			CompilerOptions compilerOptions = currentScope.compilerOptions();
+			boolean analyseResources = compilerOptions.analyseResourceLeaks;
+			boolean evalNullTypeAnnotations = compilerOptions.sourceLevel >= ClassFileConstants.JDK1_8 
+												&& compilerOptions.isAnnotationBasedNullAnalysisEnabled;
 			for (int i = 0, max = this.expressions.length; i < max; i++) {
 				flowInfo = this.expressions[i].analyseCode(currentScope, flowContext, flowInfo).unconditionalInits();
 
 				if (analyseResources && FakedTrackingVariable.isAnyCloseable(this.expressions[i].resolvedType)) {
 					flowInfo = FakedTrackingVariable.markPassedToOutside(currentScope, this.expressions[i], flowInfo, flowContext, false);
 				}
+				if (evalNullTypeAnnotations) {
+					checkAgainstNullTypeAnnotation(currentScope, this.binding.elementsType(), this.expressions[i], flowContext, flowInfo);
+				}
 			}
 		}
 		return flowInfo;
@@ -61,13 +69,13 @@
 	/**
 	 * Code generation for a array initializer
 	 */
-	public void generateCode(TypeReference typeReference, Annotation[][] annotationsOnDimensions, BlockScope currentScope, CodeStream codeStream, boolean valueRequired) {
+	public void generateCode(TypeReference typeReference, ArrayAllocationExpression allocationExpression, BlockScope currentScope, CodeStream codeStream, boolean valueRequired) {
 
 		// Flatten the values and compute the dimensions, by iterating in depth into nested array initializers
 		int pc = codeStream.position;
 		int expressionLength = (this.expressions == null) ? 0: this.expressions.length;
 		codeStream.generateInlinedValue(expressionLength);
-		codeStream.newArray(typeReference, annotationsOnDimensions, this.binding);
+		codeStream.newArray(typeReference, allocationExpression, this.binding);
 		if (this.expressions != null) {
 			// binding is an ArrayType, so I can just deal with the dimension
 			int elementsTypeID = this.binding.dimensions > 1 ? -1 : this.binding.leafComponentType.id;
@@ -181,7 +189,7 @@
 					continue;
 
 				// Compile-time conversion required?
-				if (elementType != expressionType) // must call before computeConversion() and typeMismatchError()
+				if (TypeBinding.notEquals(elementType, expressionType)) // must call before computeConversion() and typeMismatchError()
 					scope.compilationUnitScope().recordTypeConversion(elementType, expressionType);
 
 				if (expression.isConstantValueOfTypeAssignableToType(expressionType, elementType) 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.java
index d5b7a18..9f990ce 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -21,7 +17,8 @@
 
 public class ArrayQualifiedTypeReference extends QualifiedTypeReference {
 	int dimensions;
-	Annotation[][] annotationsOnDimensions;  // jsr308 style type annotations on dimensions
+	private Annotation[][] annotationsOnDimensions;  // jsr308 style type annotations on dimensions
+	public int extendedDimensions;
 
 	public ArrayQualifiedTypeReference(char[][] sources , int dim, long[] poss) {
 
@@ -42,8 +39,21 @@
 		return this.dimensions;
 	}
 	
-	public Annotation[][] getAnnotationsOnDimensions() {
-		return this.annotationsOnDimensions;
+	public int extraDimensions() {
+		return this.extendedDimensions;
+	}
+
+	/**
+	 @see org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference#getAnnotationsOnDimensions(boolean)
+	*/
+	public Annotation[][] getAnnotationsOnDimensions(boolean useSourceOrder) {
+		if (useSourceOrder || this.annotationsOnDimensions == null || this.annotationsOnDimensions.length == 0 || this.extendedDimensions == 0 || this.extendedDimensions == this.dimensions)
+			return this.annotationsOnDimensions;
+		Annotation [][] externalAnnotations = new Annotation[this.dimensions][];
+		final int baseDimensions = this.dimensions - this.extendedDimensions;
+		System.arraycopy(this.annotationsOnDimensions, baseDimensions, externalAnnotations, 0, this.extendedDimensions);
+		System.arraycopy(this.annotationsOnDimensions, 0, externalAnnotations, this.extendedDimensions, baseDimensions);
+		return externalAnnotations;
 	}
 	
 	public void setAnnotationsOnDimensions(Annotation [][] annotationsOnDimensions) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayReference.java
index 8de7b97..8ffbec5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayReference.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.java
index 46373cf..ae1bdc2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -23,8 +19,9 @@
 
 public class ArrayTypeReference extends SingleTypeReference {
 	public int dimensions;
-	public Annotation[][] annotationsOnDimensions; // jsr308 style type annotations on dimensions.
+	private Annotation[][] annotationsOnDimensions; // jsr308 style type annotations on dimensions.
 	public int originalSourceEnd;
+	public int extendedDimensions;
 
 	/**
 	 * ArrayTypeReference constructor comment.
@@ -53,9 +50,23 @@
 		return this.dimensions;
 	}
 	
-	public Annotation[][] getAnnotationsOnDimensions() {
-		return this.annotationsOnDimensions;
+	public int extraDimensions() {
+		return this.extendedDimensions;
 	}
+
+	/**
+	 @see org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference#getAnnotationsOnDimensions(boolean)
+	*/
+	public Annotation[][] getAnnotationsOnDimensions(boolean useSourceOrder) {
+		if (useSourceOrder || this.annotationsOnDimensions == null || this.annotationsOnDimensions.length == 0 || this.extendedDimensions == 0 || this.extendedDimensions == this.dimensions)
+			return this.annotationsOnDimensions;
+		Annotation [][] externalAnnotations = new Annotation[this.dimensions][];
+		final int baseDimensions = this.dimensions - this.extendedDimensions;
+		System.arraycopy(this.annotationsOnDimensions, baseDimensions, externalAnnotations, 0, this.extendedDimensions);
+		System.arraycopy(this.annotationsOnDimensions, 0, externalAnnotations, this.extendedDimensions, baseDimensions);
+		return externalAnnotations;
+	}
+	
 	public void setAnnotationsOnDimensions(Annotation [][] annotationsOnDimensions) {
 		this.annotationsOnDimensions = annotationsOnDimensions;
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Assignment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Assignment.java
index 80e0ddc..0ed7fcb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Assignment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Assignment.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -29,9 +25,13 @@
  *							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
+ *							Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *							Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.ASSIGNMENT_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.*;
@@ -94,7 +94,7 @@
 	if (compilerOptions.isAnnotationBasedNullAnalysisEnabled) {
 		VariableBinding var = this.lhs.nullAnnotatedVariableBinding(compilerOptions.sourceLevel >= ClassFileConstants.JDK1_8);
 		if (var != null) {
-			nullStatus = checkAssignmentAgainstNullAnnotation(currentScope, flowContext, var, nullStatus, this.expression, this.expression.resolvedType);
+			nullStatus = NullAnnotationMatching.checkAssignment(currentScope, flowContext, var, nullStatus, this.expression, this.expression.resolvedType);
 			if (nullStatus == FlowInfo.NON_NULL
 					&& var instanceof FieldBinding
 					&& this.lhs instanceof Reference
@@ -196,7 +196,7 @@
 		this.resolvedType = lhsType.capture(scope, this.sourceEnd);
 	}
 	LocalVariableBinding localVariableBinding = this.lhs.localVariableBinding();
-	if (localVariableBinding != null && localVariableBinding.isCatchParameter()) { 
+	if (localVariableBinding != null && (localVariableBinding.isCatchParameter() || localVariableBinding.isParameter())) { 
 		localVariableBinding.tagBits &= ~TagBits.IsEffectivelyFinal;  // as it is already definitely assigned, we can conclude already. Also note: catch parameter cannot be compound assigned.
 	}
 	TypeBinding rhsType = this.expression.resolveType(scope);
@@ -211,7 +211,7 @@
 
 	// Compile-time conversion of base-types : implicit narrowing integer into byte/short/character
 	// may require to widen the rhs expression at runtime
-	if (lhsType != rhsType) { // must call before computeConversion() and typeMismatchError()
+	if (TypeBinding.notEquals(lhsType, rhsType)) { // must call before computeConversion() and typeMismatchError()
 		scope.compilationUnitScope().recordTypeConversion(lhsType, rhsType);
 	}
 	if (this.expression.isConstantValueOfTypeAssignableToType(rhsType, lhsType)
@@ -245,8 +245,8 @@
 	TypeBinding lhsType = this.resolvedType;
 	TypeBinding rhsType = this.expression.resolvedType;
 	// signal possible accidental boolean assignment (instead of using '==' operator)
-	if (expectedType == TypeBinding.BOOLEAN
-			&& lhsType == TypeBinding.BOOLEAN
+	if (TypeBinding.equalsEquals(expectedType, TypeBinding.BOOLEAN)
+			&& TypeBinding.equalsEquals(lhsType, TypeBinding.BOOLEAN)
 			&& (this.lhs.bits & IsStrictlyAssigned) != 0) {
 		scope.problemReporter().possibleAccidentalBooleanAssignment(this);
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java
index 63697e3..f5e05bf 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java
@@ -1668,13 +1668,13 @@
 	if (((this.bits & ASTNode.OperatorMASK) >> ASTNode.OperatorSHIFT) == OperatorIds.PLUS) {
 		if (leftTypeID == TypeIds.T_JavaLangString) {
 			this.left.computeConversion(scope, leftType, leftType);
-			if (rightType.isArrayType() && ((ArrayBinding) rightType).elementsType() == TypeBinding.CHAR) {
+			if (rightType.isArrayType() && TypeBinding.equalsEquals(((ArrayBinding) rightType).elementsType(), TypeBinding.CHAR)) {
 				scope.problemReporter().signalNoImplicitStringConversionForCharArrayExpression(this.right);
 			}
 		}
 		if (rightTypeID == TypeIds.T_JavaLangString) {
 			this.right.computeConversion(scope, rightType, rightType);
-			if (leftType.isArrayType() && ((ArrayBinding) leftType).elementsType() == TypeBinding.CHAR) {
+			if (leftType.isArrayType() && TypeBinding.equalsEquals(((ArrayBinding) leftType).elementsType(), TypeBinding.CHAR)) {
 				scope.problemReporter().signalNoImplicitStringConversionForCharArrayExpression(this.left);
 			}
 		}
@@ -1835,13 +1835,13 @@
 	if (((this.bits & ASTNode.OperatorMASK) >> ASTNode.OperatorSHIFT) == OperatorIds.PLUS) {
 		if (leftTypeID == TypeIds.T_JavaLangString) {
 			this.left.computeConversion(scope, leftType, leftType);
-			if (rightType.isArrayType() && ((ArrayBinding) rightType).elementsType() == TypeBinding.CHAR) {
+			if (rightType.isArrayType() && TypeBinding.equalsEquals(((ArrayBinding) rightType).elementsType(), TypeBinding.CHAR)) {
 				scope.problemReporter().signalNoImplicitStringConversionForCharArrayExpression(this.right);
 			}
 		}
 		if (rightTypeID == TypeIds.T_JavaLangString) {
 			this.right.computeConversion(scope, rightType, rightType);
-			if (leftType.isArrayType() && ((ArrayBinding) leftType).elementsType() == TypeBinding.CHAR) {
+			if (leftType.isArrayType() && TypeBinding.equalsEquals(((ArrayBinding) leftType).elementsType(), TypeBinding.CHAR)) {
 				scope.problemReporter().signalNoImplicitStringConversionForCharArrayExpression(this.left);
 			}
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Block.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Block.java
index 88ef454..bc806df 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Block.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Block.java
@@ -27,7 +27,12 @@
 	public int explicitDeclarations;
 	// the number of explicit declaration , used to create scope
 	public BlockScope scope;
+	public boolean lambdaBody;
 
+public Block(int explicitDeclarations, boolean lambdaBody) {
+	this.explicitDeclarations = explicitDeclarations;
+	this.lambdaBody = lambdaBody;
+}
 public Block(int explicitDeclarations) {
 	this.explicitDeclarations = explicitDeclarations;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
index 7126b77..3fa4ee9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -19,9 +15,18 @@
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
  *								bug 401017 - [compiler][null] casted reference to @Nullable field lacks a warning
  *								bug 400761 - [compiler][null] null may be return as boolean without a diagnostic
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 416307 - [1.8][compiler][null] subclass with type parameter substitution confuses null checking
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 415541 - [1.8][compiler] Type annotations in the body of static initializer get dropped
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.CASTING_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.CodeStream;
@@ -32,6 +37,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
@@ -73,7 +79,8 @@
  * Complain if assigned expression is cast, but not actually used as such, e.g. Object o = (List) object;
  */
 public static void checkNeedForAssignedCast(BlockScope scope, TypeBinding expectedType, CastExpression rhs) {
-	if (scope.compilerOptions().getSeverity(CompilerOptions.UnnecessaryTypeCheck) == ProblemSeverities.Ignore) return;
+	CompilerOptions compilerOptions = scope.compilerOptions();
+	if (compilerOptions.getSeverity(CompilerOptions.UnnecessaryTypeCheck) == ProblemSeverities.Ignore) return;
 
 	TypeBinding castedExpressionType = rhs.expression.resolvedType;
 	//	int i = (byte) n; // cast still had side effect
@@ -81,6 +88,11 @@
 	if (castedExpressionType == null || rhs.resolvedType.isBaseType()) return;
 	//if (castedExpressionType.id == T_null) return; // tolerate null expression cast
 	if (castedExpressionType.isCompatibleWith(expectedType, scope)) {
+		if (compilerOptions.isAnnotationBasedNullAnalysisEnabled && compilerOptions.sourceLevel >= ClassFileConstants.JDK1_8) {
+			// are null annotations compatible, too?
+			if (NullAnnotationMatching.analyse(expectedType, castedExpressionType, -1).isAnyMismatch())
+				return; // already reported unchecked cast (nullness), say no more.
+		}
 		scope.problemReporter().unnecessaryCast(rhs);
 	}
 }
@@ -112,14 +124,14 @@
 	TypeBinding castedExpressionType = ((CastExpression)enclosingInstance).expression.resolvedType;
 	if (castedExpressionType == null) return; // cannot do better
 	// obvious identity cast
-	if (castedExpressionType == enclosingInstanceType) {
+	if (TypeBinding.equalsEquals(castedExpressionType, enclosingInstanceType)) {
 		scope.problemReporter().unnecessaryCast((CastExpression)enclosingInstance);
 	} else if (castedExpressionType == TypeBinding.NULL){
 		return; // tolerate null enclosing instance cast
 	} else {
 		TypeBinding alternateEnclosingInstanceType = castedExpressionType;
 		if (castedExpressionType.isBaseType() || castedExpressionType.isArrayType()) return; // error case
-		if (memberType == scope.getMemberType(memberType.sourceName(), (ReferenceBinding) alternateEnclosingInstanceType)) {
+		if (TypeBinding.equalsEquals(memberType, scope.getMemberType(memberType.sourceName(), (ReferenceBinding) alternateEnclosingInstanceType))) {
 			scope.problemReporter().unnecessaryCast((CastExpression)enclosingInstance);
 		}
 	}
@@ -166,7 +178,7 @@
 			TypeBinding castedExpressionType = ((CastExpression)argument).expression.resolvedType;
 			if (castedExpressionType == null) return; // cannot do better
 			// obvious identity cast
-			if (castedExpressionType == argumentTypes[i]) {
+			if (TypeBinding.equalsEquals(castedExpressionType, argumentTypes[i])) {
 				scope.problemReporter().unnecessaryCast((CastExpression)argument);
 			} else if (castedExpressionType == TypeBinding.NULL){
 				continue; // tolerate null argument cast
@@ -266,8 +278,10 @@
 			public void setFieldIndex(int depth){ /* ignore */}
 			public int sourceStart() { return 0; }
 			public int sourceEnd() { return 0; }
-			public TypeBinding expectedType() { return invocationSite.expectedType(); }
+			public TypeBinding invocationTargetType() { return invocationSite.invocationTargetType(); }
 			public boolean receiverIsImplicitThis() { return invocationSite.receiverIsImplicitThis();}
+			public InferenceContext18 freshInferenceContext(Scope someScope) { return null; /* suppress inference */ }
+			public ExpressionContext getExpressionContext() { return invocationSite.getExpressionContext(); }
 		};
 		MethodBinding bindingIfNoCast;
 		if (binding.isConstructor()) {
@@ -297,7 +311,7 @@
 				}
 			}
 			for (int i = 0; i < argumentLength; i++) {
-				if (originalArgumentTypes[i] != alternateArgumentTypes[i]
+				if (TypeBinding.notEquals(originalArgumentTypes[i], alternateArgumentTypes[i])
                        /*&& !originalArgumentTypes[i].needsUncheckedConversion(alternateArgumentTypes[i])*/) {
 					scope.problemReporter().unnecessaryCast((CastExpression)arguments[i]);
 				}
@@ -306,8 +320,8 @@
 }
 
 public boolean checkUnsafeCast(Scope scope, TypeBinding castType, TypeBinding expressionType, TypeBinding match, boolean isNarrowing) {
-	if (match == castType) {
-		if (!isNarrowing && match == this.resolvedType.leafComponentType()) { // do not tag as unnecessary when recursing through upper bounds
+	if (TypeBinding.equalsEquals(match, castType)) {
+		if (!isNarrowing && TypeBinding.equalsEquals(match, this.resolvedType.leafComponentType())) { // do not tag as unnecessary when recursing through upper bounds
 			tagAsUnnecessaryCast(scope, castType);
 		}
 		return true;
@@ -359,7 +373,7 @@
 									alternateArguments[i] = scope.getJavaLangObject();
 									LookupEnvironment environment = scope.environment();
 									ParameterizedTypeBinding alternateCastType = environment.createParameterizedType((ReferenceBinding)castType.erasure(), alternateArguments, castType.enclosingType());
-									if (alternateCastType.findSuperTypeOriginatingFrom(expressionType) == match) {
+									if (TypeBinding.equalsEquals(alternateCastType.findSuperTypeOriginatingFrom(expressionType), match)) {
 										this.bits |= ASTNode.UnsafeCast;
 										break;
 									}
@@ -405,7 +419,7 @@
 //			}
 //			break;
 	}
-	if (!isNarrowing && match == this.resolvedType.leafComponentType()) { // do not tag as unnecessary when recursing through upper bounds
+	if (!isNarrowing && TypeBinding.equalsEquals(match, this.resolvedType.leafComponentType())) { // do not tag as unnecessary when recursing through upper bounds
 		tagAsUnnecessaryCast(scope, castType);
 	}
 	return true;
@@ -420,11 +434,12 @@
  */
 public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean valueRequired) {
 	int pc = codeStream.position;
+	boolean annotatedCast = (this.type.bits & ASTNode.HasTypeAnnotations) != 0;
 	boolean needRuntimeCheckcast = (this.bits & ASTNode.GenerateCheckcast) != 0;
 	if (this.constant != Constant.NotAConstant) {
-		if (valueRequired || needRuntimeCheckcast) { // Added for: 1F1W9IG: IVJCOM:WINNT - Compiler omits casting check
+		if (valueRequired || needRuntimeCheckcast || annotatedCast) { // Added for: 1F1W9IG: IVJCOM:WINNT - Compiler omits casting check
 			codeStream.generateConstant(this.constant, this.implicitConversion);
-			if (needRuntimeCheckcast) {
+			if (needRuntimeCheckcast || annotatedCast) {
 				codeStream.checkcast(this.type, this.resolvedType);
 			}
 			if (!valueRequired) {
@@ -435,14 +450,23 @@
 		codeStream.recordPositionsFrom(pc, this.sourceStart);
 		return;
 	}
-	this.expression.generateCode(currentScope, codeStream, valueRequired || needRuntimeCheckcast);
-	if (needRuntimeCheckcast && this.expression.postConversionType(currentScope) != this.resolvedType.erasure()) { // no need to issue a checkcast if already done as genericCast
+	this.expression.generateCode(currentScope, codeStream, annotatedCast || valueRequired || needRuntimeCheckcast);
+	if (annotatedCast || (needRuntimeCheckcast && TypeBinding.notEquals(this.expression.postConversionType(currentScope), this.resolvedType.erasure()))) { // no need to issue a checkcast if already done as genericCast
 		codeStream.checkcast(this.type, this.resolvedType);
 	}
 	if (valueRequired) {
 		codeStream.generateImplicitConversion(this.implicitConversion);
 	} else if (needRuntimeCheckcast) {
-		codeStream.pop();
+		boolean isUnboxing = (this.implicitConversion & TypeIds.UNBOXING) != 0;
+		switch (isUnboxing ? postConversionType(currentScope).id : this.resolvedType.id) {
+			case T_long :
+			case T_double :
+				codeStream.pop2();
+				break;
+			default :
+				codeStream.pop();
+				break;
+		}
 	}
 	codeStream.recordPositionsFrom(pc, this.sourceStart);
 }
@@ -516,7 +540,7 @@
 		MethodBinding methodBinding = messageSend.binding;
 		if (methodBinding != null && methodBinding.isPolymorphic()) {
 			messageSend.binding = scope.environment().updatePolymorphicMethodReturnType((PolymorphicMethodBinding) methodBinding, castType);
-			if (expressionType != castType) {
+			if (TypeBinding.notEquals(expressionType, castType)) {
 				expressionType = castType;
 				this.bits |= ASTNode.DisableUnnecessaryCastCheck;
 			}
@@ -524,13 +548,20 @@
 	}
 	if (castType != null) {
 		if (expressionType != null) {
+
+			boolean nullAnnotationMismatch = NullAnnotationMatching.analyse(castType, expressionType, -1).isAnyMismatch();
+
 			boolean isLegal = checkCastTypesCompatibility(scope, castType, expressionType, this.expression);
 			if (isLegal) {
 				this.expression.computeConversion(scope, castType, expressionType);
 				if ((this.bits & ASTNode.UnsafeCast) != 0) { // unsafe cast
-					if (scope.compilerOptions().reportUnavoidableGenericTypeProblems || !this.expression.forcedToBeRaw(scope.referenceContext())) {
+					if (scope.compilerOptions().reportUnavoidableGenericTypeProblems
+							|| !(expressionType.isRawType() && this.expression.forcedToBeRaw(scope.referenceContext()))) {
 						scope.problemReporter().unsafeCast(this, scope);
 					}
+				} else if (nullAnnotationMismatch) {
+					// report null annotation issue at medium priority
+					scope.problemReporter().unsafeNullnessCast(this, scope);
 				} else {
 					if (castType.isRawType() && scope.compilerOptions().getSeverity(CompilerOptions.RawTypeReference) != ProblemSeverities.Ignore){
 						scope.problemReporter().rawTypeReference(this.type, castType);
@@ -573,7 +604,7 @@
 					&& ((ParameterizedGenericMethodBinding)method).inferredReturnType) {
 			if (this.expectedType == null)
 				return true;
-			if (this.resolvedType != this.expectedType)
+			if (TypeBinding.notEquals(this.resolvedType, this.expectedType))
 				return true;
 		}
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java
index 4f75343..4de8a57 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann  - Contribution for bug 295551
@@ -44,6 +40,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.HashSetOfInt;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class CompilationUnitDeclaration extends ASTNode implements ProblemSeverities, ReferenceContext {
 
 	private static final Comparator STRING_LITERAL_COMPARATOR = new Comparator() {
@@ -78,10 +75,14 @@
 	private int stringLiteralsPtr;
 	private HashSetOfInt stringLiteralsStart;
 
+	public boolean[] validIdentityComparisonLines;
+
 	IrritantSet[] suppressWarningIrritants;  // irritant for suppressed warnings
 	Annotation[] suppressWarningAnnotations;
 	long[] suppressWarningScopePositions; // (start << 32) + end
 	int suppressWarningsCount;
+	public int functionalExpressionsCount;
+	public FunctionalExpression[] functionalExpressions;
 
 public CompilationUnitDeclaration(ProblemReporter problemReporter, CompilationResult compilationResult, int sourceLength) {
 	this.problemReporter = problemReporter;
@@ -423,6 +424,10 @@
 	return false;
 }
 
+public boolean hasFunctionalTypes() {
+	return this.compilationResult.hasFunctionalTypes;
+}
+
 public boolean hasErrors() {
 	return this.ignoreFurtherInvestigation;
 }
@@ -532,6 +537,20 @@
 	this.localTypes[this.localTypeCount++] = localType;
 }
 
+/*
+ * Keep track of all lambda/method reference expressions, so as to be able to look it up later without 
+ * having to traverse AST. Return the 1 based "ordinal" in the CUD.
+ */
+public int record(FunctionalExpression expression) {
+	if (this.functionalExpressionsCount == 0) {
+		this.functionalExpressions = new FunctionalExpression[5];
+	} else if (this.functionalExpressionsCount == this.functionalExpressions.length) {
+		System.arraycopy(this.functionalExpressions, 0, (this.functionalExpressions = new FunctionalExpression[this.functionalExpressionsCount * 2]), 0, this.functionalExpressionsCount);
+	}
+	this.functionalExpressions[this.functionalExpressionsCount] = expression;
+	return ++this.functionalExpressionsCount;
+}
+
 public void resolve() {
 	int startingTypeIndex = 0;
 	boolean isPackageInfo = isPackageInfo();
@@ -684,7 +703,10 @@
 }
 
 public void traverse(ASTVisitor visitor, CompilationUnitScope unitScope) {
-	if (this.ignoreFurtherInvestigation)
+	traverse(visitor, unitScope, true);
+}
+public void traverse(ASTVisitor visitor, CompilationUnitScope unitScope, boolean skipOnError) {
+	if (skipOnError && this.ignoreFurtherInvestigation)
 		return;
 	try {
 		if (visitor.visit(this, this.scope)) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java
index b59e17d..695b5a0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
@@ -144,7 +140,7 @@
 		if (use15specifics) {
 			if (!lhsType.isBaseType() && expressionType.id != T_JavaLangString && expressionType.id != T_null) {
 				TypeBinding unboxedType = env.computeBoxingType(lhsType);
-				if (unboxedType != lhsType) {
+				if (TypeBinding.notEquals(unboxedType, lhsType)) {
 					lhsType = unboxedType;
 					unboxedLhs = true;
 				}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java
index 12c7bbc..7fa2ef7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephen Herrmann <stephan@cs.tu-berlin.de> -  Contributions for
@@ -20,9 +16,19 @@
  *							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 400761 - [compiler][null] null may be return as boolean without a diagnostic
+ *							Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *							Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *							Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *							Bug 426078 - [1.8] VerifyError when conditional expression passed as an argument
+ *							Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *							Bug 418537 - [1.8][null] Fix null type annotation analysis for poly conditional expressions
+ *							Bug 428352 - [1.8][compiler] Resolution errors don't always surface
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.*;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
@@ -44,12 +50,15 @@
 	
 	// we compute and store the null status during analyseCode (https://bugs.eclipse.org/324178):
 	private int nullStatus = FlowInfo.UNKNOWN;
+	int ifFalseNullStatus;
+	int ifTrueNullStatus;
 	private TypeBinding expectedType;
 	private ExpressionContext expressionContext = VANILLA_CONTEXT;
 	private boolean isPolyExpression = false;
 	private TypeBinding originalValueIfTrueType;
 	private TypeBinding originalValueIfFalseType;
-
+	private BlockScope polyExpressionScope;
+	private boolean use18specifics;
 	public ConditionalExpression(
 		Expression condition,
 		Expression valueIfTrue,
@@ -75,11 +84,12 @@
 
 		// process the if-true part
 		FlowInfo trueFlowInfo = flowInfo.initsWhenTrue().copy();
+		final CompilerOptions compilerOptions = currentScope.compilerOptions();
 		if (isConditionOptimizedFalse) {
 			if ((mode & FlowInfo.UNREACHABLE) == 0) {
 				trueFlowInfo.setReachMode(FlowInfo.UNREACHABLE_OR_DEAD);
 			}
-			if (!isKnowDeadCodePattern(this.condition) || currentScope.compilerOptions().reportDeadCodeInTrivialIfStatement) {
+			if (!isKnowDeadCodePattern(this.condition) || compilerOptions.reportDeadCodeInTrivialIfStatement) {
 				this.valueIfTrue.complainIfUnreachable(trueFlowInfo, currentScope, initialComplaintLevel, false);
 			}
 		}
@@ -88,9 +98,9 @@
 		this.valueIfTrue.checkNPEbyUnboxing(currentScope, flowContext, trueFlowInfo);
 
 		// may need to fetch this null status before expireNullCheckedFieldInfo():
-		int preComputedTrueNullStatus = -1;
-		if (currentScope.compilerOptions().enableSyntacticNullAnalysisForFields) {
-			preComputedTrueNullStatus = this.valueIfTrue.nullStatus(trueFlowInfo, flowContext);
+		this.ifTrueNullStatus = -1;
+		if (compilerOptions.enableSyntacticNullAnalysisForFields) {
+			this.ifTrueNullStatus = this.valueIfTrue.nullStatus(trueFlowInfo, flowContext);
 			// wipe information that was meant only for valueIfTrue:
 			flowContext.expireNullCheckedFieldInfo();
 		}
@@ -101,7 +111,7 @@
 			if ((mode & FlowInfo.UNREACHABLE) == 0) {
 				falseFlowInfo.setReachMode(FlowInfo.UNREACHABLE_OR_DEAD);
 			}
-			if (!isKnowDeadCodePattern(this.condition) || currentScope.compilerOptions().reportDeadCodeInTrivialIfStatement) {
+			if (!isKnowDeadCodePattern(this.condition) || compilerOptions.reportDeadCodeInTrivialIfStatement) {
 				this.valueIfFalse.complainIfUnreachable(falseFlowInfo, currentScope, initialComplaintLevel, true);
 			}
 		}
@@ -115,8 +125,8 @@
 		FlowInfo mergedInfo;
 		if (isConditionOptimizedTrue){
 			mergedInfo = trueFlowInfo.addPotentialInitializationsFrom(falseFlowInfo);
-			if (preComputedTrueNullStatus != -1) {
-				this.nullStatus = preComputedTrueNullStatus;
+			if (this.ifTrueNullStatus != -1) {
+				this.nullStatus = this.ifTrueNullStatus;
 			} else { 
 				this.nullStatus = this.valueIfTrue.nullStatus(trueFlowInfo, flowContext);
 			}
@@ -135,7 +145,7 @@
 			//     (regardless of the evaluation of the condition).
 			
 			// to support (1) use the infos of both branches originating from the condition for computing the nullStatus:
-			computeNullStatus(preComputedTrueNullStatus, trueFlowInfo, falseFlowInfo, flowContext);
+			computeNullStatus(trueFlowInfo, falseFlowInfo, flowContext);
 			
 			// to support (2) we split the true/false branches according to their inner structure. Consider this:
 			// if (b ? false : (true && (v = false))) return v; -- ok
@@ -175,6 +185,7 @@
 		this.mergedInitStateIndex =
 			currentScope.methodScope().recordInitializationStates(mergedInfo);
 		mergedInfo.setReachMode(mode);
+		
 		return mergedInfo;
 	}
 
@@ -186,31 +197,31 @@
 		return true; // all checking done
 	}
 
-	private void computeNullStatus(int ifTrueNullStatus, FlowInfo trueBranchInfo, FlowInfo falseBranchInfo, FlowContext flowContext) {
+	private void computeNullStatus(FlowInfo trueBranchInfo, FlowInfo falseBranchInfo, FlowContext flowContext) {
 		// given that the condition cannot be optimized to a constant 
 		// we now merge the nullStatus from both branches:
-		if (ifTrueNullStatus == -1) { // has this status been pre-computed?
-			ifTrueNullStatus = this.valueIfTrue.nullStatus(trueBranchInfo, flowContext);
+		if (this.ifTrueNullStatus == -1) { // has this status been pre-computed?
+			this.ifTrueNullStatus = this.valueIfTrue.nullStatus(trueBranchInfo, flowContext);
 		}
-		int ifFalseNullStatus = this.valueIfFalse.nullStatus(falseBranchInfo, flowContext);
+		this.ifFalseNullStatus = this.valueIfFalse.nullStatus(falseBranchInfo, flowContext);
 
-		if (ifTrueNullStatus == ifFalseNullStatus) {
-			this.nullStatus = ifTrueNullStatus;
+		if (this.ifTrueNullStatus == this.ifFalseNullStatus) {
+			this.nullStatus = this.ifTrueNullStatus;
 			return;
 		}
 		if (trueBranchInfo.reachMode() != FlowInfo.REACHABLE) {
-			this.nullStatus = ifFalseNullStatus;
+			this.nullStatus = this.ifFalseNullStatus;
 			return;
 		}
 		if (falseBranchInfo.reachMode() != FlowInfo.REACHABLE) {
-			this.nullStatus = ifTrueNullStatus;
+			this.nullStatus = this.ifTrueNullStatus;
 			return;
 		}
 
 		// is there a chance of null (or non-null)? -> potentially null etc.
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=133125
 		int status = 0;
-		int combinedStatus = ifTrueNullStatus|ifFalseNullStatus;
+		int combinedStatus = this.ifTrueNullStatus|this.ifFalseNullStatus;
 		if ((combinedStatus & (FlowInfo.NULL|FlowInfo.POTENTIALLY_NULL)) != 0)
 			status |= FlowInfo.POTENTIALLY_NULL;
 		if ((combinedStatus & (FlowInfo.NON_NULL|FlowInfo.POTENTIALLY_NON_NULL)) != 0)
@@ -430,9 +441,9 @@
 		LookupEnvironment env = scope.environment();
 		final long sourceLevel = scope.compilerOptions().sourceLevel;
 		boolean use15specifics = sourceLevel >= ClassFileConstants.JDK1_5;
-		boolean use18specifics = sourceLevel >= ClassFileConstants.JDK1_8;
+		this.use18specifics = sourceLevel >= ClassFileConstants.JDK1_8;
 		
-		if (use18specifics) {
+		if (this.use18specifics) {
 			if (this.expressionContext == ASSIGNMENT_CONTEXT || this.expressionContext == INVOCATION_CONTEXT) {
 				this.valueIfTrue.setExpressionContext(this.expressionContext);
 				this.valueIfTrue.setExpectedType(this.expectedType);
@@ -455,21 +466,27 @@
 
 			if (conditionType == null || this.originalValueIfTrueType == null || this.originalValueIfFalseType == null)
 				return null;
-			
-			if (this.originalValueIfTrueType.kind() == Binding.POLY_TYPE || this.originalValueIfFalseType.kind() == Binding.POLY_TYPE) {
-				this.isPolyExpression = true;
-				return new PolyTypeBinding(this);
-			}
 		} else {
+			/* Not reached as of now as we don't evaluate conditional expressions multiple times, left in for now.
+			   If in future, we change things so control reaches here, a precondition is that this.expectedType is
+			   the final target type.
+			*/
 			if (this.originalValueIfTrueType.kind() == Binding.POLY_TYPE)
 				this.originalValueIfTrueType = this.valueIfTrue.resolveType(scope);
 			if (this.originalValueIfFalseType.kind() == Binding.POLY_TYPE)
 				this.originalValueIfFalseType = this.valueIfFalse.resolveType(scope);
 		}
-		
+		if (isPolyExpression()) {
+			if (this.expectedType == null) {
+				this.polyExpressionScope = scope; // preserve for eventual resolution/error reporting.
+				return new PolyTypeBinding(this);
+			}
+			computeConversions(scope, this.expectedType);
+			return this.resolvedType = this.expectedType;
+		}
 		TypeBinding valueIfTrueType = this.originalValueIfTrueType;
 		TypeBinding valueIfFalseType = this.originalValueIfFalseType;
-		if (use15specifics && valueIfTrueType != valueIfFalseType) {
+		if (use15specifics && TypeBinding.notEquals(valueIfTrueType, valueIfFalseType)) {
 			if (valueIfTrueType.isBaseType()) {
 				if (valueIfFalseType.isBaseType()) {
 					// bool ? baseType : baseType
@@ -514,10 +531,10 @@
 			// from valueIFTrue or valueIfFalse to the receiver constant
 			this.constant = condConstant.booleanValue() ? trueConstant : falseConstant;
 		}
-		if (valueIfTrueType == valueIfFalseType) { // harmed the implicit conversion
+		if (TypeBinding.equalsEquals(valueIfTrueType, valueIfFalseType)) { // harmed the implicit conversion
 			this.valueIfTrue.computeConversion(scope, valueIfTrueType, this.originalValueIfTrueType);
 			this.valueIfFalse.computeConversion(scope, valueIfFalseType, this.originalValueIfFalseType);
-			if (valueIfTrueType == TypeBinding.BOOLEAN) {
+			if (TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.BOOLEAN)) {
 				this.optimizedIfTrueConstant = this.valueIfTrue.optimizedBooleanConstant();
 				this.optimizedIfFalseConstant = this.valueIfFalse.optimizedBooleanConstant();
 				if (this.optimizedIfTrueConstant != Constant.NotAConstant
@@ -531,30 +548,30 @@
 						: this.optimizedIfFalseConstant;
 				}
 			}
-			return this.resolvedType = valueIfTrueType;
+			return this.resolvedType = NullAnnotationMatching.moreDangerousType(valueIfTrueType, valueIfFalseType);
 		}
 		// Determine the return type depending on argument types
 		// Numeric types
 		if (valueIfTrueType.isNumericType() && valueIfFalseType.isNumericType()) {
 			// (Short x Byte) or (Byte x Short)"
-			if ((valueIfTrueType == TypeBinding.BYTE && valueIfFalseType == TypeBinding.SHORT)
-				|| (valueIfTrueType == TypeBinding.SHORT && valueIfFalseType == TypeBinding.BYTE)) {
+			if ((TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.BYTE) && TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.SHORT))
+				|| (TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.SHORT) && TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.BYTE))) {
 				this.valueIfTrue.computeConversion(scope, TypeBinding.SHORT, this.originalValueIfTrueType);
 				this.valueIfFalse.computeConversion(scope, TypeBinding.SHORT, this.originalValueIfFalseType);
 				return this.resolvedType = TypeBinding.SHORT;
 			}
 			// <Byte|Short|Char> x constant(Int)  ---> <Byte|Short|Char>   and reciprocally
-			if ((valueIfTrueType == TypeBinding.BYTE || valueIfTrueType == TypeBinding.SHORT || valueIfTrueType == TypeBinding.CHAR)
-					&& (valueIfFalseType == TypeBinding.INT
+			if ((TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.BYTE) || TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.SHORT) || TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.CHAR))
+					&& (TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.INT)
 						&& this.valueIfFalse.isConstantValueOfTypeAssignableToType(valueIfFalseType, valueIfTrueType))) {
 				this.valueIfTrue.computeConversion(scope, valueIfTrueType, this.originalValueIfTrueType);
 				this.valueIfFalse.computeConversion(scope, valueIfTrueType, this.originalValueIfFalseType);
 				return this.resolvedType = valueIfTrueType;
 			}
-			if ((valueIfFalseType == TypeBinding.BYTE
-					|| valueIfFalseType == TypeBinding.SHORT
-					|| valueIfFalseType == TypeBinding.CHAR)
-					&& (valueIfTrueType == TypeBinding.INT
+			if ((TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.BYTE)
+					|| TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.SHORT)
+					|| TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.CHAR))
+					&& (TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.INT)
 						&& this.valueIfTrue.isConstantValueOfTypeAssignableToType(valueIfTrueType, valueIfFalseType))) {
 				this.valueIfTrue.computeConversion(scope, valueIfFalseType, this.originalValueIfTrueType);
 				this.valueIfFalse.computeConversion(scope, valueIfFalseType, this.originalValueIfFalseType);
@@ -638,6 +655,53 @@
 		return null;
 	}
 
+	protected void computeConversions(BlockScope scope, TypeBinding targetType) {
+		if (this.originalValueIfTrueType != null && this.originalValueIfTrueType.isValidBinding()) {
+			if (this.valueIfTrue.isConstantValueOfTypeAssignableToType(this.originalValueIfTrueType, targetType)
+					|| this.originalValueIfTrueType.isCompatibleWith(targetType)) {
+
+				this.valueIfTrue.computeConversion(scope, targetType, this.originalValueIfTrueType);
+				if (this.originalValueIfTrueType.needsUncheckedConversion(targetType)) {
+					scope.problemReporter().unsafeTypeConversion(this.valueIfTrue, this.originalValueIfTrueType, targetType);
+				}
+				if (this.valueIfTrue instanceof CastExpression
+						&& (this.valueIfTrue.bits & (ASTNode.UnnecessaryCast|ASTNode.DisableUnnecessaryCastCheck)) == 0) {
+					CastExpression.checkNeedForAssignedCast(scope, targetType, (CastExpression) this.valueIfTrue);
+				}
+			} else if (isBoxingCompatible(this.originalValueIfTrueType, targetType, this.valueIfTrue, scope)) {
+				this.valueIfTrue.computeConversion(scope, targetType, this.originalValueIfTrueType);
+				if (this.valueIfTrue instanceof CastExpression
+						&& (this.valueIfTrue.bits & (ASTNode.UnnecessaryCast|ASTNode.DisableUnnecessaryCastCheck)) == 0) {
+					CastExpression.checkNeedForAssignedCast(scope, targetType, (CastExpression) this.valueIfTrue);
+				}
+			} else {
+				scope.problemReporter().typeMismatchError(this.originalValueIfTrueType, targetType, this.valueIfTrue, null);
+			}
+		}
+		if (this.originalValueIfFalseType != null && this.originalValueIfFalseType.isValidBinding()) {
+			if (this.valueIfFalse.isConstantValueOfTypeAssignableToType(this.originalValueIfFalseType, targetType)
+					|| this.originalValueIfFalseType.isCompatibleWith(targetType)) {
+
+				this.valueIfFalse.computeConversion(scope, targetType, this.originalValueIfFalseType);
+				if (this.originalValueIfFalseType.needsUncheckedConversion(targetType)) {
+					scope.problemReporter().unsafeTypeConversion(this.valueIfFalse, this.originalValueIfFalseType, targetType);
+				}
+				if (this.valueIfFalse instanceof CastExpression
+						&& (this.valueIfFalse.bits & (ASTNode.UnnecessaryCast|ASTNode.DisableUnnecessaryCastCheck)) == 0) {
+					CastExpression.checkNeedForAssignedCast(scope, targetType, (CastExpression) this.valueIfFalse);
+				}
+			} else if (isBoxingCompatible(this.originalValueIfFalseType, targetType, this.valueIfFalse, scope)) {
+				this.valueIfFalse.computeConversion(scope, targetType, this.originalValueIfFalseType);
+				if (this.valueIfFalse instanceof CastExpression
+						&& (this.valueIfFalse.bits & (ASTNode.UnnecessaryCast|ASTNode.DisableUnnecessaryCastCheck)) == 0) {
+					CastExpression.checkNeedForAssignedCast(scope, targetType, (CastExpression) this.valueIfFalse);
+				}
+			} else {
+				scope.problemReporter().typeMismatchError(this.originalValueIfFalseType, targetType, this.valueIfFalse, null);
+			}
+		}
+	}
+
 	public void setExpectedType(TypeBinding expectedType) {
 		this.expectedType = expectedType;
 	}
@@ -645,22 +709,76 @@
 	public void setExpressionContext(ExpressionContext context) {
 		this.expressionContext = context;
 	}
+
+	public ExpressionContext getExpressionContext() {
+		return this.expressionContext;
+	}
+	
+	public TypeBinding checkAgainstFinalTargetType(TypeBinding targetType, Scope scope) {
+		// in 1.8 if treated as a poly expression:
+		if (isPolyExpression()) {
+			targetType = targetType.uncapture(this.polyExpressionScope);
+			this.originalValueIfTrueType = this.valueIfTrue.checkAgainstFinalTargetType(targetType, scope);
+			this.originalValueIfFalseType = this.valueIfFalse.checkAgainstFinalTargetType(targetType, scope);
+			computeConversions(this.polyExpressionScope, targetType);
+			this.resolvedType = targetType;
+		}
+		return this.resolvedType;
+	}
+	
+	public boolean isPertinentToApplicability(TypeBinding targetType, MethodBinding method) {
+		return this.valueIfTrue.isPertinentToApplicability(targetType, method) 
+				&& this.valueIfFalse.isPertinentToApplicability(targetType, method);
+	}
 	
 	public boolean isPolyExpression() throws UnsupportedOperationException {
+		
+		if (!this.use18specifics)
+			return false;
+		
+		if (this.isPolyExpression)
+			return true;
+
 		if (this.expressionContext != ASSIGNMENT_CONTEXT && this.expressionContext != INVOCATION_CONTEXT)
 			return false;
 		
-		return this.isPolyExpression;
+		if (this.originalValueIfTrueType == null || this.originalValueIfFalseType == null) // resolution error.
+			return false;
+		
+		if (this.originalValueIfTrueType.kind() == Binding.POLY_TYPE || this.originalValueIfFalseType.kind() == Binding.POLY_TYPE)
+			return true;
+		
+		// "... unless both operands produce primitives (or boxed primitives)":
+		if (this.originalValueIfTrueType.isBaseType() || (this.originalValueIfTrueType.id >= TypeIds.T_JavaLangByte && this.originalValueIfTrueType.id <= TypeIds.T_JavaLangBoolean)) {
+			if (this.originalValueIfFalseType.isBaseType() || (this.originalValueIfFalseType.id >= TypeIds.T_JavaLangByte && this.originalValueIfFalseType.id <= TypeIds.T_JavaLangBoolean))
+				return false;
+		}
+		
+		// clause around generic method's return type prior to instantiation needs double check. 
+		return this.isPolyExpression = true;
 	}
 	
 	public boolean isCompatibleWith(TypeBinding left, Scope scope) {
-		return this.valueIfTrue.isCompatibleWith(left, scope) && this.valueIfFalse.isCompatibleWith(left, scope);
+		return isPolyExpression() ? this.valueIfTrue.isCompatibleWith(left, scope) && this.valueIfFalse.isCompatibleWith(left, scope) :
+			super.isCompatibleWith(left, scope);
 	}
 	
-	public boolean tIsMoreSpecific(TypeBinding t, TypeBinding s) {
+	@Override
+	public boolean isBoxingCompatibleWith(TypeBinding targetType, Scope scope) {
+		// Note: compatibility check may have failed in just one arm and we may have reached here.
+		return isPolyExpression() ? (this.valueIfTrue.isCompatibleWith(targetType, scope) || 
+				                     this.valueIfTrue.isBoxingCompatibleWith(targetType, scope)) && 
+				                    (this.valueIfFalse.isCompatibleWith(targetType, scope) || 
+				                     this.valueIfFalse.isBoxingCompatibleWith(targetType, scope)) :
+			super.isBoxingCompatibleWith(targetType, scope);
+	}	
+	
+	public boolean sIsMoreSpecific(TypeBinding s, TypeBinding t, Scope scope) {
+		if (super.sIsMoreSpecific(s, t, scope))
+			return true;
 		return isPolyExpression() ?
-				this.valueIfTrue.tIsMoreSpecific(t, s) && this.valueIfFalse.tIsMoreSpecific(t, s):
-				super.tIsMoreSpecific(t, s);
+				this.valueIfTrue.sIsMoreSpecific(s, t, scope) && this.valueIfFalse.sIsMoreSpecific(s, t, scope):
+				false;
 	}
 	
 	public void tagAsEllipsisArgument() {
@@ -677,3 +795,4 @@
 		visitor.endVisit(this, scope);
 	}
 }
+
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
index 5847c5c..9c9ca12 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
@@ -17,13 +17,19 @@
  *								bug 331649 - [compiler][null] consider null annotations for fields
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
  *								bug 400421 - [compiler] Null analysis for fields does not take @com.google.inject.Inject into account
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 416176 - [1.8][compiler][null] null type annotations cause grief on type variables
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 415399 - [1.8][compiler] Type annotations on constructor results dropped by the code generator
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
 import java.util.ArrayList;
+import java.util.List;
 
 import org.aspectj.org.eclipse.jdt.core.compiler.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.*;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationCollector;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.*;
@@ -32,6 +38,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ConstructorDeclaration extends AbstractMethodDeclaration {
 
 	public ExplicitConstructorCall constructorCall;
@@ -82,6 +89,11 @@
 				break checkUnused;
 			if (!methodBinding.canBeSeenBy(SuperReference.implicitSuperConstructorCall(), this.scope))
 				break checkUnused;
+			ReferenceBinding declaringClass = constructorBinding.declaringClass;
+			if (constructorBinding.isPublic() && constructorBinding.parameters.length == 0 &&
+					declaringClass.isStatic() &&
+					declaringClass.findSuperTypeOriginatingFrom(TypeIds.T_JavaIoExternalizable, false) != null)
+				break checkUnused;
 			// otherwise default super constructor exists, so go ahead and complain unused.
 		}
 		// complain unused
@@ -130,7 +142,10 @@
 		}
 
 		// nullity and mark as assigned
-		analyseArguments(flowInfo, this.arguments, this.binding);
+		if (classScope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_8)
+			analyseArguments(flowInfo, this.arguments, this.binding);
+		else
+			analyseArguments18(flowInfo, this.arguments, this.binding);
 
 		// propagate to constructor call
 		if (this.constructorCall != null) {
@@ -426,6 +441,14 @@
 	classFile.completeMethodInfo(this.binding, methodAttributeOffset, attributeNumber);
 }
 
+public void getAllAnnotationContexts(int targetType, List allAnnotationContexts) {
+	AnnotationCollector collector = new AnnotationCollector(null, targetType, allAnnotationContexts);
+	for (int i = 0, max = this.annotations.length; i < max; i++) {
+		Annotation annotation = this.annotations[i];
+		annotation.traverse(collector, (BlockScope) null);
+	}
+}
+
 public boolean isConstructor() {
 	return true;
 }
@@ -531,11 +554,7 @@
 	if (!CharOperation.equals(sourceType.sourceName, this.selector)){
 		this.scope.problemReporter().missingReturnType(this);
 	}
-	if (this.typeParameters != null) {
-		for (int i = 0, length = this.typeParameters.length; i < length; i++) {
-			this.typeParameters[i].resolve(this.scope);
-		}
-	}
+	// typeParameters are already resolved from Scope#connectTypeVariables()
 	if (this.binding != null && !this.binding.isPrivate()) {
 		sourceType.tagBits |= TagBits.HasNonPrivateConstructor;
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ContainerAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ContainerAnnotation.java
new file mode 100644
index 0000000..7841b06
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ContainerAnnotation.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Jesper S Moller 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:
+ *     Jesper S Moller <jesper@selskabet.org> - initial API and implementation
+ ********************************************************************************/
+package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
+
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
+
+public class ContainerAnnotation extends SingleMemberAnnotation {
+	
+	private Annotation [] containees;
+	private ArrayInitializer memberValues;
+	
+	public ContainerAnnotation(Annotation repeatingAnnotation, ReferenceBinding containerAnnotationType, BlockScope scope) {
+		
+		char [][] containerTypeName = containerAnnotationType.compoundName;
+		if (containerTypeName.length == 1) {
+			this.type = new SingleTypeReference(containerTypeName[0], 0);
+		} else {
+			this.type = new QualifiedTypeReference(containerTypeName, new long [containerTypeName.length]);
+		}
+		
+		this.sourceStart = repeatingAnnotation.sourceStart;
+		this.sourceEnd = repeatingAnnotation.sourceEnd;
+		
+		this.resolvedType = containerAnnotationType;
+		this.recipient = repeatingAnnotation.recipient;
+		this.containees = new Annotation[0];
+		this.memberValue = this.memberValues = new ArrayInitializer();
+		addContainee(repeatingAnnotation);
+	}
+	
+	public void addContainee(Annotation repeatingAnnotation) {
+		final int length = this.containees.length;
+		System.arraycopy(this.containees, 0, this.containees = new Annotation[length + 1], 0, length);
+		this.containees[length] = repeatingAnnotation;
+		this.memberValues.expressions = this.containees;
+		repeatingAnnotation.setPersistibleAnnotation(length == 0 ? this : null);
+	}
+	
+	// Resolve the compiler synthesized container annotation.
+	public TypeBinding resolveType(BlockScope scope) {
+
+		if (this.compilerAnnotation != null)
+			return this.resolvedType;
+
+		this.constant = Constant.NotAConstant;
+
+		ReferenceBinding containerAnnotationType = (ReferenceBinding) this.resolvedType;
+		if (!containerAnnotationType.isValidBinding())
+			containerAnnotationType = (ReferenceBinding) containerAnnotationType.closestMatch();
+		Annotation repeatingAnnotation = this.containees[0];
+		ReferenceBinding repeatingAnnotationType = (ReferenceBinding) repeatingAnnotation.resolvedType;
+		if (!repeatingAnnotationType.isDeprecated() && isTypeUseDeprecated(containerAnnotationType, scope)) {
+			scope.problemReporter().deprecatedType(containerAnnotationType, repeatingAnnotation);
+		}
+		checkContainerAnnotationType(repeatingAnnotation, scope, containerAnnotationType, repeatingAnnotationType, true); // true => repeated *use* site error reporting requested.
+		this.resolvedType = containerAnnotationType = repeatingAnnotationType.containerAnnotationType();
+		if (!this.resolvedType.isValidBinding())
+			return this.resolvedType;
+		
+		// OK, the declaration site of the repeating annotation type as well as the use site where the annotations actually repeat pass muster. 
+		MethodBinding[] methods = containerAnnotationType.methods();
+		MemberValuePair pair = memberValuePairs()[0];
+		
+		for (int i = 0, length = methods.length; i < length; i++) {
+			MethodBinding method = methods[i];
+			if (CharOperation.equals(method.selector, TypeConstants.VALUE)) {
+				pair.binding = method;
+				pair.resolveTypeExpecting(scope, method.returnType);
+			}
+		}
+		this.compilerAnnotation = scope.environment().createAnnotation((ReferenceBinding) this.resolvedType, computeElementValuePairs());
+		return this.resolvedType;
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java
index f1b9a03..296a5fd 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java
@@ -42,10 +42,12 @@
 		// - allocation expression, some literals, this reference (see inside expressionNonNullComparison(..))
 		// these checks do not leverage the flowInfo.
 		boolean checkEquality = ((this.bits & OperatorMASK) >> OperatorSHIFT) == EQUAL_EQUAL;
-		if (leftStatus == FlowInfo.NON_NULL && rightStatus == FlowInfo.NULL) {
-			leftNonNullChecked = scope.problemReporter().expressionNonNullComparison(this.left, checkEquality);
-		} else if (leftStatus == FlowInfo.NULL && rightStatus == FlowInfo.NON_NULL) {
-			rightNonNullChecked = scope.problemReporter().expressionNonNullComparison(this.right, checkEquality);
+		if ((flowContext.tagBits & FlowContext.HIDE_NULL_COMPARISON_WARNING_MASK) == 0) {
+			if (leftStatus == FlowInfo.NON_NULL && rightStatus == FlowInfo.NULL) {
+				leftNonNullChecked = scope.problemReporter().expressionNonNullComparison(this.left, checkEquality);
+			} else if (leftStatus == FlowInfo.NULL && rightStatus == FlowInfo.NON_NULL) {
+				rightNonNullChecked = scope.problemReporter().expressionNonNullComparison(this.right, checkEquality);
+			}
 		}
 		
 		boolean contextualCheckEquality = checkEquality ^ ((flowContext.tagBits & FlowContext.INSIDE_NEGATION) != 0);
@@ -833,8 +835,12 @@
 			return null;
 		}
 
+		final CompilerOptions compilerOptions = scope.compilerOptions();
+		if (compilerOptions.complainOnUninternedIdentityComparison && originalRightType.hasTypeBit(TypeIds.BitUninternedType) && originalLeftType.hasTypeBit(TypeIds.BitUninternedType))
+			scope.problemReporter().uninternedIdentityComparison(this, originalLeftType, originalRightType, scope.referenceCompilationUnit());
+
 		// autoboxing support
-		boolean use15specifics = scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5;
+		boolean use15specifics = compilerOptions.sourceLevel >= ClassFileConstants.JDK1_5;
 		TypeBinding leftType = originalLeftType, rightType = originalRightType;
 		if (use15specifics) {
 			if (leftType != TypeBinding.NULL && leftType.isBaseType()) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
index b853104..10d93d8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Palo Alto Research Center, Incorporated - AspectJ adaptation
@@ -20,9 +16,23 @@
  *								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
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 424710 - [1.8][compiler] CCE in SingleNameReference.localVariableBinding
+ *								Bug 425152 - [1.8] [compiler] Lambda Expression not resolved but flow analyzed leading to NPE.
+ *								Bug 424205 - [1.8] Cannot infer type for diamond type with lambda on method invocation
+ *								Bug 424415 - [1.8][compiler] Eventual resolution of ReferenceExpression is not seen to be happening.
+ *								Bug 426366 - [1.8][compiler] Type inference doesn't handle multiple candidate target types in outer overload context
+ *								Bug 426290 - [1.8][compiler] Inference + overloading => wrong method resolution ?
+ *								Bug 427483 - [Java 8] Variables in lambdas sometimes can't be resolved
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *								Bug 428352 - [1.8][compiler] Resolution errors don't always surface
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 409245 - [1.8][compiler] Type annotations dropped when call is routed through a synthetic bridge method
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.INVOCATION_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
@@ -33,21 +43,25 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedMethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.VariableBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
 
-public class ExplicitConstructorCall extends Statement implements InvocationSite, ExpressionContext {
+public class ExplicitConstructorCall extends Statement implements Invocation {
 
 	public Expression[] arguments;
 	public Expression qualification;
@@ -66,6 +80,10 @@
 	// TODO Remove once DOMParser is activated
 	public int typeArgumentsSourceStart;
 
+	 // hold on to this context from invocation applicability inference until invocation type inference (per method candidate):
+	private SimpleLookupTable/*<PGMB,InferenceContext18>*/ inferenceContexts;
+	private InnerInferenceHelper innerInferenceHelper;
+
 	public ExplicitConstructorCall(int accessMode) {
 		this.accessMode = accessMode;
 	}
@@ -174,7 +192,7 @@
 					i++) {
 					codeStream.aconst_null();
 				}
-				codeStream.invoke(Opcodes.OPC_invokespecial, this.syntheticAccessor, null /* default declaringClass */);
+				codeStream.invoke(Opcodes.OPC_invokespecial, this.syntheticAccessor, null /* default declaringClass */, this.typeArguments);
 			} else {
 				codeStream.invoke(Opcodes.OPC_invokespecial, codegenBinding, null /* default declaringClass */, this.typeArguments);
 			}
@@ -353,8 +371,9 @@
 				}
 			}
 			// resolve type arguments (for generic constructor call)
+			long sourceLevel = scope.compilerOptions().sourceLevel;
 			if (this.typeArguments != null) {
-				boolean argHasError = scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_5;
+				boolean argHasError = sourceLevel < ClassFileConstants.JDK1_5;
 				int length = this.typeArguments.length;
 				this.genericTypeArguments = new TypeBinding[length];
 				for (int i = 0; i < length; i++) {
@@ -378,12 +397,10 @@
 			// arguments buffering for the method lookup
 			TypeBinding[] argumentTypes = Binding.NO_PARAMETERS;
 			boolean argsContainCast = false;
-			boolean polyExpressionSeen = false;
 			if (this.arguments != null) {
 				boolean argHasError = false; // typeChecks all arguments
 				int length = this.arguments.length;
 				argumentTypes = new TypeBinding[length];
-				TypeBinding argumentType;
 				for (int i = 0; i < length; i++) {
 					Expression argument = this.arguments[i];
 					if (argument instanceof CastExpression) {
@@ -391,11 +408,13 @@
 						argsContainCast = true;
 					}
 					argument.setExpressionContext(INVOCATION_CONTEXT);
-					if ((argumentType = argumentTypes[i] = argument.resolveType(scope)) == null) {
+					if ((argumentTypes[i] = argument.resolveType(scope)) == null) {
 						argHasError = true;
 					}
-					if (argumentType != null && argumentType.kind() == Binding.POLY_TYPE)
-						polyExpressionSeen = true;
+					if (sourceLevel >= ClassFileConstants.JDK1_8 && argument.isPolyExpression()) {
+						if (this.innerInferenceHelper == null)
+							this.innerInferenceHelper = new InnerInferenceHelper();
+					}
 				}
 				if (argHasError) {
 					if (receiverType == null) {
@@ -406,7 +425,7 @@
 					for (int i = length; --i >= 0;) {
 						pseudoArgs[i] = argumentTypes[i] == null ? TypeBinding.NULL : argumentTypes[i]; // replace args with errors with null type
 					}
-					this.binding = scope.findMethod(receiverType, TypeConstants.INIT, pseudoArgs, this);
+					this.binding = scope.findMethod(receiverType, TypeConstants.INIT, pseudoArgs, this, false);
 					if (this.binding != null && !this.binding.isValidBinding()) {
 						MethodBinding closestMatch = ((ProblemMethodBinding)this.binding).closestMatch;
 						// record the closest match, for clients who may still need hint about possible method match
@@ -432,9 +451,8 @@
 			if (receiverType == null) {
 				return;
 			}
-			this.binding = scope.getConstructor(receiverType, argumentTypes, this);
-			if (polyExpressionSeen && polyExpressionsHaveErrors(scope, this.binding, this.arguments, argumentTypes))
-				return;
+			this.binding = findConstructorBinding(scope, this, receiverType, argumentTypes);
+
 			if (this.binding.isValidBinding()) {
 				if ((this.binding.tagBits & TagBits.HasMissingType) != 0) {
 					if (!methodScope.enclosingSourceType().isAnonymousType()) {
@@ -496,4 +514,59 @@
 		}
 		visitor.endVisit(this, scope);
 	}
+
+	// -- interface Invocation: --
+	public MethodBinding binding(TypeBinding targetType, boolean reportErrors, Scope scope) {
+		if (reportErrors) {
+			if (this.binding == null)
+				scope.problemReporter().genericInferenceError("constructor is unexpectedly unresolved", this); //$NON-NLS-1$
+			else if (!this.binding.isValidBinding())
+				scope.problemReporter().invalidConstructor(this, this.binding);
+		}
+		return this.binding;
+	}
+	public Expression[] arguments() {
+		return this.arguments;
+	}
+	public boolean updateBindings(MethodBinding updatedBinding, TypeBinding targetType) {
+		boolean hasUpdate = this.binding != updatedBinding;
+		if (this.inferenceContexts != null) {
+			InferenceContext18 ctx = (InferenceContext18)this.inferenceContexts.removeKey(this.binding);
+			if (ctx != null && updatedBinding instanceof ParameterizedGenericMethodBinding) {
+				this.inferenceContexts.put(updatedBinding, ctx);
+				// solution may have come from an outer inference, mark now that this (inner) is done (but not deep inners):
+				hasUpdate |= ctx.registerSolution(targetType, updatedBinding);
+			}
+		}
+		this.binding = updatedBinding;
+		return hasUpdate;
+	}
+	public void registerInferenceContext(ParameterizedGenericMethodBinding method, InferenceContext18 infCtx18) {
+		if (this.inferenceContexts == null)
+			this.inferenceContexts = new SimpleLookupTable();
+		this.inferenceContexts.put(method, infCtx18);
+	}
+	public InferenceContext18 getInferenceContext(ParameterizedMethodBinding method) {
+		if (this.inferenceContexts == null)
+			return null;
+		return (InferenceContext18) this.inferenceContexts.get(method);
+	}
+	public boolean usesInference() {
+		return (this.binding instanceof ParameterizedGenericMethodBinding) 
+				&& getInferenceContext((ParameterizedGenericMethodBinding) this.binding) != null;
+	}
+	public boolean innersNeedUpdate() {
+		return this.innerInferenceHelper != null;
+	}
+	public void innerUpdateDone() {
+		this.innerInferenceHelper = null;
+	}
+	public InnerInferenceHelper innerInferenceHelper() {
+		return this.innerInferenceHelper;
+	}
+
+	// -- interface InvocationSite: --
+	public InferenceContext18 freshInferenceContext(Scope scope) {
+		return new InferenceContext18(scope, this.arguments, this);
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Expression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Expression.java
index a7b0a1e..353916f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Expression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Expression.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - Contributions for 
@@ -20,6 +16,15 @@
  *								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 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 426792 - [1.8][inference][impl] generify new type inference engine
+ *								Bug 423505 - [1.8] Implement "18.5.4 More Specific Method Inference"
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *								Bug 426996 - [1.8][inference] try to avoid method Expression.unresolve()?
+ *								Bug 428274 - [1.8] [compiler] Cannot cast from Number to double
+ *								Bug 428352 - [1.8][compiler] Resolution errors don't always surface
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -53,7 +58,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ShouldNotImplement;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Messages;
 
-public abstract class Expression extends Statement implements ExpressionContext {
+public abstract class Expression extends Statement {
 
 	public Constant constant;
 
@@ -259,7 +264,7 @@
 	boolean use17specifics = scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_7;
 	if (castType.isBaseType()) {
 		if (expressionType.isBaseType()) {
-			if (expressionType == castType) {
+			if (TypeBinding.equalsEquals(expressionType, castType)) {
 				if (expression != null) {
 					this.constant = expression.constant; //use the same constant
 				}
@@ -279,8 +284,10 @@
 				return true;
 
 			}
-		} else if (use17specifics && expressionType.id == TypeIds.T_JavaLangObject){
-			// cast from Object to base type allowed from 1.7, see JLS $5.5
+		} else if (use17specifics && castType.isPrimitiveType() && expressionType instanceof ReferenceBinding && 
+				!expressionType.isBoxedPrimitiveType() && checkCastTypesCompatibility(scope, scope.boxing(castType), expressionType, expression)) {
+			// cast from any reference type (other than boxing types) to base type allowed from 1.7, see JLS $5.5
+			// by our own interpretation (in accordance with javac) we reject arays, though.
 			return true;
 		} else if (use15specifics
 							&& scope.environment().computeBoxingType(expressionType).isCompatibleWith(castType)) { // unboxing - only widening match is allowed
@@ -314,7 +321,7 @@
 			return false;
 
 		case Binding.ARRAY_TYPE :
-			if (castType == expressionType) {
+			if (TypeBinding.equalsEquals(castType, expressionType)) {
 				tagAsUnnecessaryCast(scope, castType);
 				return true; // identity conversion
 			}
@@ -324,7 +331,7 @@
 					TypeBinding castElementType = ((ArrayBinding) castType).elementsType();
 					TypeBinding exprElementType = ((ArrayBinding) expressionType).elementsType();
 					if (exprElementType.isBaseType() || castElementType.isBaseType()) {
-						if (castElementType == exprElementType) {
+						if (TypeBinding.equalsEquals(castElementType, exprElementType)) {
 							tagAsNeedCheckCast();
 							return true;
 						}
@@ -436,7 +443,7 @@
 								int exprMethodsLength = expressionTypeMethods.length;
 								for (int i = 0, castMethodsLength = castTypeMethods.length; i < castMethodsLength; i++) {
 									for (int j = 0; j < exprMethodsLength; j++) {
-										if ((castTypeMethods[i].returnType != expressionTypeMethods[j].returnType)
+										if ((TypeBinding.notEquals(castTypeMethods[i].returnType, expressionTypeMethods[j].returnType))
 												&& (CharOperation.equals(castTypeMethods[i].selector, expressionTypeMethods[j].selector))
 												&& castTypeMethods[i].areParametersEqual(expressionTypeMethods[j])) {
 											return false;
@@ -560,19 +567,19 @@
  * @return could this expression be checked by the current implementation?
  */
 public boolean checkNPE(BlockScope scope, FlowContext flowContext, FlowInfo flowInfo) {
+	boolean isNullable = false;
 	if (this.resolvedType != null) {
+		// 1. priority: @NonNull
 		if ((this.resolvedType.tagBits & TagBits.AnnotationNonNull) != 0) {
 			return true; // no danger
 		} else if ((this.resolvedType.tagBits & TagBits.AnnotationNullable) != 0) {
-			scope.problemReporter().dereferencingNullableExpression(this, scope.environment());
-			return true; // danger is definite.
-			// stopping analysis at this point requires that the above error is not suppressable
-			// unless suppressing all null warnings (otherwise we'd miss a stronger warning below).
+			isNullable = true;
 		}
 	}
 	LocalVariableBinding local = localVariableBinding();
 	if (local != null &&
 			(local.type.tagBits & TagBits.IsBaseType) == 0) {
+		// 2. priority: local with flow analysis (via the FlowContext)
 		if ((this.bits & ASTNode.IsNonNull) == 0) {
 			flowContext.recordUsingNullReference(scope, local, this,
 					FlowContext.MAY_NULL, flowInfo);
@@ -585,6 +592,10 @@
 			// from thereon it is set
 		flowContext.markFinallyNullStatus(local, FlowInfo.NON_NULL);
 		return true;
+	} else if (isNullable) {
+		// 3. priority: @Nullable without a local
+		scope.problemReporter().dereferencingNullableExpression(this);
+		return true;
 	}
 	return false; // not checked
 }
@@ -601,7 +612,7 @@
 }
 
 public boolean checkUnsafeCast(Scope scope, TypeBinding castType, TypeBinding expressionType, TypeBinding match, boolean isNarrowing) {
-	if (match == castType) {
+	if (TypeBinding.equalsEquals(match, castType)) {
 		if (!isNarrowing) tagAsUnnecessaryCast(scope, castType);
 		return true;
 	}
@@ -637,7 +648,7 @@
 		}
 	} else if (compileTimeType != TypeBinding.NULL && compileTimeType.isBaseType()) {
 		TypeBinding boxedType = scope.environment().computeBoxingType(runtimeType);
-		if (boxedType == runtimeType) // Object o = 12;
+		if (TypeBinding.equalsEquals(boxedType, runtimeType)) // Object o = 12;
 			boxedType = compileTimeType;
 		this.implicitConversion = TypeIds.BOXING | (boxedType.id << 4) + compileTimeType.id;
 		scope.problemReporter().autoboxing(this, compileTimeType, scope.environment().computeBoxingType(boxedType));
@@ -647,9 +658,12 @@
 		return;
 	}
 	int compileTimeTypeID, runtimeTypeID;
-	if ((compileTimeTypeID = compileTimeType.id) == TypeIds.NoId) { // e.g. ? extends String  ==> String (103227)
+	if ((compileTimeTypeID = compileTimeType.id) >= TypeIds.T_LastWellKnownTypeId) { // e.g. ? extends String  ==> String (103227); >= TypeIds.T_LastWellKnownTypeId implies TypeIds.NoId
 		compileTimeTypeID = compileTimeType.erasure().id == TypeIds.T_JavaLangString ? TypeIds.T_JavaLangString : TypeIds.T_JavaLangObject;
+	} else if (runtimeType.isPrimitiveType() && compileTimeType instanceof ReferenceBinding && !compileTimeType.isBoxedPrimitiveType()) {
+		compileTimeTypeID = TypeIds.T_JavaLangObject; // treatment is the same as for jlO.
 	}
+
 	switch (runtimeTypeID = runtimeType.id) {
 		case T_byte :
 		case T_short :
@@ -819,15 +833,15 @@
 }
 
 private MethodBinding[] getAllOriginalInheritedMethods(ReferenceBinding binding) {
-	ArrayList collector = new ArrayList();
+	ArrayList<MethodBinding> collector = new ArrayList<MethodBinding>();
 	getAllInheritedMethods0(binding, collector);
 	for (int i = 0, len = collector.size(); i < len; i++) {
-		collector.set(i, ((MethodBinding)collector.get(i)).original());
+		collector.set(i, collector.get(i).original());
 	}
-	return (MethodBinding[]) collector.toArray(new MethodBinding[collector.size()]);
+	return collector.toArray(new MethodBinding[collector.size()]);
 }
 
-private void getAllInheritedMethods0(ReferenceBinding binding, ArrayList collector) {
+private void getAllInheritedMethods0(ReferenceBinding binding, ArrayList<MethodBinding> collector) {
 	if (!binding.isInterface()) return;
 	MethodBinding[] methodBindings = binding.methods();
 	for (int i = 0, max = methodBindings.length; i < max; i++) {
@@ -887,7 +901,7 @@
 
 	if (this.constant == Constant.NotAConstant)
 		return false;
-	if (constantType == targetType)
+	if (TypeBinding.equalsEquals(constantType, targetType))
 		return true;
 	//No free assignment conversion from anything but to integral ones.
 	if (BaseTypeBinding.isWidening(TypeIds.T_int, constantType.id)
@@ -943,6 +957,9 @@
 	return this.constant;
 }
 
+public boolean isPertinentToApplicability(TypeBinding targetType, MethodBinding method) {
+	return true;
+}
 /**
  * Returns the type of the expression after required implicit conversions. When expression type gets promoted
  * or inserted a generic cast, the converted type will differ from the resolved type (surface side-effects from
@@ -1030,7 +1047,7 @@
 	setExpectedType(expectedType); // needed in case of generic method invocation
 	TypeBinding expressionType = this.resolveType(scope);
 	if (expressionType == null) return null;
-	if (expressionType == expectedType) return expressionType;
+	if (TypeBinding.equalsEquals(expressionType, expectedType)) return expressionType;
 
 	if (!expressionType.isCompatibleWith(expectedType)) {
 		if (scope.isBoxingCompatibleWith(expressionType, expectedType)) {
@@ -1042,6 +1059,17 @@
 	}
 	return expressionType;
 }
+
+/**
+ * Once outer contexts have finalized the target type for this expression,
+ * perform any checks that might have been delayed previously.
+ * @param targetType the final target type (aka expectedType) for this expression.
+ * @param scope scope for error reporting
+ */
+public TypeBinding checkAgainstFinalTargetType(TypeBinding targetType, Scope scope) {
+	return this.resolvedType; // subclasses may choose to do real stuff here
+}
+
 /**
  * Returns true if the receiver is forced to be of raw type either to satisfy the contract imposed
  * by a super type or because it *is* raw and the current type has no control over it (i.e the rawness
@@ -1057,12 +1085,12 @@
 			if (field.type.isRawType()) {
 				if (referenceContext instanceof AbstractMethodDeclaration) {
 					AbstractMethodDeclaration methodDecl = (AbstractMethodDeclaration) referenceContext;
-					if (field.declaringClass != methodDecl.binding.declaringClass) { // inherited raw field, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=337962
+					if (TypeBinding.notEquals(field.declaringClass, methodDecl.binding.declaringClass)) { // inherited raw field, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=337962
 						return true;
 					}
 				} else if (referenceContext instanceof TypeDeclaration) {
 					TypeDeclaration type = (TypeDeclaration) referenceContext;
-					if (field.declaringClass != type.binding) { // inherited raw field, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=337962
+					if (TypeBinding.notEquals(field.declaringClass, type.binding)) { // inherited raw field, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=337962
 						return true;
 					}
 				}
@@ -1082,12 +1110,12 @@
 		if (field.type.isRawType()) {
 			if (referenceContext instanceof AbstractMethodDeclaration) {
 				AbstractMethodDeclaration methodDecl = (AbstractMethodDeclaration) referenceContext;
-				if (field.declaringClass != methodDecl.binding.declaringClass) { // inherited raw field, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=337962
+				if (TypeBinding.notEquals(field.declaringClass, methodDecl.binding.declaringClass)) { // inherited raw field, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=337962
 					return true;
 				}
 			} else if (referenceContext instanceof TypeDeclaration) {
 				TypeDeclaration type = (TypeDeclaration) referenceContext;
-				if (field.declaringClass != type.binding) { // inherited raw field, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=337962
+				if (TypeBinding.notEquals(field.declaringClass, type.binding)) { // inherited raw field, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=337962
 					return true;
 				}
 			}
@@ -1130,27 +1158,25 @@
 }
 
 public boolean isCompatibleWith(TypeBinding left, Scope scope) {
-	throw new UnsupportedOperationException("Unexpected control flow, should not have reached Expression.isCompatibleWith"); //$NON-NLS-1$
+	return this.resolvedType != null && this.resolvedType.isCompatibleWith(left,  scope);
 }
 
-public boolean tIsMoreSpecific(TypeBinding t, TypeBinding s) {
-	TypeBinding expressionType = this.resolvedType;
-	if (expressionType == null || !expressionType.isValidBinding()) // Shouldn't get here, just to play it safe
-		return false; // trigger ambiguity.
-	
-	if (t.findSuperTypeOriginatingFrom(s) == s)
-		return true;
-	
-	final boolean tIsBaseType = t.isBaseType();
-	final boolean sIsBaseType = s.isBaseType();
-	
-	return expressionType.isBaseType() ? tIsBaseType && !sIsBaseType : !tIsBaseType && sIsBaseType;
+public boolean isBoxingCompatibleWith(TypeBinding left, Scope scope) {
+	return isBoxingCompatible(this.resolvedType, left, this, scope);
+}
+
+public boolean sIsMoreSpecific(TypeBinding s, TypeBinding t, Scope scope) {
+	return s.isCompatibleWith(t, scope);
 }
 
 public void tagAsEllipsisArgument() {
 	// don't care. Subclasses that are poly expressions in specific contexts should listen in and make note.
 }
 
+public boolean isExactMethodReference() {
+	return false;
+}
+
 /* Answer if the receiver is a poly expression in the prevailing context. Caveat emptor: Some constructs (notably method calls)
    cannot answer this question until after resolution is over and may throw unsupported operation exception if queried ahead of 
    resolution. Default implementation here returns false which is true for vast majority of AST nodes. The ones that are poly
@@ -1159,6 +1185,11 @@
 public boolean isPolyExpression() throws UnsupportedOperationException {
 	return false;
 }
+/** Variant of isPolyExpression() to be used during type inference, when a resolution candidate exists. */
+public boolean isPolyExpression(MethodBinding method) {
+	return false;
+}
+
 
 public void tagAsNeedCheckCast() {
     // do nothing by default
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext.java
index f6a29e5..47d3fde 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ExpressionContext.java
@@ -1,66 +1,73 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
-public interface ExpressionContext {
+public enum ExpressionContext {
 	
-	/* Assignment context: potential poly-expressions are: method invocations, lambdas, reference expressions, 
+	/** Assignment context: potential poly-expressions are: method invocations, lambdas, reference expressions, 
 	   conditional expressions and allocation expressions. This is the only Java 7 context where target type
 	   influenced evaluation of some expression.
 	   
 	   Context induced by: ReturnStatement, ArrayInitializer, Assignment, FieldDeclaration and LocalDeclaration. 
 	*/
-	public static final ExpressionContext ASSIGNMENT_CONTEXT = 
-								new ExpressionContext() {
-									public String toString() {
-										return "assignment context"; //$NON-NLS-1$
-									}
-								};
+	ASSIGNMENT_CONTEXT { 
+		public String toString() {
+			return "assignment context"; //$NON-NLS-1$
+		}
+		public boolean definesTargetType() {
+			return true;
+		}
+	},
 	
-	/* Invocation context: potential poly-expressions are: method invocations, lambdas, reference expressions, 
+	/** Invocation context: potential poly-expressions are: method invocations, lambdas, reference expressions, 
 	   conditional expressions and allocation expressions. At this point, we don't distinguish between strict 
 	   and loose invocation contexts - we may have to cross the bridge some day.
 	   
 	   Context induced by: AllocationExpression, QualifiedAllocationExpression, ExplicitConstructorCall, MessageSend
 	   CodeSnippetAllocationExpression and CodeSnippetMessageSend.
 	*/													
-	public static final ExpressionContext INVOCATION_CONTEXT = 
-								new ExpressionContext() {
-									public String toString() {
-										return "invocation context"; //$NON-NLS-1$
-									}
-								};
+	INVOCATION_CONTEXT {
+		public String toString() {
+			return "invocation context"; //$NON-NLS-1$
+		}
+		public boolean definesTargetType() {
+			return true;
+		}
+	},
 	
-	/* Casting context: potential poly-expressions are: lambdas and reference expressions
+	/** Casting context: potential poly-expressions are: lambdas and reference expressions
 	   Context induced by: CastExpression.
 	*/
-	public static final ExpressionContext CASTING_CONTEXT = 
-								new ExpressionContext() {
-									public String toString() {
-										return "casting context"; //$NON-NLS-1$
-									}
-								};
+	CASTING_CONTEXT {
+		public String toString() {
+			return "casting context"; //$NON-NLS-1$
+		}
+		public boolean definesTargetType() {
+			return false;
+		}
+	},
 	
-	/* Vanilla context (string, numeric): potential poly-expressions are: NONE. This is the nonpoly context in which 
+	/** Vanilla context (string, numeric): potential poly-expressions are: NONE. This is the nonpoly context in which 
 	   expressions get evaluated, unless they feature in one of the above contexts. 
 	*/
-	public static final ExpressionContext VANILLA_CONTEXT = 
-								new ExpressionContext() {
-									public String toString() {
-										return "vanilla context"; //$NON-NLS-1$
-									}
-								};
-		
+	VANILLA_CONTEXT {
+		public String toString() {
+			return "vanilla context"; //$NON-NLS-1$
+		}
+		public boolean definesTargetType() {
+			return false;
+		}
+	};
+
+	public abstract boolean definesTargetType();
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java
index 2475062..021950d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2011, 2013 GK Software AG and others.
+ * Copyright (c) 2011, 2014 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
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     Stephan Herrmann - initial API and implementation
+ *     Nikolay Metchev (nikolaymetchev@gmail.com) - Contributions for
+ *								bug 411098 - [compiler][resource] Invalid Resource Leak Warning using ternary operator inside try-with-resource
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -27,6 +29,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
@@ -43,6 +46,7 @@
  * 
  * See bug 349326 - [1.7] new warning for missing try-with-resources
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class FakedTrackingVariable extends LocalDeclaration {
 
 	private static final char[] UNASSIGNED_CLOSEABLE_NAME = "<unassigned Closeable value>".toCharArray(); //$NON-NLS-1$
@@ -160,6 +164,13 @@
 				expression = ((CastExpression) expression).expression;
 			else if (expression instanceof Assignment)
 				expression = ((Assignment) expression).expression;
+			else if (expression instanceof ConditionalExpression) {
+				FakedTrackingVariable falseTrackingVariable = getCloseTrackingVariable(((ConditionalExpression)expression).valueIfFalse, flowInfo, flowContext);
+				if (falseTrackingVariable != null) {
+					return falseTrackingVariable;
+				}
+				return getCloseTrackingVariable(((ConditionalExpression)expression).valueIfTrue, flowInfo, flowContext);
+			}
 			else
 				break;
 		}
@@ -202,7 +213,7 @@
 	 */
 	public static void preConnectTrackerAcrossAssignment(ASTNode location, LocalVariableBinding local, Expression rhs, FlowInfo flowInfo) {
 		FakedTrackingVariable closeTracker = null;
-		if (rhs instanceof AllocationExpression) {
+		if (containsAllocation(rhs)) {
 			closeTracker = local.closeTracker;
 			if (closeTracker == null) {
 				if (rhs.resolvedType != TypeBinding.NULL) { // not NULL means valid closeable as per method precondition
@@ -214,16 +225,45 @@
 			}
 			if (closeTracker != null) {
 				closeTracker.currentAssignment = location;
-				AllocationExpression allocation = (AllocationExpression)rhs;
-				allocation.closeTracker = closeTracker;
-				if (allocation.arguments != null && allocation.arguments.length > 0) {
-					// also push into nested allocations, see https://bugs.eclipse.org/368709
-					preConnectTrackerAcrossAssignment(location, local, allocation.arguments[0], flowInfo);
-				}
+				preConnectTrackerAcrossAssignment(location, local, flowInfo, closeTracker, rhs);
 			}
 		}
 	}
 
+	private static boolean containsAllocation(ASTNode location) {
+		if (location instanceof AllocationExpression)
+			return true;
+		if (location instanceof ConditionalExpression) {
+			ConditionalExpression conditional = (ConditionalExpression) location;
+			return containsAllocation(conditional.valueIfTrue) || containsAllocation(conditional.valueIfFalse);
+		}
+		return false;
+	}
+
+	private static void preConnectTrackerAcrossAssignment(ASTNode location, LocalVariableBinding local, FlowInfo flowInfo,
+			FakedTrackingVariable closeTracker, Expression expression) {
+		if (expression instanceof AllocationExpression) {
+			preConnectTrackerAcrossAssignment(location, local, flowInfo, (AllocationExpression) expression, closeTracker);
+		} else if (expression instanceof ConditionalExpression) {
+			preConnectTrackerAcrossAssignment(location, local, flowInfo, (ConditionalExpression) expression, closeTracker);
+		}
+	}
+
+	private static void preConnectTrackerAcrossAssignment(ASTNode location, LocalVariableBinding local, FlowInfo flowInfo,
+			ConditionalExpression conditional, FakedTrackingVariable closeTracker) {
+		preConnectTrackerAcrossAssignment(location, local, flowInfo, closeTracker, conditional.valueIfFalse);
+		preConnectTrackerAcrossAssignment(location, local, flowInfo, closeTracker, conditional.valueIfTrue);
+	}
+
+	private static void preConnectTrackerAcrossAssignment(ASTNode location, LocalVariableBinding local, FlowInfo flowInfo,
+			AllocationExpression allocationExpression, FakedTrackingVariable closeTracker) {
+		allocationExpression.closeTracker = closeTracker;
+		if (allocationExpression.arguments != null && allocationExpression.arguments.length > 0) {
+			// also push into nested allocations, see https://bugs.eclipse.org/368709
+			preConnectTrackerAcrossAssignment(location, local, allocationExpression.arguments[0], flowInfo);
+		}
+	}
+
 	/** 
 	 * Compute/assign a tracking variable for a freshly allocated closeable value, using information from our white lists.
 	 * See  Bug 358903 - Filter practically unimportant resource leak warnings 
@@ -260,6 +300,9 @@
 								newStatus = finallyStatus;
 						}
 					}
+					if (allocation.closeTracker.innerTracker != null) {
+						innerTracker = pickMoreUnsafe(allocation.closeTracker.innerTracker, innerTracker, scope, flowInfo);
+					}
 					allocation.closeTracker.innerTracker = innerTracker;
 					innerTracker.outerTracker = allocation.closeTracker;
 					flowInfo.markNullStatus(allocation.closeTracker.binding, newStatus);
@@ -297,6 +340,23 @@
 		}
 	}
 
+	private static FakedTrackingVariable pickMoreUnsafe(FakedTrackingVariable tracker1, FakedTrackingVariable tracker2, BlockScope scope, FlowInfo info) {
+		// whichever of the two trackers has stronger indication to be leaking will be returned,
+		// the other one will be removed from the scope (considered to be merged into the former).
+		int status1 = info.nullStatus(tracker1.binding);
+		int status2 = info.nullStatus(tracker2.binding);
+		if (status1 == FlowInfo.NULL || status2 == FlowInfo.NON_NULL) return pick(tracker1, tracker2, scope);
+		if (status1 == FlowInfo.NON_NULL || status2 == FlowInfo.NULL) return pick(tracker2, tracker1, scope);
+		if ((status1 & FlowInfo.POTENTIALLY_NULL) != 0) return pick(tracker1, tracker2, scope);
+		if ((status2 & FlowInfo.POTENTIALLY_NULL) != 0) return pick(tracker2, tracker1, scope);
+		return pick(tracker1, tracker2, scope);
+	}
+
+	private static FakedTrackingVariable pick(FakedTrackingVariable tracker1, FakedTrackingVariable tracker2, BlockScope scope) {
+		scope.removeTrackingVar(tracker2);
+		return tracker1;
+	}
+
 	private static void handleRegularResource(BlockScope scope, FlowInfo flowInfo, AllocationExpression allocation) {
 		FakedTrackingVariable presetTracker = allocation.closeTracker;
 		if (presetTracker != null && presetTracker.originalBinding != null) {
@@ -341,8 +401,8 @@
 	}
 
 	/** 
-	 * Check if the rhs of an assignment or local declaration is an (Auto)Closeable.
-	 * If so create or re-use a tracking variable, and wire and initialize everything.
+	 * Given the rhs of an assignment or local declaration has a (Auto)Closeable type (or null), setup for leak analysis now:
+	 * Create or re-use a tracking variable, and wire and initialize everything.
 	 * @param scope scope containing the assignment
 	 * @param upstreamInfo info without analysis of the rhs, use this to determine the status of a resource being disconnected
 	 * @param flowInfo info with analysis of the rhs, use this for recording resource status because this will be passed downstream
@@ -380,7 +440,7 @@
 						rhsTrackVar.globalClosingState &= ~(SHARED_WITH_OUTSIDE|OWNED_BY_OUTSIDE);
 					}
 				} else {
-					if (rhs instanceof AllocationExpression) {
+					if (rhs instanceof AllocationExpression || rhs instanceof ConditionalExpression) {
 						if (rhsTrackVar == disconnectedTracker)
 							return;									// 		b.: self wrapper: res = new Wrap(res); -> done!
 						if (local.closeTracker == rhsTrackVar 
@@ -464,6 +524,17 @@
 				break;
 		}
 
+		boolean isResourceProducer = false;
+		if (expression.resolvedType instanceof ReferenceBinding) {
+			ReferenceBinding resourceType = (ReferenceBinding) expression.resolvedType;
+			if (resourceType.hasTypeBit(TypeIds.BitResourceFreeCloseable)) {
+				if (isBlacklistedMethod(expression))
+					isResourceProducer = true;
+				else
+					return null; // (a) resource-free closeable: -> null
+			}
+		}
+
 		// analyze by node type:
 		if (expression instanceof AllocationExpression) {
 			// allocation expressions already have their tracking variables analyzed by analyseCloseableAllocation(..)
@@ -478,7 +549,8 @@
 		{
 			// we *might* be responsible for the resource obtained
 			FakedTrackingVariable tracker = new FakedTrackingVariable(local, location, flowInfo, flowContext, FlowInfo.POTENTIALLY_NULL); // shed some doubt
-			tracker.globalClosingState |= SHARED_WITH_OUTSIDE;
+			if (!isResourceProducer)
+				tracker.globalClosingState |= SHARED_WITH_OUTSIDE;
 			return tracker;
 		} else if (
 				(expression.bits & RestrictiveFlagMASK) == Binding.FIELD
@@ -492,13 +564,6 @@
 			return tracker;			
 		}
 
-		if (expression.resolvedType instanceof ReferenceBinding) {
-			ReferenceBinding resourceType = (ReferenceBinding) expression.resolvedType;
-			if (resourceType.hasTypeBit(TypeIds.BitResourceFreeCloseable)) {
-				// (a) resource-free closeable: -> null
-				return null;
-			}
-		}
 		if (local.closeTracker != null)
 			// (c): inner has already been analyzed: -> re-use track var
 			return local.closeTracker;
@@ -510,6 +575,16 @@
 		return newTracker;
 	}
 
+	private static boolean isBlacklistedMethod(Expression expression) {
+		if (expression instanceof MessageSend) {
+			MethodBinding method = ((MessageSend) expression).binding;
+			if (method != null && method.isValidBinding())
+				// for all methods in java.nio.file.Files that return a resource (Stream) it really needs closing
+				return CharOperation.equals(method.declaringClass.compoundName, TypeConstants.JAVA_NIO_FILE_FILES);
+		}
+		return false;
+	}
+
 	public static void cleanUpAfterAssignment(BlockScope currentScope, int lhsBits, Expression expression) {
 		// remove all remaining track vars with no original binding
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java
index 1d11650..bd19a3a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java
@@ -1,25 +1,27 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								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 400761 - [compiler][null] null may be return as boolean without a diagnostic
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *								Bug 429403 - [1.8][null] null mismatch from type arguments is not reported at field initializer
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *								Bug 409250 - [1.8][compiler] Various loose ends in 308 code generation
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
 import java.util.List;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.ASSIGNMENT_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.core.compiler.IProblem;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.*;
@@ -32,6 +34,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings("rawtypes")
 public class FieldDeclaration extends AbstractVariableDeclaration {
 
 	public FieldBinding binding;
@@ -86,13 +89,12 @@
 				.unconditionalInits();
 		flowInfo.markAsDefinitelyAssigned(this.binding);
 	}
-	if (this.initialization != null) {
-		if (this.binding.isNonNull()) {
-			int nullStatus = this.initialization.nullStatus(flowInfo, flowContext);
-			// check against annotation @NonNull:
-			if (nullStatus != FlowInfo.NON_NULL) {
-				char[][] annotationName = initializationScope.environment().getNonNullAnnotationName();
-				initializationScope.problemReporter().nullityMismatch(this.initialization, this.initialization.resolvedType, this.binding.type, nullStatus, annotationName);
+	if (this.initialization != null && this.binding != null) {
+		CompilerOptions options = initializationScope.compilerOptions();
+		if (options.isAnnotationBasedNullAnalysisEnabled) {
+			if (this.binding.isNonNull() || options.sourceLevel >= ClassFileConstants.JDK1_8) {
+				int nullStatus = this.initialization.nullStatus(flowInfo, flowContext);
+				NullAnnotationMatching.checkAssignment(initializationScope, flowContext, this.binding, nullStatus, this.initialization, this.initialization.resolvedType);
 			}
 		}
 		this.initialization.checkNPEbyUnboxing(initializationScope, flowContext, flowInfo);
@@ -132,7 +134,7 @@
 	codeStream.recordPositionsFrom(pc, this.sourceStart);
 }
 public void getAllAnnotationContexts(int targetType, List allAnnotationContexts) {
-	AnnotationCollector collector = new AnnotationCollector(this, targetType, allAnnotationContexts);
+	AnnotationCollector collector = new AnnotationCollector(this.type, targetType, allAnnotationContexts);
 	for (int i = 0, max = this.annotations.length; i < max; i++) {
 		Annotation annotation = this.annotations[i];
 		annotation.traverse(collector, (BlockScope) null);
@@ -225,6 +227,17 @@
 		initializationScope.lastVisibleFieldID = this.binding.id;
 
 		resolveAnnotations(initializationScope, this.annotations, this.binding);
+		// Check if this declaration should now have the type annotations bit set
+		if (this.annotations != null) {
+			for (int i = 0, max = this.annotations.length; i < max; i++) {
+				TypeBinding resolvedAnnotationType = this.annotations[i].resolvedType;
+				if (resolvedAnnotationType != null && (resolvedAnnotationType.getAnnotationTagBits() & TagBits.AnnotationForTypeUse) != 0) {
+					this.bits |= ASTNode.HasTypeAnnotations;
+					break;
+				}
+			}
+		}
+		
 		// check @Deprecated annotation presence
 		if ((this.binding.getAnnotationTagBits() & TagBits.AnnotationDeprecated) == 0
 				&& (this.binding.modifiers & ClassFileConstants.AccDeprecated) != 0
@@ -250,7 +263,7 @@
 				}
 			} else if ((initializationType = this.initialization.resolveType(initializationScope)) != null) {
 
-				if (fieldType != initializationType) // must call before computeConversion() and typeMismatchError()
+				if (TypeBinding.notEquals(fieldType, initializationType)) // must call before computeConversion() and typeMismatchError()
 					initializationScope.compilationUnitScope().recordTypeConversion(fieldType, initializationType);
 				if (this.initialization.isConstantValueOfTypeAssignableToType(initializationType, fieldType)
 						|| initializationType.isCompatibleWith(fieldType, classScope)) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldReference.java
index 44974bd..d270630 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FieldReference.java
@@ -12,6 +12,8 @@
  *								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
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
  *     Jesper S Moller - Contributions for
  *								Bug 378674 - "The method can be declared as static" is wrong
  *******************************************************************************/
@@ -28,6 +30,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
@@ -123,6 +126,7 @@
 		if (   !isCompound
 			&& this.receiver.isThis()
 			&& !(this.receiver instanceof QualifiedThisReference)
+			&& TypeBinding.equalsEquals(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);
 		}		
@@ -286,7 +290,7 @@
 		if (isThisReceiver) {
 			if (isStatic){
 				// if no valueRequired, still need possible side-effects of <clinit> invocation, if field belongs to different class
-				if (this.binding.original().declaringClass != this.actualReceiverType.erasure()) {
+				if (TypeBinding.notEquals(this.binding.original().declaringClass, this.actualReceiverType.erasure())) {
 					MethodBinding accessor = this.syntheticAccessors == null ? null : this.syntheticAccessors[FieldReference.READ];
 					if (accessor == null) {
 						TypeBinding constantPoolDeclaringClass = CodeStream.getConstantPoolDeclaringClass(currentScope, codegenBinding, this.actualReceiverType, this.receiver.isImplicitThis());
@@ -433,6 +437,10 @@
 	return null;
 }
 
+public InferenceContext18 freshInferenceContext(Scope scope) {
+	return null;
+}
+
 public boolean isEquivalent(Reference reference) {
 	// only consider field references relative to "this":
 	if (this.receiver.isThis() && !(this.receiver instanceof QualifiedThisReference)) {
@@ -516,7 +524,7 @@
 	// if field from parameterized type got found, use the original field at codegen time
 	FieldBinding codegenBinding = this.binding.original();
 	if (this.binding.isPrivate()) {
-		if ((currentScope.enclosingSourceType() != codegenBinding.declaringClass)
+		if ((TypeBinding.notEquals(currentScope.enclosingSourceType(), codegenBinding.declaringClass))
 				&& this.binding.constant() == Constant.NotAConstant) {
 			if (this.syntheticAccessors == null)
 				this.syntheticAccessors = new MethodBinding[2];
@@ -625,7 +633,7 @@
 	}
 	if (receiverCast) {
 		 // due to change of declaring class with receiver type, only identity cast should be notified
-		if (((CastExpression)this.receiver).expression.resolvedType == this.actualReceiverType) {
+		if (TypeBinding.equalsEquals(((CastExpression)this.receiver).expression.resolvedType, this.actualReceiverType)) {
 				scope.problemReporter().unnecessaryCast((CastExpression)this.receiver);
 		}
 	}
@@ -668,7 +676,7 @@
 	TypeBinding oldReceiverType = this.actualReceiverType;
 	this.actualReceiverType = this.actualReceiverType.getErasureCompatibleType(fieldBinding.declaringClass);
 	this.receiver.computeConversion(scope, this.actualReceiverType, this.actualReceiverType);
-	if (this.actualReceiverType != oldReceiverType && this.receiver.postConversionType(scope) != this.actualReceiverType) { // record need for explicit cast at codegen since receiver could not handle it
+	if (TypeBinding.notEquals(this.actualReceiverType, oldReceiverType) && TypeBinding.notEquals(this.receiver.postConversionType(scope), this.actualReceiverType)) { // record need for explicit cast at codegen since receiver could not handle it
 		this.bits |= NeedReceiverGenericCast;
 	}
 	if (isFieldUseDeprecated(fieldBinding, scope, this.bits)) {
@@ -685,7 +693,7 @@
 		}
 		ReferenceBinding declaringClass = this.binding.declaringClass;
 		if (!isImplicitThisRcv
-				&& declaringClass != this.actualReceiverType
+				&& TypeBinding.notEquals(declaringClass, this.actualReceiverType)
 				&& declaringClass.canBeSeenBy(scope)) {
 			scope.problemReporter().indirectAccessToStaticField(this, fieldBinding);
 		}
@@ -695,7 +703,7 @@
 			SourceTypeBinding sourceType = scope.enclosingSourceType();
 			if (this.constant == Constant.NotAConstant
 					&& !methodScope.isStatic
-					&& (sourceType == declaringClass || sourceType.superclass == declaringClass) // enum constant body
+					&& (TypeBinding.equalsEquals(sourceType, declaringClass) || TypeBinding.equalsEquals(sourceType.superclass, declaringClass)) // enum constant body
 					&& methodScope.isInsideInitializerOrConstructor()) {
 				scope.problemReporter().enumStaticFieldUsedDuringInitialization(this.binding, this);
 			}
@@ -740,7 +748,7 @@
 public VariableBinding nullAnnotatedVariableBinding(boolean supportTypeAnnotations) {
 	if (this.binding != null) {
 		if (supportTypeAnnotations
-				|| ((this.binding.tagBits & (TagBits.AnnotationNonNull|TagBits.AnnotationNullable)) != 0)) {
+				|| ((this.binding.tagBits & TagBits.AnnotationNullMASK) != 0)) {
 			return this.binding;
 		}
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java
index 814abbc..dcde874 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,8 @@
  *								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 393719 - [compiler] inconsistent warnings on iteration variables
+ *								Bug 411964 - [1.8][null] leverage null type annotation in foreach statement
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *     Jesper S Moller -  Contribution for
  *								bug 401853 - Eclipse Java compiler creates invalid bytecode (java.lang.VerifyError)
  *******************************************************************************/
@@ -108,11 +110,9 @@
 			condInfo.nullInfoLessUnconditionalCopy();
 		actionInfo.markAsDefinitelyUnknown(elementVarBinding);
 		if (currentScope.compilerOptions().isAnnotationBasedNullAnalysisEnabled) {
-			// this currently produces an unavoidable warning against all @NonNull element vars:
-			int nullStatus = this.elementVariable.checkAssignmentAgainstNullAnnotation(currentScope, flowContext, 
-															elementVarBinding, FlowInfo.UNKNOWN, this.collection, this.collectionElementType);
-			// TODO (stephan): 	once we have JSR 308 fetch nullStatus from the collection element type
-			//              	and feed the result into the above check (instead of FlowInfo.UNKNOWN)
+			int elementNullStatus = FlowInfo.tagBitsToNullStatus(this.collectionElementType.tagBits);
+			int nullStatus = NullAnnotationMatching.checkAssignment(currentScope, flowContext, elementVarBinding, elementNullStatus,
+																		this.collection, this.collectionElementType);
 			if ((elementVarBinding.type.tagBits & TagBits.IsBaseType) == 0) {
 				actionInfo.markNullStatus(elementVarBinding, nullStatus);
 			}
@@ -409,7 +409,7 @@
 		this.scope = new BlockScope(upperScope);
 		this.elementVariable.resolve(this.scope); // collection expression can see itemVariable
 		TypeBinding elementType = this.elementVariable.type.resolvedType;
-		TypeBinding collectionType = this.collection == null ? null : this.collection.resolveType(this.scope);
+		TypeBinding collectionType = this.collection == null ? null : this.collection.resolveType(upperScope);
 
 		TypeBinding expectedCollectionType = null;
 		if (elementType != null && collectionType != null) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java
index d25d884..51d3874 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java
@@ -1,30 +1,45 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Contributions for
  *							bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
- *							Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335        
+ *							Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335
+ *     Stephan Herrmann - Contribution for
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *							Bug 423504 - [1.8] Implement "18.5.3 Functional Interface Parameterization Inference"
+ *							Bug 425142 - [1.8][compiler] NPE in ConstraintTypeFormula.reduceSubType
+ *							Bug 425153 - [1.8] Having wildcard allows incompatible types in a lambda expression
+ *							Bug 425156 - [1.8] Lambda as an argument is flagged with incompatible error
+ *							Bug 424403 - [1.8][compiler] Generic method call with method reference argument fails to resolve properly.
+ *							Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *							Bug 428352 - [1.8][compiler] Resolution errors don't always surface
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.VANILLA_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult;
 import org.aspectj.org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
 import org.aspectj.org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowInfo;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.IntersectionCastTypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodVerifier;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemReasons;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding;
@@ -32,26 +47,46 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBindingVisitor;
-import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
 
 public abstract class FunctionalExpression extends Expression {
 	
-	TypeBinding expectedType;
+	protected TypeBinding expectedType;
 	public MethodBinding descriptor;
-	public MethodBinding binding;
+	public MethodBinding binding;                 // Code generation binding. May include synthetics. See getMethodBinding()
+	protected MethodBinding actualMethodBinding;  // void of synthetics.
 	boolean ignoreFurtherInvestigation;
 	protected ExpressionContext expressionContext = VANILLA_CONTEXT;
-	protected SimpleLookupTable resultExpressions;
-	protected boolean hasIgnoredMandatoryErrors = false;
-	protected CompilationResult compilationResult;
-	protected BlockScope enclosingScope;
+	static Expression [] NO_EXPRESSIONS = new Expression[0];
+	protected Expression [] resultExpressions = NO_EXPRESSIONS;
+	public CompilationResult compilationResult;
+	public BlockScope enclosingScope;
 	protected boolean ellipsisArgument;
+	public int bootstrapMethodNumber = -1;
 	protected static IErrorHandlingPolicy silentErrorHandlingPolicy = DefaultErrorHandlingPolicies.ignoreAllProblems();
-	
+	private boolean hasReportedSamProblem = false;
+
 	public FunctionalExpression(CompilationResult compilationResult) {
 		this.compilationResult = compilationResult;
 	}
-
+	
+	public FunctionalExpression() {
+		super();
+	}
+	
+	// for lambda's and reference expressions boxing compatibility is same as vanilla compatibility.
+	public boolean isBoxingCompatibleWith(TypeBinding targetType, Scope scope) {
+		return isCompatibleWith(targetType, scope);
+	}
+	
+	public void setCompilationResult(CompilationResult compilationResult) {
+		this.compilationResult = compilationResult;
+	}
+	
+	// Return the actual (non-code generation) method binding that is void of synthetics.
+	public MethodBinding getMethodBinding() {
+		return null;
+	}
 	public void setExpectedType(TypeBinding expectedType) {
 		this.expectedType = this.ellipsisArgument ? ((ArrayBinding) expectedType).elementsType() : expectedType;
 	}
@@ -59,38 +94,87 @@
 	public void setExpressionContext(ExpressionContext context) {
 		this.expressionContext = context;
 	}
-	
+	public ExpressionContext getExpressionContext() {
+		return this.expressionContext;
+	}
 	public void tagAsEllipsisArgument() {
 		this.ellipsisArgument = true;
 	}
+	public boolean isPolyExpression(MethodBinding candidate) {
+		return true;
+	}
 	public boolean isPolyExpression() {
-		return this.expressionContext != VANILLA_CONTEXT;
+		return true; // always as per introduction of part D, JSR 335
+	}
+
+	public boolean isPertinentToApplicability(TypeBinding targetType, MethodBinding method) {
+		if (targetType instanceof TypeVariableBinding) {
+			if (method != null) { // when called from type inference
+				if (((TypeVariableBinding)targetType).declaringElement == method)
+					return false;
+				if (method.isConstructor() && ((TypeVariableBinding)targetType).declaringElement == method.declaringClass)
+					return false;
+			} else { // for internal calls
+				TypeVariableBinding typeVariable = (TypeVariableBinding) targetType;
+				if (typeVariable.declaringElement instanceof MethodBinding)
+					return false;
+			}
+		}
+		return true;
+	}
+
+	public TypeBinding invocationTargetType() {
+		if (this.expectedType == null) return null;
+		// when during inference this expression mimics as an invocationSite,
+		// we simulate an *invocation* of this functional expression,
+		// where the expected type of the expression is the return type of the sam:
+		MethodBinding sam = this.expectedType.getSingleAbstractMethod(this.enclosingScope, true);
+		if (sam != null) {
+			if (sam.isConstructor())
+				return sam.declaringClass;
+			else
+				return sam.returnType;
+		}
+		return null;
 	}
 
 	public TypeBinding expectedType() {
 		return this.expectedType;
 	}
 	
+	public boolean argumentsTypeElided() { return true; /* only exception: lambda with explicit argument types. */ }
+
+	// Notify the compilation unit that it contains some functional types, taking care not to add any transient copies. this is assumed not to be a copy
+	public int recordFunctionalType(Scope scope) {
+		while (scope != null) {
+			switch (scope.kind) {
+				case Scope.METHOD_SCOPE :
+					ReferenceContext context = ((MethodScope) scope).referenceContext;
+					if (context instanceof LambdaExpression) {
+						LambdaExpression expression = (LambdaExpression) context;
+						if (expression != expression.original) // fake universe.
+							return 0;
+					}
+					break; 
+				case Scope.COMPILATION_UNIT_SCOPE :
+					CompilationUnitDeclaration unit = ((CompilationUnitScope) scope).referenceContext;
+					return unit.record(this);
+			}
+			scope = scope.parent;
+		}
+		return 0; // not reached.
+	}
+
 	public TypeBinding resolveType(BlockScope blockScope) {
 		this.constant = Constant.NotAConstant;
-		MethodBinding sam = this.expectedType == null ? null : this.expectedType.getSingleAbstractMethod(blockScope);
+		this.enclosingScope = blockScope;
+		MethodBinding sam = this.expectedType == null ? null : this.expectedType.getSingleAbstractMethod(blockScope, argumentsTypeElided());
 		if (sam == null) {
 			blockScope.problemReporter().targetTypeIsNotAFunctionalInterface(this);
 			return null;
 		}
 		if (!sam.isValidBinding()) {
-			switch (sam.problemId()) {
-				case ProblemReasons.NoSuchSingleAbstractMethod:
-					blockScope.problemReporter().targetTypeIsNotAFunctionalInterface(this);
-					break;
-				case ProblemReasons.NotAWellFormedParameterizedType:
-					blockScope.problemReporter().illFormedParameterizationOfFunctionalInterface(this);
-					break;
-				case ProblemReasons.IntersectionHasMultipleFunctionalInterfaces:
-					blockScope.problemReporter().multipleFunctionalInterfaces(this);
-					break;
-			}
-			return null;
+			return reportSamProblem(blockScope, sam);
 		}
 		
 		this.descriptor = sam;
@@ -101,6 +185,31 @@
 		return this.resolvedType = null;
 	}
 
+	protected TypeBinding reportSamProblem(BlockScope blockScope, MethodBinding sam) {
+		if (this.hasReportedSamProblem)
+			return null;
+		switch (sam.problemId()) {
+			case ProblemReasons.NoSuchSingleAbstractMethod:
+				blockScope.problemReporter().targetTypeIsNotAFunctionalInterface(this);
+				this.hasReportedSamProblem = true;
+				break;
+			case ProblemReasons.NotAWellFormedParameterizedType:
+				blockScope.problemReporter().illFormedParameterizationOfFunctionalInterface(this);
+				this.hasReportedSamProblem = true;
+				break;
+			case ProblemReasons.IntersectionHasMultipleFunctionalInterfaces:
+				blockScope.problemReporter().multipleFunctionalInterfaces(this);
+				this.hasReportedSamProblem = true;
+				break;
+		}
+		return null;
+	}
+
+	public TypeBinding checkAgainstFinalTargetType(TypeBinding targetType, Scope scope) {
+		targetType = targetType.uncapture(this.enclosingScope);
+		return resolveTypeExpecting(this.enclosingScope, targetType);
+	}
+
 	class VisibilityInspector extends TypeBindingVisitor {
 
 		private Scope scope;
@@ -169,4 +278,80 @@
 	public int nullStatus(FlowInfo flowInfo) {
 		return FlowInfo.NON_NULL;
 	}
+
+	public int diagnosticsSourceEnd() {
+		return this.sourceEnd;
+	}
+
+	public MethodBinding[] getRequiredBridges() {
+
+		class BridgeCollector {
+			
+			MethodBinding [] bridges;
+			MethodBinding method;
+			char [] selector;
+			LookupEnvironment environment;
+			Scope scope;
+
+			BridgeCollector(ReferenceBinding functionalType, MethodBinding method) {
+				this.method = method;
+				this.selector = method.selector;
+				this.environment = FunctionalExpression.this.enclosingScope.environment();
+				this.scope = FunctionalExpression.this.enclosingScope;
+				collectBridges(functionalType.superInterfaces());
+			}
+			
+			void collectBridges(ReferenceBinding[] interfaces) {
+				int length = interfaces == null ? 0 : interfaces.length;
+				for (int i = 0; i < length; i++) {
+					ReferenceBinding superInterface = interfaces[i];
+					if (superInterface == null) 
+						continue;
+					MethodBinding [] methods = superInterface.getMethods(this.selector);
+					for (int j = 0, count = methods == null ? 0 : methods.length; j < count; j++) {
+						MethodBinding inheritedMethod = methods[j];
+						if (inheritedMethod == null || this.method == inheritedMethod)  // descriptor declaring class may not be same functional interface target type.
+							continue;
+						if (inheritedMethod.isStatic() || inheritedMethod.isDefaultMethod() || inheritedMethod.redeclaresPublicObjectMethod(this.scope)) 
+							continue;
+						inheritedMethod = MethodVerifier.computeSubstituteMethod(inheritedMethod, this.method, this.environment);
+						if (inheritedMethod == null || !MethodVerifier.isSubstituteParameterSubsignature(this.method, inheritedMethod, this.environment) ||
+								   !MethodVerifier.areReturnTypesCompatible(this.method, inheritedMethod, this.environment))
+							continue;
+						final MethodBinding originalInherited = inheritedMethod.original();
+						if (!this.method.areParameterErasuresEqual(originalInherited) || TypeBinding.notEquals(this.method.returnType.erasure(), originalInherited.returnType.erasure()))
+							add(originalInherited);
+					}
+					collectBridges(superInterface.superInterfaces());
+				}
+			}
+			void add(MethodBinding inheritedMethod) {
+				if (this.bridges == null) {
+					this.bridges = new MethodBinding[] { inheritedMethod };
+					return;
+				}
+				int length = this.bridges.length;
+				for (int i = 0; i < length; i++) {
+					if (this.bridges[i].areParameterErasuresEqual(inheritedMethod) && TypeBinding.equalsEquals(this.bridges[i].returnType.erasure(), inheritedMethod.returnType.erasure()))
+						return;
+				}
+				System.arraycopy(this.bridges, 0, this.bridges = new MethodBinding[length + 1], 0, length);
+				this.bridges[length] = inheritedMethod;
+			}
+			MethodBinding [] getBridges () {
+				return this.bridges;
+			}
+		}
+		
+		ReferenceBinding functionalType;
+		if (this.expectedType instanceof IntersectionCastTypeBinding) {
+			functionalType = (ReferenceBinding) ((IntersectionCastTypeBinding)this.expectedType).getSAMType(this.enclosingScope);
+		} else {
+			functionalType = (ReferenceBinding) this.expectedType;
+		}
+		return new BridgeCollector(functionalType, this.descriptor).getBridges();
+	}
+	boolean requiresBridges() {
+		return getRequiredBridges() != null; 
+	}
 }
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Initializer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Initializer.java
index d326e85..f31d348 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Initializer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Initializer.java
@@ -4,11 +4,7 @@
  * 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
- *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * Contributors:
+ *Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InnerInferenceHelper.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InnerInferenceHelper.java
new file mode 100644
index 0000000..56fca72
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InnerInferenceHelper.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.ast;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+
+public class InnerInferenceHelper {
+
+	/** For each candidate method store here the array of argument types if inner inference has improved any during Invocation Type Inference. */
+	private Map<MethodBinding,TypeBinding[]> argTypesPerCandidate = new HashMap<MethodBinding,TypeBinding[]>();
+
+	public void registerInnerResult(MethodBinding method, TypeBinding resolvedType, int argCount, int argIdx) {
+		TypeBinding[] argTypes = this.argTypesPerCandidate.get(method);
+		if (argTypes == null)
+			this.argTypesPerCandidate.put(method, argTypes = new TypeBinding[argCount]);
+		argTypes[argIdx] = resolvedType;
+	}
+	
+	public TypeBinding[] getArgumentTypesForCandidate(MethodBinding candidate, TypeBinding[] plainArgTypes) {
+		TypeBinding[] argTypes = this.argTypesPerCandidate.get(candidate);
+		if (argTypes == null)
+			return plainArgTypes;
+		// fill in any blanks now:
+		for (int i = 0; i < argTypes.length; i++) {
+			if (argTypes[i] == null)
+				argTypes[i] = plainArgTypes[i];
+		}
+		return argTypes;
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java
index 4eb7a12..251066d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java
@@ -5,14 +5,15 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 416307 - [1.8][compiler][null] subclass with type parameter substitution confuses null checking
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
  *        Andy Clement - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
  *******************************************************************************/
@@ -88,6 +89,11 @@
 	this.constant = Constant.NotAConstant;
 	TypeBinding expressionType = this.expression.resolveType(scope);
 	TypeBinding checkedType = this.type.resolveType(scope, true /* check bounds*/);
+	if (expressionType != null && checkedType != null && checkedType.hasNullTypeAnnotations()) {
+		// don't complain if the entire operation is redundant anyway
+		if (!expressionType.isCompatibleWith(checkedType) || NullAnnotationMatching.analyse(checkedType, expressionType, -1).isAnyMismatch())
+			scope.problemReporter().nullAnnotationUnsupportedLocation(this.type);
+	}
 	if (expressionType == null || checkedType == null)
 		return null;
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.java
index a16e8da..90911f1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.java
@@ -1,27 +1,30 @@
 /*******************************************************************************
- * Copyright (c) 2011, 2013 IBM Corporation and others.
+ * Copyright (c) 2011, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 409236 - [1.8][compiler] Type annotations on intersection cast types dropped by code generator
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ClassScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.IntersectionCastTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 
+@SuppressWarnings({"rawtypes"})
 public class IntersectionCastTypeReference extends TypeReference {
 	public TypeReference[] typeReferences;
 
@@ -30,13 +33,15 @@
 		this.sourceStart = typeReferences[0].sourceStart;
 		int length = typeReferences.length;
 		this.sourceEnd = typeReferences[length - 1].sourceEnd;
+		for (int i = 0, max = typeReferences.length; i < max; i++) {
+			if ((typeReferences[i].bits & ASTNode.HasTypeAnnotations) != 0) {
+				this.bits |= ASTNode.HasTypeAnnotations;
+				break;
+			}
+		}
 	}
 
-	public TypeReference copyDims(int dim) {
-		throw new UnsupportedOperationException(); // no syntax for this.
-	}
-	
-	public TypeReference copyDims(int dim, Annotation[][] annotationsOnDimensions) {
+	public TypeReference augmentTypeWithAdditionalDimensions(int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs) {
 		throw new UnsupportedOperationException(); // no syntax for this.
 	}
 
@@ -54,6 +59,10 @@
 		return null; // not supported here - combined with resolveType(...)
 	}
 
+	public TypeReference[] getTypeReferences() {
+		return this.typeReferences;
+	}
+	
 	/* (non-Javadoc)
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference#getTypeBinding(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope)
 	 */
@@ -63,6 +72,8 @@
 		ReferenceBinding[] intersectingTypes = new ReferenceBinding[length];
 		boolean hasError = false;
 		
+		int typeCount = 0;
+		nextType:
 		for (int i = 0; i < length; i++) {
 			final TypeReference typeReference = this.typeReferences[i];
 			TypeBinding type = typeReference.resolveType(scope, checkBounds);
@@ -81,24 +92,66 @@
 					hasError = true;
 					continue;
 				}
-			} else if (!type.isInterface()) {  // TODO: understand how annotations play here ...
+			} else if (!type.isInterface()) {
 				scope.problemReporter().boundMustBeAnInterface(typeReference, type);
 				hasError = true;
 				continue;
 			}
-			for (int j = 0; j < i; j++) {
-				if (intersectingTypes[j] == type) {
+			for (int j = 0; j < typeCount; j++) {
+				final ReferenceBinding priorType = intersectingTypes[j];
+				if (TypeBinding.equalsEquals(priorType, type)) {
 					scope.problemReporter().duplicateBoundInIntersectionCast(typeReference);
 					hasError = true;
 					continue;
 				}
+				if (!priorType.isInterface())
+					continue;
+				if (TypeBinding.equalsEquals(type.findSuperTypeOriginatingFrom(priorType), priorType)) {
+					intersectingTypes[j] = (ReferenceBinding) type;
+					continue nextType;
+				}
+				if (TypeBinding.equalsEquals(priorType.findSuperTypeOriginatingFrom(type), type))
+					continue nextType;
 			}
-			intersectingTypes[i] = (ReferenceBinding) type;
+			intersectingTypes[typeCount++] = (ReferenceBinding) type;
 		}
+
 		if (hasError) {
 			return null;
 		}
-		return (this.resolvedType = scope.environment().createIntersectionCastType(intersectingTypes));
+		if (typeCount != length) {
+			if (typeCount == 1) {
+				return this.resolvedType = intersectingTypes[0];
+			}
+			System.arraycopy(intersectingTypes, 0, intersectingTypes = new ReferenceBinding[typeCount], 0, typeCount);
+		}
+		IntersectionCastTypeBinding intersectionType = (IntersectionCastTypeBinding) scope.environment().createIntersectionCastType(intersectingTypes);
+		// check for parameterized interface collisions (when different parameterizations occur)
+		ReferenceBinding itsSuperclass = null;
+		ReferenceBinding[] interfaces = intersectingTypes;
+		ReferenceBinding firstType = intersectingTypes[0];
+		if (firstType.isClass()) {
+			itsSuperclass = firstType.superclass();
+			System.arraycopy(intersectingTypes, 1, interfaces = new ReferenceBinding[typeCount - 1], 0, typeCount - 1);
+		}
+		
+		Map invocations = new HashMap(2);
+		nextInterface: for (int i = 0, interfaceCount = interfaces.length; i < interfaceCount; i++) {
+			ReferenceBinding one = interfaces[i];
+			if (one == null) continue nextInterface;
+			if (itsSuperclass != null && scope.hasErasedCandidatesCollisions(itsSuperclass, one, invocations, intersectionType, this))
+				continue nextInterface;
+			nextOtherInterface: for (int j = 0; j < i; j++) {
+				ReferenceBinding two = interfaces[j];
+				if (two == null) continue nextOtherInterface;
+				if (scope.hasErasedCandidatesCollisions(one, two, invocations, intersectionType, this))
+					continue nextInterface;
+			}
+		}
+		if ((intersectionType.tagBits & TagBits.HierarchyHasProblems) != 0)
+			return null;
+
+		return (this.resolvedType = intersectionType);
 	}
 
 	/* (non-Javadoc)
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Invocation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Invocation.java
new file mode 100644
index 0000000..f4b1f4e
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Invocation.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.ast;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedMethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+
+/**
+ * Abstraction for invocation AST nodes that can trigger 
+ * <ul>
+ * <li>Invocation Applicability Inferences (18.5.1), and</li> 
+ * <li>Invocation Type Inference (18.5.2).</li>
+ * </ul>
+ */
+public interface Invocation extends InvocationSite {
+
+	Expression[] arguments();
+
+	/**
+	 * Answer the resolved method binding of this invocation.
+	 * If a target type is given, the invocation gets a chance to do repeated method lookup.
+	 * @param targetType the target type of this invocation or null if not yet known
+	 * @param reportErrors if true then this is the last call, if no valid binding can be answered we should report an error
+	 * @param scope if reportErrors is true then this scope can be used for error reporting
+	 * 
+	 */
+	MethodBinding binding(TypeBinding targetType, boolean reportErrors, Scope scope);
+
+	/**
+	 * Register the given inference context, which produced the given method as its intermediate result.
+	 * Later when the same method is selected as the most specific method, the inference context
+	 * for this pair (Invocation x MethodBinding) can be looked up using {@link #getExpressionContext()}
+	 * to continue the type inference.
+	 */
+	void registerInferenceContext(ParameterizedGenericMethodBinding method, InferenceContext18 infCtx18);
+	
+	/**
+	 * Retrieve an inference context for the given method which must have been registered
+	 * using {@link #registerInferenceContext(ParameterizedGenericMethodBinding, InferenceContext18)}.
+	 * @param method an intermediate resolved candidate for this invocation
+	 * return a suspended inference context or null if none was registered for this method.
+	 */
+	InferenceContext18 getInferenceContext(ParameterizedMethodBinding method);
+
+	/**
+	 * Answer true if this invocation has determined its binding using inference.
+	 */
+	boolean usesInference();
+	
+	/**
+	 * Where the AST node may hold references to the results of Invocation Applicability Inference,
+	 * this method allows to update those references to the result of Invocation Type Inference.
+	 * Note that potentially more than just the method binding is updated.
+	 * @param updatedBinding the final method binding after full inference
+	 * @param targetType the target type used during Invocation Type Inference
+	 * @return true if an update has happened
+	 */
+	boolean updateBindings(MethodBinding updatedBinding, TypeBinding targetType);
+	
+	/**
+	 * Answer whether the current invocation has inner expressions that still need updating after inference.
+	 */
+	boolean innersNeedUpdate();
+
+	/**
+	 * Mark that updating (the need for which is signaled via {@link #innersNeedUpdate()}) has been done.
+	 */
+	void innerUpdateDone();
+
+	/**
+	 * If this invocation has any poly expressions as arguments, this method answers an inference helper 
+	 * that mediates during overload resolution, even if no actual inference happens for this invocation.
+	 */
+	InnerInferenceHelper innerInferenceHelper();
+	
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Javadoc.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Javadoc.java
index a8a1916..47e8da9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Javadoc.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Javadoc.java
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -286,7 +288,7 @@
 						if (messageSend.binding != null && messageSend.binding.isValidBinding() && messageSend.actualReceiverType instanceof ReferenceBinding) {
 							ReferenceBinding methodReceiverType = (ReferenceBinding) messageSend.actualReceiverType;
 							TypeBinding superType = methDecl.binding.declaringClass.findSuperTypeOriginatingFrom(methodReceiverType);
-							if (superType != null && superType.original() != methDecl.binding.declaringClass && CharOperation.equals(messageSend.selector, methDecl.selector)) {
+							if (superType != null && TypeBinding.notEquals(superType.original(), methDecl.binding.declaringClass) && CharOperation.equals(messageSend.selector, methDecl.selector)) {
 								if (methScope.environment().methodVerifier().doesMethodOverride(methDecl.binding, messageSend.binding.original())) {
 									superRef = true;
 								}
@@ -299,10 +301,17 @@
 					if (allocationExpr.binding != null && allocationExpr.binding.isValidBinding()) {
 						ReferenceBinding allocType = (ReferenceBinding) allocationExpr.resolvedType.original();
 						ReferenceBinding superType = (ReferenceBinding) methDecl.binding.declaringClass.findSuperTypeOriginatingFrom(allocType);
-						if (superType != null && superType.original() != methDecl.binding.declaringClass) {
+						if (superType != null && TypeBinding.notEquals(superType.original(), methDecl.binding.declaringClass)) {
 							MethodBinding superConstructor = methScope.getConstructor(superType, methDecl.binding.parameters, allocationExpr);
 							if (superConstructor.isValidBinding() && superConstructor.original() == allocationExpr.binding.original()) {
-								if (superConstructor.areParametersEqual(methDecl.binding)) {
+								MethodBinding current = methDecl.binding;
+								// work 'against' better inference in 1.8 (otherwise comparing (G<T> with G<Object>) would fail):
+								if (methScope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8
+									&& current.typeVariables != Binding.NO_TYPE_VARIABLES) 
+								{
+									current = current.asRawMethod(methScope.environment());
+								}
+								if (superConstructor.areParametersEqual(current)) {
 									superRef = true;
 								}
 							}
@@ -403,7 +412,7 @@
 					if (CharOperation.equals(resolvedType.sourceName(), fieldRef.token)) {
 						fieldRef.methodBinding = scope.getConstructor(resolvedType, Binding.NO_TYPES, fieldRef);
 					} else {
-						fieldRef.methodBinding = scope.findMethod(resolvedType, fieldRef.token, Binding.NO_TYPES, fieldRef);
+						fieldRef.methodBinding = scope.findMethod(resolvedType, fieldRef.token, Binding.NO_TYPES, fieldRef, false);
 					}
 				}
 			}
@@ -612,7 +621,7 @@
 							// Verify duplicated tags
 							boolean duplicate = false;
 							for (int j = 0; j < i && !duplicate; j++) {
-								if (bindings[j] == param.resolvedType) {
+								if (TypeBinding.equalsEquals(bindings[j], param.resolvedType)) {
 									scope.problemReporter().javadocDuplicatedParamTag(param.token, param.sourceStart, param.sourceEnd, modifiers);
 									duplicate = true;
 								}
@@ -631,7 +640,7 @@
 					TypeParameter parameter = parameters[i];
 					boolean found = false;
 					for (int j = 0; j < paramTypeParamLength && !found; j++) {
-						if (parameter.binding == bindings[j]) {
+						if (TypeBinding.equalsEquals(parameter.binding, bindings[j])) {
 							found = true;
 							bindings[j] = null;
 						}
@@ -686,7 +695,7 @@
 					ReferenceBinding exceptionBinding = md.binding.thrownExceptions[i];
 					if (exceptionBinding != null && exceptionBinding.isValidBinding()) { // flag only valid class name
 						int j=i;
-						while (j<thrownExceptionLength && exceptionBinding != md.thrownExceptions[j].resolvedType) j++;
+						while (j<thrownExceptionLength && TypeBinding.notEquals(exceptionBinding, md.thrownExceptions[j].resolvedType)) j++;
 						if (j<thrownExceptionLength) {
 							methScope.problemReporter().javadocMissingThrowsTag(md.thrownExceptions[j], md.binding.modifiers);
 						}
@@ -717,7 +726,7 @@
 				for (int j = 0; j < maxRef && !found; j++) {
 					if (typeReferences[j] != null) {
 						TypeBinding typeBinding = typeReferences[j].resolvedType;
-						if (exceptionBinding == typeBinding) {
+						if (TypeBinding.equalsEquals(exceptionBinding, typeBinding)) {
 							found = true;
 							typeReferences[j] = null;
 						}
@@ -726,7 +735,7 @@
 				if (!found && reportMissing) {
 					if (exceptionBinding != null && exceptionBinding.isValidBinding()) { // flag only valid class name
 						int k=i;
-						while (k<thrownExceptionLength && exceptionBinding != md.thrownExceptions[k].resolvedType) k++;
+						while (k<thrownExceptionLength && TypeBinding.notEquals(exceptionBinding, md.thrownExceptions[k].resolvedType)) k++;
 						if (k<thrownExceptionLength) {
 							methScope.problemReporter().javadocMissingThrowsTag(md.thrownExceptions[k], md.binding.modifiers);
 						}
@@ -800,7 +809,7 @@
 					topLevelScope = topLevelScope.outerMostClassScope();
 					if (typeReference instanceof JavadocSingleTypeReference) {
 						// inner class single reference can only be done in same unit
-						if ((!source15 && depth == 1) || topLevelType != topLevelScope.referenceContext.binding) {
+						if ((!source15 && depth == 1) || TypeBinding.notEquals(topLevelType, topLevelScope.referenceContext.binding)) {
 							// search for corresponding import
 							boolean hasValidImport = false;
 							if (source15) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocAllocationExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocAllocationExpression.java
index fd61104..bb096bc 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocAllocationExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocAllocationExpression.java
@@ -116,8 +116,8 @@
 			if (paramMethodBinding.hasSubstitutedParameters()) {
 				int length = argumentTypes.length;
 				for (int i=0; i<length; i++) {
-					if (paramMethodBinding.parameters[i] != argumentTypes[i] &&
-							paramMethodBinding.parameters[i].erasure() != argumentTypes[i].erasure()) {
+					if (TypeBinding.notEquals(paramMethodBinding.parameters[i], argumentTypes[i]) &&
+							TypeBinding.notEquals(paramMethodBinding.parameters[i].erasure(), argumentTypes[i].erasure())) {
 						MethodBinding problem = new ProblemMethodBinding(this.binding, this.binding.selector, argumentTypes, ProblemReasons.NotFound);
 						scope.problemReporter().javadocInvalidConstructor(this, problem, scope.getDeclarationModifiers());
 						break;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.java
index 348778e..8e04e98 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -28,14 +24,8 @@
 		this.sourceStart = pos;
 		this.sourceEnd = pos;
 	}
-	/* (non-Javadoc)
-	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference#copyDims(int)
-	 */
-	public TypeReference copyDims(int dim) {
-		return null;
-	}
 	
-	public TypeReference copyDims(int dim, Annotation[][] annotationsOnDimensions) {
+	public TypeReference augmentTypeWithAdditionalDimensions(int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs) {
 		return null;
 	}
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.java
index f407577..4cebbc6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.java
@@ -163,7 +163,7 @@
 		} else {
 			int length = argumentTypes.length;
 			for (int i=0; i<length; i++) {
-				if (this.binding.parameters[i].erasure() != argumentTypes[i].erasure()) {
+				if (TypeBinding.notEquals(this.binding.parameters[i].erasure(), argumentTypes[i].erasure())) {
 					MethodBinding problem = new ProblemMethodBinding(this.binding, this.selector, argumentTypes, ProblemReasons.NotFound);
 					scope.problemReporter().javadocInvalidMethod(this, problem, scope.getDeclarationModifiers());
 					break;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java
index cdf23e7..e69f3a7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java
@@ -1,25 +1,49 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2012, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Contributions for
  *							bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
  *							bug 382721 - [1.8][compiler] Effectively final variables needs special treatment
+ *							Bug 416885 - [1.8][compiler]IncompatibleClassChange error (edit)
  *     Stephan Herrmann - Contribution for
  *							bug 401030 - [1.8][null] Null analysis support for lambda methods.
+ *							Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *							Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *							Bug 423504 - [1.8] Implement "18.5.3 Functional Interface Parameterization Inference"
+ *							Bug 425142 - [1.8][compiler] NPE in ConstraintTypeFormula.reduceSubType
+ *							Bug 425153 - [1.8] Having wildcard allows incompatible types in a lambda expression
+ *							Bug 424205 - [1.8] Cannot infer type for diamond type with lambda on method invocation
+ *							Bug 425798 - [1.8][compiler] Another NPE in ConstraintTypeFormula.reduceSubType
+ *							Bug 425156 - [1.8] Lambda as an argument is flagged with incompatible error
+ *							Bug 424403 - [1.8][compiler] Generic method call with method reference argument fails to resolve properly.
+ *							Bug 426563 - [1.8] AIOOBE when method with error invoked with lambda expression as argument
+ *							Bug 420525 - [1.8] [compiler] Incorrect error "The type Integer does not define sum(Object, Object) that is applicable here"
+ *							Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *							Bug 428294 - [1.8][compiler] Type mismatch: cannot convert from List<Object> to Collection<Object[]>
+ *							Bug 428786 - [1.8][compiler] Inference needs to compute the "ground target type" when reducing a lambda compatibility constraint
+ *							Bug 428980 - [1.8][null] simple expression as lambda body doesn't leverage null annotation on argument
+ *							Bug 429430 - [1.8] Lambdas and method reference infer wrong exception type with generics (RuntimeException instead of IOException)
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.INVOCATION_CONTEXT;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
 import org.aspectj.org.eclipse.jdt.core.compiler.CategorizedProblem;
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.core.compiler.IProblem;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ClassFile;
@@ -30,6 +54,8 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.ExceptionHandlingFlowContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowInfo;
+import org.aspectj.org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
@@ -37,15 +63,21 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ClassScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.IntersectionCastTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemReasons;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SyntheticArgumentBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SyntheticMethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
@@ -57,29 +89,71 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.AbortMethod;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.AbortType;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
-import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class LambdaExpression extends FunctionalExpression implements ReferenceContext, ProblemSeverities {
 	public Argument [] arguments;
+	private TypeBinding [] argumentTypes;
+	public int arrowPosition;
 	public Statement body;
 	public boolean hasParentheses;
 	public MethodScope scope;
-	private boolean voidCompatible = true;
-	private boolean valueCompatible = false;
+	boolean voidCompatible = true;
+	boolean valueCompatible = false;
 	private boolean shapeAnalysisComplete = false;
-	private boolean returnsValue;
-	private boolean returnsVoid;
-	private boolean throwsException;
-	private LambdaExpression original = this;
-	private SyntheticArgumentBinding[] outerLocalVariables = NO_SYNTHETIC_ARGUMENTS;
+	boolean returnsValue;
+	public boolean isSerializable;
+	boolean returnsVoid;
+	public LambdaExpression original = this;
+	public SyntheticArgumentBinding[] outerLocalVariables = NO_SYNTHETIC_ARGUMENTS;
 	private int outerLocalVariablesSlotSize = 0;
 	public boolean shouldCaptureInstance = false;
+	private boolean assistNode = false;
+	private boolean hasIgnoredMandatoryErrors = false;
+	private ReferenceBinding classType;
+	public int ordinal;
+	private Set thrownExceptions;
 	private static final SyntheticArgumentBinding [] NO_SYNTHETIC_ARGUMENTS = new SyntheticArgumentBinding[0];
-	
-	public LambdaExpression(CompilationResult compilationResult, Argument [] arguments, Statement body) {
+	private static final Block NO_BODY = new Block(0, true);
+
+	public LambdaExpression(CompilationResult compilationResult, boolean assistNode) {
 		super(compilationResult);
+		this.assistNode = assistNode;
+		setArguments(NO_ARGUMENTS);
+		setBody(NO_BODY);
+	}
+	
+	public void setArguments(Argument [] arguments) {
 		this.arguments = arguments != null ? arguments : ASTNode.NO_ARGUMENTS;
-		this.body = body;
+		this.argumentTypes = new TypeBinding[arguments != null ? arguments.length : 0];
+	}
+	
+	public Argument [] arguments() {
+		return this.arguments;
+	}
+
+	public TypeBinding[] argumentTypes() {
+		return this.argumentTypes;
+	}
+
+	public void setBody(Statement body) {
+		this.body = body == null ? NO_BODY : body;
+	}
+	
+	public Statement body() {
+		return this.body;
+	}
+
+	public Expression[] resultExpressions() {
+		return this.resultExpressions;
+	}
+
+	public void setArrowPosition(int arrowPosition) {
+		this.arrowPosition = arrowPosition;
+	}
+	
+	public int arrowPosition() {
+		return this.arrowPosition;
 	}
 	
 	protected FunctionalExpression original() {
@@ -112,9 +186,15 @@
 			codeStream.generateOuterAccess(path, this, capturedOuterLocal, currentScope);
 		}
 		signature.append(')');
-		signature.append(this.expectedType.signature());
+		if (this.expectedType instanceof IntersectionCastTypeBinding) {
+			signature.append(((IntersectionCastTypeBinding)this.expectedType).getSAMType(currentScope).signature());
+		} else {
+			signature.append(this.expectedType.signature());
+		}
 		int invokeDynamicNumber = codeStream.classFile.recordBootstrapMethod(this);
-		codeStream.invokeDynamic(invokeDynamicNumber, (this.shouldCaptureInstance ? 1 : 0) + this.outerLocalVariablesSlotSize, 1, TypeConstants.ANONYMOUS_METHOD, signature.toString().toCharArray());
+		codeStream.invokeDynamic(invokeDynamicNumber, (this.shouldCaptureInstance ? 1 : 0) + this.outerLocalVariablesSlotSize, 1, this.descriptor.selector, signature.toString().toCharArray());
+		if (!valueRequired)
+			codeStream.pop();
 		codeStream.recordPositionsFrom(pc, this.sourceStart);		
 	}
 
@@ -135,48 +215,60 @@
 	 */
 	public TypeBinding resolveType(BlockScope blockScope) {
 		
+		if (this.resolvedType != null)
+			return this.resolvedType;
+		
+		if (this.expectedType != null && this.original == this) {  // final resolution ? may be not - i.e may be, but only in a non-final universe.
+			this.ordinal = recordFunctionalType(blockScope);
+		}
+		
 		this.constant = Constant.NotAConstant;
 		this.enclosingScope = blockScope;
 		
+		boolean argumentsTypeElided = argumentsTypeElided();
+		int length = this.arguments == null ? 0 : this.arguments.length;
+		if (!argumentsTypeElided) {
+			for (int i = 0; i < length; i++)
+				this.argumentTypes[i] = this.arguments[i].type.resolveType(blockScope, true /* check bounds*/);
+		}
 		if (this.expectedType == null && this.expressionContext == INVOCATION_CONTEXT) {
 			return new PolyTypeBinding(this);
 		} 
 		
 		MethodScope methodScope = blockScope.methodScope();
-		this.scope = new MethodScope(blockScope, this, methodScope.isStatic);
+		this.scope = new MethodScope(blockScope, this, methodScope.isStatic, methodScope.lastVisibleFieldID);
 		this.scope.isConstructorCall = methodScope.isConstructorCall;
 
 		super.resolveType(blockScope); // compute & capture interface function descriptor in singleAbstractMethod.
 		
-		final boolean argumentsTypeElided = argumentsTypeElided();
 		final boolean haveDescriptor = this.descriptor != null;
 		
-		if (haveDescriptor && this.descriptor.typeVariables != Binding.NO_TYPE_VARIABLES) // already complained in kosher*
-			return null;
+		if (!haveDescriptor || this.descriptor.typeVariables != Binding.NO_TYPE_VARIABLES) // already complained in kosher*
+			return this.resolvedType = null;
 		
-		if (!haveDescriptor && argumentsTypeElided) 
-			return null; // FUBAR, bail out...
-
 		this.binding = new MethodBinding(ClassFileConstants.AccPrivate | ClassFileConstants.AccSynthetic | ExtraCompilerModifiers.AccUnresolved,
-							TypeConstants.ANONYMOUS_METHOD, // will be fixed up later.
-							haveDescriptor ? this.descriptor.returnType : null, 
+							CharOperation.concat(TypeConstants.ANONYMOUS_METHOD, Integer.toString(this.ordinal).toCharArray()), // will be fixed up later.
+							haveDescriptor ? this.descriptor.returnType : TypeBinding.VOID, 
 							Binding.NO_PARAMETERS, // for now. 
 							haveDescriptor ? this.descriptor.thrownExceptions : Binding.NO_EXCEPTIONS, 
 							blockScope.enclosingSourceType());
 		this.binding.typeVariables = Binding.NO_TYPE_VARIABLES;
 		
+		boolean buggyArguments = false;
 		if (haveDescriptor) {
 			int descriptorParameterCount = this.descriptor.parameters.length;
 			int lambdaArgumentCount = this.arguments != null ? this.arguments.length : 0;
             if (descriptorParameterCount != lambdaArgumentCount) {
             	this.scope.problemReporter().lambdaSignatureMismatched(this);
-            	if (argumentsTypeElided) 
-            		return null; // FUBAR, bail out ...
+            	if (argumentsTypeElided || this.original != this) // no interest in continuing to error check copy.
+            		return this.resolvedType = null; // FUBAR, bail out ...
+            	else {
+            		this.resolvedType = null; // continue to type check.
+            		buggyArguments = true;
+            	}
             }
 		}
 		
-		boolean buggyArguments = false;
-		int length = this.arguments == null ? 0 : this.arguments.length;
 		TypeBinding[] newParameters = new TypeBinding[length];
 
 		AnnotationBinding [][] parameterAnnotations = null;
@@ -193,7 +285,7 @@
 			
 			TypeBinding parameterType;
 			final TypeBinding expectedParameterType = haveDescriptor && i < this.descriptor.parameters.length ? this.descriptor.parameters[i] : null;
-			parameterType = argumentsTypeElided ? expectedParameterType : argument.type.resolveType(this.scope, true /* check bounds*/);
+			parameterType = argumentsTypeElided ? expectedParameterType : this.argumentTypes[i];
 			if (parameterType == null) {
 				buggyArguments = true;
 			} else if (parameterType == TypeBinding.VOID) {
@@ -206,15 +298,44 @@
 				if ((parameterType.tagBits & TagBits.HasMissingType) != 0) {
 					this.binding.tagBits |= TagBits.HasMissingType;
 				}
-				if (haveDescriptor && expectedParameterType != null && parameterType.isValidBinding() && parameterType != expectedParameterType) {
-					this.scope.problemReporter().lambdaParameterTypeMismatched(argument, argument.type, expectedParameterType);
+			}
+		}
+		if (!argumentsTypeElided && !buggyArguments) {
+			ReferenceBinding groundType = null;
+			ReferenceBinding expectedSAMType = null;
+			if (this.expectedType instanceof IntersectionCastTypeBinding)
+				expectedSAMType = (ReferenceBinding) ((IntersectionCastTypeBinding) this.expectedType).getSAMType(blockScope); 
+			else if (this.expectedType instanceof ReferenceBinding)
+				expectedSAMType = (ReferenceBinding) this.expectedType;
+			if (expectedSAMType != null)
+				groundType = findGroundTargetType(blockScope, expectedSAMType, argumentsTypeElided);
+			if (groundType != null) {
+				this.descriptor = groundType.getSingleAbstractMethod(blockScope, true);
+				if (!this.descriptor.isValidBinding()) {
+					reportSamProblem(blockScope, this.descriptor);
+				} else {
+					this.resolvedType = groundType;
+				}
+				// TODO: in which cases do we have to assign this.resolvedType & this.descriptor (with problem bindings) to prevent NPE downstream??
+			}
+		}
+		for (int i = 0; i < length; i++) {
+			Argument argument = this.arguments[i];
+			TypeBinding parameterType;
+			final TypeBinding expectedParameterType = haveDescriptor && i < this.descriptor.parameters.length ? this.descriptor.parameters[i] : null;
+			parameterType = argumentsTypeElided ? expectedParameterType : this.argumentTypes[i];
+			if (parameterType != null && parameterType != TypeBinding.VOID) {
+				if (haveDescriptor && expectedParameterType != null && parameterType.isValidBinding() && TypeBinding.notEquals(parameterType, expectedParameterType)) {
+					if (expectedParameterType.isProperType(true)) {
+						this.scope.problemReporter().lambdaParameterTypeMismatched(argument, argument.type, expectedParameterType);
+						this.resolvedType = null; // continue to type check.
+					}
 				}
 
 				TypeBinding leafType = parameterType.leafComponentType();
 				if (leafType instanceof ReferenceBinding && (((ReferenceBinding) leafType).modifiers & ExtraCompilerModifiers.AccGenericSignature) != 0)
 					this.binding.modifiers |= ExtraCompilerModifiers.AccGenericSignature;
-				newParameters[i] = parameterType;
-				argument.bind(this.scope, parameterType, false);
+				newParameters[i] = argument.bind(this.scope, parameterType, false);				
 				if (argument.annotations != null) {
 					this.binding.tagBits |= TagBits.HasParameterAnnotations;
 					if (parameterAnnotations == null) {
@@ -262,7 +383,7 @@
 				this.binding.modifiers |= ExtraCompilerModifiers.AccGenericSignature;
 		} // TODO (stephan): else? (can that happen?)
 
-		if (haveDescriptor && blockScope.compilerOptions().isAnnotationBasedNullAnalysisEnabled) {
+		if (haveDescriptor && !buggyArguments && blockScope.compilerOptions().isAnnotationBasedNullAnalysisEnabled) {
 			if (!argumentsTypeElided) {
 				AbstractMethodDeclaration.createArgumentBindings(this.arguments, this.binding, this.scope);
 				validateNullAnnotations();
@@ -280,17 +401,59 @@
 		} else {
 			this.body.resolve(this.scope);
 		}
+		if (this.expectedType instanceof IntersectionCastTypeBinding) {
+			ReferenceBinding[] intersectingTypes =  ((IntersectionCastTypeBinding)this.expectedType).intersectingTypes;
+			for (int t = 0, max = intersectingTypes.length; t < max; t++) {
+				if (intersectingTypes[t].findSuperTypeOriginatingFrom(TypeIds.T_JavaIoSerializable, false /*Serializable is not a class*/) != null) {
+					this.isSerializable = true;
+					break;
+				}
+			}
+		} else if (this.expectedType != null && 
+				   this.expectedType.findSuperTypeOriginatingFrom(TypeIds.T_JavaIoSerializable, false /*Serializable is not a class*/) != null) {
+			this.isSerializable = true;
+		}
+		if ((this.binding.tagBits & TagBits.HasMissingType) != 0) {
+			this.scope.problemReporter().missingTypeInLambda(this, this.binding);
+		}
 		return this.resolvedType;
 	}
-	
-	private boolean argumentsTypeElided() {
+
+	private ReferenceBinding findGroundTargetType(BlockScope blockScope, ReferenceBinding targetType, boolean argumentTypesElided) {
+		if (!targetType.isValidBinding())
+			return null;
+		ParameterizedTypeBinding withWildCards = InferenceContext18.parameterizedWithWildcard(targetType);
+		if (withWildCards != null) {
+			if (!argumentTypesElided)
+				return new InferenceContext18(blockScope).inferFunctionalInterfaceParameterization(this, blockScope, withWildCards);
+			else
+				return findGroundTargetTypeForElidedLambda(blockScope, withWildCards);
+		}
+		return targetType;
+	}
+
+	public ReferenceBinding findGroundTargetTypeForElidedLambda(BlockScope blockScope, ParameterizedTypeBinding withWildCards) {
+		// non-wildcard parameterization (9.8) of the target type
+		TypeBinding[] types = withWildCards.getNonWildcardParameterization(blockScope);
+		if (types == null)
+			return null;
+		ReferenceBinding genericType = withWildCards.genericType();
+		return blockScope.environment().createParameterizedType(genericType, types, genericType.enclosingType());
+	}
+
+	public boolean argumentsTypeElided() {
 		return this.arguments.length > 0 && this.arguments[0].hasElidedType();
 	}
 
 	private boolean doesNotCompleteNormally() {
-		return this.body.analyseCode(this.scope, 
+		try {
+			return this.body.analyseCode(this.scope, 
 									 new ExceptionHandlingFlowContext(null, this, Binding.NO_EXCEPTIONS, null, this.scope, FlowInfo.DEAD_END), 
-									 FlowInfo.initial(this.scope.referenceType().maxFieldCount)) == FlowInfo.DEAD_END; 
+									 UnconditionalFlowInfo.fakeInitializedFlowInfo(this.scope.outerMostMethodScope().analysisIndex, this.scope.referenceType().maxFieldCount)) == FlowInfo.DEAD_END;
+		} catch (RuntimeException e) {
+			this.scope.problemReporter().lambdaShapeComputationError(this);
+			return this.valueCompatible;
+		}
 	}
 	public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, final FlowInfo flowInfo) {
 		
@@ -309,7 +472,7 @@
 
 		// nullity and mark as assigned
 		MethodBinding methodWithParameterDeclaration = argumentsTypeElided() ? this.descriptor : this.binding;
-		AbstractMethodDeclaration.analyseArguments(lambdaInfo, this.arguments, methodWithParameterDeclaration);
+		AbstractMethodDeclaration.analyseArguments18(lambdaInfo, this.arguments, methodWithParameterDeclaration);
 
 		if (this.arguments != null) {
 			for (int i = 0, count = this.arguments.length; i < count; i++) {
@@ -333,10 +496,10 @@
 			}
 		} else { // Expression
 			if (currentScope.compilerOptions().isAnnotationBasedNullAnalysisEnabled 
-					&& flowInfo.reachMode() == FlowInfo.REACHABLE)
+					&& lambdaInfo.reachMode() == FlowInfo.REACHABLE)
 			{
 				Expression expression = (Expression)this.body;
-				checkAgainstNullAnnotation(flowContext, expression, expression.nullStatus(flowInfo, flowContext));
+				checkAgainstNullAnnotation(flowContext, expression, expression.nullStatus(lambdaInfo, flowContext));
 			}
 		}
 		return flowInfo;
@@ -346,14 +509,11 @@
 	// pre: !argumentTypeElided()
 	void validateNullAnnotations() {
 		// null annotations on parameters?
-		if (this.binding != null && this.binding.parameterNonNullness != null) {
+		if (this.binding != null) {
 			int length = this.binding.parameters.length;
 			for (int i=0; i<length; i++) {
-				if (this.binding.parameterNonNullness[i] != null) {
-					long nullAnnotationTagBit =  this.binding.parameterNonNullness[i].booleanValue()
-							? TagBits.AnnotationNonNull : TagBits.AnnotationNullable;
-					this.scope.validateNullAnnotation(nullAnnotationTagBit, this.arguments[i].type, this.arguments[i].annotations);
-				}
+				if (!this.scope.validateNullAnnotation(this.binding.returnType.tagBits, this.arguments[i].type, this.arguments[i].annotations))
+					this.binding.returnType = this.binding.returnType.unannotated();
 			}
 		}
 	}
@@ -361,23 +521,32 @@
 	// pre: !argumentTypeElided()
 	// try to merge null annotations from descriptor into binding, complaining about any incompatibilities found
 	private void mergeParameterNullAnnotations(BlockScope currentScope) {
-		if (this.descriptor.parameterNonNullness == null)
-			return;
-		if (this.binding.parameterNonNullness == null) {
-			this.binding.parameterNonNullness = this.descriptor.parameterNonNullness;
-			return;
-		}
 		LookupEnvironment env = currentScope.environment();
-		Boolean[] ourNonNullness = this.binding.parameterNonNullness;
-		Boolean[] descNonNullness = this.descriptor.parameterNonNullness;
-		int len = Math.min(ourNonNullness.length, descNonNullness.length);
+		TypeBinding[] ourParameters = this.binding.parameters;
+		TypeBinding[] descParameters = this.descriptor.parameters;
+		int len = Math.min(ourParameters.length, descParameters.length);
 		for (int i = 0; i < len; i++) {
-			if (ourNonNullness[i] == null) {
-				ourNonNullness[i] = descNonNullness[i];
-			} else if (ourNonNullness[i] != descNonNullness[i]) {
-				if (ourNonNullness[i] == Boolean.TRUE) { // requested @NonNull not provided
+			long ourTagBits = ourParameters[i].tagBits & TagBits.AnnotationNullMASK;
+			long descTagBits = descParameters[i].tagBits & TagBits.AnnotationNullMASK;
+			if (ourTagBits == 0L) {
+				if (descTagBits != 0L && !ourParameters[i].isBaseType()) {
+					AnnotationBinding [] annotations = descParameters[i].getTypeAnnotations();
+					for (int j = 0, length = annotations.length; j < length; j++) {
+						AnnotationBinding annotation = annotations[j];
+						if (annotation != null) {
+							switch (annotation.getAnnotationType().id) {
+								case TypeIds.T_ConfiguredAnnotationNullable :
+								case TypeIds.T_ConfiguredAnnotationNonNull :
+									ourParameters[i] = env.createAnnotatedType(ourParameters[i], new AnnotationBinding [] { annotation });
+									break;
+							}
+						}
+					}
+				}
+			} else if (ourTagBits != descTagBits) {
+				if (ourTagBits == TagBits.AnnotationNonNull) { // requested @NonNull not provided
 					char[][] inheritedAnnotationName = null;
-					if (descNonNullness[i] == Boolean.FALSE)
+					if (descTagBits == TagBits.AnnotationNullable)
 						inheritedAnnotationName = env.getNullableAnnotationName();
 					currentScope.problemReporter().illegalRedefinitionToNonNullParameter(this.arguments[i], this.descriptor.declaringClass, inheritedAnnotationName);
 				}
@@ -390,12 +559,48 @@
 		if (nullStatus != FlowInfo.NON_NULL) {
 			// if we can't prove non-null check against declared null-ness of the descriptor method:
 			// Note that this.binding never has a return type declaration, always inherit null-ness from the descriptor
-			if ((this.descriptor.tagBits & TagBits.AnnotationNonNull) != 0) {
+			if ((this.descriptor.returnType.tagBits & TagBits.AnnotationNonNull) != 0) {
 				flowContext.recordNullityMismatch(this.scope, expression, expression.resolvedType, this.descriptor.returnType, nullStatus);
 			}
 		}
 	}
 
+	public boolean isPertinentToApplicability(TypeBinding targetType, MethodBinding method) {
+		if (targetType == null) // assumed to signal another primary error
+			return true;
+		
+		if (argumentsTypeElided())
+			return false;
+		
+		if (!super.isPertinentToApplicability(targetType, method))
+			return false;
+		
+		if (this.body instanceof Expression) {
+			if (!((Expression) this.body).isPertinentToApplicability(targetType, method))
+				return false;
+		} else {
+			Expression [] returnExpressions = this.resultExpressions;
+			for (int i = 0, length = returnExpressions.length; i < length; i++) {
+				if (!returnExpressions[i].isPertinentToApplicability(targetType, method))
+					return false;
+			}
+		}
+		
+		return true;
+	}
+	
+	public boolean isVoidCompatible() {
+		if (!this.shapeAnalysisComplete)
+			throw new IllegalStateException("asking isVoidCompatible before shape analysis is complete"); //$NON-NLS-1$
+		return this.voidCompatible;
+	}
+
+	public boolean isValueCompatible() {
+		if (!this.shapeAnalysisComplete)
+			throw new IllegalStateException("asking isValueCompatible before shape analysis is complete"); //$NON-NLS-1$
+		return this.valueCompatible;
+	}
+	
 	public StringBuffer printExpression(int tab, StringBuffer output) {
 		int parenthesesCount = (this.bits & ASTNode.ParenthesizedMASK) >> ASTNode.ParenthesizedSHIFT;
 		String suffix = ""; //$NON-NLS-1$
@@ -411,7 +616,10 @@
 			}
 		}
 		output.append(") -> " ); //$NON-NLS-1$
-		this.body.print(this.body instanceof Block ? tab : 0, output);
+		if (this.body != null)
+			this.body.print(this.body instanceof Block ? tab : 0, output);
+		else 
+			output.append("<@incubator>"); //$NON-NLS-1$
 		return output.append(suffix);
 	}
 
@@ -438,121 +646,285 @@
 	public MethodScope getScope() {
 		return this.scope;
 	}
+	
+	private boolean enclosingScopesHaveErrors() {
+		Scope skope = this.enclosingScope;
+		while (skope != null) {
+			ReferenceContext context = skope.referenceContext();
+			if (context != null && context.hasErrors())
+				return true;
+			skope = skope.parent;
+		}
+		return false;
+	}
 		
-	protected boolean errorEqualsIncompatibility() {
-		return this.original.shapeAnalysisComplete; // so as not to abort shape analysis.
+	private void analyzeShape() { // simple minded analysis for code assist.
+		class ShapeComputer extends ASTVisitor {
+			public boolean visit(TypeDeclaration type, BlockScope skope) {
+				return false;
+			}
+			public boolean visit(TypeDeclaration type, ClassScope skope) {
+				return false;
+			}
+			public boolean visit(LambdaExpression type, BlockScope skope) {
+				return false;
+			}
+		    public boolean visit(ReturnStatement returnStatement, BlockScope skope) {
+		    	if (returnStatement.expression != null) {
+		    		LambdaExpression.this.valueCompatible = true;
+		    		LambdaExpression.this.voidCompatible = false;
+		    	} else {
+		    		LambdaExpression.this.voidCompatible = true;
+		    		LambdaExpression.this.valueCompatible = false;
+		    	}
+		    	return false;
+		    }
+		}
+		if (this.body instanceof Expression) {
+			this.voidCompatible = ((Expression) this.body).statementExpression();
+			this.valueCompatible = true;
+		} else {
+			// We need to be a bit tolerant/fuzzy here: the code is being written "just now", if we are too pedantic, selection/completion will break;
+			this.voidCompatible = true;
+			this.valueCompatible = true;
+			this.body.traverse(new ShapeComputer(), null);
+		}
+		this.shapeAnalysisComplete = true;
 	}
 	
-	public boolean isCompatibleWith(final TypeBinding left, final Scope someScope) {
+	public boolean isCompatibleWith(TypeBinding left, final Scope someScope) {
+		if (!(left instanceof ReferenceBinding))
+			return false;
+
+		left = left.uncapture(this.enclosingScope);
+		shapeAnalysis: if (!this.shapeAnalysisComplete) {
+			IErrorHandlingPolicy oldPolicy = this.enclosingScope.problemReporter().switchErrorHandlingPolicy(silentErrorHandlingPolicy);
+			final CompilerOptions compilerOptions = this.enclosingScope.compilerOptions();
+			boolean analyzeNPE = compilerOptions.isAnnotationBasedNullAnalysisEnabled;
+			compilerOptions.isAnnotationBasedNullAnalysisEnabled = false;
+			try {
+				final LambdaExpression copy = copy();
+				if (copy == null) {
+					if (this.assistNode) {
+						analyzeShape(); // not on terra firma here !
+// FIXME: we don't yet have the same, should we compute it here & now?
+//						if (sam.returnType.id == TypeIds.T_void) {
+//							if (!this.voidCompatible)
+//								return false;
+//						} else {
+//							if (!this.valueCompatible)
+//								return false;
+//						}
+					}
+					return !isPertinentToApplicability(left, null);
+				}
+				copy.setExpressionContext(this.expressionContext);
+				copy.setExpectedType(left);
+				this.hasIgnoredMandatoryErrors = false;
+				TypeBinding type = copy.resolveType(this.enclosingScope);
+				if (type == null || !type.isValidBinding())
+					return false;
+				if (this.body instanceof Block) {
+					if (this.returnsVoid) {
+						this.shapeAnalysisComplete = true;
+					}
+				} else {
+					this.voidCompatible = ((Expression) this.body).statementExpression();
+					// TODO: in getResolvedCopyForInferenceTargeting() we need to check if the expression
+					//        *could* also produce a value and set valueCompatible accordingly.
+					//        Is that needed also here?
+					this.shapeAnalysisComplete = true;
+				}
+				// Do not proceed with data/control flow analysis if resolve encountered errors.
+				if (this.hasIgnoredMandatoryErrors || enclosingScopesHaveErrors()) {
+					if (!isPertinentToApplicability(left, null))
+						break shapeAnalysis;
+					if (this.arguments.length != 0) // error not because of the target type imposition, but is inherent. Just say compatible since errors in body aren't to influence applicability.
+						return false;
+					break shapeAnalysis;
+				}
+				
+				// value compatibility of block lambda's is the only open question.
+				if (!this.shapeAnalysisComplete)
+					this.valueCompatible = copy.doesNotCompleteNormally();
+				
+				this.shapeAnalysisComplete = true;
+			} finally {
+				compilerOptions.isAnnotationBasedNullAnalysisEnabled = analyzeNPE;
+				this.hasIgnoredMandatoryErrors = false;
+				this.enclosingScope.problemReporter().switchErrorHandlingPolicy(oldPolicy);
+			}
+		}
+
+		ReferenceBinding expectedSAMType = null;
+		if (left instanceof IntersectionCastTypeBinding)
+			expectedSAMType = (ReferenceBinding) ((IntersectionCastTypeBinding) left).getSAMType(this.enclosingScope); 
+		else if (left instanceof ReferenceBinding)
+			expectedSAMType = (ReferenceBinding) left;
+		ReferenceBinding groundTargetType = expectedSAMType != null ? findGroundTargetType(this.enclosingScope, expectedSAMType, argumentsTypeElided()) : null;
+		if (groundTargetType == null)
+			return false;
 		
-		final MethodBinding sam = left.getSingleAbstractMethod(this.enclosingScope);
-		
+		MethodBinding sam = groundTargetType.getSingleAbstractMethod(this.enclosingScope, true);
 		if (sam == null || !sam.isValidBinding())
 			return false;
 		if (sam.parameters.length != this.arguments.length)
 			return false;
-		
-		if (!this.shapeAnalysisComplete && this.body instanceof Expression) {
-			Expression expression = (Expression) this.body;
-			this.voidCompatible = expression.statementExpression();
-			this.valueCompatible = true;
-			this.shapeAnalysisComplete = true;
-		}
 
-		if (this.shapeAnalysisComplete) {
-			if (squarePegInRoundHole(sam))
-				return false;
-		} 
-
-		IErrorHandlingPolicy oldPolicy = this.enclosingScope.problemReporter().switchErrorHandlingPolicy(silentErrorHandlingPolicy);
-		this.hasIgnoredMandatoryErrors = false;
-		try {
-			final LambdaExpression copy = copy();
-			if (copy == null)
-				return false;
-			copy.setExpressionContext(this.expressionContext);
-			copy.setExpectedType(left);
-			if (this.resultExpressions == null)
-				this.resultExpressions = new SimpleLookupTable(); // gather result expressions for most specific method analysis.
-			this.resultExpressions.put(left, new Expression[0]);
-			copy.resolveType(this.enclosingScope);
-			if (!this.shapeAnalysisComplete) {
-				boolean lambdaIsFubar = this.hasIgnoredMandatoryErrors; // capture now, before doesNotCompleteNormally which runs analyzeCode on lambda body *without* the enclosing context being analyzed 
-				if (!this.returnsVoid && !this.returnsValue && this.throwsException) {  // () -> { throw new Exception(); } is value compatible.
-					Block block = (Block) this.body;
-					final Statement[] statements = block.statements;
-					final int statementsLength = statements == null ? 0 : statements.length;
-					Statement ultimateStatement = statementsLength == 0 ? null : statements[statementsLength - 1];
-					this.valueCompatible = ultimateStatement instanceof ThrowStatement ? true: copy.doesNotCompleteNormally(); 
-				}
-				this.shapeAnalysisComplete = true;
-				if (squarePegInRoundHole(sam) || lambdaIsFubar)
-					return false;
-			}
-		} catch (IncongruentLambdaException e) {
-			return false;
-		} finally {
-			this.enclosingScope.problemReporter().switchErrorHandlingPolicy(oldPolicy);
-			this.hasIgnoredMandatoryErrors = false;
-		}
-		return true;
-	}
-	
-	public boolean tIsMoreSpecific(TypeBinding t, TypeBinding s) {
-		/* 15.12.2.5 t is more specific than s iff ... Some of the checks here are redundant by the very fact of control reaching here, 
-		   but have been left in for completeness/documentation sakes. These should be cheap anyways. 
-		*/
-		
-		// Both t and s are functional interface types ... 
-		MethodBinding tSam = t.getSingleAbstractMethod(this.enclosingScope);
-		if (tSam == null || !tSam.isValidBinding())
-			return false;
-		MethodBinding sSam = s.getSingleAbstractMethod(this.enclosingScope);
-		if (sSam == null || !sSam.isValidBinding())
-			return false;
-		
-		// t should neither be a subinterface nor a superinterface of s
-		if (t.findSuperTypeOriginatingFrom(s) != null || s.findSuperTypeOriginatingFrom(t) != null)
-			return false;
-
-		// If the lambda expression's parameters have inferred types, then the descriptor parameter types of t are the same as the descriptor parameter types of s.
-		if (argumentsTypeElided()) {
-			if (tSam.parameters.length != sSam.parameters.length)
-				return false;
-			for (int i = 0, length = tSam.parameters.length; i < length; i++) {
-				if (tSam.parameters[i] != sSam.parameters[i])
-					return false;
-			}
-		}
-		
-		// either the descriptor return type of s is void or ...
-		if (sSam.returnType.id == TypeIds.T_void)
+		if (!isPertinentToApplicability(left, null))  // This check should happen after return type check below, but for buggy javac compatibility we have left it in.
 			return true;
-		
-		/* ... or for all result expressions in the lambda body (or for the body itself if the body is an expression), 
-           the descriptor return type of the capture of T is more specific than the descriptor return type of S.
-		*/
-		Expression [] returnExpressions = (Expression[]) this.resultExpressions.get(t); // should be same as for s
-		int returnExpressionsLength = returnExpressions == null ? 0 : returnExpressions.length;
-		if (returnExpressionsLength == 0)
-			return true; // as good as or as bad as false.
-		
-		t = t.capture(this.enclosingScope, this.sourceEnd);
-		tSam = t.getSingleAbstractMethod(this.enclosingScope);
-		for (int i = 0; i < returnExpressionsLength; i++) {
-			Expression resultExpression = returnExpressions[i];
-			if (!resultExpression.tIsMoreSpecific(tSam.returnType, sSam.returnType))
-				return false;
-		}
-		return true;
-	}
 
-	private boolean squarePegInRoundHole(final MethodBinding sam) {
 		if (sam.returnType.id == TypeIds.T_void) {
 			if (!this.voidCompatible)
-				return true;
+				return false;
 		} else {
 			if (!this.valueCompatible)
+				return false;
+		}
+		Expression [] returnExpressions = this.resultExpressions;
+		for (int i = 0, length = returnExpressions.length; i < length; i++) {
+			if (returnExpressions[i] instanceof FunctionalExpression) { // don't want to use the resolvedType - polluted from some other overload resolution candidate
+				if (!returnExpressions[i].isCompatibleWith(sam.returnType, this.enclosingScope))
+					return false;
+			} else {
+				if (this.enclosingScope.parameterCompatibilityLevel(returnExpressions[i].resolvedType, sam.returnType) == Scope.NOT_COMPATIBLE) {
+					if (!returnExpressions[i].isConstantValueOfTypeAssignableToType(returnExpressions[i].resolvedType, sam.returnType))
+						if (sam.returnType.id != TypeIds.T_void || this.body instanceof Block)
+							return false;
+				}
+			}
+		}
+	
+		TypeBinding [] samPararameterTypes = sam.parameters;
+		for (int i = 0, length = samPararameterTypes.length; i < length; i++) { // lengths known to be equal.
+			if (TypeBinding.notEquals(samPararameterTypes[i], this.argumentTypes[i]))
+				return false;
+		}
+
+		return true;
+	}
+
+	/**
+	 * Get a resolved copy of this lambda for use by type inference, as to avoid spilling any premature
+	 * type results into the original lambda.
+	 * 
+	 * @param targetType the target functional type against which inference is attempted, must be a non-null valid functional type 
+	 * @return a resolved copy of 'this' or null if significant errors where encountered
+	 */
+	public LambdaExpression getResolvedCopyForInferenceTargeting(TypeBinding targetType) {
+		// note: this is essentially a simplified extract from isCompatibleWith(TypeBinding,Scope).
+		if (this.shapeAnalysisComplete && this.binding != null)
+			return this;
+		
+		targetType = targetType.uncapture(this.enclosingScope);
+		// TODO: caching
+		IErrorHandlingPolicy oldPolicy = this.enclosingScope.problemReporter().switchErrorHandlingPolicy(silentErrorHandlingPolicy);
+		final CompilerOptions compilerOptions = this.enclosingScope.compilerOptions();
+		boolean analyzeNPE = compilerOptions.isAnnotationBasedNullAnalysisEnabled;
+		final LambdaExpression copy = copy();
+		if (copy == null) {
+			return null;
+		}
+		try {
+			compilerOptions.isAnnotationBasedNullAnalysisEnabled = false;
+			copy.setExpressionContext(this.expressionContext);
+			copy.setExpectedType(targetType);
+			this.hasIgnoredMandatoryErrors = false;
+			TypeBinding type = copy.resolveType(this.enclosingScope);
+			if (type == null || !type.isValidBinding())
+				return null;
+			if (this.body instanceof Block) {
+				if (copy.returnsVoid) {
+					copy.shapeAnalysisComplete = true;
+				}
+			} else {
+				copy.voidCompatible = ((Expression) this.body).statementExpression();
+				TypeBinding resultType = ((Expression) this.body).resolvedType;
+				if (resultType == null) // case of a yet-unresolved poly expression?
+					copy.valueCompatible = true;
+				else
+					copy.valueCompatible = (resultType != TypeBinding.VOID);
+				copy.shapeAnalysisComplete = true;
+			}
+			// Do not proceed with data/control flow analysis if resolve encountered errors.
+			if (!this.hasIgnoredMandatoryErrors && !enclosingScopesHaveErrors()) {
+				// value compatibility of block lambda's is the only open question.
+				if (!copy.shapeAnalysisComplete)
+					copy.valueCompatible = copy.doesNotCompleteNormally();
+			} else {
+				if (!copy.returnsVoid)
+					copy.valueCompatible = true; // optimistically, TODO: is this OK??
+			}
+			
+			copy.shapeAnalysisComplete = true;
+			copy.resultExpressions = this.resultExpressions;
+			this.resultExpressions = NO_EXPRESSIONS;
+		} finally {
+			compilerOptions.isAnnotationBasedNullAnalysisEnabled = analyzeNPE;
+			this.hasIgnoredMandatoryErrors = false;
+			this.enclosingScope.problemReporter().switchErrorHandlingPolicy(oldPolicy);
+		}
+		return copy;
+	}
+
+	public boolean sIsMoreSpecific(TypeBinding s, TypeBinding t, Scope skope) {
+		
+		// 15.12.2.5 
+		
+		if (super.sIsMoreSpecific(s, t, skope))
+			return true;
+		
+		if (argumentsTypeElided() || t.findSuperTypeOriginatingFrom(s) != null)
+			return false;
+		
+		s = s.capture(this.enclosingScope, this.sourceEnd);
+		MethodBinding sSam = s.getSingleAbstractMethod(this.enclosingScope, true);
+		if (sSam == null || !sSam.isValidBinding())
+			return false;
+		TypeBinding r1 = sSam.returnType;
+		MethodBinding tSam = t.getSingleAbstractMethod(this.enclosingScope, true);
+		if (tSam == null || !tSam.isValidBinding())
+			return false;
+		TypeBinding r2 = tSam.returnType;
+		
+		if (r2.id == TypeIds.T_void)
+			return true;
+		
+		if (r1.id == TypeIds.T_void)
+			return false;
+		
+		// r1 <: r2
+		if (r1.isCompatibleWith(r2, skope))
+			return true;
+		
+		Expression [] returnExpressions = this.resultExpressions;
+		int returnExpressionsLength = returnExpressions == null ? 0 : returnExpressions.length;
+		
+		int i;
+		// r1 is a primitive type, r2 is a reference type, and each result expression is a standalone expression (15.2) of a primitive type
+		if (r1.isBaseType() && !r2.isBaseType()) {
+			for (i = 0; i < returnExpressionsLength; i++) {
+				if (returnExpressions[i].isPolyExpression() || !returnExpressions[i].resolvedType.isBaseType())
+					break;
+			}
+			if (i == returnExpressionsLength)
+				return true;
+		}
+		if (!r1.isBaseType() && r2.isBaseType()) {
+			for (i = 0; i < returnExpressionsLength; i++) {
+				if (returnExpressions[i].resolvedType.isBaseType())
+					break;
+			}
+			if (i == returnExpressionsLength)
+				return true;
+		}
+		if (r1.isFunctionalInterface(this.enclosingScope) && r2.isFunctionalInterface(this.enclosingScope)) {
+			for (i = 0; i < returnExpressionsLength; i++) {
+				Expression resultExpression = returnExpressions[i];
+				if (!resultExpression.sIsMoreSpecific(r1, r2, skope))
+					break;
+			}
+			if (i == returnExpressionsLength)
 				return true;
 		}
 		return false;
@@ -573,15 +945,22 @@
 	public void returnsExpression(Expression expression, TypeBinding resultType) {
 		if (this.original == this) // not in overload resolution context.
 			return;
+		if (this.body instanceof Expression) {
+			this.original.valueCompatible = resultType != null && resultType.id != TypeIds.T_void;
+			this.original.resultExpressions = new Expression[1];
+			this.original.resultExpressions[0] = expression;
+			return; // void compatibility determined via statementExpression()
+		}
 		if (expression != null) {
 			this.original.returnsValue = true;
 			this.original.voidCompatible = false;
 			this.original.valueCompatible = !this.original.returnsVoid;
 			if (resultType != null) {
-				Expression [] results = (Expression[]) this.original.resultExpressions.get(this.expectedType);
-				int resultsLength = results.length;
-				System.arraycopy(results, 0, results = new Expression[resultsLength + 1], 0, resultsLength);
-				results[resultsLength] = expression;
+				Expression [] returnExpressions = this.original.resultExpressions;
+				int resultsLength = returnExpressions.length;
+				System.arraycopy(returnExpressions, 0, returnExpressions = new Expression[resultsLength + 1], 0, resultsLength);
+				returnExpressions[resultsLength] = expression;
+				this.original.resultExpressions = returnExpressions;
 			}
 		} else {
 			this.original.returnsVoid = true;
@@ -589,12 +968,6 @@
 			this.original.voidCompatible = !this.original.returnsValue;
 		}
 	}
-
-	public void throwsException(TypeBinding exceptionType) {
-		if (this.expressionContext != INVOCATION_CONTEXT)
-			return;
-		this.original.throwsException = true;
-	}
 	
 	public CompilationResult compilationResult() {
 		return this.compilationResult;
@@ -639,19 +1012,55 @@
 	}
 	
 	public void tagAsHavingIgnoredMandatoryErrors(int problemId) {
-		// 15.27.3 requires exception throw related errors to not influence congruence. Other errors should. Also don't abort shape analysis.
 		switch (problemId) {
+			// 15.27.3 requires exception throw related errors to not influence congruence. Other errors should. Also don't abort shape analysis.
 			case IProblem.UnhandledExceptionOnAutoClose:
 			case IProblem.UnhandledExceptionInDefaultConstructor:
 			case IProblem.UnhandledException:
 				return;
+			/* The following structural problems can occur only because of target type imposition. Filter, so we can distinguish inherent errors 
+			   in explicit lambdas. This is to help decide whether to proceed with data/control flow analysis to discover shape. In case of inherent
+			   errors, we will not call analyze code as it is not prepared to analyze broken programs.
+			*/
+			case IProblem.VoidMethodReturnsValue:
+			case IProblem.ShouldReturnValueHintMissingDefault:
+			case IProblem.ShouldReturnValue:
+			case IProblem.ReturnTypeMismatch:
+			case IProblem.IncompatibleLambdaParameterType:
+			case IProblem.lambdaParameterTypeMismatched:
+			case IProblem.lambdaSignatureMismatched:
+			case IProblem.LambdaDescriptorMentionsUnmentionable:
+			case IProblem.TargetTypeNotAFunctionalInterface:
+			case IProblem.illFormedParameterizationOfFunctionalInterface:
+			case IProblem.MultipleFunctionalInterfaces:
+			case IProblem.NoGenericLambda:
+				return;
 			default: 
-				if (errorEqualsIncompatibility())
-					throw new IncongruentLambdaException();
-				this.original().hasIgnoredMandatoryErrors = true;
+				this.original.hasIgnoredMandatoryErrors = true;
+				MethodScope enclosingLambdaScope = this.scope == null ? null : this.scope.enclosingLambdaScope();
+				while (enclosingLambdaScope != null) {
+					LambdaExpression enclosingLambda = (LambdaExpression) enclosingLambdaScope.referenceContext;
+					if (enclosingLambda.original != enclosingLambda)
+						enclosingLambda.original.hasIgnoredMandatoryErrors = true;
+					enclosingLambdaScope = enclosingLambdaScope.enclosingLambdaScope();
+				}
 				return;
 		}
 	}
+	
+	public void throwsException(TypeBinding exceptionType) {
+		if (this.expressionContext != INVOCATION_CONTEXT)
+			return;
+		if (this.thrownExceptions == null)
+			this.thrownExceptions = new HashSet<TypeBinding>();
+		this.thrownExceptions.add(exceptionType);
+	}
+
+	public Set<TypeBinding> getThrownExceptions() {
+		if (this.thrownExceptions == null)
+			return Collections.emptySet();
+		return this.thrownExceptions;
+	}
 
 	public void generateCode(ClassScope classScope, ClassFile classFile) {
 		int problemResetPC = 0;
@@ -775,7 +1184,81 @@
 				return this.outerLocalVariables[i];
 		return null;
 	}
+
+	// Return the actual method binding devoid of synthetics. 
+	public MethodBinding getMethodBinding() {
+		if (this.actualMethodBinding == null) {
+			if (this.binding != null) {
+				this.actualMethodBinding = new MethodBinding(this.binding.modifiers, this.binding.selector, this.binding.returnType, 
+						this.binding instanceof SyntheticMethodBinding ? this.descriptor.parameters : this.binding.parameters,  // retain any faults in parameter list.
+								this.binding.thrownExceptions, this.binding.declaringClass);
+				this.actualMethodBinding.tagBits = this.binding.tagBits;
+			} else {
+				this.actualMethodBinding = new ProblemMethodBinding(CharOperation.NO_CHAR, null, ProblemReasons.NoSuchSingleAbstractMethod);
+			}
+		}
+		return this.actualMethodBinding;
+	}
+
+	public int diagnosticsSourceEnd() {
+		return this.body instanceof Block ? this.arrowPosition : this.sourceEnd;
+	}
+
+	public TypeBinding[] getMarkerInterfaces() {
+		if (this.expectedType instanceof IntersectionCastTypeBinding) {
+			Set markerBindings = new LinkedHashSet();
+			TypeBinding[] intersectionTypes = ((IntersectionCastTypeBinding)this.expectedType).intersectingTypes;
+			for (int i = 0,max = intersectionTypes.length; i < max; i++) {
+				TypeBinding typeBinding = intersectionTypes[i];
+				MethodBinding methodBinding = typeBinding.getSingleAbstractMethod(this.scope, true);
+				// Why doesn't getSingleAbstractMethod do as the javadoc says, and return null
+				// when it is not a SAM type
+				if (!(methodBinding instanceof ProblemMethodBinding && ((ProblemMethodBinding)methodBinding).problemId()==ProblemReasons.NoSuchSingleAbstractMethod)) {
+					continue;
+				}
+				if (typeBinding.id == TypeIds.T_JavaIoSerializable) {
+					// Serializable is captured as a bitflag
+					continue;
+				}
+				markerBindings.add(typeBinding);
+			}
+			if (markerBindings.size() > 0) {
+				return (TypeBinding[])markerBindings.toArray(new TypeBinding[markerBindings.size()]);
+			}
+		}
+		return null;
+	}
+
+	public ReferenceBinding getTypeBinding() {
+	
+		if (this.classType != null || this.resolvedType == null)
+			return null;
+		
+		class LambdaTypeBinding extends ReferenceBinding {
+			public MethodBinding[] methods() {
+				return new MethodBinding [] { getMethodBinding() };
+			}
+			public char[] sourceName() {
+				return TypeConstants.LAMBDA_TYPE;
+			}
+			public ReferenceBinding superclass() {
+				return LambdaExpression.this.scope.getJavaLangObject();
+			}
+			public ReferenceBinding[] superInterfaces() {
+				return new ReferenceBinding[] { (ReferenceBinding) LambdaExpression.this.resolvedType };
+			}
+			@Override
+			public char[] computeUniqueKey() {
+				return LambdaExpression.this.descriptor.declaringClass.computeUniqueKey();
+			}
+			public String toString() {
+				StringBuffer output = new StringBuffer("()->{} implements "); //$NON-NLS-1$
+				output.append(LambdaExpression.this.descriptor.declaringClass.sourceName());
+				output.append('.');
+				output.append(LambdaExpression.this.descriptor.toString());
+				return output.toString();
+			}
+		}
+		return this.classType = new LambdaTypeBinding();
+	}
 }
-class IncongruentLambdaException extends RuntimeException {
-	private static final long serialVersionUID = 4145723509219836114L;
-}
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
index 8c8a30e..1b7a88b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - Contributions for
@@ -25,11 +21,19 @@
  *							bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
  *							bug 383368 - [compiler][null] syntactic null analysis for field references
  *							bug 400761 - [compiler][null] null may be return as boolean without a diagnostic
+ *							Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *							Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *							Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
  *     Jesper S Moller - Contributions for
  *							Bug 378674 - "The method can be declared as static" is wrong
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *							Bug 409250 - [1.8][compiler] Various loose ends in 308 code generation
+ *							Bug 426616 - [1.8][compiler] Type Annotations, multiple problems 
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.ASSIGNMENT_CONTEXT;
+
 import java.util.List;
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
@@ -40,6 +44,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.*;
 
+@SuppressWarnings("rawtypes")
 public class LocalDeclaration extends AbstractVariableDeclaration {
 
 	public LocalVariableBinding binding;
@@ -93,7 +98,7 @@
 		this.bits &= ~FirstAssignmentToLocal;  // int i = (i = 0);
 	}
 	flowInfo.markAsDefinitelyAssigned(this.binding);
-	nullStatus = checkAssignmentAgainstNullAnnotation(currentScope, flowContext, this.binding, nullStatus, this.initialization, this.initialization.resolvedType);
+	nullStatus = NullAnnotationMatching.checkAssignment(currentScope, flowContext, this.binding, nullStatus, this.initialization, this.initialization.resolvedType);
 	if ((this.binding.type.tagBits & TagBits.IsBaseType) == 0) {
 		flowInfo.markNullStatus(this.binding, nullStatus);
 		// no need to inform enclosing try block since its locals won't get
@@ -178,13 +183,15 @@
 	// for local variables
 	public void getAllAnnotationContexts(int targetType, LocalVariableBinding localVariable, List allAnnotationContexts) {
 		AnnotationCollector collector = new AnnotationCollector(this, targetType, localVariable, allAnnotationContexts);
-		this.traverse(collector, (BlockScope) null);
+		this.traverseWithoutInitializer(collector, (BlockScope) null);
 	}
+
 	// for arguments
 	public void getAllAnnotationContexts(int targetType, int parameterIndex, List allAnnotationContexts) {
 		AnnotationCollector collector = new AnnotationCollector(this, targetType, parameterIndex, allAnnotationContexts);
 		this.traverse(collector, (BlockScope) null);
 	}
+		
 	public boolean isArgument() {
 		return false;
 	}
@@ -249,7 +256,7 @@
 				this.initialization.setExpectedType(variableType);
 				TypeBinding initializationType = this.initialization.resolveType(scope);
 				if (initializationType != null) {
-					if (variableType != initializationType) // must call before computeConversion() and typeMismatchError()
+					if (TypeBinding.notEquals(variableType, initializationType)) // must call before computeConversion() and typeMismatchError()
 						scope.compilationUnitScope().recordTypeConversion(variableType, initializationType);
 					if (this.initialization.isConstantValueOfTypeAssignableToType(initializationType, variableType)
 						|| initializationType.isCompatibleWith(variableType, scope)) {
@@ -288,8 +295,10 @@
 					: Constant.NotAConstant);
 		}
 		// only resolve annotation at the end, for constant to be positioned before (96991)
-		resolveAnnotations(scope, this.annotations, this.binding);
-		scope.validateNullAnnotation(this.binding.tagBits, this.type, this.annotations);
+		resolveAnnotations(scope, this.annotations, this.binding, true);
+		Annotation.isTypeUseCompatible(this.type, scope, this.annotations);
+		if (!scope.validateNullAnnotation(this.binding.tagBits, this.type, this.annotations))
+			this.binding.tagBits &= ~TagBits.AnnotationNullMASK;
 	}
 
 	public void traverse(ASTVisitor visitor, BlockScope scope) {
@@ -306,4 +315,17 @@
 		}
 		visitor.endVisit(this, scope);
 	}
+	
+	private void traverseWithoutInitializer(ASTVisitor visitor, BlockScope scope) {		
+		if (visitor.visit(this, scope)) {
+			if (this.annotations != null) {
+				int annotationsLength = this.annotations.length;
+				for (int i = 0; i < annotationsLength; i++)
+					this.annotations[i].traverse(visitor, scope);
+			}
+			this.type.traverse(visitor, scope);
+		}
+		visitor.endVisit(this, scope);
+	}
+
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.java
index d2fca53..afa5ebf 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.java
index fccad59..05124ae 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MessageSend.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
index 75240ec..2fe55a8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Palo Alto Research Center, Incorporated - AspectJ adaptation
@@ -34,13 +30,34 @@
  *								bug 404649 - [1.8][compiler] detect illegal reference to indirect or redundant super
  *								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
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 405569 - Resource leak check false positive when using DbUtils.closeQuietly
+ *								Bug 411964 - [1.8][null] leverage null type annotation in foreach statement
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 423504 - [1.8] Implement "18.5.3 Functional Interface Parameterization Inference"
+ *								Bug 424710 - [1.8][compiler] CCE in SingleNameReference.localVariableBinding
+ *								Bug 425152 - [1.8] [compiler] Lambda Expression not resolved but flow analyzed leading to NPE.
+ *								Bug 424205 - [1.8] Cannot infer type for diamond type with lambda on method invocation
+ *								Bug 424415 - [1.8][compiler] Eventual resolution of ReferenceExpression is not seen to be happening.
+ *								Bug 426366 - [1.8][compiler] Type inference doesn't handle multiple candidate target types in outer overload context
+ *								Bug 426290 - [1.8][compiler] Inference + overloading => wrong method resolution ?
+ *								Bug 427483 - [Java 8] Variables in lambdas sometimes can't be resolved
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *								Bug 426996 - [1.8][inference] try to avoid method Expression.unresolve()? 
+ *								Bug 428352 - [1.8][compiler] Resolution errors don't always surface
+ *								Bug 429430 - [1.8] Lambdas and method reference infer wrong exception type with generics (RuntimeException instead of IOException)
  *     Jesper S Moller - Contributions for
  *								Bug 378674 - "The method can be declared as static" is wrong
- *        Andy Clement - Contributions for
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409245 - [1.8][compiler] Type annotations dropped when call is routed through a synthetic bridge method
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.*;
+
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
@@ -55,14 +72,15 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.IPrivilegedHandler;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ImplicitNullAnnotationVerifier;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MissingTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedMethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.PolymorphicMethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemReasons;
@@ -75,12 +93,15 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
+import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
 
 /**
  * AspectJ Extension - support for MethodBinding.alwaysNeedsAccessMethod
+ * Possible mergeconflict? Was InvocationSite but now Invocation in implements clause
  */
-public class MessageSend extends Expression implements InvocationSite {
+public class MessageSend extends Expression implements Invocation {
 
 	public Expression receiver;
 	public char[] selector;
@@ -97,19 +118,23 @@
 	public TypeBinding[] genericTypeArguments;
 	private ExpressionContext expressionContext = VANILLA_CONTEXT;
 
+	 // hold on to this context from invocation applicability inference until invocation type inference (per method candidate):
+	private SimpleLookupTable/*<PGMB,InferenceContext18>*/ inferenceContexts;
+	protected InnerInferenceHelper innerInferenceHelper;
+
 public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo) {
 	boolean nonStatic = !this.binding.isStatic();
 	boolean wasInsideAssert = ((flowContext.tagBits & FlowContext.HIDE_NULL_COMPARISON_WARNING) != 0);
 	flowInfo = this.receiver.analyseCode(currentScope, flowContext, flowInfo, nonStatic).unconditionalInits();
 
 	// recording the closing of AutoCloseable resources:
-	boolean analyseResources = currentScope.compilerOptions().analyseResourceLeaks;
+	CompilerOptions compilerOptions = currentScope.compilerOptions();
+	boolean analyseResources = compilerOptions.analyseResourceLeaks;
 	if (analyseResources) {
-		Expression closeTarget = null;
 		if (nonStatic) {
 			// closeable.close()
 			if (CharOperation.equals(TypeConstants.CLOSE, this.selector)) {
-				closeTarget = this.receiver;
+				recordCallingClose(currentScope, flowContext, flowInfo, this.receiver);
 			}
 		} else if (this.arguments != null && this.arguments.length > 0 && FakedTrackingVariable.isAnyCloseable(this.arguments[0].resolvedType)) {
 			// Helper.closeMethod(closeable, ..)
@@ -118,21 +143,13 @@
 				if (CharOperation.equals(record.selector, this.selector)
 						&& CharOperation.equals(record.typeName, this.binding.declaringClass.compoundName)) 
 				{
-					closeTarget = this.arguments[0];
+					int len = Math.min(record.numCloseableArgs, this.arguments.length);
+					for (int j=0; j<len; j++)
+						recordCallingClose(currentScope, flowContext, flowInfo, this.arguments[j]);
 					break;
 				}
 			}
 		}
-		if (closeTarget != null) {
-			FakedTrackingVariable trackingVariable = FakedTrackingVariable.getCloseTrackingVariable(closeTarget, flowInfo, flowContext);
-			if (trackingVariable != null) { // null happens if target is not a local variable or not an AutoCloseable
-				if (trackingVariable.methodScope == currentScope.methodScope()) {
-					trackingVariable.markClose(flowInfo, flowContext);
-				} else {
-					trackingVariable.markClosedInNestedMethod();
-				}
-			}
-		}
 	}
 
 	if (nonStatic) {
@@ -185,6 +202,16 @@
 	flowContext.expireNullCheckedFieldInfo(); // no longer trust this info after any message send
 	return flowInfo;
 }
+private void recordCallingClose(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo, Expression closeTarget) {
+	FakedTrackingVariable trackingVariable = FakedTrackingVariable.getCloseTrackingVariable(closeTarget, flowInfo, flowContext);
+	if (trackingVariable != null) { // null happens if target is not a local variable or not an AutoCloseable
+		if (trackingVariable.methodScope == currentScope.methodScope()) {
+			trackingVariable.markClose(flowInfo, flowContext);
+		} else {
+			trackingVariable.markClosedInNestedMethod();
+		}
+	}
+}
 
 // classification of well-known assertion utilities:
 private static final int TRUE_ASSERTION = 1;
@@ -427,9 +454,9 @@
 		// AspectJ accessors.  For example: ajc$privMethod for accessing private
 		// methods on types from a privileged aspect.
 		if (syntheticAccessor.isStatic()) {
-			codeStream.invoke(Opcodes.OPC_invokestatic, this.syntheticAccessor, null /* default declaringClass */);
+			codeStream.invoke(Opcodes.OPC_invokestatic, this.syntheticAccessor, null /* default declaringClass */, this.typeArguments);
 		} else {
-			codeStream.invoke(Opcodes.OPC_invokevirtual, this.syntheticAccessor, null /* default declaringClass */);
+			codeStream.invoke(Opcodes.OPC_invokevirtual, this.syntheticAccessor, null /* default declaringClass */, this.typeArguments);
 		    }
 		// End AspectJ extension
 	}
@@ -499,7 +526,7 @@
 		// End AspectJ extension
 		
 		// depth is set for both implicit and explicit access (see MethodBinding#canBeSeenBy)
-		if (currentScope.enclosingSourceType() != codegenBinding.declaringClass){
+		if (TypeBinding.notEquals(currentScope.enclosingSourceType(), codegenBinding.declaringClass)){
 			this.syntheticAccessor = ((SourceTypeBinding)codegenBinding.declaringClass).addSyntheticMethod(codegenBinding, false /* not super access there */);
 			currentScope.problemReporter().needToEmulateMethodAccess(codegenBinding, this);
 			return;
@@ -532,10 +559,9 @@
 	if (this.binding.isValidBinding()) {
 		// try to retrieve null status of this message send from an annotation of the called method:
 		long tagBits = this.binding.tagBits;
-		if ((tagBits & TagBits.AnnotationNonNull) != 0)
-			return FlowInfo.NON_NULL;
-		if ((tagBits & TagBits.AnnotationNullable) != 0)
-			return FlowInfo.POTENTIALLY_NULL | FlowInfo.POTENTIALLY_NON_NULL;
+		if ((tagBits & TagBits.AnnotationNullMASK) == 0L) // alternatively look for type annotation (will only be present in 1.8+):
+			tagBits = this.binding.returnType.tagBits;
+		return FlowInfo.tagBitsToNullStatus(tagBits);
 	}
 	return FlowInfo.UNKNOWN;
 }
@@ -608,23 +634,29 @@
 	// Base type promotion
 
 	this.constant = Constant.NotAConstant;
+	long sourceLevel = scope.compilerOptions().sourceLevel;
 	boolean receiverCast = false, argsContainCast = false;
 	if (this.receiver instanceof CastExpression) {
 		this.receiver.bits |= ASTNode.DisableUnnecessaryCastCheck; // will check later on
 		receiverCast = true;
 	}
+	// AspectJ Extension: commenting this out for now. An InterTypeScope has been observed
+	// to have an already resolved receiver
+//	if (this.receiver.resolvedType != null)
+//		scope.problemReporter().genericInferenceError("Receiver was unexpectedly found resolved", this); //$NON-NLS-1$
+	// AspectJ Extension: End
 	this.actualReceiverType = this.receiver.resolveType(scope);
 	boolean receiverIsType = this.receiver instanceof NameReference && (((NameReference) this.receiver).bits & Binding.TYPE) != 0;
 	if (receiverCast && this.actualReceiverType != null) {
 		 // due to change of declaring class with receiver type, only identity cast should be notified
-		if (((CastExpression)this.receiver).expression.resolvedType == this.actualReceiverType) {
+		if (TypeBinding.equalsEquals(((CastExpression)this.receiver).expression.resolvedType, this.actualReceiverType)) {
 			scope.problemReporter().unnecessaryCast((CastExpression)this.receiver);
 		}
 	}
 	// resolve type arguments (for generic constructor call)
 	if (this.typeArguments != null) {
 		int length = this.typeArguments.length;
-		boolean argHasError = scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_5; // typeChecks all arguments
+		boolean argHasError = sourceLevel < ClassFileConstants.JDK1_5; // typeChecks all arguments
 		this.genericTypeArguments = new TypeBinding[length];
 		for (int i = 0; i < length; i++) {
 			TypeReference typeReference = this.typeArguments[i];
@@ -646,24 +678,29 @@
 	}
 	// will check for null after args are resolved
 	TypeBinding[] argumentTypes = Binding.NO_PARAMETERS;
-	boolean polyExpressionSeen = false;
 	if (this.arguments != null) {
 		boolean argHasError = false; // typeChecks all arguments
 		int length = this.arguments.length;
 		argumentTypes = new TypeBinding[length];
-		TypeBinding argumentType;
 		for (int i = 0; i < length; i++){
 			Expression argument = this.arguments[i];
+			if (this.arguments[i].resolvedType != null) 
+				scope.problemReporter().genericInferenceError("Argument was unexpectedly found resolved", this); //$NON-NLS-1$
 			if (argument instanceof CastExpression) {
 				argument.bits |= ASTNode.DisableUnnecessaryCastCheck; // will check later on
 				argsContainCast = true;
 			}
 			argument.setExpressionContext(INVOCATION_CONTEXT);
-			if ((argumentType = argumentTypes[i] = argument.resolveType(scope)) == null){
+			if ((argumentTypes[i] = argument.resolveType(scope)) == null){
 				argHasError = true;
 			}
-			if (argumentType != null && argumentType.kind() == Binding.POLY_TYPE)
-				polyExpressionSeen = true;
+			if (sourceLevel >= ClassFileConstants.JDK1_8) {
+				if (argument.isPolyExpression()
+					|| (argument instanceof Invocation && ((Invocation)argument).usesInference())) {
+					if (this.innerInferenceHelper == null)
+						this.innerInferenceHelper = new InnerInferenceHelper();
+				}
+			}
 		}
 		if (argHasError) {
 			if (this.actualReceiverType instanceof ReferenceBinding) {
@@ -674,7 +711,7 @@
 				this.binding =
 					this.receiver.isImplicitThis()
 						? scope.getImplicitMethod(this.selector, pseudoArgs, this)
-						: scope.findMethod((ReferenceBinding) this.actualReceiverType, this.selector, pseudoArgs, this);
+						: scope.findMethod((ReferenceBinding) this.actualReceiverType, this.selector, pseudoArgs, this, false);
 				if (this.binding != null && !this.binding.isValidBinding()) {
 					MethodBinding closestMatch = ((ProblemMethodBinding)this.binding).closestMatch;
 					// record the closest match, for clients who may still need hint about possible method match
@@ -704,14 +741,14 @@
 		return null;
 	}
 	// AspectJ Extension
+	// MERGECONFLICT - very different to how it used to be, what is that findMethodBinding() call?
 	// this.binding = this.receiver.isImplicitThis()
 	//		? scope.getImplicitMethod(this.selector, argumentTypes, this)
 	//		: scope.getMethod(this.actualReceiverType, this.selector, argumentTypes, this);
-	resolveMethodBinding(scope, argumentTypes); // AspectJ Extension - moved to helper method
+	// resolveMethodBinding(scope, argumentTypes); // AspectJ Extension - moved to helper method
 	// End AspectJ Extension
 	
-	if (polyExpressionSeen && polyExpressionsHaveErrors(scope, this.binding, this.arguments, argumentTypes))
-		return null;
+	findMethodBinding(scope, argumentTypes);
 
 	if (!this.binding.isValidBinding()) {
 		if (this.binding.declaringClass == null) {
@@ -763,10 +800,19 @@
 		return null;
 	}
 
-	if (compilerOptions.isAnnotationBasedNullAnalysisEnabled && (this.binding.tagBits & TagBits.IsNullnessKnown) == 0) {
-		// not interested in reporting problems against this.binding:
-		new ImplicitNullAnnotationVerifier(compilerOptions.inheritNullAnnotations)
-				.checkImplicitNullAnnotations(this.binding, null/*srcMethod*/, false, scope);
+	if (compilerOptions.isAnnotationBasedNullAnalysisEnabled) {
+		if ((this.binding.tagBits & TagBits.IsNullnessKnown) == 0) {
+			// not interested in reporting problems against this.binding:
+			new ImplicitNullAnnotationVerifier(scope.environment(), compilerOptions.inheritNullAnnotations)
+					.checkImplicitNullAnnotations(this.binding, null/*srcMethod*/, false, scope);
+		}
+		if (compilerOptions.sourceLevel >= ClassFileConstants.JDK1_8) {
+			if (this.binding instanceof ParameterizedGenericMethodBinding && this.typeArguments != null) {
+				TypeVariableBinding[] typeVariables = this.binding.original().typeVariables();
+				for (int i = 0; i < this.typeArguments.length; i++)
+					this.typeArguments[i].checkNullConstraints(scope, typeVariables, i);
+			}
+		}
 	}
 	
 	if (((this.bits & ASTNode.InsideExpressionStatement) != 0)
@@ -792,7 +838,7 @@
 			TypeBinding oldReceiverType = this.actualReceiverType;
 			this.actualReceiverType = this.actualReceiverType.getErasureCompatibleType(this.binding.declaringClass);
 			this.receiver.computeConversion(scope, this.actualReceiverType, this.actualReceiverType);
-			if (this.actualReceiverType != oldReceiverType && this.receiver.postConversionType(scope) != this.actualReceiverType) { // record need for explicit cast at codegen since receiver could not handle it
+			if (TypeBinding.notEquals(this.actualReceiverType, oldReceiverType) && TypeBinding.notEquals(this.receiver.postConversionType(scope), this.actualReceiverType)) { // record need for explicit cast at codegen since receiver could not handle it
 				this.bits |= NeedReceiverGenericCast;
 			}
 		}
@@ -801,7 +847,7 @@
 		if (!(this.receiver.isImplicitThis() || this.receiver.isSuper() || receiverIsType)) {
 			scope.problemReporter().nonStaticAccessToStaticMethod(this, this.binding);
 		}
-		if (!this.receiver.isImplicitThis() && this.binding.declaringClass != this.actualReceiverType) {
+		if (!this.receiver.isImplicitThis() && TypeBinding.notEquals(this.binding.declaringClass, this.actualReceiverType)) {
 			scope.problemReporter().indirectAccessToStaticMethod(this, this.binding);
 		}
 	}
@@ -857,10 +903,84 @@
 	if (this.typeArguments != null && this.binding.original().typeVariables == Binding.NO_TYPE_VARIABLES) {
 		scope.problemReporter().unnecessaryTypeArgumentsForMethodInvocation(this.binding, this.genericTypeArguments, this.typeArguments);
 	}
+	recordExceptionsForEnclosingLambda(scope, this.binding.thrownExceptions);
 	return (this.resolvedType.tagBits & TagBits.HasMissingType) == 0
 				? this.resolvedType
 				: null;
 }
+/**
+ * Find the method binding; 
+ * if this.innersNeedUpdate allow for two attempts where the first round may stop
+ * after applicability checking (18.5.1) to include more information into the final
+ * invocation type inference (18.5.2).
+ */
+protected void findMethodBinding(BlockScope scope, TypeBinding[] argumentTypes) {
+	resolveMethodBinding(scope, argumentTypes);
+//	this.binding = this.receiver.isImplicitThis()
+//			? scope.getImplicitMethod(this.selector, argumentTypes, this)
+//			: scope.getMethod(this.actualReceiverType, this.selector, argumentTypes, this);
+	resolvePolyExpressionArguments(this, this.binding, argumentTypes, scope);
+	
+	/* There are embedded assumptions in the JLS8 type inference scheme that a successful solution of the type equations results in an
+	   applicable method. This appears to be a tenuous assumption, at least one not made by the JLS7 engine or the reference compiler and 
+	   there are cases where this assumption would appear invalid: See https://bugs.eclipse.org/bugs/show_bug.cgi?id=426537, where we allow 
+	   certain compatibility constrains around raw types to be violated. 
+       
+       Here, we filter out such inapplicable methods with raw type usage that may have sneaked past overload resolution and type inference, 
+       playing the devils advocate, blaming the invocations with raw arguments that should not go blameless. At this time this is in the 
+       nature of a point fix and is not a general solution which needs to come later (that also includes AE, QAE and ECC)
+    */
+	final CompilerOptions compilerOptions = scope.compilerOptions();
+	if (compilerOptions.sourceLevel >= ClassFileConstants.JDK1_8 && this.binding instanceof ParameterizedGenericMethodBinding && this.binding.isValidBinding()) {
+		if (!compilerOptions.postResolutionRawTypeCompatibilityCheck)
+			return;
+		ParameterizedGenericMethodBinding pgmb = (ParameterizedGenericMethodBinding) this.binding;
+		InferenceContext18 ctx = getInferenceContext(pgmb);
+		if (ctx == null || ctx.stepCompleted < InferenceContext18.BINDINGS_UPDATED)
+			return;
+		int length = pgmb.typeArguments == null ? 0 : pgmb.typeArguments.length;
+		boolean sawRawType = false;
+		for (int i = 0;  i < length; i++) {
+			/* Must check compatibility against capture free method. Formal parameters cannot have captures, but our machinery is not up to snuff to
+			   construct a PGMB without captures at the moment - for one thing ITCB does not support uncapture() yet, for another, INTERSECTION_CAST_TYPE
+			   does not appear fully hooked up into isCompatibleWith and isEquivalent to everywhere. At the moment, bail out if we see capture.
+			*/   
+			if (pgmb.typeArguments[i].isCapture())
+				return;
+			if (pgmb.typeArguments[i].isRawType())
+				sawRawType = true;
+		}
+		if (!sawRawType)
+			return;
+		length = this.arguments == null ? 0 : this.arguments.length;
+		if (length == 0)
+			return;
+		TypeBinding [] finalArgumentTypes = new TypeBinding[length];
+		for (int i = 0; i < length; i++) {
+			TypeBinding finalArgumentType = this.arguments[i].resolvedType;
+			if (finalArgumentType == null || !finalArgumentType.isValidBinding())  // already sided with the devil.
+				return;
+			finalArgumentTypes[i] = finalArgumentType; 
+		}
+		if (scope.parameterCompatibilityLevel(this.binding, finalArgumentTypes, false) == Scope.NOT_COMPATIBLE)
+			this.binding = new ProblemMethodBinding(this.binding.original(), this.binding.selector, finalArgumentTypes, ProblemReasons.NotFound);
+	}
+}
+
+@Override
+public TypeBinding checkAgainstFinalTargetType(TypeBinding targetType, Scope scope) {
+	if (this.binding instanceof ParameterizedGenericMethodBinding) {
+		InferenceContext18 ctx = getInferenceContext((ParameterizedMethodBinding) this.binding);
+		if (ctx != null && ctx.stepCompleted < InferenceContext18.TYPE_INFERRED) {
+			this.expectedType = targetType;
+			MethodBinding updatedBinding = ctx.inferInvocationType(this, (ParameterizedGenericMethodBinding) this.binding);
+			if (updateBindings(updatedBinding, targetType)) {
+				ASTNode.resolvePolyExpressionArguments(this, updatedBinding, scope);
+			}
+		}
+	}
+	return this.resolvedType;
+}
 
 public void setActualReceiverType(ReferenceBinding receiverType) {
 	if (receiverType == null) return; // error scenario only
@@ -892,7 +1012,11 @@
 
        We are in no position to ascertain the last two until after resolution has happened. So no client should
        depend on asking this question before resolution.
-	*/
+	 */
+	return isPolyExpression(this.binding);
+}
+/** Variant of isPolyExpression() to be used during type inference, when a resolution candidate exists. */
+public boolean isPolyExpression(MethodBinding resolutionCandidate) {
 	if (this.expressionContext != ASSIGNMENT_CONTEXT && this.expressionContext != INVOCATION_CONTEXT)
 		return false;
 	
@@ -902,22 +1026,32 @@
 	if (this.constant != Constant.NotAConstant)
 		throw new UnsupportedOperationException("Unresolved MessageSend can't be queried if it is a polyexpression"); //$NON-NLS-1$
 	
-	if (this.binding != null && this.binding instanceof ParameterizedGenericMethodBinding) {
-		ParameterizedGenericMethodBinding pgmb = (ParameterizedGenericMethodBinding) this.binding;
-		return pgmb.inferredReturnType;
+	if (resolutionCandidate != null) {
+		if (resolutionCandidate instanceof ParameterizedGenericMethodBinding) {
+			ParameterizedGenericMethodBinding pgmb = (ParameterizedGenericMethodBinding) resolutionCandidate;
+			if (pgmb.inferredReturnType)
+				return true; // if already determined
+		} 
+		if (resolutionCandidate.returnType != null) {
+			// resolution may have prematurely instantiated the generic method, we need the original, though:
+			MethodBinding candidateOriginal = resolutionCandidate.original();
+			return candidateOriginal.returnType.mentionsAny(candidateOriginal.typeVariables(), -1);
+		}
 	}
 	
 	return false;
 }
 
-public boolean tIsMoreSpecific(TypeBinding t, TypeBinding s) {
-	return isPolyExpression() ? !t.isBaseType() && s.isBaseType() : super.tIsMoreSpecific(t, s);
+public boolean sIsMoreSpecific(TypeBinding s, TypeBinding t, Scope scope) {
+	if (super.sIsMoreSpecific(s, t, scope))
+		return true;
+	return isPolyExpression() ? !s.isBaseType() && t.isBaseType() : false;
 }
 
 public void setFieldIndex(int depth) {
 	// ignore for here
 }
-public TypeBinding expectedType() {
+public TypeBinding invocationTargetType() {
 	return this.expectedType;
 }
 
@@ -943,6 +1077,63 @@
 public boolean receiverIsImplicitThis() {
 	return this.receiver.isImplicitThis();
 }
+// -- interface Invocation: --
+public MethodBinding binding(TypeBinding targetType, boolean reportErrors, Scope scope) {
+	if (reportErrors) {
+		if (this.binding == null)
+			scope.problemReporter().genericInferenceError("method is unexpectedly unresolved", this); //$NON-NLS-1$
+		else if (!this.binding.isValidBinding())
+			scope.problemReporter().invalidMethod(this, this.binding);
+	}
+	return this.binding;
+}
+public Expression[] arguments() {
+	return this.arguments;
+}
+public ExpressionContext getExpressionContext() {
+	return this.expressionContext;
+}
+public void registerInferenceContext(ParameterizedGenericMethodBinding method, InferenceContext18 infCtx18) {
+	if (this.inferenceContexts == null)
+		this.inferenceContexts = new SimpleLookupTable();
+	this.inferenceContexts.put(method, infCtx18);
+}
+public InferenceContext18 getInferenceContext(ParameterizedMethodBinding method) {
+	if (this.inferenceContexts == null)
+		return null;
+	return (InferenceContext18) this.inferenceContexts.get(method);
+}
+public boolean usesInference() {
+	return (this.binding instanceof ParameterizedGenericMethodBinding) 
+			&& getInferenceContext((ParameterizedGenericMethodBinding) this.binding) != null;
+}
+public boolean updateBindings(MethodBinding updatedBinding, TypeBinding targetType) {
+	boolean hasUpdate = this.binding != updatedBinding;
+	if (this.inferenceContexts != null) {
+		InferenceContext18 ctx = (InferenceContext18)this.inferenceContexts.removeKey(this.binding);
+		if (ctx != null && updatedBinding instanceof ParameterizedGenericMethodBinding) {
+			this.inferenceContexts.put(updatedBinding, ctx);
+			// solution may have come from an outer inference, mark now that this (inner) is done (but not deep inners):
+			hasUpdate |= ctx.registerSolution(targetType, updatedBinding);
+		}
+	}
+	this.binding = updatedBinding;
+	this.resolvedType = updatedBinding.returnType;
+	return hasUpdate;
+}
+public boolean innersNeedUpdate() {
+	return this.innerInferenceHelper != null;
+}
+public void innerUpdateDone() {
+	this.innerInferenceHelper = null;
+}
+public InnerInferenceHelper innerInferenceHelper() {
+	return this.innerInferenceHelper;
+}
+// -- Interface InvocationSite: --
+public InferenceContext18 freshInferenceContext(Scope scope) {
+	return new InferenceContext18(scope, this.arguments, this);
+}
 
 // AspectJ Extension
 protected void resolveMethodBinding(
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java
index 5288fd5..179acae 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -18,6 +14,9 @@
  *								bug 368546 - [compiler][resource] Avoid remaining false positives found when compiling the Eclipse SDK
  *								bug 382353 - [1.8][compiler] Implementation property modifiers should be accepted on default methods.
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 416176 - [1.8][compiler][null] null type annotations cause grief on type variables
  *     Jesper S Moller <jesper@selskabet.org> - Contributions for
  *								bug 378674 - "The method can be declared as static" is wrong
  *******************************************************************************/
@@ -106,7 +105,10 @@
 					FlowInfo.DEAD_END);
 
 			// nullity and mark as assigned
-			analyseArguments(flowInfo, this.arguments, this.binding);
+			if (classScope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_8)
+				analyseArguments(flowInfo, this.arguments, this.binding);
+			else
+				analyseArguments18(flowInfo, this.arguments, this.binding);
 
 			if (this.binding.declaringClass instanceof MemberTypeBinding && !this.binding.declaringClass.isStatic()) {
 				// method of a non-static member type can't be static.
@@ -162,7 +164,7 @@
 	}
 
 	public void getAllAnnotationContexts(int targetType, List allAnnotationContexts) {
-		AnnotationCollector collector = new AnnotationCollector(this, targetType, allAnnotationContexts);
+		AnnotationCollector collector = new AnnotationCollector(this.returnType, targetType, allAnnotationContexts);
 		for (int i = 0, max = this.annotations.length; i < max; i++) {
 			Annotation annotation = this.annotations[i];
 			annotation.traverse(collector, (BlockScope) null);
@@ -207,8 +209,8 @@
 			for (int i = 0, length = this.typeParameters.length; i < length; i++) {
 				TypeParameter typeParameter = this.typeParameters[i];
 				this.bits |= (typeParameter.bits & ASTNode.HasTypeAnnotations);
-				typeParameter.resolve(this.scope);
-				if (returnsUndeclTypeVar && this.typeParameters[i].binding == this.returnType.resolvedType) {
+				// typeParameter is already resolved from Scope#connectTypeVariables()
+				if (returnsUndeclTypeVar && TypeBinding.equalsEquals(this.typeParameters[i].binding, this.returnType.resolvedType)) {
 					returnsUndeclTypeVar = false;
 				}
 			}
@@ -350,11 +352,4 @@
 	public TypeParameter[] typeParameters() {
 	    return this.typeParameters;
 	}
-	
-	void validateNullAnnotations() {
-		super.validateNullAnnotations();
-		// null-annotations on the return type?
-		if (this.binding != null)
-			this.scope.validateNullAnnotation(this.binding.tagBits, this.returnType, this.annotations);
-	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NameReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NameReference.java
index 775897e..853a28b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NameReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NameReference.java
@@ -5,14 +5,12 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 331649 - [compiler][null] consider null annotations for fields
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 426996 - [1.8][inference] try to avoid method Expression.unresolve()? 
  *     Jesper S Moller - Contributions for
  *							bug 382721 - [1.8][compiler] Effectively final variables needs special treatment
  *******************************************************************************/
@@ -55,6 +53,10 @@
 	return null;
 }
 
+public InferenceContext18 freshInferenceContext(Scope scope) {
+	return null;
+}
+
 public boolean isSuperAccess() {
 	return false;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.java
index f745051..bbf60be 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java
new file mode 100644
index 0000000..5015992
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 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.aspectj.org.eclipse.jdt.internal.compiler.ast;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowContext;
+import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowInfo;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.CaptureBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemReasons;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBindingVisitor;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.VariableBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.WildcardBinding;
+
+/**
+ * Performs matching of null type annotations.
+ * Instances are used to encode result from this analysis.
+ * @since 3.10
+ */
+public class NullAnnotationMatching {
+	
+	public static final NullAnnotationMatching NULL_ANNOTATIONS_OK = new NullAnnotationMatching(0, null);
+	public static final NullAnnotationMatching NULL_ANNOTATIONS_UNCHECKED = new NullAnnotationMatching(1, null);
+	public static final NullAnnotationMatching NULL_ANNOTATIONS_MISMATCH = new NullAnnotationMatching(2, null);
+
+	/** 0 = OK, 1 = unchecked, 2 = definite mismatch */
+	public final int severity;
+	
+	/** If non-null this field holds the supertype of the provided type which was used for direct matching. */
+	public final TypeBinding superTypeHint;
+	
+	public NullAnnotationMatching(int severity, TypeBinding superTypeHint) {
+		this.severity = severity;
+		this.superTypeHint = superTypeHint;
+	}
+
+	public boolean isAnyMismatch()      { return this.severity != 0; }
+	public boolean isUnchecked()        { return this.severity == 1; }
+	public boolean isDefiniteMismatch() { return this.severity == 2; }
+	
+	public String superTypeHintName(CompilerOptions options, boolean shortNames) {
+		return String.valueOf(this.superTypeHint.nullAnnotatedReadableName(options, shortNames));
+	}
+	
+	/** Check null-ness of 'var' against a possible null annotation */
+	public static int checkAssignment(BlockScope currentScope, FlowContext flowContext,
+									   VariableBinding var, int nullStatus, Expression expression, TypeBinding providedType)
+	{
+		long lhsTagBits = 0L;
+		boolean hasReported = false;
+		if (currentScope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_8) {
+			lhsTagBits = var.tagBits & TagBits.AnnotationNullMASK;
+		} else {
+			if (expression instanceof ConditionalExpression && expression.isPolyExpression()) {
+				// drill into both branches:
+				ConditionalExpression ce = ((ConditionalExpression) expression);
+				int status1 = NullAnnotationMatching.checkAssignment(currentScope, flowContext, var, ce.ifTrueNullStatus, ce.valueIfTrue, ce.valueIfTrue.resolvedType);
+				int status2 = NullAnnotationMatching.checkAssignment(currentScope, flowContext, var, ce.ifFalseNullStatus, ce.valueIfFalse, ce.valueIfFalse.resolvedType);
+				if (status1 == status2)
+					return status1;
+				return nullStatus; // if both branches disagree use the precomputed & merged nullStatus
+			}
+			lhsTagBits = var.type.tagBits & TagBits.AnnotationNullMASK;
+			NullAnnotationMatching annotationStatus = analyse(var.type, providedType, nullStatus);
+			if (annotationStatus.isDefiniteMismatch()) {
+				currentScope.problemReporter().nullityMismatchingTypeAnnotation(expression, providedType, var.type, annotationStatus);
+				hasReported = true;
+			} else if (annotationStatus.isUnchecked()) {
+				flowContext.recordNullityMismatch(currentScope, expression, providedType, var.type, nullStatus);
+				hasReported = true;
+			}
+		}
+		if (lhsTagBits == TagBits.AnnotationNonNull && nullStatus != FlowInfo.NON_NULL) {
+			if (!hasReported)
+				flowContext.recordNullityMismatch(currentScope, expression, providedType, var.type, nullStatus);
+			return FlowInfo.NON_NULL;
+		} else if (lhsTagBits == TagBits.AnnotationNullable && nullStatus == FlowInfo.UNKNOWN) {	// provided a legacy type?
+			return FlowInfo.POTENTIALLY_NULL;			// -> use more specific info from the annotation
+		}
+		return nullStatus;
+	}
+
+	/**
+	 * Find any mismatches between the two given types, which are caused by null type annotations.
+	 * @param requiredType
+	 * @param providedType
+	 * @param nullStatus we are only interested in NULL or NON_NULL, -1 indicates that we are in a recursion, where flow info is ignored
+	 * @return a status object representing the severity of mismatching plus optionally a supertype hint
+	 */
+	public static NullAnnotationMatching analyse(TypeBinding requiredType, TypeBinding providedType, int nullStatus) {
+		return analyse(requiredType, providedType, nullStatus, false);
+	}
+	// additional parameter strict: if true we do not tolerate incompatibly missing annotations on type parameters (for overriding analysis)
+	public static NullAnnotationMatching analyse(TypeBinding requiredType, TypeBinding providedType, int nullStatus, boolean strict) {
+		int severity = 0;
+		TypeBinding superTypeHint = null;
+		if (requiredType instanceof ArrayBinding) {
+			long[] requiredDimsTagBits = ((ArrayBinding)requiredType).nullTagBitsPerDimension;
+			if (requiredDimsTagBits != null) {
+				int dims = requiredType.dimensions();
+				if (requiredType.dimensions() == providedType.dimensions()) {
+					long[] providedDimsTagBits = ((ArrayBinding)providedType).nullTagBitsPerDimension;
+					if (providedDimsTagBits == null) {
+						severity = 1; // required is annotated, provided not, need unchecked conversion
+					} else {
+						for (int i=0; i<=dims; i++) {
+							long requiredBits = validNullTagBits(requiredDimsTagBits[i]);
+							long providedBits = validNullTagBits(providedDimsTagBits[i]);
+							if (i > 0)
+								nullStatus = -1; // don't use beyond the outermost dimension
+							severity = Math.max(severity, computeNullProblemSeverity(requiredBits, providedBits, nullStatus, strict));
+							if (severity == 2)
+								return NullAnnotationMatching.NULL_ANNOTATIONS_MISMATCH;
+						}
+					}
+				} else if (providedType.id == TypeIds.T_null) {
+					if (dims > 0 && requiredDimsTagBits[0] == TagBits.AnnotationNonNull)
+						return NullAnnotationMatching.NULL_ANNOTATIONS_MISMATCH;
+				}
+			}
+		} else if (requiredType.hasNullTypeAnnotations() || providedType.hasNullTypeAnnotations()) {
+			long requiredBits = requiredNullTagBits(requiredType);
+			if (requiredBits != TagBits.AnnotationNullable // nullable lhs accepts everything, ...
+					|| nullStatus == -1) // only at detail/recursion even nullable must be matched exactly
+			{
+				long providedBits = providedNullTagBits(providedType);
+				severity = computeNullProblemSeverity(requiredBits, providedBits, nullStatus, strict && nullStatus == -1);
+			}
+			if (severity < 2) {
+				TypeBinding providedSuper = providedType.findSuperTypeOriginatingFrom(requiredType);
+				if (providedSuper != providedType) //$IDENTITY-COMPARISON$
+					superTypeHint = providedSuper;
+				if (requiredType.isParameterizedType()  && providedSuper instanceof ParameterizedTypeBinding) { // TODO(stephan): handle providedType.isRaw()
+					TypeBinding[] requiredArguments = ((ParameterizedTypeBinding) requiredType).arguments;
+					TypeBinding[] providedArguments = ((ParameterizedTypeBinding) providedSuper).arguments;
+					if (requiredArguments != null && providedArguments != null && requiredArguments.length == providedArguments.length) {
+						for (int i = 0; i < requiredArguments.length; i++) {
+							NullAnnotationMatching status = analyse(requiredArguments[i], providedArguments[i], -1, strict);
+							severity = Math.max(severity, status.severity);
+							if (severity == 2)
+								return new NullAnnotationMatching(severity, superTypeHint);
+						}
+					}
+				}
+				TypeBinding requiredEnclosing = requiredType.enclosingType();
+				TypeBinding providedEnclosing = providedType.enclosingType();
+				if (requiredEnclosing != null && providedEnclosing != null) {
+					NullAnnotationMatching status = analyse(requiredEnclosing, providedEnclosing, -1, strict);
+					severity = Math.max(severity, status.severity);
+				}
+			}
+		}
+		if (severity == 0)
+			return NullAnnotationMatching.NULL_ANNOTATIONS_OK;
+		return new NullAnnotationMatching(severity, superTypeHint);
+	}
+
+	// interpreting 'type' as a required type, compute the required null bits
+	// we inspect the main type plus bounds of type variables and wildcards
+	static long requiredNullTagBits(TypeBinding type) {
+
+		long tagBits = type.tagBits & TagBits.AnnotationNullMASK;
+		if (tagBits != 0)
+			return validNullTagBits(tagBits);
+
+		if (type.isWildcard()) {
+			WildcardBinding wildcard = (WildcardBinding)type;
+			if (wildcard.boundKind == Wildcard.UNBOUND)
+				return 0;
+			tagBits = wildcard.bound.tagBits & TagBits.AnnotationNullMASK;
+			if (tagBits == 0)
+				return 0;
+			switch (wildcard.boundKind) {
+				case Wildcard.EXTENDS :
+					if (tagBits == TagBits.AnnotationNonNull)
+						return TagBits.AnnotationNonNull;
+					return TagBits.AnnotationNullMASK; // wildcard accepts @Nullable or better
+				case Wildcard.SUPER :
+					if (tagBits == TagBits.AnnotationNullable)
+						return TagBits.AnnotationNullable;
+					return TagBits.AnnotationNullMASK; // wildcard accepts @NonNull or worse
+			}
+			return 0;
+		} 
+		
+		if (type.isTypeVariable()) {
+			// assume we must require @NonNull, unless: (1) lower @Nullable bound, or (2) no nullness specified
+			TypeVariableBinding typeVariable = (TypeVariableBinding)type;
+			boolean haveNullBits = false;
+			if (type.isCapture()) {
+				TypeBinding lowerBound = ((CaptureBinding) type).lowerBound;
+				if (lowerBound != null) {
+					tagBits = lowerBound.tagBits & TagBits.AnnotationNullMASK;
+					if (tagBits == TagBits.AnnotationNullable)
+						return TagBits.AnnotationNullable; // (1) type cannot require @NonNull
+					haveNullBits = tagBits != 0;
+				}
+			}
+			if (typeVariable.firstBound != null)
+				haveNullBits |= (typeVariable.firstBound.tagBits & TagBits.AnnotationNullMASK) != 0;
+			if (haveNullBits)
+				return TagBits.AnnotationNonNull; // could require @NonNull (unless (2) unspecified nullness)
+		}
+
+		return 0;
+	}
+
+	// interpreting 'type' as a provided type, compute the provide null bits
+	// we inspect the main type plus bounds of type variables and wildcards
+	static long providedNullTagBits(TypeBinding type) {
+
+		long tagBits = type.tagBits & TagBits.AnnotationNullMASK;
+		if (tagBits != 0)
+			return validNullTagBits(tagBits);
+		
+		if (type.isWildcard()) { // wildcard can be 'provided' during inheritance checks
+			WildcardBinding wildcard = (WildcardBinding)type;
+			if (wildcard.boundKind == Wildcard.UNBOUND)
+				return 0;
+			tagBits = wildcard.bound.tagBits & TagBits.AnnotationNullMASK;
+			if (tagBits == 0)
+				return 0;
+			switch (wildcard.boundKind) {
+				case Wildcard.EXTENDS :
+					if (tagBits == TagBits.AnnotationNonNull)
+						return TagBits.AnnotationNonNull;
+					return TagBits.AnnotationNullMASK; // @Nullable or better
+				case Wildcard.SUPER :
+					if (tagBits == TagBits.AnnotationNullable)
+						return TagBits.AnnotationNullable;
+					return TagBits.AnnotationNullMASK; // @NonNull or worse
+			}
+			return 0;
+		}
+	
+		if (type.isTypeVariable()) { // incl. captures
+			TypeVariableBinding typeVariable = (TypeVariableBinding)type;
+			boolean haveNullBits = false;
+			if (typeVariable.isCapture()) {
+				TypeBinding lowerBound = ((CaptureBinding) typeVariable).lowerBound;
+				if (lowerBound != null) {
+					tagBits = lowerBound.tagBits & TagBits.AnnotationNullMASK;
+					if (tagBits == TagBits.AnnotationNullable)
+						return TagBits.AnnotationNullable; // cannot be @NonNull
+					haveNullBits |= (tagBits != 0);
+				}
+			}
+			if (typeVariable.firstBound != null) {
+				long boundBits = typeVariable.firstBound.tagBits & TagBits.AnnotationNullMASK;
+				if (boundBits == TagBits.AnnotationNonNull)
+					return TagBits.AnnotationNonNull; // cannot be @Nullable
+				haveNullBits |= (boundBits != 0);
+			}
+			if (haveNullBits)
+				return TagBits.AnnotationNullMASK; // could be either, can only match to a wildcard accepting both
+		}
+
+		return 0;
+	}
+
+	public static long validNullTagBits(long bits) {
+		bits &= TagBits.AnnotationNullMASK;
+		return bits == TagBits.AnnotationNullMASK ? 0 : bits;
+	}
+	
+	/** Provided that both types are {@link TypeBinding#equalsEquals}, return the one that is more likely to show null at runtime. */
+	public static TypeBinding moreDangerousType(TypeBinding one, TypeBinding two) {
+		if (one == null) return null;
+		long oneNullBits = validNullTagBits(one.tagBits);
+		long twoNullBits = validNullTagBits(two.tagBits);
+		if (oneNullBits != twoNullBits) {
+			if (oneNullBits == TagBits.AnnotationNullable)
+				return one;			// nullable is dangerous
+			if (twoNullBits == TagBits.AnnotationNullable)
+				return two;			// nullable is dangerous
+			// below this point we have unknown vs. nonnull, which is which?
+			if (oneNullBits == 0)
+				return one;			// unknown is more dangerous than nonnull
+			return two;				// unknown is more dangerous than nonnull
+		} else if (one != two) { //$IDENTITY-COMPARISON$
+			if (analyse(one, two, -1).isAnyMismatch())
+				return two;			// two doesn't snugly fit into one, so it must be more dangerous
+		}
+		return one;
+	}
+
+	private static int computeNullProblemSeverity(long requiredBits, long providedBits, int nullStatus, boolean strict) {
+		if ((requiredBits != 0 || strict) && requiredBits != providedBits) {
+			if (requiredBits == TagBits.AnnotationNonNull && nullStatus == FlowInfo.NON_NULL) {
+				return 0; // OK by flow analysis
+			}
+			if (requiredBits == TagBits.AnnotationNullMASK)
+				return 0; // OK since LHS accepts either
+			if (providedBits != 0) {
+				return 2; // mismatching annotations
+			} else {
+				return 1; // need unchecked conversion regarding type detail
+			}
+		}
+		return 0; // OK by tagBits
+	}
+
+	/**
+	 * After a method has substituted type parameters, check if this resulted in any contradictory null annotations.
+	 * Problems are either reported directly (if scope != null) or by returning a ProblemMethodBinding.
+	 */
+	public static MethodBinding checkForContraditions(
+			final MethodBinding method, final InvocationSite invocationSite, final Scope scope) {
+		
+		class SearchContradictions extends TypeBindingVisitor {
+			ReferenceBinding typeWithContradiction;
+			@Override
+			public boolean visit(ReferenceBinding referenceBinding) {
+				if ((referenceBinding.tagBits & TagBits.AnnotationNullMASK) == TagBits.AnnotationNullMASK) {
+					this.typeWithContradiction = referenceBinding;
+					return false;
+				}
+				return true;
+			}
+			@Override
+			public boolean visit(TypeVariableBinding typeVariable) {
+				return visit((ReferenceBinding)typeVariable);
+			}
+			@Override
+			public boolean visit(RawTypeBinding rawType) {
+				return visit((ReferenceBinding)rawType);
+			}
+		}
+
+		SearchContradictions searchContradiction = new SearchContradictions();
+		TypeBindingVisitor.visit(searchContradiction, method.returnType);
+		if (searchContradiction.typeWithContradiction != null) {
+			if (scope == null)
+				return new ProblemMethodBinding(method, method.selector, method.parameters, ProblemReasons.ContradictoryNullAnnotations);
+			scope.problemReporter().contradictoryNullAnnotationsInferred(method, invocationSite);
+			// note: if needed, we might want to update the method by removing the contradictory annotations??
+			return method;
+		}
+
+		Expression[] arguments = null;
+		if (invocationSite instanceof Invocation)
+			arguments = ((Invocation)invocationSite).arguments();
+		for (int i = 0; i < method.parameters.length; i++) {
+			TypeBindingVisitor.visit(searchContradiction, method.parameters[i]);
+			if (searchContradiction.typeWithContradiction != null) {
+				if (scope == null)
+					return new ProblemMethodBinding(method, method.selector, method.parameters, ProblemReasons.ContradictoryNullAnnotations);
+				if (arguments != null && i < arguments.length)
+					scope.problemReporter().contradictoryNullAnnotationsInferred(method, arguments[i]);
+				else
+					scope.problemReporter().contradictoryNullAnnotationsInferred(method, invocationSite);
+				return method;
+			}
+		}
+		return method;
+	}
+}
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.java
index fa95961..48f4a7b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.java
@@ -1200,7 +1200,7 @@
 		//  0000   0000       0000   0000      0000
 		//  <<16   <<12       <<8    <<4
 
-		int[] table = (int[]) get_PLUS().clone();
+		int[] table = get_PLUS().clone();
 
 		// customization
 		table[(T_JavaLangString<<4)+T_byte] 		= T_undefined;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java
index 9cc3869..5024d3b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java
@@ -5,15 +5,13 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
  *								bug 342671 - ClassCastException: org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding cannot be cast to org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding
  *								bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 416181 – [1.8][compiler][null] Invalid assignment is not rejected by the compiler
  *        Andy Clement - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
  *******************************************************************************/
@@ -56,7 +54,7 @@
 	}
 	public ParameterizedQualifiedTypeReference(char[][] tokens, TypeReference[][] typeArguments, int dim, Annotation[][] annotationsOnDimensions, long[] positions) {
 		this(tokens, typeArguments, dim, positions);
-		this.annotationsOnDimensions = annotationsOnDimensions;
+		setAnnotationsOnDimensions(annotationsOnDimensions);
 		if (annotationsOnDimensions != null) {
 			this.bits |= ASTNode.HasTypeAnnotations;
 		}
@@ -83,16 +81,15 @@
 			}
 		}
 	}
-	public TypeReference copyDims(int dim){
-		return new ParameterizedQualifiedTypeReference(this.tokens, this.typeArguments, dim, this.sourcePositions);
-	}
-	public TypeReference copyDims(int dim, Annotation[][] dimensionAnnotations){
-		ParameterizedQualifiedTypeReference parameterizedQualifiedTypeReference = new ParameterizedQualifiedTypeReference(this.tokens, this.typeArguments, dim, dimensionAnnotations, this.sourcePositions);
-		parameterizedQualifiedTypeReference.bits |= (this.bits & ASTNode.HasTypeAnnotations);
-		if (dimensionAnnotations != null) {
-			parameterizedQualifiedTypeReference.bits |= ASTNode.HasTypeAnnotations;
-		}
-		return parameterizedQualifiedTypeReference;
+	public TypeReference augmentTypeWithAdditionalDimensions(int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs) {
+		int totalDimensions = this.dimensions() + additionalDimensions;
+		Annotation [][] allAnnotations = getMergedAnnotationsOnDimensions(additionalDimensions, additionalAnnotations);
+		ParameterizedQualifiedTypeReference pqtr = new ParameterizedQualifiedTypeReference(this.tokens, this.typeArguments, totalDimensions, allAnnotations, this.sourcePositions);
+		pqtr.annotations = this.annotations;
+		pqtr.bits |= (this.bits & ASTNode.HasTypeAnnotations);
+		if (!isVarargs)
+			pqtr.extendedDimensions = additionalDimensions;
+		return pqtr;
 	}
 	public boolean isParameterizedTypeReference() {
 		return true;
@@ -135,6 +132,10 @@
 		return qParamName;
 	}
 
+	public TypeReference[][] getTypeArguments() {
+		return this.typeArguments;
+	}
+	
 	/* (non-Javadoc)
      * @see org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference#getTypeBinding(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope)
      */
@@ -166,9 +167,12 @@
 			}
 		}
 		this.bits |= ASTNode.DidResolve;
-		resolveAnnotations(scope);
 		TypeBinding type = internalResolveLeafType(scope, checkBounds);
 		createArrayType(scope);
+		resolveAnnotations(scope);
+		if (this.typeArguments != null)
+			// relevant null annotations are on the inner most type:
+			checkNullConstraints(scope, this.typeArguments[this.typeArguments.length-1]); 
 		return type == null ? type : this.resolvedType;
 	}
 	private TypeBinding internalResolveLeafType(Scope scope, boolean checkBounds) {
@@ -231,14 +235,15 @@
 						: scope.environment().convertToParameterizedType(qualifyingType);
 				}
 			} else {
-				 rejectAnnotationsOnStaticMemberQualififer(scope, currentType, i);
+				if (this.annotations != null)
+					rejectAnnotationsOnStaticMemberQualififer(scope, currentType, this.annotations[i-1]);
 				if (typeIsConsistent && currentType.isStatic()
 						&& (qualifyingType.isParameterizedTypeWithActualArguments() || qualifyingType.isGenericType())) {
 					scope.problemReporter().staticMemberOfParameterizedType(this, scope.environment().createParameterizedType((ReferenceBinding)currentType.erasure(), null, qualifyingType), i);
 					typeIsConsistent = false;
 				}
 				ReferenceBinding enclosingType = currentType.enclosingType();
-				if (enclosingType != null && enclosingType.erasure() != qualifyingType.erasure()) { // qualifier != declaring/enclosing
+				if (enclosingType != null && TypeBinding.notEquals(enclosingType.erasure(), qualifyingType.erasure())) { // qualifier != declaring/enclosing
 					qualifyingType = enclosingType; // inherited member type, leave it associated with its enclosing rather than subtype
 				}
 			}
@@ -264,10 +269,7 @@
 					if (argType == null) {
 						argHasError = true;
 					} else {
-						if (arg.annotations != null)
-							argTypes[j] = captureTypeAnnotations(scope, qualifyingType, argType, arg.annotations[0]);
-						else
-							argTypes[j] = argType;
+						argTypes[j] = argType;
 					}
 				}
 				if (argHasError) {
@@ -304,7 +306,7 @@
 						typeIsConsistent = false;
 					}
 				}
-				ParameterizedTypeBinding parameterizedType = scope.environment().createParameterizedType(currentOriginal, argTypes, currentType.tagBits & TagBits.AnnotationNullMASK, qualifyingType);
+				ParameterizedTypeBinding parameterizedType = scope.environment().createParameterizedType(currentOriginal, argTypes, qualifyingType);
 				// check argument type compatibility for non <> cases - <> case needs no bounds check, we will scream foul if needed during inference.
 				if (!isDiamond) {
 					if (checkBounds) // otherwise will do it in Scope.connectTypeVariables() or generic method resolution
@@ -389,26 +391,27 @@
 			}
 			output.append('>');
 		}
+		Annotation [][] annotationsOnDimensions = this.getAnnotationsOnDimensions();
 		if ((this.bits & IsVarArgs) != 0) {
 			for (int i= 0 ; i < this.dimensions - 1; i++) {
-				if (this.annotationsOnDimensions != null && this.annotationsOnDimensions[i] != null) {
+				if (annotationsOnDimensions != null && annotationsOnDimensions[i] != null) {
 					output.append(" "); //$NON-NLS-1$
-					printAnnotations(this.annotationsOnDimensions[i], output);
+					printAnnotations(annotationsOnDimensions[i], output);
 					output.append(" "); //$NON-NLS-1$
 				}
 				output.append("[]"); //$NON-NLS-1$
 			}
-			if (this.annotationsOnDimensions != null && this.annotationsOnDimensions[this.dimensions - 1] != null) {
+			if (annotationsOnDimensions != null && annotationsOnDimensions[this.dimensions - 1] != null) {
 				output.append(" "); //$NON-NLS-1$
-				printAnnotations(this.annotationsOnDimensions[this.dimensions - 1], output);
+				printAnnotations(annotationsOnDimensions[this.dimensions - 1], output);
 				output.append(" "); //$NON-NLS-1$
 			}
 			output.append("..."); //$NON-NLS-1$
 		} else {
 			for (int i= 0 ; i < this.dimensions; i++) {
-				if (this.annotationsOnDimensions != null && this.annotationsOnDimensions[i] != null) {
+				if (annotationsOnDimensions != null && annotationsOnDimensions[i] != null) {
 					output.append(" "); //$NON-NLS-1$
-					printAnnotations(this.annotationsOnDimensions[i], output);
+					printAnnotations(annotationsOnDimensions[i], output);
 					output.append(" "); //$NON-NLS-1$
 				}
 				output.append("[]"); //$NON-NLS-1$
@@ -433,9 +436,10 @@
 						this.annotations[i][j].traverse(visitor, scope);
 				}
 			}
-			if (this.annotationsOnDimensions != null) {
-				for (int i = 0, max = this.annotationsOnDimensions.length; i < max; i++) {
-					Annotation[] annotations2 = this.annotationsOnDimensions[i];
+			Annotation [][] annotationsOnDimensions = getAnnotationsOnDimensions(true);
+			if (annotationsOnDimensions != null) {
+				for (int i = 0, max = annotationsOnDimensions.length; i < max; i++) {
+					Annotation[] annotations2 = annotationsOnDimensions[i];
 					for (int j = 0, max2 = annotations2 == null ? 0 : annotations2.length; j < max2; j++) {
 						Annotation annotation = annotations2[j];
 						annotation.traverse(visitor, scope);
@@ -463,9 +467,10 @@
 						this.annotations[i][j].traverse(visitor, scope);
 				}
 			}
-			if (this.annotationsOnDimensions != null) {
-				for (int i = 0, max = this.annotationsOnDimensions.length; i < max; i++) {
-					Annotation[] annotations2 = this.annotationsOnDimensions[i];
+			Annotation [][] annotationsOnDimensions = getAnnotationsOnDimensions(true);
+			if (annotationsOnDimensions != null) {
+				for (int i = 0, max = annotationsOnDimensions.length; i < max; i++) {
+					Annotation[] annotations2 = annotationsOnDimensions[i];
 					for (int j = 0, max2 = annotations2 == null ? 0 : annotations2.length; j < max2; j++) {
 						Annotation annotation = annotations2[j];
 						annotation.traverse(visitor, scope);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java
index 2aae6e9..654f8b1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java
@@ -5,15 +5,13 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
  *								bug 342671 - ClassCastException: org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding cannot be cast to org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding
+ *								Bug 420894 - ClassCastException in DefaultBindingResolver.resolveType(Type)
  *								bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
  *        Andy Clement - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
  *******************************************************************************/
@@ -46,7 +44,7 @@
 	}
 	public ParameterizedSingleTypeReference(char[] name, TypeReference[] typeArguments, int dim, Annotation[][] annotationsOnDimensions, long pos) {
 		this(name, typeArguments, dim, pos);
-		this.annotationsOnDimensions = annotationsOnDimensions;
+		setAnnotationsOnDimensions(annotationsOnDimensions);
 		if (annotationsOnDimensions != null) {
 			this.bits |= ASTNode.HasTypeAnnotations;
 		}
@@ -64,18 +62,15 @@
 			}
 		}
 	}
-	/**
-	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference#copyDims(int)
-	 */
-	public TypeReference copyDims(int dim) {
-		return new ParameterizedSingleTypeReference(this.token, this.typeArguments, dim, (((long)this.sourceStart)<<32)+this.sourceEnd);
-	}
-	public TypeReference copyDims(int dim, Annotation [][] annotationsOnDims) {
-		ParameterizedSingleTypeReference parameterizedSingleTypeReference = new ParameterizedSingleTypeReference(this.token, this.typeArguments, dim, annotationsOnDims, (((long)this.sourceStart)<<32)+this.sourceEnd);
+	
+	public TypeReference augmentTypeWithAdditionalDimensions(int additionalDimensions, Annotation [][] additionalAnnotations, boolean isVarargs) {
+		int totalDimensions = this.dimensions() + additionalDimensions;
+		Annotation [][] allAnnotations = getMergedAnnotationsOnDimensions(additionalDimensions, additionalAnnotations);
+		ParameterizedSingleTypeReference parameterizedSingleTypeReference = new ParameterizedSingleTypeReference(this.token, this.typeArguments, totalDimensions, allAnnotations, (((long) this.sourceStart) << 32) + this.sourceEnd);
+		parameterizedSingleTypeReference.annotations = this.annotations;
 		parameterizedSingleTypeReference.bits |= (this.bits & ASTNode.HasTypeAnnotations);
-		if (annotationsOnDims != null) {
-			parameterizedSingleTypeReference.bits |= ASTNode.HasTypeAnnotations;
-		}
+		if (!isVarargs)
+			parameterizedSingleTypeReference.extendedDimensions = additionalDimensions;
 		return parameterizedSingleTypeReference;
 	}
 
@@ -105,6 +100,11 @@
 		}
 		return new char[][]{ name };
 	}
+	
+	public TypeReference[][] getTypeArguments() {
+		return new TypeReference[][] { this.typeArguments };
+	}
+	
 	/**
      * @see org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference#getTypeBinding(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope)
      */
@@ -141,17 +141,25 @@
 		}
 		this.bits |= ASTNode.DidResolve;
 		TypeBinding type = internalResolveLeafType(scope, enclosingType, checkBounds);
-		resolveAnnotations(scope);
+
 		// handle three different outcomes:
 		if (type == null) {
 			this.resolvedType = createArrayType(scope, this.resolvedType);
+			resolveAnnotations(scope);
+			checkNullConstraints(scope, this.typeArguments);
 			return null;							// no useful type, but still captured dimensions into this.resolvedType
 		} else {
 			type = createArrayType(scope, type);
-			if (!this.resolvedType.isValidBinding())
+			if (!this.resolvedType.isValidBinding() && this.resolvedType.dimensions() == type.dimensions()) {
+				resolveAnnotations(scope);
+				checkNullConstraints(scope, this.typeArguments);
 				return type;						// found some error, but could recover useful type (like closestMatch)
-			else 
-				return this.resolvedType = type; 	// no complaint, keep fully resolved type (incl. dimensions)
+			} else {
+				this.resolvedType = type; 	// no complaint, keep fully resolved type (incl. dimensions)
+				resolveAnnotations(scope);
+				checkNullConstraints(scope, this.typeArguments);
+				return this.resolvedType; // pick up any annotated type.
+			}
 		}
 	}
 	private TypeBinding internalResolveLeafType(Scope scope, ReferenceBinding enclosingType, boolean checkBounds) {
@@ -203,7 +211,7 @@
 			if (isTypeUseDeprecated(currentType, scope))
 				scope.problemReporter().deprecatedType(currentType, this);
 			ReferenceBinding currentEnclosing = currentType.enclosingType();
-			if (currentEnclosing != null && currentEnclosing.erasure() != enclosingType.erasure()) {
+			if (currentEnclosing != null && TypeBinding.notEquals(currentEnclosing.erasure(), enclosingType.erasure())) {
 				enclosingType = currentEnclosing; // inherited member type, leave it associated with its enclosing rather than subtype
 			}
 		}
@@ -215,6 +223,7 @@
 	    	keep = ((ClassScope) scope).superTypeReference;
 	    	((ClassScope) scope).superTypeReference = null;
 	    }
+	    final boolean isDiamond = (this.bits & ASTNode.IsDiamond) != 0;
 		int argLength = this.typeArguments.length;
 		TypeBinding[] argTypes = new TypeBinding[argLength];
 		boolean argHasError = false;
@@ -228,10 +237,7 @@
 		     if (argType == null) {
 		         argHasError = true;
 		     } else {
-			    if (typeArgument.annotations != null)
-			    	argTypes[i] = captureTypeAnnotations(scope, enclosingType, argType, typeArgument.annotations[0]);
-			    else
-			    	argTypes[i] = argType;
+		    	 argTypes[i] = argType;
 		     }
 		}
 		if (argHasError) {
@@ -243,7 +249,6 @@
 				return null;
 		}
 
-		final boolean isDiamond = (this.bits & ASTNode.IsDiamond) != 0;
 		TypeVariableBinding[] typeVariables = currentOriginal.typeVariables();
 		if (typeVariables == Binding.NO_TYPE_VARIABLES) { // non generic invoked with arguments
 			boolean isCompliant15 = scope.compilerOptions().originalSourceLevel >= ClassFileConstants.JDK1_5;
@@ -317,26 +322,27 @@
 			this.typeArguments[max].print(0, output);
 		}
 		output.append(">"); //$NON-NLS-1$
+		Annotation [][] annotationsOnDimensions = getAnnotationsOnDimensions();
 		if ((this.bits & IsVarArgs) != 0) {
 			for (int i= 0 ; i < this.dimensions - 1; i++) {
-				if (this.annotationsOnDimensions != null && this.annotationsOnDimensions[i] != null) {
+				if (annotationsOnDimensions != null && annotationsOnDimensions[i] != null) {
 					output.append(" "); //$NON-NLS-1$
-					printAnnotations(this.annotationsOnDimensions[i], output);
+					printAnnotations(annotationsOnDimensions[i], output);
 					output.append(" "); //$NON-NLS-1$
 				}
 				output.append("[]"); //$NON-NLS-1$
 			}
-			if (this.annotationsOnDimensions != null && this.annotationsOnDimensions[this.dimensions - 1] != null) {
+			if (annotationsOnDimensions != null && annotationsOnDimensions[this.dimensions - 1] != null) {
 				output.append(" "); //$NON-NLS-1$
-				printAnnotations(this.annotationsOnDimensions[this.dimensions - 1], output);
+				printAnnotations(annotationsOnDimensions[this.dimensions - 1], output);
 				output.append(" "); //$NON-NLS-1$
 			}
 			output.append("..."); //$NON-NLS-1$
 		} else {
 			for (int i= 0 ; i < this.dimensions; i++) {
-				if (this.annotationsOnDimensions != null && this.annotationsOnDimensions[i] != null) {
+				if (annotationsOnDimensions != null && annotationsOnDimensions[i] != null) {
 					output.append(" "); //$NON-NLS-1$
-					printAnnotations(this.annotationsOnDimensions[i], output);
+					printAnnotations(annotationsOnDimensions[i], output);
 					output.append(" "); //$NON-NLS-1$
 				}
 				output.append("[]"); //$NON-NLS-1$
@@ -365,9 +371,10 @@
 					typeAnnotations[i].traverse(visitor, scope);
 				}
 			}
-			if (this.annotationsOnDimensions != null) {
-				for (int i = 0, max = this.annotationsOnDimensions.length; i < max; i++) {
-					Annotation[] annotations2 = this.annotationsOnDimensions[i];
+			Annotation [][] annotationsOnDimensions = getAnnotationsOnDimensions(true);
+			if (annotationsOnDimensions != null) {
+				for (int i = 0, max = annotationsOnDimensions.length; i < max; i++) {
+					Annotation[] annotations2 = annotationsOnDimensions[i];
 					if (annotations2 != null) {
 						for (int j = 0, max2 = annotations2.length; j < max2; j++) {
 							Annotation annotation = annotations2[j];
@@ -391,9 +398,10 @@
 					typeAnnotations[i].traverse(visitor, scope);
 				}
 			}
-			if (this.annotationsOnDimensions != null) {
-				for (int i = 0, max = this.annotationsOnDimensions.length; i < max; i++) {
-					Annotation[] annotations2 = this.annotationsOnDimensions[i];
+			Annotation [][] annotationsOnDimensions = getAnnotationsOnDimensions(true);
+			if (annotationsOnDimensions != null) {
+				for (int i = 0, max = annotationsOnDimensions.length; i < max; i++) {
+					Annotation[] annotations2 = annotationsOnDimensions[i];
 					for (int j = 0, max2 = annotations2.length; j < max2; j++) {
 						Annotation annotation = annotations2[j];
 						annotation.traverse(visitor, scope);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
index 81c4167..651ca4d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -21,23 +17,37 @@
  *								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
+ *								Bug 415850 - [1.8] Ensure RunJDTCoreTests can cope with null annotations enabled
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 416267 - NPE in QualifiedAllocationExpression.resolveType
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 424415 - [1.8][compiler] Eventual resolution of ReferenceExpression is not seen to be happening.
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
  *     Jesper S Moller <jesper@selskabet.org> - Contributions for
  *								bug 378674 - "The method can be declared as static" is wrong
- *        Andy Clement - Contributions for
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409245 - [1.8][compiler] Type annotations dropped when call is routed through a synthetic bridge method
+ *     Till Brychcy - Contributions for
+ *     							bug 413460 - NonNullByDefault is not inherited to Constructors when accessed via Class File
  ******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.INVOCATION_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.CodeStream;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.Opcodes;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowInfo;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ImplicitNullAnnotationVerifier;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
@@ -201,7 +211,7 @@
 				i++) {
 				codeStream.aconst_null();
 			}
-			codeStream.invoke(Opcodes.OPC_invokespecial, this.syntheticAccessor, null /* default declaringClass */);
+			codeStream.invoke(Opcodes.OPC_invokespecial, this.syntheticAccessor, null /* default declaringClass */, this.typeArguments);
 		}
 		if (valueRequired) {
 			codeStream.generateImplicitConversion(this.implicitConversion);
@@ -270,7 +280,18 @@
 		if (this.anonymousType == null && this.enclosingInstance == null) {
 			return super.resolveType(scope);
 		}
-
+		TypeBinding result=resolveTypeForQualifiedAllocationExpression(scope);
+		if(result != null && this.binding != null) {
+			final CompilerOptions compilerOptions = scope.compilerOptions();
+			if (compilerOptions.isAnnotationBasedNullAnalysisEnabled && (this.binding.tagBits & TagBits.IsNullnessKnown) == 0) {
+				new ImplicitNullAnnotationVerifier(scope.environment(), compilerOptions.inheritNullAnnotations)
+						.checkImplicitNullAnnotations(this.binding, null/*srcMethod*/, false, scope);
+			}
+		}
+		return result;
+	}
+	
+	private TypeBinding resolveTypeForQualifiedAllocationExpression(BlockScope scope) {
 		// Propagate the type checking to the arguments, and checks if the constructor is defined.
 		// ClassInstanceCreationExpression ::= Primary '.' 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
 		// ClassInstanceCreationExpression ::= Name '.' 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
@@ -308,6 +329,7 @@
 				hasError = true;
 			} else {
 				receiverType = ((SingleTypeReference) this.type).resolveTypeEnclosing(scope, (ReferenceBinding) enclosingInstanceType);
+				checkIllegalNullAnnotation(scope, receiverType);
 				if (receiverType != null && enclosingInstanceContainsCast) {
 					CastExpression.checkNeedForEnclosingInstanceCast(scope, this.enclosingInstance, enclosingInstanceType, receiverType);
 				}
@@ -318,6 +340,7 @@
 				receiverType = scope.enclosingSourceType();
 			} else {
 				receiverType = this.type.resolveType(scope, true /* check bounds*/);
+				checkIllegalNullAnnotation(scope, receiverType);
 				checkParameterizedAllocation: {
 					if (receiverType == null || !receiverType.isValidBinding()) break checkParameterizedAllocation;
 					if (this.type instanceof ParameterizedQualifiedTypeReference) { // disallow new X<String>.Y<Integer>()
@@ -343,10 +366,11 @@
 		}
 
 		// resolve type arguments (for generic constructor call)
+		long sourceLevel = scope.compilerOptions().sourceLevel;
 		final boolean isDiamond = this.type != null && (this.type.bits & ASTNode.IsDiamond) != 0;
 		if (this.typeArguments != null) {
 			int length = this.typeArguments.length;
-			boolean argHasError = scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_5;
+			boolean argHasError = sourceLevel < ClassFileConstants.JDK1_5;
 			this.genericTypeArguments = new TypeBinding[length];
 			for (int i = 0; i < length; i++) {
 				TypeReference typeReference = this.typeArguments[i];
@@ -373,11 +397,9 @@
 
 		// will check for null after args are resolved
 		TypeBinding[] argumentTypes = Binding.NO_PARAMETERS;
-		boolean polyExpressionSeen = false;
 		if (this.arguments != null) {
 			int length = this.arguments.length;
 			argumentTypes = new TypeBinding[length];
-			TypeBinding argumentType;
 			for (int i = 0; i < length; i++) {
 				Expression argument = this.arguments[i];
 				if (argument instanceof CastExpression) {
@@ -385,11 +407,13 @@
 					argsContainCast = true;
 				}
 				argument.setExpressionContext(INVOCATION_CONTEXT);
-				if ((argumentType = argumentTypes[i] = argument.resolveType(scope)) == null){
+				if ((argumentTypes[i] = argument.resolveType(scope)) == null){
 					hasError = true;
 				}
-				if (argumentType != null && argumentType.kind() == Binding.POLY_TYPE)
-					polyExpressionSeen = true;
+				if (sourceLevel >= ClassFileConstants.JDK1_8 && argument.isPolyExpression()) {
+					if (this.innerInferenceHelper == null)
+						this.innerInferenceHelper = new InnerInferenceHelper();
+				}
 			}
 		}
 
@@ -411,7 +435,7 @@
 					for (int i = length; --i >= 0;) {
 						pseudoArgs[i] = argumentTypes[i] == null ? TypeBinding.NULL : argumentTypes[i]; // replace args with errors with null type
 					}
-					this.binding = scope.findMethod(referenceReceiver, TypeConstants.INIT, pseudoArgs, this);
+					this.binding = scope.findMethod(referenceReceiver, TypeConstants.INIT, pseudoArgs, this, false);
 					if (this.binding != null && !this.binding.isValidBinding()) {
 						MethodBinding closestMatch = ((ProblemMethodBinding)this.binding).closestMatch;
 						// record the closest match, for clients who may still need hint about possible method match
@@ -445,7 +469,7 @@
 				return this.resolvedType = receiverType;
 			}
 			if (isDiamond) {
-				TypeBinding [] inferredTypes = inferElidedTypes(((ParameterizedTypeBinding) receiverType).genericType(), receiverType.enclosingType(), argumentTypes, scope);
+				TypeBinding [] inferredTypes = inferElidedTypes((ParameterizedTypeBinding) receiverType, receiverType.enclosingType(), argumentTypes, scope);
 				if (inferredTypes == null) {
 					scope.problemReporter().cannotInferElidedTypes(this);
 					return this.resolvedType = null;
@@ -453,9 +477,8 @@
 				receiverType = this.type.resolvedType = scope.environment().createParameterizedType(((ParameterizedTypeBinding) receiverType).genericType(), inferredTypes, ((ParameterizedTypeBinding) receiverType).enclosingType());
 			}
 			ReferenceBinding allocationType = (ReferenceBinding) receiverType;
-			this.binding = scope.getConstructor(allocationType, argumentTypes, this);
-			if (polyExpressionSeen && polyExpressionsHaveErrors(scope, this.binding, this.arguments, argumentTypes))
-				return null;
+			this.binding = findConstructorBinding(scope, this, allocationType, argumentTypes);
+
 			if (this.binding.isValidBinding()) {	
 				if (isMethodUseDeprecated(this.binding, scope, true)) {
 					scope.problemReporter().deprecatedMethod(this.binding, this);
@@ -485,7 +508,7 @@
 		 	}
 			// The enclosing instance must be compatible with the innermost enclosing type
 			ReferenceBinding expectedType = this.binding.declaringClass.enclosingType();
-			if (expectedType != enclosingInstanceType) // must call before computeConversion() and typeMismatchError()
+			if (TypeBinding.notEquals(expectedType, enclosingInstanceType)) // must call before computeConversion() and typeMismatchError()
 				scope.compilationUnitScope().recordTypeConversion(expectedType, enclosingInstanceType);
 			if (enclosingInstanceType.isCompatibleWith(expectedType) || scope.isBoxingCompatibleWith(enclosingInstanceType, expectedType)) {
 				this.enclosingInstance.computeConversion(scope, expectedType, enclosingInstanceType);
@@ -520,9 +543,8 @@
 		if ((this.resolvedType.tagBits & TagBits.HierarchyHasProblems) != 0) {
 			return null; // stop secondary errors
 		}
-		MethodBinding inheritedBinding = scope.getConstructor(anonymousSuperclass, argumentTypes, this);
-		if (polyExpressionSeen && polyExpressionsHaveErrors(scope, inheritedBinding, this.arguments, argumentTypes))
-			return null;
+		MethodBinding inheritedBinding = findConstructorBinding(scope, this, anonymousSuperclass, argumentTypes);
+			
 		if (!inheritedBinding.isValidBinding()) {
 			if (inheritedBinding.declaringClass == null) {
 				inheritedBinding.declaringClass = anonymousSuperclass;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java
index 429fefa..f8582e3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Palo Alto Research Center, Incorporated - AspectJ adaptation
@@ -18,6 +14,7 @@
  *								bug 365519 - editorial cleanup after bug 186342 and bug 365387
  *								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 414380 - [compiler][internal] QualifiedNameReference#indexOfFirstFieldBinding does not point to the first field
  *     Jesper S Moller - Contributions for
  *								bug 382721 - [1.8][compiler] Effectively final variables needs special treatment
  *								bug 331649 - [compiler][null] consider null annotations for fields
@@ -64,7 +61,9 @@
 	public long[] sourcePositions;
 	public FieldBinding[] otherBindings;
 	int[] otherDepths;
-	public int indexOfFirstFieldBinding;//points (into tokens) for the first token that corresponds to first FieldBinding
+	public int indexOfFirstFieldBinding; 	// points into tokens & sourcePositions for the first token that corresponds to first FieldBinding
+										  	// *** the index is 1-based ***
+											// during BlockScope#getBinding(..) it will walk through positions until it finds the first field
 	public SyntheticMethodBinding syntheticWriteAccessor;
 	public SyntheticMethodBinding[] syntheticReadAccessors;
 	public TypeBinding genericCast;
@@ -254,12 +253,12 @@
 	if (this.otherBindings != null) {
 		if ((this.bits & ASTNode.RestrictiveFlagMASK) == Binding.FIELD) {
 			// is the first field dereferenced annotated Nullable? If so, report immediately
-			checkNullableFieldDereference(scope, (FieldBinding) this.binding, this.sourcePositions[0]);
+			checkNullableFieldDereference(scope, (FieldBinding) this.binding, this.sourcePositions[this.indexOfFirstFieldBinding-1]);
 		}
 		// look for annotated fields, they do not depend on flow context -> check immediately:
 		int length = this.otherBindings.length - 1; // don't check the last binding
 		for (int i = 0; i < length; i++) {
-			checkNullableFieldDereference(scope, this.otherBindings[i], this.sourcePositions[i+1]);
+			checkNullableFieldDereference(scope, this.otherBindings[i], this.sourcePositions[this.indexOfFirstFieldBinding+i]);
 		}
 	}
 }
@@ -359,7 +358,7 @@
 				}
 			} else {
 				boolean isFirst = lastFieldBinding == this.binding
-												&& (this.indexOfFirstFieldBinding == 1 || lastFieldBinding.declaringClass == currentScope.enclosingReceiverType())
+												&& (this.indexOfFirstFieldBinding == 1 || TypeBinding.equalsEquals(lastFieldBinding.declaringClass, currentScope.enclosingReceiverType()))
 												&& this.otherBindings == null; // could be dup: next.next.next
 				TypeBinding requiredGenericCast = getGenericCast(this.otherBindings == null ? 0 : this.otherBindings.length);
 				if (valueRequired
@@ -425,7 +424,7 @@
 	// check if compound assignment is the only usage of a private field
 	reportOnlyUselesslyReadPrivateField(currentScope, lastFieldBinding, valueRequired);
 	boolean isFirst = lastFieldBinding == this.binding
-		&& (this.indexOfFirstFieldBinding == 1 || lastFieldBinding.declaringClass == currentScope.enclosingReceiverType())
+		&& (this.indexOfFirstFieldBinding == 1 || TypeBinding.equalsEquals(lastFieldBinding.declaringClass, currentScope.enclosingReceiverType()))
 		&& this.otherBindings == null; // could be dup: next.next.next
 	TypeBinding constantPoolDeclaringClass = CodeStream.getConstantPoolDeclaringClass(currentScope, lastFieldBinding, getFinalReceiverType(), isFirst);			
 	SyntheticMethodBinding accessor = this.syntheticReadAccessors == null ? null : this.syntheticReadAccessors[this.syntheticReadAccessors.length - 1];
@@ -478,7 +477,7 @@
 	// check if this post increment is the only usage of a private field
 	reportOnlyUselesslyReadPrivateField(currentScope, lastFieldBinding, valueRequired);
 	boolean isFirst = lastFieldBinding == this.binding
-		&& (this.indexOfFirstFieldBinding == 1 || lastFieldBinding.declaringClass == currentScope.enclosingReceiverType())
+		&& (this.indexOfFirstFieldBinding == 1 || TypeBinding.equalsEquals(lastFieldBinding.declaringClass, currentScope.enclosingReceiverType()))
 		&& this.otherBindings == null; // could be dup: next.next.next
 	TypeBinding constantPoolDeclaringClass = CodeStream.getConstantPoolDeclaringClass(currentScope, lastFieldBinding, getFinalReceiverType(), isFirst);			
 	SyntheticMethodBinding accessor = this.syntheticReadAccessors == null
@@ -645,7 +644,7 @@
 						if (lastFieldBinding == initialFieldBinding) {
 							if (lastFieldBinding.isStatic()){
 								// if no valueRequired, still need possible side-effects of <clinit> invocation, if field belongs to different class
-								if (initialFieldBinding.declaringClass != this.actualReceiverType.erasure()) {
+								if (TypeBinding.notEquals(initialFieldBinding.declaringClass, this.actualReceiverType.erasure())) {
 									MethodBinding accessor = this.syntheticReadAccessors == null ? null : this.syntheticReadAccessors[i];
 									if (accessor == null) {
 										TypeBinding constantPoolDeclaringClass = CodeStream.getConstantPoolDeclaringClass(currentScope, lastFieldBinding, lastReceiverType, i == 0 && this.indexOfFirstFieldBinding == 1);
@@ -761,7 +760,7 @@
 				TypeBinding oldReceiverType = fieldReceiverType;
 				fieldReceiverType = fieldReceiverType.getErasureCompatibleType(field.declaringClass);// handle indirect inheritance thru variable secondary bound
 				FieldBinding originalBinding = previousField.original();
-				if (fieldReceiverType != oldReceiverType || originalBinding.type.leafComponentType().isTypeVariable()) { // record need for explicit cast at codegen
+				if (TypeBinding.notEquals(fieldReceiverType, oldReceiverType) || originalBinding.type.leafComponentType().isTypeVariable()) { // record need for explicit cast at codegen
 			    	setGenericCast(index-1,originalBinding.type.genericCast(fieldReceiverType)); // type cannot be base-type even in boxing case
 				}				
 		    }
@@ -780,14 +779,14 @@
 					MethodScope methodScope = scope.methodScope();
 					SourceTypeBinding sourceType = methodScope.enclosingSourceType();
 					if ((this.bits & ASTNode.IsStrictlyAssigned) == 0
-							&& sourceType == declaringClass
+							&& TypeBinding.equalsEquals(sourceType, declaringClass)
 							&& methodScope.lastVisibleFieldID >= 0
 							&& field.id >= methodScope.lastVisibleFieldID
 							&& (!field.isStatic() || methodScope.isStatic)) {
 						scope.problemReporter().forwardReference(this, index, field);
 					}					
 					// check if accessing enum static field in initializer
-					if ((sourceType == declaringClass || sourceType.superclass == declaringClass) // enum constant body
+					if ((TypeBinding.equalsEquals(sourceType, declaringClass) || TypeBinding.equalsEquals(sourceType.superclass, declaringClass)) // enum constant body
 							&& field.constant() == Constant.NotAConstant
 							&& !methodScope.isStatic
 							&& methodScope.isInsideInitializerOrConstructor()) {
@@ -797,7 +796,7 @@
 				// static field accessed through receiver? legal but unoptimal (optional warning)
 				scope.problemReporter().nonStaticAccessToStaticField(this, field, index);
 				// indirect static reference ?
-				if (field.declaringClass != type) {
+				if (TypeBinding.notEquals(field.declaringClass, type)) {
 					scope.problemReporter().indirectAccessToStaticField(this, field);
 				}
 			}
@@ -919,7 +918,7 @@
 	if (fieldBinding.isPrivate()) { // private access
 	    FieldBinding codegenField = getCodegenBinding(index < 0 ? (this.otherBindings == null ? 0 : this.otherBindings.length) : index);
 	    ReferenceBinding declaringClass = codegenField.declaringClass;
-		if (declaringClass != currentScope.enclosingSourceType()) {
+		if (TypeBinding.notEquals(declaringClass, currentScope.enclosingSourceType())) {
 		    setSyntheticAccessor(fieldBinding, index, ((SourceTypeBinding) declaringClass).addSyntheticMethod(codegenField, index >= 0 /*read-access?*/, false /*not super access*/));
 			currentScope.problemReporter().needToEmulateFieldAccess(codegenField, this, index >= 0 /*read-access?*/);
 			return;
@@ -1062,7 +1061,7 @@
 					SourceTypeBinding sourceType = methodScope.enclosingSourceType();
 					// check for forward references
 					if ((this.indexOfFirstFieldBinding == 1 || (fieldBinding.modifiers & ClassFileConstants.AccEnum) != 0 || (!fieldBinding.isFinal() && declaringClass.isEnum())) // enum constants are checked even when qualified
-							&& sourceType == declaringClass
+							&& TypeBinding.equalsEquals(sourceType, declaringClass)
 							&& methodScope.lastVisibleFieldID >= 0
 							&& fieldBinding.id >= methodScope.lastVisibleFieldID
 							&& (!fieldBinding.isStatic() || methodScope.isStatic)) {
@@ -1079,7 +1078,7 @@
 						// only last field is actually a write access if any
 						// check if accessing enum static field in initializer
 						if (declaringClass.isEnum()) {
-							if ((sourceType == declaringClass || sourceType.superclass == declaringClass) // enum constant body
+							if ((TypeBinding.equalsEquals(sourceType, declaringClass) || TypeBinding.equalsEquals(sourceType.superclass, declaringClass)) // enum constant body
 									&& fieldBinding.constant() == Constant.NotAConstant
 									&& !methodScope.isStatic
 									&& methodScope.isInsideInitializerOrConstructor()) {
@@ -1087,7 +1086,7 @@
 							}
 						}
 						if (this.indexOfFirstFieldBinding > 1
-								&& fieldBinding.declaringClass != this.actualReceiverType
+								&& TypeBinding.notEquals(fieldBinding.declaringClass, this.actualReceiverType)
 								&& fieldBinding.declaringClass.canBeSeenBy(scope)) {
 							scope.problemReporter().indirectAccessToStaticField(this, fieldBinding);
 						}						
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.java
index 276b064..ec3fea2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
@@ -70,7 +66,7 @@
 		char[][] compoundName = null;
 		ReferenceBinding closestMatch = null;
 		for (int i = 0; i < length; i++) {
-			if (supers[i].erasure() == type) {
+			if (TypeBinding.equalsEquals(supers[i].erasure(), type)) {
 				this.currentCompatibleType = closestMatch = supers[i];
 			} else if (supers[i].erasure().isCompatibleWith(type)) {
 				isLegal = false;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java
index bb42a60..b9b831b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
@@ -116,14 +112,26 @@
 		if (depth == 0) {
 			checkAccess(scope, null);
 		} // if depth>0, path emulation will diagnose bad scenarii
-
+		
+		MethodScope methodScope = scope.namedMethodScope();
+		if (methodScope != null) {
+			MethodBinding method = methodScope.referenceMethodBinding();
+			if (method != null) {
+				TypeBinding receiver = method.receiver;
+				while (receiver != null) {
+					if (TypeBinding.equalsEquals(receiver, this.resolvedType))
+						return this.resolvedType = receiver;
+					receiver = receiver.enclosingType();	
+				}
+			}
+		}
 		return this.resolvedType;
 	}
 
 	int findCompatibleEnclosing(ReferenceBinding enclosingType, TypeBinding type) {
 		int depth = 0;
 		this.currentCompatibleType = enclosingType;
-		while (this.currentCompatibleType != null && this.currentCompatibleType != type) {
+		while (this.currentCompatibleType != null && TypeBinding.notEquals(this.currentCompatibleType, type)) {
 			depth++;
 			this.currentCompatibleType = this.currentCompatibleType.isStatic() ? null : this.currentCompatibleType.enclosingType();
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedTypeReference.java
index 4e1c649..e35aa00 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/QualifiedTypeReference.java
@@ -1,18 +1,12 @@
 /*******************************************************************************
- * 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Stephan Herrmann - Contribution for
- *								bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -34,20 +28,14 @@
 		this.sourceEnd = (int)(this.sourcePositions[this.sourcePositions.length-1] & 0x00000000FFFFFFFFL ) ;
 	}
 
-	public TypeReference copyDims(int dim){
-		//return a type reference copy of me with some dimensions
-		//warning : the new type ref has a null binding
-		return new ArrayQualifiedTypeReference(this.tokens, dim, this.sourcePositions);
-	}
-	
-	public TypeReference copyDims(int dim, Annotation[][] annotationsOnDimensions) {
-		//return a type reference copy of me with some dimensions
-		//warning : the new type ref has a null binding
-		ArrayQualifiedTypeReference arrayQualifiedTypeReference = new ArrayQualifiedTypeReference(this.tokens, dim, annotationsOnDimensions, this.sourcePositions);
+	public TypeReference augmentTypeWithAdditionalDimensions(int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs) {
+		int totalDimensions = this.dimensions() + additionalDimensions;
+		Annotation [][] allAnnotations = getMergedAnnotationsOnDimensions(additionalDimensions, additionalAnnotations);
+		ArrayQualifiedTypeReference arrayQualifiedTypeReference = new ArrayQualifiedTypeReference(this.tokens, totalDimensions, allAnnotations, this.sourcePositions);
+		arrayQualifiedTypeReference.annotations = this.annotations;
 		arrayQualifiedTypeReference.bits |= (this.bits & ASTNode.HasTypeAnnotations);
-		if (annotationsOnDimensions != null) {
-			arrayQualifiedTypeReference.bits |= ASTNode.HasTypeAnnotations;
-		}
+		if (!isVarargs)
+			arrayQualifiedTypeReference.extendedDimensions = additionalDimensions;
 		return arrayQualifiedTypeReference;
 	}
 
@@ -55,12 +43,9 @@
 		LookupEnvironment env = scope.environment();
 		try {
 			env.missingClassFileLocation = this;
-			ReferenceBinding previousType = null;
 			if (this.resolvedType == null) {
 				this.resolvedType = scope.getType(this.tokens[tokenIndex], packageBinding);
 			} else {
-				if (this.resolvedType instanceof ReferenceBinding)
-					previousType = (ReferenceBinding) this.resolvedType;
 				this.resolvedType = scope.getMemberType(this.tokens[tokenIndex], (ReferenceBinding) this.resolvedType);
 				if (!this.resolvedType.isValidBinding()) {
 					this.resolvedType = new ProblemReferenceBinding(
@@ -69,9 +54,6 @@
 						this.resolvedType.problemId());
 				}
 			}
-			if (this.annotations != null && this.annotations[tokenIndex] != null) {
-				this.resolvedType = captureTypeAnnotations(scope, previousType, this.resolvedType, this.annotations[tokenIndex]);
-			}
 			return this.resolvedType;
 		} catch (AbortCompilation e) {
 			e.updateContext(this, scope.referenceCompilationUnit().compilationResult);
@@ -99,14 +81,11 @@
 		}
 	}
 
-	protected void rejectAnnotationsOnStaticMemberQualififer(Scope scope, ReferenceBinding currentType, int tokenIndex) {
+	protected static void rejectAnnotationsOnStaticMemberQualififer(Scope scope, ReferenceBinding currentType, Annotation[] qualifierAnnot) {
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=385137
-		if (this.annotations != null && currentType.isMemberType() && currentType.isStatic()) {
-			Annotation[] qualifierAnnot = this.annotations[tokenIndex - 1];
-			if (qualifierAnnot != null) {
-				scope.problemReporter().illegalTypeAnnotationsInStaticMemberAccess(qualifierAnnot[0],
-						qualifierAnnot[qualifierAnnot.length - 1]);
-			}
+		if (currentType.isMemberType() && currentType.isStatic() && qualifierAnnot != null && qualifierAnnot.length > 0) {
+			scope.problemReporter().illegalTypeAnnotationsInStaticMemberAccess(qualifierAnnot[0],
+					qualifierAnnot[qualifierAnnot.length - 1]);
 		}
 	}
 
@@ -145,9 +124,11 @@
 					return null;
 			ReferenceBinding currentType = (ReferenceBinding) this.resolvedType;
 			if (qualifiedType != null) {
-				rejectAnnotationsOnStaticMemberQualififer(scope, currentType, i);
+				if (this.annotations != null) {
+					rejectAnnotationsOnStaticMemberQualififer(scope, currentType, this.annotations[i-1]);
+				}
 				ReferenceBinding enclosingType = currentType.enclosingType();
-				if (enclosingType != null && enclosingType.erasure() != qualifiedType.erasure()) {
+				if (enclosingType != null && TypeBinding.notEquals(enclosingType.erasure(), qualifiedType.erasure())) {
 					qualifiedType = enclosingType; // inherited member type, leave it associated with its enclosing rather than subtype
 				}
 				boolean rawQualified;
@@ -155,7 +136,7 @@
 					qualifiedType = scope.environment().createRawType(currentType, qualifiedType);
 				} else if ((rawQualified = qualifiedType.isRawType()) && !currentType.isStatic()) {
 					qualifiedType = scope.environment().createRawType((ReferenceBinding)currentType.erasure(), qualifiedType);
-				} else if ((rawQualified || qualifiedType.isParameterizedType()) && qualifiedType.erasure() == currentType.enclosingType().erasure()) {
+				} else if ((rawQualified || qualifiedType.isParameterizedType()) && TypeBinding.equalsEquals(qualifiedType.erasure(), currentType.enclosingType().erasure())) {
 					qualifiedType = scope.environment().createParameterizedType((ReferenceBinding)currentType.erasure(), null, qualifiedType);
 				} else {
 					qualifiedType = currentType;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Receiver.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Receiver.java
index 896ffd4..e811a1c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Receiver.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Receiver.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Reference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Reference.java
index b14cf81..ace6e0f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Reference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Reference.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - Contributions for
@@ -16,6 +12,9 @@
  *								bug 392862 - [1.8][compiler][null] Evaluate null annotations on array types
  *								bug 331649 - [compiler][null] consider null annotations for fields
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis 
+ *								Bug 411964 - [1.8][null] leverage null type annotation in foreach statement
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -55,6 +54,11 @@
 }
 
 protected boolean checkNullableFieldDereference(Scope scope, FieldBinding field, long sourcePosition) {
+	// preference to type annotations if we have any
+	if ((field.type.tagBits & TagBits.AnnotationNullable) != 0) {
+		scope.problemReporter().dereferencingNullableExpression(sourcePosition, scope.environment());
+		return true;
+	}
 	if ((field.tagBits & TagBits.AnnotationNullable) != 0) {
 		scope.problemReporter().nullableFieldDereference(field, sourcePosition);
 		return true;
@@ -141,10 +145,7 @@
 		}
 	}
 	if (this.resolvedType != null) {
-		if ((this.resolvedType.tagBits & TagBits.AnnotationNonNull) != 0)
-			return FlowInfo.NON_NULL;
-		else if ((this.resolvedType.tagBits & TagBits.AnnotationNullable) != 0)
-			return FlowInfo.POTENTIALLY_NULL;
+		return FlowInfo.tagBitsToNullStatus(this.resolvedType.tagBits);
 	}
 	return FlowInfo.UNKNOWN;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java
index 8a541a8..0659fc6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java
@@ -1,28 +1,39 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Contributions for
  *							bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
  *                          Bug 384687 - [1.8] Wildcard type arguments should be rejected for lambda and reference expressions
+ *							Bug 416885 - [1.8][compiler]IncompatibleClassChange error (edit)
  *	   Stephan Herrmann - Contribution for
  *							bug 402028 - [1.8][compiler] null analysis for reference expressions 
  *							bug 404649 - [1.8][compiler] detect illegal reference to indirect or redundant super via I.super.m() syntax
+ *							Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *							Bug 415850 - [1.8] Ensure RunJDTCoreTests can cope with null annotations enabled
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *							Bug 423504 - [1.8] Implement "18.5.3 Functional Interface Parameterization Inference"
+ *							Bug 424637 - [1.8][compiler][null] AIOOB in ReferenceExpression.resolveType with a method reference to Files::walk
+ *							Bug 424415 - [1.8][compiler] Eventual resolution of ReferenceExpression is not seen to be happening.
+ *							Bug 424403 - [1.8][compiler] Generic method call with method reference argument fails to resolve properly.
+ *							Bug 427196 - [1.8][compiler] Compiler error for method reference to overloaded method
+ *							Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *							Bug 428264 - [1.8] method reference of generic class causes problems (wrong inference result or NPE)
+ *							Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *							Bug 426537 - [1.8][inference] Eclipse compiler thinks I<? super J> is compatible with I<J<?>> - raw type J involved
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contribution for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
  *******************************************************************************/
 
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.INVOCATION_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult;
@@ -30,65 +41,175 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.CodeStream;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.ConstantPool;
+import org.aspectj.org.eclipse.jdt.internal.compiler.flow.ExceptionHandlingFlowContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowInfo;
+import org.aspectj.org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.IntersectionCastTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.NestedTypeBinding;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemReasons;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SyntheticArgumentBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SyntheticMethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
-import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
-import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
+import org.aspectj.org.eclipse.jdt.internal.compiler.parser.Parser;
 
 public class ReferenceExpression extends FunctionalExpression implements InvocationSite {
 	
-	private static char [] LAMBDA = { 'l', 'a', 'm', 'b', 'd', 'a' };
 	public Expression lhs;
 	public TypeReference [] typeArguments;
 	public char [] selector;
 	
-	private TypeBinding receiverType;
+	public TypeBinding receiverType;
 	private boolean haveReceiver;
 	public TypeBinding[] resolvedTypeArguments;
 	private boolean typeArgumentsHaveErrors;
 	
 	MethodBinding syntheticAccessor;	// synthetic accessor for inner-emulation
 	private int depth;
+	private MethodBinding exactMethodBinding; // != null ==> exact method reference.
+	private boolean receiverPrecedesParameters = false;
+	protected boolean trialResolution = false;
 	
-	public ReferenceExpression(CompilationResult compilationResult, Expression lhs, TypeReference [] typeArguments, char [] selector, int sourceEnd) {
-		super(compilationResult);
-		this.lhs = lhs;
-		this.typeArguments = typeArguments;
-		this.selector = selector;
-		this.sourceStart = lhs.sourceStart;
-		this.sourceEnd = sourceEnd;
+	public ReferenceExpression() {
+		super();
+	}
+	
+	public void initialize(CompilationResult result, Expression expression, TypeReference [] optionalTypeArguments, char [] identifierOrNew, int sourceEndPosition) {
+		super.setCompilationResult(result);
+		this.lhs = expression;
+		this.typeArguments = optionalTypeArguments;
+		this.selector = identifierOrNew;
+		this.sourceStart = expression.sourceStart;
+		this.sourceEnd = sourceEndPosition;
 	}
  
+	public void generateImplicitLambda(BlockScope currentScope, CodeStream codeStream, boolean valueRequired) {
+		
+		final Parser parser = new Parser(this.enclosingScope.problemReporter(), false);
+		final char[] source = this.compilationResult.getCompilationUnit().getContents();
+		ReferenceExpression copy =  (ReferenceExpression) parser.parseExpression(source, this.sourceStart, this.sourceEnd - this.sourceStart + 1, 
+										this.enclosingScope.referenceCompilationUnit(), false /* record line separators */);
+		
+		int argc = this.descriptor.parameters.length;
+		
+		LambdaExpression implicitLambda = new LambdaExpression(this.compilationResult, false);
+		Argument [] arguments = new Argument[argc];
+		for (int i = 0; i < argc; i++)
+			arguments[i] = new Argument(("arg" + i).toCharArray(), 0, null, 0, true); //$NON-NLS-1$
+		implicitLambda.setArguments(arguments);
+		implicitLambda.setExpressionContext(this.expressionContext);
+		implicitLambda.setExpectedType(this.expectedType);
+		
+		int parameterShift = this.receiverPrecedesParameters ? 1 : 0;
+		Expression [] argv = new SingleNameReference[argc - parameterShift];
+		for (int i = 0, length = argv.length; i < length; i++) {
+			String name = "arg" + (i + parameterShift); //$NON-NLS-1$
+			argv[i] = new SingleNameReference(name.toCharArray(), 0);
+		}
+		if (isMethodReference()) {
+			MessageSend message = new MessageSend();
+			message.selector = this.selector;
+			message.receiver = this.receiverPrecedesParameters ? new SingleNameReference("arg0".toCharArray(), 0) : copy.lhs; //$NON-NLS-1$
+			message.typeArguments = copy.typeArguments;
+			message.arguments = argv;
+			implicitLambda.setBody(message);
+		} else if (isArrayConstructorReference()) {
+			// We don't care for annotations, source positions etc. They are immaterial, just drop.
+			ArrayAllocationExpression arrayAllocationExpression = new ArrayAllocationExpression();
+			arrayAllocationExpression.dimensions = new Expression[] { argv[0] };
+			if (this.lhs instanceof ArrayTypeReference) {
+				ArrayTypeReference arrayTypeReference = (ArrayTypeReference) this.lhs;
+				arrayAllocationExpression.type = arrayTypeReference.dimensions == 1 ? new SingleTypeReference(arrayTypeReference.token, 0L) : 
+																new ArrayTypeReference(arrayTypeReference.token, arrayTypeReference.dimensions - 1, 0L);
+			} else {
+				ArrayQualifiedTypeReference arrayQualifiedTypeReference = (ArrayQualifiedTypeReference) this.lhs;
+				arrayAllocationExpression.type = arrayQualifiedTypeReference.dimensions == 1 ? new QualifiedTypeReference(arrayQualifiedTypeReference.tokens, arrayQualifiedTypeReference.sourcePositions)
+																: new ArrayQualifiedTypeReference(arrayQualifiedTypeReference.tokens, arrayQualifiedTypeReference.dimensions - 1, 
+																		arrayQualifiedTypeReference.sourcePositions);
+			}
+			implicitLambda.setBody(arrayAllocationExpression);
+		} else {
+			AllocationExpression allocation = new AllocationExpression();
+			if (this.lhs instanceof TypeReference) {
+				allocation.type = (TypeReference) this.lhs;
+			} else if (this.lhs instanceof SingleNameReference) {
+				allocation.type = new SingleTypeReference(((SingleNameReference) this.lhs).token, 0);
+			} else if (this.lhs instanceof QualifiedNameReference) {
+				allocation.type = new QualifiedTypeReference(((QualifiedNameReference) this.lhs).tokens, new long [((QualifiedNameReference) this.lhs).tokens.length]);
+			} else {
+				throw new IllegalStateException("Unexpected node type"); //$NON-NLS-1$
+			}
+			allocation.typeArguments = copy.typeArguments;
+			allocation.arguments = argv;
+			implicitLambda.setBody(allocation);
+		}
+		
+		// Process the lambda, taking care not to double report diagnostics. Don't expect any from resolve, Any from code generation should surface, but not those from flow analysis.
+		implicitLambda.resolve(currentScope);
+		IErrorHandlingPolicy oldPolicy = currentScope.problemReporter().switchErrorHandlingPolicy(silentErrorHandlingPolicy);
+		try {
+			implicitLambda.analyseCode(currentScope, 
+					new ExceptionHandlingFlowContext(null, this, Binding.NO_EXCEPTIONS, null, currentScope, FlowInfo.DEAD_END), 
+					UnconditionalFlowInfo.fakeInitializedFlowInfo(currentScope.outerMostMethodScope().analysisIndex, currentScope.referenceType().maxFieldCount));
+		} finally {
+			currentScope.problemReporter().switchErrorHandlingPolicy(oldPolicy);
+		}
+		SyntheticArgumentBinding[] outerLocals = this.receiverType.syntheticOuterLocalVariables();
+		for (int i = 0, length = outerLocals == null ? 0 : outerLocals.length; i < length; i++)
+			implicitLambda.addSyntheticArgument(outerLocals[i].actualOuterLocalVariable);
+		
+		implicitLambda.generateCode(currentScope, codeStream, valueRequired);
+	}	
+	
+	private boolean shouldGenerateImplicitLambda(BlockScope currentScope) {
+		// these cases are either too complicated, impossible to handle or result in significant code duplication 
+		return (this.binding.isVarargs() || 
+				(isConstructorReference() && this.receiverType.syntheticOuterLocalVariables() != null && currentScope.methodScope().isStatic) ||
+				this.expectedType instanceof IntersectionCastTypeBinding || // marker interfaces require alternate meta factory.
+				this.expectedType.findSuperTypeOriginatingFrom(currentScope.getJavaIoSerializable()) != null || // serialization support.
+				this.requiresBridges()); // bridges.
+		// To fix: We should opt for direct code generation wherever possible.
+	}
+	
 	public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean valueRequired) {
+		this.actualMethodBinding = this.binding; // grab before synthetics come into play.
+		// Handle some special cases up front and transform them into implicit lambdas.
+		if (shouldGenerateImplicitLambda(currentScope)) {
+			generateImplicitLambda(currentScope, codeStream, valueRequired);
+			return;
+		}
 		SourceTypeBinding sourceType = currentScope.enclosingSourceType();
 		if (this.receiverType.isArrayType()) {
 			if (isConstructorReference()) {
-				this.binding = sourceType.addSyntheticArrayMethod((ArrayBinding) this.receiverType, SyntheticMethodBinding.ArrayConstructor);
+				this.actualMethodBinding = this.binding = sourceType.addSyntheticArrayMethod((ArrayBinding) this.receiverType, SyntheticMethodBinding.ArrayConstructor);
 			} else if (CharOperation.equals(this.selector, TypeConstants.CLONE)) {
-				this.binding = sourceType.addSyntheticArrayMethod((ArrayBinding) this.receiverType, SyntheticMethodBinding.ArrayClone);
+				this.actualMethodBinding = this.binding = sourceType.addSyntheticArrayMethod((ArrayBinding) this.receiverType, SyntheticMethodBinding.ArrayClone);
 			}
 		} else if (this.syntheticAccessor != null) {
 			if (this.lhs.isSuper() || isMethodReference())
 				this.binding = this.syntheticAccessor;
+		} else { // cf. MessageSend.generateCode()'s call to CodeStream.getConstantPoolDeclaringClass. We have extracted the relevant portions sans side effect here. 
+			if (this.binding != null && isMethodReference()) {
+				if (TypeBinding.notEquals(this.binding.declaringClass, this.lhs.resolvedType.erasure())) {
+					if (!this.binding.declaringClass.canBeSeenBy(currentScope)) {
+						this.binding = new MethodBinding(this.binding, (ReferenceBinding) this.lhs.resolvedType.erasure());
+					}
+				}
+			}
 		}
 		
 		int pc = codeStream.position;
@@ -97,7 +218,7 @@
 		buffer.append('(');
 		if (this.haveReceiver) {
 			this.lhs.generateCode(currentScope, codeStream, true);
-			if (this.lhs.isSuper()) {
+			if (this.lhs.isSuper() && !this.actualMethodBinding.isPrivate()) {
 				if (this.lhs instanceof QualifiedSuperReference) {
 					QualifiedSuperReference qualifiedSuperReference = (QualifiedSuperReference) this.lhs;
 					TypeReference qualification = qualifiedSuperReference.qualification;
@@ -117,12 +238,7 @@
 			if (this.isConstructorReference()) {
 				ReferenceBinding[] enclosingInstances = Binding.UNINITIALIZED_REFERENCE_TYPES;
 				if (this.receiverType.isNestedType()) {
-					NestedTypeBinding nestedType = null;
-					if (this.receiverType instanceof ParameterizedTypeBinding) {
-						nestedType = (NestedTypeBinding)((ParameterizedTypeBinding) this.receiverType).genericType();
-					} else {
-						nestedType = (NestedTypeBinding) this.receiverType;
-					}
+					ReferenceBinding nestedType = (ReferenceBinding) this.receiverType;
 					if ((enclosingInstances = nestedType.syntheticEnclosingInstanceTypes()) != null) {
 						int length = enclosingInstances.length;
 						argumentsSize = length;
@@ -135,10 +251,12 @@
 									true /* disallow instance reference in explicit constructor call */);
 							codeStream.generateOuterAccess(emulationPath, this, syntheticArgumentType, currentScope);
 						}
+					} else {
+						enclosingInstances = Binding.NO_REFERENCE_TYPES;
 					}
 					// Reject types that capture outer local arguments, these cannot be manufactured by the metafactory.
 					if (nestedType.syntheticOuterLocalVariables() != null) {
-						currentScope.problemReporter().noSuchEnclosingInstance(nestedType.enclosingType, this, false);
+						currentScope.problemReporter().noSuchEnclosingInstance(nestedType.enclosingType(), this, false);
 						return;
 					}
 				}
@@ -152,8 +270,10 @@
 		buffer.append(this.resolvedType.constantPoolName());
 		buffer.append(';');
 		int invokeDynamicNumber = codeStream.classFile.recordBootstrapMethod(this);
-		codeStream.invokeDynamic(invokeDynamicNumber, argumentsSize, 1, LAMBDA, buffer.toString().toCharArray(), 
+		codeStream.invokeDynamic(invokeDynamicNumber, argumentsSize, 1, this.descriptor.selector, buffer.toString().toCharArray(), 
 				this.isConstructorReference(), (this.lhs instanceof TypeReference? (TypeReference) this.lhs : null), this.typeArguments);
+		if (!valueRequired)
+			codeStream.pop();
 		codeStream.recordPositionsFrom(pc, this.sourceStart);
 	}
 	
@@ -163,11 +283,14 @@
 			return;
 		
 		MethodBinding codegenBinding = this.binding.original();
+		if (codegenBinding.isVarargs())
+			return; // completely managed by transforming into implicit lambda expression.
+		
 		SourceTypeBinding enclosingSourceType = currentScope.enclosingSourceType();
 		
 		if (this.isConstructorReference()) {
 			ReferenceBinding allocatedType = codegenBinding.declaringClass;
-			if (codegenBinding.isPrivate() && enclosingSourceType != (allocatedType = codegenBinding.declaringClass)) {
+			if (codegenBinding.isPrivate() && TypeBinding.notEquals(enclosingSourceType, (allocatedType = codegenBinding.declaringClass))) {
 				if ((allocatedType.tagBits & TagBits.IsLocalType) != 0) {
 					codegenBinding.tagBits |= TagBits.ClearPrivateModifier;
 				} else {
@@ -180,7 +303,7 @@
 	
 		// -----------------------------------   Only method references from now on -----------
 		if (this.binding.isPrivate()) {
-			if (enclosingSourceType != codegenBinding.declaringClass){
+			if (TypeBinding.notEquals(enclosingSourceType, codegenBinding.declaringClass)){
 				this.syntheticAccessor = ((SourceTypeBinding)codegenBinding.declaringClass).addSyntheticMethod(codegenBinding, false /* not super access */);
 				currentScope.problemReporter().needToEmulateMethodAccess(codegenBinding, this);
 			}
@@ -221,13 +344,16 @@
 
 	public TypeBinding resolveType(BlockScope scope) {
 		
+		if (this.expectedType != null && !this.trialResolution) {  // final resolution ? may be not - i.e may be, but only in a non-final universe.
+			recordFunctionalType(scope);
+		}
+		
 		final CompilerOptions compilerOptions = scope.compilerOptions();
 		TypeBinding lhsType;
     	if (this.constant != Constant.NotAConstant) {
     		this.constant = Constant.NotAConstant;
     		this.enclosingScope = scope;
-    		if (isConstructorReference())
-    			this.lhs.bits |= ASTNode.IgnoreRawTypeCheck; // raw types in constructor references are to be treated as though <> were specified.
+    		this.lhs.bits |= ASTNode.IgnoreRawTypeCheck;
 
     		lhsType = this.lhs.resolveType(scope);
     		if (this.typeArguments != null) {
@@ -243,17 +369,23 @@
     					scope.problemReporter().illegalUsageOfWildcard(typeReference);
     				}
     			}
-    			if (this.typeArgumentsHaveErrors)
+    			if (this.typeArgumentsHaveErrors || lhsType == null)
     				return this.resolvedType = null;
+    			if (isConstructorReference() && lhsType.isRawType()) {
+    				scope.problemReporter().rawConstructorReferenceNotWithExplicitTypeArguments(this.typeArguments);
+    				return this.resolvedType = null;
+    			}
     		}
     	} else {
-    		if (this.typeArgumentsHaveErrors)
-				return this.resolvedType = null;
     		lhsType = this.lhs.resolvedType;
+    		if (this.typeArgumentsHaveErrors || lhsType == null)
+				return this.resolvedType = null;
     	}
 
     	if (this.expectedType == null && this.expressionContext == INVOCATION_CONTEXT) {
-			return new PolyTypeBinding(this);
+    		if (lhsType != null && !lhsType.isRawType()) // RawType::m and RawType::new are not exact method references
+    			this.exactMethodBinding = isMethodReference() ? scope.getExactMethod(lhsType, this.selector, this) : scope.getExactConstructor(lhsType, this);
+    		return new PolyTypeBinding(this);
 		}
 		super.resolveType(scope);
 		
@@ -275,6 +407,10 @@
 			return this.resolvedType = null;
 		}
 		
+		if (this.lhs instanceof TypeReference && lhsType.hasNullTypeAnnotations()) {
+			scope.problemReporter().nullAnnotationUnsupportedLocation((TypeReference) this.lhs);
+		}
+
 		/* 15.28: "It is a compile-time error if a method reference of the form super :: NonWildTypeArgumentsopt Identifier or of the form 
 		   TypeName . super :: NonWildTypeArgumentsopt Identifier occurs in a static context.": This is nop since the primary when it resolves
 		   itself will complain automatically.
@@ -286,11 +422,13 @@
 		*/
 		
 		// handle the special case of array construction first.
-        this.receiverType = lhsType;
+		this.receiverType = lhsType;
+		if (!this.haveReceiver && !this.lhs.isSuper() && !this.isArrayConstructorReference())
+			this.receiverType = lhsType.capture(scope, this.sourceEnd);
 		final int parametersLength = descriptorParameters.length;
         if (isConstructorReference() && lhsType.isArrayType()) {
         	final TypeBinding leafComponentType = lhsType.leafComponentType();
-			if (leafComponentType.isParameterizedType()) {
+			if (!leafComponentType.isReifiable()) {
         		scope.problemReporter().illegalGenericArray(leafComponentType, this);
         		return this.resolvedType = null;
         	}
@@ -298,11 +436,12 @@
         		scope.problemReporter().invalidArrayConstructorReference(this, lhsType, descriptorParameters);
         		return this.resolvedType = null;
         	}
-        	if (!lhsType.isCompatibleWith(this.descriptor.returnType)) {
+        	if (!lhsType.isCompatibleWith(this.descriptor.returnType) && this.descriptor.returnType.id != TypeIds.T_void) {
         		scope.problemReporter().constructedArrayIncompatible(this, lhsType, this.descriptor.returnType);
         		return this.resolvedType = null;
         	}
-        	return this.resolvedType; // No binding construction possible right now. Code generator will have to conjure up a rabbit.
+        	this.binding = this.exactMethodBinding = scope.getExactConstructor(lhsType, this);
+        	return this.resolvedType;
         }
 		
 		this.haveReceiver = true;
@@ -338,18 +477,14 @@
         			return this.resolvedType = null;
         		}
         	} 
-        } else {
-        	if (this.lhs instanceof NameReference && !this.haveReceiver && isMethodReference() && this.receiverType.isRawType()) {
-        		if ((this.lhs.bits & ASTNode.IgnoreRawTypeCheck) == 0 && compilerOptions.getSeverity(CompilerOptions.RawTypeReference) != ProblemSeverities.Ignore) {
-        			scope.problemReporter().rawTypeReference(this.lhs, this.receiverType);
-        		}
-        	}
         }
+    	
     	if (this.lhs.isSuper() && this.lhs.resolvedType.isInterface()) {
     		scope.checkAppropriateMethodAgainstSupers(this.selector, someMethod, this.descriptor.parameters, this);
     	}
 
         MethodBinding anotherMethod = null;
+        this.receiverPrecedesParameters = false;
         if (!this.haveReceiver && isMethodReference && parametersLength > 0) {
         	final TypeBinding potentialReceiver = descriptorParameters[0];
         	if (potentialReceiver.isCompatibleWith(this.receiverType, scope)) {
@@ -357,7 +492,7 @@
         		if (this.receiverType.isRawType()) {
         			TypeBinding superType = potentialReceiver.findSuperTypeOriginatingFrom(this.receiverType);
         			if (superType != null)
-        				typeToSearch = superType;
+        				typeToSearch = superType.capture(scope, this.sourceEnd);
         		}
         		TypeBinding [] parameters = Binding.NO_PARAMETERS;
         		if (parametersLength > 1) {
@@ -388,6 +523,7 @@
         	}
         } else if (anotherMethod != null && anotherMethod.isValidBinding()) {
         	this.binding = anotherMethod;
+        	this.receiverPrecedesParameters = true; // 0 is receiver, real parameters start at 1
         	this.bits &= ~ASTNode.DepthMASK;
         	if (anotherMethodDepth > 0) {
         		this.bits |= (anotherMethodDepth & 0xFF) << ASTNode.DepthSHIFT;
@@ -409,7 +545,7 @@
         	scope.problemReporter().cannotDireclyInvokeAbstractMethod(this, this.binding);
         
         if (this.binding.isStatic()) {
-        	if (this.binding.declaringClass != this.receiverType)
+        	if (TypeBinding.notEquals(this.binding.declaringClass, this.receiverType))
         		scope.problemReporter().indirectAccessToStaticMethod(this, this.binding);
         } else {
         	AbstractMethodDeclaration srcMethod = this.binding.sourceMethod();
@@ -431,6 +567,9 @@
         TypeBinding [] methodExceptions = this.binding.thrownExceptions;
         TypeBinding [] kosherExceptions = this.descriptor.thrownExceptions;
         next: for (int i = 0, iMax = methodExceptions.length; i < iMax; i++) {
+        	if (methodExceptions[i].isUncheckedException(false)) {
+        		continue next;
+    		}
         	for (int j = 0, jMax = kosherExceptions.length; j < jMax; j++) {
         		if (methodExceptions[i].isCompatibleWith(kosherExceptions[j], scope))
         			continue next;
@@ -438,27 +577,32 @@
         	scope.problemReporter().unhandledException(methodExceptions[i], this);
         }
         if (scope.compilerOptions().isAnnotationBasedNullAnalysisEnabled) {
-        	int len = this.descriptor.parameters.length;
+        	int len;
+        	int expectedlen = this.binding.parameters.length;
+        	int providedLen = this.descriptor.parameters.length;
+        	if (this.receiverPrecedesParameters)
+        		providedLen--; // one parameter is 'consumed' as the receiver
+        	boolean isVarArgs = false;
+        	if (this.binding.isVarargs()) {
+        		isVarArgs = (providedLen == expectedlen)
+					? !this.descriptor.parameters[expectedlen-1].isCompatibleWith(this.binding.parameters[expectedlen-1])
+					: true;
+        		len = providedLen; // binding parameters will be padded from InferenceContext18.getParameter()
+        	} else {
+        		len = Math.min(expectedlen, providedLen);
+        	}
     		for (int i = 0; i < len; i++) {
-    			Boolean declared = this.descriptor.parameterNonNullness == null ? null : this.descriptor.parameterNonNullness[i];
-    			Boolean implemented = this.binding.parameterNonNullness == null ? null : this.binding.parameterNonNullness[i];
-    			if (declared == Boolean.FALSE) { // promise to accept null
-    				if (implemented != Boolean.FALSE) {
-    					char[][] requiredAnnot = implemented == null ? null : scope.environment().getNonNullAnnotationName();
-    					scope.problemReporter().parameterLackingNullableAnnotation(this, this.descriptor, i, 
-    							scope.environment().getNullableAnnotationName(),
-    							requiredAnnot, this.binding.parameters[i]);
-    				}
-    			} else if (declared == null) {
-    				if (implemented == Boolean.TRUE) {
-    					scope.problemReporter().parameterRequiresNonnull(this, this.descriptor, i,
-    							scope.environment().getNonNullAnnotationName(), this.binding.parameters[i]);
-    				}
+    			TypeBinding descriptorParameter = this.descriptor.parameters[i + (this.receiverPrecedesParameters ? 1 : 0)];
+    			TypeBinding bindingParameter = InferenceContext18.getParameter(this.binding.parameters, i, isVarArgs);
+    			NullAnnotationMatching annotationStatus = NullAnnotationMatching.analyse(bindingParameter, descriptorParameter, FlowInfo.UNKNOWN);
+    			if (annotationStatus.isAnyMismatch()) {
+    				// immediate reporting:
+    				scope.problemReporter().referenceExpressionArgumentNullityMismatch(this, bindingParameter, descriptorParameter, this.descriptor, i, annotationStatus);
     			}
     		}
-        	if ((this.descriptor.tagBits & TagBits.AnnotationNonNull) != 0) {
-        		if ((this.binding.tagBits & TagBits.AnnotationNonNull) == 0) {
-        			char[][] providedAnnotationName = ((this.binding.tagBits & TagBits.AnnotationNullable) != 0) ?
+        	if ((this.descriptor.returnType.tagBits & TagBits.AnnotationNonNull) != 0) {
+        		if ((this.binding.returnType.tagBits & TagBits.AnnotationNonNull) == 0) {
+        			char[][] providedAnnotationName = ((this.binding.returnType.tagBits & TagBits.AnnotationNullable) != 0) ?
         					scope.environment().getNullableAnnotationName() : null;
         			scope.problemReporter().illegalReturnRedefinition(this, this.descriptor,
         					scope.environment().getNonNullAnnotationName(),
@@ -488,7 +632,10 @@
     				}
     			}
     		}
-    		if (!returnType.isCompatibleWith(this.descriptor.returnType, scope) && !isBoxingCompatible(returnType, this.descriptor.returnType, this, scope)) {
+    		if (this.descriptor.returnType.isProperType(true) // otherwise we cannot yet check compatibility
+    				&& !returnType.isCompatibleWith(this.descriptor.returnType, scope)
+    				&& !isBoxingCompatible(returnType, this.descriptor.returnType, this, scope))
+    		{
     			scope.problemReporter().incompatibleReturnType(this, this.binding, this.descriptor.returnType);
     			this.binding = null;
     			this.resolvedType = null;
@@ -498,24 +645,77 @@
     	return this.resolvedType; // Phew !
 	}
 
-	public final boolean isConstructorReference() {
+	/** During inference: Try to find an applicable method binding without causing undesired side-effects. */
+	public MethodBinding findCompileTimeMethodTargeting(TypeBinding targetType, Scope scope) {
+		if (this.exactMethodBinding != null) {
+			// TODO: shouldn't extactMethodBinding already be parameterized?
+			if (this.exactMethodBinding.typeVariables != Binding.NO_TYPE_VARIABLES && this.resolvedTypeArguments != null) {
+				return scope.environment().createParameterizedGenericMethod(this.exactMethodBinding, this.resolvedTypeArguments);
+			}
+			return this.exactMethodBinding;
+		}
+		return internalResolveTentatively(targetType, scope);
+	}
+
+	MethodBinding internalResolveTentatively(TypeBinding targetType, Scope scope) {
+		// FIXME: could enclosingScope still be null here??
+		IErrorHandlingPolicy oldPolicy = this.enclosingScope.problemReporter().switchErrorHandlingPolicy(silentErrorHandlingPolicy);
+		ExpressionContext previousContext = this.expressionContext;
+		MethodBinding previousBinding = this.binding;
+		MethodBinding previousDescriptor = this.descriptor;
+		TypeBinding previousResolvedType = this.resolvedType;
+		try {
+			setExpressionContext(INVOCATION_CONTEXT);
+			setExpectedType(targetType);
+			this.binding = null;
+			this.trialResolution = true;
+			resolveType(this.enclosingScope);
+			return this.binding;
+		} finally {
+			this.enclosingScope.problemReporter().switchErrorHandlingPolicy(oldPolicy);
+			// remove *any relevant* traces of this 'inofficial' resolving:
+			this.binding = previousBinding;
+			this.descriptor = previousDescriptor;
+			this.resolvedType = previousResolvedType;
+			setExpressionContext(previousContext);
+			this.expectedType = null; // don't call setExpectedType(null), would NPE
+			this.trialResolution = false;
+		}
+	}
+
+	public boolean isConstructorReference() {
 		return CharOperation.equals(this.selector,  ConstantPool.Init);
 	}
 	
-	public final boolean isMethodReference() {
+	public boolean isExactMethodReference() {
+		return this.exactMethodBinding != null;
+	}
+	
+	public boolean isMethodReference() {
 		return !CharOperation.equals(this.selector,  ConstantPool.Init);
 	}
 	
+	public boolean isPertinentToApplicability(TypeBinding targetType, MethodBinding method) {
+		if (!this.isExactMethodReference()) {
+			return false;
+		}
+		return super.isPertinentToApplicability(targetType, method);
+	}
+	
 	public TypeBinding[] genericTypeArguments() {
-		return null;
+		return this.resolvedTypeArguments;
+	}
+
+	public InferenceContext18 freshInferenceContext(Scope scope) {
+		return null; // subject to inference only as an argument to an outer invocation
 	}
 
 	public boolean isSuperAccess() {
-		return false;
+		return this.lhs.isSuper();
 	}
 
 	public boolean isTypeAccess() {
-		return false;
+		return !this.haveReceiver;
 	}
 
 	public void setActualReceiverType(ReferenceBinding receiverType) {
@@ -566,9 +766,30 @@
 		visitor.endVisit(this, blockScope);
 	}
 
+	public Expression[] createPseudoExpressions(TypeBinding[] p) {
+		if (this.descriptor == null)
+			return null;
+		// from 15.28.1: 
+		// ... the reference is treated as if it were an invocation with argument expressions of types P1..Pn
+		// ... the reference is treated as if it were an invocation with argument expressions of types P2..Pn
+		// (the different sets of types are passed from our resolveType to scope.getMethod(..), see someMethod, anotherMethod)
+		Expression[] expressions = new Expression[p.length];
+		long pos = (((long)this.sourceStart)<<32)+this.sourceEnd;
+		for (int i = 0; i < p.length; i++) {
+			expressions[i] = new SingleNameReference(("fakeArg"+i).toCharArray(), pos); //$NON-NLS-1$
+			expressions[i].resolvedType = p[i];
+		}
+		return expressions;
+	}
+
 	public boolean isCompatibleWith(TypeBinding left, Scope scope) {
-		// 15.28.1
-		final MethodBinding sam = left.getSingleAbstractMethod(this.enclosingScope);
+		if (this.binding != null && this.binding.isValidBinding() // binding indicates if full resolution has already happened
+				&& this.resolvedType != null && this.resolvedType.isValidBinding()) {
+			return this.resolvedType.isCompatibleWith(left, scope);
+		}
+		// 15.28.2
+		left = left.uncapture(this.enclosingScope);
+		final MethodBinding sam = left.getSingleAbstractMethod(this.enclosingScope, true);
 		if (sam == null || !sam.isValidBinding())
 			return false;
 		boolean isCompatible;
@@ -576,56 +797,57 @@
 		IErrorHandlingPolicy oldPolicy = this.enclosingScope.problemReporter().switchErrorHandlingPolicy(silentErrorHandlingPolicy);
 		try {
 			this.binding = null;
+			this.trialResolution = true;
 			resolveType(this.enclosingScope);
 		} finally {
 			this.enclosingScope.problemReporter().switchErrorHandlingPolicy(oldPolicy);
 			isCompatible = this.binding != null && this.binding.isValidBinding();
-			if (isCompatible) {
-				if (this.resultExpressions == null)
-					this.resultExpressions = new SimpleLookupTable(); // gather for more specific analysis later.
-				this.resultExpressions.put(left, this.binding.returnType);
-			}
 			this.binding = null;
 			setExpectedType(null);
+			this.trialResolution = false;
 		}
 		return isCompatible;
 	}
-	public boolean tIsMoreSpecific(TypeBinding t, TypeBinding s) {
-		/* 15.12.2.5 t is more specific than s iff ... Some of the checks here are redundant by the very fact of control reaching here, 
-		   but have been left in for completeness/documentation sakes. These should be cheap anyways. 
-		*/
+	
+	public boolean sIsMoreSpecific(TypeBinding s, TypeBinding t, Scope scope) {
 		
-		// Both t and s are functional interface types ... 
-		MethodBinding tSam = t.getSingleAbstractMethod(this.enclosingScope);
-		if (tSam == null || !tSam.isValidBinding())
-			return false;
-		MethodBinding sSam = s.getSingleAbstractMethod(this.enclosingScope);
-		if (sSam == null || !sSam.isValidBinding())
-			return false;
-		
-		// t should neither be a subinterface nor a superinterface of s
-		if (t.findSuperTypeOriginatingFrom(s) != null || s.findSuperTypeOriginatingFrom(t) != null)
-			return false;
-
-		// The descriptor parameter types of t are the same as the descriptor parameter types of s.
-		if (tSam.parameters.length != sSam.parameters.length)
-			return false;
-		for (int i = 0, length = tSam.parameters.length; i < length; i++) {
-			if (tSam.parameters[i] != sSam.parameters[i])
-				return false;
-		}
-		
-		// Either the descriptor return type of s is void or ...
-		if (sSam.returnType.id == TypeIds.T_void)
+		if (super.sIsMoreSpecific(s, t, scope))
 			return true;
 		
-		/* ... or the descriptor return type of the capture of T is more specific than the descriptor return type of S for 
-		   an invocation expression of the same form as the method reference..
-		*/
-		Expression resultExpression = (Expression) this.resultExpressions.get(t); // should be same as for s
+		if (this.exactMethodBinding == null || t.findSuperTypeOriginatingFrom(s) != null)
+			return false;
 		
-		t = t.capture(this.enclosingScope, this.sourceEnd);
-		tSam = t.getSingleAbstractMethod(this.enclosingScope);
-		return resultExpression.tIsMoreSpecific(tSam.returnType, sSam.returnType);
+		s = s.capture(this.enclosingScope, this.sourceEnd);
+		MethodBinding sSam = s.getSingleAbstractMethod(this.enclosingScope, true);
+		if (sSam == null || !sSam.isValidBinding())
+			return false;
+		TypeBinding r1 = sSam.returnType;
+		
+		MethodBinding tSam = t.getSingleAbstractMethod(this.enclosingScope, true);
+		if (tSam == null || !tSam.isValidBinding())
+			return false;
+		TypeBinding r2 = tSam.returnType;
+		
+		if (r2.id == TypeIds.T_void)
+			return true;
+		
+		if (r1.id == TypeIds.T_void)
+			return false;
+		
+		// r1 <: r2
+		if (r1.isCompatibleWith(r2, scope))
+			return true;
+		
+		return r1.isBaseType() != r2.isBaseType() && r1.isBaseType() == this.exactMethodBinding.returnType.isBaseType();
+	}
+
+	public org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding getMethodBinding() {
+		if (this.actualMethodBinding == null)  // array new/clone, no real binding.
+			this.actualMethodBinding = this.binding;
+		return this.actualMethodBinding;
+	}
+
+	public boolean isArrayConstructorReference() {
+		return isConstructorReference() && this.lhs.resolvedType != null && this.lhs.resolvedType.isArrayType();
 	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java
index faef7df..ba10f17 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -27,19 +23,27 @@
  *								bug 394768 - [compiler][resource] Incorrect resource leak warning when creating stream in conditional
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
  *								bug 400761 - [compiler][null] null may be return as boolean without a diagnostic
- *								bug 401030 - [1.8][null] Null analysis support for lambda methods. 
+ *								bug 401030 - [1.8][null] Null analysis support for lambda methods.
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 416307 - [1.8][compiler][null] subclass with type parameter substitution confuses null checking
+ *								Bug 417758 - [1.8][null] Null safety compromise during array creation.
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
  *     Jesper S Moller - Contributions for
  *								bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.ASSIGNMENT_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.*;
 
-public class ReturnStatement extends Statement implements ExpressionContext {
+public class ReturnStatement extends Statement {
 
 	public Expression expression;
 	public SubRoutineStatement[] subroutines;
@@ -62,13 +66,23 @@
 	// to each of the traversed try statements, so that execution will terminate properly.
 
 	// lookup the label, this should answer the returnContext
+	
+	if (this.expression instanceof FunctionalExpression) {
+		if (this.expression.resolvedType == null || !this.expression.resolvedType.isValidBinding()) {
+			/* Don't descend without proper target types. For lambda shape analysis, what is pertinent is value vs void return and the fact that
+			   this constitutes an abrupt exit. The former is already gathered, the latter is handled here.
+			*/ 
+			flowContext.recordAbruptExit();
+			return FlowInfo.DEAD_END;
+		}
+	}
 
 	MethodScope methodScope = currentScope.methodScope();
 	if (this.expression != null) {
 		flowInfo = this.expression.analyseCode(currentScope, flowContext, flowInfo);
 		this.expression.checkNPEbyUnboxing(currentScope, flowContext, flowInfo);
 		if (flowInfo.reachMode() == FlowInfo.REACHABLE)
-			checkAgainstNullAnnotation(currentScope, flowContext, this.expression.nullStatus(flowInfo, flowContext));
+			checkAgainstNullAnnotation(currentScope, flowContext, flowInfo);
 		if (currentScope.compilerOptions().analyseResourceLeaks) {
 			FakedTrackingVariable trackingVariable = FakedTrackingVariable.getCloseTrackingVariable(this.expression, flowInfo, flowContext);
 			if (trackingVariable != null) {
@@ -144,7 +158,7 @@
 		}
 	} else {
 		this.saveValueVariable = null;
-		if (((this.bits & ASTNode.IsSynchronized) == 0) && this.expression != null && this.expression.resolvedType == TypeBinding.BOOLEAN) {
+		if (((this.bits & ASTNode.IsSynchronized) == 0) && this.expression != null && TypeBinding.equalsEquals(this.expression.resolvedType, TypeBinding.BOOLEAN)) {
 			if (noAutoCloseables) { // can't abruptly return in the presence of autocloseables. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=367566
 				this.expression.bits |= ASTNode.IsReturnedValue;
 			}
@@ -155,19 +169,23 @@
 	flowContext.recordAbruptExit();
 	return FlowInfo.DEAD_END;
 }
-void checkAgainstNullAnnotation(BlockScope scope, FlowContext flowContext, int nullStatus) {
-	if (nullStatus != FlowInfo.NON_NULL) {
+void checkAgainstNullAnnotation(BlockScope scope, FlowContext flowContext, FlowInfo flowInfo) {
+	int nullStatus = this.expression.nullStatus(flowInfo, flowContext);
+	long tagBits;
+	MethodBinding methodBinding = null;
+	boolean useTypeAnnotations = scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8;
+	try {
+		methodBinding = scope.methodScope().referenceMethodBinding();
+		tagBits = (useTypeAnnotations) ? methodBinding.returnType.tagBits : methodBinding.tagBits;
+	} catch (NullPointerException npe) {
+		// chain of references in try-block has several potential nulls;
+		// any null means we cannot perform the following check
+		return;			
+	}
+	if (useTypeAnnotations) {
+		checkAgainstNullTypeAnnotation(scope, methodBinding.returnType, this.expression, flowContext, flowInfo);
+	} else if (nullStatus != FlowInfo.NON_NULL) {
 		// if we can't prove non-null check against declared null-ness of the enclosing method:
-		long tagBits;
-		MethodBinding methodBinding;
-		try {
-			methodBinding = scope.methodScope().referenceMethodBinding();
-			tagBits = methodBinding.tagBits;
-		} catch (NullPointerException npe) {
-			// chain of references in try-block has several potential nulls;
-			// any null means we cannot perform the following check
-			return;			
-		}
 		if ((tagBits & TagBits.AnnotationNonNull) != 0) {
 			flowContext.recordNullityMismatch(scope, this.expression, this.expression.resolvedType, methodBinding.returnType, nullStatus);
 		}
@@ -294,7 +312,7 @@
 			return;
 		}
 		expressionType = this.expression.resolveType(scope);
-		if (lambda != null && !this.implicitReturn)
+		if (lambda != null)
 			lambda.returnsExpression(this.expression, expressionType);
 		if (this.implicitReturn && (expressionType == TypeBinding.VOID || this.expression.statementExpression()))
 			return;
@@ -321,7 +339,7 @@
 	if (methodType == null)
 		return;
 
-	if (methodType != expressionType) // must call before computeConversion() and typeMismatchError()
+	if (TypeBinding.notEquals(methodType, expressionType)) // must call before computeConversion() and typeMismatchError()
 		scope.compilationUnitScope().recordTypeConversion(methodType, expressionType);
 	if (this.expression.isConstantValueOfTypeAssignableToType(expressionType, methodType)
 			|| expressionType.isCompatibleWith(methodType)) {
@@ -344,7 +362,7 @@
 	}
 	if ((methodType.tagBits & TagBits.HasMissingType) == 0) {
 		// no need to complain if return type was missing (avoid secondary error : 220967)
-		scope.problemReporter().typeMismatchError(expressionType, methodType, this.expression, null);
+		scope.problemReporter().typeMismatchError(expressionType, methodType, this.expression, this);
 	}
 }
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.java
index 75d8074..259d21e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.java
@@ -1,16 +1,14 @@
 /*******************************************************************************
- * 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Jesper Steen Moller - Contributions for:
+ *          Bug 412149: [1.8][compiler] Emit repeated annotations into the designated container
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -30,6 +28,10 @@
 		this.sourceStart = sourceStart;
 		this.sourceEnd = type.sourceEnd;
 	}
+	
+	public SingleMemberAnnotation() {
+		// for subclasses.
+	}
 
 	public ElementValuePair[] computeElementValuePairs() {
 		return new ElementValuePair[] {memberValuePairs()[0].compilerElementPair};
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
index 4941520..d29206d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - Contributions for
@@ -16,9 +12,11 @@
  *								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 382721 - [1.8][compiler] Effectively final variables needs special treatment
  *								bug 378674 - "The method can be declared as static" is wrong
+ *								bug 404657 - [1.8][compiler] Analysis for effectively final variables fails to consider loops
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -124,7 +122,8 @@
 				} else {
 					currentScope.problemReporter().cannotAssignToFinalField(fieldBinding, this);
 				}
-			} else if (!isCompound && fieldBinding.isNonNull()) {
+			} else if (!isCompound && fieldBinding.isNonNull()
+						&& TypeBinding.equalsEquals(fieldBinding.declaringClass, currentScope.enclosingReceiverType())) { // inherited fields are not tracked here
 				// record assignment for detecting uninitialized non-null fields:
 				flowInfo.markAsDefinitelyAssigned(fieldBinding);
 			}
@@ -137,19 +136,23 @@
 			} else {
 				this.bits &= ~ASTNode.FirstAssignmentToLocal;
 			}
-			if (flowInfo.isPotentiallyAssigned(localBinding)) {
+			if (flowInfo.isPotentiallyAssigned(localBinding) || (this.bits & ASTNode.IsCapturedOuterLocal) != 0) {
 				localBinding.tagBits &= ~TagBits.IsEffectivelyFinal;
 				if (!isFinal && (this.bits & ASTNode.IsCapturedOuterLocal) != 0) {
 					currentScope.problemReporter().cannotReferToNonEffectivelyFinalOuterLocal(localBinding, this);
 				}
 			}
-			if (isFinal) {
+			if (! isFinal && (localBinding.tagBits & TagBits.IsEffectivelyFinal) != 0 && (localBinding.tagBits & TagBits.IsArgument) == 0) {
+				flowContext.recordSettingFinal(localBinding, this, flowInfo);
+			} else if (isFinal) {
 				if ((this.bits & ASTNode.DepthMASK) == 0) {
 					// tolerate assignment to final local in unreachable code (45674)
 					if ((isReachable && isCompound) || !localBinding.isBlankFinal()){
 						currentScope.problemReporter().cannotAssignToFinalLocal(localBinding, this);
 					} else if (flowInfo.isPotentiallyAssigned(localBinding)) {
 						currentScope.problemReporter().duplicateInitializationOfFinalLocal(localBinding, this);
+					} else if ((this.bits & ASTNode.IsCapturedOuterLocal) != 0) {
+						currentScope.problemReporter().cannotAssignToFinalOuterLocal(localBinding, this);
 					} else {
 						flowContext.recordSettingFinal(localBinding, this, flowInfo);
 					}
@@ -216,7 +219,7 @@
 			SourceTypeBinding sourceType = scope.enclosingSourceType();
 			if (this.constant == Constant.NotAConstant
 					&& !methodScope.isStatic
-					&& (sourceType == declaringClass || sourceType.superclass == declaringClass) // enum constant body
+					&& (TypeBinding.equalsEquals(sourceType, declaringClass) || TypeBinding.equalsEquals(sourceType.superclass, declaringClass)) // enum constant body
 					&& methodScope.isInsideInitializerOrConstructor()) {
 				scope.problemReporter().enumStaticFieldUsedDuringInitialization(fieldBinding, this);
 			}
@@ -238,7 +241,7 @@
 		scope.problemReporter().deprecatedField(fieldBinding, this);
 
 	if ((this.bits & ASTNode.IsStrictlyAssigned) == 0
-			&& methodScope.enclosingSourceType() == fieldBinding.original().declaringClass
+			&& TypeBinding.equalsEquals(methodScope.enclosingSourceType(), fieldBinding.original().declaringClass)
 			&& methodScope.lastVisibleFieldID >= 0
 			&& fieldBinding.id >= methodScope.lastVisibleFieldID
 			&& (!fieldBinding.isStatic() || methodScope.isStatic)) {
@@ -419,7 +422,7 @@
 				if (codegenField.isStatic()) {
 					if (!valueRequired
 							// if no valueRequired, still need possible side-effects of <clinit> invocation, if field belongs to different class
-							&& ((FieldBinding)this.binding).original().declaringClass == this.actualReceiverType.erasure()
+							&& TypeBinding.equalsEquals(((FieldBinding)this.binding).original().declaringClass, this.actualReceiverType.erasure())
 							&& ((this.implicitConversion & TypeIds.UNBOXING) == 0)
 							&& this.genericCast == null) {
 						// if no valueRequired, optimize out entire gen
@@ -777,7 +780,7 @@
 			}
 
 			// using incr bytecode if possible
-			if (localBinding.type == TypeBinding.INT) {
+			if (TypeBinding.equalsEquals(localBinding.type, TypeBinding.INT)) {
 				if (valueRequired) {
 					codeStream.load(localBinding);
 				}
@@ -851,7 +854,7 @@
 		case Binding.FIELD : // reading a field
 		case Binding.LOCAL : // reading a local variable
 			if (supportTypeAnnotations 
-					|| (((VariableBinding)this.binding).tagBits & (TagBits.AnnotationNonNull|TagBits.AnnotationNullable)) != 0)
+					|| (((VariableBinding)this.binding).tagBits & TagBits.AnnotationNullMASK) != 0)
 				return (VariableBinding) this.binding;
 	}
 	return null;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleTypeReference.java
index cebfa73..090de99 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SingleTypeReference.java
@@ -5,12 +5,10 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -31,21 +29,14 @@
 
 	}
 
-	public TypeReference copyDims(int dim){
-		//return a type reference copy of me with some dimensions
-		//warning : the new type ref has a null binding
-
-		return new ArrayTypeReference(this.token, dim,(((long)this.sourceStart)<<32)+this.sourceEnd);
-	}
-	
-	public TypeReference copyDims(int dim, Annotation[][] annotationsOnDimensions){
-		//return a type reference copy of me with some dimensions
-		//warning : the new type ref has a null binding
-		ArrayTypeReference arrayTypeReference = new ArrayTypeReference(this.token, dim, annotationsOnDimensions, (((long)this.sourceStart)<<32)+this.sourceEnd);
+	public TypeReference augmentTypeWithAdditionalDimensions(int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs) {
+		int totalDimensions = this.dimensions() + additionalDimensions;
+		Annotation [][] allAnnotations = getMergedAnnotationsOnDimensions(additionalDimensions, additionalAnnotations);
+		ArrayTypeReference arrayTypeReference = new ArrayTypeReference(this.token, totalDimensions, allAnnotations, (((long) this.sourceStart) << 32) + this.sourceEnd);
+		arrayTypeReference.annotations = this.annotations;
 		arrayTypeReference.bits |= (this.bits & ASTNode.HasTypeAnnotations);
-		if (annotationsOnDimensions != null) {
-			arrayTypeReference.bits |= ASTNode.HasTypeAnnotations;
-		}
+		if (!isVarargs)
+			arrayTypeReference.extendedDimensions = additionalDimensions;
 		return arrayTypeReference;
 	}
 
@@ -84,10 +75,11 @@
 	}
 
 	public TypeBinding resolveTypeEnclosing(BlockScope scope, ReferenceBinding enclosingType) {
-		TypeBinding memberType = this.resolvedType = scope.getMemberType(this.token, enclosingType);
+		this.resolvedType = scope.getMemberType(this.token, enclosingType);
 		boolean hasError = false;
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=391500
 		resolveAnnotations(scope);
+		TypeBinding memberType = this.resolvedType; // load after possible update in resolveAnnotations()
 		if (!memberType.isValidBinding()) {
 			hasError = true;
 			scope.problemReporter().invalidEnclosingType(this, memberType, enclosingType);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Statement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Statement.java
index c5f3452..413e10f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Statement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Statement.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -22,8 +18,20 @@
  *								bug 392862 - [1.8][compiler][null] Evaluate null annotations on array types
  *								bug 331649 - [compiler][null] consider null annotations for fields
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 415291 - [1.8][null] differentiate type incompatibilities due to null annotations
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 416307 - [1.8][compiler][null] subclass with type parameter substitution confuses null checking
+ *								Bug 417758 - [1.8][null] Null safety compromise during array creation.
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 424415 - [1.8][compiler] Eventual resolution of ReferenceExpression is not seen to be happening.
+ *								Bug 418537 - [1.8][null] Fix null type annotation analysis for poly conditional expressions
+ *								Bug 428352 - [1.8][compiler] Resolution errors don't always surface
+ *								Bug 429430 - [1.8] Lambdas and method reference infer wrong exception type with generics (RuntimeException instead of IOException)
  *        Andy Clement - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409250 - [1.8][compiler] Various loose ends in 308 code generation
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -80,18 +88,22 @@
 	// compare actual null-status against parameter annotations of the called method:
 	if (arguments != null) {
 		CompilerOptions compilerOptions = currentScope.compilerOptions();
+		if (compilerOptions.sourceLevel >= ClassFileConstants.JDK1_7 && methodBinding.isPolymorphic())
+			return;
 		boolean considerTypeAnnotations = compilerOptions.sourceLevel >= ClassFileConstants.JDK1_8
 				&& compilerOptions.isAnnotationBasedNullAnalysisEnabled;
 		boolean hasJDK15NullAnnotations = methodBinding.parameterNonNullness != null;
 		int numParamsToCheck = methodBinding.parameters.length;
+		int varArgPos = -1;
+		TypeBinding varArgsType = null;
+		boolean passThrough = false;
 		if (considerTypeAnnotations || hasJDK15NullAnnotations) {
 			// check if varargs need special treatment:
-			boolean passThrough = false;
 			if (methodBinding.isVarargs()) {
-				int varArgPos = numParamsToCheck-1;
+				varArgPos = numParamsToCheck-1;
 				// this if-block essentially copied from generateArguments(..):
 				if (numParamsToCheck == arguments.length) {
-					TypeBinding varArgsType = methodBinding.parameters[varArgPos];
+					varArgsType = methodBinding.parameters[varArgPos];
 					TypeBinding lastType = arguments[varArgPos].resolvedType;
 					if (lastType == TypeBinding.NULL
 							|| (varArgsType.dimensions() == lastType.dimensions()
@@ -105,17 +117,16 @@
 		if (considerTypeAnnotations) {
 			for (int i=0; i<numParamsToCheck; i++) {
 				TypeBinding expectedType = methodBinding.parameters[i];
-				Expression argument = arguments[i];
-				// prefer check based on type annotations:
-				int severity = findNullTypeAnnotationMismatch(expectedType, argument.resolvedType);
-				if (severity > 0) {
-					// immediate reporting:
-					currentScope.problemReporter().nullityMismatchingTypeAnnotation(argument, argument.resolvedType, expectedType, severity==1, currentScope.environment());
-					// next check flow-based null status against null JDK15-style annotations:
-				} else if (hasJDK15NullAnnotations && methodBinding.parameterNonNullness[i] == Boolean.TRUE) {
-					int nullStatus = argument.nullStatus(flowInfo, flowContext); // slight loss of precision: should also use the null info from the receiver.
-					if (nullStatus != FlowInfo.NON_NULL) // if required non-null is not provided
-						flowContext.recordNullityMismatch(currentScope, argument, argument.resolvedType, expectedType, nullStatus);
+				Boolean specialCaseNonNullness = hasJDK15NullAnnotations ? methodBinding.parameterNonNullness[i] : null;
+				analyseOneArgument18(currentScope, flowContext, flowInfo, expectedType, arguments[i],
+						specialCaseNonNullness, methodBinding.original().parameters[i]);
+			}
+			if (!passThrough && varArgsType instanceof ArrayBinding) {
+				TypeBinding expectedType = ((ArrayBinding) varArgsType).elementsType();
+				Boolean specialCaseNonNullness = hasJDK15NullAnnotations ? methodBinding.parameterNonNullness[varArgPos] : null;
+				for (int i = numParamsToCheck; i < arguments.length; i++) {
+					analyseOneArgument18(currentScope, flowContext, flowInfo, expectedType, arguments[i],
+							specialCaseNonNullness, methodBinding.original().parameters[varArgPos]);
 				}
 			}
 		} else if (hasJDK15NullAnnotations) {
@@ -131,51 +142,59 @@
 		} 
 	}
 }
-
-/** Check null-ness of 'var' against a possible null annotation */
-protected int checkAssignmentAgainstNullAnnotation(BlockScope currentScope, FlowContext flowContext,
-												   VariableBinding var, int nullStatus, Expression expression, TypeBinding providedType)
+void analyseOneArgument18(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo,
+		TypeBinding expectedType, Expression argument, Boolean expectedNonNullness, TypeBinding originalExpected) {
+	if (argument instanceof ConditionalExpression && argument.isPolyExpression()) {
+		// drill into both branches using existing nullStatus per branch:
+		ConditionalExpression ce = (ConditionalExpression) argument;
+		ce.internalAnalyseOneArgument18(currentScope, flowContext, expectedType, ce.valueIfTrue, ce.ifTrueNullStatus, expectedNonNullness, originalExpected);
+		ce.internalAnalyseOneArgument18(currentScope, flowContext, expectedType, ce.valueIfFalse, ce.ifFalseNullStatus, expectedNonNullness, originalExpected);
+		return;
+	}
+	int nullStatus = argument.nullStatus(flowInfo, flowContext);
+	internalAnalyseOneArgument18(currentScope, flowContext, expectedType, argument, nullStatus,
+									expectedNonNullness, originalExpected);
+}
+void internalAnalyseOneArgument18(BlockScope currentScope, FlowContext flowContext, TypeBinding expectedType,
+		Expression argument, int nullStatus, Boolean expectedNonNullness, TypeBinding originalExpected) 
 {
-	int severity = 0;
-	if ((var.tagBits & TagBits.AnnotationNonNull) != 0
-			&& nullStatus != FlowInfo.NON_NULL) {
-		flowContext.recordNullityMismatch(currentScope, expression, providedType, var.type, nullStatus);
-		return FlowInfo.NON_NULL;
-	} else if ((severity = findNullTypeAnnotationMismatch(var.type, providedType)) > 0) {
-		currentScope.problemReporter().nullityMismatchingTypeAnnotation(expression, providedType, var.type, severity==1, currentScope.environment());
-	} else if ((var.tagBits & TagBits.AnnotationNullable) != 0
-			&& nullStatus == FlowInfo.UNKNOWN) {	// provided a legacy type?
-		return FlowInfo.POTENTIALLY_NULL;			// -> use more specific info from the annotation
+	// here we consume special case information generated in the ctor of ParameterizedGenericMethodBinding (see there):
+	int statusFromAnnotatedNull = expectedNonNullness == Boolean.TRUE ? nullStatus : 0;  
+	
+	NullAnnotationMatching annotationStatus = NullAnnotationMatching.analyse(expectedType, argument.resolvedType, nullStatus);
+	
+	if (!annotationStatus.isAnyMismatch() && statusFromAnnotatedNull != 0)
+		expectedType = originalExpected; // to avoid reports mentioning '@NonNull null'!
+	
+	if (annotationStatus.isDefiniteMismatch() || statusFromAnnotatedNull == FlowInfo.NULL) {
+		// immediate reporting:
+		currentScope.problemReporter().nullityMismatchingTypeAnnotation(argument, argument.resolvedType, expectedType, annotationStatus);
+	} else if (annotationStatus.isUnchecked() || (statusFromAnnotatedNull & FlowInfo.POTENTIALLY_NULL) != 0) {
+		flowContext.recordNullityMismatch(currentScope, argument, argument.resolvedType, expectedType, nullStatus);
 	}
-	return nullStatus;
 }
-protected int findNullTypeAnnotationMismatch(TypeBinding requiredType, TypeBinding providedType) {
-	int severity = 0;
-	if (requiredType instanceof ArrayBinding) {
-		long[] requiredDimsTagBits = ((ArrayBinding)requiredType).nullTagBitsPerDimension;
-		if (requiredDimsTagBits != null) {
-			int dims = requiredType.dimensions();
-			if (requiredType.dimensions() == providedType.dimensions()) {
-				long[] providedDimsTagBits = ((ArrayBinding)providedType).nullTagBitsPerDimension;
-				if (providedDimsTagBits == null) {
-					severity = 1; // required is annotated, provided not, need unchecked conversion
-				} else {
-					for (int i=0; i<dims; i++) {
-						long requiredBits = requiredDimsTagBits[i] & TagBits.AnnotationNullMASK;
-						long providedBits = providedDimsTagBits[i] & TagBits.AnnotationNullMASK;
-						if (requiredBits != 0 && requiredBits != providedBits) {
-							if (providedBits == 0)
-								severity = 1; // need unchecked conversion regarding type detail
-							else
-								return 2; // mismatching annotations
-						}
-					}
-				}
-			}
-		}
+
+protected void checkAgainstNullTypeAnnotation(BlockScope scope, TypeBinding requiredType, Expression expression, FlowContext flowContext, FlowInfo flowInfo) {
+	if (expression instanceof ConditionalExpression && expression.isPolyExpression()) {
+		// drill into both branches using existing nullStatus per branch:
+		ConditionalExpression ce = (ConditionalExpression) expression;
+		internalCheckAgainstNullTypeAnnotation(scope, requiredType, ce.valueIfTrue, ce.ifTrueNullStatus, flowContext);
+		internalCheckAgainstNullTypeAnnotation(scope, requiredType, ce.valueIfFalse, ce.ifFalseNullStatus, flowContext);
+		return;
 	}
-	return severity;
+	int nullStatus = expression.nullStatus(flowInfo, flowContext);
+	internalCheckAgainstNullTypeAnnotation(scope, requiredType, expression, nullStatus, flowContext);
 }
+private void internalCheckAgainstNullTypeAnnotation(BlockScope scope, TypeBinding requiredType, Expression expression,
+		int nullStatus, FlowContext flowContext) {
+	NullAnnotationMatching annotationStatus = NullAnnotationMatching.analyse(requiredType, expression.resolvedType, nullStatus);
+	if (annotationStatus.isDefiniteMismatch()) {
+		scope.problemReporter().nullityMismatchingTypeAnnotation(expression, expression.resolvedType, requiredType, annotationStatus);
+	} else if (annotationStatus.isUnchecked()) {
+		flowContext.recordNullityMismatch(scope, expression, expression.resolvedType, requiredType, nullStatus);
+	}
+}
+
 /**
  * INTERNAL USE ONLY.
  * This is used to redirect inter-statements jumps.
@@ -232,7 +251,7 @@
 			// called with (argLength - lastIndex) elements : foo(1, 2) or foo(1, 2, 3, 4)
 			// need to gen elements into an array, then gen each remaining element into created array
 			codeStream.generateInlinedValue(argLength - varArgIndex);
-			codeStream.newArray(null, codeGenVarArgsType); // create a mono-dimensional array
+			codeStream.newArray(codeGenVarArgsType); // create a mono-dimensional array
 			for (int i = varArgIndex; i < argLength; i++) {
 				codeStream.dup();
 				codeStream.generateInlinedValue(i - varArgIndex);
@@ -251,7 +270,7 @@
 				// right number but not directly compatible or too many arguments - wrap extra into array
 				// need to gen elements into an array, then gen each remaining element into created array
 				codeStream.generateInlinedValue(1);
-				codeStream.newArray(null, codeGenVarArgsType); // create a mono-dimensional array
+				codeStream.newArray(codeGenVarArgsType); // create a mono-dimensional array
 				codeStream.dup();
 				codeStream.generateInlinedValue(0);
 				arguments[varArgIndex].generateCode(currentScope, codeStream, true);
@@ -261,7 +280,7 @@
 			// scenario: foo(1) --> foo(1, new int[0])
 			// generate code for an empty array of parameterType
 			codeStream.generateInlinedValue(0);
-			codeStream.newArray(null, codeGenVarArgsType); // create a mono-dimensional array
+			codeStream.newArray(codeGenVarArgsType); // create a mono-dimensional array
 		}
 	} else if (arguments != null) { // standard generation for method arguments
 		for (int i = 0, max = arguments.length; i < max; i++)
@@ -271,7 +290,7 @@
 
 public abstract void generateCode(BlockScope currentScope, CodeStream codeStream);
 
-protected boolean isBoxingCompatible(TypeBinding expressionType, TypeBinding targetType, Expression expression, Scope scope) {
+public boolean isBoxingCompatible(TypeBinding expressionType, TypeBinding targetType, Expression expression, Scope scope) {
 	if (scope.isBoxingCompatibleWith(expressionType, targetType))
 		return true;
 
@@ -319,11 +338,41 @@
 	return Constant.NotAConstant;
 }
 /** 
- * Implementation of {@link org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite#expectedType}
+ * Implementation of {@link org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite#invocationTargetType}
  * suitable at this level. Subclasses should override as necessary.
- * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite#expectedType()
+ * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite#invocationTargetType()
  */
-public TypeBinding expectedType() {
+public TypeBinding invocationTargetType() {
 	return null;
 }
+/** Simpler notion of expected type, suitable for code assist purposes. */
+public TypeBinding expectedType() {
+	// for all but FunctionalExpressions, this is the same as invocationTargetType.
+	return invocationTargetType();
+}
+public ExpressionContext getExpressionContext() {
+	return ExpressionContext.VANILLA_CONTEXT;
+}
+/**
+ * For all constructor invocations: find the constructor binding; 
+ * if site.innersNeedUpdate() perform some post processing for those and produce
+ * any updates as side-effects into 'argumentTypes'.
+ */
+protected MethodBinding findConstructorBinding(BlockScope scope, Invocation site, ReferenceBinding receiverType, TypeBinding[] argumentTypes) {
+	MethodBinding ctorBinding = scope.getConstructor(receiverType, argumentTypes, site);
+	resolvePolyExpressionArguments(site, ctorBinding, argumentTypes, scope);
+	return ctorBinding;
+}
+/**
+ * If an exception-throwing statement is resolved within the scope of a lambda, record the exception type(s).
+ * It is likely wrong to do this during resolve, should probably use precise flow information.
+ */
+protected void recordExceptionsForEnclosingLambda(BlockScope scope, TypeBinding... thrownExceptions) {
+	MethodScope methodScope = scope.methodScope();
+	if (methodScope != null && methodScope.referenceContext instanceof LambdaExpression) {
+		LambdaExpression lambda = (LambdaExpression) methodScope.referenceContext;
+		for (int i = 0; i < thrownExceptions.length; i++)
+			lambda.throwsException(thrownExceptions[i]);
+	}
+}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SuperReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SuperReference.java
index a04b57f..e983442 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SuperReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SuperReference.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -43,6 +39,11 @@
 
 		return true;
 	}
+	
+	@Override
+	public boolean isUnqualifiedSuper() {
+		return true;
+	}
 
 	public boolean isThis() {
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java
index 8d0f404..e12e3df 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.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
@@ -27,6 +27,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
 
+@SuppressWarnings("rawtypes")
 public class SwitchStatement extends Statement {
 
 	public Expression expression;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThisReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThisReference.java
index 5e639c2..112c7a5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThisReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThisReference.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -62,6 +58,12 @@
 		if (methodScope.isStatic) {
 			methodScope.problemReporter().errorThisSuperInStatic(this);
 			return false;
+		} else if (this.isUnqualifiedSuper()) {
+			TypeDeclaration type = methodScope.referenceType();
+			if (type != null && TypeDeclaration.kind(type.modifiers) == TypeDeclaration.INTERFACE_DECL) {
+				methodScope.problemReporter().errorNoSuperInInterface(this);
+				return false;
+			}
 		}
 		if (receiverType != null)
 			scope.tagAsAccessingEnclosingInstanceStateOf(receiverType, false /* type variable access */);
@@ -132,7 +134,14 @@
 		if (!isImplicitThis() &&!checkAccess(scope, enclosingReceiverType)) {
 			return null;
 		}
-		return this.resolvedType = enclosingReceiverType;
+		this.resolvedType = enclosingReceiverType;
+		MethodScope methodScope = scope.namedMethodScope();
+		if (methodScope != null) {
+			MethodBinding method = methodScope.referenceMethodBinding();
+			if (method != null && method.receiver != null && TypeBinding.equalsEquals(method.receiver, this.resolvedType))
+				this.resolvedType = method.receiver;
+		}
+		return this.resolvedType;
 	}
 
 	public void traverse(ASTVisitor visitor, BlockScope blockScope) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThrowStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThrowStatement.java
index 716881e..21b56eb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThrowStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/ThrowStatement.java
@@ -1,20 +1,17 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
  *								bug 359334 - Analysis for resource leak warnings does not consider exceptions as method exit points
  *								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 429430 - [1.8] Lambdas and method reference infer wrong exception type with generics (RuntimeException instead of IOException)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -24,7 +21,6 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowInfo;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 
@@ -72,11 +68,7 @@
 
 public void resolve(BlockScope scope) {
 	this.exceptionType = this.exception.resolveType(scope);
-	MethodScope methodScope = scope.methodScope();
-	LambdaExpression lambda = methodScope.referenceContext instanceof LambdaExpression ? (LambdaExpression) methodScope.referenceContext : null;
-	if (lambda != null) {
-		lambda.throwsException(this.exceptionType);
-	}
+	recordExceptionsForEnclosingLambda(scope, this.exceptionType);
 	if (this.exceptionType != null && this.exceptionType.isValidBinding()) {
 		if (this.exceptionType == TypeBinding.NULL) {
 			if (scope.compilerOptions().complianceLevel <= ClassFileConstants.JDK1_3){
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TryStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
index 35d4e13..6091690 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -498,10 +494,10 @@
 			ExceptionLabel exceptionLabel = null;
 			if ((argument.binding.tagBits & TagBits.MultiCatchParameter) != 0) {
 				MultiCatchExceptionLabel multiCatchExceptionLabel = new MultiCatchExceptionLabel(codeStream, argument.binding.type);
-				multiCatchExceptionLabel.initialize((UnionTypeReference) argument.type);
+				multiCatchExceptionLabel.initialize((UnionTypeReference) argument.type, argument.annotations);
 				exceptionLabel = multiCatchExceptionLabel;
 			} else {
-				exceptionLabel = new ExceptionLabel(codeStream, argument.binding.type, argument.type);
+				exceptionLabel = new ExceptionLabel(codeStream, argument.binding.type, argument.type, argument.annotations);
 			}
 			exceptionLabel.placeStart();
 			exceptionLabels[i] = exceptionLabel;
@@ -1062,8 +1058,9 @@
 			this.anyExceptionVariable.setConstant(Constant.NotAConstant); // not inlinable
 
 			if (!methodScope.isInsideInitializer()) {
-				MethodBinding methodBinding =
-					((AbstractMethodDeclaration) methodScope.referenceContext).binding;
+				MethodBinding methodBinding = methodScope.referenceContext instanceof AbstractMethodDeclaration ?
+					((AbstractMethodDeclaration) methodScope.referenceContext).binding : (methodScope.referenceContext instanceof LambdaExpression ? 
+							((LambdaExpression)methodScope.referenceContext).binding : null);
 				if (methodBinding != null) {
 					TypeBinding methodReturnType = methodBinding.returnType;
 					if (methodReturnType.id != TypeIds.T_void) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
index 65cca1a..287a80a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
@@ -5,15 +5,14 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     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
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 416176 - [1.8][compiler][null] null type annotations cause grief on type variables
+ *								Bug 424727 - [compiler][null] NullPointerException in nullAnnotationUnsupportedLocation(ProblemReporter.java:5708)
  *     Keigo Imai - Contribution for  bug 388903 - Cannot extend inner class as an anonymous class when it extends the outer class
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
@@ -424,6 +423,7 @@
 		System.arraycopy(inheritedConstructorBinding.parameterNonNullness, 0, 
 				constructor.binding.parameterNonNullness = new Boolean[len], 0, len);
 	}
+	// TODO(stephan): do argument types already carry sufficient info about type annotations?
 
 	constructor.scope = new MethodScope(this.scope, constructor, true);
 	constructor.bindArguments();
@@ -462,7 +462,7 @@
 	if (memberTypeBinding != null && this.memberTypes != null) {
 		for (int i = 0, max = this.memberTypes.length; i < max; i++) {
 			TypeDeclaration memberTypeDecl;
-			if ((memberTypeDecl = this.memberTypes[i]).binding == memberTypeBinding)
+			if (TypeBinding.equalsEquals((memberTypeDecl = this.memberTypes[i]).binding, memberTypeBinding))
 				return memberTypeDecl;
 		}
 	}
@@ -1045,6 +1045,19 @@
 				this.scope.problemReporter().notAFunctionalInterface(this);
 			}
 		}
+		if (this.scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8) {
+			if ((annotationTagBits & TagBits.AnnotationNullMASK) != 0) {
+				for (int i = 0; i < this.annotations.length; i++) {
+					ReferenceBinding annotationType = this.annotations[i].getCompilerAnnotation().getAnnotationType();
+					if (annotationType != null) {
+						if (annotationType.id == TypeIds.T_ConfiguredAnnotationNonNull
+								|| annotationType.id == TypeIds.T_ConfiguredAnnotationNullable)
+						this.scope.problemReporter().nullAnnotationUnsupportedLocation(this.annotations[i]);
+						sourceType.tagBits &= ~TagBits.AnnotationNullMASK;
+					}
+				}
+			}
+		}
 
 		if ((this.bits & ASTNode.UndocumentedEmptyBlock) != 0) {
 			this.scope.problemReporter().undocumentedEmptyBlock(this.bodyStart-1, this.bodyEnd);
@@ -1117,11 +1130,6 @@
 		boolean hasEnumConstants = false;
 		FieldDeclaration[] enumConstantsWithoutBody = null;
 
-		if (this.typeParameters != null) {
-			for (int i = 0, count = this.typeParameters.length; i < count; i++) {
-				this.typeParameters[i].resolve(this.scope);
-			}
-		}
 		if (this.memberTypes != null) {
 			for (int i = 0, count = this.memberTypes.length; i < count; i++) {
 				this.memberTypes[i].resolve(this.scope);
@@ -1150,7 +1158,7 @@
 						if (needSerialVersion
 								&& ((fieldBinding.modifiers & (ClassFileConstants.AccStatic | ClassFileConstants.AccFinal)) == (ClassFileConstants.AccStatic | ClassFileConstants.AccFinal))
 								&& CharOperation.equals(TypeConstants.SERIALVERSIONUID, fieldBinding.name)
-								&& TypeBinding.LONG == fieldBinding.type) {
+								&& TypeBinding.equalsEquals(TypeBinding.LONG, fieldBinding.type)) {
 							needSerialVersion = false;
 						}
 						localMaxFieldCount++;
@@ -1173,7 +1181,7 @@
 			if (javaxRmiCorbaStub.isValidBinding()) {
 				ReferenceBinding superclassBinding = this.binding.superclass;
 				loop: while (superclassBinding != null) {
-					if (superclassBinding == javaxRmiCorbaStub) {
+					if (TypeBinding.equalsEquals(superclassBinding, javaxRmiCorbaStub)) {
 						needSerialVersion = false;
 						break loop;
 					}
@@ -1535,6 +1543,9 @@
 	}
 }
 
+public boolean isPackageInfo() {
+	return CharOperation.equals(this.name,  TypeConstants.PACKAGE_INFO_NAME);
+}
 /**
  * Returns whether the type is a secondary one or not.
  */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeParameter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeParameter.java
index c667788..e65e028 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeParameter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeParameter.java
@@ -1,16 +1,17 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contributions for
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 415543 - [1.8][compiler] Incorrect bound index in RuntimeInvisibleTypeAnnotations attribute
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -20,12 +21,14 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationCollector;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.AnnotationTargetTypeConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.CodeStream;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ClassScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
 
+@SuppressWarnings("rawtypes")
 public class TypeParameter extends AbstractVariableDeclaration {
 
     public TypeVariableBinding binding;
@@ -64,9 +67,15 @@
 			case AnnotationTargetTypeConstants.METHOD_TYPE_PARAMETER :
 				collector.targetType = AnnotationTargetTypeConstants.METHOD_TYPE_PARAMETER_BOUND;
 		}
-		if (this.type != null && ((this.type.bits & ASTNode.HasTypeAnnotations) != 0)) {
-			collector.info2 = 0;
-			this.type.traverse(collector, (BlockScope) null);
+		int boundIndex = 0;
+		if (this.type != null) {
+			// boundIndex 0 is always a class
+			if (this.type.resolvedType.isInterface())
+				boundIndex = 1;
+			if ((this.type.bits & ASTNode.HasTypeAnnotations) != 0) {
+				collector.info2 = boundIndex;
+				this.type.traverse(collector, (BlockScope) null);
+			}
 		}
 		if (this.bounds != null) {
 			int boundsLength = this.bounds.length;
@@ -75,7 +84,7 @@
 				if ((bound.bits & ASTNode.HasTypeAnnotations) == 0) {
 					continue;
 				}
-				collector.info2 = i + 1;
+				collector.info2 = ++boundIndex;
 				bound.traverse(collector, (BlockScope) null);
 			}
 		}
@@ -107,7 +116,13 @@
 	public void resolveAnnotations(Scope scope) {
 		BlockScope resolutionScope = Scope.typeAnnotationsResolutionScope(scope);
 		if (resolutionScope != null) {
-			resolveAnnotations(resolutionScope, this.annotations, new Annotation.TypeUseBinding(Binding.TYPE_PARAMETER));
+			AnnotationBinding [] annotationBindings = resolveAnnotations(resolutionScope, this.annotations, this.binding, false);
+			if (annotationBindings != null && annotationBindings.length > 0) {
+				this.binding.setTypeAnnotations(annotationBindings, scope.environment().globalOptions.isAnnotationBasedNullAnalysisEnabled);
+				scope.referenceCompilationUnit().compilationResult.hasAnnotations = true;
+				if (this.binding != null && this.binding.isValidBinding())
+					this.binding.evaluateNullAnnotations(scope, this);
+			}
 		}	
 	}
 	/* (non-Javadoc)
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference.java
index 3f69757..a5caf20 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/TypeReference.java
@@ -1,21 +1,24 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *								bug 392862 - [1.8][compiler][null] Evaluate null annotations on array types
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 415850 - [1.8] Ensure RunJDTCoreTests can cope with null annotations enabled
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 427163 - [1.8][null] bogus error "Contradictory null specification" on varags
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409236 - [1.8][compiler] Type annotations on intersection cast types dropped by code generator
+ *                          Bug 415399 - [1.8][compiler] Type annotations on constructor results dropped by the code generator
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -23,15 +26,14 @@
 import java.util.List;
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.AnnotationContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.AnnotationTargetTypeConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowInfo;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
-import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ClassScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
@@ -42,17 +44,17 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
-
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class TypeReference extends Expression {
 	public static final TypeReference[] NO_TYPE_ARGUMENTS = new TypeReference[0];
 static class AnnotationCollector extends ASTVisitor {
 	List annotationContexts;
-	TypeReference typeReference;
+	Expression typeReference;
 	int targetType;
-	Annotation[] primaryAnnotations;
-	int info = -1;
-	int info2 = -1;
+	int info = 0;
+	int info2 = 0;
 	LocalVariableBinding localVariable;
 	Annotation[][] annotationsOnDimensions;
 	int dimensions;
@@ -66,7 +68,6 @@
 		this.annotationContexts = annotationContexts;
 		this.typeReference = typeParameter.type;
 		this.targetType = targetType;
-		this.primaryAnnotations = typeParameter.annotations;
 		this.info = typeParameterIndex;
 	}
 
@@ -78,7 +79,6 @@
 		this.annotationContexts = annotationContexts;
 		this.typeReference = localDeclaration.type;
 		this.targetType = targetType;
-		this.primaryAnnotations = localDeclaration.annotations;
 		this.localVariable = localVariable;
 	}
 
@@ -90,30 +90,10 @@
 		this.annotationContexts = annotationContexts;
 		this.typeReference = localDeclaration.type;
 		this.targetType = targetType;
-		this.primaryAnnotations = localDeclaration.annotations;
 		this.info = parameterIndex;
 	}
 
 	public AnnotationCollector(
-			MethodDeclaration methodDeclaration,
-			int targetType,
-			List annotationContexts) {
-		this.annotationContexts = annotationContexts;
-		this.typeReference = methodDeclaration.returnType;
-		this.targetType = targetType;
-		this.primaryAnnotations = methodDeclaration.annotations;
-	}
-
-	public AnnotationCollector(
-			FieldDeclaration fieldDeclaration,
-			int targetType,
-			List annotationContexts) {
-		this.annotationContexts = annotationContexts;
-		this.typeReference = fieldDeclaration.type;
-		this.targetType = targetType;
-		this.primaryAnnotations = fieldDeclaration.annotations;
-	}
-	public AnnotationCollector(
 			TypeReference typeReference,
 			int targetType,
 			List annotationContexts) {
@@ -122,7 +102,7 @@
 		this.targetType = targetType;
 	}
 	public AnnotationCollector(
-			TypeReference typeReference,
+			Expression typeReference,
 			int targetType,
 			int info,
 			List annotationContexts) {
@@ -166,9 +146,9 @@
 	private boolean internalVisit(Annotation annotation) {
 		AnnotationContext annotationContext = null;
 		if (annotation.isRuntimeTypeInvisible()) {
-			annotationContext = new AnnotationContext(annotation, this.typeReference, this.targetType, this.primaryAnnotations, AnnotationContext.INVISIBLE, this.annotationsOnDimensions, this.dimensions);
+			annotationContext = new AnnotationContext(annotation, this.typeReference, this.targetType, AnnotationContext.INVISIBLE);
 		} else if (annotation.isRuntimeTypeVisible()) {
-			annotationContext = new AnnotationContext(annotation, this.typeReference, this.targetType, this.primaryAnnotations, AnnotationContext.VISIBLE, this.annotationsOnDimensions, this.dimensions);
+			annotationContext = new AnnotationContext(annotation, this.typeReference, this.targetType, AnnotationContext.VISIBLE);
 		}
 		if (annotationContext != null) {
 			annotationContext.wildcard = this.currentWildcard;
@@ -183,12 +163,6 @@
 				case AnnotationTargetTypeConstants.NEW :
 				case AnnotationTargetTypeConstants.CONSTRUCTOR_REFERENCE :
 				case AnnotationTargetTypeConstants.METHOD_REFERENCE :
-				case AnnotationTargetTypeConstants.CAST:
-					annotationContext.info = this.info;
-					break;
-				case AnnotationTargetTypeConstants.CLASS_TYPE_PARAMETER_BOUND :
-				case AnnotationTargetTypeConstants.METHOD_TYPE_PARAMETER_BOUND :
-					annotationContext.info2 = this.info2;
 					annotationContext.info = this.info;
 					break;
 				case AnnotationTargetTypeConstants.LOCAL_VARIABLE :
@@ -199,6 +173,9 @@
 				case AnnotationTargetTypeConstants.METHOD_INVOCATION_TYPE_ARGUMENT :
 				case AnnotationTargetTypeConstants.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT :
 				case AnnotationTargetTypeConstants.METHOD_REFERENCE_TYPE_ARGUMENT :
+				case AnnotationTargetTypeConstants.CLASS_TYPE_PARAMETER_BOUND :
+				case AnnotationTargetTypeConstants.METHOD_TYPE_PARAMETER_BOUND :
+				case AnnotationTargetTypeConstants.CAST:
 					annotationContext.info2 = this.info2;
 					annotationContext.info = this.info;
 					break;
@@ -314,6 +291,10 @@
 	}
 }
 
+public static final TypeReference baseTypeReference(int baseType, int dim) {
+	return baseTypeReference(baseType, dim, null);
+}
+
 // JSR308 type annotations...
 public Annotation[][] annotations = null;
 
@@ -327,11 +308,52 @@
 public void checkBounds(Scope scope) {
 	// only parameterized type references have bounds
 }
-public abstract TypeReference copyDims(int dim);
-public abstract TypeReference copyDims(int dim, Annotation[][] annotationsOnDimensions);
+public abstract TypeReference augmentTypeWithAdditionalDimensions(int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs);
+
+protected Annotation[][] getMergedAnnotationsOnDimensions(int additionalDimensions, Annotation[][] additionalAnnotations) {
+	/* Note, we actually concatenate the additional annotations after base annotations, in bindings, they should appear before base annotations.
+	   Given @English int @Nullable [] x @NonNull []; the type x is a @NonNull arrays of of @Nullable arrays of @English Strings, not the other
+	   way about. Changing this in the compiler AST representation will cause too many ripples, so we leave it as is. On the bindings, the type
+	   will reflect rotated (i.e will reflect correctly). See AnnotatableTypeSystem.flattenedAnnotations
+	*/
+	Annotation[][] annotationsOnDimensions = this.getAnnotationsOnDimensions(true);
+	int dimensions = this.dimensions();
+	
+	if (annotationsOnDimensions == null && additionalAnnotations == null)
+		return null;
+
+	final int totalDimensions = dimensions + additionalDimensions;
+	Annotation [][] mergedAnnotations = new Annotation[totalDimensions][];
+	if (annotationsOnDimensions != null) {
+		for (int i = 0; i < dimensions; i++) {
+			mergedAnnotations[i] = annotationsOnDimensions[i];
+		} 
+	}
+	if (additionalAnnotations != null) {
+		for (int i = dimensions, j = 0; i < totalDimensions; i++, j++) {
+			mergedAnnotations[i] = additionalAnnotations[j];
+		}
+	}
+	return mergedAnnotations;
+}
+
 public int dimensions() {
 	return 0;
 }
+
+
+/**
+ * This method is used to return the array dimension declared after the
+ * name of a local or a field declaration.
+ * For example:
+ *    int i, j[] = null, k[][] = {{}};
+ *    It should return 0 for i, 1 for j and 2 for k.
+ * @return int the extra dimension found
+ */
+public int extraDimensions() {
+	return 0;
+}
+
 public AnnotationContext[] getAllAnnotationContexts(int targetType) {
 	List allAnnotationContexts = new ArrayList();
 	AnnotationCollector collector = new AnnotationCollector(this, targetType, allAnnotationContexts);
@@ -348,6 +370,14 @@
 	AnnotationCollector collector = new AnnotationCollector(this, targetType, info, allAnnotationContexts);
 	this.traverse(collector, (BlockScope) null);
 }
+public void getAllAnnotationContexts(int targetType, int info, List allAnnotationContexts, Annotation [] se7Annotations) {
+	AnnotationCollector collector = new AnnotationCollector(this, targetType, info, allAnnotationContexts);
+	for (int i = 0, length = se7Annotations == null ? 0 : se7Annotations.length; i < length; i++) {
+		Annotation annotation = se7Annotations[i];
+		annotation.traverse(collector, (BlockScope) null);
+	}
+	this.traverse(collector, (BlockScope) null);
+}
 /**
  * info can be either a type index (superclass/superinterfaces) or a pc into the bytecode
  */
@@ -374,6 +404,22 @@
 	this.traverse(collector, (BlockScope) null);
 }
 public Annotation[][] getAnnotationsOnDimensions() {
+	return getAnnotationsOnDimensions(false);
+}
+
+public TypeReference [][] getTypeArguments() {
+	return null;
+}
+/**
+ * @param useSourceOrder if true annotations on dimensions are returned in source order, otherwise they are returned per
+ * how they ought to be interpreted by a type system, or external persistence view. For example, given the following:
+ * int @Nullable [] f @NonNull [] ==> f is really a @NonNull array of @Nullable arrays of ints. This is the type system
+ * view since extended dimensions bind more readily than type components that precede the identifier. This is how it ought
+ * to be encoded in bindings and how it ought to be persisted in class files. However for DOM/AST construction, we need the
+ * dimensions in source order, so we provide a way for the clients to ask what they want. 
+ * 
+ */
+public Annotation[][] getAnnotationsOnDimensions(boolean useSourceOrder) {
 	return null;
 }
 
@@ -470,6 +516,12 @@
 public boolean isWildcard() {
 	return false;
 }
+public boolean isUnionType() {
+	return false;
+}
+public boolean isVarargs() {
+	return (this.bits & ASTNode.IsVarArgs) != 0;
+}
 public boolean isParameterizedTypeReference() {
 	return false;
 }
@@ -544,91 +596,75 @@
 	if (this.annotations != null || annotationsOnDimensions != null) {
 		BlockScope resolutionScope = Scope.typeAnnotationsResolutionScope(scope);
 		if (resolutionScope != null) {
-			long[] tagBitsPerDimension = null;
 			int dimensions = this.dimensions();
-			boolean shouldAnalyzeArrayNullAnnotations = scope.compilerOptions().isAnnotationBasedNullAnalysisEnabled && this instanceof ArrayTypeReference;
 			if (this.annotations != null) {
-				int annotationsLevels = this.annotations.length;
-				for (int i = 0; i < annotationsLevels; i++) {
-					Annotation[] currentAnnotations = this.annotations[i];
-					if (currentAnnotations != null) {
-						resolveAnnotations(resolutionScope, currentAnnotations, new Annotation.TypeUseBinding(isWildcard() ? Binding.TYPE_PARAMETER : Binding.TYPE_USE));
-						if (shouldAnalyzeArrayNullAnnotations) {
-							int len = currentAnnotations.length;
-							for (int j=0; j<len; j++) {
-								Binding recipient = currentAnnotations[j].recipient;
-								if (recipient instanceof Annotation.TypeUseBinding) {
-									if (tagBitsPerDimension == null)
-										tagBitsPerDimension = new long[dimensions+1]; // each dimension plus leaf component type at last position
-									// @NonNull Foo [][][] means the leaf component type is @NonNull:
-									tagBitsPerDimension[dimensions] = ((Annotation.TypeUseBinding)recipient).tagBits & TagBits.AnnotationNullMASK;
-								}
-							}
-						}
-					}
-				}
+				TypeBinding leafComponentType = this.resolvedType.leafComponentType();
+				leafComponentType = resolveAnnotations(resolutionScope, this.annotations, leafComponentType);
+				this.resolvedType = dimensions > 0 ? scope.environment().createArrayType(leafComponentType, dimensions) : leafComponentType;
+				// contradictory null annotations on the type are already detected in Annotation.resolveType() (SE7 treatment)
 			}
-
 			if (annotationsOnDimensions != null) {
-				for (int i = 0, length = annotationsOnDimensions.length; i < length; i++) {
-					Annotation [] dimensionAnnotations = annotationsOnDimensions[i];
-					if (dimensionAnnotations  != null) {
-						resolveAnnotations(resolutionScope, dimensionAnnotations, new Annotation.TypeUseBinding(Binding.TYPE_USE));
-						if (shouldAnalyzeArrayNullAnnotations) {
-							int len = dimensionAnnotations.length;
-							for (int j=0; j<len; j++) {
-								Binding recipient = dimensionAnnotations[j].recipient;
-								if (recipient instanceof Annotation.TypeUseBinding) {
-									if (tagBitsPerDimension == null)
-										tagBitsPerDimension = new long[dimensions+1];
-									tagBitsPerDimension[i] = ((Annotation.TypeUseBinding)recipient).tagBits & TagBits.AnnotationNullMASK;
-								}
+				this.resolvedType = resolveAnnotations(resolutionScope, annotationsOnDimensions, this.resolvedType);
+				if (this.resolvedType instanceof ArrayBinding) {
+					long[] nullTagBitsPerDimension = ((ArrayBinding)this.resolvedType).nullTagBitsPerDimension;
+					if (nullTagBitsPerDimension != null) {
+						for (int i = 0; i < dimensions; i++) { // skip last annotations at [dimensions] (concerns the leaf type)
+							if ((nullTagBitsPerDimension[i] & TagBits.AnnotationNullMASK) == TagBits.AnnotationNullMASK) {
+								scope.problemReporter().contradictoryNullAnnotations(annotationsOnDimensions[i]);
+								nullTagBitsPerDimension[i] = 0;
 							}
 						}
 					}
 				}
 			}
-			if (tagBitsPerDimension != null && this.resolvedType.isValidBinding()) {
-				// TODO(stephan): wouldn't it be more efficient to store the array bindings inside the type binding rather than the environment?
-				// cf. LocalTypeBinding.createArrayType()
-				this.resolvedType = scope.environment().createArrayType(this.resolvedType.leafComponentType(), dimensions, tagBitsPerDimension);
-			}
 		}
 	}
 }
 public int getAnnotatableLevels() {
 	return 1;
 }
-// If typeArgumentAnnotations contain any that are evaluated by the compiler
-// create/retrieve a parameterized type binding
-// capturing the effect of these annotations into the resolved type binding.
-protected TypeBinding captureTypeAnnotations(Scope scope, ReferenceBinding enclosingType, TypeBinding argType, Annotation[] typeArgumentAnnotations) {
-	if (!scope.compilerOptions().isAnnotationBasedNullAnalysisEnabled
-			|| typeArgumentAnnotations == null 
-			|| !(argType instanceof ReferenceBinding))
+/** Check all typeArguments against null constraints on their corresponding type variables. */
+protected void checkNullConstraints(Scope scope, TypeReference[] typeArguments) {
+	CompilerOptions compilerOptions = scope.compilerOptions();
+	if (compilerOptions.isAnnotationBasedNullAnalysisEnabled
+			&& compilerOptions.sourceLevel >= ClassFileConstants.JDK1_8
+			&& typeArguments != null)
 	{
-		return argType;
+		TypeVariableBinding[] typeVariables = this.resolvedType.original().typeVariables();
+		for (int i = 0; i < typeArguments.length; i++) {
+			TypeReference arg = typeArguments[i];
+			if (arg.resolvedType != null && arg.resolvedType.hasNullTypeAnnotations())
+				arg.checkNullConstraints(scope, typeVariables, i);
+		}
 	}
-    int annotLen = typeArgumentAnnotations.length;
-    long annotationBits = 0L;
-    for (int i = 0; i < annotLen; i++) {
-		if (typeArgumentAnnotations[i] instanceof MarkerAnnotation) {
-			AnnotationBinding compilerAnnotation = ((MarkerAnnotation)typeArgumentAnnotations[i]).getCompilerAnnotation();
-			if (compilerAnnotation != null) {
-				switch (compilerAnnotation.getAnnotationType().id) {
-					case TypeIds.T_ConfiguredAnnotationNonNull :
-						annotationBits |= TagBits.AnnotationNonNull;
-						break;
-					case TypeIds.T_ConfiguredAnnotationNullable :
-						annotationBits |= TagBits.AnnotationNullable;
-						break;
-					default: // no other annotations are currently handled
-				}
+}
+/** Check whether this type reference conforms to all null constraints defined for any of the given type variables. */
+protected void checkNullConstraints(Scope scope, TypeBinding[] variables, int rank) {
+	if (variables != null && variables.length > rank) {
+		if (variables[rank].hasNullTypeAnnotations()) {
+			if (NullAnnotationMatching.validNullTagBits(this.resolvedType.tagBits) != NullAnnotationMatching.validNullTagBits(variables[rank].tagBits)) {
+				scope.problemReporter().nullityMismatchTypeArgument(variables[rank], this.resolvedType, this);
+			}
+    	}
+	}
+}
+/** Retrieve the null annotation that has been translated to the given nullTagBits. */
+public Annotation findAnnotation(long nullTagBits) {
+	if (this.annotations != null) {
+		Annotation[] innerAnnotations = this.annotations[this.annotations.length-1];
+		if (innerAnnotations != null) {
+			int annId = nullTagBits == TagBits.AnnotationNonNull ? TypeIds.T_ConfiguredAnnotationNonNull : TypeIds.T_ConfiguredAnnotationNullable;
+			for (int i = 0; i < innerAnnotations.length; i++) {
+				if (innerAnnotations[i] != null 
+						&& innerAnnotations[i].resolvedType != null 
+						&& innerAnnotations[i].resolvedType.id == annId)
+					return innerAnnotations[i];
 			}
 		}
 	}
-    if (annotationBits == 0L)
-    	return argType;
-	return scope.environment().createParameterizedType((ReferenceBinding) argType, null, annotationBits, enclosingType);
+	return null;
+}
+public TypeReference[] getTypeReferences() {
+	return new TypeReference [] { this };
 }
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnionTypeReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnionTypeReference.java
index c69f0b1..199e1ff 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnionTypeReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/UnionTypeReference.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -34,13 +30,6 @@
 	}
 
 	/* (non-Javadoc)
-	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference#copyDims(int)
-	 */
-	public TypeReference copyDims(int dim) {
-		return this; // arrays are not legal as union types.
-	}
-
-	/* (non-Javadoc)
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference#getLastToken()
 	 */
 	public char[] getLastToken() {
@@ -159,8 +148,10 @@
 		}
 		return output;
 	}
-
-	public TypeReference copyDims(int dim, Annotation[][] annotationsOnDimensions) {
+	public boolean isUnionType() {
+		return true;
+	}
+	public TypeReference augmentTypeWithAdditionalDimensions(int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs) {
 		return this; // arrays are not legal as union types.
 	}
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Wildcard.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Wildcard.java
index 30ba2db..f084504 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Wildcard.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/ast/Wildcard.java
@@ -1,16 +1,17 @@
 /*******************************************************************************
- * 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 415397 - [1.8][compiler] Type Annotations on wildcard type argument dropped
+ *        Stephan Herrmann - Contribution for
+ *							Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *							Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.ast;
 
@@ -59,7 +60,6 @@
 
 	private TypeBinding internalResolveType(Scope scope, ReferenceBinding genericType, int rank) {
 		TypeBinding boundType = null;
-		resolveAnnotations(scope);
 		if (this.bound != null) {
 			boundType = scope.kind == Scope.CLASS_SCOPE
 					? this.bound.resolveType((ClassScope)scope)
@@ -69,8 +69,15 @@
 				return null;
 			}
 		}
-		WildcardBinding wildcard = scope.environment().createWildcard(genericType, rank, boundType, null /*no extra bound*/, this.kind);
-		return this.resolvedType = wildcard;
+		this.resolvedType = scope.environment().createWildcard(genericType, rank, boundType, null /*no extra bound*/, this.kind);
+		resolveAnnotations(scope);
+		if (boundType != null && boundType.hasNullTypeAnnotations() && this.resolvedType.hasNullTypeAnnotations()) {
+			if (((boundType.tagBits | this.resolvedType.tagBits) & TagBits.AnnotationNullMASK) == TagBits.AnnotationNullMASK) { // are both set?
+				Annotation annotation = this.bound.findAnnotation(boundType.tagBits & TagBits.AnnotationNullMASK);
+				scope.problemReporter().contradictoryNullAnnotationsOnBounds(annotation, this.resolvedType.tagBits);
+			}
+		}
+		return this.resolvedType;
 	}
 
 	public StringBuffer printExpression(int indent, StringBuffer output){
@@ -120,6 +127,12 @@
 
 	public void traverse(ASTVisitor visitor, BlockScope scope) {
 		if (visitor.visit(this, scope)) {
+			if (this.annotations != null) {
+				Annotation [] typeAnnotations = this.annotations[0];
+				for (int i = 0, length = typeAnnotations == null ? 0 : typeAnnotations.length; i < length; i++) {
+					typeAnnotations[i].traverse(visitor, scope);
+				}
+			}
 			if (this.bound != null) {
 				this.bound.traverse(visitor, scope);
 			}
@@ -129,6 +142,12 @@
 
 	public void traverse(ASTVisitor visitor, ClassScope scope) {
 		if (visitor.visit(this, scope)) {
+			if (this.annotations != null) {
+				Annotation [] typeAnnotations = this.annotations[0];
+				for (int i = 0, length = typeAnnotations == null ? 0 : typeAnnotations.length; i < length; i++) {
+					typeAnnotations[i].traverse(visitor, scope);
+				}
+			}
 			if (this.bound != null) {
 				this.bound.traverse(visitor, scope);
 			}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java
index 3e6c6e4..e03023a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.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
@@ -24,6 +24,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.ScannerHelper;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ClasspathDirectory extends ClasspathLocation {
 
 private Hashtable directoryCache;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java
index 4a6ac52..ab2e26a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.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
@@ -33,6 +33,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.ManifestAnalyzer;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ClasspathJar extends ClasspathLocation {
 
 	// AspectJ Extension
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileFinder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileFinder.java
index 4896851..c42e17e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileFinder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileFinder.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
@@ -13,6 +13,7 @@
 import java.io.File;
 import java.util.ArrayList;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class FileFinder {
 
 public static String[] find(File f, String pattern) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem.java
index c58af1c..6e8c78b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/FileSystem.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.aspectj.org.eclipse.jdt.internal.compiler.util.SuffixConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class FileSystem implements INameEnvironment, SuffixConstants {
 	public interface Classpath {
 		char[][][] findTypeNames(String qualifiedPackageName);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main.java
index d1d312f..e23a578 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/Main.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Tom Tromey - Contribution for bug 125961
@@ -23,6 +19,9 @@
  *								bug 375366 - ECJ ignores unusedParameterIncludeDocCommentReference unless enableJavadoc option is set
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
  *								bug 381443 - [compiler][null] Allow parameter widening from @NonNull to unannotated
+ *     Jesper S Moller   - Contributions for
+ *								bug 407297 - [1.8][compiler] Control generation of parameter names by option
+ *    Mat Booth - Contribution for bug 405176 
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.batch;
 
@@ -92,7 +91,9 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SuffixConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class Main implements ProblemSeverities, SuffixConstants {
+
 	public static class Logger {
 		private PrintWriter err;
 		private PrintWriter log;
@@ -918,7 +919,7 @@
 						}));
 				}
 			}
-			if ((this.tagBits & Logger.EMACS) != 0) {
+			if ((this.tagBits & Logger.XML) == 0) {
 				this.printlnErr();
 			}
 		}
@@ -1630,7 +1631,7 @@
 		// the id we were looking for.  In most cases this is semi-informative so is not too bad.
 		return "Missing message: " + id + " in: " + Main.bundleName; //$NON-NLS-2$ //$NON-NLS-1$
 	}
-	return MessageFormat.format(message, arguments);
+	return MessageFormat.format(message, (Object[]) arguments);
 }
 /**
  * Return true if and only if the running VM supports the given minimal version.
@@ -2218,6 +2219,13 @@
 							CompilerOptions.ENABLED);
 					continue;
 				}
+				if (currentArg.equals("-parameters")) { //$NON-NLS-1$
+					mode = DEFAULT;
+					this.options.put(
+							CompilerOptions.OPTION_MethodParametersAttribute,
+							CompilerOptions.GENERATE);
+					continue;
+				}
 				if (currentArg.startsWith("-g")) { //$NON-NLS-1$
 					mode = DEFAULT;
 					String debugOption = currentArg;
@@ -4616,7 +4624,7 @@
 	 * entries are searched for both sources and binaries except
 	 * the sourcepath entries which are searched for sources only.
 	 */
-	bootclasspaths.addAll(endorsedDirClasspaths);
+	bootclasspaths.addAll(0, endorsedDirClasspaths);
 	bootclasspaths.addAll(extdirsClasspaths);
 	bootclasspaths.addAll(sourcepathClasspaths);
 	bootclasspaths.addAll(classpaths);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/messages.properties b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/messages.properties
index 79d8870..61a6306 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/messages.properties
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/batch/messages.properties
@@ -16,14 +16,15 @@
 #								bug 374605 - Unreasonable warning for enum-based switch statements
 #								bug 388281 - [compiler][null] inheritance of null annotations as an option
 #		Alan Moraes <alan@kelon.org> - Contribution for bug 383644
+#		Jesper S Moller - Contribution for bug 407297 - [1.8][compiler] Control generation of parameter names by option
 ###############################################################################
 ### JavaBatchCompiler messages.
 
 ### compiler
 #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 = BETA_JAVA8_3d6e745, 3.9.0
+#Format: compiler.version = (The place holders will be automatically filled. Do not remove or alter it)
+compiler.version = BETA_JAVA8_LUNA_8661797, 3.9.2
 compiler.copyright = Copyright IBM Corp 2000, 2013. All rights reserved.
 
 ### progress
@@ -257,6 +258,7 @@
 \    -repeat <n>        repeat compilation process <n> times for perf analysis\n\
 \    -inlineJSR         inline JSR bytecode (implicit if target >= 1.5)\n\
 \    -enableJavadoc     consider references in javadoc\n\
+\    -parameters        generate method parameters attribute (for target >= 1.8)\n\
 \    -Xemacs            used to enable emacs-style output in the console.\n\
 \                       It does not affect the xml log output\n\
 \    -missingNullDefault  report missing default nullness annotation\n\
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileConstants.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileConstants.java
index e632a1f..4364ef3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileConstants.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileConstants.java
@@ -1,18 +1,17 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Contributions for
  *							Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335             
+ *							Bug 406982 - [1.8][compiler] Generation of MethodParameters Attribute in classfile
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.classfmt;
 
@@ -43,6 +42,13 @@
 	int AccEnum         = 0x4000;
 
 	/**
+	 * From classfile version 52 (compliance 1.8 up), meaning that a formal parameter is mandated
+	 * by a language specification, so all compilers for the language must emit it.
+	 */
+	int AccMandated     = 0x8000;
+
+	
+	/**
 	 * Other VM flags.
 	 */
 	int AccSuper = 0x0020;
@@ -146,4 +152,10 @@
 	int ATTR_STACK_MAP_TABLE = 0x8; // Stack map table attribute
 	int ATTR_STACK_MAP = 0x10; // Stack map attribute: cldc
 	int ATTR_TYPE_ANNOTATION = 0x20; // type annotation attribute (jsr 308)
+	int ATTR_METHOD_PARAMETERS = 0x40; // method parameters attribute (jep 118)
+
+	// See java.lang.invoke.LambdaMetafactory constants - option bitflags when calling altMetaFactory()
+	int FLAG_SERIALIZABLE = 0x01;
+	int FLAG_MARKERS = 0x02;
+	int FLAG_BRIDGES = 0x04;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.java
index a3ec902..af9f837 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.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
@@ -8,6 +8,8 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for bug 365992 - [builder] [null] Change of nullness for a parameter doesn't trigger a build for the files that call the method
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *         bug 407191 - [1.8] Binary access support for type annotations
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.classfmt;
 
@@ -32,6 +34,7 @@
 	private int classNameIndex;
 	private int constantPoolCount;
 	private AnnotationInfo[] annotations;
+	private TypeAnnotationInfo[] typeAnnotations;
 	private FieldInfo[] fields;
 	private int fieldsCount;
 
@@ -356,6 +359,10 @@
 						decodeAnnotations(readOffset, true);
 					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeInvisibleAnnotationsName)) {
 						decodeAnnotations(readOffset, false);
+					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeVisibleTypeAnnotationsName)) {
+						decodeTypeAnnotations(readOffset, true);
+					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeInvisibleTypeAnnotationsName)) {
+						decodeTypeAnnotations(readOffset, false);
 					}
 					break;
 				case 'M' :
@@ -434,6 +441,30 @@
 	}
 }
 
+private void decodeTypeAnnotations(int offset, boolean runtimeVisible) {
+	int numberOfAnnotations = u2At(offset + 6);
+	if (numberOfAnnotations > 0) {
+		int readOffset = offset + 8;
+		TypeAnnotationInfo[] newInfos = null;
+		newInfos = new TypeAnnotationInfo[numberOfAnnotations];
+		for (int i = 0; i < numberOfAnnotations; i++) {
+			// With the last parameter being 'false', the data structure will not be flushed out
+			TypeAnnotationInfo newInfo = new TypeAnnotationInfo(this.reference, this.constantPoolOffsets, readOffset, runtimeVisible, false);
+			readOffset += newInfo.readOffset;
+			newInfos[i] = newInfo;
+		}
+		if (this.typeAnnotations == null) {
+			this.typeAnnotations = newInfos;
+		} else {
+			int length = this.typeAnnotations.length;
+			TypeAnnotationInfo[] temp = new TypeAnnotationInfo[length + numberOfAnnotations];
+			System.arraycopy(this.typeAnnotations, 0, temp, 0, length);
+			System.arraycopy(newInfos, 0, temp, length, numberOfAnnotations);
+			this.typeAnnotations = temp;
+		}
+	}
+}
+
 /**
  * @return the annotations or null if there is none.
  */
@@ -442,6 +473,13 @@
 }
 
 /**
+ * @return the type annotations or null if there is none.
+ */
+public IBinaryTypeAnnotation[] getTypeAnnotations() {
+	return this.typeAnnotations;
+}
+
+/**
  * Answer the char array that corresponds to the class name of the constant class.
  * constantPoolIndex is the index in the constant pool that is a constant class entry.
  *
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfo.java
index df73888..8beac2e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfo.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
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *          Bug 407191 - [1.8] Binary access support for type annotations 
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.classfmt;
 
@@ -14,10 +16,12 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.AttributeNamesConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryField;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings("rawtypes")
 public class FieldInfo extends ClassFileStruct implements IBinaryField, Comparable {
 	protected int accessFlags;
 	protected int attributeBytes;
@@ -31,10 +35,65 @@
 
 public static FieldInfo createField(byte classFileBytes[], int offsets[], int offset) {
 	FieldInfo fieldInfo = new FieldInfo(classFileBytes, offsets, offset);
-	AnnotationInfo[] annotations = fieldInfo.readAttributes();
-	if (annotations == null)
-		return fieldInfo;
-	return new FieldInfoWithAnnotation(fieldInfo, annotations);
+	
+	int attributesCount = fieldInfo.u2At(6);
+	int readOffset = 8;
+	AnnotationInfo[] annotations = null;
+	TypeAnnotationInfo[] typeAnnotations = null;
+	for (int i = 0; i < attributesCount; i++) {
+		// check the name of each attribute
+		int utf8Offset = fieldInfo.constantPoolOffsets[fieldInfo.u2At(readOffset)] - fieldInfo.structOffset;
+		char[] attributeName = fieldInfo.utf8At(utf8Offset + 3, fieldInfo.u2At(utf8Offset + 1));
+		if (attributeName.length > 0) {
+			switch(attributeName[0]) {
+				case 'S' :
+					if (CharOperation.equals(AttributeNamesConstants.SignatureName, attributeName))
+						fieldInfo.signatureUtf8Offset = fieldInfo.constantPoolOffsets[fieldInfo.u2At(readOffset + 6)] - fieldInfo.structOffset;
+					break;
+				case 'R' :
+					AnnotationInfo[] decodedAnnotations = null;
+					TypeAnnotationInfo[] decodedTypeAnnotations = null;
+					if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeVisibleAnnotationsName)) {
+						decodedAnnotations = fieldInfo.decodeAnnotations(readOffset, true);
+					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeInvisibleAnnotationsName)) {
+						decodedAnnotations = fieldInfo.decodeAnnotations(readOffset, false);
+					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeVisibleTypeAnnotationsName)) {
+						decodedTypeAnnotations = fieldInfo.decodeTypeAnnotations(readOffset, true);
+					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeInvisibleTypeAnnotationsName)) {
+						decodedTypeAnnotations = fieldInfo.decodeTypeAnnotations(readOffset, false);
+					}
+					if (decodedAnnotations != null) {
+						if (annotations == null) {
+							annotations = decodedAnnotations;
+						} else {
+							int length = annotations.length;
+							AnnotationInfo[] combined = new AnnotationInfo[length + decodedAnnotations.length];
+							System.arraycopy(annotations, 0, combined, 0, length);
+							System.arraycopy(decodedAnnotations, 0, combined, length, decodedAnnotations.length);
+							annotations = combined;
+						}
+					} else if (decodedTypeAnnotations != null) {
+						if (typeAnnotations == null) {
+							typeAnnotations = decodedTypeAnnotations;
+						} else {
+							int length = typeAnnotations.length;
+							TypeAnnotationInfo[] combined = new TypeAnnotationInfo[length + decodedTypeAnnotations.length];
+							System.arraycopy(typeAnnotations, 0, combined, 0, length);
+							System.arraycopy(decodedTypeAnnotations, 0, combined, length, decodedTypeAnnotations.length);
+							typeAnnotations = combined;
+						}
+					}
+			}
+		}
+		readOffset += (6 + fieldInfo.u4At(readOffset + 2));
+	}
+	fieldInfo.attributeBytes = readOffset;
+	
+	if (typeAnnotations != null)
+		return new FieldInfoWithTypeAnnotation(fieldInfo, annotations, typeAnnotations);
+	if (annotations != null)
+		return new FieldInfoWithAnnotation(fieldInfo, annotations);
+	return fieldInfo;
 }
 
 /**
@@ -75,6 +134,22 @@
 	}
 	return null; // nothing to record
 }
+
+TypeAnnotationInfo[] decodeTypeAnnotations(int offset, boolean runtimeVisible) {
+	int numberOfAnnotations = u2At(offset + 6);
+	if (numberOfAnnotations > 0) {
+		int readOffset = offset + 8;
+		TypeAnnotationInfo[] typeAnnos = new TypeAnnotationInfo[numberOfAnnotations];
+		for (int i = 0; i < numberOfAnnotations; i++) {
+			TypeAnnotationInfo newInfo = new TypeAnnotationInfo(this.reference, this.constantPoolOffsets, readOffset + this.structOffset, runtimeVisible, false);
+			readOffset += newInfo.readOffset;
+			typeAnnos[i] = newInfo;
+		}
+		return typeAnnos;
+	}
+	return null;
+}
+
 public int compareTo(Object o) {
 	return new String(getName()).compareTo(new String(((FieldInfo) o).getName()));
 }
@@ -163,6 +238,10 @@
 public IBinaryAnnotation[] getAnnotations() {
 	return null;
 }
+
+public IBinaryTypeAnnotation[] getTypeAnnotations() {
+	return null;
+}
 /**
  * Return a wrapper that contains the constant of the field.
  * @return java.lang.Object
@@ -230,45 +309,6 @@
 public boolean isSynthetic() {
 	return (getModifiers() & ClassFileConstants.AccSynthetic) != 0;
 }
-private AnnotationInfo[] readAttributes() {
-	int attributesCount = u2At(6);
-	int readOffset = 8;
-	AnnotationInfo[] annotations = null;
-	for (int i = 0; i < attributesCount; i++) {
-		// check the name of each attribute
-		int utf8Offset = this.constantPoolOffsets[u2At(readOffset)] - this.structOffset;
-		char[] attributeName = utf8At(utf8Offset + 3, u2At(utf8Offset + 1));
-		if (attributeName.length > 0) {
-			switch(attributeName[0]) {
-				case 'S' :
-					if (CharOperation.equals(AttributeNamesConstants.SignatureName, attributeName))
-						this.signatureUtf8Offset = this.constantPoolOffsets[u2At(readOffset + 6)] - this.structOffset;
-					break;
-				case 'R' :
-					AnnotationInfo[] decodedAnnotations = null;
-					if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeVisibleAnnotationsName)) {
-						decodedAnnotations = decodeAnnotations(readOffset, true);
-					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeInvisibleAnnotationsName)) {
-						decodedAnnotations = decodeAnnotations(readOffset, false);
-					}
-					if (decodedAnnotations != null) {
-						if (annotations == null) {
-							annotations = decodedAnnotations;
-						} else {
-							int length = annotations.length;
-							AnnotationInfo[] combined = new AnnotationInfo[length + decodedAnnotations.length];
-							System.arraycopy(annotations, 0, combined, 0, length);
-							System.arraycopy(decodedAnnotations, 0, combined, length, decodedAnnotations.length);
-							annotations = combined;
-						}
-					}
-			}
-		}
-		readOffset += (6 + u4At(readOffset + 2));
-	}
-	this.attributeBytes = readOffset;
-	return annotations;
-}
 private void readConstantAttribute() {
 	int attributesCount = u2At(6);
 	int readOffset = 8;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithAnnotation.java
index b0bee95..509b79e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithAnnotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithAnnotation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2009 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
@@ -7,10 +7,12 @@
  *
  * Contributors:
  *    tyeung@bea.com - initial API and implementation
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *          Bug 407191 - [1.8] Binary access support for type annotations
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.classfmt;
 
-public final class FieldInfoWithAnnotation extends FieldInfo {
+public class FieldInfoWithAnnotation extends FieldInfo {
 	private AnnotationInfo[] annotations;
 
 FieldInfoWithAnnotation(FieldInfo info, AnnotationInfo[] annos) {
@@ -31,8 +33,9 @@
 	return this.annotations;
 }
 protected void initialize() {
-	for (int i = 0, max = this.annotations.length; i < max; i++)
-		this.annotations[i].initialize();
+	if (this.annotations != null)
+		for (int i = 0, max = this.annotations.length; i < max; i++)
+			this.annotations[i].initialize();
 	super.initialize();
 }
 protected void reset() {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithTypeAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithTypeAnnotation.java
new file mode 100644
index 0000000..9d535fc
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/FieldInfoWithTypeAnnotation.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2013 GoPivotal, Inc. All Rights Reserved.
+ * 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:
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *          Bug 407191 - [1.8] Binary access support for type annotations
+ *******************************************************************************/
+package org.aspectj.org.eclipse.jdt.internal.compiler.classfmt;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation;
+
+public final class FieldInfoWithTypeAnnotation extends FieldInfoWithAnnotation {
+	private TypeAnnotationInfo[] typeAnnotations;
+
+FieldInfoWithTypeAnnotation(FieldInfo info, AnnotationInfo[] annos, TypeAnnotationInfo[] typeAnnos) {
+	super(info, annos);
+	this.typeAnnotations = typeAnnos;
+}
+public IBinaryTypeAnnotation[] getTypeAnnotations() {
+	return this.typeAnnotations;
+}
+protected void initialize() {
+	for (int i = 0, max = this.typeAnnotations.length; i < max; i++)
+		this.typeAnnotations[i].initialize();
+	super.initialize();
+}
+protected void reset() {
+	if (this.typeAnnotations != null)
+		for (int i = 0, max = this.typeAnnotations.length; i < max; i++)
+			this.typeAnnotations[i].reset();
+	super.reset();
+}
+public String toString() {
+	StringBuffer buffer = new StringBuffer(getClass().getName());
+	if (this.typeAnnotations != null) {
+		buffer.append('\n');
+		buffer.append("type annotations:"); //$NON-NLS-1$
+		for (int i = 0; i < this.typeAnnotations.length; i++) {
+			buffer.append(this.typeAnnotations[i]);
+			buffer.append('\n');
+		}
+	}
+	toStringContent(buffer);
+	return buffer.toString();
+}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.java
index 7b13f94..6a5899d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.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
@@ -8,6 +8,9 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for bug 186342 - [compiler][null] Using annotations for null checking
+ *     Jesper Steen Moeller - Contribution for bug 406973 - [compiler] Parse MethodParameters attribute
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *         Bug 407191 - [1.8] Binary access support for type annotations
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.classfmt;
 
@@ -16,11 +19,14 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.ConstantPool;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryMethod;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings("rawtypes")
 public class MethodInfo extends ClassFileStruct implements IBinaryMethod, Comparable {
 	static private final char[][] noException = CharOperation.NO_CHAR_CHAR;
 	static private final char[][] noArgumentNames = CharOperation.NO_CHAR_CHAR;
+	static private final char[] ARG = "arg".toCharArray();  //$NON-NLS-1$
 	protected int accessFlags;
 	protected int attributeBytes;
 	protected char[] descriptor;
@@ -30,7 +36,6 @@
 	protected int signatureUtf8Offset;
 	protected long tagBits;
 	protected char[][] argumentNames;
-	protected int argumentNamesIndex;
 
 public static MethodInfo createMethod(byte classFileBytes[], int offsets[], int offset) {
 	MethodInfo methodInfo = new MethodInfo(classFileBytes, offsets, offset);
@@ -38,12 +43,18 @@
 	int readOffset = 8;
 	AnnotationInfo[] annotations = null;
 	AnnotationInfo[][] parameterAnnotations = null;
+	TypeAnnotationInfo[] typeAnnotations = null;
 	for (int i = 0; i < attributesCount; i++) {
 		// check the name of each attribute
 		int utf8Offset = methodInfo.constantPoolOffsets[methodInfo.u2At(readOffset)] - methodInfo.structOffset;
 		char[] attributeName = methodInfo.utf8At(utf8Offset + 3, methodInfo.u2At(utf8Offset + 1));
 		if (attributeName.length > 0) {
 			switch(attributeName[0]) {
+				case 'M' :
+					if (CharOperation.equals(attributeName, AttributeNamesConstants.MethodParametersName)) {
+						methodInfo.decodeMethodParameters(readOffset, methodInfo);
+					}
+					break;
 				case 'S' :
 					if (CharOperation.equals(AttributeNamesConstants.SignatureName, attributeName))
 						methodInfo.signatureUtf8Offset = methodInfo.constantPoolOffsets[methodInfo.u2At(readOffset + 6)] - methodInfo.structOffset;
@@ -51,6 +62,7 @@
 				case 'R' :
 					AnnotationInfo[] methodAnnotations = null;
 					AnnotationInfo[][] paramAnnotations = null;
+					TypeAnnotationInfo[] methodTypeAnnotations = null;
 					if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeVisibleAnnotationsName)) {
 						methodAnnotations = decodeMethodAnnotations(readOffset, true, methodInfo);
 					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeInvisibleAnnotationsName)) {
@@ -59,6 +71,10 @@
 						paramAnnotations = decodeParamAnnotations(readOffset, true, methodInfo);
 					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeInvisibleParameterAnnotationsName)) {
 						paramAnnotations = decodeParamAnnotations(readOffset, false, methodInfo);
+					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeVisibleTypeAnnotationsName)) {
+						methodTypeAnnotations = decodeTypeAnnotations(readOffset, true, methodInfo);
+					} else if (CharOperation.equals(attributeName, AttributeNamesConstants.RuntimeInvisibleTypeAnnotationsName)) {
+						methodTypeAnnotations = decodeTypeAnnotations(readOffset, false, methodInfo);
 					}
 					if (methodAnnotations != null) {
 						if (annotations == null) {
@@ -90,6 +106,16 @@
 								}
 							}
 						}
+					} else if (methodTypeAnnotations != null) {
+						if (typeAnnotations == null) {
+							typeAnnotations = methodTypeAnnotations;
+						} else {
+							int length = typeAnnotations.length;
+							TypeAnnotationInfo[] newAnnotations = new TypeAnnotationInfo[length + methodTypeAnnotations.length];
+							System.arraycopy(typeAnnotations, 0, newAnnotations, 0, length);
+							System.arraycopy(methodTypeAnnotations, 0, newAnnotations, length, methodTypeAnnotations.length);
+							typeAnnotations = newAnnotations;
+						}
 					}
 					break;
 			}
@@ -98,6 +124,8 @@
 	}
 	methodInfo.attributeBytes = readOffset;
 
+	if (typeAnnotations != null)
+		return new MethodInfoWithTypeAnnotations(methodInfo, annotations, parameterAnnotations, typeAnnotations);
 	if (parameterAnnotations != null)
 		return new MethodInfoWithParameterAnnotations(methodInfo, annotations, parameterAnnotations);
 	if (annotations != null)
@@ -146,6 +174,20 @@
 	}
 	return null;
 }
+static TypeAnnotationInfo[] decodeTypeAnnotations(int offset, boolean runtimeVisible, MethodInfo methodInfo) {
+	int numberOfAnnotations = methodInfo.u2At(offset + 6);
+	if (numberOfAnnotations > 0) {
+		int readOffset = offset + 8;
+		TypeAnnotationInfo[] typeAnnos = new TypeAnnotationInfo[numberOfAnnotations];
+		for (int i = 0; i < numberOfAnnotations; i++) {
+			TypeAnnotationInfo newInfo = new TypeAnnotationInfo(methodInfo.reference, methodInfo.constantPoolOffsets, readOffset + methodInfo.structOffset, runtimeVisible, false);
+			readOffset += newInfo.readOffset;
+			typeAnnos[i] = newInfo;
+		}
+		return typeAnnos;
+	}
+	return null;
+}
 static AnnotationInfo[][] decodeParamAnnotations(int offset, boolean runtimeVisible, MethodInfo methodInfo) {
 	AnnotationInfo[][] allParamAnnotations = null;
 	int numberOfParameters = methodInfo.u1At(offset + 6);
@@ -274,6 +316,9 @@
 public int getAnnotatedParametersCount() {
 	return 0;
 }
+public IBinaryTypeAnnotation[] getTypeAnnotations() {
+	return null;
+}
 /**
  * Answer the name of the method.
  *
@@ -474,7 +519,7 @@
 	if (length != 0) {
 		readOffset += 2;
 		this.argumentNames = new char[length][];
-		this.argumentNamesIndex = 0;
+		int argumentNamesIndex = 0;
 		for (int i = 0; i < length; i++) {
 			int startPC = u2At(readOffset);
 			if (startPC == 0) {
@@ -482,16 +527,35 @@
 				int utf8Offset = this.constantPoolOffsets[nameIndex] - this.structOffset;
 				char[] localVariableName = utf8At(utf8Offset + 3, u2At(utf8Offset + 1));
 				if (!CharOperation.equals(localVariableName, ConstantPool.This)) {
-					this.argumentNames[this.argumentNamesIndex++] = localVariableName;
+					this.argumentNames[argumentNamesIndex++] = localVariableName;
 				}
 			} else {
 				break;
 			}
 			readOffset += 10;
 		}
-		if (this.argumentNamesIndex != this.argumentNames.length) {
+		if (argumentNamesIndex != this.argumentNames.length) {
 			// resize
-			System.arraycopy(this.argumentNames, 0, (this.argumentNames = new char[this.argumentNamesIndex][]), 0, this.argumentNamesIndex);
+			System.arraycopy(this.argumentNames, 0, (this.argumentNames = new char[argumentNamesIndex][]), 0, argumentNamesIndex);
+		}
+	}
+}
+private void decodeMethodParameters(int offset, MethodInfo methodInfo) {
+	int readOffset = offset + 6;
+	final int length = u1At(readOffset);
+	if (length != 0) {
+		readOffset += 1;
+		this.argumentNames = new char[length][];
+		for (int i = 0; i < length; i++) {
+			int nameIndex = u2At(readOffset);
+			if (nameIndex != 0) {
+				int utf8Offset = this.constantPoolOffsets[nameIndex] - this.structOffset;
+				char[] parameterName = utf8At(utf8Offset + 3, u2At(utf8Offset + 1));
+				this.argumentNames[i] = parameterName;
+			} else {
+				this.argumentNames[i] = CharOperation.concat(ARG, String.valueOf(i).toCharArray());
+			}
+			readOffset += 4;
 		}
 	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.java
index 05e2966..08288bb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithParameterAnnotations.java
@@ -22,7 +22,7 @@
 	this.parameterAnnotations = parameterAnnotations;
 }
 public IBinaryAnnotation[] getParameterAnnotations(int index) {
-	return this.parameterAnnotations[index];
+	return this.parameterAnnotations == null ? null : this.parameterAnnotations[index];
 }
 public int getAnnotatedParametersCount() {
 	return this.parameterAnnotations == null ? 0 : this.parameterAnnotations.length;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithTypeAnnotations.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithTypeAnnotations.java
new file mode 100644
index 0000000..8d6c28e
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/MethodInfoWithTypeAnnotations.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2013 GoPivotal, Inc. All Rights Reserved.
+ * 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:
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *            Bug 407191 - [1.8] Binary access support for type annotations
+ *******************************************************************************/
+package org.aspectj.org.eclipse.jdt.internal.compiler.classfmt;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation;
+
+class MethodInfoWithTypeAnnotations extends MethodInfoWithParameterAnnotations {
+	private TypeAnnotationInfo[] typeAnnotations;
+
+MethodInfoWithTypeAnnotations(MethodInfo methodInfo, AnnotationInfo[] annotations, AnnotationInfo[][] parameterAnnotations, TypeAnnotationInfo[] typeAnnotations) {
+	super(methodInfo, annotations, parameterAnnotations);
+	this.typeAnnotations = typeAnnotations;
+}
+public IBinaryTypeAnnotation[] getTypeAnnotations() {
+	return this.typeAnnotations;
+}
+
+protected void initialize() {
+	for (int i = 0, l = this.typeAnnotations == null ? 0 : this.typeAnnotations.length; i < l; i++) {
+		this.typeAnnotations[i].initialize();
+	}
+	super.initialize();
+}
+protected void reset() {
+	for (int i = 0, l = this.typeAnnotations == null ? 0 : this.typeAnnotations.length; i < l; i++) {
+		this.typeAnnotations[i].reset();
+	}
+	super.reset();
+}
+protected void toStringContent(StringBuffer buffer) {
+	super.toStringContent(buffer);
+	buffer.append("type annotations = \n");//$NON-NLS-1$
+	for (int i = 0, l = this.typeAnnotations == null ? 0 : this.typeAnnotations.length; i < l; i++) {
+		buffer.append(this.typeAnnotations[i].toString());
+		buffer.append('\n');
+	}
+}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationInfo.java
new file mode 100644
index 0000000..de8c39b
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationInfo.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2013 GoPivotal, Inc. All Rights Reserved.
+ * 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:
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *          Bug 407191 - [1.8] Binary access support for type annotations
+ *******************************************************************************/
+package org.aspectj.org.eclipse.jdt.internal.compiler.classfmt;
+
+import java.util.Arrays;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.AnnotationTargetTypeConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation;
+
+/**
+ * The TypeAnnotationInfo class does not currently support type annotations within code
+ * blocks (those that have a target type of 0x40 and higher) - it is not yet clear that 
+ * these need to be accessible.
+ */
+public class TypeAnnotationInfo extends ClassFileStruct implements IBinaryTypeAnnotation {
+
+	private AnnotationInfo annotation;
+	
+	private int targetType = 0;
+	
+	// info is used in different ways:
+	// TargetType 0x00: CLASS_TYPE_PARAMETER: type parameter index
+	// TargetType 0x01: METHOD_TYPE_PARAMETER: type parameter index 
+	// TargetType 0x10: CLASS_EXTENDS: supertype index (-1 = superclass, 0..N superinterface)
+	// TargetType 0x11: CLASS_TYPE_PARAMETER_BOUND: type parameter index
+	// TargetType 0x12: METHOD_TYPE_PARAMETER_BOUND: type parameter index
+	// TargetType 0x16: METHOD_FORMAL_PARAMETER: method formal parameter index
+	// TargetType 0x17: THROWS: throws type index
+	private int info;
+	
+	// TargetType 0x11: CLASS_TYPE_PARAMETER_BOUND: bound index
+	// TargetType 0x12: METHOD_TYPE_PARAMETER_BOUND: bound index
+	private int info2;
+	
+	private int[] typePath; // each pair of ints in the array is a type path entry
+	
+	int readOffset = 0;
+	
+	
+TypeAnnotationInfo(byte[] classFileBytes, int[] contantPoolOffsets, int offset) {
+	super(classFileBytes, contantPoolOffsets, offset);
+}
+	
+TypeAnnotationInfo(byte[] classFileBytes, int[] contantPoolOffsets, int offset, boolean runtimeVisible, boolean populate) {
+	this(classFileBytes, contantPoolOffsets, offset);
+	this.readOffset = 0;
+	this.targetType = u1At(0);
+	switch (this.targetType) {
+		case AnnotationTargetTypeConstants.CLASS_TYPE_PARAMETER:
+		case AnnotationTargetTypeConstants.METHOD_TYPE_PARAMETER:
+			this.info = u1At(1); // typeParameterIndex
+			this.readOffset += 2;
+			break;
+			
+		case AnnotationTargetTypeConstants.CLASS_EXTENDS:
+			this.info = u2At(1); // supertypeIndex
+			this.readOffset += 3;
+			break;
+			
+		case AnnotationTargetTypeConstants.CLASS_TYPE_PARAMETER_BOUND:
+		case AnnotationTargetTypeConstants.METHOD_TYPE_PARAMETER_BOUND:
+			this.info = u1At(1); // typeParameterIndex
+			this.info2 = u1At(2); // boundIndex;
+			this.readOffset += 3;
+			break;
+			
+		case AnnotationTargetTypeConstants.FIELD:
+		case AnnotationTargetTypeConstants.METHOD_RETURN:
+		case AnnotationTargetTypeConstants.METHOD_RECEIVER:
+			this.readOffset ++;
+			break;
+			
+		case AnnotationTargetTypeConstants.METHOD_FORMAL_PARAMETER :
+			this.info = u1At(1); // methodFormalParameterIndex
+			this.readOffset += 2;
+			break;
+			
+		case AnnotationTargetTypeConstants.THROWS :
+			this.info = u2At(1); // throwsTypeIndex
+			this.readOffset += 3;
+			break;
+
+		default:
+			throw new IllegalStateException("Target type not handled "+this.targetType); //$NON-NLS-1$
+	}
+	int typePathLength = u1At(this.readOffset);
+	this.readOffset ++;
+	if (typePathLength == 0) {
+		this.typePath = NO_TYPE_PATH;
+	} else {
+		this.typePath = new int[typePathLength*2];
+		int index = 0;
+		for (int i = 0; i < typePathLength; i++) {
+			this.typePath[index++] = u1At(this.readOffset++); // entry kind
+			this.typePath[index++] = u1At(this.readOffset++); // type argument index
+		}
+	}
+	this.annotation = new AnnotationInfo(classFileBytes, this.constantPoolOffsets, this.structOffset + this.readOffset, runtimeVisible, populate);
+	this.readOffset += this.annotation.readOffset;
+}
+
+public IBinaryAnnotation getAnnotation() {
+	return this.annotation;
+}
+
+protected void initialize() {
+	this.annotation.initialize();
+}
+
+protected void reset() {
+	this.annotation.reset();
+	super.reset();
+}
+
+public String toString() {
+	StringBuffer buffer = new StringBuffer();
+	buffer.append(this.annotation);
+	buffer.append(' ');
+	// Not fully decoding it here, just including all the information in the string
+	buffer.append("target_type=").append(this.targetType); //$NON-NLS-1$
+	buffer.append(", info=").append(this.info); //$NON-NLS-1$
+	buffer.append(", info2=").append(this.info2); //$NON-NLS-1$
+	if (this.typePath != NO_TYPE_PATH) {
+		buffer.append(", location=["); //$NON-NLS-1$
+		for (int i = 0, max = this.typePath.length; i < max; i += 2) {
+			if (i > 0) {
+				buffer.append(", "); //$NON-NLS-1$
+			}
+			switch (this.typePath[i]) {
+				case 0:
+					buffer.append("ARRAY"); //$NON-NLS-1$
+					break;
+				case 1:
+					buffer.append("INNER_TYPE"); //$NON-NLS-1$
+					break;
+				case 2:
+					buffer.append("WILDCARD"); //$NON-NLS-1$
+					break;
+				case 3:
+					buffer.append("TYPE_ARGUMENT(").append(this.typePath[i+1]).append(')'); //$NON-NLS-1$
+					break;
+			}
+		}
+		buffer.append(']');
+	}
+	return buffer.toString();
+}
+
+
+public int getTargetType() {
+	return this.targetType;
+}
+
+public int getSupertypeIndex() {
+	// assert this.targetType == 0x10
+	return this.info;
+}
+
+public int getTypeParameterIndex() {
+	// assert this.targetType == 0x00 or 0x01
+	return this.info;
+}
+
+public int getBoundIndex() {
+	// assert this.targetType == 0x11 or 0x12
+	return this.info2;
+}
+
+public int getMethodFormalParameterIndex() {
+	// assert this.targetType == 0x16
+	return this.info;
+}
+
+public int getThrowsTypeIndex() {
+	// assert this.targetType == 0x17
+	return this.info;
+}
+
+public int[] getTypePath() {
+	return this.typePath;
+}
+
+public int hashCode() {
+	final int prime = 31;
+	int result = 1;
+	result = prime * result + this.targetType;
+	result = prime * result + this.info;
+	result = prime * result + this.info2;
+	if (this.typePath != null) {
+		for (int i = 0, max = this.typePath.length; i < max; i++) {
+			result = prime * result + this.typePath[i];
+		}
+	}
+	return result;
+}
+
+public boolean equals(Object obj) {
+	if (this == obj) {
+		return true;
+	}
+	if (obj == null) {
+		return false;
+	}
+	if (getClass() != obj.getClass()) {
+		return false;
+	}
+
+	TypeAnnotationInfo other = (TypeAnnotationInfo) obj;
+
+	if (this.targetType != other.targetType) {
+		return false;
+	}
+	
+	if (this.info != other.info) {
+		return false;
+	}
+
+	if (this.info2 != other.info2) {
+		return false;
+	}
+	
+	if (!Arrays.equals(this.typePath, other.typePath)) {
+		return false;
+	}
+	
+	return this.annotation.equals(other.annotation);
+}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker.java
new file mode 100644
index 0000000..0245ae7
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker.java
@@ -0,0 +1,320 @@
+/*******************************************************************************
+ * Copyright (c) 2013 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.classfmt;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.AnnotationTargetTypeConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation;
+
+/**
+ * A TypeAnnotationWalker is initialized with all type annotations found at a given element.
+ * It can be used to walk into the types at the given element and finally answer the
+ * actual annotations at any node of the walk.
+ * 
+ * The walker is implemented as immutable objects. During the walk either new instances
+ * are created, or the current instance is shared if no difference is encountered.
+ */
+public class TypeAnnotationWalker {
+
+	public static final IBinaryAnnotation[] NO_ANNOTATIONS = new IBinaryAnnotation[0];
+
+	/**
+	 * A no-effect annotation walker, all walking methods are implemented as identity-functions.
+	 * At the end of any walk an empty array of annotations is returned.
+	 */
+	public static final TypeAnnotationWalker EMPTY_ANNOTATION_WALKER = new TypeAnnotationWalker(new IBinaryTypeAnnotation[0], 0L) {
+		public TypeAnnotationWalker toField() { return this; }
+		public TypeAnnotationWalker toTarget(int targetType) { return this; }
+		public TypeAnnotationWalker toThrows(int rank) { return this; }
+		public TypeAnnotationWalker toTypeArgument(int rank) { return this; }
+		public TypeAnnotationWalker toMethodParameter(short index) { return this; }
+		public TypeAnnotationWalker toSupertype(short index) { return this; }
+		public TypeAnnotationWalker toTypeParameterBounds(boolean isClassTypeParameter, int parameterRank) { return this; }
+		public TypeAnnotationWalker toTypeBound(short boundIndex) { return this; }
+		public TypeAnnotationWalker toTypeParameter(boolean isClassTypeParameter, int rank) { return this; }
+		public TypeAnnotationWalker toNextDetail(int detailKind) { return this; }
+		public IBinaryAnnotation[] getAnnotationsAtCursor() { return NO_ANNOTATIONS; }
+	};
+	
+	final private IBinaryTypeAnnotation[] typeAnnotations;	// the actual material we're managing here
+	final private long matches;							// bit mask of indices into typeAnnotations, 1 means active, 0 is filtered during the walk
+	final private int pathPtr;							// pointer into the typePath
+
+	// precondition: not-empty typeAnnotations
+	public TypeAnnotationWalker(IBinaryTypeAnnotation[] typeAnnotations) {
+		this(typeAnnotations, -1L >>> (64-typeAnnotations.length)); // initialize so lowest length bits are 1
+	}
+	TypeAnnotationWalker(IBinaryTypeAnnotation[] typeAnnotations, long matchBits) {
+		this(typeAnnotations, matchBits, 0);
+	}
+	private TypeAnnotationWalker(IBinaryTypeAnnotation[] typeAnnotations, long matchBits, int pathPtr) {
+		this.typeAnnotations = typeAnnotations;
+		this.matches = matchBits;
+		this.pathPtr = pathPtr;
+	}
+
+	private TypeAnnotationWalker restrict(long newMatches, int newPathPtr) {
+		if (this.matches == newMatches && this.pathPtr == newPathPtr) return this;
+		if (newMatches == 0 || this.typeAnnotations == null || this.typeAnnotations.length == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		return new TypeAnnotationWalker(this.typeAnnotations, newMatches, newPathPtr);
+	}
+
+	// ==== filter by top-level targetType: ====
+	
+	/** Walk to a field. */
+	public TypeAnnotationWalker toField() {
+		return toTarget(AnnotationTargetTypeConstants.FIELD);
+	}
+
+	/** Walk to the return type of a method. */
+	public TypeAnnotationWalker toMethodReturn() {
+		return toTarget(AnnotationTargetTypeConstants.METHOD_RETURN);
+	}
+
+	/**
+	 * Walk to the receiver type of a method.
+	 * Note: Type annotations on receiver are not currently used by the compiler.
+	 */
+	public TypeAnnotationWalker toReceiver() {
+		return toTarget(AnnotationTargetTypeConstants.METHOD_RECEIVER);
+	}
+
+	/*
+	 * Implementation for walking to methodReturn, receiver type or field.
+	 */
+	protected TypeAnnotationWalker toTarget(int targetType) {
+		long newMatches = this.matches;
+		if (newMatches == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		int length = this.typeAnnotations.length;
+		long mask = 1;
+		for (int i = 0; i < length; i++, mask = mask << 1) {
+			if (this.typeAnnotations[i].getTargetType() != targetType)
+				newMatches &= ~mask;
+		}
+		return restrict(newMatches, 0);
+	}
+
+	/**
+	 * Walk to the type parameter of the given rank.
+	 * @param isClassTypeParameter whether we are looking for a class type parameter (else: method type type parameter)
+	 * @param rank rank of the type parameter
+	 */
+	public TypeAnnotationWalker toTypeParameter(boolean isClassTypeParameter, int rank) {
+		long newMatches = this.matches;
+		if (newMatches == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		int targetType = isClassTypeParameter ? AnnotationTargetTypeConstants.CLASS_TYPE_PARAMETER : AnnotationTargetTypeConstants.METHOD_TYPE_PARAMETER;
+		int length = this.typeAnnotations.length;
+		long mask = 1;
+		for (int i = 0; i < length; i++, mask = mask << 1) {
+			IBinaryTypeAnnotation candidate = this.typeAnnotations[i];
+			if (candidate.getTargetType() != targetType || candidate.getTypeParameterIndex() != rank) {
+				newMatches &= ~mask;
+			}
+		}
+		return restrict(newMatches, 0);		
+	}
+
+	/**
+	 * Walk to the bounds of a type parameter of either a class or a method (signaled by isClassTypeParameter).
+	 * Clients must then call {@link #toTypeBound(short)} on the resulting walker.
+	 * @param isClassTypeParameter whether we are looking at a class type parameter (else: method type type parameter)
+	 * @param parameterRank rank of the type parameter.
+	 */
+	public TypeAnnotationWalker toTypeParameterBounds(boolean isClassTypeParameter, int parameterRank) {
+		long newMatches = this.matches;
+		if (newMatches == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		int length = this.typeAnnotations.length;
+		int targetType = isClassTypeParameter ?
+				AnnotationTargetTypeConstants.CLASS_TYPE_PARAMETER_BOUND : AnnotationTargetTypeConstants.METHOD_TYPE_PARAMETER_BOUND;
+		long mask = 1;
+		for (int i = 0; i < length; i++, mask = mask << 1) {
+			IBinaryTypeAnnotation candidate = this.typeAnnotations[i];
+			if (candidate.getTargetType() != targetType || (short)candidate.getTypeParameterIndex() != parameterRank) {
+				newMatches &= ~mask;
+			}
+		}
+		return restrict(newMatches, 0);	
+	}
+	/**
+	 * Detail of {@link #toTypeParameterBounds(boolean, int)}: walk to the bounds
+	 * of the previously selected type parameter. 
+	 * @param boundIndex
+	 */
+	public TypeAnnotationWalker toTypeBound(short boundIndex) {
+		long newMatches = this.matches;
+		if (newMatches == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		int length = this.typeAnnotations.length;
+		long mask = 1;
+		for (int i = 0; i < length; i++, mask = mask << 1) {
+			IBinaryTypeAnnotation candidate = this.typeAnnotations[i];
+			if ((short)candidate.getBoundIndex() != boundIndex) {
+				newMatches &= ~mask;
+			}
+		}
+		return restrict(newMatches, 0);		
+	}
+	
+	
+	/** Walk to the specified supertype: -1 is superclass, else the superinterface at the given index. */
+	public TypeAnnotationWalker toSupertype(short index) {
+		long newMatches = this.matches;
+		if (newMatches == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		int length = this.typeAnnotations.length;
+		long mask = 1;
+		for (int i = 0; i < length; i++, mask = mask << 1) {
+			IBinaryTypeAnnotation candidate = this.typeAnnotations[i];
+			if (candidate.getTargetType() != AnnotationTargetTypeConstants.CLASS_EXTENDS || (short)candidate.getSupertypeIndex() != index) {
+				newMatches &= ~mask;
+			}
+		}
+		return restrict(newMatches, 0);		
+	}
+
+	/** Walk to the index'th visible formal method parameter (i.e., not counting synthetic args). */
+	public TypeAnnotationWalker toMethodParameter(short index) {
+		long newMatches = this.matches;
+		if (newMatches == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		int length = this.typeAnnotations.length;
+		long mask = 1;
+		for (int i = 0; i < length; i++, mask = mask << 1) {
+			IBinaryTypeAnnotation candidate = this.typeAnnotations[i];
+			if (candidate.getTargetType() != AnnotationTargetTypeConstants.METHOD_FORMAL_PARAMETER || (short)candidate.getMethodFormalParameterIndex() != index) {
+				newMatches &= ~mask;
+			}
+		}
+		return restrict(newMatches, 0);		
+	}
+
+	/**
+	 * Walk to the throws type at the given index.
+	 */
+	public TypeAnnotationWalker toThrows(int index) {
+		long newMatches = this.matches;
+		if (newMatches == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		int length = this.typeAnnotations.length;
+		long mask = 1;
+		for (int i = 0; i < length; i++, mask = mask << 1) {
+			IBinaryTypeAnnotation candidate = this.typeAnnotations[i];
+			if (candidate.getTargetType() != AnnotationTargetTypeConstants.THROWS || candidate.getThrowsTypeIndex() != index) {
+				newMatches &= ~mask;
+			}
+		}
+		return restrict(newMatches, 0);		
+	}
+
+	// ==== descending into details: ====
+
+	/** Walk to the type argument of the given rank. */
+	public TypeAnnotationWalker toTypeArgument(int rank) {
+		// like toNextDetail() but also checking byte 2 against rank
+		long newMatches = this.matches;
+		if (newMatches == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		int length = this.typeAnnotations.length;
+		long mask = 1;
+		for (int i = 0; i < length; i++, mask = mask << 1) {
+			IBinaryTypeAnnotation candidate = this.typeAnnotations[i];
+			int[] path = candidate.getTypePath();
+			if (this.pathPtr >= path.length 
+					|| path[this.pathPtr] != AnnotationTargetTypeConstants.TYPE_ARGUMENT
+					|| path[this.pathPtr+1] != rank) {
+				newMatches &= ~mask;
+			}
+		}
+		return restrict(newMatches, this.pathPtr+2);		
+	}
+
+	/** Walk to the bound of a wildcard. */
+	public TypeAnnotationWalker toWildcardBound() {
+		long newMatches = this.matches;
+		if (newMatches == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		int length = this.typeAnnotations.length;
+		long mask = 1;
+		for (int i = 0; i < length; i++, mask = mask << 1) {
+			IBinaryTypeAnnotation candidate = this.typeAnnotations[i];
+			int[] path = candidate.getTypePath();
+			if (this.pathPtr >= path.length 
+					|| path[this.pathPtr] != AnnotationTargetTypeConstants.WILDCARD_BOUND) {
+				newMatches &= ~mask;
+			}
+		}
+		return restrict(newMatches, this.pathPtr+2);		
+	}
+
+	/**
+	 * Descend down one level of array dimensions.
+	 */
+	public TypeAnnotationWalker toNextArrayDimension() {
+		return toNextDetail(AnnotationTargetTypeConstants.NEXT_ARRAY_DIMENSION);
+	}
+	
+	/**
+	 * Descend down one level of type nesting.
+	 */
+	public TypeAnnotationWalker toNextNestedType() {
+		return toNextDetail(AnnotationTargetTypeConstants.NEXT_NESTED_TYPE);
+	}
+
+	/*
+	 * Implementation for walking along the type_path for array dimensions & nested types.
+	 * FIXME(stephan): support wildcard bounds.
+	 */
+	protected TypeAnnotationWalker toNextDetail(int detailKind) {
+		long newMatches = this.matches;
+		if (newMatches == 0)
+			return EMPTY_ANNOTATION_WALKER;
+		int length = this.typeAnnotations.length;
+		long mask = 1;
+		for (int i = 0; i < length; i++, mask = mask << 1) {
+			IBinaryTypeAnnotation candidate = this.typeAnnotations[i];
+			int[] path = candidate.getTypePath();
+			if (this.pathPtr >= path.length || path[this.pathPtr] != detailKind) {
+				newMatches &= ~mask;
+			}
+		}
+		return restrict(newMatches, this.pathPtr+2);
+	}
+	
+	// ==== leaves: the actual annotations: ====
+	
+	/**
+	 * Retrieve the type annotations at the current position
+	 * reached by invocations of toXYZ() methods.
+	 */
+	public IBinaryAnnotation[] getAnnotationsAtCursor() {
+		int length = this.typeAnnotations.length;
+		IBinaryAnnotation[] filtered = new IBinaryAnnotation[length];
+		long ptr = 1;
+		int count = 0;
+		for (int i = 0; i < length; i++, ptr<<=1) {
+			if ((this.matches & ptr) == 0)
+				continue;
+			IBinaryTypeAnnotation candidate = this.typeAnnotations[i];
+			if (candidate.getTypePath().length > this.pathPtr)
+				continue;
+			filtered[count++] = candidate.getAnnotation();
+		}
+		if (count == 0)
+			return NO_ANNOTATIONS;
+		if (count < length)
+			System.arraycopy(filtered, 0, filtered = new IBinaryAnnotation[count], 0, count);
+		return filtered;
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationContext.java
index eda9c5c..a76d985 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationContext.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
@@ -17,7 +13,7 @@
 package org.aspectj.org.eclipse.jdt.internal.compiler.codegen;
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
-import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 
@@ -25,34 +21,23 @@
 	public static final int VISIBLE = 0x1;
 	public static final int INVISIBLE = 0x2;
 	public Annotation annotation;
-	public TypeReference typeReference;
+	public Expression typeReference;
 	public int targetType;
 	public int info;
 	public int info2;
 	public int visibility;
-	public Annotation[] primaryAnnotations;
 	public LocalVariableBinding variableBinding;
-	public Annotation[][] annotationsOnDimensions;
 	public Wildcard wildcard;
-	// annotationsOnDimensions might be null but the dimensions may still be important. In some
-	// cases they are not on the reference.
-	public int dimensions;
 
 	public AnnotationContext(
 			Annotation annotation,
-			TypeReference typeReference,
+			Expression typeReference,
 			int targetType,
-			Annotation[] primaryAnnotations,
-			int visibility,
-			Annotation[][] annotationsOnDimensions,
-			int dimensions) {
+			int visibility) {
 		this.annotation = annotation;
 		this.typeReference = typeReference;
 		this.targetType = targetType;
-		this.primaryAnnotations = primaryAnnotations;
 		this.visibility = visibility;
-		this.annotationsOnDimensions = annotationsOnDimensions;
-		this.dimensions = dimensions;
 	}
 
 	public String toString() {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationTargetTypeConstants.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationTargetTypeConstants.java
index 8bf0172..f8603df 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationTargetTypeConstants.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AnnotationTargetTypeConstants.java
@@ -5,14 +5,12 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *        Stephan Herrmann - Contribution for
+ *							Bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.codegen;
 
@@ -46,4 +44,9 @@
 	int CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT  = 0x4A;
 	int METHOD_REFERENCE_TYPE_ARGUMENT       = 0x4B;
 
+	// Details for type_path:
+	int NEXT_ARRAY_DIMENSION				 = 0x00;
+	int NEXT_NESTED_TYPE					 = 0x01;
+	int WILDCARD_BOUND						 = 0x02;
+	int TYPE_ARGUMENT						 = 0x03;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AttributeNamesConstants.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AttributeNamesConstants.java
index ba9dd76..30a3775 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AttributeNamesConstants.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/AttributeNamesConstants.java
@@ -4,15 +4,12 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Contributions for
  *							Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335             
+ *							Bug 406973 - [compiler] Parse MethodParameters attribute
  *        Andy Clement - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
  *******************************************************************************/
@@ -45,4 +42,6 @@
 	// jsr308
 	final char[] RuntimeVisibleTypeAnnotationsName = "RuntimeVisibleTypeAnnotations".toCharArray(); //$NON-NLS-1$
 	final char[] RuntimeInvisibleTypeAnnotationsName = "RuntimeInvisibleTypeAnnotations".toCharArray(); //$NON-NLS-1$
+	// jep118
+	final char[] MethodParametersName = "MethodParameters".toCharArray(); //$NON-NLS-1$
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java
index 2f959de..80d4adb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java
@@ -1,26 +1,34 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 400710 - [1.8][compiler] synthetic access to default method generates wrong code
  *								bug 391376 - [1.8] check interaction of default methods with bridge methods and generics
+ *								bug 421543 - [1.8][compiler] Compiler fails to recognize default method being turned into abstract by subtytpe
  *     Jesper S Moller - Contributions for
  *							Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335        
- *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409247 - [1.8][compiler] Verify error with code allocating multidimensional array
+ *                          Bug 409236 - [1.8][compiler] Type annotations on intersection cast types dropped by code generator
+ *                          Bug 409250 - [1.8][compiler] Various loose ends in 308 code generation
+ *                          Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.codegen;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ClassFile;
 import org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult;
@@ -28,7 +36,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AllocationExpression;
-import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
@@ -44,6 +52,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.AbortMethod;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class CodeStream {
 
 	// It will be responsible for the following items.
@@ -652,19 +661,13 @@
 }
 
 public void checkcast(TypeReference typeReference, TypeBinding typeBinding) {
-	/* We use a slightly sub-optimal generation for intersection casts by resorting to a runtime cast for every intersecting type, but in
-	   reality this should not matter. In its intended use form such as (I & Serializable) () -> {}, no cast is emitted at all
-	*/
-	TypeBinding [] types = typeBinding instanceof IntersectionCastTypeBinding ? typeBinding.getIntersectingTypes() : new TypeBinding [] { typeBinding };
-	for (int i = types.length - 1; i >=0; i--) {
-		this.countLabels = 0;
-		if (this.classFileOffset + 2 >= this.bCodeStream.length) {
-			resizeByteArray();
-		}
-		this.position++;
-		this.bCodeStream[this.classFileOffset++] = Opcodes.OPC_checkcast;
-		writeUnsignedShort(this.constantPool.literalIndexForType(types[i]));
+	this.countLabels = 0;
+	if (this.classFileOffset + 2 >= this.bCodeStream.length) {
+		resizeByteArray();
 	}
+	this.position++;
+	this.bCodeStream[this.classFileOffset++] = Opcodes.OPC_checkcast;
+	writeUnsignedShort(this.constantPool.literalIndexForType(typeBinding));
 }
 
 public void d2f() {
@@ -1872,7 +1875,7 @@
 	invokeClassForName();
 	int paramLength = methodBinding.parameters.length;
 	this.generateInlinedValue(paramLength);
-	newArray(null, scope.createArrayType(scope.getType(TypeConstants.JAVA_LANG_CLASS, 3), 1));
+	newArray(scope.createArrayType(scope.getType(TypeConstants.JAVA_LANG_CLASS, 3), 1));
 	if (paramLength > 0) {
 		dup();
 		for (int i = 0; i < paramLength; i++) {
@@ -1928,7 +1931,7 @@
 	this.ldc(String.valueOf(methodBinding.selector));
 	int paramLength = methodBinding.parameters.length;
 	this.generateInlinedValue(paramLength);
-	newArray(null, scope.createArrayType(scope.getType(TypeConstants.JAVA_LANG_CLASS, 3), 1));
+	newArray(scope.createArrayType(scope.getType(TypeConstants.JAVA_LANG_CLASS, 3), 1));
 	if (paramLength > 0) {
 		dup();
 		for (int i = 0; i < paramLength; i++) {
@@ -2450,7 +2453,7 @@
 public void generateSyntheticBodyForArrayConstructor(SyntheticMethodBinding methodBinding) {
 	initializeMaxLocals(methodBinding);
 	iload_0();
-	anewarray(((ArrayBinding) methodBinding.returnType).elementsType());
+	newArray(null, null, (ArrayBinding) methodBinding.returnType);
 	areturn();
 }
 public void generateSyntheticBodyForArrayClone(SyntheticMethodBinding methodBinding) {
@@ -2509,6 +2512,275 @@
 	areturn();
 }
 
+// TODO what about blowing the method limit? Ignore for now?
+/**
+ * This is intended to match what javac generates. First there is a switch statement on the hashcode of the lambda method name - based on that
+ * an id is computed (0..N). An unrecognized hash gets the id -1. Then a second switch is on the id and each case here checks all the properties
+ * of the serialized lambda. If they all checkout OK an invokedynamic call to a bootstrap method targeting the altMetafactory. If any of the tests
+ * fail an IllegalArgumentException is thrown. This exception is not typically seen by the 'user', instead they seem to see a NPE when
+ * the lambda does not deserialize properly.
+ */
+public void generateSyntheticBodyForDeserializeLambda(SyntheticMethodBinding methodBinding,SyntheticMethodBinding[] syntheticMethodBindings) {
+	initializeMaxLocals(methodBinding);
+
+	// Compute the list of the serializable lambdas from the full set of synthetic method bindings
+	// Also compute a map of hashcodes to a list of serializable lambdas whose names share a hashcode 
+	List syntheticsForSerializableLambdas = new ArrayList();	
+	Map hashcodesToLambdas = new LinkedHashMap();
+	for (int i=0,max=syntheticMethodBindings.length;i<max;i++) {
+		SyntheticMethodBinding syntheticMethodBinding = syntheticMethodBindings[i];
+		if (syntheticMethodBinding.lambda!=null && syntheticMethodBinding.lambda.isSerializable) {
+			syntheticsForSerializableLambdas.add(syntheticMethodBinding);
+			// TODO can I use > Java 1.4 features here?
+			Integer hashcode = new Integer(new String(syntheticMethodBinding.selector).hashCode());
+			List lambdasForThisHashcode = (List)hashcodesToLambdas.get(hashcode);
+			if (hashcodesToLambdas.get(hashcode)==null) {
+				lambdasForThisHashcode = new ArrayList();
+				hashcodesToLambdas.put(hashcode,lambdasForThisHashcode);
+			}
+			lambdasForThisHashcode.add(syntheticMethodBinding);
+		}
+	}
+	int lambdaCount = syntheticsForSerializableLambdas.size();
+	ClassScope scope = ((SourceTypeBinding)methodBinding.declaringClass).scope;
+	
+	
+	// Generate the first switch, on method name hashcode
+	aload_0();
+	invoke(Opcodes.OPC_invokevirtual, 1, 1, ConstantPool.JavaLangInvokeSerializedLambdaConstantPoolName, ConstantPool.GetImplMethodName, ConstantPool.GetImplMethodNameSignature);
+	astore_1();
+	LocalVariableBinding lvb1 = new LocalVariableBinding("hashcode".toCharArray(),scope.getJavaLangString(),0,false); //$NON-NLS-1$
+	lvb1.resolvedPosition = 1;
+	addVariable(lvb1);
+	iconst_m1();
+	istore_2();
+	LocalVariableBinding lvb2 = new LocalVariableBinding("id".toCharArray(),TypeBinding.INT,0,false); //$NON-NLS-1$
+	lvb2.resolvedPosition = 2;
+	addVariable(lvb2);
+	aload_1();
+	invokeStringHashCode();
+	
+	BranchLabel label = new BranchLabel(this);
+	CaseLabel defaultLabel = new CaseLabel(this);
+	int numberOfHashcodes = hashcodesToLambdas.size();
+	CaseLabel[] switchLabels = new CaseLabel[numberOfHashcodes];
+	int[] keys = new int[numberOfHashcodes];
+	int[] sortedIndexes = new int[numberOfHashcodes];
+	Set hashcodes = hashcodesToLambdas.keySet();
+	Iterator hashcodeIterator = hashcodes.iterator();
+	int index=0;
+	while (hashcodeIterator.hasNext()) {
+		Integer hashcode = (Integer)hashcodeIterator.next();
+		switchLabels[index] = new CaseLabel(this);
+		keys[index] = hashcode.intValue();
+		sortedIndexes[index] = index;
+		index++;
+	}
+	int[] localKeysCopy;
+	System.arraycopy(keys,0,(localKeysCopy = new int[numberOfHashcodes]),0,numberOfHashcodes);
+	sort(localKeysCopy, 0, numberOfHashcodes-1, sortedIndexes);
+	// TODO need to use a tableswitch at some size threshold?
+	lookupswitch(defaultLabel, keys, sortedIndexes, switchLabels);
+	// TODO cope with multiple names that share the same hashcode	
+	hashcodeIterator = hashcodes.iterator();
+	index = 0;
+	while (hashcodeIterator.hasNext()) {
+		Integer hashcode = (Integer)hashcodeIterator.next();
+		List lambdas = (List)hashcodesToLambdas.get(hashcode);
+		switchLabels[index].place();
+		BranchLabel nextOne = new BranchLabel(this);
+		// Loop through all lambdas that share the same hashcode
+		for (int j=0,max=lambdas.size();j<max;j++) {
+			SyntheticMethodBinding syntheticMethodBinding = (SyntheticMethodBinding)lambdas.get(j);
+			aload_1();
+			ldc(new String(syntheticMethodBinding.selector));
+			invokeStringEquals();
+			ifeq(nextOne);
+			loadInt(index++);
+			istore_2();
+			goto_(label);
+			nextOne.place();
+			nextOne = new BranchLabel(this);
+		}
+		goto_(label);
+	}
+	defaultLabel.place();
+	label.place();
+	
+	// Second block is switching on the lambda id, -1 is the error (unrecognized) case
+	switchLabels = new CaseLabel[lambdaCount];
+	keys = new int[lambdaCount];
+	sortedIndexes = new int[lambdaCount];
+	BranchLabel errorLabel = new BranchLabel(this);
+	defaultLabel = new CaseLabel(this);
+	iload_2();
+	for (int j=0;j<lambdaCount;j++) {
+		switchLabels[j] = new CaseLabel(this);
+		keys[j] = j;
+		sortedIndexes[j] = j;
+	}
+	System.arraycopy(keys,0,(localKeysCopy = new int[lambdaCount]),0,lambdaCount);
+	// TODO no need to sort here? They should all be in order
+	sort(localKeysCopy, 0, lambdaCount-1, sortedIndexes);
+	// TODO need to use a tableswitch at some size threshold?
+	lookupswitch(defaultLabel, keys, sortedIndexes, switchLabels);
+	for (int i=0;i<lambdaCount;i++) {
+		SyntheticMethodBinding syntheticMethodBinding = (SyntheticMethodBinding)syntheticsForSerializableLambdas.get(i);
+		switchLabels[i].place();
+		
+		// Compare ImplMethodKind
+		aload_0();
+		LambdaExpression lambdaEx = syntheticMethodBinding.lambda;
+		MethodBinding mb = lambdaEx.binding;
+		invoke(Opcodes.OPC_invokevirtual, 1, 1, ConstantPool.JavaLangInvokeSerializedLambdaConstantPoolName, 
+				ConstantPool.GetImplMethodKind, ConstantPool.GetImplMethodKindSignature);
+		byte methodKind = 0;
+		if (mb.isStatic()) {
+			methodKind = ClassFileConstants.MethodHandleRefKindInvokeStatic;
+		} else if (mb.isPrivate()) {
+			methodKind = ClassFileConstants.MethodHandleRefKindInvokeSpecial;
+		} else {
+			methodKind = ClassFileConstants.MethodHandleRefKindInvokeVirtual;
+		}
+		bipush(methodKind);// TODO see table below
+		if_icmpne(errorLabel);
+
+		// Compare FunctionalInterfaceClass
+		aload_0();
+		invoke(Opcodes.OPC_invokevirtual, 1, 1, ConstantPool.JavaLangInvokeSerializedLambdaConstantPoolName, 
+				ConstantPool.GetFunctionalInterfaceClass, ConstantPool.GetFunctionalInterfaceClassSignature);
+		String functionalInterface = null;
+		final TypeBinding expectedType = lambdaEx.expectedType();
+		if (expectedType instanceof IntersectionCastTypeBinding) {
+			functionalInterface = new String(((IntersectionCastTypeBinding)expectedType).getSAMType(scope).constantPoolName());
+		} else {
+			functionalInterface = new String(expectedType.constantPoolName());
+		}
+		ldc(functionalInterface);// e.g. "com/foo/X$Foo"
+		invokeObjectEquals();
+		ifeq(errorLabel);
+		
+		// Compare FunctionalInterfaceMethodName
+		aload_0();
+		invoke(Opcodes.OPC_invokevirtual, 1, 1, ConstantPool.JavaLangInvokeSerializedLambdaConstantPoolName, 
+				ConstantPool.GetFunctionalInterfaceMethodName, ConstantPool.GetFunctionalInterfaceMethodNameSignature);
+		ldc(new String(lambdaEx.descriptor.selector)); // e.g. "m"
+		invokeObjectEquals();
+		ifeq(errorLabel);
+
+		// Compare FunctionalInterfaceMethodSignature
+		aload_0();
+		invoke(Opcodes.OPC_invokevirtual, 1, 1, ConstantPool.JavaLangInvokeSerializedLambdaConstantPoolName, 
+				ConstantPool.GetFunctionalInterfaceMethodSignature, ConstantPool.GetFunctionalInterfaceMethodSignatureSignature);
+		ldc(new String(lambdaEx.descriptor.original().signature())); // e.g "()I"
+		invokeObjectEquals();
+		ifeq(errorLabel);
+
+		// Compare ImplClass
+		aload_0();
+		invoke(Opcodes.OPC_invokevirtual, 1, 1, ConstantPool.JavaLangInvokeSerializedLambdaConstantPoolName, 
+				ConstantPool.GetImplClass, ConstantPool.GetImplClassSignature);
+		ldc(new String(CharOperation.concatWith(mb.declaringClass.compoundName,'/'))); // e.g. "com/foo/X"
+		invokeObjectEquals();
+		ifeq(errorLabel);
+
+		// Compare ImplMethodSignature
+		aload_0();
+		invoke(Opcodes.OPC_invokevirtual, 1, 1, ConstantPool.JavaLangInvokeSerializedLambdaConstantPoolName, 
+				ConstantPool.GetImplMethodSignature, ConstantPool.GetImplMethodSignatureSignature);
+		ldc(new String(mb.signature())); // e.g. "(I)I"
+		invokeObjectEquals();
+		ifeq(errorLabel);
+
+		// Captured arguments
+		StringBuffer sig = new StringBuffer("("); //$NON-NLS-1$
+		index = 0;
+		if (lambdaEx.shouldCaptureInstance) {
+			aload_0();
+			loadInt(index++);
+			invoke(Opcodes.OPC_invokevirtual, 1, 1, ConstantPool.JavaLangInvokeSerializedLambdaConstantPoolName, 
+					ConstantPool.GetCapturedArg, ConstantPool.GetCapturedArgSignature);
+			checkcast(mb.declaringClass);
+			sig.append(mb.declaringClass.signature());
+		}
+		
+		SyntheticArgumentBinding[] outerLocalVariables = lambdaEx.outerLocalVariables;
+		for (int p=0,max=outerLocalVariables.length;p<max;p++) {
+			aload_0();
+			loadInt(p);
+			invoke(Opcodes.OPC_invokevirtual, 1, 1, ConstantPool.JavaLangInvokeSerializedLambdaConstantPoolName, 
+					ConstantPool.GetCapturedArg, ConstantPool.GetCapturedArgSignature);
+			TypeBinding varType = outerLocalVariables[p].type;
+			if (varType.isBaseType()) {
+				checkcast(scope.boxing(varType));
+				generateUnboxingConversion(varType.id);
+				if (varType.id == TypeIds.T_JavaLangLong || varType.id == TypeIds.T_JavaLangDouble) {
+					index++;
+				}
+			} else {
+				checkcast(varType);
+			}
+			index++;
+			sig.append(varType.signature());
+		}
+		sig.append(")"); //$NON-NLS-1$
+		if (lambdaEx.resolvedType instanceof IntersectionCastTypeBinding) {
+			sig.append(((IntersectionCastTypeBinding)lambdaEx.resolvedType).getSAMType(scope).signature());
+		} else {
+			sig.append(lambdaEx.resolvedType.signature());
+		}
+		// Example: invokeDynamic(0, 0, 1, "m".toCharArray(), "()Lcom/foo/X$Foo;".toCharArray());
+		invokeDynamic(lambdaEx.bootstrapMethodNumber, index, 1, lambdaEx.descriptor.selector, sig.toString().toCharArray());
+		areturn();
+	}
+	
+	removeVariable(lvb1);
+	removeVariable(lvb2);
+	defaultLabel.place();
+	errorLabel.place();
+	// Code: throw new IllegalArgumentException("Invalid lambda deserialization")
+	new_(scope.getJavaLangIllegalArgumentException());
+	dup();
+	ldc("Invalid lambda deserialization"); //$NON-NLS-1$ // TODO into a constant?		
+	// invokespecial: java.lang.IllegalArgumentException.<init>(Ljava/lang/String;)V
+	invoke(
+			Opcodes.OPC_invokespecial,
+			2, // receiverAndArgsSize
+			0, // return type size
+			ConstantPool.JavaLangIllegalArgumentExceptionConstantPoolName,
+			ConstantPool.Init,
+			ConstantPool.IllegalArgumentExceptionConstructorSignature);
+	athrow();
+}
+
+/**
+ * Based on the supplied value add the most efficient load instruction to the code stream for that value.
+ * Note: Does not handle  negative values.
+ */
+public void loadInt(int value) {
+	if (value<6) {
+		if (value==0) {
+			iconst_0();
+		} else if (value==1) {
+			iconst_1();
+		} else if (value==2) {
+			iconst_2();
+		} else if (value==3) {
+			iconst_3();
+		} else if (value==4) {
+			iconst_4();
+		} else if (value==5) {
+			iconst_5();
+		}
+	} else if (value < 128) {
+		// TODO [andy] testcases that hit this
+		bipush((byte)value);
+	} else {
+		// TODO [andy] testcases that hit this, yikes
+		ldc(value);
+	}
+}
+
 //static X[] values() {
 // X[] values;
 // int length;
@@ -2528,7 +2800,7 @@
 	arraylength();
 	dup();
 	istore_1();
-	newArray(null, (ArrayBinding) enumArray);
+	newArray((ArrayBinding) enumArray);
 	dup();
 	astore_2();
 	iconst_0();
@@ -2631,7 +2903,7 @@
 	    if (arguments != null) { // for bridge methods
 		    TypeBinding argument = arguments[i];
 			load(argument, resolvedPosition);
-			if (argument != parameter)
+			if (TypeBinding.notEquals(argument, parameter))
 			    checkcast(parameter);
 	    } else {
 			load(parameter, resolvedPosition);
@@ -2809,7 +3081,7 @@
 		boolean complyTo14 = compliance >= ClassFileConstants.JDK1_4;
 		for (int i = 0, max = syntheticArgumentTypes.length; i < max; i++) {
 			ReferenceBinding syntheticArgType = syntheticArgumentTypes[i];
-			if (hasExtraEnclosingInstance && syntheticArgType == targetEnclosingType) {
+			if (hasExtraEnclosingInstance && TypeBinding.equalsEquals(syntheticArgType, targetEnclosingType)) {
 				hasExtraEnclosingInstance = false;
 				enclosingInstance.generateCode(currentScope, this, true);
 				if (complyTo14){
@@ -2932,6 +3204,7 @@
 	}
 }
 
+
 /*
  * Wide conditional branch compare, improved by swapping comparison opcode
  *   ifeq WideTarget
@@ -3056,7 +3329,7 @@
 	// for runtime compatibility on 1.2 VMs : change the declaring class of the binding
 	// NOTE: from target 1.2 on, field's declaring class is touched if any different from receiver type
 	// and not from Object or implicit static field access.
-	if (constantPoolDeclaringClass != actualReceiverType.erasure()
+	if (TypeBinding.notEquals(constantPoolDeclaringClass, actualReceiverType.erasure())
 			&& !actualReceiverType.isArrayType()
 			&& constantPoolDeclaringClass != null // array.length
 			&& codegenBinding.constant() == Constant.NotAConstant) {
@@ -3102,13 +3375,15 @@
 		// for runtime compatibility on 1.2 VMs : change the declaring class of the binding
 		// NOTE: from target 1.2 on, method's declaring class is touched if any different from receiver type
 		// and not from Object or implicit static method call.
-		if (constantPoolDeclaringClass != actualReceiverType.erasure() && !actualReceiverType.isArrayType()) {
+		if (TypeBinding.notEquals(constantPoolDeclaringClass, actualReceiverType.erasure()) && !actualReceiverType.isArrayType()) {
 			CompilerOptions options = currentScope.compilerOptions();
+	
 			if ((options.targetJDK >= ClassFileConstants.JDK1_2
 						&& (options.complianceLevel >= ClassFileConstants.JDK1_4 || !(isImplicitThisReceiver && codegenBinding.isStatic()))
 						&& codegenBinding.declaringClass.id != TypeIds.T_JavaLangObject) // no change for Object methods
 					|| !codegenBinding.declaringClass.canBeSeenBy(currentScope)) {
-				constantPoolDeclaringClass = actualReceiverType.erasure();
+				if (!actualReceiverType.isIntersectionCastType()) // no constant pool representation. FIXME, visibility issue not handled.
+					constantPoolDeclaringClass = actualReceiverType.erasure();
 			}
 		}				
 	}
@@ -3955,6 +4230,14 @@
 }
 
 protected void invoke(byte opcode, int receiverAndArgsSize, int returnTypeSize, char[] declaringClass, char[] selector, char[] signature) {
+	invoke18(opcode, receiverAndArgsSize, returnTypeSize, declaringClass, opcode == Opcodes.OPC_invokeinterface, selector, signature);
+}
+
+// Starting with 1.8 we can no longer deduce isInterface from opcode, invokespecial can be used for default methods, too.
+// Hence adding explicit parameter 'isInterface', which is needed only for non-ctor invokespecial invocations
+// (i.e., other clients may still call the shorter overload).
+private void invoke18(byte opcode, int receiverAndArgsSize, int returnTypeSize, char[] declaringClass,
+		boolean isInterface, char[] selector, char[] signature) {	
 	this.countLabels = 0;
 	if (opcode == Opcodes.OPC_invokeinterface) {
 		// invokeinterface
@@ -3975,7 +4258,7 @@
 		}
 		this.position++;
 		this.bCodeStream[this.classFileOffset++] = opcode;
-		writeUnsignedShort(this.constantPool.literalIndexForMethod(declaringClass, selector, signature, false));
+		writeUnsignedShort(this.constantPool.literalIndexForMethod(declaringClass, selector, signature, isInterface));
 	}
 	this.stackDepth += returnTypeSize - receiverAndArgsSize;
 	if (this.stackDepth > this.stackMax) {
@@ -4080,11 +4363,12 @@
 			returnTypeSize = 1;
 			break;
 	}
-	invoke(
+	invoke18(
 			opcode, 
 			receiverAndArgsSize, 
 			returnTypeSize, 
-			declaringClass.constantPoolName(), 
+			declaringClass.constantPoolName(),
+			declaringClass.isInterface(),
 			methodBinding.selector, 
 			methodBinding.signature(this.classFile));
 }
@@ -4659,6 +4943,16 @@
 			ConstantPool.Equals,
 			ConstantPool.EqualsSignature);
 }
+public void invokeObjectEquals() {
+	// invokevirtual: java.lang.Object.equals()
+	invoke(
+			Opcodes.OPC_invokevirtual,
+			2, // receiverAndArgsSize
+			1, // return type size
+			ConstantPool.JavaLangObjectConstantPoolName,
+			ConstantPool.Equals,
+			ConstantPool.EqualsSignature);
+}
 public void invokeStringHashCode() {
 	// invokevirtual: java.lang.String.hashCode()
 	invoke(
@@ -5716,15 +6010,11 @@
 	this.bCodeStream[this.classFileOffset++] = Opcodes.OPC_monitorexit;
 }
 
-public void multianewarray(TypeBinding typeBinding, int dimensions) {
-	this.multianewarray(null, typeBinding, dimensions, null);
-}
-
 public void multianewarray(
 		TypeReference typeReference,
 		TypeBinding typeBinding,
 		int dimensions,
-		Annotation [][] annotationsOnDimensions) {
+		ArrayAllocationExpression allocationExpression) {
 	this.countLabels = 0;
 	this.stackDepth += (1 - dimensions);
 	if (this.classFileOffset + 3 >= this.bCodeStream.length) {
@@ -5766,14 +6056,10 @@
 }
 
 public void newArray(ArrayBinding arrayBinding) {
-	this.newArray(null, arrayBinding);
-}
-
-public void newArray(TypeReference typeReference, ArrayBinding arrayBinding) {
 	this.newArray(null, null, arrayBinding);
 }
 
-public void newArray(TypeReference typeReference, Annotation[][] annotationsOnDimensions, ArrayBinding arrayBinding) {
+public void newArray(TypeReference typeReference, ArrayAllocationExpression allocationExpression, ArrayBinding arrayBinding) {
 	TypeBinding component = arrayBinding.elementsType();
 	switch (component.id) {
 		case TypeIds.T_int :
@@ -6419,12 +6705,12 @@
 	if (lineSeparatorPositions2 != null) {
 		int length = lineSeparatorPositions2.length;
 		int lineSeparatorPositionsEnd = length - 1;
-		int start = Util.getLineNumber(lambda.body.sourceStart, lineSeparatorPositions2, 0, lineSeparatorPositionsEnd);
+		int start = Util.getLineNumber(lambda.body().sourceStart, lineSeparatorPositions2, 0, lineSeparatorPositionsEnd);
 		this.lineNumberStart = start;
 		if (start > lineSeparatorPositionsEnd) {
 			this.lineNumberEnd = start;
 		} else {
-			int end = Util.getLineNumber(lambda.body.sourceEnd, lineSeparatorPositions2, start - 1, lineSeparatorPositionsEnd);
+			int end = Util.getLineNumber(lambda.body().sourceEnd, lineSeparatorPositions2, start - 1, lineSeparatorPositionsEnd);
 			if (end >= lineSeparatorPositionsEnd) {
 				end = length;
 			}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java
index 6154ef9..30885a2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java
@@ -1,18 +1,19 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Contributions for
  *							Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335        
+ *							Bug 406982 - [1.8][compiler] Generation of MethodParameters Attribute in classfile
+ *							Bug 416885 - [1.8][compiler]IncompatibleClassChange error (edit)
+ *							Bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.codegen;
 
@@ -86,6 +87,8 @@
 	public static final char[] doubleDoubleSignature = "(D)Ljava/lang/Double;".toCharArray(); //$NON-NLS-1$
 	public static final char[] DOUBLEVALUE_DOUBLE_METHOD_NAME = "doubleValue".toCharArray(); //$NON-NLS-1$
 	public static final char[] DOUBLEVALUE_DOUBLE_METHOD_SIGNATURE = "()D".toCharArray(); //$NON-NLS-1$
+	public static final char[] EnumName = "$enum$name".toCharArray();//$NON-NLS-1$
+	public static final char[] EnumOrdinal = "$enum$ordinal".toCharArray();//$NON-NLS-1$
 	public static final char[] Exit = "exit".toCharArray(); //$NON-NLS-1$
 	public static final char[] ExitIntSignature = "(I)V".toCharArray(); //$NON-NLS-1$
 	public static final char[] FloatConstrSignature = "(F)V".toCharArray(); //$NON-NLS-1$
@@ -142,6 +145,7 @@
 	public static final char[] INVOKE_METHOD_METHOD_SIGNATURE = "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;".toCharArray(); //$NON-NLS-1$
 	public static final char[][] JAVA_LANG_REFLECT_ACCESSIBLEOBJECT = new char[][] {TypeConstants.JAVA, TypeConstants.LANG, TypeConstants.REFLECT, "AccessibleObject".toCharArray()}; //$NON-NLS-1$
 	public static final char[][] JAVA_LANG_REFLECT_ARRAY = new char[][] {TypeConstants.JAVA, TypeConstants.LANG, TypeConstants.REFLECT, "Array".toCharArray()}; //$NON-NLS-1$
+	public static final char[] IllegalArgumentExceptionConstructorSignature = "(Ljava/lang/String;)V".toCharArray(); //$NON-NLS-1$
 	// predefined type constant names
 	public static final char[] JavaIoPrintStreamSignature = "Ljava/io/PrintStream;".toCharArray(); //$NON-NLS-1$
 	public static final char[] JavaLangAssertionErrorConstantPoolName = "java/lang/AssertionError".toCharArray(); //$NON-NLS-1$
@@ -175,12 +179,14 @@
 	public static final char[] JavaLangObjectSignature = "Ljava/lang/Object;".toCharArray(); //$NON-NLS-1$
 	public static final char[] JavaLangSystemConstantPoolName = "java/lang/System".toCharArray(); //$NON-NLS-1$
 	public static final char[] JavaLangThrowableConstantPoolName = "java/lang/Throwable".toCharArray(); //$NON-NLS-1$
+	public static final char[] JavaLangIllegalArgumentExceptionConstantPoolName = "java/lang/IllegalArgumentException".toCharArray(); //$NON-NLS-1$
 	public static final char[] JavaLangVoidConstantPoolName = "java/lang/Void".toCharArray(); //$NON-NLS-1$
 	public static final char[] JavaUtilIteratorConstantPoolName = "java/util/Iterator".toCharArray(); //$NON-NLS-1$
 	public static final char[] LongConstrSignature = "(J)V".toCharArray(); //$NON-NLS-1$
 	public static final char[] longLongSignature = "(J)Ljava/lang/Long;".toCharArray(); //$NON-NLS-1$
 	public static final char[] LONGVALUE_LONG_METHOD_NAME = "longValue".toCharArray(); //$NON-NLS-1$
 	public static final char[] LONGVALUE_LONG_METHOD_SIGNATURE = "()J".toCharArray(); //$NON-NLS-1$
+	public static final char[] Name = "name".toCharArray();//$NON-NLS-1$
 	public static final char[] NewInstance = "newInstance".toCharArray(); //$NON-NLS-1$
 	public static final char[] NewInstanceSignature = "(Ljava/lang/Class;[I)Ljava/lang/Object;".toCharArray(); //$NON-NLS-1$
 	public static final char[] Next = "next".toCharArray();//$NON-NLS-1$
@@ -256,8 +262,31 @@
 	// java 7 java.lang.invoke.MethodHandle.invokeExact(..)/invokeGeneric(..)
 	public static final char[] JAVA_LANG_INVOKE_METHODHANDLE_POLYMORPHICSIGNATURE = "Ljava/lang/invoke/MethodHandle$PolymorphicSignature;".toCharArray(); //$NON-NLS-1$
 	// Java 8 lambda support
-	public static final char[] METAFACTORY = "metaFactory".toCharArray(); //$NON-NLS-1$
-	public static final char[] JAVA_LANG_INVOKE_LAMBDAMETAFACTORY_METAFACTORY_SIGNATURE = "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;".toCharArray(); //$NON-NLS-1$
+	public static final char[] METAFACTORY = "metafactory".toCharArray(); //$NON-NLS-1$
+	public static final char[] JAVA_LANG_INVOKE_LAMBDAMETAFACTORY_METAFACTORY_SIGNATURE = "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;".toCharArray(); //$NON-NLS-1$
+	public static final char[] ALTMETAFACTORY = "altMetafactory".toCharArray(); //$NON-NLS-1$
+	public static final char[] JAVA_LANG_INVOKE_LAMBDAMETAFACTORY_ALTMETAFACTORY_SIGNATURE = 
+			"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;".toCharArray(); //$NON-NLS-1$
+	public static final char[] JavaLangInvokeSerializedLambda = "Ljava/lang/invoke/SerializedLambda;".toCharArray(); //$NON-NLS-1$
+	public static final char[] JavaLangInvokeSerializedLambdaConstantPoolName = "java/lang/invoke/SerializedLambda".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetImplMethodName = "getImplMethodName".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetImplMethodNameSignature = "()Ljava/lang/String;".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetImplMethodKind = "getImplMethodKind".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetImplMethodKindSignature = "()I".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetFunctionalInterfaceClass = "getFunctionalInterfaceClass".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetFunctionalInterfaceClassSignature = "()Ljava/lang/String;".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetFunctionalInterfaceMethodName = "getFunctionalInterfaceMethodName".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetFunctionalInterfaceMethodNameSignature = "()Ljava/lang/String;".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetFunctionalInterfaceMethodSignature = "getFunctionalInterfaceMethodSignature".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetFunctionalInterfaceMethodSignatureSignature = "()Ljava/lang/String;".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetImplClass = "getImplClass".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetImplClassSignature = "()Ljava/lang/String;".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetImplMethodSignature = "getImplMethodSignature".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetImplMethodSignatureSignature = "()Ljava/lang/String;".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetCapturedArg = "getCapturedArg".toCharArray(); //$NON-NLS-1$
+	public static final char[] GetCapturedArgSignature = "(I)Ljava/lang/Object;".toCharArray(); //$NON-NLS-1$
+	// Java 8 repeatable annotation support
+	public static final char[] JAVA_LANG_ANNOTATION_REPEATABLE = "Ljava/lang/annotation/Repeatable;".toCharArray(); //$NON-NLS-1$
 
 	public static final char[] HashCode = "hashCode".toCharArray(); //$NON-NLS-1$
 	public static final char[] HashCodeSignature = "()I".toCharArray(); //$NON-NLS-1$; 
@@ -754,7 +783,7 @@
 	public int literalIndexForMethodHandle(MethodBinding binding) {
 		boolean isInterface = binding.declaringClass.isInterface();
 		int referenceKind =
-			isInterface ? MethodHandleRefKindInvokeInterface
+			isInterface ? binding.isStatic() ? MethodHandleRefKindInvokeStatic : binding.isPrivate() ? MethodHandleRefKindInvokeSpecial : MethodHandleRefKindInvokeInterface
 			: binding.isConstructor() ? MethodHandleRefKindNewInvokeSpecial
 			: binding.isStatic() ? MethodHandleRefKindInvokeStatic
 			: MethodHandleRefKindInvokeVirtual;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ExceptionLabel.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ExceptionLabel.java
index 5441a58..0fd1071 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ExceptionLabel.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/ExceptionLabel.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
@@ -17,6 +13,7 @@
 package org.aspectj.org.eclipse.jdt.internal.compiler.codegen;
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 
@@ -26,11 +23,13 @@
 	private int count = 0; // incremented each time placeStart or placeEnd is called
 	public TypeBinding exceptionType;
 	public TypeReference exceptionTypeReference;
+	public Annotation [] se7Annotations;
 
-public ExceptionLabel(CodeStream codeStream, TypeBinding exceptionType, TypeReference exceptionTypeReference) {
+public ExceptionLabel(CodeStream codeStream, TypeBinding exceptionType, TypeReference exceptionTypeReference, Annotation [] se7Annotations) {
 	super(codeStream);
 	this.exceptionType = exceptionType;
 	this.exceptionTypeReference = exceptionTypeReference;
+	this.se7Annotations = se7Annotations;
 }
 
 public ExceptionLabel(CodeStream codeStream, TypeBinding exceptionType) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.java
index 68aeef1..87c1bcb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.java
@@ -4,20 +4,16 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409246 - [1.8][compiler] Type annotations on catch parameters not handled properly
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.codegen;
 
-import java.util.List;
-
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.UnionTypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
@@ -30,12 +26,12 @@
 		super(codeStream, exceptionType);
 	}
 	
-	public void initialize(UnionTypeReference typeReference) {
+	public void initialize(UnionTypeReference typeReference, Annotation [] annotations) {
 		TypeReference[] typeReferences = typeReference.typeReferences;
 		int length = typeReferences.length;
 		this.exceptionLabels = new ExceptionLabel[length];
 		for (int i = 0; i < length; i++) {
-			this.exceptionLabels[i] = new ExceptionLabel(this.codeStream, typeReferences[i].resolvedType, typeReferences[i]);
+			this.exceptionLabels[i] = new ExceptionLabel(this.codeStream, typeReferences[i].resolvedType, typeReferences[i], i == 0 ? annotations : null);
 		}
 	}
 	public void place() {
@@ -60,16 +56,4 @@
 		}
 		return temp;
 	}
-
-	public int getAllAnnotationContexts(int tableIndex, List allTypeAnnotationContexts) {
-		int localCount = 0;
-		for (int i = 0, max = this.exceptionLabels.length; i < max; i++) {
-			ExceptionLabel exceptionLabel = this.exceptionLabels[i];
-			if (exceptionLabel.exceptionTypeReference != null) { // ignore those which cannot be annotated
-				exceptionLabel.exceptionTypeReference.getAllAnnotationContexts(AnnotationTargetTypeConstants.EXCEPTION_PARAMETER, tableIndex + localCount, allTypeAnnotationContexts);
-			}
-			tableIndex++;
-		}
-		return localCount;
-	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Opcodes.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Opcodes.java
index d7ff101..30354ed 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Opcodes.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/Opcodes.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.java
index 62e454a..8545ee1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.java
@@ -309,7 +309,7 @@
 	int localsLength = frame.locals == null ? 0 : frame.locals.length;
 	buffer.append(MessageFormat.format(
 		pattern,
-		new String[] {
+		new Object[] {
 			Integer.toString(frame.pc),
 			Integer.toString(frame.getNumberOfLocals()),
 			Integer.toString(frame.numberOfStackItems),
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.java
index 772c999..64e58b3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2011 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
@@ -30,6 +30,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.AbortMethod;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class StackMapFrameCodeStream extends CodeStream {
 	public static class ExceptionMarker implements Comparable {
 		public char[] constantPoolName;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java
index 844bc6b..dc127fb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java
@@ -1,18 +1,17 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2013 IBM Corporation and others.
+ * Copyright (c) 2012, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409247 - [1.8][compiler] Verify error with code allocating multidimensional array
+ *                          Bug 409517 - [1.8][compiler] Type annotation problems on more elaborate array references
+ *                          Bug 409250 - [1.8][compiler] Various loose ends in 308 code generation
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.codegen;
 
@@ -21,13 +20,14 @@
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.ClassFile;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
-import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 
+@SuppressWarnings({"rawtypes"})
 public class TypeAnnotationCodeStream extends StackMapFrameCodeStream {
 	public List allTypeAnnotationContexts;
 
@@ -37,8 +37,8 @@
 		this.allTypeAnnotationContexts = new ArrayList();
 	}
 	
-	private void addAnnotationContext(TypeReference typeReference, int info, int targetType, Annotation[][] annotationsOnDimensions, int dimensions) {
-		typeReference.getAllAnnotationContexts(targetType, info, this.allTypeAnnotationContexts, annotationsOnDimensions, dimensions);
+	private void addAnnotationContext(TypeReference typeReference, int info, int targetType, ArrayAllocationExpression allocationExpression) {
+		allocationExpression.getAllAnnotationContexts(targetType, info, this.allTypeAnnotationContexts);
 	}
 	
 	private void addAnnotationContext(TypeReference typeReference, int info, int targetType) {
@@ -60,11 +60,11 @@
 			TypeReference typeReference,
 			TypeBinding typeBinding,
 			int dimensions,
-			Annotation [][] annotationsOnDimensions) {
+			ArrayAllocationExpression allocationExpression) {
 		if (typeReference != null && (typeReference.bits & ASTNode.HasTypeAnnotations) != 0) {
-			addAnnotationContext(typeReference, this.position, AnnotationTargetTypeConstants.NEW, annotationsOnDimensions, dimensions);
+			addAnnotationContext(typeReference, this.position, AnnotationTargetTypeConstants.NEW, allocationExpression);
 		}
-		super.multianewarray(typeReference, typeBinding, dimensions, annotationsOnDimensions);
+		super.multianewarray(typeReference, typeBinding, dimensions, allocationExpression);
 	}
 
 	public void new_(TypeReference typeReference, TypeBinding typeBinding) {
@@ -74,18 +74,31 @@
 		super.new_(typeReference, typeBinding);
 	}
 	
-	public void newArray(TypeReference typeReference, Annotation[][] annotationsOnDimensions, ArrayBinding arrayBinding) {
+	public void newArray(TypeReference typeReference, ArrayAllocationExpression allocationExpression, ArrayBinding arrayBinding) {
 		if (typeReference != null && (typeReference.bits & ASTNode.HasTypeAnnotations) != 0) {
-			addAnnotationContext(typeReference, this.position, AnnotationTargetTypeConstants.NEW, annotationsOnDimensions, 1);
+			addAnnotationContext(typeReference, this.position, AnnotationTargetTypeConstants.NEW, allocationExpression);
 		}
-		super.newArray(typeReference, annotationsOnDimensions, arrayBinding);
+		super.newArray(typeReference, allocationExpression, arrayBinding);
 	}
 	
 	public void checkcast(TypeReference typeReference, TypeBinding typeBinding) {
-		if (typeReference != null && (typeReference.bits & ASTNode.HasTypeAnnotations) != 0) {
-			addAnnotationContext(typeReference, this.position, AnnotationTargetTypeConstants.CAST);
+		/* We use a slightly sub-optimal generation for intersection casts by resorting to a runtime cast for every intersecting type, but in
+		   reality this should not matter. In its intended use form such as (I & Serializable) () -> {}, no cast is emitted at all. Also note
+		   intersection cast type references cannot nest i.e ((X & I) & J) is not valid syntax.
+		*/
+		if (typeReference != null) {
+			TypeReference [] typeReferences = typeReference.getTypeReferences();
+			for (int i = typeReferences.length - 1; i >= 0; i--) {  // need to emit right to left.
+				typeReference = typeReferences[i];
+				if (typeReference != null) {
+					if ((typeReference.bits & ASTNode.HasTypeAnnotations) != 0)
+						addAnnotationContext(typeReference, this.position, i, AnnotationTargetTypeConstants.CAST);
+					super.checkcast(typeReference, typeReference.resolvedType);
+				}
+			}
+		} else {
+			super.checkcast(null, typeBinding);
 		}
-		super.checkcast(typeReference, typeBinding);
 	}
 	
 	public void invoke(byte opcode, MethodBinding methodBinding, TypeBinding declaringClass, TypeReference[] typeArguments) {
@@ -95,7 +108,7 @@
 					: AnnotationTargetTypeConstants.METHOD_INVOCATION_TYPE_ARGUMENT;
 			for (int i = 0, max = typeArguments.length; i < max; i++) {
 				TypeReference typeArgument = typeArguments[i];
-				if ((typeArgument.bits & ASTNode.HasTypeAnnotations) != 0) { // TODO can check this at a higher level?
+				if ((typeArgument.bits & ASTNode.HasTypeAnnotations) != 0) {
 					addAnnotationContext(typeArgument, this.position, i, targetType);
 				}
 			}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryField.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryField.java
index 728025e..fa5293c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryField.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryField.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
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *         Bug 407191 - [1.8] Binary access support for type annotations
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.env;
 
@@ -19,6 +21,11 @@
 IBinaryAnnotation[] getAnnotations();
 
 /**
+ * Answer the runtime visible and invisible type annotations for this field or null if none.
+ */
+IBinaryTypeAnnotation[] getTypeAnnotations();
+
+/**
  *
  * @return org.aspectj.org.eclipse.jdt.internal.compiler.Constant
  */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryMethod.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryMethod.java
index 27e82a4..24bc022 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryMethod.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryMethod.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
@@ -8,6 +8,8 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for bug 186342 - [compiler][null] Using annotations for null checking
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *         Bug 407191 - [1.8] Binary access support for type annotations
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.env;
 
@@ -89,4 +91,9 @@
  * Answer whether the receiver represents a class initializer method.
  */
 boolean isClinit();
+
+/**
+ * Answer the type annotations on this method.
+ */
+IBinaryTypeAnnotation[] getTypeAnnotations();
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryType.java
index 1e0a01f..0b39b7c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryType.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
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *         bug 407191 - [1.8] Binary access support for type annotations
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.env;
 
@@ -23,6 +25,13 @@
  */
 
 IBinaryAnnotation[] getAnnotations();
+
+/**
+ * Answer the runtime visible and invisible type annotations for this type or null if none.
+ */
+
+IBinaryTypeAnnotation[] getTypeAnnotations();
+
 /**
  * Answer the enclosing method (including method selector and method descriptor), or
  * null if none.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryTypeAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryTypeAnnotation.java
new file mode 100644
index 0000000..3df6ff4
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/env/IBinaryTypeAnnotation.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2013 GoPivotal, Inc. All Rights Reserved.
+ * 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:
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *          Bug 407191 - [1.8] Binary access support for type annotations
+ *******************************************************************************/
+package org.aspectj.org.eclipse.jdt.internal.compiler.env;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.AnnotationTargetTypeConstants;
+
+/**
+ * This represents class file information about an annotation instance.
+ */
+public interface IBinaryTypeAnnotation {
+	
+	static int[] NO_TYPE_PATH = new int[0];
+
+/**
+ * @return the annotation
+ */
+IBinaryAnnotation getAnnotation();
+
+/**
+ * @return the target type, according to the constants in {@link AnnotationTargetTypeConstants}
+ */
+int getTargetType();
+
+/**
+ * 
+ * @return the raw type path data, each pair of ints is a type path entry
+ */
+int[] getTypePath();
+
+/**
+ * Applicable for target type 0x10(CLASS_EXTENDS)
+ * 
+ * @return the supertype index. -1 (65535) for superclass, 0..n for superinterfaces
+ */
+int getSupertypeIndex();
+
+/**
+ * Applicable for target type 0x00(CLASS_TYPE_PARAMETER), 0x01(METHOD_TYPE_PARAMETER)
+ * 
+ * @return the type parameter index (0 based)
+ */
+int getTypeParameterIndex();
+
+/**
+ * Applicable for target type 0x11(CLASS_TYPE_PARAMETER_BOUND), 0x12(METHOD_TYPE_PARAMETER_BOUND)
+ * 
+ * @return the bound index
+ */
+int getBoundIndex();
+
+/**
+ * Applicable for target type 0x16(METHOD_FORMAL_PARAMETER)
+ * 
+ * @return the method formal parameter index
+ */
+int getMethodFormalParameterIndex();
+
+/**
+ * Applicable for target type 0x17(THROWS)
+ * 
+ * @return the throws type index
+ */
+int getThrowsTypeIndex();
+
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java
index 614276c..4ed6d16 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java
@@ -36,6 +36,7 @@
  * Reflects the context of code analysis, keeping track of enclosing
  *	try statements, exception handlers, etc...
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ExceptionHandlingFlowContext extends FlowContext {
 
 	public final static int BitCacheSize = 32; // 32 bits per int
@@ -148,7 +149,7 @@
 		int index = this.indexes.get(this.handledExceptions[i]);
 		if ((this.isReached[index / ExceptionHandlingFlowContext.BitCacheSize] & 1 << (index % ExceptionHandlingFlowContext.BitCacheSize)) == 0) {
 			for (int j = 0; j < docCommentReferencesLength; j++) {
-				if (docCommentReferences[j] == this.handledExceptions[i]) {
+				if (TypeBinding.equalsEquals(docCommentReferences[j], this.handledExceptions[i])) {
 					continue nextHandledException;
 				}
 			}
@@ -189,7 +190,7 @@
 		TypeReference[] typeRefs = ((UnionTypeReference)node).typeReferences;
 		for (int i = 0, len = typeRefs.length; i < len; i++) {
 			TypeReference typeRef = typeRefs[i];
-			if (typeRef.resolvedType == this.handledExceptions[index]) return typeRef;
+			if (TypeBinding.equalsEquals(typeRef.resolvedType, this.handledExceptions[index])) return typeRef;
 		}	
 	} 
 	return node;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java
index 9fc3fb2..14f057a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java
@@ -15,6 +15,8 @@
  *								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
+ *     Jesper S Moller - Contributions for
+ *								bug 404657 - [1.8][compiler] Analysis for effectively final variables fails to consider loops
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.flow;
 
@@ -25,6 +27,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.VariableBinding;
@@ -77,10 +80,13 @@
 		} else {
 			// final local variable
 			if (flowInfo.isPotentiallyAssigned((LocalVariableBinding)variable)) {
-				complained = true;
-				scope.problemReporter().duplicateInitializationOfFinalLocal(
-					(LocalVariableBinding) variable,
-					this.finalAssignments[i]);
+				variable.tagBits &= ~TagBits.IsEffectivelyFinal;
+				if (variable.isFinal()) {
+					complained = true;
+					scope.problemReporter().duplicateInitializationOfFinalLocal(
+						(LocalVariableBinding) variable,
+						this.finalAssignments[i]);
+				}
 			}
 		}
 		// any reference reported at this level is removed from the parent context
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowContext.java
index 99d2b2e..b4b324a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowContext.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -57,6 +53,7 @@
  * Reflects the context of code analysis, keeping track of enclosing
  *	try statements, exception handlers, etc...
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class FlowContext implements TypeConstants {
 
 	// preempt marks looping contexts
@@ -485,7 +482,7 @@
 		if ((exception = raisedExceptions[i]) != null) {
 			// only one complaint if same exception declared to be thrown more than once
 			for (int j = 0; j < i; j++) {
-				if (raisedExceptions[j] == exception) continue nextReport; // already reported
+				if (TypeBinding.equalsEquals(raisedExceptions[j], exception)) continue nextReport; // already reported
 			}
 			// AspectJ Extension Begin
 			// was scope.problemReporter().unhandledException(exception, location); see pr151772
@@ -507,7 +504,7 @@
 	do {
 		if (current instanceof InitializationFlowContext) {
 			InitializationFlowContext initializationContext = (InitializationFlowContext) current;
-			if (((TypeDeclaration)initializationContext.associatedNode).binding == declaringType) {
+			if (TypeBinding.equalsEquals(((TypeDeclaration)initializationContext.associatedNode).binding, declaringType)) {
 				return inits;
 			}
 			inits = initializationContext.initsBeforeContext;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowInfo.java
index 594f20b..3edd333 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/FlowInfo.java
@@ -11,6 +11,7 @@
  *			     				bug 292478 - Report potentially null across variable assignment
  *     							bug 332637 - Dead Code detection removing code that isn't dead
  *								bug 394768 - [compiler][resource] Incorrect resource leak warning when creating stream in conditional
+ *								Bug 411964 - [1.8][null] leverage null type annotation in foreach statement
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.flow;
 
@@ -18,6 +19,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.IfStatement;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 
 public abstract class FlowInfo {
 
@@ -532,7 +534,11 @@
 		// if a variable is only initialized in one branch and not initialized in the other,
 		// then we need to cast a doubt on its initialization in the merged info
 		mergedInfo.definiteInits &= initsWhenFalse.unconditionalCopy().definiteInits;
-		
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=415997, classify unreachability precisely, IsElseStatementUnreachable could be due to null analysis
+		if ((mergedInfo.tagBits & FlowInfo.UNREACHABLE_OR_DEAD) != 0 && (initsWhenFalse.tagBits & FlowInfo.UNREACHABLE) == FlowInfo.UNREACHABLE_BY_NULLANALYSIS) {
+			mergedInfo.tagBits &= ~UNREACHABLE_OR_DEAD;
+			mergedInfo.tagBits |= UNREACHABLE_BY_NULLANALYSIS;
+		}
 	}
 	else if ((flowInfo.tagBits & FlowInfo.UNREACHABLE) == 0 &&
 			(ifStatement.bits & ASTNode.IsThenStatementUnreachable) != 0 && initsWhenTrue != FlowInfo.DEAD_END
@@ -548,6 +554,11 @@
 		// if a variable is only initialized in one branch and not initialized in the other,
 		// then we need to cast a doubt on its initialization in the merged info
 		mergedInfo.definiteInits &= initsWhenTrue.unconditionalCopy().definiteInits;
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=415997, classify unreachability precisely, IsThenStatementUnreachable could be due to null analysis
+		if ((mergedInfo.tagBits & FlowInfo.UNREACHABLE_OR_DEAD) != 0 && (initsWhenTrue.tagBits & FlowInfo.UNREACHABLE) == FlowInfo.UNREACHABLE_BY_NULLANALYSIS) {
+			mergedInfo.tagBits &= ~UNREACHABLE_OR_DEAD;
+			mergedInfo.tagBits |= UNREACHABLE_BY_NULLANALYSIS;
+		}
 	}
 	else {
 		mergedInfo = initsWhenTrue.
@@ -654,4 +665,16 @@
  * @param local
  */
 abstract public void resetAssignmentInfo(LocalVariableBinding local);
+
+/**
+ * Check whether 'tagBits' contains either {@link TagBits#AnnotationNonNull} or {@link TagBits#AnnotationNullable},
+ * and answer the corresponding null status ({@link #NON_NULL} etc.).
+ */
+public static int tagBitsToNullStatus(long tagBits) {
+	if ((tagBits & TagBits.AnnotationNonNull) != 0)
+		return NON_NULL;
+	if ((tagBits & TagBits.AnnotationNullable) != 0)
+		return POTENTIALLY_NULL | POTENTIALLY_NON_NULL;
+	return UNKNOWN;
+}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.java
index 502cdea..55a85e3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.java
@@ -18,6 +18,9 @@
  *								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
+ *								Bug 415413 - [compiler][null] NullpointerException in Null Analysis caused by interaction of LoopingFlowContext and FinallyFlowContext
+ *     Jesper S Moller - contributions for
+ *								bug 404657 - [1.8][compiler] Analysis for effectively final variables fails to consider loops
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.flow;
 
@@ -33,6 +36,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.VariableBinding;
@@ -41,6 +45,7 @@
  * Reflects the context of code analysis, keeping track of enclosing
  *	try statements, exception handlers, etc...
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class LoopingFlowContext extends SwitchFlowContext {
 
 	public BranchLabel continueLabel;
@@ -120,10 +125,13 @@
 			}
 		} else {
 			if (flowInfo.isPotentiallyAssigned((LocalVariableBinding)variable)) {
-				complained = true;
-				scope.problemReporter().duplicateInitializationOfFinalLocal(
-					(LocalVariableBinding) variable,
-					this.finalAssignments[i]);
+				variable.tagBits &= ~TagBits.IsEffectivelyFinal;
+				if (variable.isFinal()) {
+					complained = true;
+					scope.problemReporter().duplicateInitializationOfFinalLocal(
+						(LocalVariableBinding) variable,
+						this.finalAssignments[i]);
+				}
 			}
 		}
 		// any reference reported at this level is removed from the parent context where it
@@ -262,7 +270,7 @@
 					if (nullStatus != FlowInfo.NON_NULL) {
 						this.parent.recordNullityMismatch(scope, (Expression)location, this.providedExpectedTypes[i][0], this.providedExpectedTypes[i][1], nullStatus);
 					}
-					break;
+					continue; // no more delegation to parent
 				case EXIT_RESOURCE:
 						FakedTrackingVariable trackingVar = local.closeTracker;
 						if (trackingVar != null) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo.java
index 6aa7f95..d06cef6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo.java
@@ -94,6 +94,22 @@
 	// Constants
 	public static final int BitCacheSize = 64; // 64 bits in a long.
 
+/* fakeInitializedFlowInfo: For Lambda expressions tentative analysis during overload resolution. 
+   We presume that any and all outer locals touched by the lambda are definitely assigned and 
+   effectively final. Whether they are or not is immaterial for overload analysis (errors encountered
+   in the body are not supposed to influence the resolution. It is pertinent only for the eventual 
+   resolution/analysis post overload resolution. For lambda's the problem is that we start the control/data
+   flow analysis abruptly at the start of the lambda, so we need to present a cogent world view and hence 
+   all this charade.
+*/
+public static UnconditionalFlowInfo fakeInitializedFlowInfo(int localsCount, int maxFieldCount) {
+		UnconditionalFlowInfo flowInfo = new UnconditionalFlowInfo();
+		flowInfo.maxFieldCount = maxFieldCount;
+		for (int i = 0; i < localsCount; i++)
+			flowInfo.markAsDefinitelyAssigned(i + maxFieldCount);
+		return flowInfo;
+}
+
 public FlowInfo addInitializationsFrom(FlowInfo inits) {
 	return addInfoFrom(inits, true);
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
index 418bcfa..c86a3da 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Benjamin Muskalla - Contribution for bug 239066
@@ -25,6 +21,7 @@
  *								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
+ *								bug 407297 - [1.8][compiler] Control generation of parameter names by option
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.impl;
 
@@ -42,6 +39,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class CompilerOptions {
 
 	/**
@@ -51,6 +49,7 @@
 	public static final String OPTION_LineNumberAttribute = "org.eclipse.jdt.core.compiler.debug.lineNumber"; //$NON-NLS-1$
 	public static final String OPTION_SourceFileAttribute = "org.eclipse.jdt.core.compiler.debug.sourceFile"; //$NON-NLS-1$
 	public static final String OPTION_PreserveUnusedLocal = "org.eclipse.jdt.core.compiler.codegen.unusedLocal"; //$NON-NLS-1$
+	public static final String OPTION_MethodParametersAttribute = "org.eclipse.jdt.core.compiler.codegen.methodParameters"; //$NON-NLS-1$
 	public static final String OPTION_DocCommentSupport= "org.eclipse.jdt.core.compiler.doc.comment.support"; //$NON-NLS-1$
 	public static final String OPTION_ReportMethodWithConstructorName = "org.eclipse.jdt.core.compiler.problem.methodWithConstructorName"; //$NON-NLS-1$
 	public static final String OPTION_ReportOverridingPackageDefaultMethod = "org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod"; //$NON-NLS-1$
@@ -144,6 +143,10 @@
 	public static final String OPTION_ReportOverridingMethodWithoutSuperInvocation =  "org.eclipse.jdt.core.compiler.problem.overridingMethodWithoutSuperInvocation"; //$NON-NLS-1$
 	public static final String OPTION_GenerateClassFiles = "org.eclipse.jdt.core.compiler.generateClassFiles"; //$NON-NLS-1$
 	public static final String OPTION_Process_Annotations = "org.eclipse.jdt.core.compiler.processAnnotations"; //$NON-NLS-1$
+	// OPTION_Store_Annotations: undocumented option for testing purposes
+	public static final String OPTION_Store_Annotations = "org.eclipse.jdt.core.compiler.storeAnnotations"; //$NON-NLS-1$
+	public static final String OPTION_EmulateJavacBug8031744 = "org.eclipse.jdt.core.compiler.emulateJavacBug8031744"; //$NON-NLS-1$
+	public static final String OPTION_PostResolutionRawTypeCompatibilityCheck = "org.eclipse.jdt.core.compiler.postResolutionRawTypeCompatibilityCheck"; //$NON-NLS-1$
 	public static final String OPTION_ReportRedundantSuperinterface =  "org.eclipse.jdt.core.compiler.problem.redundantSuperinterface"; //$NON-NLS-1$
 	public static final String OPTION_ReportComparingIdentical =  "org.eclipse.jdt.core.compiler.problem.comparingIdentical"; //$NON-NLS-1$
 	public static final String OPTION_ReportMissingSynchronizedOnInheritedMethod =  "org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod"; //$NON-NLS-1$
@@ -167,6 +170,7 @@
 	public static final String OPTION_NullableAnnotationName = "org.eclipse.jdt.core.compiler.annotation.nullable"; //$NON-NLS-1$
 	public static final String OPTION_NonNullAnnotationName = "org.eclipse.jdt.core.compiler.annotation.nonnull"; //$NON-NLS-1$
 	public static final String OPTION_NonNullByDefaultAnnotationName = "org.eclipse.jdt.core.compiler.annotation.nonnullbydefault"; //$NON-NLS-1$
+	public static final String OPTION_ReportUninternedIdentityComparison = "org.eclipse.jdt.core.compiler.problem.uninternedIdentityComparison"; //$NON-NLS-1$
 	// defaults for the above:
 	static final char[][] DEFAULT_NULLABLE_ANNOTATION_NAME = CharOperation.splitOn('.', "org.eclipse.jdt.annotation.Nullable".toCharArray()); //$NON-NLS-1$
 	static final char[][] DEFAULT_NONNULL_ANNOTATION_NAME = CharOperation.splitOn('.', "org.eclipse.jdt.annotation.NonNull".toCharArray()); //$NON-NLS-1$
@@ -316,6 +320,8 @@
 	
 	/** Classfile debug information, may contain source file name, line numbers, local variable tables, etc... */
 	public int produceDebugAttributes; 
+	/** Classfile method patameters information as per JEP 118... */
+	public boolean produceMethodParameters; 
 	/** Compliance level for the compiler, refers to a JDK version, e.g. {@link ClassFileConstants#JDK1_4} */
 	public long complianceLevel;
 	/** Original compliance level for the compiler, refers to a JDK version, e.g. {@link ClassFileConstants#JDK1_4},
@@ -411,6 +417,8 @@
 	public boolean processAnnotations;
 	/** Store annotations */
 	public boolean storeAnnotations;
+	/** extra check for raw type compatibility post overload resolution */
+	public boolean postResolutionRawTypeCompatibilityCheck = true;
 	/** Specify if need to report missing override annotation for a method implementing an interface method (java 1.6 and above)*/
 	public boolean reportMissingOverrideAnnotationForInterfaceMethodImplementation;
 	/** Indicate if annotation processing generates classfiles */
@@ -456,6 +464,9 @@
 	/** Should immediate null-check for fields be considered during null analysis (syntactical match)? */
 	public boolean enableSyntacticNullAnalysisForFields;
 
+	public boolean complainOnUninternedIdentityComparison;
+	public boolean emulateJavacBug8031744 = true;
+
 	// keep in sync with warningTokenToIrritant and warningTokenFromIrritant
 	public final static String[] warningTokens = {
 		"all", //$NON-NLS-1$
@@ -1035,6 +1046,7 @@
 		optionsMap.put(OPTION_LocalVariableAttribute, (this.produceDebugAttributes & ClassFileConstants.ATTR_VARS) != 0 ? GENERATE : DO_NOT_GENERATE);
 		optionsMap.put(OPTION_LineNumberAttribute, (this.produceDebugAttributes & ClassFileConstants.ATTR_LINES) != 0 ? GENERATE : DO_NOT_GENERATE);
 		optionsMap.put(OPTION_SourceFileAttribute, (this.produceDebugAttributes & ClassFileConstants.ATTR_SOURCE) != 0 ? GENERATE : DO_NOT_GENERATE);
+		optionsMap.put(OPTION_MethodParametersAttribute, this.produceMethodParameters ? GENERATE : DO_NOT_GENERATE);
 		optionsMap.put(OPTION_PreserveUnusedLocal, this.preserveAllLocalVariables ? PRESERVE : OPTIMIZE_OUT);
 		optionsMap.put(OPTION_DocCommentSupport, this.docCommentSupport ? ENABLED : DISABLED);
 		optionsMap.put(OPTION_ReportMethodWithConstructorName, getSeverityString(MethodWithConstructorName));
@@ -1130,6 +1142,9 @@
 		optionsMap.put(OPTION_ReportOverridingMethodWithoutSuperInvocation, getSeverityString(OverridingMethodWithoutSuperInvocation));
 		optionsMap.put(OPTION_GenerateClassFiles, this.generateClassFiles ? ENABLED : DISABLED);
 		optionsMap.put(OPTION_Process_Annotations, this.processAnnotations ? ENABLED : DISABLED);
+		optionsMap.put(OPTION_Store_Annotations, this.storeAnnotations ? ENABLED : DISABLED);
+		optionsMap.put(OPTION_EmulateJavacBug8031744, this.emulateJavacBug8031744 ? ENABLED : DISABLED);
+		optionsMap.put(OPTION_PostResolutionRawTypeCompatibilityCheck, this.postResolutionRawTypeCompatibilityCheck ? ENABLED : DISABLED);
 		optionsMap.put(OPTION_ReportRedundantSuperinterface, getSeverityString(RedundantSuperinterface));
 		optionsMap.put(OPTION_ReportComparingIdentical, getSeverityString(ComparingIdentical));
 		optionsMap.put(OPTION_ReportMissingSynchronizedOnInheritedMethod, getSeverityString(MissingSynchronizedModifierInInheritedMethod));
@@ -1158,6 +1173,7 @@
 		optionsMap.put(OPTION_SyntacticNullAnalysisForFields, this.enableSyntacticNullAnalysisForFields ? ENABLED : DISABLED);
 		optionsMap.put(OPTION_InheritNullAnnotations, this.inheritNullAnnotations ? ENABLED : DISABLED);
 		optionsMap.put(OPTION_ReportNonnullParameterAnnotationDropped, getSeverityString(NonnullParameterAnnotationDropped));
+		optionsMap.put(OPTION_ReportUninternedIdentityComparison, this.complainOnUninternedIdentityComparison ? ENABLED : DISABLED);
 		return optionsMap;
 	}
 
@@ -1220,6 +1236,8 @@
 
 		// indicates if unused/optimizable local variables need to be preserved (debugging purpose)
 		this.preserveAllLocalVariables = false;
+		
+		this.produceMethodParameters = false;
 
 		// indicates whether literal expressions are inlined at parse-time or not
 		this.parseLiteralExpressionsAsConstants = true;
@@ -1324,6 +1342,8 @@
 		this.analyseResourceLeaks = true;
 
 		this.reportMissingEnumCaseDespiteDefault = false;
+
+		this.complainOnUninternedIdentityComparison = false;
 	}
 
 	public void set(Map optionsMap) {
@@ -1516,6 +1536,13 @@
 				this.shareCommonFinallyBlocks = false;
 			}
 		}
+		if ((optionValue = optionsMap.get(OPTION_MethodParametersAttribute)) != null) {
+			if (GENERATE.equals(optionValue)) {
+				this.produceMethodParameters = true;
+			} else if (DO_NOT_GENERATE.equals(optionValue)) {
+				this.produceMethodParameters = false;
+			}
+		}
 		if ((optionValue = optionsMap.get(OPTION_SuppressWarnings)) != null) {
 			if (ENABLED.equals(optionValue)) {
 				this.suppressWarnings = true;
@@ -1634,6 +1661,7 @@
 			this.isAnnotationBasedNullAnalysisEnabled = ENABLED.equals(optionValue);
 		}
 		if (this.isAnnotationBasedNullAnalysisEnabled) {
+			this.storeAnnotations = true;
 			if ((optionValue = optionsMap.get(OPTION_ReportNullSpecViolation)) != null) {
 				if (ERROR.equals(optionValue)) {
 					this.errorThreshold.set(NullSpecViolation);
@@ -1777,7 +1805,37 @@
 				this.storeAnnotations = true; // annotation processing requires annotation to be stored
 			} else if (DISABLED.equals(optionValue)) {
 				this.processAnnotations = false;
-				this.storeAnnotations = false;
+				if (!this.isAnnotationBasedNullAnalysisEnabled)
+					this.storeAnnotations = false;
+			}
+		}
+		if ((optionValue = optionsMap.get(OPTION_Store_Annotations)) != null) {
+			if (ENABLED.equals(optionValue)) {
+				this.storeAnnotations = true;
+			} else if (DISABLED.equals(optionValue)) {
+				if (!this.isAnnotationBasedNullAnalysisEnabled && !this.processAnnotations)
+					this.storeAnnotations = false;
+			}
+		}
+		if ((optionValue = optionsMap.get(OPTION_EmulateJavacBug8031744)) != null) {
+			if (ENABLED.equals(optionValue)) {
+				this.emulateJavacBug8031744 = true;
+			} else if (DISABLED.equals(optionValue)) {
+				this.emulateJavacBug8031744 = false;
+			}
+		}
+		if ((optionValue = optionsMap.get(OPTION_PostResolutionRawTypeCompatibilityCheck)) != null) {
+			if (ENABLED.equals(optionValue)) {
+				this.postResolutionRawTypeCompatibilityCheck = true;
+			} else if (DISABLED.equals(optionValue)) {
+				this.postResolutionRawTypeCompatibilityCheck = false;
+			}
+		}
+		if ((optionValue = optionsMap.get(OPTION_ReportUninternedIdentityComparison)) != null) {
+			if (ENABLED.equals(optionValue)) {
+				this.complainOnUninternedIdentityComparison = true;
+			} else if (DISABLED.equals(optionValue)) {
+				this.complainOnUninternedIdentityComparison = false;
 			}
 		}
 	}
@@ -1786,6 +1844,7 @@
 		buf.append("\n\t- local variables debug attributes: ").append((this.produceDebugAttributes & ClassFileConstants.ATTR_VARS) != 0 ? "ON" : " OFF"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		buf.append("\n\t- line number debug attributes: ").append((this.produceDebugAttributes & ClassFileConstants.ATTR_LINES) != 0 ? "ON" : " OFF"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		buf.append("\n\t- source debug attributes: ").append((this.produceDebugAttributes & ClassFileConstants.ATTR_SOURCE) != 0 ? "ON" : " OFF"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		buf.append("\n\t- MethodParameters attributes: ").append(this.produceMethodParameters ? GENERATE : DO_NOT_GENERATE); //$NON-NLS-1$
 		buf.append("\n\t- preserve all local variables: ").append(this.preserveAllLocalVariables ? "ON" : " OFF"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		buf.append("\n\t- method with constructor name: ").append(getSeverityString(MethodWithConstructorName)); //$NON-NLS-1$
 		buf.append("\n\t- overridden package default method: ").append(getSeverityString(OverriddenPackageDefaultMethod)); //$NON-NLS-1$
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerStats.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerStats.java
index cd5c784..1ff1dae 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerStats.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/CompilerStats.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
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.impl;
 
+@SuppressWarnings("rawtypes")
 public class CompilerStats implements Comparable {
 
 	// overall
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ReferenceContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ReferenceContext.java
index 05b423e..192c111 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ReferenceContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/impl/ReferenceContext.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java
new file mode 100644
index 0000000..acb4281
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java
@@ -0,0 +1,409 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
+
+/* AnnotatableTypeSystem: Keep track of annotated types so as to provide unique bindings for identically annotated versions identical underlying "naked" types.
+   As of now, we ensure uniqueness only for marker annotated types and for others that default to all default attribute values, i.e two instances of @NonNull String 
+   would have the same binding, while @T(1) X and @T(2) X will not. Binding uniqueness is only a memory optimization and is not essential for correctness of compilation. 
+   Various subsystems should expect to determine binding identity/equality by calling TypeBinding.equalsEquals and not by using == operator.
+ 	
+   ATS is AnnotatableTypeSystem and not AnnotatedTypeSystem, various methods may actually return unannotated types if the input arguments do not specify any annotations 
+   and component types of the composite type being constructed are themselves also unannotated. We rely on the master type table maintained by TypeSystem and use 
+   getDerivedTypes() and cacheDerivedType() to get/put.
+*/
+
+public class AnnotatableTypeSystem extends TypeSystem {
+
+	private LookupEnvironment environment;
+	private boolean isAnnotationBasedNullAnalysisEnabled;
+	
+	public AnnotatableTypeSystem(LookupEnvironment environment) {
+		super(environment);
+		this.environment = environment;
+		this.isAnnotationBasedNullAnalysisEnabled = environment.globalOptions.isAnnotationBasedNullAnalysisEnabled;
+	}
+	
+	// Given a type, return all its annotated variants: parameter may be annotated.
+	public TypeBinding[] getAnnotatedTypes(TypeBinding type) {
+		
+		TypeBinding[] derivedTypes = getDerivedTypes(type);
+		final int length = derivedTypes.length;
+		TypeBinding [] annotatedVersions = new TypeBinding[length];
+		int versions = 0;
+		for (int i = 0; i < length; i++) {
+			final TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null)
+				break;
+			if (!derivedType.hasTypeAnnotations())
+				continue;
+			if (derivedType.id == type.id)
+				annotatedVersions[versions++] = derivedType;
+		}
+		
+		if (versions != length)
+			System.arraycopy(annotatedVersions, 0, annotatedVersions = new TypeBinding[versions], 0, versions);
+		return annotatedVersions;
+	}
+	
+	/* This method replaces the version that used to sit in LE. The parameter `annotations' is a flattened sequence of annotations, 
+	   where each dimension's annotations end with a sentinel null. Leaf type can be an already annotated type.
+	*/
+	public ArrayBinding getArrayType(TypeBinding leafType, int dimensions, AnnotationBinding [] annotations) {
+		
+		ArrayBinding nakedType = null;
+		TypeBinding[] derivedTypes = getDerivedTypes(leafType);
+		for (int i = 0, length = derivedTypes.length; i < length; i++) {
+			TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null) break;
+			if (!derivedType.isArrayType() || derivedType.dimensions() != dimensions || derivedType.leafComponentType() != leafType) //$IDENTITY-COMPARISON$
+				continue;
+			if (Util.effectivelyEqual(derivedType.getTypeAnnotations(), annotations)) 
+				return (ArrayBinding) derivedType;
+			if (!derivedType.hasTypeAnnotations())
+				nakedType = (ArrayBinding) derivedType;
+		}
+		if (nakedType == null)
+			nakedType = super.getArrayType(leafType, dimensions);
+		
+		if (!haveTypeAnnotations(leafType, annotations))
+			return nakedType;
+
+		ArrayBinding arrayType = new ArrayBinding(leafType, dimensions, this.environment);
+		arrayType.id = nakedType.id;
+		arrayType.setTypeAnnotations(annotations, this.isAnnotationBasedNullAnalysisEnabled);
+		return (ArrayBinding) cacheDerivedType(leafType, nakedType, arrayType);
+	}
+
+	public ArrayBinding getArrayType(TypeBinding leaftType, int dimensions) {
+		return getArrayType(leaftType, dimensions, Binding.NO_ANNOTATIONS);
+	}
+
+	public ReferenceBinding getMemberType(ReferenceBinding memberType, ReferenceBinding enclosingType) {
+		if (!haveTypeAnnotations(memberType, enclosingType))
+			return super.getMemberType(memberType, enclosingType);
+		return (ReferenceBinding) getAnnotatedType(memberType, enclosingType, memberType.getTypeAnnotations());
+	}
+	
+	public ParameterizedTypeBinding getParameterizedType(ReferenceBinding genericType, TypeBinding[] typeArguments, ReferenceBinding enclosingType, AnnotationBinding [] annotations) {
+		
+		if (genericType.hasTypeAnnotations())   // @NonNull (List<String>) and not (@NonNull List)<String>
+			throw new IllegalStateException();
+
+		ParameterizedTypeBinding nakedType = null;
+		TypeBinding[] derivedTypes = getDerivedTypes(genericType);
+		for (int i = 0, length = derivedTypes.length; i < length; i++) {
+			TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null)
+				break;
+			if (!derivedType.isParameterizedType() || derivedType.actualType() != genericType) //$IDENTITY-COMPARISON$
+				continue;
+			if (derivedType.enclosingType() != enclosingType || !Util.effectivelyEqual(derivedType.typeArguments(), typeArguments)) //$IDENTITY-COMPARISON$
+				continue;
+			if (Util.effectivelyEqual(annotations, derivedType.getTypeAnnotations()))
+				return (ParameterizedTypeBinding) derivedType;
+			if (!derivedType.hasTypeAnnotations())
+				nakedType = (ParameterizedTypeBinding) derivedType;
+		}
+		if (nakedType == null)
+			nakedType = super.getParameterizedType(genericType, typeArguments, enclosingType);
+		
+		if (!haveTypeAnnotations(genericType, enclosingType, typeArguments, annotations))
+			return nakedType;
+		
+		TypeBinding parameterizedType = new ParameterizedTypeBinding(genericType, typeArguments, enclosingType, this.environment);
+		parameterizedType.id = nakedType.id;
+		parameterizedType.setTypeAnnotations(annotations, this.isAnnotationBasedNullAnalysisEnabled);
+		return (ParameterizedTypeBinding) cacheDerivedType(genericType, nakedType, parameterizedType);
+	}
+	
+	public ParameterizedTypeBinding getParameterizedType(ReferenceBinding genericType, TypeBinding[] typeArguments, ReferenceBinding enclosingType) {
+		return getParameterizedType(genericType, typeArguments, enclosingType, Binding.NO_ANNOTATIONS);
+	}
+
+	public RawTypeBinding getRawType(ReferenceBinding genericType, ReferenceBinding enclosingType, AnnotationBinding [] annotations) {
+		
+		if (genericType.hasTypeAnnotations())
+			throw new IllegalStateException();
+		
+		RawTypeBinding nakedType = null;
+		TypeBinding[] derivedTypes = getDerivedTypes(genericType);
+		for (int i = 0, length = derivedTypes.length; i < length; i++) {
+			TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null)
+				break;
+			if (!derivedType.isRawType() || derivedType.actualType() != genericType || derivedType.enclosingType() != enclosingType) //$IDENTITY-COMPARISON$
+				continue;
+			if (Util.effectivelyEqual(derivedType.getTypeAnnotations(), annotations))
+				return (RawTypeBinding) derivedType;
+			if (!derivedType.hasTypeAnnotations())
+				nakedType = (RawTypeBinding) derivedType;
+		}
+		if (nakedType == null)
+			nakedType = super.getRawType(genericType, enclosingType);
+		
+		if (!haveTypeAnnotations(genericType, enclosingType, null, annotations))
+			return nakedType;
+	
+		RawTypeBinding rawType = new RawTypeBinding(genericType, enclosingType, this.environment);
+		rawType.id = nakedType.id;
+		rawType.setTypeAnnotations(annotations, this.isAnnotationBasedNullAnalysisEnabled);
+		return (RawTypeBinding) cacheDerivedType(genericType, nakedType, rawType);
+	}
+	
+	public RawTypeBinding getRawType(ReferenceBinding genericType, ReferenceBinding enclosingType) {
+		return getRawType(genericType, enclosingType, Binding.NO_ANNOTATIONS);
+	}
+	
+	public WildcardBinding getWildcard(ReferenceBinding genericType, int rank, TypeBinding bound, TypeBinding[] otherBounds, int boundKind, AnnotationBinding [] annotations) {
+		
+		if (genericType == null) // pseudo wildcard denoting composite bounds for lub computation
+			genericType = ReferenceBinding.LUB_GENERIC;
+
+		if (genericType.hasTypeAnnotations())
+			throw new IllegalStateException();
+		
+		WildcardBinding nakedType = null;
+		TypeBinding[] derivedTypes = getDerivedTypes(genericType);
+		for (int i = 0, length = derivedTypes.length; i < length; i++) {
+			TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null) 
+				break;
+			if (!derivedType.isWildcard() || derivedType.actualType() != genericType || derivedType.rank() != rank) //$IDENTITY-COMPARISON$
+				continue;
+			if (derivedType.boundKind() != boundKind || derivedType.bound() != bound || !Util.effectivelyEqual(derivedType.additionalBounds(), otherBounds)) //$IDENTITY-COMPARISON$
+				continue;
+			if (Util.effectivelyEqual(derivedType.getTypeAnnotations(), annotations))
+				return (WildcardBinding) derivedType;
+			if (!derivedType.hasTypeAnnotations())
+				nakedType = (WildcardBinding) derivedType;
+		}
+		
+		if (nakedType == null)
+			nakedType = super.getWildcard(genericType, rank, bound, otherBounds, boundKind);
+		
+		if (!haveTypeAnnotations(genericType, bound, otherBounds, annotations))
+			return nakedType;
+		
+		WildcardBinding wildcard = new WildcardBinding(genericType, rank, bound, otherBounds, boundKind, this.environment);
+		wildcard.id = nakedType.id;
+		wildcard.setTypeAnnotations(annotations, this.isAnnotationBasedNullAnalysisEnabled);
+		return (WildcardBinding) cacheDerivedType(genericType, nakedType, wildcard);
+	}
+
+	public WildcardBinding getWildcard(ReferenceBinding genericType, int rank, TypeBinding bound, TypeBinding[] otherBounds, int boundKind) {
+		return getWildcard(genericType, rank, bound, otherBounds, boundKind, Binding.NO_ANNOTATIONS);
+	}
+
+	/* Take a type and apply annotations to various components of it. By construction when we see the type reference @Outer Outer.@Middle Middle.@Inner Inner,
+	   we first construct the binding for Outer.Middle.Inner and then annotate various parts of it. Likewise for PQTR's binding.
+	*/
+	public TypeBinding getAnnotatedType(TypeBinding type, AnnotationBinding[][] annotations) {
+		
+		if (type == null || !type.isValidBinding() || annotations == null || annotations.length == 0)
+			return type;
+		
+		TypeBinding annotatedType = null;
+		switch (type.kind()) {
+			case Binding.ARRAY_TYPE:
+				ArrayBinding arrayBinding = (ArrayBinding) type;
+				annotatedType = getArrayType(arrayBinding.leafComponentType, arrayBinding.dimensions, flattenedAnnotations(annotations));
+				break;
+			case Binding.BASE_TYPE:
+			case Binding.TYPE:
+			case Binding.GENERIC_TYPE:
+			case Binding.PARAMETERIZED_TYPE:
+			case Binding.RAW_TYPE:
+			case Binding.TYPE_PARAMETER:
+			case Binding.WILDCARD_TYPE:
+				/* Taking the binding of QTR as an example, there could be different annotatable components, but we come in a with a single binding, e.g: 
+				   @T Z;                                      type => Z  annotations => [[@T]]
+				   @T Y.@T Z                                  type => Z  annotations => [[@T][@T]]
+				   @T X.@T Y.@T Z                             type => Z  annotations => [[@T][@T][@T]] 
+				   java.lang.@T X.@T Y.@T Z                   type => Z  annotations => [[][][@T][@T][@T]]
+				   in all these cases the incoming type binding is for Z, but annotations are for different levels. We need to align their layout for proper attribution.
+				 */
+				
+				if (type.isUnresolvedType() && CharOperation.indexOf('$', type.sourceName()) > 0)
+				    type = BinaryTypeBinding.resolveType(type, this.environment, true); // must resolve member types before asking for enclosingType
+				
+				int levels = type.depth() + 1;
+				TypeBinding [] types = new TypeBinding[levels];
+				types[--levels] = type;
+				TypeBinding enclosingType = type.enclosingType();
+				while (enclosingType != null) {
+					types[--levels] = enclosingType;
+					enclosingType = enclosingType.enclosingType();
+				}
+				// Locate the outermost type being annotated. Beware annotations.length could be > types.length (for package qualified names in QTR/PQTR)
+				levels = annotations.length;
+				int i, j = types.length - levels;
+				for (i = 0 ; i < levels; i++, j++) {
+					if (annotations[i] != null && annotations[i].length > 0)
+						break;
+				}
+				if (i == levels) // empty annotations array ? 
+					return type;
+				if (j < 0) // Not kosher, broken type that is not flagged as invalid while reporting compilation error ? don't touch.
+					return type;
+				// types[j] is the first component being annotated. Its annotations are annotations[i]
+				for (enclosingType = j == 0 ? null : types[j - 1]; i < levels; i++, j++) {
+					final TypeBinding currentType = types[j];
+					// while handling annotations from SE7 locations, take care not to drop existing annotations.
+					AnnotationBinding [] currentAnnotations = annotations[i] != null && annotations[i].length > 0 ? annotations[i] : currentType.getTypeAnnotations();
+					annotatedType = getAnnotatedType(currentType, enclosingType, currentAnnotations);
+					enclosingType = annotatedType;
+				}
+				break;
+			default:
+				throw new IllegalStateException();
+		}
+		return annotatedType;
+	}
+
+	/* Private subroutine for public APIs. Create an annotated version of the type. To materialize the annotated version, we can't use new since 
+	   this is a general purpose method designed to deal type bindings of all types. "Clone" the incoming type, specializing for any enclosing type 
+	   that may itself be possibly be annotated. This is so the binding for @Outer Outer.Inner != Outer.@Inner Inner != @Outer Outer.@Inner Inner. 
+	   Likewise so the bindings for @Readonly List<@NonNull String> != @Readonly List<@Nullable String> != @Readonly List<@Interned String> 
+	*/
+	private TypeBinding getAnnotatedType(TypeBinding type, TypeBinding enclosingType, AnnotationBinding[] annotations) {
+		TypeBinding nakedType = null;
+		TypeBinding[] derivedTypes = getDerivedTypes(type);
+		for (int i = 0, length = derivedTypes.length; i < length; i++) {
+			TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null) break;
+			
+			if (derivedType.enclosingType() != enclosingType || !Util.effectivelyEqual(derivedType.typeArguments(), type.typeArguments())) //$IDENTITY-COMPARISON$
+				continue;
+			
+			switch(type.kind()) {
+				case Binding.ARRAY_TYPE:
+					if (!derivedType.isArrayType() || derivedType.dimensions() != type.dimensions() || derivedType.leafComponentType() != type.leafComponentType()) //$IDENTITY-COMPARISON$
+						continue;
+					break;
+				case Binding.PARAMETERIZED_TYPE:
+					if (!derivedType.isParameterizedType() || derivedType.actualType() != type.actualType()) //$IDENTITY-COMPARISON$
+						continue;
+					break;
+				case Binding.RAW_TYPE:
+					if (!derivedType.isRawType() || derivedType.actualType() != type.actualType()) //$IDENTITY-COMPARISON$
+						continue;
+					break;
+				case Binding.WILDCARD_TYPE:
+					if (!derivedType.isWildcard() || derivedType.actualType() != type.actualType() || derivedType.rank() != type.rank() || derivedType.boundKind() != type.boundKind()) //$IDENTITY-COMPARISON$
+						continue;
+					if (derivedType.bound() != type.bound() || !Util.effectivelyEqual(derivedType.additionalBounds(), type.additionalBounds())) //$IDENTITY-COMPARISON$
+						continue;
+					break;
+				default:
+					switch(derivedType.kind()) {
+						case Binding.ARRAY_TYPE:
+						case Binding.PARAMETERIZED_TYPE:
+						case Binding.RAW_TYPE:
+						case Binding.WILDCARD_TYPE:
+						case Binding.INTERSECTION_CAST_TYPE:
+						case Binding.INTERSECTION_TYPE:
+							continue;
+					}
+					break;
+			}
+			if (Util.effectivelyEqual(derivedType.getTypeAnnotations(), annotations)) {
+				return derivedType;
+			}
+			if (!derivedType.hasTypeAnnotations())
+				nakedType = derivedType;
+		}
+		if (nakedType == null)
+			nakedType = getUnannotatedType(type);
+		
+		if (!haveTypeAnnotations(type, enclosingType, null, annotations))
+			return nakedType;
+		
+		TypeBinding annotatedType = type.clone(enclosingType);
+		annotatedType.id = nakedType.id;
+		annotatedType.setTypeAnnotations(annotations, this.isAnnotationBasedNullAnalysisEnabled);
+		TypeBinding keyType;
+		switch (type.kind()) {
+			case Binding.ARRAY_TYPE:
+				keyType = type.leafComponentType();
+				break;
+			case Binding.PARAMETERIZED_TYPE:
+			case Binding.RAW_TYPE:
+			case Binding.WILDCARD_TYPE:
+				keyType = type.actualType();
+				break;
+			default:
+				keyType = nakedType;
+				break;
+		}
+		return cacheDerivedType(keyType, nakedType, annotatedType);
+	}
+
+	private boolean haveTypeAnnotations(TypeBinding baseType, TypeBinding someType, TypeBinding[] someTypes, AnnotationBinding[] annotations) {
+		if (baseType != null && baseType.hasTypeAnnotations())
+			return true;
+		if (someType != null && someType.hasTypeAnnotations())
+			return true;
+		for (int i = 0, length = annotations == null ? 0 : annotations.length; i < length; i++)
+			if (annotations [i] != null)
+				return true;
+		for (int i = 0, length = someTypes == null ? 0 : someTypes.length; i < length; i++)
+			if (someTypes[i].hasTypeAnnotations())
+				return true;
+		return false;
+	}
+
+	private boolean haveTypeAnnotations(TypeBinding leafType, AnnotationBinding[] annotations) {
+		return haveTypeAnnotations(leafType, null, null, annotations);
+	}
+	
+	private boolean haveTypeAnnotations(TypeBinding memberType, TypeBinding enclosingType) {
+		return haveTypeAnnotations(memberType, enclosingType, null, null);
+	}
+
+	/* Utility method to "flatten" annotations. For multidimensional arrays, we encode the annotations into a flat array 
+	   where a null separates the annotations of dimension n from dimension n - 1 as well as dimenion n + 1. There is a
+	   final null always.
+	*/
+	static AnnotationBinding [] flattenedAnnotations (AnnotationBinding [][] annotations) {
+
+		if (annotations == null || annotations.length == 0)
+			return Binding.NO_ANNOTATIONS;
+
+		int levels = annotations.length;
+		int length = levels;
+		for (int i = 0; i < levels; i++) {
+			length += annotations[i] == null ? 0 : annotations[i].length;
+		}
+		if (length == 0)
+			return Binding.NO_ANNOTATIONS;
+
+		AnnotationBinding[] series = new AnnotationBinding [length];
+		int index = 0;
+		for (int i = 0; i < levels; i++) {
+			final int annotationsLength = annotations[i] == null ? 0 : annotations[i].length;
+			if (annotationsLength > 0) {
+				System.arraycopy(annotations[i], 0, series, index, annotationsLength);
+				index += annotationsLength;
+			}
+			series[index++] = null;
+		}
+		if (index != length)
+			throw new IllegalStateException();
+		return series;
+	}
+
+	public boolean isAnnotatedTypeSystem() {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java
index d582295..f38030c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,9 @@
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
+import java.util.Arrays;
+
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
 
 /**
@@ -139,6 +142,11 @@
 		arraysize++;
 	if ((bits & TagBits.AnnotationForType) != 0)
 		arraysize++;
+	if ((bits & TagBits.AnnotationForTypeUse) != 0)
+		arraysize++;
+	if ((bits & TagBits.AnnotationForTypeParameter) != 0)
+		arraysize++;
+	
 	Object[] value = new Object[arraysize];
 	if (arraysize > 0) {
 		ReferenceBinding elementType = env.getResolvedType(TypeConstants.JAVA_LANG_ANNOTATION_ELEMENTTYPE, null);
@@ -149,16 +157,20 @@
 			value[index++] = elementType.getField(TypeConstants.UPPER_CONSTRUCTOR, true);
 		if ((bits & TagBits.AnnotationForField) != 0)
 			value[index++] = elementType.getField(TypeConstants.UPPER_FIELD, true);
-		if ((bits & TagBits.AnnotationForLocalVariable) != 0)
-			value[index++] = elementType.getField(TypeConstants.UPPER_LOCAL_VARIABLE, true);
 		if ((bits & TagBits.AnnotationForMethod) != 0)
 			value[index++] = elementType.getField(TypeConstants.UPPER_METHOD, true);
 		if ((bits & TagBits.AnnotationForPackage) != 0)
 			value[index++] = elementType.getField(TypeConstants.UPPER_PACKAGE, true);
 		if ((bits & TagBits.AnnotationForParameter) != 0)
 			value[index++] = elementType.getField(TypeConstants.UPPER_PARAMETER, true);
+		if ((bits & TagBits.AnnotationForTypeUse) != 0)
+			value[index++] = elementType.getField(TypeConstants.TYPE_USE_TARGET, true);
+		if ((bits & TagBits.AnnotationForTypeParameter) != 0)
+			value[index++] = elementType.getField(TypeConstants.TYPE_PARAMETER_TARGET, true);
 		if ((bits & TagBits.AnnotationForType) != 0)
 			value[index++] = elementType.getField(TypeConstants.TYPE, true);
+		if ((bits & TagBits.AnnotationForLocalVariable) != 0)
+			value[index++] = elementType.getField(TypeConstants.UPPER_LOCAL_VARIABLE, true);
 	}
 	return env.createAnnotation(
 			target,
@@ -167,7 +179,7 @@
 			});
 }
 
-AnnotationBinding(ReferenceBinding type, ElementValuePair[] pairs) {
+public AnnotationBinding(ReferenceBinding type, ElementValuePair[] pairs) {
 	this.type = type;
 	this.pairs = pairs;
 }
@@ -195,6 +207,10 @@
 	return this.type;
 }
 
+public void resolve() {
+	// Nothing to do, this is already resolved.
+}
+
 public ElementValuePair[] getElementValuePairs() {
 	return this.pairs;
 }
@@ -214,13 +230,63 @@
 	StringBuffer buffer = new StringBuffer(5);
 	buffer.append('@').append(this.type.sourceName);
 	if (this.pairs != null && this.pairs.length > 0) {
-		buffer.append("{ "); //$NON-NLS-1$
-		for (int i = 0, max = this.pairs.length; i < max; i++) {
-			if (i > 0) buffer.append(", "); //$NON-NLS-1$
-			buffer.append(this.pairs[i]);
+		buffer.append('(');
+		if (this.pairs.length == 1 && CharOperation.equals(this.pairs[0].getName(), TypeConstants.VALUE)) {
+			buffer.append(this.pairs[0].value); 
+		} else {
+			for (int i = 0, max = this.pairs.length; i < max; i++) {
+				if (i > 0) buffer.append(", "); //$NON-NLS-1$
+				buffer.append(this.pairs[i]);
+			}
 		}
-		buffer.append('}');
+		buffer.append(')');
 	}
 	return buffer.toString();
 }
+
+public int hashCode() {
+	return this.type.hashCode();
+}
+public boolean equals(Object object) {
+	if (this == object)
+		return true;
+	if (!(object instanceof AnnotationBinding))
+		return false;
+
+	AnnotationBinding that = (AnnotationBinding) object;
+	if (this.getAnnotationType() != that.getAnnotationType()) //$IDENTITY-COMPARISON$
+		return false;
+
+	final ElementValuePair[] thisElementValuePairs = this.getElementValuePairs();
+	final ElementValuePair[] thatElementValuePairs = that.getElementValuePairs();
+	final int length = thisElementValuePairs.length;
+	if (length != thatElementValuePairs.length) 
+		return false;
+	loop: for (int i = 0; i < length; i++) {
+		ElementValuePair thisPair = thisElementValuePairs[i];
+		for (int j = 0; j < length; j++) {
+			ElementValuePair thatPair = thatElementValuePairs[j];
+			if (thisPair.binding == thatPair.binding) {
+				if (thisPair.value == null) {
+					if (thatPair.value == null) {
+						continue loop;
+					}
+					return false;
+				} else {
+					if (thatPair.value == null) return false;
+					if (thatPair.value instanceof Object[] && thisPair.value instanceof Object[]) {
+						if (!Arrays.equals((Object[]) thisPair.value, (Object[]) thatPair.value)) {
+							return false;
+						}
+					} else if (!thatPair.value.equals(thisPair.value)) {
+						return false;
+					}
+				}
+				continue loop;
+			}
+		}
+		return false;
+	}
+	return true;
+}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder.java
index c7822ee..35227d1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/AnnotationHolder.java
@@ -43,10 +43,9 @@
 	return Binding.NO_ANNOTATIONS;
 }
 AnnotationHolder setAnnotations(AnnotationBinding[] annotations) {
+	this.annotations = annotations;
 	if (annotations == null || annotations.length == 0)
 		return null; // no longer needed
-
-	this.annotations = annotations;
 	return this;
 }
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java
index 70a2db2..ebb946e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java
@@ -1,26 +1,34 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 392862 - [1.8][compiler][null] Evaluate null annotations on array types
  *								bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415291 - [1.8][null] differentiate type incompatibilities due to null annotations
+ *								Bug 415850 - [1.8] Ensure RunJDTCoreTests can cope with null annotations enabled
+ *								Bug 416176 - [1.8][compiler][null] null type annotations cause grief on type variables
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 425460 - [1.8] [inference] Type not inferred on stream.toArray
+ *								Bug 426792 - [1.8][inference][impl] generify new type inference engine
+ *								Bug 428019 - [1.8][compiler] Type inference failure with nested generic invocation.
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 import java.util.List;
+import java.util.Set;
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 
 public final class ArrayBinding extends TypeBinding {
@@ -40,9 +48,6 @@
 	public long[] nullTagBitsPerDimension;
 
 public ArrayBinding(TypeBinding type, int dimensions, LookupEnvironment environment) {
-	this(type, dimensions, environment, null);
-}
-public ArrayBinding(TypeBinding type, int dimensions, LookupEnvironment environment, long[] nullTagBitsPerDimension) {
 	this.tagBits |= TagBits.IsArrayType;
 	this.leafComponentType = type;
 	this.dimensions = dimensions;
@@ -50,11 +55,12 @@
 	if (type instanceof UnresolvedReferenceBinding)
 		((UnresolvedReferenceBinding) type).addWrapper(this, environment);
 	else
-		this.tagBits |= type.tagBits & (TagBits.HasTypeVariable | TagBits.HasDirectWildcard | TagBits.HasMissingType | TagBits.ContainsNestedTypeReferences);
-	
-	if (nullTagBitsPerDimension != null) {
-		this.tagBits |= nullTagBitsPerDimension[0]; // outer-most dimension
-		this.nullTagBitsPerDimension = nullTagBitsPerDimension;
+		this.tagBits |= type.tagBits & (TagBits.HasTypeVariable | TagBits.HasDirectWildcard | TagBits.HasMissingType | TagBits.ContainsNestedTypeReferences | TagBits.HasCapturedWildcard);
+	long mask = type.tagBits & TagBits.AnnotationNullMASK;
+	if (mask != 0) {
+		this.nullTagBitsPerDimension = new long[this.dimensions + 1];
+		this.nullTagBitsPerDimension[this.dimensions] = mask;
+		this.tagBits |= TagBits.HasNullTypeAnnotation;
 	}
 }
 
@@ -109,6 +115,22 @@
 	}
 }
 
+@Override
+public boolean mentionsAny(TypeBinding[] parameters, int idx) {
+	return this.leafComponentType.mentionsAny(parameters, idx);
+}
+
+void collectInferenceVariables(Set<InferenceVariable> variables) {
+	this.leafComponentType.collectInferenceVariables(variables);
+}
+
+TypeBinding substituteInferenceVariable(InferenceVariable var, TypeBinding substituteType) {
+	TypeBinding substitutedLeaf = this.leafComponentType.substituteInferenceVariable(var, substituteType);
+	if (TypeBinding.notEquals(substitutedLeaf, this.leafComponentType))
+		return this.environment.createArrayType(substitutedLeaf, this.dimensions, this.typeAnnotations);
+	return this;
+}
+
 /*
  * brakets leafUniqueKey
  * p.X[][] --> [[Lp/X;
@@ -133,11 +155,33 @@
 	return this.constantPoolName = CharOperation.concat(brackets, this.leafComponentType.signature());
 }
 public String debugName() {
+	if (this.hasTypeAnnotations())
+		return annotatedDebugName();
 	StringBuffer brackets = new StringBuffer(this.dimensions * 2);
 	for (int i = this.dimensions; --i >= 0;)
 		brackets.append("[]"); //$NON-NLS-1$
 	return this.leafComponentType.debugName() + brackets.toString();
 }
+
+public String annotatedDebugName() {
+	StringBuffer brackets = new StringBuffer(this.dimensions * 2);
+	brackets.append(this.leafComponentType.annotatedDebugName());
+	brackets.append(' ');
+	AnnotationBinding [] annotations = getTypeAnnotations();
+	for (int i = 0, j = -1; i < this.dimensions; i++) {
+		if (annotations != null) {
+			if (i != 0)
+				brackets.append(' ');
+			while (++j < annotations.length && annotations[j] != null) {
+				brackets.append(annotations[j]);
+				brackets.append(' ');
+			}
+		}
+		brackets.append("[]"); //$NON-NLS-1$
+	}
+	return brackets.toString();
+}
+
 public int dimensions() {
 	return this.dimensions;
 }
@@ -148,24 +192,28 @@
 */
 
 public TypeBinding elementsType() {
-	long[] nullTagBitsSub = null;
-	if (this.nullTagBitsPerDimension != null) {
-		int len = this.nullTagBitsPerDimension.length-1;
-		System.arraycopy(this.nullTagBitsPerDimension, 1, nullTagBitsSub = new long[len], 0, len);
-	}
-	if (this.dimensions == 1) {
-		if (nullTagBitsSub != null && nullTagBitsSub[0] != 0L && this.leafComponentType instanceof ReferenceBinding)
-			return this.environment.createParameterizedType((ReferenceBinding) this.leafComponentType, null, nullTagBitsSub[0], null);
+	
+	if (this.dimensions == 1) 
 		return this.leafComponentType;
+	
+	AnnotationBinding [] oldies = getTypeAnnotations();
+	AnnotationBinding [] newbies = Binding.NO_ANNOTATIONS;
+	
+	for (int i = 0, length = oldies == null ? 0 : oldies.length; i < length; i++) {
+		if (oldies[i] == null) {
+			System.arraycopy(oldies, i+1, newbies = new AnnotationBinding[length - i - 1], 0, length - i - 1);
+			break;
+		}
 	}
-	return this.environment.createArrayType(this.leafComponentType, this.dimensions - 1, nullTagBitsSub);
+	return this.environment.createArrayType(this.leafComponentType, this.dimensions - 1, newbies);
 }
+
 /**
  * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#erasure()
  */
 public TypeBinding erasure() {
     TypeBinding erasedType = this.leafComponentType.erasure();
-    if (this.leafComponentType != erasedType)
+    if (TypeBinding.notEquals(this.leafComponentType, erasedType))
         return this.environment.createArrayType(erasedType, this.dimensions);
     return this;
 }
@@ -194,7 +242,7 @@
 /* Answer true if the receiver type can be assigned to the argument type (right)
 */
 public boolean isCompatibleWith(TypeBinding otherType, Scope captureScope) {
-	if (this == otherType)
+	if (equalsEquals(this, otherType))
 		return true;
 
 	switch (otherType.kind()) {
@@ -237,6 +285,37 @@
 	return false;
 }
 
+@Override
+public boolean isSubtypeOf(TypeBinding otherType) {
+	if (equalsEquals(this, otherType))
+		return true;
+
+	switch (otherType.kind()) {
+		case Binding.ARRAY_TYPE :
+			ArrayBinding otherArray = (ArrayBinding) otherType;
+			if (otherArray.leafComponentType.isBaseType())
+				return false; // relying on the fact that all equal arrays are identical
+			if (this.dimensions == otherArray.dimensions)
+				return this.leafComponentType.isSubtypeOf(otherArray.leafComponentType);
+			if (this.dimensions < otherArray.dimensions)
+				return false; // cannot assign 'String[]' into 'Object[][]' but can assign 'byte[][]' into 'Object[]'
+			break;
+		case Binding.BASE_TYPE :
+			return false;
+	}
+	switch (otherType.leafComponentType().id) {
+	    case TypeIds.T_JavaLangObject :
+	    case TypeIds.T_JavaLangCloneable :
+	    case TypeIds.T_JavaIoSerializable :
+	        return true;
+	}
+	return false;
+}
+
+public boolean isProperType(boolean admitCapture18) {
+	return this.leafComponentType.isProperType(admitCapture18);
+}
+
 public int kind() {
 	return ARRAY_TYPE;
 }
@@ -245,7 +324,7 @@
 	return this.leafComponentType;
 }
 
-public char[] nullAnnotatedReadableName(LookupEnvironment env, boolean shortNames) /* java.lang.Object @o.e.j.a.NonNull[] */ {
+public char[] nullAnnotatedReadableName(CompilerOptions options, boolean shortNames) /* java.lang.Object @o.e.j.a.NonNull[] */ {
 	if (this.nullTagBitsPerDimension == null)
 		return shortNames ? shortReadableName() : readableName();
 	char[][] brackets = new char[this.dimensions][];
@@ -253,9 +332,9 @@
 		if ((this.nullTagBitsPerDimension[i] & TagBits.AnnotationNullMASK) != 0) {
 			char[][] fqAnnotationName;
 			if ((this.nullTagBitsPerDimension[i] & TagBits.AnnotationNonNull) != 0)
-				fqAnnotationName = env.getNonNullAnnotationName();
+				fqAnnotationName = options.nonNullAnnotationName;
 			else
-				fqAnnotationName = env.getNullableAnnotationName();
+				fqAnnotationName = options.nullableAnnotationName;
 			char[] annotationName = shortNames 
 										? fqAnnotationName[fqAnnotationName.length-1] 
 										: CharOperation.concatWith(fqAnnotationName, '.');
@@ -268,8 +347,7 @@
 			brackets[i] = new char[]{'[', ']'}; 
 		}
 	}
-	char[] leafTypeName = shortNames ? this.leafComponentType.shortReadableName() : this.leafComponentType.readableName();
-	return CharOperation.concat(leafTypeName, 
+	return CharOperation.concat(this.leafComponentType.nullAnnotatedReadableName(options, shortNames), 
 								 CharOperation.concatWith(brackets, ' '),
 								 ' ');
 }
@@ -303,6 +381,44 @@
 	}
 	return CharOperation.concat(this.leafComponentType.readableName(), brackets);
 }
+
+public void setTypeAnnotations(AnnotationBinding[] annotations, boolean evalNullAnnotations) {
+	this.tagBits |= TagBits.HasTypeAnnotations;
+	if (annotations == null || annotations.length == 0)
+		return;
+	this.typeAnnotations = annotations;
+	
+	if (evalNullAnnotations) {
+		long nullTagBits = 0;
+		if (this.nullTagBitsPerDimension == null)
+			this.nullTagBitsPerDimension = new long[this.dimensions + 1];
+		
+		int dimension = 0;
+		for (int i = 0, length = annotations.length; i < length; i++) {
+			AnnotationBinding annotation = annotations[i];
+			if (annotation != null) {
+				switch (annotation.type.id) {
+					case TypeIds.T_ConfiguredAnnotationNullable :
+						nullTagBits  |= TagBits.AnnotationNullable;
+						this.tagBits |= TagBits.HasNullTypeAnnotation;
+						break;
+					case TypeIds.T_ConfiguredAnnotationNonNull :
+						nullTagBits  |= TagBits.AnnotationNonNull;
+						this.tagBits |= TagBits.HasNullTypeAnnotation;
+						break;
+				}
+			} else {
+				// null signals end of annotations for the current dimension in the serialized form.
+				if (nullTagBits != 0) {
+					this.nullTagBitsPerDimension[dimension] = nullTagBits;
+					nullTagBits = 0;
+				}
+				dimension++;
+			}
+		}
+		this.tagBits |= this.nullTagBitsPerDimension[0]; // outer-most dimension
+	}
+}
 public char[] shortReadableName(){
 	char[] brackets = new char[this.dimensions * 2];
 	for (int i = this.dimensions * 2 - 1; i >= 0; i -= 2) {
@@ -320,12 +436,23 @@
 	return CharOperation.concat(this.leafComponentType.sourceName(), brackets);
 }
 public void swapUnresolved(UnresolvedReferenceBinding unresolvedType, ReferenceBinding resolvedType, LookupEnvironment env) {
-	if (this.leafComponentType == unresolvedType) {
+	if (this.leafComponentType == unresolvedType) { //$IDENTITY-COMPARISON$
 		this.leafComponentType = env.convertUnresolvedBinaryToRawType(resolvedType);
-		this.tagBits |= this.leafComponentType.tagBits & (TagBits.HasTypeVariable | TagBits.HasDirectWildcard | TagBits.HasMissingType);
+		this.tagBits |= this.leafComponentType.tagBits & (TagBits.HasTypeVariable | TagBits.HasDirectWildcard | TagBits.HasMissingType | TagBits.HasCapturedWildcard);
 	}
 }
 public String toString() {
 	return this.leafComponentType != null ? debugName() : "NULL TYPE ARRAY"; //$NON-NLS-1$
 }
+public TypeBinding unannotated() {
+	return this.hasTypeAnnotations() ? this.environment.getUnannotatedType(this) : this;
+}
+@Override
+public TypeBinding uncapture(Scope scope) {
+	if ((this.tagBits & TagBits.HasCapturedWildcard) == 0)
+		return this;
+	TypeBinding leafType = this.leafComponentType.uncapture(scope);
+	return scope.environment().createArrayType(leafType, this.dimensions, this.typeAnnotations);
+}
+
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.java
index 9f2dd28..2b0ae3d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.java
@@ -5,20 +5,17 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 
-public final class BaseTypeBinding extends TypeBinding {
+public class BaseTypeBinding extends TypeBinding {
 
 	public static final int[] CONVERSIONS;
 	public static final int IDENTITY = 1;
@@ -149,6 +146,10 @@
 		return this.constantPoolName;
 	}
 
+	public TypeBinding clone(TypeBinding enclosingType) {
+		return new BaseTypeBinding(this.id, this.simpleName, this.constantPoolName);
+	}
+	
 	public PackageBinding getPackage() {
 
 		return null;
@@ -157,7 +158,7 @@
 	/* Answer true if the receiver type can be assigned to the argument type (right)
 	*/
 	public final boolean isCompatibleWith(TypeBinding right, Scope captureScope) {
-		if (this == right)
+		if (equalsEquals(this, right))
 			return true;
 		int right2left = this.id + (right.id<<4);
 		if (right2left >= 0 
@@ -167,6 +168,34 @@
 		return this == TypeBinding.NULL && !right.isBaseType();
 	}
 	
+	public void setTypeAnnotations(AnnotationBinding[] annotations, boolean evalNullAnnotations) {
+		super.setTypeAnnotations(annotations, false); // never set nullTagBits on base types
+	}
+
+	public TypeBinding unannotated() {
+		if (!this.hasTypeAnnotations())
+			return this;
+		switch (this.id) {
+			case TypeIds.T_boolean:
+				return TypeBinding.BOOLEAN;
+			case TypeIds.T_byte:
+				return TypeBinding.BYTE;
+			case TypeIds.T_char:
+				return TypeBinding.CHAR;
+			case TypeIds.T_double:
+				return TypeBinding.DOUBLE;
+			case TypeIds.T_float:
+				return TypeBinding.FLOAT;
+			case TypeIds.T_int:
+				return TypeBinding.INT;
+			case TypeIds.T_long:
+				return TypeBinding.LONG;
+			case TypeIds.T_short:
+				return TypeBinding.SHORT;
+			default:
+				throw new IllegalStateException();
+			}
+	}
 	/**
 	 * T_null is acting as an unchecked exception
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#isUncheckedException(boolean)
@@ -198,6 +227,6 @@
 	}
 
 	public String toString() {
-		return new String(this.constantPoolName) + " (id=" + this.id + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+		return this.hasTypeAnnotations() ? annotatedDebugName() : new String(readableName());
 	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
index 20a834f..23b1e38 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -21,6 +17,16 @@
  *								bug 388800 - [1.8][compiler] detect default methods in class files
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
  *								bug 331649 - [compiler][null] consider null annotations for fields
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 415850 - [1.8] Ensure RunJDTCoreTests can cope with null annotations enabled
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 427199 - [1.8][resource] avoid resource leak warnings on Streams that have no resource
+ *								Bug 392245 - [1.8][compiler][null] Define whether / how @NonNullByDefault applies to TYPE_USE locations
+ *    Jesper Steen Moller - Contributions for
+ *								Bug 412150 [1.8] [compiler] Enable reflected parameter names during annotation processing
+ *								Bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -28,8 +34,11 @@
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.TypeAnnotationWalker;
+import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.ConstantPool;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.BooleanConstant;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
@@ -46,8 +55,12 @@
 null is NOT a valid value for a non-public field... it just means the field is not initialized.
 */
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 //AspectJ Extension - XXX extending SourceTypeBinding is a HORRIBLE hack, was 'extends ReferenceBinding'
 public class BinaryTypeBinding extends SourceTypeBinding {  
+
+	private static final IBinaryMethod[] NO_BINARY_METHODS = new IBinaryMethod[0];
+
 	// all of these fields are ONLY guaranteed to be initialized if accessed using their public accessor method
 // AspectJ Extension - comment out some fields
 //	protected ReferenceBinding superclass;
@@ -58,22 +71,26 @@
 //	protected ReferenceBinding[] memberTypes;
 //	protected TypeVariableBinding[] typeVariables;
 // End AspectJ Extension
+	private BinaryTypeBinding prototype;
+
 	// For the link with the principle structure
 	protected LookupEnvironment environment;
 
 	protected SimpleLookupTable storedAnnotations = null; // keys are this ReferenceBinding & its fields and methods, value is an AnnotationHolder
 
+	private ReferenceBinding containerAnnotationType;
+
 static Object convertMemberValue(Object binaryValue, LookupEnvironment env, char[][][] missingTypeNames) {
 	if (binaryValue == null) return null;
 	if (binaryValue instanceof Constant)
 		return binaryValue;
 	if (binaryValue instanceof ClassSignature)
-		return env.getTypeFromSignature(((ClassSignature) binaryValue).getTypeName(), 0, -1, false, null, missingTypeNames);
+		return env.getTypeFromSignature(((ClassSignature) binaryValue).getTypeName(), 0, -1, false, null, missingTypeNames, TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER);
 	if (binaryValue instanceof IBinaryAnnotation)
 		return createAnnotation((IBinaryAnnotation) binaryValue, env, missingTypeNames);
 	if (binaryValue instanceof EnumConstantSignature) {
 		EnumConstantSignature ref = (EnumConstantSignature) binaryValue;
-		ReferenceBinding enumType = (ReferenceBinding) env.getTypeFromSignature(ref.getTypeName(), 0, -1, false, null, missingTypeNames);
+		ReferenceBinding enumType = (ReferenceBinding) env.getTypeFromSignature(ref.getTypeName(), 0, -1, false, null, missingTypeNames, TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER);
 		enumType = (ReferenceBinding) resolveType(enumType, env, false /* no raw conversion */);
 		return enumType.getField(ref.getEnumConstantName(), false);
 	}
@@ -91,6 +108,25 @@
 	throw new IllegalStateException();
 }
 
+public TypeBinding clone(TypeBinding outerType) {
+	BinaryTypeBinding copy = new BinaryTypeBinding(this);
+	copy.enclosingType = (ReferenceBinding) outerType;
+	
+	/* BinaryTypeBinding construction is not "atomic" and is split between the constructor and cachePartsFrom and between the two
+	   stages of construction, clone can kick in when LookupEnvironment.createBinaryTypeFrom calls PackageBinding.addType. This
+	   can result in some URB's being resolved, which could trigger the clone call, leaving the clone with semi-initialized prototype.
+	   Fortunately, the protocol for this type demands all clients to use public access methods, where we can deflect the call to the
+	   prototype. enclosingType() and memberTypes() should not delegate, so ...
+	*/
+	if (copy.enclosingType != null) 
+		copy.tagBits |= TagBits.HasUnresolvedEnclosingType;
+	else 
+		copy.tagBits &= ~TagBits.HasUnresolvedEnclosingType;
+	
+	copy.tagBits |= TagBits.HasUnresolvedMemberTypes;
+	return copy;
+}
+
 static AnnotationBinding createAnnotation(IBinaryAnnotation annotationInfo, LookupEnvironment env, char[][][] missingTypeNames) {
 	IBinaryElementValuePair[] binaryPairs = annotationInfo.getElementValuePairs();
 	int length = binaryPairs == null ? 0 : binaryPairs.length;
@@ -100,7 +136,7 @@
 
 	char[] typeName = annotationInfo.getTypeName();
 	ReferenceBinding annotationType = env.getTypeFromConstantPoolName(typeName, 1, typeName.length - 1, false, missingTypeNames);
-	return new UnresolvedAnnotationBinding(annotationType, pairs, env);
+	return env.createUnresolvedAnnotation(annotationType, pairs);
 }
 
 public static AnnotationBinding[] createAnnotations(IBinaryAnnotation[] annotationInfos, LookupEnvironment env, char[][][] missingTypeNames) {
@@ -149,6 +185,21 @@
  */
 protected BinaryTypeBinding() {
 	// only for subclasses
+	this.prototype = this;
+}
+
+public BinaryTypeBinding(BinaryTypeBinding prototype) {
+	super(prototype);
+	this.superclass = prototype.superclass;
+	this.enclosingType = prototype.enclosingType;
+	this.superInterfaces = prototype.superInterfaces;
+	this.fields = prototype.fields;
+	this.methods = prototype.methods;
+	this.memberTypes = prototype.memberTypes;
+	this.typeVariables = prototype.typeVariables;
+	this.prototype = prototype.prototype;
+	this.environment = prototype.environment;
+	this.storedAnnotations = prototype.storedAnnotations;
 }
 
 /**
@@ -158,6 +209,18 @@
  * @param environment
  */
 public BinaryTypeBinding(PackageBinding packageBinding, IBinaryType binaryType, LookupEnvironment environment) {
+	this(packageBinding, binaryType, environment, false);
+}
+/**
+ * Standard constructor for creating binary type bindings from binary models (classfiles)
+ * @param packageBinding
+ * @param binaryType
+ * @param environment
+ * @param needFieldsAndMethods
+ */
+public BinaryTypeBinding(PackageBinding packageBinding, IBinaryType binaryType, LookupEnvironment environment, boolean needFieldsAndMethods) {
+	
+	this.prototype = this;
 	this.compoundName = CharOperation.splitOn('/', binaryType.getName());
 	computeId();
 
@@ -202,12 +265,19 @@
 		if (enclosingType().isDeprecated())
 			this.modifiers |= ExtraCompilerModifiers.AccDeprecatedImplicitly;
 	}
+	if (needFieldsAndMethods)
+		cachePartsFrom(binaryType, true);
 }
 
 /**
- * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding#availableMethods()
+ * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding#availableFields()
  */
 public FieldBinding[] availableFields() {
+	
+	if (!isPrototype()) {
+		return this.prototype.availableFields();
+	}
+	
 	if ((this.tagBits & TagBits.AreFieldsComplete) != 0)
 		return this.fields;
 
@@ -234,6 +304,7 @@
 }
 
 private TypeVariableBinding[] addMethodTypeVariables(TypeVariableBinding[] methodTypeVars) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.typeVariables == null || this.typeVariables == Binding.NO_TYPE_VARIABLES) {
 		return methodTypeVars;
 	} 
@@ -262,6 +333,11 @@
  * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding#availableMethods()
  */
 public MethodBinding[] availableMethods() {
+	
+	if (!isPrototype()) {
+		return this.prototype.availableMethods();
+	}
+
 	if ((this.tagBits & TagBits.AreMethodsComplete) != 0)
 		return this.methods;
 
@@ -288,6 +364,7 @@
 }
 
 void cachePartsFrom(IBinaryType binaryType, boolean needFieldsAndMethods) {
+	if (!isPrototype()) throw new IllegalStateException();
 	try {
 		// default initialization for super-interfaces early, in case some aborting compilation error occurs,
 		// and still want to use binaries passed that point (e.g. type hierarchy resolver, see bug 63748).
@@ -309,12 +386,14 @@
 			}
 		}
 
-		long sourceLevel = this.environment.globalOptions.originalSourceLevel;
+		CompilerOptions globalOptions = this.environment.globalOptions;
+		long sourceLevel = globalOptions.originalSourceLevel;
 		/* https://bugs.eclipse.org/bugs/show_bug.cgi?id=324850, even in a 1.4 project, we
 		   must internalize type variables and observe any parameterization of super class
 		   and/or super interfaces in order to be able to detect overriding in the presence
 		   of generics.
 		 */
+		TypeAnnotationWalker walker = getTypeAnnotationWalker(binaryType.getTypeAnnotations());
 		char[] typeSignature = binaryType.getGenericSignature(); // use generic signature even in 1.4
 		this.tagBits |= binaryType.getTagBits();
 		
@@ -326,7 +405,7 @@
 			if (wrapper.signature[wrapper.start] == Util.C_GENERIC_START) {
 				// ParameterPart = '<' ParameterSignature(s) '>'
 				wrapper.start++; // skip '<'
-				this.typeVariables = createTypeVariables(wrapper, true, missingTypeNames);
+				this.typeVariables = createTypeVariables(wrapper, true, missingTypeNames, walker, true/*class*/);
 				wrapper.start++; // skip '>'
 				this.tagBits |=  TagBits.HasUnresolvedTypeVariables;
 				this.modifiers |= ExtraCompilerModifiers.AccGenericSignature;
@@ -345,7 +424,7 @@
 			char[] superclassName = binaryType.getSuperclassName();
 			if (superclassName != null) {
 				// attempt to find the superclass if it exists in the cache (otherwise - resolve it when requested)
-				this.superclass = this.environment.getTypeFromConstantPoolName(superclassName, 0, -1, false, missingTypeNames);
+				this.superclass = this.environment.getTypeFromConstantPoolName(superclassName, 0, -1, false, missingTypeNames, walker.toSupertype((short) -1));
 				this.tagBits |= TagBits.HasUnresolvedSuperclass;
 			}
 
@@ -355,23 +434,25 @@
 				int size = interfaceNames.length;
 				if (size > 0) {
 					this.superInterfaces = new ReferenceBinding[size];
-					for (int i = 0; i < size; i++)
+					for (short i = 0; i < size; i++)
 						// attempt to find each superinterface if it exists in the cache (otherwise - resolve it when requested)
-						this.superInterfaces[i] = this.environment.getTypeFromConstantPoolName(interfaceNames[i], 0, -1, false, missingTypeNames);
+						this.superInterfaces[i] = this.environment.getTypeFromConstantPoolName(interfaceNames[i], 0, -1, false, missingTypeNames, walker.toSupertype(i));
 					this.tagBits |= TagBits.HasUnresolvedSuperinterfaces;
 				}
 			}
 		} else {
 			// attempt to find the superclass if it exists in the cache (otherwise - resolve it when requested)
-			this.superclass = (ReferenceBinding) this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames);
+			this.superclass = (ReferenceBinding) this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames, 
+																		walker.toSupertype((short) -1));
 			this.tagBits |= TagBits.HasUnresolvedSuperclass;
 
 			this.superInterfaces = Binding.NO_SUPERINTERFACES;
 			if (!wrapper.atEnd()) {
 				// attempt to find each superinterface if it exists in the cache (otherwise - resolve it when requested)
 				java.util.ArrayList types = new java.util.ArrayList(2);
+				short rank = 0;
 				do {
-					types.add(this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames));
+					types.add(this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames, walker.toSupertype(rank++)));
 				} while (!wrapper.atEnd());
 				this.superInterfaces = new ReferenceBinding[types.size()];
 				types.toArray(this.superInterfaces);
@@ -380,8 +461,9 @@
 		}
 
 		if (needFieldsAndMethods) {
-			createFields(binaryType.getFields(), sourceLevel, missingTypeNames);
-			createMethods(binaryType.getMethods(), sourceLevel, missingTypeNames);
+			IBinaryField[] iFields = binaryType.getFields();
+			createFields(iFields, sourceLevel, missingTypeNames);
+			IBinaryMethod[] iMethods = createMethods(binaryType.getMethods(), sourceLevel, missingTypeNames);
 			boolean isViewedAsDeprecated = isViewedAsDeprecated();
 			if (isViewedAsDeprecated) {
 				for (int i = 0, max = this.fields.length; i < max; i++) {
@@ -397,9 +479,24 @@
 					}
 				}
 			}
+			if (this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled) {
+				// need annotations on the type before processing null annotations on members respecting any @NonNullByDefault:
+				scanTypeForNullDefaultAnnotation(binaryType, this.fPackage, this);
+
+				if (iFields != null) {
+					for (int i = 0; i < iFields.length; i++)
+						scanFieldForNullAnnotation(iFields[i], this.fields[i], this.isEnum());
+				}
+				if (iMethods != null) {
+					for (int i = 0; i < iMethods.length; i++)
+						scanMethodForNullAnnotation(iMethods[i], this.methods[i]);
+				}
+			}
 		}
 		if (this.environment.globalOptions.storeAnnotations)
 			setAnnotations(createAnnotations(binaryType.getAnnotations(), this.environment, missingTypeNames));
+		if (this.isAnnotationType())
+			scanTypeForContainerAnnotation(binaryType, missingTypeNames);
 	} finally {
 		// protect against incorrect use of the needFieldsAndMethods flag, see 48459
 		if (this.fields == null)
@@ -409,7 +506,16 @@
 	}
 }
 
+private TypeAnnotationWalker getTypeAnnotationWalker(IBinaryTypeAnnotation[] annotations) {
+	if (!isPrototype()) throw new IllegalStateException();
+	if (annotations == null || annotations.length == 0)
+		return TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER;
+	
+	return this.environment.usesAnnotatedTypeSystem() ? new TypeAnnotationWalker(annotations) : TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER;
+}
+
 private void createFields(IBinaryField[] iFields, long sourceLevel, char[][][] missingTypeNames) {
+	if (!isPrototype()) throw new IllegalStateException();
 	this.fields = Binding.NO_FIELDS;
 	if (iFields != null) {
 		int size = iFields.length;
@@ -421,9 +527,10 @@
 			for (int i = 0; i < size; i++) {
 				IBinaryField binaryField = iFields[i];
 				char[] fieldSignature = use15specifics ? binaryField.getGenericSignature() : null;
+				TypeAnnotationWalker walker = getTypeAnnotationWalker(binaryField.getTypeAnnotations()).toField();
 				TypeBinding type = fieldSignature == null
-					? this.environment.getTypeFromSignature(binaryField.getTypeName(), 0, -1, false, this, missingTypeNames)
-					: this.environment.getTypeFromTypeSignature(new SignatureWrapper(fieldSignature), Binding.NO_TYPE_VARIABLES, this, missingTypeNames);
+					? this.environment.getTypeFromSignature(binaryField.getTypeName(), 0, -1, false, this, missingTypeNames, walker)
+					: this.environment.getTypeFromTypeSignature(new SignatureWrapper(fieldSignature), Binding.NO_TYPE_VARIABLES, this, missingTypeNames, walker);
 				FieldBinding field =
 					new FieldBinding(
 						binaryField.getName(),
@@ -452,12 +559,6 @@
 					this.fields[i].setAnnotations(createAnnotations(binaryField.getAnnotations(), this.environment, missingTypeNames));
 				}
 			}
-			if (this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled) {
-				for (int i = 0; i <size; i++) {
-					IBinaryField binaryField = iFields[i];
-					scanFieldForNullAnnotation(binaryField, this.fields[i]);
-				}
-			}
 		}
 	}
 }
@@ -469,15 +570,19 @@
 
 
 private MethodBinding createMethod(IBinaryMethod method, long sourceLevel, char[][][] missingTypeNames) {
+	if (!isPrototype()) throw new IllegalStateException();
 	int methodModifiers = method.getModifiers() | ExtraCompilerModifiers.AccUnresolved;
 	if (sourceLevel < ClassFileConstants.JDK1_5)
 		methodModifiers &= ~ClassFileConstants.AccVarargs; // vararg methods are not recognized until 1.5
 	if (isInterface() && (methodModifiers & ClassFileConstants.AccAbstract) == 0) {
 		// see https://bugs.eclipse.org/388954
-		if (sourceLevel >= ClassFileConstants.JDK1_8)
-			methodModifiers |= ExtraCompilerModifiers.AccDefaultMethod;
-		else
+		if (sourceLevel >= ClassFileConstants.JDK1_8) {
+			if ((methodModifiers & ClassFileConstants.AccStatic) == 0) {
+				methodModifiers |= ExtraCompilerModifiers.AccDefaultMethod;
+			}
+		} else {
 			methodModifiers |= ClassFileConstants.AccAbstract;
+		}
 	}
 	ReferenceBinding[] exceptions = Binding.NO_EXCEPTIONS;
 	TypeBinding[] parameters = Binding.NO_PARAMETERS;
@@ -485,12 +590,15 @@
 	AnnotationBinding[][] paramAnnotations = null;
 	TypeBinding returnType = null;
 
+	char[][] argumentNames = method.getArgumentNames();
+
 	final boolean use15specifics = sourceLevel >= ClassFileConstants.JDK1_5;
 	/* https://bugs.eclipse.org/bugs/show_bug.cgi?id=324850, Since a 1.4 project can have a 1.5
 	   type as a super type and the 1.5 type could be generic, we must internalize usages of type
 	   variables properly in order to be able to apply substitutions and thus be able to detect
 	   overriding in the presence of generics. Seeing the erased form is not good enough.
 	 */
+	TypeAnnotationWalker walker = getTypeAnnotationWalker(method.getTypeAnnotations());
 	char[] methodSignature = method.getGenericSignature(); // always use generic signature, even in 1.4
 	if (methodSignature == null) { // no generics
 		char[] methodDescriptor = method.getMethodDescriptor();   // of the form (I[Ljava/jang/String;)V
@@ -523,6 +631,7 @@
 			if (this.environment.globalOptions.storeAnnotations)
 				paramAnnotations = new AnnotationBinding[size][];
 			index = 1;
+			short visibleIdx = 0;
 			int end = 0;   // first character is always '(' so skip it
 			for (int i = 0; i < numOfParams; i++) {
 				while ((nextChar = methodDescriptor[++end]) == Util.C_ARRAY){/*empty*/}
@@ -530,7 +639,7 @@
 					while ((nextChar = methodDescriptor[++end]) != Util.C_NAME_END){/*empty*/}
 
 				if (i >= startIndex) {   // skip the synthetic arg if necessary
-					parameters[i - startIndex] = this.environment.getTypeFromSignature(methodDescriptor, index, end, false, this, missingTypeNames);
+					parameters[i - startIndex] = this.environment.getTypeFromSignature(methodDescriptor, index, end, false, this, missingTypeNames, walker.toMethodParameter(visibleIdx++));
 					// 'paramAnnotations' line up with 'parameters'
 					// int parameter to method.getParameterAnnotations() include the synthetic arg
 					if (paramAnnotations != null)
@@ -551,12 +660,25 @@
 			if (size > 0) {
 				exceptions = new ReferenceBinding[size];
 				for (int i = 0; i < size; i++)
-					exceptions[i] = this.environment.getTypeFromConstantPoolName(exceptionTypes[i], 0, -1, false, missingTypeNames);
+					exceptions[i] = this.environment.getTypeFromConstantPoolName(exceptionTypes[i], 0, -1, false, missingTypeNames, walker.toThrows(i));
 			}
 		}
 
 		if (!method.isConstructor())
-			returnType = this.environment.getTypeFromSignature(methodDescriptor, index + 1, -1, false, this, missingTypeNames);   // index is currently pointing at the ')'
+			returnType = this.environment.getTypeFromSignature(methodDescriptor, index + 1, -1, false, this, missingTypeNames, walker.toMethodReturn());   // index is currently pointing at the ')'
+		
+		final int argumentNamesLength = argumentNames == null ? 0 : argumentNames.length;
+		if (startIndex > 0 && argumentNamesLength > 0) {
+			// We'll have to slice the starting arguments off
+			if (startIndex >= argumentNamesLength) {
+				argumentNames = Binding.NO_PARAMETER_NAMES; // We know nothing about the argument names
+			} else {
+				char[][] slicedArgumentNames = new char[argumentNamesLength - startIndex][];
+				System.arraycopy(argumentNames, startIndex, slicedArgumentNames, 0, argumentNamesLength - startIndex);
+				argumentNames = slicedArgumentNames;
+			}
+		}
+
 	} else {
 		methodModifiers |= ExtraCompilerModifiers.AccGenericSignature;
 		// MethodTypeSignature = ParameterPart(optional) '(' TypeSignatures ')' return_typeSignature ['^' TypeSignature (optional)]
@@ -565,7 +687,7 @@
 			// <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)TA;
 			// ParameterPart = '<' ParameterSignature(s) '>'
 			wrapper.start++; // skip '<'
-			typeVars = createTypeVariables(wrapper, false, missingTypeNames);
+			typeVars = createTypeVariables(wrapper, false, missingTypeNames, walker, false/*class*/);
 			wrapper.start++; // skip '>'
 		}
 		// AspectJ Extension - pr242797
@@ -620,8 +742,9 @@
 				wrapper.start++; // skip ')'
 			} else {
 				java.util.ArrayList types = new java.util.ArrayList(2);
+				short rank = 0;
 				while (wrapper.signature[wrapper.start] != Util.C_PARAM_END)
-					types.add(this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames));
+					types.add(this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames, walker.toMethodParameter(rank++)));
 				wrapper.start++; // skip ')'
 				int numParam = types.size();
 				parameters = new TypeBinding[numParam];
@@ -635,14 +758,16 @@
 		}
 
 		// always retrieve return type (for constructors, its V for void - will be ignored)
-		returnType = this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames);
+		returnType = this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames, walker.toMethodReturn());
 
 		if (!wrapper.atEnd() && wrapper.signature[wrapper.start] == Util.C_EXCEPTION_START) {
 			// attempt to find each exception if it exists in the cache (otherwise - resolve it when requested)
 			java.util.ArrayList types = new java.util.ArrayList(2);
+			int excRank = 0;
 			do {
 				wrapper.start++; // skip '^'
-				types.add(this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames));
+				types.add(this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames,
+					walker.toThrows(excRank++)));
 			} while (!wrapper.atEnd() && wrapper.signature[wrapper.start] == Util.C_EXCEPTION_START);
 			exceptions = new ReferenceBinding[types.size()];
 			types.toArray(exceptions);
@@ -653,7 +778,7 @@
 				if (size > 0) {
 					exceptions = new ReferenceBinding[size];
 					for (int i = 0; i < size; i++)
-						exceptions[i] = this.environment.getTypeFromConstantPoolName(exceptionTypes[i], 0, -1, false, missingTypeNames);
+						exceptions[i] = this.environment.getTypeFromConstantPoolName(exceptionTypes[i], 0, -1, false, missingTypeNames, walker.toThrows(i));
 				}
 			}
 		}
@@ -662,13 +787,26 @@
 	MethodBinding result = method.isConstructor()
 		? new MethodBinding(methodModifiers, parameters, exceptions, this)
 		: new MethodBinding(methodModifiers, method.getSelector(), returnType, parameters, exceptions, this);
-	if (this.environment.globalOptions.storeAnnotations)
+	
+	IBinaryAnnotation[] receiverAnnotations = walker.toReceiver().getAnnotationsAtCursor();
+	if (receiverAnnotations != null && receiverAnnotations.length > 0) {
+		result.receiver = this.environment.createAnnotatedType(this, createAnnotations(receiverAnnotations, this.environment, missingTypeNames));
+	}
+
+	if (this.environment.globalOptions.storeAnnotations) {
+		IBinaryAnnotation[] annotations = method.getAnnotations();
+	    if (annotations == null || annotations.length == 0)
+	    	if (method.isConstructor())
+	    		annotations = walker.toMethodReturn().getAnnotationsAtCursor(); // FIXME: When both exist, order could become an issue.
 		result.setAnnotations(
-			createAnnotations(method.getAnnotations(), this.environment, missingTypeNames),
+			createAnnotations(annotations, this.environment, missingTypeNames),
 			paramAnnotations,
 			isAnnotationType() ? convertMemberValue(method.getDefaultValue(), this.environment, missingTypeNames) : null,
 			this.environment);
+	}
 
+	if (argumentNames != null) result.parameterNames = argumentNames;
+	
 	if (use15specifics)
 		result.tagBits |= method.getTagBits();
 	result.typeVariables = typeVars;
@@ -676,15 +814,16 @@
 	for (int i = 0, length = typeVars.length; i < length; i++)
 		typeVars[i].declaringElement = result;
 
-	scanMethodForNullAnnotation(method, result);
-
 	return result;
 }
 
 /**
  * Create method bindings for binary type, filtering out <clinit> and synthetics
+ * As some iMethods may be ignored in this process we return the matching array of those
+ * iMethods for which MethodBindings have been created; indices match those in this.methods.
  */
-private void createMethods(IBinaryMethod[] iMethods, long sourceLevel, char[][][] missingTypeNames) {
+private IBinaryMethod[] createMethods(IBinaryMethod[] iMethods, long sourceLevel, char[][][] missingTypeNames) {
+	if (!isPrototype()) throw new IllegalStateException();
 	int total = 0, initialTotal = 0, iClinit = -1;
 	int[] toSkip = null;
 	if (iMethods != null) {
@@ -711,7 +850,7 @@
 	}
 	if (total == 0) {
 		this.methods = Binding.NO_METHODS;
-		return;
+		return NO_BINARY_METHODS;
 	}
 
 	boolean hasRestrictedAccess = hasRestrictedAccess();
@@ -723,19 +862,26 @@
 				method.modifiers |= ExtraCompilerModifiers.AccRestrictedAccess;
 			this.methods[i] = method;
 		}
+		return iMethods;
 	} else {
+		IBinaryMethod[] mappedBinaryMethods = new IBinaryMethod[total];
 		for (int i = 0, index = 0; i < initialTotal; i++) {
 			if (iClinit != i && (toSkip == null || toSkip[i] != -1)) {
 				MethodBinding method = createMethod(iMethods[i], sourceLevel, missingTypeNames);
 				if (hasRestrictedAccess)
 					method.modifiers |= ExtraCompilerModifiers.AccRestrictedAccess;
+				mappedBinaryMethods[index] = iMethods[i];
 				this.methods[index++] = method;
 			}
 		}
+		return mappedBinaryMethods;
 	}
 }
 
-private TypeVariableBinding[] createTypeVariables(SignatureWrapper wrapper, boolean assignVariables, char[][][] missingTypeNames) {
+private TypeVariableBinding[] createTypeVariables(SignatureWrapper wrapper, boolean assignVariables, char[][][] missingTypeNames,
+													TypeAnnotationWalker walker, boolean isClassTypeParameter)
+{
+	if (!isPrototype()) throw new IllegalStateException();
 	// detect all type variables first
 	char[] typeSignature = wrapper.signature;
 	int depth = 0, length = typeSignature.length;
@@ -762,7 +908,12 @@
 						pendingVariable = false;
 						int colon = CharOperation.indexOf(Util.C_COLON, typeSignature, i);
 						char[] variableName = CharOperation.subarray(typeSignature, i, colon);
-						variables.add(new TypeVariableBinding(variableName, this, rank++, this.environment));
+						TypeVariableBinding typeVariable = new TypeVariableBinding(variableName, this, rank, this.environment);
+						AnnotationBinding [] annotations = BinaryTypeBinding.createAnnotations(walker.toTypeParameter(isClassTypeParameter, rank++).getAnnotationsAtCursor(), 
+																										this.environment, missingTypeNames);
+						if (annotations != null && annotations != Binding.NO_ANNOTATIONS)
+							typeVariable.setTypeAnnotations(annotations, this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled);
+						variables.add(typeVariable);
 					}
 			}
 		}
@@ -775,7 +926,7 @@
 	if (assignVariables)
 		this.typeVariables = result;
 	for (int i = 0; i < rank; i++) {
-		initializeTypeVariable(result[i], result, wrapper, missingTypeNames);
+		initializeTypeVariable(result[i], result, wrapper, missingTypeNames, walker.toTypeParameterBounds(isClassTypeParameter, i));
 	}
 	return result;
 }
@@ -784,7 +935,7 @@
 *
 * NOTE: enclosingType of a binary type is resolved when needed
 */
-public ReferenceBinding enclosingType() {
+public ReferenceBinding enclosingType() {  // should not delegate to prototype.
 	if ((this.tagBits & TagBits.HasUnresolvedEnclosingType) == 0)
 		return this.enclosingType;
 
@@ -795,6 +946,11 @@
 }
 // NOTE: the type of each field of a binary type is resolved when needed
 public FieldBinding[] fields() {
+	
+	if (!isPrototype()) {
+		return this.fields = this.prototype.fields();
+	}
+
 	if ((this.tagBits & TagBits.AreFieldsComplete) != 0)
 		return this.fields;
 
@@ -812,6 +968,7 @@
 }
 
 private MethodBinding findMethod(char[] methodDescriptor, char[][][] missingTypeNames) {
+	if (!isPrototype()) throw new IllegalStateException();
 	int index = -1;
 	while (methodDescriptor[++index] != Util.C_PARAM_START) {
 		// empty
@@ -838,7 +995,8 @@
 			if (nextChar == Util.C_RESOLVED)
 				while ((nextChar = methodDescriptor[++end]) != Util.C_NAME_END){/*empty*/}
 
-			TypeBinding param = this.environment.getTypeFromSignature(methodDescriptor, index, end, false, this, missingTypeNames);
+			// not interested in type annotations, type will be used for comparison only, and erasure() is used if needed
+			TypeBinding param = this.environment.getTypeFromSignature(methodDescriptor, index, end, false, this, missingTypeNames, TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER);
 			if (param instanceof UnresolvedReferenceBinding) {
 				param = resolveType(param, this.environment, true /* raw conversion */);
 			}
@@ -856,7 +1014,7 @@
 		int currentMethodParameterLength = parameters2.length;
 		if (parameterLength == currentMethodParameterLength) {
 			for (int j = 0; j < currentMethodParameterLength; j++) {
-				if (parameters[j] != parameters2[j] && parameters[j].erasure() != parameters2[j].erasure()) {
+				if (TypeBinding.notEquals(parameters[j], parameters2[j]) && TypeBinding.notEquals(parameters[j].erasure(), parameters2[j].erasure())) {
 					continue loop;
 				}
 			}
@@ -870,12 +1028,17 @@
  * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#genericTypeSignature()
  */
 public char[] genericTypeSignature() {
+	if (!isPrototype())
+		return this.prototype.computeGenericTypeSignature(this.typeVariables);
 	return computeGenericTypeSignature(this.typeVariables);
 }
 
 //NOTE: the return type, arg & exception types of each method of a binary type are resolved when needed
 public MethodBinding getExactConstructor(TypeBinding[] argumentTypes) {
 
+	if (!isPrototype())
+		return this.prototype.getExactConstructor(argumentTypes);
+
 	// lazily sort methods
 	if ((this.tagBits & TagBits.AreMethodsSorted) == 0) {
 		int length = this.methods.length;
@@ -892,7 +1055,7 @@
 				resolveTypesFor(method);
 				TypeBinding[] toMatch = method.parameters;
 				for (int iarg = 0; iarg < argCount; iarg++)
-					if (toMatch[iarg] != argumentTypes[iarg])
+					if (TypeBinding.notEquals(toMatch[iarg], argumentTypes[iarg]))
 						continue nextMethod;
 				return method;
 			}
@@ -906,6 +1069,9 @@
 public MethodBinding getExactMethod(char[] selector, TypeBinding[] argumentTypes, CompilationUnitScope refScope) {
 	// sender from refScope calls recordTypeReference(this)
 
+	if (!isPrototype())
+		return this.prototype.getExactMethod(selector, argumentTypes, refScope);
+
 	// lazily sort methods
 	if ((this.tagBits & TagBits.AreMethodsSorted) == 0) {
 		int length = this.methods.length;
@@ -926,7 +1092,7 @@
 				resolveTypesFor(method);
 				TypeBinding[] toMatch = method.parameters;
 				for (int iarg = 0; iarg < argCount; iarg++)
-					if (toMatch[iarg] != argumentTypes[iarg])
+					if (TypeBinding.notEquals(toMatch[iarg], argumentTypes[iarg]))
 						continue nextMethod;
 				return method;
 			}
@@ -949,6 +1115,8 @@
 }
 //NOTE: the type of a field of a binary type is resolved when needed
 public FieldBinding getFieldBase(char[] fieldName, boolean needResolve) { // AspectJ Extension - added Base to name
+	if (!isPrototype())
+		return this.prototype.getField(fieldName, needResolve);
 	// lazily sort fields
 	if ((this.tagBits & TagBits.AreFieldsSorted) == 0) {
 		int length = this.fields.length;
@@ -960,9 +1128,15 @@
 	return needResolve && field != null ? resolveTypeFor(field) : field;
 }
 /**
- *  Rewrite of default getMemberType to avoid resolving eagerly all member types when one is requested
+ *  Rewrite of default memberTypes() to avoid resolving eagerly all member types when one is requested
  */
 public ReferenceBinding getMemberType(char[] typeName) {
+
+	if (!isPrototype()) {
+		ReferenceBinding memberType = this.prototype.getMemberType(typeName);
+		return memberType == null ? null : this.environment.createMemberType(memberType, this);
+	}
+
 	for (int i = this.memberTypes.length; --i >= 0;) {
 	    ReferenceBinding memberType = this.memberTypes[i];
 	    if (memberType instanceof UnresolvedReferenceBinding) {
@@ -979,6 +1153,8 @@
 }
 // NOTE: the return type, arg & exception types of each method of a binary type are resolved when needed
 public MethodBinding[] getMethodsBase(char[] selector) { // AspectJ Extension - added Base to name
+    if (!isPrototype())
+        return this.prototype.getMethods(selector);
 	if ((this.tagBits & TagBits.AreMethodsComplete) != 0) {
 		long range;
 		if ((range = ReferenceBinding.binarySearch(selector, this.methods)) >= 0) {
@@ -1015,6 +1191,10 @@
 // Answer methods named selector, which take no more than the suggestedParameterLength.
 // The suggested parameter length is optional and may not be guaranteed by every type.
 public MethodBinding[] getMethodsBase(char[] selector, int suggestedParameterLength) {  // AspectJ Extension - added Base to name
+	
+	if (!isPrototype())
+		return this.prototype.getMethods(selector, suggestedParameterLength);
+
 	if ((this.tagBits & TagBits.AreMethodsComplete) != 0)
 		return getMethods(selector);
 	// lazily sort methods
@@ -1054,15 +1234,24 @@
 	return Binding.NO_METHODS;
 }
 public boolean hasMemberTypes() {
+	if (!isPrototype())
+		return this.prototype.hasMemberTypes();
     return this.memberTypes.length > 0;
 }
 // NOTE: member types of binary types are resolved when needed
 public TypeVariableBinding getTypeVariable(char[] variableName) {
+	if (!isPrototype())
+		return this.prototype.getTypeVariable(variableName);
+
 	TypeVariableBinding variable = super.getTypeVariable(variableName);
 	if (variable!=null) variable.resolve(); // AspectJ Extension - guard added
 	return variable;
 }
 public boolean hasTypeBit(int bit) {
+	
+	if (!isPrototype())
+		return this.prototype.hasTypeBit(bit);
+	
 	// ensure hierarchy is resolved, which will propagate bits down to us
 	boolean wasToleratingMissingTypeProcessingAnnotations = this.environment.mayTolerateMissingType;
 	this.environment.mayTolerateMissingType = true;
@@ -1074,17 +1263,19 @@
 	}
 	return (this.typeBits & bit) != 0;
 }
-private void initializeTypeVariable(TypeVariableBinding variable, TypeVariableBinding[] existingVariables, SignatureWrapper wrapper, char[][][] missingTypeNames) {
+private void initializeTypeVariable(TypeVariableBinding variable, TypeVariableBinding[] existingVariables, SignatureWrapper wrapper, char[][][] missingTypeNames, TypeAnnotationWalker walker) {
+	if (!isPrototype()) throw new IllegalStateException();
 	// ParameterSignature = Identifier ':' TypeSignature
 	//   or Identifier ':' TypeSignature(optional) InterfaceBound(s)
 	// InterfaceBound = ':' TypeSignature
 	int colon = CharOperation.indexOf(Util.C_COLON, wrapper.signature, wrapper.start);
 	wrapper.start = colon + 1; // skip name + ':'
 	ReferenceBinding type, firstBound = null;
+	short rank = 0;
 	if (wrapper.signature[wrapper.start] == Util.C_COLON) {
 		type = this.environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null);
 	} else {
-		TypeBinding typeFromTypeSignature = this.environment.getTypeFromTypeSignature(wrapper, existingVariables, this, missingTypeNames);
+		TypeBinding typeFromTypeSignature = this.environment.getTypeFromTypeSignature(wrapper, existingVariables, this, missingTypeNames, walker.toTypeBound(rank++));
 		if (typeFromTypeSignature instanceof ReferenceBinding) {
 			type = (ReferenceBinding) typeFromTypeSignature;
 		} else {
@@ -1096,31 +1287,32 @@
 
 	// variable is visible to its bounds
 	variable.modifiers |= ExtraCompilerModifiers.AccUnresolved;
-	variable.superclass = type;
+	variable.setSuperClass(type);
 
 	ReferenceBinding[] bounds = null;
 	if (wrapper.signature[wrapper.start] == Util.C_COLON) {
 		java.util.ArrayList types = new java.util.ArrayList(2);
 		do {
 			wrapper.start++; // skip ':'
-			types.add(this.environment.getTypeFromTypeSignature(wrapper, existingVariables, this, missingTypeNames));
+			types.add(this.environment.getTypeFromTypeSignature(wrapper, existingVariables, this, missingTypeNames, walker.toTypeBound(rank++)));
 		} while (wrapper.signature[wrapper.start] == Util.C_COLON);
 		bounds = new ReferenceBinding[types.size()];
 		types.toArray(bounds);
 	}
 
-	variable.superInterfaces = bounds == null ? Binding.NO_SUPERINTERFACES : bounds;
+	variable.setSuperInterfaces(bounds == null ? Binding.NO_SUPERINTERFACES : bounds);
 	if (firstBound == null) {
 		firstBound = variable.superInterfaces.length == 0 ? null : variable.superInterfaces[0];
 	}
-	variable.firstBound = firstBound;
+	variable.setFirstBound(firstBound);
 }
 /**
  * Returns true if a type is identical to another one,
  * or for generic types, true if compared to its raw type.
  */
 public boolean isEquivalentTo(TypeBinding otherType) {
-	if (this == otherType) return true;
+	
+	if (TypeBinding.equalsEquals(this, otherType)) return true;
 	if (otherType == null) return false;
 	switch(otherType.kind()) {
 		case Binding.WILDCARD_TYPE :
@@ -1135,24 +1327,54 @@
 	       not. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=186565 && https://bugs.eclipse.org/bugs/show_bug.cgi?id=328827 
 		*/ 
 		case Binding.RAW_TYPE :
-			return otherType.erasure() == this;
+			return TypeBinding.equalsEquals(otherType.erasure(), this);
 	}
 	return false;
 }
 public boolean isGenericType() {
+	
+	if (!isPrototype())
+		return this.prototype.isGenericType();
+	
     return this.typeVariables != Binding.NO_TYPE_VARIABLES;
 }
 public boolean isHierarchyConnected() {
+	
+	if (!isPrototype())
+		return this.prototype.isHierarchyConnected();
+	
 	return (this.tagBits & (TagBits.HasUnresolvedSuperclass | TagBits.HasUnresolvedSuperinterfaces)) == 0;
 }
+public boolean isRepeatableAnnotationType() {
+	if (!isPrototype()) throw new IllegalStateException();
+	return this.containerAnnotationType != null;
+}
 public int kind() {
+	
+	if (!isPrototype())
+		return this.prototype.kind();
+	
 	if (this.typeVariables != Binding.NO_TYPE_VARIABLES)
 		return Binding.GENERIC_TYPE;
 	return Binding.TYPE;
 }
 // NOTE: member types of binary types are resolved when needed
 public ReferenceBinding[] memberTypes() {
- 	if ((this.tagBits & TagBits.HasUnresolvedMemberTypes) == 0)
+ 	if (!isPrototype()) {
+		if ((this.tagBits & TagBits.HasUnresolvedMemberTypes) == 0)
+			return this.memberTypes;
+		ReferenceBinding [] members = this.prototype.memberTypes();
+		int memberTypesLength = members == null ? 0 : members.length;
+		if (memberTypesLength > 0) {
+			this.memberTypes = new ReferenceBinding[memberTypesLength];
+			for (int i = 0; i < memberTypesLength; i++)
+				this.memberTypes[i] = this.environment.createMemberType(members[i], this);
+		}
+		this.tagBits &= ~TagBits.HasUnresolvedMemberTypes;
+		return this.memberTypes;	
+	}
+	
+	if ((this.tagBits & TagBits.HasUnresolvedMemberTypes) == 0)
 		return this.memberTypes;
 
 	for (int i = this.memberTypes.length; --i >= 0;)
@@ -1162,6 +1384,11 @@
 }
 // NOTE: the return type, arg & exception types of each method of a binary type are resolved when needed
 public MethodBinding[] methodsBase() { // AspectJ Extension - added Base suffix
+	
+	if (!isPrototype()) {
+		return this.methods = this.prototype.methods();
+	}
+	
 	if ((this.tagBits & TagBits.AreMethodsComplete) != 0)
 		return this.methods;
 
@@ -1177,8 +1404,30 @@
 	this.tagBits |= TagBits.AreMethodsComplete;
 	return this.methods;
 }
+
+public TypeBinding prototype() {
+	return this.prototype;
+}
+
+// AspectJ Extension: made public
+public /*private*/ boolean isPrototype() {
+	return this == this.prototype; //$IDENTITY-COMPARISON$
+}
+
+public ReferenceBinding containerAnnotationType() {
+	if (!isPrototype()) throw new IllegalStateException();
+	if (this.containerAnnotationType instanceof UnresolvedReferenceBinding) {
+		this.containerAnnotationType = (ReferenceBinding) BinaryTypeBinding.resolveType(this.containerAnnotationType, this.environment, false);
+	}
+	return this.containerAnnotationType;
+}
+
 // AspectJ extension - raised to public from private
 public FieldBinding resolveTypeFor(FieldBinding field) {
+	
+	if (!isPrototype())
+		return this.prototype.resolveTypeFor(field);
+	
 	if ((field.modifiers & ExtraCompilerModifiers.AccUnresolved) == 0)
 		return field;
 
@@ -1191,6 +1440,10 @@
 	return field;
 }
 public MethodBinding resolveTypesFor(MethodBinding method) { // AspectJ Extension - raised to public
+	
+	if (!isPrototype())
+		return this.prototype.resolveTypesFor(method);
+	
 	if ((method.modifiers & ExtraCompilerModifiers.AccUnresolved) == 0)
 		return method;
 
@@ -1222,9 +1475,29 @@
 	return method;
 }
 AnnotationBinding[] retrieveAnnotations(Binding binding) {
+	
+	if (!isPrototype())
+		return this.prototype.retrieveAnnotations(binding);
+	
 	return AnnotationBinding.addStandardAnnotations(super.retrieveAnnotations(binding), binding.getAnnotationTagBits(), this.environment);
 }
+
+public void setContainerAnnotationType(ReferenceBinding value) {
+	if (!isPrototype()) throw new IllegalStateException();
+	this.containerAnnotationType = value;
+}
+
+public void tagAsHavingDefectiveContainerType() {
+	if (!isPrototype()) throw new IllegalStateException();
+	if (this.containerAnnotationType != null && this.containerAnnotationType.isValidBinding())
+		this.containerAnnotationType = new ProblemReferenceBinding(this.containerAnnotationType.compoundName, this.containerAnnotationType, ProblemReasons.DefectiveContainerAnnotationType);
+}
+
 SimpleLookupTable storedAnnotations(boolean forceInitialize) {
+	
+	if (!isPrototype())
+		return this.prototype.storedAnnotations(forceInitialize);
+	
 	if (forceInitialize && this.storedAnnotations == null) {
 		if (!this.environment.globalOptions.storeAnnotations)
 			return null; // not supported during this compile
@@ -1238,7 +1511,19 @@
 }
 // End AspectJ Extension
 
-void scanFieldForNullAnnotation(IBinaryField field, FieldBinding fieldBinding) {
+private void scanFieldForNullAnnotation(IBinaryField field, FieldBinding fieldBinding, boolean isEnum) {
+	if (!isPrototype()) throw new IllegalStateException();
+	if (this.environment.globalOptions.sourceLevel >= ClassFileConstants.JDK1_8) {
+		TypeBinding fieldType = fieldBinding.type;
+		if (fieldType != null
+				&& !fieldType.isBaseType()
+				&& (fieldType.tagBits & TagBits.AnnotationNullMASK) == 0
+				&& (this.tagBits & TagBits.AnnotationNonNullByDefault) != 0) {
+			fieldBinding.type = this.environment.createAnnotatedType(fieldType, new AnnotationBinding[]{this.environment.getNonNullAnnotation()});
+		}
+		return; // not using fieldBinding.tagBits when we have type annotations.
+	}
+
 	// global option is checked by caller
 	char[][] nullableAnnotationName = this.environment.getNullableAnnotationName();
 	char[][] nonNullAnnotationName = this.environment.getNonNullAnnotationName();
@@ -1271,11 +1556,19 @@
 	if (!explicitNullness && (this.tagBits & TagBits.AnnotationNonNullByDefault) != 0) {
 		fieldBinding.tagBits |= TagBits.AnnotationNonNull;
 	}
+	if (isEnum) {
+		if ((field.getModifiers() & ClassFileConstants.AccEnum) != 0) {
+			fieldBinding.tagBits |= TagBits.AnnotationNonNull;
+		}
+	}
 }
 
-void scanMethodForNullAnnotation(IBinaryMethod method, MethodBinding methodBinding) {
+private void scanMethodForNullAnnotation(IBinaryMethod method, MethodBinding methodBinding) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (!this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled)
 		return;
+	boolean useTypeAnnotations = this.environment.globalOptions.sourceLevel >= ClassFileConstants.JDK1_8;
+	// in 1.8 we only need @NonNullByDefault, see below and exit further down.
 	char[][] nullableAnnotationName = this.environment.getNullableAnnotationName();
 	char[][] nonNullAnnotationName = this.environment.getNonNullAnnotationName();
 	char[][] nonNullByDefaultAnnotationName = this.environment.getNonNullByDefaultAnnotationName();
@@ -1294,17 +1587,21 @@
 			if (CharOperation.equals(typeName, nonNullByDefaultAnnotationName)) {
 				methodBinding.tagBits |= TagBits.AnnotationNonNullByDefault;
 			}
-			if (!explicitNullness && CharOperation.equals(typeName, nonNullAnnotationName)) {
-				methodBinding.tagBits |= TagBits.AnnotationNonNull;
-				explicitNullness = true;
-			}
-			if (!explicitNullness && CharOperation.equals(typeName, nullableAnnotationName)) {
-				methodBinding.tagBits |= TagBits.AnnotationNullable;
-				explicitNullness = true;
+			if (!useTypeAnnotations && !explicitNullness) {
+				if (CharOperation.equals(typeName, nonNullAnnotationName)) {
+					methodBinding.tagBits |= TagBits.AnnotationNonNull;
+					explicitNullness = true;
+				} else if (CharOperation.equals(typeName, nullableAnnotationName)) {
+					methodBinding.tagBits |= TagBits.AnnotationNullable;
+					explicitNullness = true;
+				}
 			}
 		}
 	}
 
+	if (useTypeAnnotations)
+		return;
+
 	// parameters:
 	TypeBinding[] parameters = methodBinding.parameters;
 	int numVisibleParams = parameters.length;
@@ -1337,7 +1634,8 @@
 		}
 	}
 }
-void scanTypeForNullDefaultAnnotation(IBinaryType binaryType, PackageBinding packageBinding, BinaryTypeBinding binaryBinding) {
+private void scanTypeForNullDefaultAnnotation(IBinaryType binaryType, PackageBinding packageBinding, BinaryTypeBinding binaryBinding) {
+	if (!isPrototype()) throw new IllegalStateException();
 	char[][] nonNullByDefaultAnnotationName = this.environment.getNonNullByDefaultAnnotationName();
 	if (nonNullByDefaultAnnotationName == null)
 		return; // not well-configured to use null annotations
@@ -1364,6 +1662,11 @@
 						annotationBit = TagBits.AnnotationNullUnspecifiedByDefault;
 						nullness = NULL_UNSPECIFIED_BY_DEFAULT;
 						break;
+					} else if (value instanceof Object[] && ((Object[])value).length == 0) {
+						// parameter is '{}': this means we cancel defaults from outer scopes:
+						annotationBit = TagBits.AnnotationNullUnspecifiedByDefault;
+						nullness = NULL_UNSPECIFIED_BY_DEFAULT;
+						break;
 					}
 				}
 				annotationBit = TagBits.AnnotationNonNullByDefault;
@@ -1413,11 +1716,37 @@
 	}
 }
 
+private void scanTypeForContainerAnnotation(IBinaryType binaryType, char[][][] missingTypeNames) {
+	if (!isPrototype()) throw new IllegalStateException();
+	IBinaryAnnotation[] annotations = binaryType.getAnnotations();
+	if (annotations != null) {
+		int length = annotations.length;
+		for (int i = 0; i < length; i++) {
+			char[] annotationTypeName = annotations[i].getTypeName();
+			if (CharOperation.equals(annotationTypeName, ConstantPool.JAVA_LANG_ANNOTATION_REPEATABLE)) {
+				IBinaryElementValuePair[] elementValuePairs = annotations[i].getElementValuePairs();
+				if (elementValuePairs != null && elementValuePairs.length == 1) {
+					Object value = elementValuePairs[0].getValue();
+					if (value instanceof ClassSignature) {
+						this.containerAnnotationType = (ReferenceBinding) this.environment.getTypeFromSignature(((ClassSignature)value).getTypeName(), 0, -1, false, null, missingTypeNames, TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER);
+					}
+				}
+				break;
+			}
+		}
+	}
+}
+
 /* Answer the receiver's superclass... null if the receiver is Object or an interface.
 *
 * NOTE: superclass of a binary type is resolved when needed
 */
 public ReferenceBinding superclass() {
+	
+	if (!isPrototype()) {
+		return this.superclass = this.prototype.superclass();
+	}
+	
 	if ((this.tagBits & TagBits.HasUnresolvedSuperclass) == 0)
 		return this.superclass;
 
@@ -1439,11 +1768,15 @@
 	}
 	this.typeBits |= (this.superclass.typeBits & TypeIds.InheritableBits);
 	if ((this.typeBits & (TypeIds.BitAutoCloseable|TypeIds.BitCloseable)) != 0) // avoid the side-effects of hasTypeBit()! 
-		this.typeBits |= applyCloseableWhitelists();
+		this.typeBits |= applyCloseableClassWhitelists();
 	return this.superclass;
 }
 // NOTE: superInterfaces of binary types are resolved when needed
 public ReferenceBinding[] superInterfaces() {
+	
+	if (!isPrototype()) {
+		return this.superInterfaces = this.prototype.superInterfaces();
+	}
 	if ((this.tagBits & TagBits.HasUnresolvedSuperinterfaces) == 0)
 		return this.superInterfaces;
 
@@ -1463,11 +1796,17 @@
 			}	
 		}
 		this.typeBits |= (this.superInterfaces[i].typeBits & TypeIds.InheritableBits);
+		if ((this.typeBits & (TypeIds.BitAutoCloseable|TypeIds.BitCloseable)) != 0) // avoid the side-effects of hasTypeBit()! 
+			this.typeBits |= applyCloseableInterfaceWhitelists();
 	}
 	this.tagBits &= ~TagBits.HasUnresolvedSuperinterfaces;
 	return this.superInterfaces;
 }
 public TypeVariableBinding[] typeVariables() {
+	
+	if (!isPrototype()) {
+		return this.typeVariables = this.prototype.typeVariables();
+	}
  	if ((this.tagBits & TagBits.HasUnresolvedTypeVariables) == 0)
 		return this.typeVariables;
 
@@ -1477,6 +1816,10 @@
 	return this.typeVariables;
 }
 public String toString() {
+	
+	if (this.hasTypeAnnotations())
+		return annotatedDebugName();
+	
 	StringBuffer buffer = new StringBuffer();
 
 	if (isDeprecated()) buffer.append("deprecated "); //$NON-NLS-1$
@@ -1562,11 +1905,24 @@
 	buffer.append("\n\n\n"); //$NON-NLS-1$
 	return buffer.toString();
 }
+
+public TypeBinding unannotated() {
+	return this.prototype;
+}
+
 MethodBinding[] unResolvedMethods() { // for the MethodVerifier so it doesn't resolve types
+	
+	if (!isPrototype())
+		return this.prototype.unResolvedMethods();
+	
 	return this.methods;
 }
 
 public FieldBinding[] unResolvedFields() {
+	
+	if (!isPrototype())
+		return this.prototype.unResolvedFields();
+	
 	return this.fields;
 }
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Binding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Binding.java
index 48cd463..e3cb8b7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Binding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Binding.java
@@ -5,14 +5,13 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 365531 - [compiler][null] investigate alternative strategy for internally encoding nullness defaults
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *     Jesper Steen Moller - Contributions for
+ *								Bug 412150 [1.8] [compiler] Enable reflected parameter names during annotation processing
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -45,6 +44,7 @@
 
 	// Shared binding collections
 	public static final TypeBinding[] NO_TYPES = new TypeBinding[0];
+	public static final ReferenceBinding[] NO_REFERENCE_TYPES = new ReferenceBinding[0];
 	public static final TypeBinding[] NO_PARAMETERS = new TypeBinding[0];
 	public static final ReferenceBinding[] NO_EXCEPTIONS = new ReferenceBinding[0];
 	public static final ReferenceBinding[] ANY_EXCEPTION = new ReferenceBinding[] { null }; // special handler for all exceptions
@@ -55,11 +55,15 @@
 	public static final TypeVariableBinding[] NO_TYPE_VARIABLES = new TypeVariableBinding[0];
 	public static final AnnotationBinding[] NO_ANNOTATIONS = new AnnotationBinding[0];
 	public static final ElementValuePair[] NO_ELEMENT_VALUE_PAIRS = new ElementValuePair[0];
-
+	public static final char[][] NO_PARAMETER_NAMES = new char[0][];
+	
 	public static final FieldBinding[] UNINITIALIZED_FIELDS = new FieldBinding[0];
 	public static final MethodBinding[] UNINITIALIZED_METHODS = new MethodBinding[0];
 	public static final ReferenceBinding[] UNINITIALIZED_REFERENCE_TYPES = new ReferenceBinding[0];
 
+	static final InferenceVariable[] NO_INFERENCE_VARIABLES = new InferenceVariable[0];
+	static final TypeBound[] NO_TYPE_BOUNDS = new TypeBound[0];
+
 	// Nullness defaults:
 	public static final int NO_NULL_DEFAULT = 0;
 	public static final int NULL_UNSPECIFIED_BY_DEFAULT = 1;
@@ -87,6 +91,8 @@
 	/**
 	 * Compute the tagbits for standard annotations. For source types, these could require
 	 * lazily resolving corresponding annotation nodes, in case of forward references.
+	 * For type use bindings, this method still returns the tagbits corresponding to the type 
+	 * declaration binding.
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding#getAnnotationTagBits()
 	 */
 	public long getAnnotationTagBits() {
@@ -102,6 +108,10 @@
 		// empty block
 	}
 
+	public boolean isAnnotationType() {
+		return false;
+	}
+	
 	/* API
 	* Answer true if the receiver is not a problem binding
 	*/
@@ -111,6 +121,9 @@
 	public boolean isVolatile() {
 		return false;
 	}
+	public boolean isTaggedRepeatable() {
+		return false;
+	}
 	public boolean isParameter() {
 		return false;
 	}
@@ -131,4 +144,13 @@
 	public char[] shortReadableName(){
 		return readableName();
 	}
+	public AnnotationBinding[] getAnnotations() {
+		return Binding.NO_ANNOTATIONS;
+	}
+	public void setAnnotations(AnnotationBinding[] annotations, Scope scope) {
+		setAnnotations(annotations);
+	}
+	public void setAnnotations(AnnotationBinding[] annotations) {
+		// Left to subtypes.
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java
index 38898bc..77b4294 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -41,6 +37,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class BlockScope extends Scope {
 
 	// Local variable management
@@ -164,12 +161,14 @@
  * in other words, it is inside an initializer, a constructor or a clinit
  */
 public final boolean allowBlankFinalFieldAssignment(FieldBinding binding) {
-	if (enclosingReceiverType() != binding.declaringClass)
+	if (TypeBinding.notEquals(enclosingReceiverType(), binding.declaringClass))
 		return false;
 
 	MethodScope methodScope = methodScope();
 	if (methodScope.isStatic != binding.isStatic())
 		return false;
+	if (methodScope.isLambdaScope()) 
+		return false;
 	return methodScope.isInsideInitializer() // inside initializer
 			|| ((AbstractMethodDeclaration) methodScope.referenceContext).isInitializationMethod(); // inside constructor or clinit
 }
@@ -268,7 +267,7 @@
 				// assign variable position
 				local.resolvedPosition = this.offset;
 
-				if ((local.type == TypeBinding.LONG) || (local.type == TypeBinding.DOUBLE)) {
+				if ((TypeBinding.equalsEquals(local.type, TypeBinding.LONG)) || (TypeBinding.equalsEquals(local.type, TypeBinding.DOUBLE))) {
 					this.offset += 2;
 				} else {
 					this.offset++;
@@ -794,7 +793,7 @@
 
 	// use 'this' if possible
 	if (!currentMethodScope.isStatic && !currentMethodScope.isConstructorCall) {
-		if (sourceType == targetEnclosingType || (!onlyExactMatch && sourceType.findSuperTypeOriginatingFrom(targetEnclosingType) != null)) {
+		if (TypeBinding.equalsEquals(sourceType, targetEnclosingType) || (!onlyExactMatch && sourceType.findSuperTypeOriginatingFrom(targetEnclosingType) != null)) {
 			return BlockScope.EmulationPathToImplicitThis; // implicit this is good enough
 		}
 	}
@@ -817,7 +816,7 @@
 			if (denyEnclosingArgInConstructorCall
 					&& currentMethodScope.isConstructorCall
 					&& !isAnonymousAndHasEnclosing
-					&& (sourceType == targetEnclosingType || (!onlyExactMatch && sourceType.findSuperTypeOriginatingFrom(targetEnclosingType) != null))) {
+					&& (TypeBinding.equalsEquals(sourceType, targetEnclosingType) || (!onlyExactMatch && sourceType.findSuperTypeOriginatingFrom(targetEnclosingType) != null))) {
 				return BlockScope.NoEnclosingInstanceInConstructorCall;
 			}
 			return new Object[] { syntheticArg };
@@ -840,7 +839,7 @@
 			if (enclosingArgument != null) {
 				FieldBinding syntheticField = sourceType.getSyntheticField(enclosingArgument);
 				if (syntheticField != null) {
-					if (syntheticField.type == targetEnclosingType || (!onlyExactMatch && ((ReferenceBinding)syntheticField.type).findSuperTypeOriginatingFrom(targetEnclosingType) != null))
+					if (TypeBinding.equalsEquals(syntheticField.type, targetEnclosingType) || (!onlyExactMatch && ((ReferenceBinding)syntheticField.type).findSuperTypeOriginatingFrom(targetEnclosingType) != null))
 						return new Object[] { syntheticField };
 				}
 			}
@@ -872,7 +871,7 @@
 		while ((currentEnclosingType = currentType.enclosingType()) != null) {
 
 			//done?
-			if (currentType == targetEnclosingType
+			if (TypeBinding.equalsEquals(currentType, targetEnclosingType)
 				|| (!onlyExactMatch && currentType.findSuperTypeOriginatingFrom(targetEnclosingType) != null))	break;
 
 			if (currentMethodScope != null) {
@@ -896,7 +895,7 @@
 			path[count++] = ((SourceTypeBinding) syntheticField.declaringClass).addSyntheticMethod(syntheticField, true/*read*/, false /*not super access*/);
 			currentType = currentEnclosingType;
 		}
-		if (currentType == targetEnclosingType
+		if (TypeBinding.equalsEquals(currentType, targetEnclosingType)
 			|| (!onlyExactMatch && currentType.findSuperTypeOriginatingFrom(targetEnclosingType) != null)) {
 			return path;
 		}
@@ -943,12 +942,14 @@
 	while (methodScope != null) {
 		if (methodScope.isStatic != isStatic)
 			return false;
+		if (methodScope.isLambdaScope())
+			return false;
 		if (!methodScope.isInsideInitializer() // inside initializer
 				&& !((AbstractMethodDeclaration) methodScope.referenceContext).isInitializationMethod()) { // inside constructor or clinit
 			return false; // found some non-initializer context
 		}
 		ReferenceBinding enclosingType = methodScope.enclosingReceiverType();
-		if (enclosingType == fieldDeclaringClass) {
+		if (TypeBinding.equalsEquals(enclosingType, fieldDeclaringClass)) {
 			return true; // found the field context, no need to check any further
 		}
 		if (!enclosingType.erasure().isAnonymousType()) {
@@ -982,7 +983,7 @@
 			SyntheticArgumentBinding syntheticArg = syntheticArguments[i];
 			// need to filter out the one that could match a supplied enclosing instance
 			if (!(isEnclosingInstanceSupplied
-				&& (syntheticArg.type == targetType.enclosingType()))) {
+				&& (TypeBinding.equalsEquals(syntheticArg.type, targetType.enclosingType())))) {
 				emulateOuterAccess(syntheticArg.actualOuterLocalVariable);
 			}
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java
new file mode 100644
index 0000000..ca1af60
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java
@@ -0,0 +1,970 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
+
+/**
+ * Implementation of 18.1.3 in JLS8.
+ * This class is also responsible for incorporation as defined in 18.3.
+ */
+class BoundSet {
+
+	static final BoundSet TRUE = new BoundSet();	// empty set of bounds
+	static final BoundSet FALSE = new BoundSet();	// pseudo bounds
+	
+	/**
+	 * For a given inference variable this structure holds all type bounds
+	 * with a relation in { SUPERTYPE, SAME, SUBTYPE }.
+	 * These are internally stored in three sets, one for each of the relations.
+	 */
+	private class ThreeSets {
+		Set<TypeBound> superBounds;
+		Set<TypeBound> sameBounds;
+		Set<TypeBound> subBounds;
+		TypeBinding	instantiation;
+		Map<InferenceVariable,TypeBound> inverseBounds; // from right inference variable to bound
+		
+		public ThreeSets() {
+			// empty, the sets are lazily initialized
+		}
+		/** Add a type bound to the appropriate set. */
+		public void addBound(TypeBound bound) {
+			switch (bound.relation) {
+				case ReductionResult.SUPERTYPE:
+					if (this.superBounds == null) this.superBounds = new HashSet<TypeBound>();
+					this.superBounds.add(bound);
+					break;
+				case ReductionResult.SAME:
+					if (this.sameBounds == null) this.sameBounds = new HashSet<TypeBound>();
+					this.sameBounds.add(bound);
+					break;
+				case ReductionResult.SUBTYPE:
+					if (this.subBounds == null) this.subBounds = new HashSet<TypeBound>();
+					this.subBounds.add(bound);
+					break;
+				default:
+					throw new IllegalArgumentException("Unexpected bound relation in : " + bound); //$NON-NLS-1$
+			}
+		}
+		// pre: this.superBounds != null
+		public TypeBinding[] lowerBounds(boolean onlyProper, InferenceVariable variable) {
+			TypeBinding[] boundTypes = new TypeBinding[this.superBounds.size()];
+			Iterator<TypeBound> it = this.superBounds.iterator();
+			long nullHints = variable.nullHints;
+			int i = 0;
+			while(it.hasNext()) {
+				TypeBound current = it.next();
+				TypeBinding boundType = current.right;
+				if (!onlyProper || boundType.isProperType(true)) {
+					boundTypes[i++] = boundType;
+					nullHints |= current.nullHints;
+				}
+			}
+			if (i == 0)
+				return Binding.NO_TYPES;
+			if (i < boundTypes.length)
+				System.arraycopy(boundTypes, 0, boundTypes=new TypeBinding[i], 0, i);
+			useNullHints(nullHints, boundTypes, variable.environment);
+			InferenceContext18.sortTypes(boundTypes);
+			return boundTypes;
+		}
+		// pre: this.subBounds != null
+		public TypeBinding[] upperBounds(boolean onlyProper, InferenceVariable variable) {
+			ReferenceBinding[] rights = new ReferenceBinding[this.subBounds.size()];
+			TypeBinding simpleUpper = null;
+			Iterator<TypeBound> it = this.subBounds.iterator();
+			long nullHints = variable.nullHints;
+			int i = 0;
+			while(it.hasNext()) {
+				TypeBinding right=it.next().right;
+				if (!onlyProper || right.isProperType(true)) {
+					if (right instanceof ReferenceBinding) {
+						rights[i++] = (ReferenceBinding) right;
+						nullHints |= right.tagBits & TagBits.AnnotationNullMASK; 
+					} else {
+						if (simpleUpper != null)
+							return Binding.NO_TYPES; // shouldn't
+						simpleUpper = right;
+					}
+				}
+			}
+			if (i == 0)
+				return Binding.NO_TYPES;
+			if (i == 1 && simpleUpper != null)
+				return new TypeBinding[] { simpleUpper }; // no nullHints since not a reference type
+			if (i < rights.length)
+				System.arraycopy(rights, 0, rights=new ReferenceBinding[i], 0, i);
+			useNullHints(nullHints, rights, variable.environment);
+			InferenceContext18.sortTypes(rights);
+			return rights;
+		}
+		public boolean hasDependency(InferenceVariable beta) {
+			if (this.superBounds != null && hasDependency(this.superBounds, beta))
+				return true;
+			if (this.sameBounds != null && hasDependency(this.sameBounds, beta))
+				return true;
+			if (this.subBounds != null && hasDependency(this.subBounds, beta))
+				return true;
+			if (this.inverseBounds != null) {
+				if (this.inverseBounds.containsKey(beta)) {
+					// TODO: not yet observed in tests
+					return true;
+				}
+			}
+			return false;
+		}
+		private boolean hasDependency(Set<TypeBound> someBounds, InferenceVariable var) {
+			Iterator<TypeBound> bIt = someBounds.iterator();
+			while (bIt.hasNext()) {
+				TypeBound bound = bIt.next();
+				if (bound.right == var || bound.right.mentionsAny(new TypeBinding[] {var}, -1)) //$IDENTITY-COMPARISON$ InferenceVariable
+					return true;
+			}
+			return false;
+		}
+		/** Total number of type bounds in this container. */
+		public int size() {
+			int size = 0;
+			if (this.superBounds != null)
+				size += this.superBounds.size();
+			if (this.sameBounds != null)
+				size += this.sameBounds.size();
+			if (this.subBounds != null)
+				size += this.subBounds.size();
+			return size;
+		}
+		public int flattenInto(TypeBound[] collected, int idx) {
+			if (this.superBounds != null) {
+				int len = this.superBounds.size();
+				System.arraycopy(this.superBounds.toArray(), 0, collected, idx, len);
+				idx += len;
+			}
+			if (this.sameBounds != null) {
+				int len = this.sameBounds.size();
+				System.arraycopy(this.sameBounds.toArray(), 0, collected, idx, len);
+				idx += len;
+			}
+			if (this.subBounds != null) {
+				int len = this.subBounds.size();
+				System.arraycopy(this.subBounds.toArray(), 0, collected, idx, len);
+				idx += len;
+			}
+			return idx;
+		}
+		public ThreeSets copy() {
+			ThreeSets copy = new ThreeSets();
+			if (this.superBounds != null)
+				copy.superBounds = new HashSet<TypeBound>(this.superBounds);
+			if (this.sameBounds != null)
+				copy.sameBounds = new HashSet<TypeBound>(this.sameBounds);
+			if (this.subBounds != null)
+				copy.subBounds = new HashSet<TypeBound>(this.subBounds);
+			copy.instantiation = this.instantiation;
+			return copy;
+		}
+		public TypeBinding findSingleWrapperType() {
+			TypeBinding wrapperBound = null;
+			if (this.subBounds != null) {
+				Iterator<TypeBound> it = this.subBounds.iterator();
+				while(it.hasNext()) {
+					TypeBinding boundType = it.next().right;
+					if ((boundType).isProperType(true)) {
+						switch (boundType.id) {
+							case TypeIds.T_JavaLangByte:
+							case TypeIds.T_JavaLangShort:
+							case TypeIds.T_JavaLangCharacter:
+							case TypeIds.T_JavaLangInteger:
+							case TypeIds.T_JavaLangLong:
+							case TypeIds.T_JavaLangFloat:
+							case TypeIds.T_JavaLangDouble:
+							case TypeIds.T_JavaLangBoolean:
+								if (wrapperBound != null)
+									return null;
+								wrapperBound = boundType;
+						}
+					}
+				}		
+			}
+			if (this.superBounds != null) {
+				Iterator<TypeBound> it = this.superBounds.iterator();
+				while(it.hasNext()) {
+					TypeBinding boundType = it.next().right;
+					if ((boundType).isProperType(true)) {
+						switch (boundType.id) {
+							case TypeIds.T_JavaLangByte:
+							case TypeIds.T_JavaLangShort:
+							case TypeIds.T_JavaLangCharacter:
+							case TypeIds.T_JavaLangInteger:
+							case TypeIds.T_JavaLangLong:
+							case TypeIds.T_JavaLangFloat:
+							case TypeIds.T_JavaLangDouble:
+							case TypeIds.T_JavaLangBoolean:
+								if (wrapperBound != null)
+									return null;
+								wrapperBound = boundType;
+						}
+					}
+				}		
+			}
+			return wrapperBound;
+		}
+		/**
+		 * Not per JLS: enhance the given type bounds using the nullHints, if useful.
+		 * Will only ever be effective if any TypeBounds carry nullHints,
+		 * which only happens if any TypeBindings have non-zero (tagBits & AnnotationNullMASK),
+		 * which only happens if null annotations are enabled in the first place.
+		 */
+		private void useNullHints(long nullHints, TypeBinding[] boundTypes, LookupEnvironment environment) {
+			AnnotationBinding[] annot = environment.nullAnnotationsFromTagBits(nullHints);
+			if (annot != null) {
+				// only get here if exactly one of @NonNull or @Nullable was hinted; now apply this hint:
+				for (int i = 0; i < boundTypes.length; i++)
+					boundTypes[i] = environment.createAnnotatedType(boundTypes[i], annot);
+			}
+		}
+		TypeBinding combineAndUseNullHints(TypeBinding type, long nullHints, LookupEnvironment environment) {
+			// precondition: only called when null annotations are enabled.
+			// TODO(optimization): may want to collect all nullHints in the ThreeSets, which, however,
+			// needs a reference TypeBound->ThreeSets to propagate the bits as they are added.
+			if (this.sameBounds != null) {
+				Iterator<TypeBound> it = this.sameBounds.iterator();
+				while(it.hasNext())
+					nullHints |= it.next().nullHints;
+			}
+			if (this.superBounds != null) {
+				Iterator<TypeBound> it = this.superBounds.iterator();
+				while(it.hasNext())
+					nullHints |= it.next().nullHints;
+			}
+			if (this.subBounds != null) {
+				Iterator<TypeBound> it = this.subBounds.iterator();
+				while(it.hasNext())
+					nullHints |= it.next().nullHints;
+			}
+			AnnotationBinding[] annot = environment.nullAnnotationsFromTagBits(nullHints);
+			if (annot != null)
+				// only get here if exactly one of @NonNull or @Nullable was hinted; now apply this hint:
+				return environment.createAnnotatedType(type, annot);
+			return type;
+		}
+		public void setInstantiation(TypeBinding type, InferenceVariable variable, LookupEnvironment environment) {
+			if (environment.globalOptions.isAnnotationBasedNullAnalysisEnabled) {
+				long oldBits = ((this.instantiation != null) ? this.instantiation.tagBits : variable.tagBits)
+								& TagBits.AnnotationNullMASK;
+				long requestedBits = type.tagBits & TagBits.AnnotationNullMASK;
+				long newBits = (oldBits == TagBits.AnnotationNonNull) ? oldBits : requestedBits; // need to preserve @NonNull
+				if (this.instantiation != null && oldBits == newBits) {
+					return; // no update needed
+				}
+				if (requestedBits != newBits) {
+					// adjust 'type' to fit the newBits
+					AnnotationBinding[] annot = environment.nullAnnotationsFromTagBits(newBits);
+					if (annot != null)
+						type = environment.createAnnotatedType(type.unannotated(), annot);
+				}
+			}
+			this.instantiation = type;
+		}
+	}
+	// main storage of type bounds:
+	HashMap<InferenceVariable, ThreeSets> boundsPerVariable = new HashMap<InferenceVariable, ThreeSets>();
+	
+	/**
+	 * 18.1.3 bullet 4: G<α1, ..., αn> = capture(G<A1, ..., An>)
+	 * On both sides we only enter types with nonnull arguments. 
+	 */
+	HashMap<ParameterizedTypeBinding,ParameterizedTypeBinding> captures = new HashMap<ParameterizedTypeBinding, ParameterizedTypeBinding>();
+	/** 18.1.3 bullet 5: throws α */
+	Set<InferenceVariable> inThrows = new HashSet<InferenceVariable>();
+
+	// avoid attempts to incorporate the same pair of type bounds more than once:
+	Set<TypeBound> incorporatedBounds = new HashSet<TypeBound>();
+
+	public BoundSet() {}
+	
+	// pre: typeParameters != null, variables[i].typeParameter == typeParameters[i]
+	public void addBoundsFromTypeParameters(InferenceContext18 context, TypeVariableBinding[] typeParameters, InferenceVariable[] variables) {
+		int length = typeParameters.length;
+		for (int i = 0; i < length; i++) {
+			TypeVariableBinding typeParameter = typeParameters[i];
+			InferenceVariable variable = variables[i];
+			TypeBound[] someBounds = typeParameter.getTypeBounds(variable, context);
+			boolean hasProperBound = false;
+			if (someBounds.length > 0)
+				hasProperBound = addBounds(someBounds, context.environment);
+			if (!hasProperBound)
+				addBound(new TypeBound(variable, context.object, ReductionResult.SUBTYPE), context.environment);
+		}
+	}
+
+	/** Answer a flat representation of this BoundSet. */
+	public TypeBound[] flatten() {
+		int size = 0;
+		Iterator<ThreeSets> outerIt = this.boundsPerVariable.values().iterator();
+		while (outerIt.hasNext())
+			size += outerIt.next().size();
+		TypeBound[] collected = new TypeBound[size];
+		if (size == 0) return collected;
+		outerIt = this.boundsPerVariable.values().iterator();
+		int idx = 0;
+		while (outerIt.hasNext())
+			idx = outerIt.next().flattenInto(collected, idx);
+		return collected;
+	}
+
+	/**
+	 * For resolution we work with a copy of the bound set, to enable retrying.
+	 * @return the new bound set.
+	 */
+	public BoundSet copy() {
+		BoundSet copy = new BoundSet();
+		Iterator<Entry<InferenceVariable, ThreeSets>> setsIterator = this.boundsPerVariable.entrySet().iterator();
+		while (setsIterator.hasNext()) {
+			Entry<InferenceVariable, ThreeSets> entry = setsIterator.next();
+			copy.boundsPerVariable.put(entry.getKey(), entry.getValue().copy());
+		}
+		copy.inThrows.addAll(this.inThrows);
+		copy.captures.putAll(this.captures);
+		return copy;
+	}
+
+	public void addBound(TypeBound bound, LookupEnvironment environment) {
+		ThreeSets three = this.boundsPerVariable.get(bound.left);
+		if (three == null)
+			this.boundsPerVariable.put(bound.left, (three = new ThreeSets()));
+		three.addBound(bound);
+		// check if this makes the inference variable instantiated:
+		TypeBinding typeBinding = bound.right;
+		if (bound.relation == ReductionResult.SAME && typeBinding.isProperType(true))
+			three.setInstantiation(typeBinding, bound.left, environment);
+		if (bound.right instanceof InferenceVariable) {
+			// for a dependency between two IVs make a note about the inverse bound.
+			// this should be needed to determine IV dependencies independent of direction.
+			// TODO: so far no test could be identified which actually needs it ...
+			InferenceVariable rightIV = (InferenceVariable) bound.right;
+			three = this.boundsPerVariable.get(rightIV);
+			if (three == null)
+				this.boundsPerVariable.put(rightIV, (three = new ThreeSets()));
+			if (three.inverseBounds == null)
+				three.inverseBounds = new HashMap<InferenceVariable,TypeBound>();
+			three.inverseBounds.put(rightIV, bound);
+		}
+	}
+
+	private boolean addBounds(TypeBound[] newBounds, LookupEnvironment environment) {
+		boolean hasProperBound = false;
+		for (int i = 0; i < newBounds.length; i++) {
+			addBound(newBounds[i], environment);
+			hasProperBound |= newBounds[i].isBound();
+		}
+		return hasProperBound;
+	}
+
+	public boolean isInstantiated(InferenceVariable inferenceVariable) {
+		ThreeSets three = this.boundsPerVariable.get(inferenceVariable);
+		if (three != null)
+			return three.instantiation != null;
+		return false;
+	}
+
+	public TypeBinding getInstantiation(InferenceVariable inferenceVariable, LookupEnvironment environment) {
+		ThreeSets three = this.boundsPerVariable.get(inferenceVariable);
+		if (three != null) {
+			TypeBinding instantiation = three.instantiation;
+			if (environment != null && environment.globalOptions.isAnnotationBasedNullAnalysisEnabled 
+					&& instantiation != null && (instantiation.tagBits & TagBits.AnnotationNullMASK) == 0)
+				return three.combineAndUseNullHints(instantiation, inferenceVariable.nullHints, environment);
+			return instantiation;
+		}
+		return null;
+	}
+
+	public int numUninstantiatedVariables(InferenceVariable[] variables) {
+		int num = 0;
+		for (int i = 0; i < variables.length; i++) {
+			if (!isInstantiated(variables[i]))
+				num++;
+		}
+		return num;
+	}
+
+	/**
+	 * <b>JLS 18.3:</b> Try to infer new constraints from pairs of existing type bounds.
+	 * Each new constraint is first reduced and checked for TRUE or FALSE, which will
+	 * abort the processing. 
+	 * @param context the context that manages our inference variables
+	 * @return false if any constraint resolved to false, true otherwise  
+	 * @throws InferenceFailureException a compile error has been detected during inference
+	 */
+	boolean incorporate(InferenceContext18 context) throws InferenceFailureException {
+		boolean hasUpdate;
+		do {
+			hasUpdate = false;
+			// using a flattened copy also allows us to insert more bounds during the process
+			// without disturbing the current round of incorporation:
+			TypeBound[] bounds = flatten();
+			int boundsCount = bounds.length;
+			if (boundsCount < 2)
+				return true;
+			// check each pair:
+			for (int i = 0; i < boundsCount; i++) {
+				TypeBound boundI = bounds[i];
+				for (int j = i+1; j < boundsCount; j++) {
+					TypeBound boundJ = bounds[j];
+					if (this.incorporatedBounds.contains(boundI) && this.incorporatedBounds.contains(boundJ))
+						continue;
+					ConstraintTypeFormula newConstraint = null;
+					switch (boundI.relation) {
+						case ReductionResult.SAME:
+							switch (boundJ.relation) {
+								case ReductionResult.SAME:
+									newConstraint = combineSameSame(boundI, boundJ);
+									break;
+								case ReductionResult.SUBTYPE:
+								case ReductionResult.SUPERTYPE:
+									newConstraint = combineSameSubSuper(boundI, boundJ);
+									break;
+							}
+							break;
+						case ReductionResult.SUBTYPE:
+							switch (boundJ.relation) {
+								case ReductionResult.SAME:
+									newConstraint = combineSameSubSuper(boundJ, boundI);
+									break;
+								case ReductionResult.SUPERTYPE:
+									newConstraint = combineSuperAndSub(boundJ, boundI);
+									break;
+								case ReductionResult.SUBTYPE:
+									newConstraint = combineEqualSupers(boundI, boundJ);
+									break;
+							}
+							break;
+						case ReductionResult.SUPERTYPE:
+							switch (boundJ.relation) {
+								case ReductionResult.SAME:
+									newConstraint = combineSameSubSuper(boundJ, boundI);
+									break;
+								case ReductionResult.SUBTYPE:
+									newConstraint = combineSuperAndSub(boundI, boundJ);
+									break;
+								case ReductionResult.SUPERTYPE:
+									newConstraint = combineEqualSupers(boundI, boundJ);
+									break;
+							}
+					}
+					if (newConstraint != null) {
+						if (!reduceOneConstraint(context, newConstraint))
+							return false;
+						// TODO here and below: better checking if constraint really added to the boundset (optimization)?
+						hasUpdate = true;
+						// not per JLS: if the new constraint relates types where at least one has a null annotations,
+						// record all null tagBits as hints for the final inference solution.
+						long nullHints = (newConstraint.left.tagBits | newConstraint.right.tagBits) & TagBits.AnnotationNullMASK;
+						boundI.nullHints |= nullHints;
+						boundJ.nullHints |= nullHints;
+					}
+					ConstraintFormula[] typeArgumentConstraints = deriveTypeArgumentConstraints(boundI, boundJ);
+					if (typeArgumentConstraints != null) {
+						for (int k = 0; k < typeArgumentConstraints.length; k++) {
+							if (!reduceOneConstraint(context, typeArgumentConstraints[k]))
+								return false;
+							hasUpdate = true;
+						}
+					}
+				}
+				this.incorporatedBounds.add(boundI);
+			}
+			/* TODO: are we sure this will always terminate? Cf. e.g. (Discussion in 18.3):
+			 *  
+			 *    "The assertion that incorporation reaches a fixed point oversimplifies the matter slightly. ..."
+			 */
+			Iterator<Entry<ParameterizedTypeBinding, ParameterizedTypeBinding>> captIter = this.captures.entrySet().iterator();
+			while (captIter.hasNext()) {
+				hasUpdate = true;
+				Entry<ParameterizedTypeBinding, ParameterizedTypeBinding> capt = captIter.next();
+				ParameterizedTypeBinding gAlpha = capt.getKey();
+				ParameterizedTypeBinding gA = capt.getValue();
+				ReferenceBinding g = (ReferenceBinding) gA.original();
+				TypeVariableBinding[] parameters = g.typeVariables();
+				for (int i = 0; i < parameters.length; i++) {
+					// A set of bounds on α1, ..., αn, constructed from the declared bounds of P1, ..., Pn as described in 18.1.3, is immediately implied.
+					TypeVariableBinding pi = parameters[i];
+					InferenceVariable alpha = (InferenceVariable) gAlpha.arguments[i];
+					addBounds(pi.getTypeBounds(alpha, context), context.environment);
+
+					TypeBinding ai = gA.arguments[i];
+					if (ai instanceof WildcardBinding) {
+						WildcardBinding wildcardBinding = (WildcardBinding)ai;
+						TypeBinding t = wildcardBinding.bound;
+						ThreeSets three = this.boundsPerVariable.get(alpha);
+						if (three != null) {
+							Iterator<TypeBound> it;
+							if (three.sameBounds != null) {
+								//  α = R implies false
+								it = three.sameBounds.iterator();
+								while (it.hasNext()) {
+									TypeBound bound = it.next();
+									if (!(bound.right instanceof InferenceVariable))
+										return false;
+								}
+							}
+							if (three.subBounds != null && pi.firstBound != null) {
+								// If Bi is Object, α <: R implies ⟨T <: R⟩	(extends wildcard)
+								// α <: R implies ⟨θ Bi <: R⟩				(else) 
+								it = three.subBounds.iterator();
+								while (it.hasNext()) {
+									TypeBound bound = it.next();
+									if (!(bound.right instanceof InferenceVariable)) {
+										TypeBinding r = bound.right;
+										TypeBinding bi1 = pi.firstBound;
+										ReferenceBinding[] otherBounds = pi.superInterfaces;
+										TypeBinding bi;
+										if (otherBounds == Binding.NO_SUPERINTERFACES) {
+											bi = bi1;
+										} else {
+											int n = otherBounds.length+1;
+											ReferenceBinding[] allBounds = new ReferenceBinding[n];
+											allBounds[0] = (ReferenceBinding) bi1; // TODO is this safe?
+											System.arraycopy(otherBounds, 0, allBounds, 1, n-1);
+											bi = new IntersectionCastTypeBinding(allBounds, context.environment);
+										}
+										addTypeBoundsFromWildcardBound(context, wildcardBinding.boundKind, t, r, bi);
+//										if (otherBounds != null) {
+//											for (int j = 0; j < otherBounds.length; j++) {
+//												TypeBinding tj = otherBounds[j];
+//												if (TypeBinding.notEquals(tj, t))
+//													addTypeBoundsFromWildcardBound(context, wildcardBinding, tj, r, bij);
+//											}
+//										}
+									}
+								}
+							}
+							if (three.superBounds != null) {
+								//  R <: α implies ⟨R <: T⟩  (super wildcard)
+								//  R <: α implies false	 (else) 
+								it = three.superBounds.iterator();
+								while (it.hasNext()) {
+									TypeBound bound = it.next();
+									if (!(bound.right instanceof InferenceVariable)) {
+										if (wildcardBinding.boundKind == Wildcard.SUPER)
+											reduceOneConstraint(context, ConstraintTypeFormula.create(bound.right, t, ReductionResult.SUBTYPE));
+										else
+											return false;
+									}
+								}
+							}
+						}
+					} else {
+						addBound(new TypeBound(alpha, ai, ReductionResult.SAME), context.environment);
+					}
+				}
+			}
+			this.captures.clear();
+		} while (hasUpdate);
+		return true;
+	}
+
+	void addTypeBoundsFromWildcardBound(InferenceContext18 context, int boundKind, TypeBinding t,
+			TypeBinding r, TypeBinding bi) throws InferenceFailureException {
+		ConstraintFormula formula = null;
+		if (boundKind == Wildcard.EXTENDS) {
+			if (bi.id == TypeIds.T_JavaLangObject)
+				formula = ConstraintTypeFormula.create(t, r, ReductionResult.SUBTYPE);
+			if (t.id == TypeIds.T_JavaLangObject)
+				formula = ConstraintTypeFormula.create(context.substitute(bi), r, ReductionResult.SUBTYPE);
+		} else {
+			formula = ConstraintTypeFormula.create(context.substitute(bi), r, ReductionResult.SUBTYPE);
+		}
+		if (formula != null)
+			reduceOneConstraint(context, formula);
+	}
+
+	private ConstraintTypeFormula combineSameSame(TypeBound boundS, TypeBound boundT) {
+		
+		// α = S and α = T imply ⟨S = T⟩
+		if (boundS.left == boundT.left) //$IDENTITY-COMPARISON$ InferenceVariable
+			return ConstraintTypeFormula.create(boundS.right, boundT.right, ReductionResult.SAME, boundS.isSoft||boundT.isSoft);
+
+		// match against more shapes:
+		ConstraintTypeFormula newConstraint;
+		newConstraint = combineSameSameWithProperType(boundS, boundT);
+		if (newConstraint != null)
+			return newConstraint;
+		newConstraint = combineSameSameWithProperType(boundT, boundS);
+		if (newConstraint != null)
+			return newConstraint;
+		return null;
+	}
+
+	// pre: boundLeft.left != boundRight.left
+	private ConstraintTypeFormula combineSameSameWithProperType(TypeBound boundLeft, TypeBound boundRight) {
+		//  α = U and S = T imply ⟨S[α:=U] = T[α:=U]⟩
+		TypeBinding u = boundLeft.right;
+		if (u.isProperType(true)) {
+			InferenceVariable alpha = boundLeft.left;
+			TypeBinding left = boundRight.left; // no substitution since S inference variable and (S != α) per precondition
+			TypeBinding right = boundRight.right.substituteInferenceVariable(alpha, u);
+			return ConstraintTypeFormula.create(left, right, ReductionResult.SAME, boundLeft.isSoft||boundRight.isSoft);
+		}
+		return null;
+	}
+	
+	private ConstraintTypeFormula combineSameSubSuper(TypeBound boundS, TypeBound boundT) {
+		//  α = S and α <: T imply ⟨S <: T⟩ 
+		//  α = S and T <: α imply ⟨T <: S⟩
+		InferenceVariable alpha = boundS.left;
+		TypeBinding s = boundS.right;
+		if (alpha == boundT.left) //$IDENTITY-COMPARISON$ InferenceVariable
+			return ConstraintTypeFormula.create(s, boundT.right, boundT.relation, boundT.isSoft||boundS.isSoft);
+		if (alpha == boundT.right) //$IDENTITY-COMPARISON$ InferenceVariable
+			return ConstraintTypeFormula.create(boundT.right, s, boundT.relation, boundT.isSoft||boundS.isSoft);
+
+		if (boundS.right instanceof InferenceVariable) {
+			// reverse:
+			alpha = (InferenceVariable) boundS.right;
+			s = boundS.left;
+			if (alpha == boundT.left) //$IDENTITY-COMPARISON$ InferenceVariable
+				return ConstraintTypeFormula.create(s, boundT.right, boundT.relation, boundT.isSoft||boundS.isSoft);
+			if (alpha == boundT.right) //$IDENTITY-COMPARISON$ InferenceVariable
+				return ConstraintTypeFormula.create(boundT.right, s, boundT.relation, boundT.isSoft||boundS.isSoft);			
+		}
+		
+		//  α = U and S <: T imply ⟨S[α:=U] <: T[α:=U]⟩ 
+		TypeBinding u = boundS.right;
+		if (u.isProperType(true)) {
+			TypeBinding left = (alpha == boundT.left) ? u : boundT.left; //$IDENTITY-COMPARISON$ InferenceVariable
+			TypeBinding right = boundT.right.substituteInferenceVariable(alpha, u);
+			return ConstraintTypeFormula.create(left, right, boundT.relation, boundT.isSoft||boundS.isSoft);
+		}
+		return null;
+	}
+
+	private ConstraintTypeFormula combineSuperAndSub(TypeBound boundS, TypeBound boundT) {
+		//  permutations of: S <: α and α <: T imply ⟨S <: T⟩
+		InferenceVariable alpha = boundS.left;
+		if (alpha == boundT.left) //$IDENTITY-COMPARISON$ InferenceVariable
+			//  α >: S and α <: T imply ⟨S <: T⟩
+			return ConstraintTypeFormula.create(boundS.right, boundT.right, ReductionResult.SUBTYPE, boundT.isSoft||boundS.isSoft);
+		if (boundS.right instanceof InferenceVariable) {
+			// try reverse:
+			alpha = (InferenceVariable) boundS.right;
+			if (alpha == boundT.right) //$IDENTITY-COMPARISON$ InferenceVariable
+				// S :> α and T <: α  imply ⟨S :> T⟩
+				return ConstraintTypeFormula.create(boundS.left, boundT.left, ReductionResult.SUPERTYPE, boundT.isSoft||boundS.isSoft);
+		}
+		return null;
+	}
+	
+	private ConstraintTypeFormula combineEqualSupers(TypeBound boundS, TypeBound boundT) {
+		//  more permutations of: S <: α and α <: T imply ⟨S <: T⟩
+		if (boundS.left == boundT.right) //$IDENTITY-COMPARISON$ InferenceVariable
+			// came in as: α REL S and T REL α imply ⟨T REL S⟩ 
+			return ConstraintTypeFormula.create(boundT.left, boundS.right, boundS.relation, boundT.isSoft||boundS.isSoft);
+		if (boundS.right == boundT.left) //$IDENTITY-COMPARISON$ InferenceVariable
+			// came in as: S REL α and α REL T imply ⟨S REL T⟩ 
+			return ConstraintTypeFormula.create(boundS.left, boundT.right, boundS.relation, boundT.isSoft||boundS.isSoft);
+		return null;
+	}
+
+
+	private ConstraintTypeFormula[] deriveTypeArgumentConstraints(TypeBound boundS, TypeBound boundT) {
+		/* From 18.4:
+		 *  If two bounds have the form α <: S and α <: T, and if for some generic class or interface, G,
+		 *  there exists a supertype (4.10) of S of the form G<S1, ..., Sn> and a supertype of T of the form G<T1, ..., Tn>,
+		 *  then for all i, 1 ≤ i ≤ n, if Si and Ti are types (not wildcards), the constraint ⟨Si = Ti⟩ is implied. 
+		 */
+		if (boundS.relation != ReductionResult.SUBTYPE || boundT.relation != ReductionResult.SUBTYPE)
+			return null;
+		if (boundS.left != boundT.left) //$IDENTITY-COMPARISON$ InferenceVariable
+			return null;
+		TypeBinding[] supers = superTypesWithCommonGenericType(boundS.right, boundT.right);
+		if (supers != null)
+			return typeArgumentEqualityConstraints(supers[0], supers[1], boundS.isSoft || boundT.isSoft);
+		return null;
+	}
+
+	private ConstraintTypeFormula[] typeArgumentEqualityConstraints(TypeBinding s, TypeBinding t, boolean isSoft) {
+		if (s == null || s.kind() != Binding.PARAMETERIZED_TYPE || t == null || t.kind() != Binding.PARAMETERIZED_TYPE)
+			return null;
+		if (TypeBinding.equalsEquals(s, t)) // don't create useless constraints
+			return null;
+		TypeBinding[] sis = s.typeArguments();
+		TypeBinding[] tis = t.typeArguments();
+		if (sis == null || tis == null || sis.length != tis.length)
+			return null;
+		List<ConstraintTypeFormula> result = new ArrayList<ConstraintTypeFormula>(); 
+		for (int i = 0; i < sis.length; i++) {
+			TypeBinding si = sis[i];
+			TypeBinding ti = tis[i];
+			if (si.isWildcard() || ti.isWildcard() || TypeBinding.equalsEquals(si, ti))
+				continue;
+			result.add(ConstraintTypeFormula.create(si, ti, ReductionResult.SAME, isSoft));
+		}
+		if (result.size() > 0)
+			return result.toArray(new ConstraintTypeFormula[result.size()]);
+		return null;
+	}
+
+	/**
+	 * Try to reduce the one given constraint.
+	 * If a constraint produces further constraints reduce those recursively.
+	 * @throws InferenceFailureException a compile error has been detected during inference
+	 */
+	public boolean reduceOneConstraint(InferenceContext18 context, ConstraintFormula currentConstraint) throws InferenceFailureException {
+		Object result = currentConstraint.reduce(context);
+		if (result == ReductionResult.FALSE)
+			return false;
+		if (result == ReductionResult.TRUE)
+			return true;
+		if (result == currentConstraint) {
+			// not reduceable
+			throw new IllegalStateException("Failed to reduce constraint formula"); //$NON-NLS-1$
+		}
+		if (result != null) {
+			if (result instanceof ConstraintFormula) {
+				if (!reduceOneConstraint(context, (ConstraintFormula) result))
+					return false;
+			} else if (result instanceof ConstraintFormula[]) {
+				ConstraintFormula[] resultArray = (ConstraintFormula[]) result;
+				for (int i = 0; i < resultArray.length; i++)
+					if (!reduceOneConstraint(context, resultArray[i]))
+						return false;
+			} else {
+				addBound((TypeBound)result, context.environment);
+			}
+		}
+		return true; // no FALSE encountered
+	}
+
+	/**
+	 * Helper for resolution (18.4):
+	 * Does this bound set define a direct dependency between the two given inference variables? 
+	 */
+	public boolean dependsOnResolutionOf(InferenceVariable alpha, InferenceVariable beta) {
+		Iterator<Map.Entry<ParameterizedTypeBinding, ParameterizedTypeBinding>> captureIter = this.captures.entrySet().iterator();
+		boolean betaIsInCaptureLhs = false;
+		while (captureIter.hasNext()) { // TODO: optimization: consider separate index structure (by IV)
+			Entry<ParameterizedTypeBinding, ParameterizedTypeBinding> entry = captureIter.next();
+			ParameterizedTypeBinding g = entry.getKey();
+			for (int i = 0; i < g.arguments.length; i++) {
+				if (g.arguments[i] == alpha) { //$IDENTITY-COMPARISON$ InferenceVariable
+					// An inference variable α appearing on the left-hand side of a bound of the form G<..., α, ...> = capture(G<...>)
+					// depends on the resolution of every other inference variable mentioned in this bound (on both sides of the = sign).
+					ParameterizedTypeBinding captured = entry.getValue();
+					if (captured.mentionsAny(new TypeBinding[]{beta}, -1/*don't care about index*/))
+						return true;
+					if (g.mentionsAny(new TypeBinding[]{beta}, i)) // exclude itself 
+						return true;
+				} else if (g.arguments[i] == beta) { //$IDENTITY-COMPARISON$ InferenceVariable
+					betaIsInCaptureLhs = true;
+				}
+			}
+		}
+		if (betaIsInCaptureLhs) { // swap α and β in the rule text to cover "then β depends on the resolution of α"
+			ThreeSets sets = this.boundsPerVariable.get(beta);
+			if (sets != null && sets.hasDependency(alpha))
+				return true;
+		} else {
+			ThreeSets sets = this.boundsPerVariable.get(alpha);
+			if (sets != null && sets.hasDependency(beta))
+				return true;
+		}
+		return false;
+	}
+
+	// helper for 18.4
+	public boolean hasCaptureBound(Set<InferenceVariable> variableSet) {
+		Iterator<ParameterizedTypeBinding> captureIter = this.captures.keySet().iterator();
+		while (captureIter.hasNext()) {
+			ParameterizedTypeBinding g = captureIter.next();
+			for (int i = 0; i < g.arguments.length; i++)
+				if (variableSet.contains(g.arguments[i]))
+					return true;
+		}
+		return false;
+	}
+
+	// helper for 18.4
+	public boolean hasOnlyTrivialExceptionBounds(InferenceVariable variable, TypeBinding[] upperBounds) {
+		if (upperBounds != null) {
+			for (int i = 0; i < upperBounds.length; i++) {
+				switch (upperBounds[i].id) {
+					case TypeIds.T_JavaLangException:
+					case TypeIds.T_JavaLangThrowable:
+					case TypeIds.T_JavaLangObject:
+						continue;
+				}
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * JLS 18.1.3:
+	 * Answer all upper bounds for the given inference variable as defined by any bounds in this set. 
+	 */
+	public TypeBinding[] upperBounds(InferenceVariable variable, boolean onlyProper) {
+		ThreeSets three = this.boundsPerVariable.get(variable);
+		if (three == null || three.subBounds == null)
+			return Binding.NO_TYPES;
+		return three.upperBounds(onlyProper, variable);
+		// TODO: if !onlyProper: should we also consider ThreeSets.inverseBounds,
+		//        or is it safe to rely on incorporation to produce the required bounds?
+	}
+	
+	/**
+	 * JLS 18.1.3:
+	 * Answer all lower bounds for the given inference variable as defined by any bounds in this set. 
+	 */
+	TypeBinding[] lowerBounds(InferenceVariable variable, boolean onlyProper) {
+		ThreeSets three = this.boundsPerVariable.get(variable);
+		if (three == null || three.superBounds == null)
+			return Binding.NO_TYPES;
+		return three.lowerBounds(onlyProper, variable);
+		// bounds where 'variable' appears at the RHS are not relevant because
+		// we're only interested in bounds with a proper type, but if 'variable'
+		// appears as RHS the bound is by construction an inference variable,too.
+	}
+
+	// debugging:
+	public String toString() {
+		StringBuffer buf = new StringBuffer("Type Bounds:\n"); //$NON-NLS-1$
+		TypeBound[] flattened = flatten();
+		for (int i = 0; i < flattened.length; i++) {
+			buf.append('\t').append(flattened[i].toString()).append('\n');
+		}
+		buf.append("Capture Bounds:\n"); //$NON-NLS-1$
+		Iterator<Map.Entry<ParameterizedTypeBinding,ParameterizedTypeBinding>> captIter = this.captures.entrySet().iterator();
+		while (captIter.hasNext()) {
+			Entry<ParameterizedTypeBinding, ParameterizedTypeBinding> capt = captIter.next();
+			String lhs = String.valueOf(((TypeBinding)capt.getKey()).shortReadableName());
+			String rhs = String.valueOf(((TypeBinding)capt.getValue()).shortReadableName());
+			buf.append('\t').append(lhs).append(" = capt(").append(rhs).append(")\n"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		return buf.toString();
+	}
+
+	public TypeBinding findWrapperTypeBound(InferenceVariable variable) {
+		ThreeSets three = this.boundsPerVariable.get(variable);
+		if (three == null) return null;
+		return three.findSingleWrapperType();
+	}
+
+	// this condition is just way too complex to check it in-line:
+	public boolean condition18_5_2_bullet_3_3_1(InferenceVariable alpha, TypeBinding targetType) {
+		// T is a reference type, but is not a wildcard-parameterized type, and either 
+		// i) B2 contains a bound of one of the forms α = S or S <: α, where S is a wildcard-parameterized type, or ...
+		if (targetType.isBaseType()) return false;
+		if (InferenceContext18.parameterizedWithWildcard(targetType) != null) return false;
+		ThreeSets ts = this.boundsPerVariable.get(alpha);
+		if (ts.sameBounds != null) {
+			Iterator<TypeBound> bounds = ts.sameBounds.iterator();
+			while (bounds.hasNext()) {
+				TypeBound bound = bounds.next();
+				if (InferenceContext18.parameterizedWithWildcard(bound.right) != null)
+					return true;
+			}
+		}
+		if (ts.superBounds != null) {
+			Iterator<TypeBound> bounds = ts.superBounds.iterator();
+			while (bounds.hasNext()) {
+				TypeBound bound = bounds.next();
+				if (InferenceContext18.parameterizedWithWildcard(bound.right) != null)
+					return true;
+			}
+		}
+		// ii) B2 contains two bounds of the forms S1 <: α and S2 <: α, where
+		//     S1 and S2 have supertypes (4.10) that are two different parameterizations of the same generic class or interface.
+		if (ts.superBounds != null) {
+			ArrayList<TypeBound> superBounds = new ArrayList<TypeBound>(ts.superBounds);
+			int len = superBounds.size();
+			for (int i=0; i<len; i++) {
+				TypeBinding s1 = superBounds.get(i).right;
+				for (int j=i+1; j<len; j++) {
+					TypeBinding s2 = superBounds.get(j).right;
+					TypeBinding[] supers = superTypesWithCommonGenericType(s1, s2);
+					if (supers != null && !TypeBinding.equalsEquals(supers[0], supers[1]))
+						return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	public boolean condition18_5_2_bullet_3_3_2(InferenceVariable alpha, TypeBinding targetType, InferenceContext18 ctx18) {
+		// T is a parameterization of a generic class or interface, G, and
+		// B2 contains a bound of one of the forms α = S or S <: α,
+		//   where there exists no type of the form G<...> that is a supertype of S, but the raw type G is a supertype of S.
+		if (!targetType.isParameterizedType()) return false;
+		TypeBinding g = targetType.original();
+		ThreeSets ts = this.boundsPerVariable.get(alpha);
+		Iterator<TypeBound> boundIterator;
+		if (ts.sameBounds != null) {
+			boundIterator = ts.sameBounds.iterator();
+			while (boundIterator.hasNext()) {
+				TypeBound b = boundIterator.next();
+				if (superOnlyRaw(g, b.right, ctx18.environment))
+					return true;
+			}
+		}
+		if (ts.superBounds != null) {
+			boundIterator = ts.superBounds.iterator();
+			while (boundIterator.hasNext()) {
+				TypeBound b = boundIterator.next();
+				if (superOnlyRaw(g, b.right, ctx18.environment))
+					return true;
+			}
+		}
+		return false;
+	}
+	private boolean superOnlyRaw(TypeBinding g, TypeBinding s, LookupEnvironment env) {
+		if (s instanceof InferenceVariable)
+			return false; // inference has no super types
+		if (s.findSuperTypeOriginatingFrom(g) == null)
+			return s.isCompatibleWith(env.convertToRawType(g, false));
+		return false;
+	}
+	
+	protected TypeBinding[] superTypesWithCommonGenericType(TypeBinding s, TypeBinding t) {
+		if (s == null || s.id == TypeIds.T_JavaLangObject || t == null || t.id == TypeIds.T_JavaLangObject)
+			return null;
+		if (TypeBinding.equalsEquals(s.original(), t.original())) {
+			return new TypeBinding[] { s, t };
+		}
+		TypeBinding tSuper = t.findSuperTypeOriginatingFrom(s);
+		if (tSuper != null) {
+			return new TypeBinding[] {s, tSuper};
+		}
+		TypeBinding[] result = superTypesWithCommonGenericType(s.superclass(), t);
+		if (result != null)
+			return result;
+		ReferenceBinding[] superInterfaces = s.superInterfaces();
+		if (superInterfaces != null) {
+			for (int i = 0; i < superInterfaces.length; i++) {
+				result = superTypesWithCommonGenericType(superInterfaces[i], t);
+				if (result != null)
+					return result;
+			}
+		}
+		return null;
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.java
index c5d87ba..32a9d58 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,12 +7,16 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 429384 - [1.8][null] implement conformance rules for null-annotated lower / upper type bounds
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 public class CaptureBinding extends TypeVariableBinding {
 
@@ -32,6 +36,36 @@
 		this.sourceType = sourceType;
 		this.position = position;
 		this.captureID = captureID;
+		this.tagBits |= TagBits.HasCapturedWildcard;
+		if (wildcard.hasTypeAnnotations()) {
+			setTypeAnnotations(wildcard.getTypeAnnotations(), wildcard.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled);
+			if (wildcard.hasNullTypeAnnotations())
+				this.tagBits |= TagBits.HasNullTypeAnnotation;
+		}
+	}
+	
+	// for subclass CaptureBinding18
+	protected CaptureBinding(ReferenceBinding sourceType, char[] sourceName, int position, int captureID, LookupEnvironment environment) {
+		super(sourceName, null, 0, environment);
+		this.modifiers = ClassFileConstants.AccPublic | ExtraCompilerModifiers.AccGenericSignature; // treat capture as public
+		this.sourceType = sourceType;
+		this.position = position;
+		this.captureID = captureID;
+	}
+
+	public CaptureBinding(CaptureBinding prototype) {
+		super(prototype);
+		this.wildcard = prototype.wildcard;
+		this.sourceType = prototype.sourceType;
+		this.position = prototype.position;
+		this.captureID = prototype.captureID;
+		this.lowerBound = prototype.lowerBound;
+		this.tagBits |= (prototype.tagBits & TagBits.HasCapturedWildcard);
+	}
+	
+	// Captures may get cloned and annotated during type inference.
+	public TypeBinding clone(TypeBinding enclosingType) {
+		return new CaptureBinding(this);
 	}
 
 	/*
@@ -59,6 +93,11 @@
 
 		if (this.wildcard != null) {
 			StringBuffer buffer = new StringBuffer(10);
+			AnnotationBinding [] annotations = getTypeAnnotations();
+			for (int i = 0, length = annotations == null ? 0 : annotations.length; i < length; i++) {
+				buffer.append(annotations[i]);
+				buffer.append(' ');
+			}
 			buffer
 				.append(TypeConstants.WILDCARD_CAPTURE_NAME_PREFIX)
 				.append(this.captureID)
@@ -91,30 +130,30 @@
 					// still need to capture bound supertype as well so as not to expose wildcards to the outside (111208)
 					TypeBinding capturedWildcardBound = originalWildcardBound.capture(scope, this.position);
 					if (originalWildcardBound.isInterface()) {
-						this.superclass = scope.getJavaLangObject();
-						this.superInterfaces = new ReferenceBinding[] { (ReferenceBinding) capturedWildcardBound };
+						this.setSuperClass(scope.getJavaLangObject());
+						this.setSuperInterfaces(new ReferenceBinding[] { (ReferenceBinding) capturedWildcardBound });
 					} else {
 						// the wildcard bound should be a subtype of variable superclass
 						// it may occur that the bound is less specific, then consider glb (202404)
-						if (capturedWildcardBound.isArrayType() || capturedWildcardBound == this) {
-							this.superclass = scope.getJavaLangObject();
+						if (capturedWildcardBound.isArrayType() || TypeBinding.equalsEquals(capturedWildcardBound, this)) {
+							this.setSuperClass(scope.getJavaLangObject());
 						} else {
-							this.superclass = (ReferenceBinding) capturedWildcardBound;
+							this.setSuperClass((ReferenceBinding) capturedWildcardBound);
 						}
-						this.superInterfaces = Binding.NO_SUPERINTERFACES;
+						this.setSuperInterfaces(Binding.NO_SUPERINTERFACES);
 					}
-					this.firstBound =  capturedWildcardBound;
+					this.setFirstBound(capturedWildcardBound);
 					if ((capturedWildcardBound.tagBits & TagBits.HasTypeVariable) == 0)
 						this.tagBits &= ~TagBits.HasTypeVariable;
 					break;
 				case Wildcard.UNBOUND :
-					this.superclass = scope.getJavaLangObject();
-					this.superInterfaces = Binding.NO_SUPERINTERFACES;
+					this.setSuperClass(scope.getJavaLangObject());
+					this.setSuperInterfaces(Binding.NO_SUPERINTERFACES);
 					this.tagBits &= ~TagBits.HasTypeVariable;
 					break;
 				case Wildcard.SUPER :
-					this.superclass = scope.getJavaLangObject();
-					this.superInterfaces = Binding.NO_SUPERINTERFACES;
+					this.setSuperClass(scope.getJavaLangObject());
+					this.setSuperInterfaces(Binding.NO_SUPERINTERFACES);
 					this.lowerBound = this.wildcard.bound;
 					if ((originalWildcardBound.tagBits & TagBits.HasTypeVariable) == 0)
 						this.tagBits &= ~TagBits.HasTypeVariable;
@@ -125,14 +164,14 @@
 		ReferenceBinding originalVariableSuperclass = wildcardVariable.superclass;
 		ReferenceBinding substitutedVariableSuperclass = (ReferenceBinding) Scope.substitute(capturedParameterizedType, originalVariableSuperclass);
 		// prevent cyclic capture: given X<T>, capture(X<? extends T> could yield a circular type
-		if (substitutedVariableSuperclass == this) substitutedVariableSuperclass = originalVariableSuperclass;
+		if (TypeBinding.equalsEquals(substitutedVariableSuperclass, this)) substitutedVariableSuperclass = originalVariableSuperclass;
 
 		ReferenceBinding[] originalVariableInterfaces = wildcardVariable.superInterfaces();
 		ReferenceBinding[] substitutedVariableInterfaces = Scope.substitute(capturedParameterizedType, originalVariableInterfaces);
 		if (substitutedVariableInterfaces != originalVariableInterfaces) {
 			// prevent cyclic capture: given X<T>, capture(X<? extends T> could yield a circular type
 			for (int i = 0, length = substitutedVariableInterfaces.length; i < length; i++) {
-				if (substitutedVariableInterfaces[i] == this) substitutedVariableInterfaces[i] = originalVariableInterfaces[i];
+				if (TypeBinding.equalsEquals(substitutedVariableInterfaces[i], this)) substitutedVariableInterfaces[i] = originalVariableInterfaces[i];
 			}
 		}
 		// no substitution for wildcard bound (only formal bounds from type variables are to be substituted: 104082)
@@ -143,44 +182,44 @@
 				// still need to capture bound supertype as well so as not to expose wildcards to the outside (111208)
 				TypeBinding capturedWildcardBound = originalWildcardBound.capture(scope, this.position);
 				if (originalWildcardBound.isInterface()) {
-					this.superclass = substitutedVariableSuperclass;
+					this.setSuperClass(substitutedVariableSuperclass);
 					// merge wildcard bound into variable superinterfaces using glb
 					if (substitutedVariableInterfaces == Binding.NO_SUPERINTERFACES) {
-						this.superInterfaces = new ReferenceBinding[] { (ReferenceBinding) capturedWildcardBound };
+						this.setSuperInterfaces(new ReferenceBinding[] { (ReferenceBinding) capturedWildcardBound });
 					} else {
 						int length = substitutedVariableInterfaces.length;
 						System.arraycopy(substitutedVariableInterfaces, 0, substitutedVariableInterfaces = new ReferenceBinding[length+1], 1, length);
 						substitutedVariableInterfaces[0] =  (ReferenceBinding) capturedWildcardBound;
-						this.superInterfaces = Scope.greaterLowerBound(substitutedVariableInterfaces);
+						this.setSuperInterfaces(Scope.greaterLowerBound(substitutedVariableInterfaces));
 					}
 				} else {
 					// the wildcard bound should be a subtype of variable superclass
 					// it may occur that the bound is less specific, then consider glb (202404)
-					if (capturedWildcardBound.isArrayType() || capturedWildcardBound == this) {
-						this.superclass = substitutedVariableSuperclass;
+					if (capturedWildcardBound.isArrayType() || TypeBinding.equalsEquals(capturedWildcardBound, this)) {
+						this.setSuperClass(substitutedVariableSuperclass);
 					} else {
-						this.superclass = (ReferenceBinding) capturedWildcardBound;
+						this.setSuperClass((ReferenceBinding) capturedWildcardBound);
 						if (this.superclass.isSuperclassOf(substitutedVariableSuperclass)) {
-							this.superclass = substitutedVariableSuperclass;
+							this.setSuperClass(substitutedVariableSuperclass);
 						}
 					}
-					this.superInterfaces = substitutedVariableInterfaces;
+					this.setSuperInterfaces(substitutedVariableInterfaces);
 				}
-				this.firstBound =  capturedWildcardBound;
+				this.setFirstBound(capturedWildcardBound);
 				if ((capturedWildcardBound.tagBits & TagBits.HasTypeVariable) == 0)
 					this.tagBits &= ~TagBits.HasTypeVariable;
 				break;
 			case Wildcard.UNBOUND :
-				this.superclass = substitutedVariableSuperclass;
-				this.superInterfaces = substitutedVariableInterfaces;
+				this.setSuperClass(substitutedVariableSuperclass);
+				this.setSuperInterfaces(substitutedVariableInterfaces);
 				this.tagBits &= ~TagBits.HasTypeVariable;
 				break;
 			case Wildcard.SUPER :
-				this.superclass = substitutedVariableSuperclass;
-				if (wildcardVariable.firstBound == substitutedVariableSuperclass || originalWildcardBound == substitutedVariableSuperclass) {
-					this.firstBound = substitutedVariableSuperclass;
+				this.setSuperClass(substitutedVariableSuperclass);
+				if (TypeBinding.equalsEquals(wildcardVariable.firstBound, substitutedVariableSuperclass) || TypeBinding.equalsEquals(originalWildcardBound, substitutedVariableSuperclass)) {
+					this.setFirstBound(substitutedVariableSuperclass);
 				}
-				this.superInterfaces = substitutedVariableInterfaces;
+				this.setSuperInterfaces(substitutedVariableInterfaces);
 				this.lowerBound = originalWildcardBound;
 				if ((originalWildcardBound.tagBits & TagBits.HasTypeVariable) == 0)
 					this.tagBits &= ~TagBits.HasTypeVariable;
@@ -199,7 +238,7 @@
 	 * @see TypeBinding#isEquivalentTo(TypeBinding)
 	 */
 	public boolean isEquivalentTo(TypeBinding otherType) {
-	    if (this == otherType) return true;
+	    if (equalsEquals(this, otherType)) return true;
 	    if (otherType == null) return false;
 		// capture of ? extends X[]
 		if (this.firstBound != null && this.firstBound.isArrayType()) {
@@ -245,10 +284,44 @@
 		}
 		return super.shortReadableName();
 	}
+	
+	@Override
+	public char[] nullAnnotatedReadableName(CompilerOptions options, boolean shortNames) {
+	    StringBuffer nameBuffer = new StringBuffer(10);
+		appendNullAnnotation(nameBuffer, options);
+		nameBuffer.append(this.sourceName());
+		if (this.wildcard != null) {
+			nameBuffer.append("of "); //$NON-NLS-1$
+			nameBuffer.append(this.wildcard.nullAnnotatedReadableName(options, shortNames));
+		} else if (this.lowerBound != null) {
+			nameBuffer.append(" super "); //$NON-NLS-1$
+			nameBuffer.append(this.lowerBound.nullAnnotatedReadableName(options, shortNames));
+		} else if (this.firstBound != null) {
+			nameBuffer.append(" extends "); //$NON-NLS-1$
+			nameBuffer.append(this.firstBound.nullAnnotatedReadableName(options, shortNames));
+			TypeBinding[] otherUpperBounds = this.otherUpperBounds();
+			if (otherUpperBounds != NO_TYPES)
+				nameBuffer.append(" & ..."); //$NON-NLS-1$ // only hint at more bounds, we currently don't evaluate null annotations on otherUpperBounds
+		}
+		int nameLength = nameBuffer.length();
+		char[] readableName = new char[nameLength];
+		nameBuffer.getChars(0, nameLength, readableName, 0);
+	    return readableName;
+	}
+
+	@Override
+	public TypeBinding uncapture(Scope scope) {
+		return this.wildcard;
+	}
 
 	public String toString() {
 		if (this.wildcard != null) {
 			StringBuffer buffer = new StringBuffer(10);
+			AnnotationBinding [] annotations = getTypeAnnotations();
+			for (int i = 0, length = annotations == null ? 0 : annotations.length; i < length; i++) {
+				buffer.append(annotations[i]);
+				buffer.append(' ');
+			}
 			buffer
 				.append(TypeConstants.WILDCARD_CAPTURE_NAME_PREFIX)
 				.append(this.captureID)
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding18.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding18.java
new file mode 100644
index 0000000..609e9ff
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding18.java
@@ -0,0 +1,317 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+
+/**
+ * Capture-like type variable introduced during 1.8 type inference.
+ */
+public class CaptureBinding18 extends CaptureBinding {
+	
+	TypeBinding[] upperBounds;
+	private char[] originalName;
+
+	public CaptureBinding18(ReferenceBinding contextType, char[] sourceName, char[] originalName, int position, int captureID, LookupEnvironment environment) {
+		super(contextType, sourceName, position, captureID, environment);
+		this.originalName = originalName;
+	}
+	
+	public boolean setUpperBounds(TypeBinding[] upperBounds, ReferenceBinding javaLangObject) {
+		this.upperBounds = upperBounds;
+		if (upperBounds.length > 0)
+			this.firstBound = upperBounds[0];
+		int numReferenceInterfaces = 0;
+		for (int i = 0; i < upperBounds.length; i++) {
+			TypeBinding aBound = upperBounds[i];
+			if (!aBound.isWildcard() && !aBound.isTypeVariable() && aBound.isProperType(true)) {
+				// check for inconsistency between any two real types:
+				for (int j = 0; j < upperBounds.length; j++) {
+					if (i == j) continue;
+					TypeBinding otherBound = upperBounds[j];
+					if (!otherBound.isWildcard() && !otherBound.isTypeVariable() && otherBound.isProperType(true))
+						if (aBound.erasure().isCompatibleWith(otherBound.erasure()))
+							if (!aBound.isCompatibleWith(otherBound))
+								return false;
+				}
+			}
+			if (aBound instanceof ReferenceBinding) {
+				if (this.superclass == null && aBound.isClass())
+					this.superclass = (ReferenceBinding) upperBounds[i];
+				else if (aBound.isInterface())
+					numReferenceInterfaces++;
+				// TODO: what about additional super classes?? (see isCompatibleWith)
+			}
+		}
+		this.superInterfaces = new ReferenceBinding[numReferenceInterfaces];
+		int idx = 0;
+		for (int i = 0; i < upperBounds.length; i++) {
+			TypeBinding aBound = upperBounds[i];
+			if (aBound.isInterface())
+				this.superInterfaces[idx++] = (ReferenceBinding) aBound;
+		}
+		if (this.superclass == null)
+			this.superclass = javaLangObject;
+		return true;
+	}
+
+	public void initializeBounds(Scope scope, ParameterizedTypeBinding capturedParameterizedType) {
+		// nothing to initialize here (and cannot use super methods which requires wildcard to be set).
+	}
+
+	public TypeBinding clone(TypeBinding enclosingType) {
+		return new CaptureBinding18(this.sourceType, CharOperation.append(this.sourceName, '\''), this.originalName, this.position, this.captureID, this.environment);
+	}
+
+	public MethodBinding[] getMethods(char[] selector) {
+		if (this.upperBounds.length == 1 && this.upperBounds[0] instanceof ReferenceBinding)
+			return ((ReferenceBinding)this.upperBounds[0]).getMethods(selector);
+		return super.getMethods(selector);
+	}
+
+	public TypeBinding erasure() {
+		if (this.upperBounds != null && this.upperBounds.length > 1) {
+			ReferenceBinding[] erasures = new ReferenceBinding[this.upperBounds.length];
+			for (int i = 0; i < this.upperBounds.length; i++) {
+				erasures[i] = (ReferenceBinding) this.upperBounds[i].erasure(); // FIXME cast?
+			}
+			return new IntersectionCastTypeBinding(erasures, this.environment);
+		}
+		return super.erasure();
+	}
+
+	/**
+	 * @see TypeBinding#isEquivalentTo(TypeBinding)
+	 */
+	public boolean isEquivalentTo(TypeBinding otherType) {
+		// from CaptureBinding:
+		if (equalsEquals(this, otherType)) return true;
+		if (otherType == null) return false;
+		if (this.upperBounds != null) {
+			// from CaptureBinding:
+			for (int i = 0; i < this.upperBounds.length; i++) {
+				TypeBinding aBound = this.upperBounds[i];
+				// capture of ? extends X[]
+				if (aBound != null && aBound.isArrayType()) {
+					if (!aBound.isCompatibleWith(otherType))
+						continue;
+				}
+				switch (otherType.kind()) {
+					case Binding.WILDCARD_TYPE :
+					case Binding.INTERSECTION_TYPE :
+						if (!((WildcardBinding) otherType).boundCheck(aBound))
+							return false;
+						break;
+					default:
+						return false;
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
+	public boolean isCompatibleWith(TypeBinding otherType, Scope captureScope) {
+		if (this.upperBounds != null) {
+			for (int i = 0; i < this.upperBounds.length; i++) {
+				if (this.upperBounds[i].isCompatibleWith(otherType, captureScope))
+					return true;
+			}
+		}
+		return super.isCompatibleWith(otherType, captureScope);
+	}
+
+	public TypeBinding findSuperTypeOriginatingFrom(TypeBinding otherType) {
+		if (this.upperBounds != null && this.upperBounds.length > 1) {
+			for (int i = 0; i < this.upperBounds.length; i++) {
+				TypeBinding candidate = this.upperBounds[i].findSuperTypeOriginatingFrom(otherType);
+				if (candidate != null)
+					return candidate;
+				// TODO: maybe we should double check about multiple candidates here,
+				// but upper bounds should be consistent so hopefully the first non-null candidate is good enough. 
+			}
+		}
+		return super.findSuperTypeOriginatingFrom(otherType);
+	}
+
+	TypeBinding substituteInferenceVariable(InferenceVariable var, TypeBinding substituteType) {
+		if (this.inRecursiveFunction) return this;
+		this.inRecursiveFunction = true;
+		try {
+			boolean haveSubstitution = false;
+			ReferenceBinding currentSuperclass = this.superclass;
+			if (currentSuperclass != null) {
+				currentSuperclass = (ReferenceBinding) currentSuperclass.substituteInferenceVariable(var, substituteType);
+				haveSubstitution |= TypeBinding.notEquals(currentSuperclass, this.superclass);
+			}
+			ReferenceBinding[] currentSuperInterfaces = null;
+			if (this.superInterfaces != null) {
+				int length = this.superInterfaces.length;
+				if (haveSubstitution)
+					System.arraycopy(this.superInterfaces, 0, currentSuperInterfaces=new ReferenceBinding[length], 0, length);
+				for (int i = 0; i < length; i++) {
+					ReferenceBinding currentSuperInterface = this.superInterfaces[i];
+					if (currentSuperInterface != null) {
+						currentSuperInterface = (ReferenceBinding) currentSuperInterface.substituteInferenceVariable(var, substituteType);
+						if (TypeBinding.notEquals(currentSuperInterface, this.superInterfaces[i])) {
+							if (currentSuperInterfaces == null)
+								System.arraycopy(this.superInterfaces, 0, currentSuperInterfaces=new ReferenceBinding[length], 0, length);
+							currentSuperInterfaces[i] = currentSuperInterface;
+							haveSubstitution = true;
+						}
+					}
+				}
+			}
+			TypeBinding[] currentUpperBounds = null;
+			if (this.upperBounds != null) {
+				int length = this.upperBounds.length;
+				if (haveSubstitution)
+					System.arraycopy(this.upperBounds, 0, currentUpperBounds=new TypeBinding[length], 0, length);
+				for (int i = 0; i < length; i++) {
+					TypeBinding currentBound = this.upperBounds[i];
+					if (currentBound != null) {
+						currentBound = currentBound.substituteInferenceVariable(var, substituteType);
+						if (TypeBinding.notEquals(currentBound, this.upperBounds[i])) {
+							if (currentUpperBounds == null)
+								System.arraycopy(this.upperBounds, 0, currentUpperBounds=new TypeBinding[length], 0, length);
+							currentUpperBounds[i] = currentBound;
+							haveSubstitution = true;
+						}
+					}
+				}
+			}
+			if (haveSubstitution) {
+				CaptureBinding18 newCapture = (CaptureBinding18) clone(enclosingType());
+				newCapture.superclass = currentSuperclass;
+				newCapture.superInterfaces = currentSuperInterfaces;
+				newCapture.upperBounds = currentUpperBounds;
+				newCapture.tagBits = this.tagBits;
+				return newCapture;
+			}
+			return this;
+		} finally {
+			this.inRecursiveFunction = false;
+		}
+	}
+
+	public boolean isProperType(boolean admitCapture18) {
+		if (!admitCapture18) 
+			return false;
+		if (this.inRecursiveFunction)
+			return true;
+		this.inRecursiveFunction = true;
+		try {
+			if (this.lowerBound != null && !this.lowerBound.isProperType(admitCapture18))
+				return false;
+			if (this.upperBounds != null) {
+				for (int i = 0; i < this.upperBounds.length; i++) {
+					if (!this.upperBounds[i].isProperType(admitCapture18))
+						return false;
+				}
+			}
+		} finally {
+			this.inRecursiveFunction = false;
+		}
+		return true;
+	}
+
+	int recursionLevel = 0; // used to give a hint at recursive types without going into infinity
+
+	public char[] genericTypeSignature() {
+		// since we have no wildcard, we combine the logic from CaptureBinding plus WildcardBinding here:
+		if (this.genericTypeSignature == null) {
+			char[] boundSignature;
+			try {
+				if (this.recursionLevel++ > 0 || this.firstBound == null) {
+					boundSignature = TypeConstants.WILDCARD_STAR;
+				} else if (this.upperBounds != null) {
+					boundSignature = CharOperation.concat(TypeConstants.WILDCARD_PLUS, this.firstBound.genericTypeSignature());
+				} else if (this.lowerBound != null) {
+					boundSignature = CharOperation.concat(TypeConstants.WILDCARD_MINUS, this.lowerBound.genericTypeSignature());
+				} else {
+					boundSignature = TypeConstants.WILDCARD_STAR;
+				}
+				this.genericTypeSignature = CharOperation.concat(TypeConstants.WILDCARD_CAPTURE, boundSignature);
+			} finally {
+				this.recursionLevel--;
+			}
+		}
+		return this.genericTypeSignature;
+	}
+	
+	public char[] readableName() {
+		if (this.lowerBound == null && this.firstBound != null) {
+			if (this.recursionLevel < 2) {
+				try {
+					this.recursionLevel ++;
+					if (this.upperBounds != null && this.upperBounds.length > 1) {
+						StringBuffer sb = new StringBuffer();
+						sb.append(this.upperBounds[0].readableName());
+						for (int i = 1; i < this.upperBounds.length; i++)
+							sb.append('&').append(this.upperBounds[i].readableName());
+						int len = sb.length();
+						char[] name = new char[len];
+						sb.getChars(0, len, name, 0);
+						return name;
+					}
+					return this.firstBound.readableName();
+				} finally {
+					this.recursionLevel--;
+				}
+			} else {
+				return this.originalName;
+			}
+		}
+		return super.readableName();
+	}
+
+	public char[] shortReadableName() {
+		if (this.lowerBound == null && this.firstBound != null) {
+			if (this.recursionLevel < 2) {
+				try {
+					this.recursionLevel++;
+					if (this.upperBounds != null && this.upperBounds.length > 1) {
+						StringBuffer sb = new StringBuffer();
+						sb.append(this.upperBounds[0].shortReadableName());
+						for (int i = 1; i < this.upperBounds.length; i++)
+							sb.append('&').append(this.upperBounds[i].shortReadableName());
+						int len = sb.length();
+						char[] name = new char[len];
+						sb.getChars(0, len, name, 0);
+						return name;
+					}
+					return this.firstBound.shortReadableName();
+				} finally {
+					this.recursionLevel--;
+				}
+			} else {
+				return this.originalName;
+			}
+		}
+		return super.shortReadableName();
+	}
+	
+	@Override
+	public TypeBinding uncapture(Scope scope) {
+		return this;
+	}
+	@Override
+	public char[] computeUniqueKey(boolean isLeaf) {
+		StringBuffer buffer = new StringBuffer();
+		buffer.append(TypeConstants.CAPTURE18);
+		buffer.append('{').append(this.position).append('#').append(this.captureID).append('}');
+		buffer.append(';');
+		int length = buffer.length();
+		char[] uniqueKey = new char[length];
+		buffer.getChars(0, length, uniqueKey, 0);
+		return uniqueKey;
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CatchParameterBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CatchParameterBinding.java
index 28c9cf7..7180ad0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CatchParameterBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CatchParameterBinding.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -31,7 +27,7 @@
 	public void setPreciseType(TypeBinding raisedException) {
 		int length = this.preciseTypes.length;
 		for (int i = 0; i < length; ++i) {
-			if (this.preciseTypes[i] == raisedException)
+			if (TypeBinding.equalsEquals(this.preciseTypes[i], raisedException))
 				return;
 		}
 		System.arraycopy(this.preciseTypes, 0, this.preciseTypes = new TypeBinding [length + 1], 0, length);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
index db30757..09eefa8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ClassScope.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,10 @@
  *     						Bug 358903 - Filter practically unimportant resource leak warnings
  *							Bug 395977 - [compiler][resource] Resource leak warning behavior possibly incorrect for anonymous inner class
  *							Bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
+ *							Bug 416176 - [1.8][compiler][null] null type annotations cause grief on type variables
+ *							Bug 427199 - [1.8][resource] avoid resource leak warnings on Streams that have no resource
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 415821 - [1.8][compiler] CLASS_EXTENDS target type annotation missing for anonymous classes
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -37,6 +41,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.HashtableOfObject;
 
+@SuppressWarnings({"rawtypes"})
 public class ClassScope extends Scope {
 
 	public TypeDeclaration referenceContext;
@@ -67,33 +72,35 @@
 		}
 		anonymousType.typeBits |= inheritedBits;
 		if (supertype.isInterface()) {
-			anonymousType.superclass = getJavaLangObject();
-			anonymousType.superInterfaces = new ReferenceBinding[] { supertype };
+			anonymousType.setSuperClass(getJavaLangObject());
+			anonymousType.setSuperInterfaces(new ReferenceBinding[] { supertype });
 			TypeReference typeReference = this.referenceContext.allocation.type;
 			if (typeReference != null) {
+				this.referenceContext.superInterfaces = new TypeReference[] { typeReference };
 				if ((supertype.tagBits & TagBits.HasDirectWildcard) != 0) {
 					problemReporter().superTypeCannotUseWildcard(anonymousType, typeReference, supertype);
 					anonymousType.tagBits |= TagBits.HierarchyHasProblems;
-					anonymousType.superInterfaces = Binding.NO_SUPERINTERFACES;
+					anonymousType.setSuperInterfaces(Binding.NO_SUPERINTERFACES);
 				}
 			}
 		} else {
-			anonymousType.superclass = supertype;
-			anonymousType.superInterfaces = Binding.NO_SUPERINTERFACES;
+			anonymousType.setSuperClass(supertype);
+			anonymousType.setSuperInterfaces(Binding.NO_SUPERINTERFACES);
 			TypeReference typeReference = this.referenceContext.allocation.type;
 			if (typeReference != null) { // no check for enum constant body
+				this.referenceContext.superclass = typeReference;
 				if (supertype.erasure().id == TypeIds.T_JavaLangEnum) {
 					problemReporter().cannotExtendEnum(anonymousType, typeReference, supertype);
 					anonymousType.tagBits |= TagBits.HierarchyHasProblems;
-					anonymousType.superclass = getJavaLangObject();
+					anonymousType.setSuperClass(getJavaLangObject());
 				} else if (supertype.isFinal()) {
 					problemReporter().anonymousClassCannotExtendFinalClass(typeReference, supertype);
 					anonymousType.tagBits |= TagBits.HierarchyHasProblems;
-					anonymousType.superclass = getJavaLangObject();
+					anonymousType.setSuperClass(getJavaLangObject());
 				} else if ((supertype.tagBits & TagBits.HasDirectWildcard) != 0) {
 					problemReporter().superTypeCannotUseWildcard(anonymousType, typeReference, supertype);
 					anonymousType.tagBits |= TagBits.HierarchyHasProblems;
-					anonymousType.superclass = getJavaLangObject();
+					anonymousType.setSuperClass(getJavaLangObject());
 				}
 			}
 		}
@@ -254,7 +261,7 @@
 			if (count != size)
 				System.arraycopy(memberTypeBindings, 0, memberTypeBindings = new ReferenceBinding[count], 0, count);
 		}
-		localType.memberTypes = memberTypeBindings;
+		localType.setMemberTypes(memberTypeBindings);
 		return localType;
 	}
 
@@ -316,7 +323,7 @@
 			if (count != length)
 				System.arraycopy(memberTypeBindings, 0, memberTypeBindings = new ReferenceBinding[count], 0, count);
 		}
-		sourceType.memberTypes = memberTypeBindings;
+		sourceType.setMemberTypes(memberTypeBindings);
 	}
 
 	void buildMethods() {
@@ -402,6 +409,7 @@
 	// AspectJ change - extra parameter alternativeName
 	SourceTypeBinding buildType(SourceTypeBinding enclosingType, PackageBinding packageBinding, AccessRestriction accessRestriction,char[] alternativeName) {
 
+//	SourceTypeBinding buildType(SourceTypeBinding enclosingType, PackageBinding packageBinding, AccessRestriction accessRestriction) {
 		// provide the typeDeclaration with needed scopes
 		this.referenceContext.scope = this;
 		this.referenceContext.staticInitializerScope = new MethodScope(this, this.referenceContext, true);
@@ -444,9 +452,13 @@
 
 		SourceTypeBinding sourceType = this.referenceContext.binding;
 		environment().setAccessRestriction(sourceType, accessRestriction);
+		
+		TypeParameter[] typeParameters = this.referenceContext.typeParameters;
+		sourceType.typeVariables = typeParameters == null || typeParameters.length == 0 ? Binding.NO_TYPE_VARIABLES : null;
 		sourceType.fPackage.addType(sourceType);
 		checkAndSetModifiers();
 		buildTypeVariables();
+		
 		buildMemberTypes(accessRestriction);
 		return sourceType;
 	}
@@ -457,19 +469,23 @@
 		TypeParameter[] typeParameters = this.referenceContext.typeParameters;
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=324850, If they exist at all, process type parameters irrespective of source level.
 		if (typeParameters == null || typeParameters.length == 0) {
-		    sourceType.typeVariables = Binding.NO_TYPE_VARIABLES;
+		    sourceType.setTypeVariables(Binding.NO_TYPE_VARIABLES);
 		    return;
 		}
-		sourceType.typeVariables = Binding.NO_TYPE_VARIABLES; // safety
+		sourceType.setTypeVariables(Binding.NO_TYPE_VARIABLES); // safety
 
 		if (sourceType.id == TypeIds.T_JavaLangObject) { // handle the case of redefining java.lang.Object up front
 			problemReporter().objectCannotBeGeneric(this.referenceContext);
 			return;
 		}
-		sourceType.typeVariables = createTypeVariables(typeParameters, sourceType);
+		sourceType.setTypeVariables(createTypeVariables(typeParameters, sourceType));
 		sourceType.modifiers |= ExtraCompilerModifiers.AccGenericSignature;
 	}
 
+	void resolveTypeParameter(TypeParameter typeParameter) {
+		typeParameter.resolve(this);
+	}
+
 	private void checkAndSetModifiers() {
 		SourceTypeBinding sourceType = this.referenceContext.binding;
 		int modifiers = sourceType.modifiers;
@@ -487,6 +503,8 @@
 					problemReporter().nonStaticContextForEnumMemberType(sourceType);
 				else
 					modifiers |= ClassFileConstants.AccStatic;
+			} else if (sourceType.isInterface()) {
+				modifiers |= ClassFileConstants.AccStatic; // 8.5.1
 			}
 		} else if (sourceType.isLocalType()) {
 			if (sourceType.isEnum()) {
@@ -814,7 +832,7 @@
 
 			TypeReference[] boundRefs = typeParameter.bounds;
 			if (boundRefs != null) {
-				boolean checkSuperclass = typeVariable.firstBound == typeVariable.superclass;
+				boolean checkSuperclass = TypeBinding.equalsEquals(typeVariable.firstBound, typeVariable.superclass);
 				for (int j = 0, boundLength = boundRefs.length; j < boundLength; j++) {
 					TypeReference typeRef = boundRefs[j];
 					TypeBinding superType = typeRef.resolvedType;
@@ -862,7 +880,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -887,7 +905,7 @@
 						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;
+								if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 							interfacesToVisit[nextPosition++] = next;
 						}
 					}
@@ -941,8 +959,8 @@
 	private boolean connectSuperclass() {
 		SourceTypeBinding sourceType = this.referenceContext.binding;
 		if (sourceType.id == TypeIds.T_JavaLangObject) { // handle the case of redefining java.lang.Object up front
-			sourceType.superclass = null;
-			sourceType.superInterfaces = Binding.NO_SUPERINTERFACES;
+			sourceType.setSuperClass(null);
+			sourceType.setSuperInterfaces(Binding.NO_SUPERINTERFACES);
 			if (!sourceType.isClass())
 				problemReporter().objectMustBeClass(sourceType);
 			if (this.referenceContext.superclass != null || (this.referenceContext.superInterfaces != null && this.referenceContext.superInterfaces.length > 0))
@@ -952,7 +970,7 @@
 		if (this.referenceContext.superclass == null) {
 			if (sourceType.isEnum() && compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5) // do not connect if source < 1.5 as enum already got flagged as syntax error
 				return connectEnumSuperclass();
-			sourceType.superclass = getJavaLangObject();
+			sourceType.setSuperClass(getJavaLangObject());
 			return !detectHierarchyCycle(sourceType, sourceType.superclass, null);
 		}
 		TypeReference superclassRef = this.referenceContext.superclass;
@@ -968,21 +986,21 @@
 				problemReporter().cannotExtendEnum(sourceType, superclassRef, superclass);
 			} else if ((superclass.tagBits & TagBits.HierarchyHasProblems) != 0
 					|| !superclassRef.resolvedType.isValidBinding()) {
-				sourceType.superclass = superclass;
+				sourceType.setSuperClass(superclass);
 				sourceType.tagBits |= TagBits.HierarchyHasProblems; // propagate if missing supertype
 				return superclassRef.resolvedType.isValidBinding(); // reported some error against the source type ?
 			} else {
 				// only want to reach here when no errors are reported
-				sourceType.superclass = superclass;
+				sourceType.setSuperClass(superclass);
 				sourceType.typeBits |= (superclass.typeBits & TypeIds.InheritableBits);
 				// further analysis against white lists for the unlikely case we are compiling java.io.*:
 				if ((sourceType.typeBits & (TypeIds.BitAutoCloseable|TypeIds.BitCloseable)) != 0)
-					sourceType.typeBits |= sourceType.applyCloseableWhitelists();
+					sourceType.typeBits |= sourceType.applyCloseableClassWhitelists();
 				return true;
 			}
 		}
 		sourceType.tagBits |= TagBits.HierarchyHasProblems;
-		sourceType.superclass = getJavaLangObject();
+		sourceType.setSuperClass(getJavaLangObject());
 		if ((sourceType.superclass.tagBits & TagBits.BeginHierarchyCheck) == 0)
 			detectHierarchyCycle(sourceType, sourceType.superclass, null);
 		return false; // reported some error against the source type
@@ -996,7 +1014,7 @@
 		ReferenceBinding rootEnumType = getJavaLangEnum();
 		if ((rootEnumType.tagBits & TagBits.HasMissingType) != 0) {
 			sourceType.tagBits |= TagBits.HierarchyHasProblems; // mark missing supertpye
-			sourceType.superclass = rootEnumType;
+			sourceType.setSuperClass(rootEnumType);
 			return false;
 		}
 		boolean foundCycle = detectHierarchyCycle(sourceType, rootEnumType, null);
@@ -1017,7 +1035,7 @@
 			} ,
 			null);
 		sourceType.tagBits |= (superType.tagBits & TagBits.HierarchyHasProblems); // propagate if missing supertpye
-		sourceType.superclass = superType;
+		sourceType.setSuperClass(superType);
 		// bound check (in case of bogus definition of Enum type)
 		if (refTypeVariables[0].boundCheck(superType, sourceType, this) != TypeConstants.OK) {
 			problemReporter().typeMismatchError(rootEnumType, refTypeVariables[0], sourceType, null);
@@ -1037,12 +1055,12 @@
 	*/
 	private boolean connectSuperInterfaces() {
 		SourceTypeBinding sourceType = this.referenceContext.binding;
-		sourceType.superInterfaces = Binding.NO_SUPERINTERFACES;
+		sourceType.setSuperInterfaces(Binding.NO_SUPERINTERFACES);
 		if (this.referenceContext.superInterfaces == null) {
 			if (sourceType.isAnnotationType() && compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5) { // do not connect if source < 1.5 as annotation already got flagged as syntax error) {
 				ReferenceBinding annotationType = getJavaLangAnnotationAnnotation();
 				boolean foundCycle = detectHierarchyCycle(sourceType, annotationType, null);
-				sourceType.superInterfaces = new ReferenceBinding[] { annotationType };
+				sourceType.setSuperInterfaces(new ReferenceBinding[] { annotationType });
 				return !foundCycle;
 			}
 			return true;
@@ -1066,7 +1084,7 @@
 			// check for simple interface collisions
 			// Check for a duplicate interface once the name is resolved, otherwise we may be confused (i.e. a.b.I and c.d.I)
 			for (int j = 0; j < i; j++) {
-				if (interfaceBindings[j] == superInterface) {
+				if (TypeBinding.equalsEquals(interfaceBindings[j], superInterface)) {
 					problemReporter().duplicateSuperinterface(sourceType, superInterfaceRef, superInterface);
 					sourceType.tagBits |= TagBits.HierarchyHasProblems;
 					noProblems = false;
@@ -1094,13 +1112,16 @@
 			}
 			// only want to reach here when no errors are reported
 			sourceType.typeBits |= (superInterface.typeBits & TypeIds.InheritableBits);
+			// further analysis against white lists for the unlikely case we are compiling java.util.stream.Stream:
+			if ((sourceType.typeBits & (TypeIds.BitAutoCloseable|TypeIds.BitCloseable)) != 0)
+				sourceType.typeBits |= sourceType.applyCloseableInterfaceWhitelists();
 			interfaceBindings[count++] = superInterface;
 		}
 		// hold onto all correctly resolved superinterfaces
 		if (count > 0) {
 			if (count != length)
 				System.arraycopy(interfaceBindings, 0, interfaceBindings = new ReferenceBinding[count], 0, count);
-			sourceType.superInterfaces = interfaceBindings;
+			sourceType.setSuperInterfaces(interfaceBindings);
 		}
 		return noProblems;
 	}
@@ -1189,7 +1210,7 @@
 			superType = ((RawTypeBinding) superType).genericType();
 		// by this point the superType must be a binary or source type
 
-		if (sourceType == superType) {
+		if (TypeBinding.equalsEquals(sourceType, superType)) {
 			problemReporter().hierarchyCircularity(sourceType, superType, reference);
 			sourceType.tagBits |= TagBits.HierarchyHasProblems;
 			return true;
@@ -1198,7 +1219,7 @@
 		if (superType.isMemberType()) {
 			ReferenceBinding current = superType.enclosingType();
 			do {
-				if (current.isHierarchyBeingActivelyConnected() && current == sourceType) {
+				if (current.isHierarchyBeingActivelyConnected() && TypeBinding.equalsEquals(current, sourceType)) {
 					problemReporter().hierarchyCircularity(sourceType, current, reference);
 					sourceType.tagBits |= TagBits.HierarchyHasProblems;
 					current.tagBits |= TagBits.HierarchyHasProblems;
@@ -1214,7 +1235,7 @@
 			boolean hasCycle = false;
 			ReferenceBinding parentType = superType.superclass();
 			if (parentType != null) {
-				if (sourceType == parentType) {
+				if (TypeBinding.equalsEquals(sourceType, parentType)) {
 					problemReporter().hierarchyCircularity(sourceType, superType, reference);
 					sourceType.tagBits |= TagBits.HierarchyHasProblems;
 					superType.tagBits |= TagBits.HierarchyHasProblems;
@@ -1233,7 +1254,7 @@
 			if (itsInterfaces != null && itsInterfaces != Binding.NO_SUPERINTERFACES) {
 				for (int i = 0, length = itsInterfaces.length; i < length; i++) {
 					ReferenceBinding anInterface = itsInterfaces[i];
-					if (sourceType == anInterface) {
+					if (TypeBinding.equalsEquals(sourceType, anInterface)) {
 						problemReporter().hierarchyCircularity(sourceType, superType, reference);
 						sourceType.tagBits |= TagBits.HierarchyHasProblems;
 						superType.tagBits |= TagBits.HierarchyHasProblems;
@@ -1296,7 +1317,7 @@
 			return superType;
 		} catch (AbortCompilation e) {
 			SourceTypeBinding sourceType = this.referenceContext.binding;
-			if (sourceType.superInterfaces == null)  sourceType.superInterfaces = Binding.NO_SUPERINTERFACES; // be more resilient for hierarchies (144976)
+			if (sourceType.superInterfaces == null)  sourceType.setSuperInterfaces(Binding.NO_SUPERINTERFACES); // be more resilient for hierarchies (144976)
 			e.updateContext(typeReference, referenceCompilationUnit().compilationResult);
 			throw e;
 		} finally {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java
index 1f236db..9d1c2ba 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Erling Ellingsen -  patch for bug 125570
@@ -792,8 +788,8 @@
 	return "--- CompilationUnit Scope : " + new String(this.referenceContext.getFileName()); //$NON-NLS-1$
 }
 private ReferenceBinding typeToRecord(TypeBinding type) {
-	if (type.isArrayType())
-		type = ((ArrayBinding) type).leafComponentType;
+	while (type.isArrayType())
+		type = ((ArrayBinding) type).leafComponentType();
 
 	switch (type.kind()) {
 		case Binding.BASE_TYPE :
@@ -876,6 +872,7 @@
 			conflictingType = null;
 	}
 	// collisions between an imported static field & a type should be checked according to spec... but currently not by javac
+	final char[] name = compoundName[compoundName.length - 1];
 	if (importBinding instanceof ReferenceBinding || conflictingType != null) {
 		ReferenceBinding referenceBinding = conflictingType == null ? (ReferenceBinding) importBinding : conflictingType;
 		ReferenceBinding typeToCheck = referenceBinding.problemId() == ProblemReasons.Ambiguous
@@ -884,17 +881,17 @@
 		if (importReference.isTypeUseDeprecated(typeToCheck, this))
 			problemReporter().deprecatedType(typeToCheck, importReference);
 
-		ReferenceBinding existingType = typesBySimpleNames.get(compoundName[compoundName.length - 1]);
+		ReferenceBinding existingType = typesBySimpleNames.get(name);
 		if (existingType != null) {
 			// duplicate test above should have caught this case, but make sure
-			if (existingType == referenceBinding) {
+			if (TypeBinding.equalsEquals(existingType, referenceBinding)) {
 				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=302865
 				// Check all resolved imports to see if this import qualifies as a duplicate
 				for (int j = 0; j < this.importPtr; j++) {
 					ImportBinding resolved = this.tempImports[j];
 					if (resolved instanceof ImportConflictBinding) {
 						ImportConflictBinding importConflictBinding = (ImportConflictBinding) resolved;
-						if (importConflictBinding.conflictingTypeBinding == referenceBinding) {
+						if (TypeBinding.equalsEquals(importConflictBinding.conflictingTypeBinding, referenceBinding)) {
 							if (!importReference.isStatic()) {
 								// resolved is implicitly static
 								problemReporter().duplicateImport(importReference);
@@ -917,18 +914,38 @@
 					return -1;
 				}
 			}
+			if (importReference.isStatic() && importBinding instanceof ReferenceBinding && compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8) {
+				// 7.5.3 says nothing about collision of single static imports and JDK8 tolerates them, though use is flagged.
+				for (int j = 0; j < this.importPtr; j++) {
+					ImportBinding resolved = this.tempImports[j];
+					if (resolved.isStatic() && resolved.resolvedImport instanceof ReferenceBinding && importBinding != resolved.resolvedImport) {
+						if (CharOperation.equals(name, resolved.compoundName[resolved.compoundName.length - 1])) {
+							ReferenceBinding type = (ReferenceBinding) resolved.resolvedImport;
+							resolved.resolvedImport = new ProblemReferenceBinding(new char[][] { name }, type, ProblemReasons.Ambiguous);
+							return -1;
+						}
+					}
+				}
+			}
 			problemReporter().duplicateImport(importReference);
 			return -1;
 		}
-		typesBySimpleNames.put(compoundName[compoundName.length - 1], referenceBinding);
+		typesBySimpleNames.put(name, referenceBinding);
 	} else if (importBinding instanceof FieldBinding) {
 		for (int j = 0; j < this.importPtr; j++) {
 			ImportBinding resolved = this.tempImports[j];
 			// find other static fields with the same name
 			if (resolved.isStatic() && resolved.resolvedImport instanceof FieldBinding && importBinding != resolved.resolvedImport) {
-				if (CharOperation.equals(compoundName[compoundName.length - 1], resolved.compoundName[resolved.compoundName.length - 1])) {
-					problemReporter().duplicateImport(importReference);
-					return -1;
+				if (CharOperation.equals(name, resolved.compoundName[resolved.compoundName.length - 1])) {
+					if (compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8) {
+						// 7.5.3 says nothing about collision of single static imports and JDK8 tolerates them, though use is flagged.
+						FieldBinding field = (FieldBinding) resolved.resolvedImport;
+						resolved.resolvedImport = new ProblemFieldBinding(field, field.declaringClass, name, ProblemReasons.Ambiguous);
+						return -1;
+					} else {
+						problemReporter().duplicateImport(importReference);
+						return -1;
+					}
 				}
 			}
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExceptionFormula.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExceptionFormula.java
new file mode 100644
index 0000000..701d106
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExceptionFormula.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FunctionalExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression;
+
+/**
+ * Constraint formula expressing that a given expression must have an exception type.
+ * <ul>
+ * <li>Expression contains<sub>throws</sub> T</li>
+ * </ul>
+ */
+public class ConstraintExceptionFormula extends ConstraintFormula {
+
+	FunctionalExpression left;
+	
+	public ConstraintExceptionFormula(FunctionalExpression left, TypeBinding type) {
+		this.left = left;
+		this.right = type;
+		this.relation = EXCEPTIONS_CONTAINED;
+	}
+	
+	public Object reduce(InferenceContext18 inferenceContext) {
+		// JLS 18.2.5
+		Scope scope = inferenceContext.scope;
+		if (!this.right.isFunctionalInterface(scope))
+			return FALSE;
+		MethodBinding sam = this.right.getSingleAbstractMethod(scope, true);
+		if (sam == null)
+			return FALSE;
+		if (this.left instanceof LambdaExpression) {
+			if (((LambdaExpression)this.left).argumentsTypeElided()) {
+				int nParam = sam.parameters.length;
+				for (int i = 0; i < nParam; i++)
+					if (!sam.parameters[i].isProperType(true))
+						return FALSE;
+			}
+			if (sam.returnType != TypeBinding.VOID && !sam.returnType.isProperType(true))
+				return FALSE;
+		} else { // reference expression
+			if (!((ReferenceExpression)this.left).isExactMethodReference()) {					
+				int nParam = sam.parameters.length;
+				for (int i = 0; i < nParam; i++)
+					if (!sam.parameters[i].isProperType(true))
+						return FALSE;
+				if (sam.returnType != TypeBinding.VOID && !sam.returnType.isProperType(true))
+					return FALSE;
+			}
+		}
+		TypeBinding[] thrown = sam.thrownExceptions;
+		InferenceVariable[] e = new InferenceVariable[thrown.length];
+		int n = 0;
+		for (int i = 0; i < thrown.length; i++)
+			if (!thrown[i].isProperType(true))
+				e[n++] = (InferenceVariable) thrown[i]; // thrown[i] is not a proper type, since it's an exception it must be an inferenceVariable, right?
+		
+		/* If throw specification does not encode any type parameters, there are no constraints to be gleaned/gathered from the throw sites.
+		   See also that thrown exceptions are not allowed to influence compatibility and overload resolution.
+		*/
+		if (n == 0)
+			return TRUE;
+		
+		TypeBinding[] ePrime = null;
+		if (this.left instanceof LambdaExpression) {
+			LambdaExpression lambda = ((LambdaExpression) this.left).getResolvedCopyForInferenceTargeting(this.right);
+			if (lambda == null)
+				return TRUE; // cannot make use of this buggy constraint
+			Set<TypeBinding> ePrimeSet = lambda.getThrownExceptions();
+			ePrime = ePrimeSet.toArray(new TypeBinding[ePrimeSet.size()]);
+		} else {
+			ReferenceExpression referenceExpression = (ReferenceExpression)this.left;
+			MethodBinding method = referenceExpression.findCompileTimeMethodTargeting(this.right, scope);
+			if (method != null)
+				ePrime = method.thrownExceptions;
+		}
+		if (ePrime == null)
+			return TRUE;
+		int m = ePrime.length;
+		List<ConstraintFormula> result = new ArrayList<ConstraintFormula>();
+		actual: for (int i = 0; i < m; i++) {
+			if (ePrime[i].isUncheckedException(false))
+				continue;
+			for (int j = 0; j < thrown.length; j++)
+				if (thrown[j].isProperType(true) && ePrime[i].isCompatibleWith(thrown[j]))
+					continue actual;
+			for (int j = 0; j < n; j++)
+				result.add(ConstraintTypeFormula.create(ePrime[i], e[j], SUBTYPE));
+		}				
+		for (int j = 0; j < n; j++)
+			inferenceContext.currentBounds.inThrows.add(e[j]);
+		return result.toArray(new ConstraintFormula[result.size()]);
+	}
+
+	Collection<InferenceVariable> inputVariables(final InferenceContext18 context) {
+		// from 18.5.2.
+		if (this.left instanceof LambdaExpression) {
+			if (this.right instanceof InferenceVariable) {
+				return Collections.singletonList((InferenceVariable)this.right);
+			}
+			if (this.right.isFunctionalInterface(context.scope)) {
+				LambdaExpression lambda = (LambdaExpression) this.left;
+				MethodBinding sam = this.right.getSingleAbstractMethod(context.scope, true); // TODO derive with target type?
+				final Set<InferenceVariable> variables = new HashSet<InferenceVariable>();
+				if (lambda.argumentsTypeElided()) {
+					// i)
+					int len = sam.parameters.length;
+					for (int i = 0; i < len; i++) {
+						sam.parameters[i].collectInferenceVariables(variables);
+					}
+				} 
+				if (sam.returnType != TypeBinding.VOID) {
+					// ii)
+					sam.returnType.collectInferenceVariables(variables);
+				}
+				return variables;
+			}
+		} else if (this.left instanceof ReferenceExpression) {
+			if (this.right instanceof InferenceVariable) {
+				return Collections.singletonList((InferenceVariable)this.right);
+			}
+			if (this.right.isFunctionalInterface(context.scope)) { // TODO: && this.left is inexact
+				MethodBinding sam = this.right.getSingleAbstractMethod(context.scope, true); // TODO derive with target type?
+				final Set<InferenceVariable> variables = new HashSet<InferenceVariable>();
+				int len = sam.parameters.length;
+				for (int i = 0; i < len; i++) {
+					sam.parameters[i].collectInferenceVariables(variables);
+				}
+				sam.returnType.collectInferenceVariables(variables);
+				return variables;
+			}
+		}
+		return EMPTY_VARIABLE_LIST;
+	}
+
+	public String toString() {
+		StringBuffer buf = new StringBuffer().append(LEFT_ANGLE_BRACKET);
+		this.left.printExpression(4, buf);
+		buf.append(" \u2286throws "); //$NON-NLS-1$
+		appendTypeName(buf, this.right);
+		buf.append(RIGHT_ANGLE_BRACKET);
+		return buf.toString();
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java
new file mode 100644
index 0000000..9495855
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java
@@ -0,0 +1,485 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.ASTVisitor;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AllocationExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Argument;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FunctionalExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Invocation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReturnStatement;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord;
+
+/**
+ * Implementation of 18.1.2 in JLS8, case:
+ * <ul>
+ * <li>Expression -> T</li>
+ * </ul>
+ */
+class ConstraintExpressionFormula extends ConstraintFormula {
+	Expression left;
+
+	// this flag contributes to the workaround controlled by InferenceContext18.ARGUMENT_CONSTRAINTS_ARE_SOFT:
+	boolean isSoft;
+
+	ConstraintExpressionFormula(Expression expression, TypeBinding type, int relation) {
+		this.left = expression;
+		this.right = type;
+		this.relation = relation;
+	}
+	
+	ConstraintExpressionFormula(Expression expression, TypeBinding type, int relation, boolean isSoft) {
+		this(expression, type, relation);
+		this.isSoft = isSoft;
+	}
+
+	public Object reduce(InferenceContext18 inferenceContext) throws InferenceFailureException {
+		// JLS 18.2.1
+		proper:
+		if (this.right.isProperType(true)) {
+			TypeBinding exprType = this.left.resolvedType;
+			if (exprType == null) {
+				// if we get here for some kinds of poly expressions (incl. ConditionalExpression),
+				// then other ways for checking compatibility are needed:
+                if (this.left instanceof FunctionalExpression) {
+                    if (this.left instanceof LambdaExpression) {
+                        // cf. NegativeLambdaExpressionTest.test412453()
+                        LambdaExpression copy = ((LambdaExpression) this.left).getResolvedCopyForInferenceTargeting(this.right);
+                        return (copy != null && copy.resolvedType != null && copy.resolvedType.isValidBinding()) ? TRUE : FALSE;
+                    }
+                }
+                return this.left.isCompatibleWith(this.right, inferenceContext.scope) ? TRUE : FALSE;
+			} else if (!exprType.isValidBinding()) {
+				return FALSE;
+			}
+			if (isCompatibleWithInLooseInvocationContext(exprType, this.right, inferenceContext)) {
+				return TRUE;
+			} else if (this.left instanceof AllocationExpression && this.left.isPolyExpression()) {
+				// half-resolved diamond has a resolvedType, but that may not be the final word, try one more step of resolution:
+            	MethodBinding binding = ((AllocationExpression) this.left).binding(this.right, false, null);
+            	return (binding != null && binding.declaringClass.isCompatibleWith(this.right, inferenceContext.scope)) ? TRUE : FALSE;
+            } else if (this.left instanceof Invocation && this.left.isPolyExpression()) {
+            	Invocation invoc = (Invocation) this.left;
+            	MethodBinding binding = invoc.binding(this.right, false, null);
+            	if (binding instanceof ParameterizedGenericMethodBinding) {
+            		ParameterizedGenericMethodBinding method = (ParameterizedGenericMethodBinding) binding;
+					InferenceContext18 leftCtx = invoc.getInferenceContext(method);
+            		if (leftCtx.stepCompleted < InferenceContext18.TYPE_INFERRED) {
+            			break proper; // fall through into nested inference below (not explicit in the spec!)
+            		}
+            	}
+            }
+			return FALSE;
+		}
+		if (!canBePolyExpression(this.left)) {
+			TypeBinding exprType = this.left.resolvedType;
+			if (exprType == null || !exprType.isValidBinding())
+				return FALSE;
+			return ConstraintTypeFormula.create(exprType, this.right, COMPATIBLE, this.isSoft);
+		} else {
+			// shapes of poly expressions (18.2.1)
+			// - parenthesized expression : these are transparent in our AST
+			if (this.left instanceof Invocation) {
+				Invocation invocation = (Invocation) this.left;
+				MethodBinding previousMethod = invocation.binding(this.right, false, null);
+				if (previousMethod == null)  	// can happen, e.g., if inside a copied lambda with ignored errors
+					return null; 				// -> proceed with no new constraints
+				MethodBinding method = previousMethod;
+				// ignore previous (inner) inference result and do a fresh start:
+				// avoid original(), since we only want to discard one level of instantiation 
+				// (method type variables - not class type variables)!
+				method = previousMethod.shallowOriginal();
+				SuspendedInferenceRecord prevInvocation = inferenceContext.enterPolyInvocation(invocation, invocation.arguments());
+
+				// Invocation Applicability Inference: 18.5.1 & Invocation Type Inference: 18.5.2
+				try {
+					Expression[] arguments = invocation.arguments();
+					TypeBinding[] argumentTypes = arguments == null ? Binding.NO_PARAMETERS : new TypeBinding[arguments.length];
+					for (int i = 0; i < argumentTypes.length; i++)
+						argumentTypes[i] = arguments[i].resolvedType;
+					if (previousMethod instanceof ParameterizedGenericMethodBinding) {
+						// find the previous inner inference context to see what inference kind this invocation needs:
+						InferenceContext18 innerCtx = invocation.getInferenceContext((ParameterizedGenericMethodBinding) previousMethod);
+						if (innerCtx == null) { // no inference -> assume it wasn't really poly after all
+							TypeBinding exprType = this.left.resolvedType;
+							if (exprType == null || !exprType.isValidBinding())
+								return FALSE;
+							return ConstraintTypeFormula.create(exprType, this.right, COMPATIBLE, this.isSoft);
+						}
+						inferenceContext.inferenceKind = innerCtx.inferenceKind;
+						innerCtx.outerContext = inferenceContext;
+					}
+					boolean isDiamond = method.isConstructor() && this.left.isPolyExpression(method);
+					inferInvocationApplicability(inferenceContext, method, argumentTypes, isDiamond, inferenceContext.inferenceKind);
+					if (!inferPolyInvocationType(inferenceContext, invocation, this.right, method))
+						return FALSE;
+					return null; // already incorporated
+				} finally {
+					inferenceContext.resumeSuspendedInference(prevInvocation);
+				}
+			} else if (this.left instanceof ConditionalExpression) {
+				ConditionalExpression conditional = (ConditionalExpression) this.left;
+				return new ConstraintFormula[] {
+					new ConstraintExpressionFormula(conditional.valueIfTrue, this.right, this.relation, this.isSoft),
+					new ConstraintExpressionFormula(conditional.valueIfFalse, this.right, this.relation, this.isSoft)
+				};
+			} else if (this.left instanceof LambdaExpression) {
+				LambdaExpression lambda = (LambdaExpression) this.left;
+				BlockScope scope = lambda.enclosingScope;
+				if (!this.right.isFunctionalInterface(scope))
+					return FALSE;
+				
+				ReferenceBinding t = (ReferenceBinding) this.right;
+				ParameterizedTypeBinding withWildCards = InferenceContext18.parameterizedWithWildcard(t);
+				if (withWildCards != null) {
+					t = findGroundTargetType(inferenceContext, scope, lambda, withWildCards);
+				}
+				if (t == null)
+					return FALSE;
+				MethodBinding functionType = t.getSingleAbstractMethod(scope, true);
+				if (functionType == null)
+					return FALSE;
+				TypeBinding[] parameters = functionType.parameters;
+				if (parameters.length != lambda.arguments().length)
+					return FALSE;
+				if (lambda.argumentsTypeElided())
+					for (int i = 0; i < parameters.length; i++)
+						if (!parameters[i].isProperType(true))
+							return FALSE;
+				lambda = lambda.getResolvedCopyForInferenceTargeting(t);
+				if (lambda == null)
+					return FALSE; // not strictly unreduceable, but proceeding with TRUE would likely produce secondary errors
+				if (functionType.returnType == TypeBinding.VOID) {
+					if (!lambda.isVoidCompatible())
+						return FALSE;
+				} else {
+					if (!lambda.isValueCompatible())
+						return FALSE;
+				}
+				List<ConstraintFormula> result = new ArrayList<ConstraintFormula>();
+				if (!lambda.argumentsTypeElided()) {
+					Argument[] arguments = lambda.arguments();
+					for (int i = 0; i < parameters.length; i++)
+						result.add(ConstraintTypeFormula.create(parameters[i], arguments[i].type.resolveType(lambda.enclosingScope), SAME));
+					// in addition, ⟨T' <: T⟩:
+					if (lambda.resolvedType != null)
+						result.add(ConstraintTypeFormula.create(lambda.resolvedType, this.right, SUBTYPE));
+				}
+				if (functionType.returnType != TypeBinding.VOID) {
+					TypeBinding r = functionType.returnType;
+					Expression[] exprs;
+					if (lambda.body() instanceof Expression) {
+						exprs = new Expression[] {(Expression)lambda.body()};
+					} else {
+						exprs = lambda.resultExpressions();
+					}
+					for (int i = 0; i < exprs.length; i++) {
+						Expression expr = exprs[i];
+						if (r.isProperType(true) && expr.resolvedType != null) {
+							TypeBinding exprType = expr.resolvedType;
+							// "not compatible in an assignment context with R"?
+							if (!(expr.isConstantValueOfTypeAssignableToType(exprType, r)
+									|| exprType.isCompatibleWith(r) || expr.isBoxingCompatible(exprType, r, expr, scope)))
+								return FALSE;
+						} else {
+							result.add(new ConstraintExpressionFormula(expr, r, COMPATIBLE, this.isSoft));
+						}
+					}
+				}
+				if (result.size() == 0)
+					return TRUE;
+				return result.toArray(new ConstraintFormula[result.size()]);
+			} else if (this.left instanceof ReferenceExpression) {
+				return reduceReferenceExpressionCompatibility((ReferenceExpression) this.left, inferenceContext);
+			}
+		}
+		return FALSE;
+	}
+
+	public ReferenceBinding findGroundTargetType(InferenceContext18 inferenceContext, BlockScope scope,
+													LambdaExpression lambda, ParameterizedTypeBinding targetTypeWithWildCards)
+	{
+		if (lambda.argumentsTypeElided()) {
+			return lambda.findGroundTargetTypeForElidedLambda(scope, targetTypeWithWildCards);
+		} else {
+			SuspendedInferenceRecord previous = inferenceContext.enterLambda(lambda);
+			try {
+				return inferenceContext.inferFunctionalInterfaceParameterization(lambda, scope, targetTypeWithWildCards);
+			} finally {
+				inferenceContext.resumeSuspendedInference(previous);
+			}
+		}
+	}
+
+	private boolean canBePolyExpression(Expression expr) {
+		// when inferring compatibility against a right type, the check isPolyExpression 
+		// must assume that expr occurs in s.t. like an assignment context:
+		ExpressionContext previousExpressionContext = expr.getExpressionContext();
+		if (previousExpressionContext == ExpressionContext.VANILLA_CONTEXT)
+			this.left.setExpressionContext(ExpressionContext.ASSIGNMENT_CONTEXT);
+		try {
+			return expr.isPolyExpression();
+		} finally {
+			expr.setExpressionContext(previousExpressionContext);
+		}
+	}
+
+	private Object reduceReferenceExpressionCompatibility(ReferenceExpression reference, InferenceContext18 inferenceContext) {
+		TypeBinding t = this.right;
+		if (t.isProperType(true))
+			throw new IllegalStateException("Should not reach here with T being a proper type"); //$NON-NLS-1$
+		if (!t.isFunctionalInterface(inferenceContext.scope))
+			return FALSE;
+		MethodBinding functionType = t.getSingleAbstractMethod(inferenceContext.scope, true);
+		if (functionType == null)
+			return FALSE;
+		// potentially-applicable method for the method reference when targeting T (15.28.1),
+		MethodBinding potentiallyApplicable = reference.findCompileTimeMethodTargeting(t, inferenceContext.scope);
+		if (potentiallyApplicable == null)
+			return FALSE;
+		if (reference.isExactMethodReference()) {
+			List<ConstraintFormula> newConstraints = new ArrayList<ConstraintFormula>();
+			TypeBinding[] p = functionType.parameters;
+			int n = p.length;
+			TypeBinding[] pPrime = potentiallyApplicable.parameters;
+			int k = pPrime.length;
+			int offset = 0;
+			if (n == k+1) {
+				newConstraints.add(ConstraintTypeFormula.create(p[0], reference.lhs.resolvedType, COMPATIBLE));
+				offset = 1;
+			}
+			for (int i = offset; i < n; i++)
+				newConstraints.add(ConstraintTypeFormula.create(p[i], pPrime[i-offset], COMPATIBLE));
+			TypeBinding r = functionType.returnType;
+			if (r != TypeBinding.VOID) {
+				TypeBinding rAppl = potentiallyApplicable.isConstructor() && !reference.isArrayConstructorReference() ? potentiallyApplicable.declaringClass : potentiallyApplicable.returnType;
+				if (rAppl == TypeBinding.VOID)
+					return FALSE;
+				TypeBinding rPrime = rAppl.capture(inferenceContext.scope, 14); // FIXME capture position??
+				newConstraints.add(ConstraintTypeFormula.create(rPrime, r, COMPATIBLE));
+			}
+			return newConstraints.toArray(new ConstraintFormula[newConstraints.size()]);
+		} else { // inexact
+			int n = functionType.parameters.length;
+			for (int i = 0; i < n; i++)
+				if (!functionType.parameters[i].isProperType(true))
+					return FALSE;
+			// Otherwise, a search for a compile-time declaration is performed, as defined in 15.28.1....
+			// Note: we currently don't distinguish search for a potentially-applicable method from searching the compiler-time declaration,
+			// hence reusing the method binding from above
+			MethodBinding compileTimeDecl = potentiallyApplicable;
+			if (!compileTimeDecl.isValidBinding())
+				return FALSE;
+			TypeBinding r = functionType.isConstructor() ? functionType.declaringClass : functionType.returnType;
+			if (r.id == TypeIds.T_void)
+				return TRUE;
+			// ignore parameterization of resolve result and do a fresh start:
+			MethodBinding original = compileTimeDecl.original();
+			if (reference.typeArguments == null
+					&& ((original.typeVariables() != Binding.NO_TYPE_VARIABLES && r.mentionsAny(original.typeVariables(), -1))
+						|| (original.isConstructor() && original.declaringClass.typeVariables() != Binding.NO_TYPE_VARIABLES)))
+							// not checking r.mentionsAny for constructors, because A::new resolves to the raw type
+							// whereas in fact the type of all expressions of this shape depends on their type variable (if any)
+			{
+				SuspendedInferenceRecord prevInvocation = inferenceContext.enterPolyInvocation(reference, null/*no invocation arguments available*/);
+
+				// Invocation Applicability Inference: 18.5.1 & Invocation Type Inference: 18.5.2
+				try {
+					inferInvocationApplicability(inferenceContext, original, functionType.parameters, original.isConstructor()/*mimic a diamond?*/, inferenceContext.inferenceKind);
+					if (!inferPolyInvocationType(inferenceContext, reference, r, original))
+						return FALSE;
+					if (!original.isConstructor() 
+							|| reference.receiverType.isRawType()  // note: rawtypes may/may not have typeArguments() depending on initialization state
+							|| reference.receiverType.typeArguments() == null)
+						return null; // already incorporated
+					// for Foo<Bar>::new we need to (illegally) add one more constraint below to get to the Bar
+				} catch (InferenceFailureException e) {
+					return FALSE;
+				} finally {
+					inferenceContext.resumeSuspendedInference(prevInvocation);
+				}
+			}
+			TypeBinding rPrime = compileTimeDecl.isConstructor() ? compileTimeDecl.declaringClass : compileTimeDecl.returnType;
+			if (rPrime.id == TypeIds.T_void)
+				return FALSE;
+			return ConstraintTypeFormula.create(rPrime, r, COMPATIBLE, this.isSoft);
+		}
+	}
+
+	static void inferInvocationApplicability(InferenceContext18 inferenceContext, MethodBinding method, TypeBinding[] arguments, boolean isDiamond, int checkType)
+	{
+		// 18.5.1
+		TypeVariableBinding[] typeVariables = method.typeVariables;
+		if (isDiamond) {
+			TypeVariableBinding[] classTypeVariables = method.declaringClass.typeVariables();
+			int l1 = typeVariables.length;
+			int l2 = classTypeVariables.length;
+			if (l1 == 0) {
+				typeVariables = classTypeVariables;
+			} else if (l2 != 0) {
+				System.arraycopy(typeVariables, 0, typeVariables=new TypeVariableBinding[l1+l2], 0, l1);
+				System.arraycopy(classTypeVariables, 0, typeVariables, l1, l2);
+			}				
+		}
+		TypeBinding[] parameters = method.parameters;
+		InferenceVariable[] inferenceVariables = inferenceContext.createInitialBoundSet(typeVariables); // creates initial bound set B
+
+		// check if varargs need special treatment:
+		int paramLength = method.parameters.length;
+		TypeBinding varArgsType = null;
+		if (method.isVarargs()) {
+			int varArgPos = paramLength-1;
+			varArgsType = method.parameters[varArgPos];
+		}
+		inferenceContext.createInitialConstraintsForParameters(parameters, checkType==InferenceContext18.CHECK_VARARG, varArgsType, method);
+		inferenceContext.addThrowsContraints(typeVariables, inferenceVariables, method.thrownExceptions);
+	}
+
+	static boolean inferPolyInvocationType(InferenceContext18 inferenceContext, InvocationSite invocationSite, TypeBinding targetType, MethodBinding method) 
+				throws InferenceFailureException 
+	{
+		TypeBinding[] typeArguments = invocationSite.genericTypeArguments();
+		if (typeArguments == null) {
+			// invocation type inference (18.5.2):
+			TypeBinding returnType = method.isConstructor() ? method.declaringClass : method.returnType;
+			if (returnType == TypeBinding.VOID)
+				throw new InferenceFailureException("expression has no value"); //$NON-NLS-1$
+
+			if (inferenceContext.usesUncheckedConversion()) {
+				// spec says erasure, but we don't really have compatibility rules for erasure, use raw type instead:
+				TypeBinding erasure = inferenceContext.environment.convertToRawType(returnType, false);
+				ConstraintTypeFormula newConstraint = ConstraintTypeFormula.create(erasure, targetType, COMPATIBLE);
+				if (!inferenceContext.reduceAndIncorporate(newConstraint))
+					return false;
+				// continuing at true is not spec'd but needed for javac-compatibility,
+				// see org.aspectj.org.eclipse.jdt.core.tests.compiler.regression.GenericsRegressionTest_1_8.testBug428198()
+				// and org.aspectj.org.eclipse.jdt.core.tests.compiler.regression.GenericsRegressionTest_1_8.testBug428264()
+			}
+			TypeBinding rTheta = inferenceContext.substitute(returnType);
+			ParameterizedTypeBinding parameterizedType = InferenceContext18.parameterizedWithWildcard(rTheta);
+			if (parameterizedType != null && parameterizedType.arguments != null) {
+				TypeBinding[] arguments = parameterizedType.arguments;
+				InferenceVariable[] betas = inferenceContext.addTypeVariableSubstitutions(arguments);
+				ParameterizedTypeBinding gbeta = inferenceContext.environment.createParameterizedType(
+						parameterizedType.genericType(), betas, parameterizedType.enclosingType(), parameterizedType.getTypeAnnotations());
+				inferenceContext.currentBounds.captures.put(gbeta, parameterizedType); // established: both types have nonnull arguments
+				ConstraintTypeFormula newConstraint = ConstraintTypeFormula.create(gbeta, targetType, COMPATIBLE);
+				return inferenceContext.reduceAndIncorporate(newConstraint);
+			}
+			if (rTheta instanceof InferenceVariable) {
+				InferenceVariable alpha = (InferenceVariable) rTheta;
+				boolean toResolve = false;
+				if (inferenceContext.currentBounds.condition18_5_2_bullet_3_3_1(alpha, targetType)) {
+					toResolve = true;
+				} else if (inferenceContext.currentBounds.condition18_5_2_bullet_3_3_2(alpha, targetType, inferenceContext)) {
+					toResolve = true;
+				} else if (targetType.isPrimitiveType()) {
+					TypeBinding wrapper = inferenceContext.currentBounds.findWrapperTypeBound(alpha);
+					if (wrapper != null)
+						toResolve = true;
+				}
+				if (toResolve) {
+					BoundSet solution = inferenceContext.solve(new InferenceVariable[]{alpha});
+					if (solution == null)
+						return false;
+					TypeBinding u = solution.getInstantiation(alpha, null).capture(inferenceContext.scope, invocationSite.sourceStart()); // TODO make position unique?
+					ConstraintTypeFormula newConstraint = ConstraintTypeFormula.create(u, targetType, COMPATIBLE);
+					return inferenceContext.reduceAndIncorporate(newConstraint);
+				}
+			}
+			ConstraintTypeFormula newConstraint = ConstraintTypeFormula.create(rTheta, targetType, COMPATIBLE);
+			if (!inferenceContext.reduceAndIncorporate(newConstraint))
+				return false;
+		}
+		return true;
+	}
+
+	Collection<InferenceVariable> inputVariables(final InferenceContext18 context) {
+		// from 18.5.2.
+		if (this.left instanceof LambdaExpression) {
+			if (this.right instanceof InferenceVariable) {
+				return Collections.singletonList((InferenceVariable)this.right);
+			}
+			if (this.right.isFunctionalInterface(context.scope)) {
+				LambdaExpression lambda = (LambdaExpression) this.left;
+				MethodBinding sam = this.right.getSingleAbstractMethod(context.scope, true); // TODO derive with target type?
+				final Set<InferenceVariable> variables = new HashSet<InferenceVariable>();
+				if (lambda.argumentsTypeElided()) {
+					// i)
+					int len = sam.parameters.length;
+					for (int i = 0; i < len; i++) {
+						sam.parameters[i].collectInferenceVariables(variables);
+					}
+				}
+				if (sam.returnType != TypeBinding.VOID) {
+					// ii)
+					final TypeBinding r = sam.returnType;
+					Statement body = lambda.body();
+					if (body instanceof Expression) {
+						variables.addAll(new ConstraintExpressionFormula((Expression) body, r, COMPATIBLE).inputVariables(context));
+					} else {
+						// TODO: should I use LambdaExpression.resultExpressions? (is currently private).
+						body.traverse(new ASTVisitor() {
+							public boolean visit(ReturnStatement returnStatement, BlockScope scope) {
+								variables.addAll(new ConstraintExpressionFormula(returnStatement.expression, r, COMPATIBLE).inputVariables(context));
+								return false;
+							}
+						}, (BlockScope)null);
+					}
+				}
+				return variables;
+			}
+		} else if (this.left instanceof ReferenceExpression) {
+			if (this.right instanceof InferenceVariable) {
+				return Collections.singletonList((InferenceVariable)this.right);
+			}
+			if (this.right.isFunctionalInterface(context.scope) && !this.left.isExactMethodReference()) {
+				MethodBinding sam = this.right.getSingleAbstractMethod(context.scope, true);
+				final Set<InferenceVariable> variables = new HashSet<InferenceVariable>();
+				int len = sam.parameters.length;
+				for (int i = 0; i < len; i++) {
+					sam.parameters[i].collectInferenceVariables(variables);
+				}
+				return variables;
+			}			
+		} else if (this.left instanceof ConditionalExpression && this.left.isPolyExpression()) {
+			ConditionalExpression expr = (ConditionalExpression) this.left;
+			Set<InferenceVariable> variables = new HashSet<InferenceVariable>();
+			variables.addAll(new ConstraintExpressionFormula(expr.valueIfTrue, this.right, COMPATIBLE).inputVariables(context));
+			variables.addAll(new ConstraintExpressionFormula(expr.valueIfFalse, this.right, COMPATIBLE).inputVariables(context));
+			return variables;
+		}
+		return EMPTY_VARIABLE_LIST;
+	}
+
+	// debugging:
+	public String toString() {
+		StringBuffer buf = new StringBuffer().append(LEFT_ANGLE_BRACKET);
+		this.left.printExpression(4, buf);
+		buf.append(relationToString(this.relation));
+		appendTypeName(buf, this.right);
+		buf.append(RIGHT_ANGLE_BRACKET);
+		return buf.toString();
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintFormula.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintFormula.java
new file mode 100644
index 0000000..23efb02
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintFormula.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Implementation of 18.1.2 in JLS8
+ */
+abstract class ConstraintFormula extends ReductionResult {
+
+	static final List<InferenceVariable> EMPTY_VARIABLE_LIST = Collections.emptyList();
+	static final ConstraintFormula[] NO_CONSTRAINTS = new ConstraintTypeFormula[0];
+
+	// constants for unicode debug output from ASCII source files:
+	static final char LEFT_ANGLE_BRACKET = '\u27E8';
+	static final char RIGHT_ANGLE_BRACKET = '\u27E9';
+
+	public abstract Object reduce(InferenceContext18 inferenceContext) throws InferenceFailureException;
+
+	/** 5.3: compatibility check which includes the option of boxing/unboxing. */
+	protected boolean isCompatibleWithInLooseInvocationContext(TypeBinding one, TypeBinding two, InferenceContext18 context) {
+		if (one.isCompatibleWith(two, context.scope))
+			return true;
+		if (one.isBaseType() == two.isBaseType()) // this also protects against comparing null & primitive
+			return false;
+		if (one.isPrimitiveType()) {
+			if (!two.isBaseType()) {
+				TypeBinding boxingType = context.environment.computeBoxingType(one);
+				if (boxingType != one) //$IDENTITY-COMPARISON$ just checking if boxing could help
+					return boxingType.isCompatibleWith(two, context.scope);
+			}
+		} else if (two.isPrimitiveType()) {
+			TypeBinding boxingType = context.environment.computeBoxingType(two);
+			if (boxingType != two) //$IDENTITY-COMPARISON$ just checking if boxing could help
+				return one.isCompatibleWith(boxingType, context.scope);
+		}
+		return false;
+	}
+
+	Collection<InferenceVariable> inputVariables(InferenceContext18 context) {
+		return EMPTY_VARIABLE_LIST;
+	}
+	
+	Collection<InferenceVariable> outputVariables(InferenceContext18 context) {
+		Set<InferenceVariable> variables = new HashSet<InferenceVariable>();
+		this.right.collectInferenceVariables(variables);
+		if (!variables.isEmpty())
+			variables.removeAll(inputVariables(context));
+		return variables;
+	}
+
+	public boolean applySubstitution(BoundSet solutionSet, InferenceVariable[] variables) {
+		for (int i=0; i<variables.length; i++) {
+			InferenceVariable variable = variables[i];
+			TypeBinding instantiation = solutionSet.getInstantiation(variables[i], null);
+			if (instantiation == null)
+				return false;
+			this.right = this.right.substituteInferenceVariable(variable, instantiation);
+		}
+		return true;
+	}
+
+	// for debug toString():
+	protected void appendTypeName(StringBuffer buf, TypeBinding type) {
+		if (type instanceof CaptureBinding18)
+			buf.append(type.toString()); // contains more info than readable name
+		else
+			buf.append(type.readableName());
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintTypeFormula.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintTypeFormula.java
new file mode 100644
index 0000000..010cbf9
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ConstraintTypeFormula.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
+
+/**
+ * Implementation of 18.1.2 in JLS8, cases:
+ * <ul>
+ * <li>S -> T <em>compatible</em></li>
+ * <li>S <: T <em>subtype</em></li>
+ * <li>S = T  <em>equality</em></li>
+ * <li>S <= T <em>type argument containment</em></li>
+ * </ul>
+ */
+class ConstraintTypeFormula extends ConstraintFormula {
+
+	TypeBinding left;
+	
+	// this flag contributes to the workaround controlled by InferenceContext18.ARGUMENT_CONSTRAINTS_ARE_SOFT:
+	boolean isSoft;
+
+	public static ConstraintTypeFormula create(TypeBinding exprType, TypeBinding right, int relation) {
+		if (exprType == null || right == null) 
+			return FALSE;
+		return new ConstraintTypeFormula(exprType, right, relation, false);
+	}
+
+	public static ConstraintTypeFormula create(TypeBinding exprType, TypeBinding right, int relation, boolean isSoft) {
+		if (exprType == null || right == null) 
+			return FALSE;
+		return new ConstraintTypeFormula(exprType, right, relation, isSoft);
+	}
+
+	// DON'T USE, use factory methods above instead.
+	private ConstraintTypeFormula(TypeBinding exprType, TypeBinding right, int relation, boolean isSoft) {
+		this.left = exprType;
+		this.right = right;
+		this.relation = relation;
+		this.isSoft = isSoft;
+	}
+
+	// for constants TRUE & FALSE, only:
+	ConstraintTypeFormula() { }
+
+	// return: ReductionResult or ConstraintFormula[]
+	public Object reduce(InferenceContext18 inferenceContext) {
+		switch (this.relation) {
+		case COMPATIBLE:
+			// 18.2.2:
+			if (this.left.isProperType(true) && this.right.isProperType(true)) {
+				if (isCompatibleWithInLooseInvocationContext(this.left, this.right, inferenceContext))
+					return TRUE;
+				return FALSE;
+			}
+			if (this.left.isPrimitiveType()) {
+				TypeBinding sPrime = inferenceContext.environment.computeBoxingType(this.left);
+				return ConstraintTypeFormula.create(sPrime, this.right, COMPATIBLE, this.isSoft);
+			}
+			if (this.right.isPrimitiveType()) {
+				TypeBinding tPrime = inferenceContext.environment.computeBoxingType(this.right);
+				return ConstraintTypeFormula.create(this.left, tPrime, SAME, this.isSoft);
+			}
+			switch (this.right.kind()) {
+			case Binding.ARRAY_TYPE:
+				if (this.right.leafComponentType().kind() != Binding.PARAMETERIZED_TYPE)
+					break;
+				//$FALL-THROUGH$ array of parameterized is handled below:
+			case Binding.PARAMETERIZED_TYPE:
+				{																
+					//															  this.right = G<T1,T2,...> or G<T1,T2,...>[]k
+					TypeBinding gs = this.left.findSuperTypeOriginatingFrom(this.right);	// G<S1,S2,...> or G<S1,S2,...>[]k
+					if (gs != null && gs.leafComponentType().isRawType()) {
+						inferenceContext.recordUncheckedConversion(this);
+						return TRUE;
+					}
+					break;
+				}
+			}
+			return ConstraintTypeFormula.create(this.left, this.right, SUBTYPE, this.isSoft);
+		case SUBTYPE:
+			// 18.2.3:
+			return reduceSubType(inferenceContext.scope, this.left, this.right);
+		case SUPERTYPE:
+			// 18.2.3:
+			return reduceSubType(inferenceContext.scope, this.right, this.left);
+		case SAME:
+			// 18.2.4:
+			return reduceTypeEquality(inferenceContext.object);
+		case TYPE_ARGUMENT_CONTAINED:
+			// 18.2.3:
+			if (this.right.kind() != Binding.WILDCARD_TYPE) { // "If T is a type" ... all alternatives require "wildcard"
+				if (this.left.kind() != Binding.WILDCARD_TYPE) {
+					return ConstraintTypeFormula.create(this.left, this.right, SAME, this.isSoft);						
+				} else {
+					return FALSE;
+				}
+			} else {
+				WildcardBinding t = (WildcardBinding) this.right;
+				if (t.boundKind == Wildcard.UNBOUND)
+					return TRUE;
+				if (t.boundKind == Wildcard.EXTENDS) {
+					if (this.left.kind() != Binding.WILDCARD_TYPE) {
+						return ConstraintTypeFormula.create(this.left, t.bound, SUBTYPE, this.isSoft);
+					} else {
+						WildcardBinding s = (WildcardBinding) this.left;
+						switch (s.boundKind) {
+							case Wildcard.UNBOUND:
+								return ConstraintTypeFormula.create(inferenceContext.object, t.bound, SUBTYPE, this.isSoft);
+							case Wildcard.EXTENDS: 
+								return ConstraintTypeFormula.create(s.bound, t.bound, SUBTYPE, this.isSoft);
+							case Wildcard.SUPER: 
+								return ConstraintTypeFormula.create(inferenceContext.object, t.bound, SAME, this.isSoft);
+							default:
+								throw new IllegalArgumentException("Unexpected boundKind "+s.boundKind);  //$NON-NLS-1$
+						}
+					}
+				} else { // SUPER 
+					if (this.left.kind() != Binding.WILDCARD_TYPE) {
+						return ConstraintTypeFormula.create(t.bound, this.left, SUBTYPE, this.isSoft);
+					} else {
+						WildcardBinding s = (WildcardBinding) this.left;
+						if (s.boundKind == Wildcard.SUPER) {
+							return ConstraintTypeFormula.create(t.bound, s.bound, SUBTYPE, this.isSoft);
+						} else {
+							return FALSE;
+						}
+					}
+				}
+			}
+		default: throw new IllegalStateException("Unexpected relation kind "+this.relation); //$NON-NLS-1$
+		}
+	}
+
+	private Object reduceTypeEquality(TypeBinding object) {
+		// 18.2.4
+		if (this.left.kind() == Binding.WILDCARD_TYPE) {
+			if (this.right.kind() == Binding.WILDCARD_TYPE) {
+				// left and right are wildcards ("type arguments")
+				WildcardBinding leftWC = (WildcardBinding)this.left;
+				WildcardBinding rightWC = (WildcardBinding)this.right;
+				if (leftWC.boundKind == Wildcard.UNBOUND && rightWC.boundKind == Wildcard.UNBOUND)
+					return TRUE;
+				if (leftWC.boundKind == Wildcard.UNBOUND && rightWC.boundKind == Wildcard.EXTENDS)
+					return ConstraintTypeFormula.create(object, rightWC.bound, SAME, this.isSoft);
+				if (leftWC.boundKind == Wildcard.EXTENDS && rightWC.boundKind == Wildcard.UNBOUND)
+					return ConstraintTypeFormula.create(leftWC.bound, object, SAME, this.isSoft);
+				if ((leftWC.boundKind == Wildcard.EXTENDS && rightWC.boundKind == Wildcard.EXTENDS)
+					||(leftWC.boundKind == Wildcard.SUPER && rightWC.boundKind == Wildcard.SUPER))
+				{
+					return ConstraintTypeFormula.create(leftWC.bound, rightWC.bound, SAME, this.isSoft);
+				}						
+			}
+		} else {
+			if (this.right.kind() != Binding.WILDCARD_TYPE) {
+				// left and right are types (vs. wildcards)
+				if (this.left.isProperType(true) && this.right.isProperType(true)) {
+					if (TypeBinding.equalsEquals(this.left, this.right))
+						return TRUE;
+					return FALSE;
+				}
+				if (this.left instanceof InferenceVariable) {
+					return new TypeBound((InferenceVariable) this.left, this.right, SAME, this.isSoft);
+				}
+				if (this.right instanceof InferenceVariable) {
+					return new TypeBound((InferenceVariable) this.right, this.left, SAME, this.isSoft);
+				}
+				if ((this.left.isClass() || this.left.isInterface()) 
+						&& (this.right.isClass() || this.right.isInterface())
+						&& TypeBinding.equalsEquals(this.left.erasure(), this.right.erasure())) 
+				{
+					TypeBinding[] leftParams = this.left.typeArguments();
+					TypeBinding[] rightParams = this.right.typeArguments();
+					if (leftParams == null || rightParams == null)
+						return leftParams == rightParams ? TRUE : FALSE;
+					if (leftParams.length != rightParams.length)
+						return FALSE;
+					int len = leftParams.length;
+					ConstraintFormula[] constraints = new ConstraintFormula[len];
+					for (int i = 0; i < len; i++) {
+						constraints[i] = ConstraintTypeFormula.create(leftParams[i], rightParams[i], SAME, this.isSoft);
+					}
+					return constraints;
+				}
+				if (this.left.isArrayType() && this.right.isArrayType() && this.left.dimensions() == this.right.dimensions()) {
+					// checking dimensions already now is an optimization over reducing one dim at a time
+					return ConstraintTypeFormula.create(this.left.leafComponentType(), this.right.leafComponentType(), SAME, this.isSoft);
+				}
+			}
+		}
+		return FALSE;
+	}
+
+	private Object reduceSubType(Scope scope, TypeBinding subCandidate, TypeBinding superCandidate) {
+		// 18.2.3 Subtyping Constraints
+		if (subCandidate.isProperType(true) && superCandidate.isProperType(true)) {
+			if (subCandidate.isCompatibleWith(superCandidate, scope))
+				return TRUE;
+			return FALSE;
+		}
+		if (subCandidate.id == TypeIds.T_null)
+			return TRUE;
+		if (superCandidate.id == TypeIds.T_null)
+			return FALSE;
+		if (subCandidate instanceof InferenceVariable)
+			return new TypeBound((InferenceVariable)subCandidate, superCandidate, SUBTYPE, this.isSoft);
+		if (superCandidate instanceof InferenceVariable)
+			return new TypeBound((InferenceVariable)superCandidate, subCandidate, SUPERTYPE, this.isSoft); // normalize to have variable on LHS
+		switch (superCandidate.kind()) {
+			case Binding.GENERIC_TYPE:
+			case Binding.TYPE:
+			case Binding.RAW_TYPE:
+				{
+					if (subCandidate.isSubtypeOf(superCandidate))
+						return TRUE;
+					return FALSE;
+				}
+			case Binding.PARAMETERIZED_TYPE:
+				{
+					List<ConstraintFormula> constraints = new ArrayList<ConstraintFormula>();
+					while (superCandidate != null && superCandidate.kind() == Binding.PARAMETERIZED_TYPE && subCandidate != null)  {
+						if (!addConstraintsFromTypeParameters(subCandidate, (ParameterizedTypeBinding) superCandidate, constraints))
+							return FALSE;
+						// travel to enclosing types to check if they have type parameters, too:
+						superCandidate = superCandidate.enclosingType();
+						subCandidate = subCandidate.enclosingType();
+					}
+					switch (constraints.size()) {
+						case 0 : return TRUE;
+						case 1 : return constraints.get(0);
+						default: return constraints.toArray(new ConstraintFormula[constraints.size()]);
+					}
+				}
+			case Binding.ARRAY_TYPE:
+				TypeBinding tPrime = ((ArrayBinding)superCandidate).elementsType();
+				// let S'[] be the most specific array type that is a supertype of S (or S itself)
+				ArrayBinding sPrimeArray = null;
+				switch(subCandidate.kind()) {
+				case Binding.INTERSECTION_TYPE:
+					{
+						WildcardBinding intersection = (WildcardBinding) subCandidate;
+						sPrimeArray = findMostSpecificSuperArray(intersection.bound, intersection.otherBounds, intersection);
+						break;
+					}
+				case Binding.ARRAY_TYPE:
+					sPrimeArray = (ArrayBinding) subCandidate;
+					break;
+				case Binding.TYPE_PARAMETER:
+					{
+						TypeVariableBinding subTVB = (TypeVariableBinding)subCandidate;
+						sPrimeArray = findMostSpecificSuperArray(subTVB.firstBound, subTVB.otherUpperBounds(), subTVB);
+						break;
+					}
+				default:					
+					return FALSE;
+				}
+				if (sPrimeArray == null)
+					return FALSE;
+				TypeBinding sPrime = sPrimeArray.elementsType();
+				if (!tPrime.isPrimitiveType() && !sPrime.isPrimitiveType()) {
+					return ConstraintTypeFormula.create(sPrime, tPrime, SUBTYPE, this.isSoft);
+				}
+				return TypeBinding.equalsEquals(tPrime, sPrime) ? TRUE : FALSE; // same primitive type?
+
+			// "type variable" has two implementations in JDT:
+			case Binding.WILDCARD_TYPE:
+				if (subCandidate.kind() == Binding.INTERSECTION_TYPE) {
+					ReferenceBinding[] intersectingTypes = subCandidate.getIntersectingTypes();
+					if (intersectingTypes != null)
+						for (int i = 0; i < intersectingTypes.length; i++)
+							if (TypeBinding.equalsEquals(intersectingTypes[i], superCandidate))
+								return true;
+				}
+				WildcardBinding variable = (WildcardBinding) superCandidate;
+				if (variable.boundKind == Wildcard.SUPER)
+					return ConstraintTypeFormula.create(subCandidate, variable.bound, SUBTYPE, this.isSoft);
+				return FALSE;
+			case Binding.TYPE_PARAMETER:
+				// similar to wildcard, but different queries for lower bound
+				if (subCandidate.kind() == Binding.INTERSECTION_TYPE) {
+					ReferenceBinding[] intersectingTypes = subCandidate.getIntersectingTypes();
+					if (intersectingTypes != null)
+						for (int i = 0; i < intersectingTypes.length; i++)
+							if (TypeBinding.equalsEquals(intersectingTypes[i], superCandidate))
+								return true;
+				}
+				if (superCandidate instanceof CaptureBinding) {
+					CaptureBinding capture = (CaptureBinding) superCandidate;
+					if (capture.lowerBound != null && (capture.firstBound == null || capture.firstBound.id == TypeIds.T_JavaLangObject))
+						return ConstraintTypeFormula.create(subCandidate, capture.lowerBound, SUBTYPE, this.isSoft);
+				}
+				return FALSE;
+			case Binding.INTERSECTION_TYPE:
+				superCandidate = ((WildcardBinding) superCandidate).allBounds();
+				//$FALL-THROUGH$
+			case Binding.INTERSECTION_CAST_TYPE:
+				TypeBinding[] intersectingTypes = ((IntersectionCastTypeBinding) superCandidate).intersectingTypes;
+				ConstraintFormula[] result = new ConstraintFormula[intersectingTypes.length];
+				for (int i = 0; i < intersectingTypes.length; i++) {
+					result[i] = ConstraintTypeFormula.create(subCandidate, intersectingTypes[i], SUBTYPE, this.isSoft);
+				}
+				return result;
+		}
+		throw new IllegalStateException("Unexpected RHS "+superCandidate); //$NON-NLS-1$
+	}
+	
+	private ArrayBinding findMostSpecificSuperArray(TypeBinding firstBound, TypeBinding[] otherUpperBounds, TypeBinding theType) {
+		int numArrayBounds = 0;
+		ArrayBinding result = null;
+		if (firstBound != null && firstBound.isArrayType()) {
+			result = (ArrayBinding) firstBound;
+			numArrayBounds++;
+		}
+		for (int i = 0; i < otherUpperBounds.length; i++) {
+			if (otherUpperBounds[i].isArrayType()) {
+				result = (ArrayBinding) otherUpperBounds[i];
+				numArrayBounds++;
+			}
+		}
+		if (numArrayBounds == 0)
+			return null;
+		if (numArrayBounds == 1)
+			return result;
+		InferenceContext18.missingImplementation("Extracting array from intersection is not defined"); //$NON-NLS-1$
+		return null;
+	}
+
+	boolean addConstraintsFromTypeParameters(TypeBinding subCandidate, ParameterizedTypeBinding ca, List<ConstraintFormula> constraints) {
+		TypeBinding[] ai = ca.arguments;								// C<A1,A2,...>
+		if (ai == null)
+			return true; // no arguments here means nothing to check
+		TypeBinding cb = subCandidate.findSuperTypeOriginatingFrom(ca);	// C<B1,B2,...>
+		if (cb == null)
+			return false; // nothing here means we failed 
+		if (TypeBinding.equalsEquals(ca, cb)) // incl C#RAW vs C#RAW
+			return true;
+		TypeBinding[] bi = ((ParameterizedTypeBinding) cb).arguments;
+		if (cb.isRawType() || bi == null || bi.length == 0)
+			return (this.isSoft && InferenceContext18.SIMULATE_BUG_JDK_8026527) ? true : false; // FALSE would conform to the spec 
+		for (int i = 0; i < ai.length; i++)
+			constraints.add(ConstraintTypeFormula.create(bi[i], ai[i], TYPE_ARGUMENT_CONTAINED, this.isSoft));
+		return true;
+	}
+
+	public boolean applySubstitution(BoundSet solutionSet, InferenceVariable[] variables) {
+		super.applySubstitution(solutionSet, variables);
+		for (int i=0; i<variables.length; i++) {
+			InferenceVariable variable = variables[i];
+			TypeBinding instantiation = solutionSet.getInstantiation(variables[i], null);
+			if (instantiation == null)
+				return false;
+			this.left = this.left.substituteInferenceVariable(variable, instantiation);
+		}
+		return true;
+	}
+
+	// debugging
+	public String toString() {
+		StringBuffer buf = new StringBuffer("Type Constraint:\n"); //$NON-NLS-1$
+		buf.append('\t').append(LEFT_ANGLE_BRACKET);
+		appendTypeName(buf, this.left); 
+		buf.append(relationToString(this.relation));
+		appendTypeName(buf, this.right);
+		buf.append(RIGHT_ANGLE_BRACKET);
+		return buf.toString();
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.java
index 282fcd3..c2dda36 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - Contributions for
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.java
index 1422503..d8e211e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.java
@@ -10,6 +10,7 @@
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - Contributions for
  *								bug 185682 - Increment/decrement operators mark local variables as read
  *								bug 331649 - [compiler][null] consider null annotations for fields
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -65,7 +66,7 @@
 	if (isPublic()) return true;
 
 	SourceTypeBinding invocationType = scope.invocationType(); // AspectJ Extension, was enclosingSourceType()
-	if (invocationType == this.declaringClass && invocationType == receiverType) return true;
+	if (TypeBinding.equalsEquals(invocationType, this.declaringClass) && TypeBinding.equalsEquals(invocationType, receiverType)) return true;
 
 	if (invocationType == null) // static import call
 		return !isPrivate() && scope.getCurrentPackage() == this.declaringClass.fPackage;
@@ -76,7 +77,7 @@
 		//    AND the receiverType is the invocationType or its subclass
 		//    OR the method is a static method accessed directly through a type
 		//    OR previous assertions are true for one of the enclosing type
-		if (invocationType == this.declaringClass) return true;
+		if (TypeBinding.equalsEquals(invocationType, this.declaringClass)) return true;
 		if (invocationType.fPackage == this.declaringClass.fPackage) return true;
 
 		ReferenceBinding currentType = invocationType;
@@ -94,7 +95,7 @@
 					if (depth > 0) invocationSite.setDepth(depth);
 					return true; // see 1FMEPDL - return invocationSite.isTypeAccess();
 				}
-				if (currentType == receiverErasure || receiverErasure.findSuperTypeOriginatingFrom(currentType) != null) {
+				if (TypeBinding.equalsEquals(currentType, receiverErasure) || receiverErasure.findSuperTypeOriginatingFrom(currentType) != null) {
 					if (depth > 0) invocationSite.setDepth(depth);
 					return true;
 				}
@@ -109,7 +110,7 @@
 		// answer true if the receiverType is the declaringClass
 		// AND the invocationType and the declaringClass have a common enclosingType
 		receiverCheck: {
-			if (receiverType != this.declaringClass) {
+			if (TypeBinding.notEquals(receiverType, this.declaringClass)) {
 				// special tolerance for type variable direct bounds, but only if compliance <= 1.6, see: https://bugs.eclipse.org/bugs/show_bug.cgi?id=334622
 				if (scope.compilerOptions().complianceLevel <= ClassFileConstants.JDK1_6 && receiverType.isTypeVariable() && ((TypeVariableBinding) receiverType).isErasureBoundTo(this.declaringClass.erasure()))
 					break receiverCheck;
@@ -117,7 +118,7 @@
 			}
 		}
 
-		if (invocationType != this.declaringClass) {
+		if (TypeBinding.notEquals(invocationType, this.declaringClass)) {
 			ReferenceBinding outerInvocationType = invocationType;
 			ReferenceBinding temp = outerInvocationType.enclosingType();
 			while (temp != null) {
@@ -131,7 +132,7 @@
 				outerDeclaringClass = temp;
 				temp = temp.enclosingType();
 			}
-			if (outerInvocationType != outerDeclaringClass) return false;
+			if (TypeBinding.notEquals(outerInvocationType, outerDeclaringClass)) return false;
 		}
 		return true;
 	}
@@ -147,9 +148,9 @@
 	ReferenceBinding currentType = (ReferenceBinding) receiverType;
 	do {
 		if (currentType.isCapture()) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=285002
-			if (originalDeclaringClass == currentType.erasure().original()) return true;
+			if (TypeBinding.equalsEquals(originalDeclaringClass, currentType.erasure().original())) return true;
 		} else {
-			if (originalDeclaringClass == currentType.original()) return true;
+			if (TypeBinding.equalsEquals(originalDeclaringClass, currentType.original())) return true;
 		}
 		PackageBinding currentPackage = currentType.fPackage;
 		// package could be null for wildcards/intersection types, ignore and recurse in superclass
@@ -226,11 +227,15 @@
 }
 
 public void fillInDefaultNonNullness(FieldDeclaration sourceField, Scope scope) {
+	LookupEnvironment environment = scope.environment();
 	if (   this.type != null
 		&& !this.type.isBaseType()
-		&& (this.tagBits & (TagBits.AnnotationNonNull|TagBits.AnnotationNullable)) == 0)
+		&& (this.tagBits & TagBits.AnnotationNullMASK) == 0)
 	{
-		this.tagBits |= TagBits.AnnotationNonNull;
+		if (environment.globalOptions.sourceLevel < ClassFileConstants.JDK1_8)
+			this.tagBits |= TagBits.AnnotationNonNull;
+		else
+			this.type = environment.createAnnotatedType(this.type, new AnnotationBinding[]{environment.getNonNullAnnotation()});
 	} else if ((this.tagBits & TagBits.AnnotationNonNull) != 0) {
 		scope.problemReporter().nullAnnotationIsRedundant(sourceField);
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java
index 9e4828f..38333e2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2013 GK Software AG, IBM Corporation and others.
+ * Copyright (c) 2012, 2014 GK Software AG, 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,8 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Argument;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 /**
@@ -27,6 +29,7 @@
  * Next, also default nullness is filled into remaining empty slots.
  * After all implicit annotations have been filled in compatibility is checked and problems are complained.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ImplicitNullAnnotationVerifier {
 
 	/**
@@ -43,16 +46,21 @@
 	// can be 'this', but is never a MethodVerifier (to avoid infinite recursion).
 	ImplicitNullAnnotationVerifier buddyImplicitNullAnnotationsVerifier;
 	private boolean inheritNullAnnotations;
+	protected LookupEnvironment environment;
 
-	public ImplicitNullAnnotationVerifier(boolean inheritNullAnnotations) {
+
+	public ImplicitNullAnnotationVerifier(LookupEnvironment environment, boolean inheritNullAnnotations) {
 		this.buddyImplicitNullAnnotationsVerifier = this;
 		this.inheritNullAnnotations = inheritNullAnnotations;
+		this.environment = environment;
 	}
 
 	// for sub-classes:
-	ImplicitNullAnnotationVerifier(CompilerOptions options) {
-		this.buddyImplicitNullAnnotationsVerifier = new ImplicitNullAnnotationVerifier(options.inheritNullAnnotations);
+	ImplicitNullAnnotationVerifier(LookupEnvironment environment) {
+		CompilerOptions options = environment.globalOptions;
+		this.buddyImplicitNullAnnotationsVerifier = new ImplicitNullAnnotationVerifier(environment, options.inheritNullAnnotations);
 		this.inheritNullAnnotations = options.inheritNullAnnotations;
+		this.environment = environment;
 	}
 
 	/**
@@ -79,6 +87,11 @@
 			if (isInstanceMethod) {
 				List superMethodList = new ArrayList();
 				
+				// need super types connected:
+				if (currentType instanceof SourceTypeBinding && !currentType.isHierarchyConnected() && !currentType.isAnonymousType()) {
+					((SourceTypeBinding) currentType).scope.connectTypeHierarchy();
+				}
+
 				int paramLen = currentMethod.parameters.length;
 				findAllOverriddenMethods(currentMethod.original(), currentMethod.selector, paramLen,
 								currentType, new HashSet(), superMethodList);
@@ -97,27 +110,45 @@
 					checkNullSpecInheritance(currentMethod, srcMethod, needToApplyNonNullDefault, complain, currentSuper, scope, inheritedNonNullnessInfos);
 					needToApplyNonNullDefault = false;
 				}
+				long sourceLevel = scope.compilerOptions().sourceLevel;
 				
 				// transfer collected information into currentMethod:
 				InheritedNonNullnessInfo info = inheritedNonNullnessInfos[0];
 				if (!info.complained) {
+					long tagBits = 0;
 					if (info.inheritedNonNullness == Boolean.TRUE) {
-						currentMethod.tagBits |= TagBits.AnnotationNonNull;
+						tagBits = TagBits.AnnotationNonNull;
 					} else if (info.inheritedNonNullness == Boolean.FALSE) {
-						currentMethod.tagBits |= TagBits.AnnotationNullable;
+						tagBits = TagBits.AnnotationNullable;
+					}
+					if (tagBits != 0) {
+						if (sourceLevel < ClassFileConstants.JDK1_8) {
+							currentMethod.tagBits |= tagBits;
+						} else {
+							if (!currentMethod.returnType.isBaseType()) {
+								LookupEnvironment env = scope.environment();
+								currentMethod.returnType = env.createAnnotatedType(currentMethod.returnType, env.nullAnnotationsFromTagBits(tagBits));
+							}
+						}
 					}
 				}
 				for (int i=0; i<paramLen; i++) {
 					info = inheritedNonNullnessInfos[i+1];
 					if (!info.complained && info.inheritedNonNullness != null) {
 						Argument currentArg = srcMethod == null ? null : srcMethod.arguments[i];
-						recordArgNonNullness(currentMethod, paramLen, i, currentArg, info.inheritedNonNullness);
+						if (sourceLevel < ClassFileConstants.JDK1_8)
+							recordArgNonNullness(currentMethod, paramLen, i, currentArg, info.inheritedNonNullness);
+						else
+							recordArgNonNullness18(currentMethod, i, currentArg, info.inheritedNonNullness, scope.environment());
 					}
 				}
 
 			}
 			if (needToApplyNonNullDefault) {
-				currentMethod.fillInDefaultNonNullness(srcMethod);
+				if (scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_8)
+					currentMethod.fillInDefaultNonNullness(srcMethod);
+				else
+					currentMethod.fillInDefaultNonNullness18(srcMethod, scope.environment());
 			}
 		} finally {			
 			currentMethod.tagBits |= TagBits.IsNullnessKnown;
@@ -158,7 +189,7 @@
 			MethodBinding currentMethod = ifcMethods[i];
 			if (currentMethod.isStatic())
 				continue;
-			if (areParametersEqual(original, currentMethod)) {
+			if (MethodVerifier.doesMethodOverride(original, currentMethod, this.environment)) {
 				result.add(currentMethod);
 				return; // at most one method is overridden from any supertype
 			}
@@ -197,12 +228,10 @@
 			// TODO (stephan): even here we may need to report problems? How to discriminate?
 			this.buddyImplicitNullAnnotationsVerifier.checkImplicitNullAnnotations(inheritedMethod, null, false, scope);
 		}
-		long inheritedBits = inheritedMethod.tagBits;
-		long inheritedNullnessBits = inheritedBits & (TagBits.AnnotationNonNull|TagBits.AnnotationNullable);
-		long currentBits = currentMethod.tagBits;
-		long currentNullnessBits = currentBits & (TagBits.AnnotationNonNull|TagBits.AnnotationNullable);
+		boolean useTypeAnnotations = this.environment.globalOptions.sourceLevel >= ClassFileConstants.JDK1_8;
+		long inheritedNullnessBits = getReturnTypeNullnessTagBits(inheritedMethod, useTypeAnnotations);
+		long currentNullnessBits = getReturnTypeNullnessTagBits(currentMethod, useTypeAnnotations);
 		
-		LookupEnvironment environment = scope.environment();
 		boolean shouldInherit = this.inheritNullAnnotations;
 
 		// return type:
@@ -224,13 +253,14 @@
 									inheritedMethod, Boolean.valueOf(inheritedNullnessBits == TagBits.AnnotationNonNull), inheritedNonNullnessInfos[0]);
 						} else {
 							// no need to defer, record this info now:
-							currentMethod.tagBits |= inheritedNullnessBits;
+							applyReturnNullBits(currentMethod, inheritedNullnessBits);
 						}	
 						break returnType; // compatible by construction, skip complain phase below
 					}
 				}
 				if (hasNonNullDefault) { // conflict with inheritance already checked
-					currentMethod.tagBits |= (currentNullnessBits = TagBits.AnnotationNonNull); 
+					currentNullnessBits = TagBits.AnnotationNonNull;
+					applyReturnNullBits(currentMethod, currentNullnessBits);
 				}
 			}
 			if (shouldComplain) {
@@ -239,9 +269,16 @@
 				{
 					if (srcMethod != null) {
 						scope.problemReporter().illegalReturnRedefinition(srcMethod, inheritedMethod,
-																	environment.getNonNullAnnotationName());
+																	this.environment.getNonNullAnnotationName());
+						break returnType;
 					} else {
-						scope.problemReporter().cannotImplementIncompatibleNullness(currentMethod, inheritedMethod);
+						scope.problemReporter().cannotImplementIncompatibleNullness(currentMethod, inheritedMethod, useTypeAnnotations);
+						return;
+					}
+				}
+				if (useTypeAnnotations) {
+					if (NullAnnotationMatching.analyse(inheritedMethod.returnType, currentMethod.returnType, 0, true).isAnyMismatch()) {
+						scope.problemReporter().cannotImplementIncompatibleNullness(currentMethod, inheritedMethod, useTypeAnnotations);
 						return;
 					}
 				}
@@ -254,6 +291,8 @@
 		int length = 0;
 		if (currentArguments != null)
 			length = currentArguments.length;
+		if (useTypeAnnotations) // need to look for type annotations on all parameters:
+			length = currentMethod.parameters.length;
 		else if (inheritedMethod.parameterNonNullness != null)
 			length = inheritedMethod.parameterNonNullness.length;
 		else if (currentMethod.parameterNonNullness != null)
@@ -264,10 +303,8 @@
 
 			Argument currentArgument = currentArguments == null 
 										? null : currentArguments[i];
-			Boolean inheritedNonNullNess = (inheritedMethod.parameterNonNullness == null)
-										? null : inheritedMethod.parameterNonNullness[i];
-			Boolean currentNonNullNess = (currentMethod.parameterNonNullness == null)
-										? null : currentMethod.parameterNonNullness[i];
+			Boolean inheritedNonNullNess = getParameterNonNullness(inheritedMethod, i, useTypeAnnotations);
+			Boolean currentNonNullNess = getParameterNonNullness(currentMethod, i, useTypeAnnotations);
 
 			if (currentNonNullNess == null) {
 				// unspecified, may fill in either from super or from default
@@ -288,22 +325,28 @@
 									inheritedMethod, inheritedNonNullNess, inheritedNonNullnessInfos[i+1]);
 						} else {
 							// no need to defer, record this info now:
-							recordArgNonNullness(currentMethod, length, i, currentArgument, inheritedNonNullNess);
+							if (!useTypeAnnotations)
+								recordArgNonNullness(currentMethod, length, i, currentArgument, inheritedNonNullNess);
+							else
+								recordArgNonNullness18(currentMethod, i, currentArgument, inheritedNonNullNess, this.environment);
 						}
 						continue; // compatible by construction, skip complain phase below
 					}
 				}
 				if (hasNonNullDefault) { // conflict with inheritance already checked
 					currentNonNullNess = Boolean.TRUE;
-					recordArgNonNullness(currentMethod, length, i, currentArgument, Boolean.TRUE);
+					if (!useTypeAnnotations)
+						recordArgNonNullness(currentMethod, length, i, currentArgument, Boolean.TRUE);
+					else
+						recordArgNonNullness18(currentMethod, i, currentArgument, Boolean.TRUE, this.environment);
 				}
 			}
 			if (shouldComplain) {
 				char[][] annotationName;
 				if (inheritedNonNullNess == Boolean.TRUE) {
-					annotationName = environment.getNonNullAnnotationName();
+					annotationName = this.environment.getNonNullAnnotationName();
 				} else {
-					annotationName = environment.getNullableAnnotationName();
+					annotationName = this.environment.getNullableAnnotationName();
 				}
 				if (inheritedNonNullNess != Boolean.TRUE		// super parameter is not restricted to @NonNull
 						&& currentNonNullNess == Boolean.TRUE)	// current parameter is restricted to @NonNull 
@@ -313,10 +356,11 @@
 						scope.problemReporter().illegalRedefinitionToNonNullParameter(
 								currentArgument,
 								inheritedMethod.declaringClass,
-								(inheritedNonNullNess == null) ? null : environment.getNullableAnnotationName());
+								(inheritedNonNullNess == null) ? null : this.environment.getNullableAnnotationName());
 					} else {
-						scope.problemReporter().cannotImplementIncompatibleNullness(currentMethod, inheritedMethod);
+						scope.problemReporter().cannotImplementIncompatibleNullness(currentMethod, inheritedMethod, false);
 					}
+					continue;
 				} else if (currentNonNullNess == null) 
 				{
 					// unannotated strictly conflicts only with inherited @Nullable
@@ -327,20 +371,60 @@
 									inheritedMethod.declaringClass,
 									annotationName);
 						} else {
-							scope.problemReporter().cannotImplementIncompatibleNullness(currentMethod, inheritedMethod);
+							scope.problemReporter().cannotImplementIncompatibleNullness(currentMethod, inheritedMethod, false);
 						}
+						continue;
 					} else if (inheritedNonNullNess == Boolean.TRUE) {
 						// not strictly a conflict, but a configurable warning is given anyway:
 						scope.problemReporter().parameterLackingNonnullAnnotation(
 								currentArgument,
 								inheritedMethod.declaringClass,
 								annotationName);
+						continue;
+					}
+				} 
+				if (useTypeAnnotations) {
+					if (NullAnnotationMatching.analyse(currentMethod.parameters[i], inheritedMethod.parameters[i], 0, true).isAnyMismatch()) {
+						scope.problemReporter().cannotImplementIncompatibleNullness(currentMethod, inheritedMethod, false);
 					}
 				}
 			}
 		}
 	}
 
+	void applyReturnNullBits(MethodBinding method, long nullnessBits) {
+		if (this.environment.globalOptions.sourceLevel < ClassFileConstants.JDK1_8) {
+			method.tagBits |= nullnessBits;
+		} else {
+			if (!method.returnType.isBaseType()) {
+				method.returnType = this.environment.createAnnotatedType(method.returnType, this.environment.nullAnnotationsFromTagBits(nullnessBits));
+			}
+		}
+	}
+
+	private Boolean getParameterNonNullness(MethodBinding method, int i, boolean useTypeAnnotations) {
+		if (useTypeAnnotations) {
+			TypeBinding parameter = method.parameters[i];
+			if (parameter != null) {
+				long nullBits = NullAnnotationMatching.validNullTagBits(parameter.tagBits);
+				if (nullBits != 0L)
+					return Boolean.valueOf(nullBits == TagBits.AnnotationNonNull);
+			}
+			return null;
+		}
+		return (method.parameterNonNullness == null)
+						? null : method.parameterNonNullness[i];
+	}
+
+	private long getReturnTypeNullnessTagBits(MethodBinding method, boolean useTypeAnnotations) {
+		if (useTypeAnnotations) {
+			if (method.returnType == null)
+				return 0L;
+			return NullAnnotationMatching.validNullTagBits(method.returnType.tagBits);
+		}
+		return method.tagBits & TagBits.AnnotationNullMASK;
+	}
+
 	/* check for conflicting annotations and record here the info 'inheritedNonNullness' found in 'inheritedMethod'. */
 	protected void recordDeferredInheritedNullness(Scope scope, ASTNode location,
 			MethodBinding inheritedMethod, Boolean inheritedNonNullness, 
@@ -368,6 +452,13 @@
 					TagBits.AnnotationNonNull : TagBits.AnnotationNullable;
 		}
 	}
+	void recordArgNonNullness18(MethodBinding method, int paramIdx, Argument currentArgument, Boolean nonNullNess, LookupEnvironment env) {
+		AnnotationBinding annotationBinding = nonNullNess.booleanValue() ? env.getNonNullAnnotation() : env.getNullableAnnotation();
+		method.parameters[paramIdx] = env.createAnnotatedType(method.parameters[paramIdx], new AnnotationBinding[]{ annotationBinding});
+		if (currentArgument != null) {
+			currentArgument.binding.type = method.parameters[paramIdx];
+		}
+	}
 
 	// ==== minimal set of utility methods previously from MethodVerifier15: ====
 	
@@ -416,14 +507,14 @@
 		return true;
 	}
 	static boolean areTypesEqual(TypeBinding one, TypeBinding two) {
-		if (one == two) return true;
+		if (TypeBinding.equalsEquals(one, two)) return true;
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=329584
 		switch(one.kind()) {
 			case Binding.TYPE:
 				switch (two.kind()) {
 					case Binding.PARAMETERIZED_TYPE:
 					case Binding.RAW_TYPE:
-						if (one == two.erasure())
+						if (TypeBinding.equalsEquals(one, two.erasure()))
 							return true;
 				}
 				break;
@@ -431,7 +522,7 @@
 			case Binding.PARAMETERIZED_TYPE:
 				switch(two.kind()) {
 					case Binding.TYPE:
-						if (one.erasure() == two)
+						if (TypeBinding.equalsEquals(one.erasure(), two))
 							return true;
 				}
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext.java
index 5961bcd..f8dce65 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext.java
@@ -61,7 +61,7 @@
     		length = constraintSubstitutes.length;
 	        for (int i = 0; i < length; i++) {
 	        	TypeBinding substitute = constraintSubstitutes[i];
-	            if (substitute == actualType) return; // already there
+	            if (substitute == actualType) return; // already there //$IDENTITY-COMPARISON$
 	            if (substitute == null) {
 	                constraintSubstitutes[i] = actualType;
 	                break insertLoop;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java
new file mode 100644
index 0000000..71ef290
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java
@@ -0,0 +1,1681 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FunctionalExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Invocation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MessageSend;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
+import org.aspectj.org.eclipse.jdt.internal.compiler.util.Sorting;
+
+/**
+ * Main class for new type inference as per JLS8 sect 18.
+ * Keeps contextual state and drives the algorithm.
+ * 
+ * <h2>Inference Basics</h2>
+ * <ul>
+ * <li>18.1.1 Inference variables: {@link InferenceVariable}</li>
+ * <li>18.1.2 Constraint Formulas: subclasses of {@link ConstraintFormula}</li>
+ * <li>18.1.3 Bounds: {@link TypeBound}<br/>
+ * 	Capture bounds are directly captured in {@link BoundSet#captures}, throws-bounds in {@link BoundSet#inThrows}.<br/>
+ * 	Also: {@link BoundSet}: main state during inference.</li>
+ * </ul>
+ * Each instance of {@link InferenceContext18} manages instances of the above and coordinates the inference process.
+ * <h3>Queries and utilities</h3>
+ * <ul>
+ * <li>{@link TypeBinding#isProperType(boolean)}:
+ * 	 used to exclude "types" that mention inference variables (18.1.1).</li>
+ * <li>{@link TypeBinding#mentionsAny(TypeBinding[], int)}:
+ * 	 does the receiver type binding mention any of the given types?</li>
+ * <li>{@link TypeBinding#substituteInferenceVariable(InferenceVariable, TypeBinding)}:
+ * 	 replace occurrences of an inference variable with a proper type.</li>
+ * <li>{@link TypeBinding#collectInferenceVariables(Set)}:
+ * 	 collect all inference variables mentioned in the receiver type into the given set.</li>
+ * <li>{@link TypeVariableBinding#getTypeBounds(InferenceVariable, InferenceContext18)}:
+ * 	Compute the initial type bounds for one inference variable as per JLS8 sect 18.1.3.</li>
+ * </ul>
+ * <h2>Phases of Inference</h2>
+ * <ul>
+ * <li>18.2 <b>Reduction</b>: {@link #reduce()} with most work happening in implementations of
+ *  {@link ConstraintFormula#reduce(InferenceContext18)}:
+ *  <ul>
+ *  <li>18.2.1 Expression Compatibility Constraints: {@link ConstraintExpressionFormula#reduce(InferenceContext18)}.</li>
+ *  <li>18.2.2 Type Compatibility Constraints ff. {@link ConstraintTypeFormula#reduce(InferenceContext18)}.</li>
+ *  </ul></li>
+ * <li>18.3 <b>Incorporation</b>: {@link BoundSet#incorporate(InferenceContext18)}; during inference new constraints
+ * 	are accepted via {@link BoundSet#reduceOneConstraint(InferenceContext18, ConstraintFormula)} (combining 18.2 & 18.3)</li>
+ * <li>18.4 <b>Resolution</b>: {@link #resolve(InferenceVariable[])}.
+ * </ul>
+ * Some of the above operations accumulate their results into {@link #currentBounds}, whereas
+ * the last phase <em>returns</em> the resulting bound set while keeping the previous state in {@link #currentBounds}.
+ * <h2>18.5. Uses of Inference</h2>
+ * These are the main entries from the compiler into the inference engine:
+ * <dl>
+ * <dt>18.5.1 Invocation Applicability Inference</dt>
+ * <dd>{@link #inferInvocationApplicability(MethodBinding, TypeBinding[], boolean)}. Prepare the initial state for
+ * 	inference of a generic invocation - no target type used at this point.
+ *  Need to call {@link #solve()} afterwards to produce the intermediate result.<br/>
+ *  Called indirectly from {@link Scope#findMethod(ReferenceBinding, char[], TypeBinding[], InvocationSite, boolean)} et al
+ *  to select applicable methods into overload resolution.</dd>
+ * <dt>18.5.2 Invocation Type Inference</dt>
+ * <dd>{@link InferenceContext18#inferInvocationType(BoundSet, TypeBinding, InvocationSite, MethodBinding)}. After a
+ * 	most specific method has been picked, and given a target type determine the final generic instantiation.
+ *  As long as a target type is still unavailable this phase keeps getting deferred.</br>
+ *  Different wrappers exist for the convenience of different callers.</dd>
+ * <dt>18.5.3 Functional Interface Parameterization Inference</dt>
+ * <dd>Controlled from {@link LambdaExpression#resolveType(BlockScope)}.</dd>
+ * <dt>18.5.4 More Specific Method Inference</dt>
+ * <dd><em>Not Yet Implemented</em></dd>
+ * </dl>
+ * For 18.5.1 and 18.5.2 some high-level control is implemented in
+ *  {@link ParameterizedGenericMethodBinding#computeCompatibleMethod(MethodBinding, TypeBinding[], Scope, InvocationSite, int)}.
+ * <h2>Inference Lifecycle</h2>
+ * The separation into 18.5.1 and 18.5.2 causes some complexity:
+ * <ul>
+ * <li>Calling both parts of inference is directly interwoven with overload resolution. See 
+ * {@link ParameterizedGenericMethodBinding#computeCompatibleMethod(MethodBinding, TypeBinding[], Scope, InvocationSite, int)
+ * 		PGMB#computeCompatibleMethod()} for the basic <b>protocol</b>.</li>
+ * <li>Intermediate <b>state</b> regarding inference must be stored between both phases. Inference is performed with different
+ *   inputs for each pair of {@link Invocation} x {@link ParameterizedGenericMethodBinding},
+ *    see {@link Invocation#registerInferenceContext(ParameterizedGenericMethodBinding, InferenceContext18) Invocation.registerInferenceContext()} and
+ *    {@link Invocation#getInferenceContext(ParameterizedMethodBinding) getInferenceContext()}.<br/>
+ *    As part of the lifecycle state, each instance of InferenceContext18 remembers the current {@link #inferenceKind}
+ *    and {@link #stepCompleted}.</li>
+ * <li><b>Nested inference/resolving</b>: If an invocation argument is a poly expression itself, final resolving of the argument can only happened
+ *    after Invocation Type Inference regarding the outer invocation. Outer inference must produce the <b>target type</b> that drives
+ *    the inner inference / resolving. Two different protocols are applied:
+ *    <ul>
+ *    <li>If the inner poly expression is an invocation, inner inference is directly incorporated into
+ *      the {@link #currentBounds}, see block inside {@link ConstraintExpressionFormula#reduce(InferenceContext18)}.<br/>
+ *      In this case the results of the combined inference need to be applied to all contained inner invocations,
+ *      which happens in {@link #rebindInnerPolies(BoundSet, TypeBinding[])}, which must be called whenever
+ *      18.5.2 finishes.</li>
+ *    <li>If the inner poly expression is a functional expression or a conditional expression no inference variables
+ *      exist representing the inner. In this case the final target type is pushed into the inner using
+ *      {@link Expression#checkAgainstFinalTargetType(TypeBinding, Scope)}, which, too, is called from 
+ *      {@link #rebindInnerPolies(BoundSet, TypeBinding[])}.</li>
+ *    <li>For recursively pushing target types into arguments of an invocation
+ *    	method {@link ASTNode#resolvePolyExpressionArguments(Invocation, MethodBinding, TypeBinding[], Scope)} exists,
+ *    	which is called in two situations: (1) for non-generic outer invocations from MessageSend#findMethodBinding() and
+ *    	Statement#findConstructorBinding(); (2) for generic outer invocations from {@link #rebindInnerPolies(BoundSet, TypeBinding[])}.</li>
+ *    <li>In some situations invocation arguments that are poly invocations need to be resolved in the middle of overload resolution
+ *    	to answer {@link Scope#parameterCompatibilityLevel18} (where the outer invocation did not involve any inference).<br/>
+ *    </ul>
+ *    Pushing inference results into an inner invocation happens using {@link Invocation#updateBindings(MethodBinding,TypeBinding)}.</li>
+ * <li>Decision whether or not an invocation is a <b>variable-arity</b> invocation is made by first attempting
+ * 		to solve 18.5.1 in mode {@link #CHECK_LOOSE}. Only if that fails, another attempt is made in mode {@link #CHECK_VARARG}.
+ * 		Which of these two attempts was successful is stored in {@link #inferenceKind}.
+ * 		This field must be consulted whenever arguments of an invocation should be further processed.
+ * 		See also {@link #getParameter(TypeBinding[], int, boolean)} and its clients.</li>
+ * </ul>
+ */
+public class InferenceContext18 {
+
+	/** to conform with javac regarding https://bugs.openjdk.java.net/browse/JDK-8026527 */
+	static final boolean SIMULATE_BUG_JDK_8026527 = true;
+	/**
+	 * Detail flag to control the extent of {@link #SIMULATE_BUG_JDK_8026527}.
+	 * A setting of 'false' implements the advice from http://mail.openjdk.java.net/pipermail/lambda-spec-experts/2013-December/000447.html
+	 * i.e., raw types are not considered as compatible in constraints/bounds derived from invocation arguments,
+	 * but only for constraints derived from type variable bounds.
+	 */
+	static final boolean ARGUMENT_CONSTRAINTS_ARE_SOFT = false;
+
+	// --- Main State of the Inference: ---
+
+	/** the invocation being inferred (for 18.5.1 and 18.5.2) */
+	InvocationSite currentInvocation;
+	/** arguments of #currentInvocation, if any */
+	Expression[] invocationArguments;
+	
+	/** The inference variables for which as solution is sought. */
+	InferenceVariable[] inferenceVariables;
+	/** Number of inference variables. */
+	int variableCount = 0;
+	/** Constraints that have not yet been reduced and incorporated. */
+	ConstraintFormula[] initialConstraints;
+	/** The accumulated type bounds etc. */
+	BoundSet currentBounds;
+
+	/** solution of applicability inference, stored for use as fallback, if invocation type inference fails. */
+	BoundSet storedSolution;
+
+	/** For each candidate target type imposed from the outside store the solution of invocation type inference. */
+	Map<TypeBinding,Solution> solutionsPerTargetType = new HashMap<TypeBinding, Solution>();
+
+	/** One of CHECK_STRICT, CHECK_LOOSE, or CHECK_VARARGS. */
+	int inferenceKind;
+	/** Marks how much work has been done so far? Used to avoid performing any of these tasks more than once. */
+	public int stepCompleted = NOT_INFERRED;
+
+	public static final int NOT_INFERRED = 0;
+	/** Applicability Inference (18.5.1) has been completed. */
+	public static final int APPLICABILITY_INFERRED = 1;
+	/** Invocation Type Inference (18.5.2) has been completed (for some target type). */
+	public static final int TYPE_INFERRED = 2;
+	/** All nested elements have been fully resolved. */
+	public static final int BINDINGS_UPDATED = 3;
+	
+	/** Signals whether any type compatibility makes use of unchecked conversion. */
+	public List<ConstraintFormula> constraintsWithUncheckedConversion;
+
+	// ---
+
+	/** Inner poly invocations which have been included in this inference. */
+	List<InvocationSite> innerPolies = new ArrayList<InvocationSite>();
+	/** Link to an outer inference context, used for bundled error reporting. */
+	public InferenceContext18 outerContext;
+	private ArrayList<MethodBinding> problemMethods;
+
+	Scope scope;
+	LookupEnvironment environment;
+	ReferenceBinding object; // java.lang.Object
+	
+	public static final int CHECK_STRICT = 1;
+	public static final int CHECK_LOOSE = 2;
+	public static final int CHECK_VARARG = 3;
+	
+	static class SuspendedInferenceRecord {
+		InvocationSite site;
+		Expression[] invocationArguments;
+		InferenceVariable[] inferenceVariables;
+		int inferenceKind;
+		SuspendedInferenceRecord(InvocationSite site, Expression[] invocationArguments, InferenceVariable[] inferenceVariables, int inferenceKind) {
+			this.site = site;
+			this.invocationArguments = invocationArguments;
+			this.inferenceVariables = inferenceVariables;
+			this.inferenceKind = inferenceKind;
+		}
+	}
+	
+	/** Record for a candidate solution of Invocation Type Inference for one specific target type. */
+	static class Solution {
+		TypeBinding resolvedType;
+		MethodBinding method;
+		BoundSet bounds;
+		Solution(MethodBinding method, BoundSet bounds) {
+			this.method = method;
+			this.resolvedType = method.isConstructor() ? method.declaringClass : method.returnType;
+			this.bounds = bounds;
+		}
+	}
+
+	/** Construct an inference context for an invocation (method/constructor). */
+	public InferenceContext18(Scope scope, Expression[] arguments, InvocationSite site) {
+		this.scope = scope;
+		this.environment = scope.environment();
+		this.object = scope.getJavaLangObject();
+		this.invocationArguments = arguments;
+		this.currentInvocation = site;
+	}
+
+	public InferenceContext18(Scope scope) {
+		this.scope = scope;
+		this.environment = scope.environment();
+		this.object = scope.getJavaLangObject();
+	}
+
+	/**
+	 * JLS 18.1.3: Create initial bounds from a given set of type parameters declarations.
+	 * @return the set of inference variables created for the given typeParameters
+	 */
+	public InferenceVariable[] createInitialBoundSet(TypeVariableBinding[] typeParameters) {
+		// 
+		if (this.currentBounds == null) {
+			this.currentBounds = new BoundSet();
+		}
+		if (typeParameters != null) {
+			InferenceVariable[] newInferenceVariables = addInitialTypeVariableSubstitutions(typeParameters);
+			this.currentBounds.addBoundsFromTypeParameters(this, typeParameters, newInferenceVariables);
+			return newInferenceVariables;
+		}
+		return Binding.NO_INFERENCE_VARIABLES;
+	}
+
+	/**
+	 * Substitute any type variables mentioned in 'type' by the corresponding inference variable, if one exists. 
+	 */
+	public TypeBinding substitute(TypeBinding type) {
+		InferenceSubstitution inferenceSubstitution = new InferenceSubstitution(this.environment, this.inferenceVariables);
+		return 	inferenceSubstitution.substitute(inferenceSubstitution, type);
+	}
+
+	/** JLS 18.5.1: compute bounds from formal and actual parameters. */
+	public void createInitialConstraintsForParameters(TypeBinding[] parameters, boolean checkVararg, TypeBinding varArgsType, MethodBinding method) {
+		// TODO discriminate strict vs. loose invocations
+		if (this.invocationArguments == null)
+			return;
+		int len = checkVararg ? parameters.length - 1 : Math.min(parameters.length, this.invocationArguments.length);
+		int maxConstraints = checkVararg ? this.invocationArguments.length : len;
+		int numConstraints = 0;
+		if (this.initialConstraints == null) {
+			this.initialConstraints = new ConstraintFormula[maxConstraints];
+		} else {
+			numConstraints = this.initialConstraints.length;
+			maxConstraints += numConstraints;
+			System.arraycopy(this.initialConstraints, 0,
+					this.initialConstraints=new ConstraintFormula[maxConstraints], 0, numConstraints);
+		}
+		for (int i = 0; i < len; i++) {
+			if (this.invocationArguments[i].isPertinentToApplicability(parameters[i], method)) {
+				TypeBinding thetaF = substitute(parameters[i]);
+				this.initialConstraints[numConstraints++] = new ConstraintExpressionFormula(this.invocationArguments[i], thetaF, ReductionResult.COMPATIBLE, ARGUMENT_CONSTRAINTS_ARE_SOFT);
+			}
+		}
+		if (checkVararg && varArgsType instanceof ArrayBinding) {
+			TypeBinding thetaF = substitute(((ArrayBinding) varArgsType).elementsType());
+			for (int i = len; i < this.invocationArguments.length; i++) {
+				if (this.invocationArguments[i].isPertinentToApplicability(varArgsType, method)) {
+					this.initialConstraints[numConstraints++] = new ConstraintExpressionFormula(this.invocationArguments[i], thetaF, ReductionResult.COMPATIBLE, ARGUMENT_CONSTRAINTS_ARE_SOFT);
+				}
+			}
+		}
+		if (numConstraints == 0)
+			this.initialConstraints = ConstraintFormula.NO_CONSTRAINTS;
+		else if (numConstraints < maxConstraints)
+			System.arraycopy(this.initialConstraints, 0, this.initialConstraints = new ConstraintFormula[numConstraints], 0, numConstraints);
+	}
+
+	private InferenceVariable[] addInitialTypeVariableSubstitutions(TypeBinding[] typeVariables) {
+		int len = typeVariables.length;
+		if (len == 0) {
+			if (this.inferenceVariables == null)
+				this.inferenceVariables = Binding.NO_INFERENCE_VARIABLES;
+			return Binding.NO_INFERENCE_VARIABLES;
+		}
+		InferenceVariable[] newVariables = new InferenceVariable[len];
+		for (int i = 0; i < len; i++)
+			newVariables[i] = new InferenceVariable(typeVariables[i], this.variableCount++, this.currentInvocation, this.environment, this.object);
+		if (this.inferenceVariables == null || this.inferenceVariables.length == 0) {
+			this.inferenceVariables = newVariables;
+		} else {
+			// merge into this.inferenceVariables:
+			int prev = this.inferenceVariables.length;
+			System.arraycopy(this.inferenceVariables, 0, this.inferenceVariables = new InferenceVariable[len+prev], 0, prev);
+			System.arraycopy(newVariables, 0, this.inferenceVariables, prev, len);
+		}
+		return newVariables;
+	}
+
+	/** Add new inference variables for the given type variables. */
+	public InferenceVariable[] addTypeVariableSubstitutions(TypeBinding[] typeVariables) {
+		int len2 = typeVariables.length;
+		InferenceVariable[] newVariables = new InferenceVariable[len2];
+		for (int i = 0; i < typeVariables.length; i++) {
+			if (typeVariables[i] instanceof InferenceVariable)
+				newVariables[i] = (InferenceVariable) typeVariables[i]; // prevent double substitution of an already-substituted inferenceVariable
+			else
+				newVariables[i] = new InferenceVariable(typeVariables[i], this.variableCount++, this.currentInvocation, this.environment, this.object);
+		}
+
+		int start = 0;
+		if (this.inferenceVariables != null) {
+			int len1 = this.inferenceVariables.length;
+			System.arraycopy(this.inferenceVariables, 0, this.inferenceVariables = new InferenceVariable[len1+len2], 0, len1);
+			start = len1;
+		} else {
+			this.inferenceVariables = new InferenceVariable[len2];
+		}
+		System.arraycopy(newVariables, 0, this.inferenceVariables, start, len2);
+		return newVariables;
+	}
+
+	/** JLS 18.1.3 Bounds: throws α: the inference variable α appears in a throws clause */
+	public void addThrowsContraints(TypeBinding[] parameters, InferenceVariable[] variables, ReferenceBinding[] thrownExceptions) {
+		for (int i = 0; i < parameters.length; i++) {
+			TypeBinding parameter = parameters[i];
+			for (int j = 0; j < thrownExceptions.length; j++) {
+				if (TypeBinding.equalsEquals(parameter, thrownExceptions[j])) {
+					this.currentBounds.inThrows.add(variables[i]);
+					break;
+				}
+			}
+		}		
+	}
+
+	/** JLS 18.5.1 Invocation Applicability Inference. */
+	public void inferInvocationApplicability(MethodBinding method, TypeBinding[] arguments, boolean isDiamond) {
+		ConstraintExpressionFormula.inferInvocationApplicability(this, method, arguments, isDiamond, this.inferenceKind);
+	}
+
+	/** JLS 18.5.2 Invocation Type Inference 
+	 * <p>Callers are responsible for any post-processing (see {@link #rebindInnerPolies(BoundSet, TypeBinding[])}).</p>
+	 * @param b1 "the bound set produced by reduction in order to demonstrate that m is applicable in 18.5.1"
+	 */
+	public BoundSet inferInvocationType(BoundSet b1, TypeBinding expectedType, InvocationSite invocationSite, MethodBinding method)
+			throws InferenceFailureException 
+	{
+		BoundSet previous = this.currentBounds.copy();
+		this.currentBounds = b1;
+		try {
+			// bullets 1&2: definitions only.
+			if (expectedType != null
+					&& expectedType != TypeBinding.VOID
+					&& invocationSite instanceof Expression
+					&& ((Expression)invocationSite).isPolyExpression(method)) 
+			{
+				// 3. bullet: special treatment for poly expressions
+				if (!ConstraintExpressionFormula.inferPolyInvocationType(this, invocationSite, expectedType, method)) {
+					return null;
+				}
+			}
+			// 4. bullet: assemble C:
+			Set<ConstraintFormula> c = new HashSet<ConstraintFormula>();
+			if (!addConstraintsToC(this.invocationArguments, c, method, this.inferenceKind))
+				return null;
+			// 5. bullet: determine B3 from C
+			while (!c.isEmpty()) {
+				// *
+				Set<ConstraintFormula> bottomSet = findBottomSet(c, allOutputVariables(c));
+				if (bottomSet.isEmpty()) {
+					bottomSet.add(pickFromCycle(c));
+				}
+				// *
+				c.removeAll(bottomSet);
+				// * The union of the input variables of all the selected constraints, α1, ..., αm, ...
+				Set<InferenceVariable> allInputs = new HashSet<InferenceVariable>();
+				Iterator<ConstraintFormula> bottomIt = bottomSet.iterator();
+				while (bottomIt.hasNext()) {
+					allInputs.addAll(bottomIt.next().inputVariables(this));
+				}
+				InferenceVariable[] variablesArray = allInputs.toArray(new InferenceVariable[allInputs.size()]);
+				//   ... is resolved
+				this.currentBounds.incorporate(this);
+				BoundSet solution = resolve(variablesArray);
+				// in rare cases resolving just one set of variables doesn't suffice,
+				// don't bother with finding the necessary superset, just resolve all:
+				if (solution == null)
+					solution = resolve(this.inferenceVariables);
+				// * ~ apply substitutions to all constraints: 
+				bottomIt = bottomSet.iterator();
+				while (bottomIt.hasNext()) {
+					ConstraintFormula constraint = bottomIt.next();
+					if (solution != null)
+						if (!constraint.applySubstitution(solution, variablesArray))
+							return null;
+				// * reduce and incorporate
+					if (!this.currentBounds.reduceOneConstraint(this, constraint))
+						return null;
+				}
+			}
+			// 6. bullet: solve
+			BoundSet solution = solve();
+			if (solution == null || !isResolved(solution)) {
+				this.currentBounds = previous; // don't let bounds from unsuccessful attempt leak into subsequent attempts
+				return null;
+			}
+			// we're done, start reporting:
+			reportUncheckedConversions(solution);
+			return this.currentBounds = solution; // this is final, keep the result:
+		} finally {
+			this.stepCompleted = TYPE_INFERRED;
+		}
+	}
+
+	private boolean addConstraintsToC(Expression[] exprs, Set<ConstraintFormula> c, MethodBinding method, int inferenceKindForMethod) {
+		TypeBinding[] fs;
+		if (exprs != null) {
+			int k = exprs.length;
+			int p = method.parameters.length;
+			if (k < (method.isVarargs() ? p-1 : p))
+				return false; // insufficient arguments for parameters!
+			switch (inferenceKindForMethod) {
+				case CHECK_STRICT:
+				case CHECK_LOOSE:
+					fs = method.parameters;
+					break;
+				case CHECK_VARARG:
+					fs = varArgTypes(method.parameters, k);
+					break;
+				default:
+					throw new IllegalStateException("Unexpected checkKind "+this.inferenceKind); //$NON-NLS-1$
+			}
+			for (int i = 0; i < k; i++) {
+				TypeBinding fsi = fs[Math.min(i, p-1)];
+				TypeBinding substF = substitute(fsi);
+				if (!addConstraintsToC_OneExpr(exprs[i], c, fsi, substF, method))
+					return false;
+	        }
+		}
+		return true;
+	}
+
+	private boolean addConstraintsToC_OneExpr(Expression expri, Set<ConstraintFormula> c, TypeBinding fsi, TypeBinding substF, MethodBinding method) {
+		// For all i (1 ≤ i ≤ k), if ei is not pertinent to applicability, the set contains ⟨ei → θ Fi⟩.
+		if (!expri.isPertinentToApplicability(fsi, method)) {
+			c.add(new ConstraintExpressionFormula(expri, substF, ReductionResult.COMPATIBLE, ARGUMENT_CONSTRAINTS_ARE_SOFT));
+		}
+		if (expri instanceof FunctionalExpression) {
+			c.add(new ConstraintExceptionFormula((FunctionalExpression) expri, substF));
+		} else if (expri instanceof Invocation && expri.isPolyExpression()) {
+			Invocation invocation = (Invocation) expri;
+			MethodBinding innerMethod = invocation.binding(null, false, null);
+			if (innerMethod instanceof ParameterizedGenericMethodBinding) {
+				InferenceContext18 innerCtx = invocation.getInferenceContext((ParameterizedMethodBinding) innerMethod);
+				if (innerCtx != null) { // otherwise innerMethod does not participate in inference
+					return addConstraintsToC(invocation.arguments(), c, innerMethod.genericMethod(), innerCtx.inferenceKind);
+				}
+			}
+		} else if (expri instanceof ConditionalExpression) {
+			ConditionalExpression ce = (ConditionalExpression) expri;
+			return addConstraintsToC_OneExpr(ce.valueIfTrue, c, fsi, substF, method)
+				 && addConstraintsToC_OneExpr(ce.valueIfFalse, c, fsi, substF, method);
+		}
+		return true;
+	}
+
+	/**
+	 * Simplified API to perform Invocation Type Inference (JLS 18.5.2)
+	 * and perform subsequent steps: bound check, rebinding of inner poly expressions,
+	 * and creating of a problem method binding if needed.
+	 * Should only be called if the inference has not yet finished.
+	 * @param invocation invocation being inferred
+	 * @param argumentTypes arguments being passed into the invocation
+	 * @param method current candidate method binding for this invocation
+	 * @return a valid method binding with updated type parameters,
+	 * 	or a problem method binding signaling either inference failure or a bound mismatch.
+	 */
+	/*@NonNull*/ MethodBinding inferInvocationType(Invocation invocation, TypeBinding[] argumentTypes, ParameterizedGenericMethodBinding method) {
+		// TODO optimize: if outerContext exists and is resolved, we probably don't need to infer again.
+		TypeBinding targetType = invocation.invocationTargetType();
+		ParameterizedGenericMethodBinding finalMethod = null;
+		ParameterizedGenericMethodBinding methodToCheck = method;
+		
+		boolean haveProperTargetType = targetType != null && targetType.isProperType(true);
+		if (haveProperTargetType || !invocation.getExpressionContext().definesTargetType()) {
+			MethodBinding original = method.originalMethod;
+			Solution solution = this.solutionsPerTargetType.get(targetType);
+			BoundSet result = solution != null ? solution.bounds : null;
+			if (result == null) {
+				// start over from a previous candidate but discard its type variable instantiations
+				// TODO: should we retain any instantiations of type variables not owned by the method? 
+				try {
+					result = inferInvocationType(this.currentBounds, targetType, invocation, original);
+				} catch (InferenceFailureException e) {
+					// no solution, but do more checks below
+				}
+			}
+			if (result != null) {
+				TypeBinding[] solutions = getSolutions(original.typeVariables(), invocation, result);
+				if (solutions != null) {
+					finalMethod = this.environment.createParameterizedGenericMethod(original, solutions);
+					if (this.scope.compilerOptions().isAnnotationBasedNullAnalysisEnabled)
+						NullAnnotationMatching.checkForContraditions(finalMethod, invocation, this.scope);
+					invocation.registerInferenceContext(finalMethod, this);
+					this.solutionsPerTargetType.put(targetType, new Solution(finalMethod, result));
+				}
+			}
+			if (finalMethod != null)
+				methodToCheck = finalMethod;
+		} else {
+			finalMethod = method;
+		}
+		
+		MethodBinding problemMethod = methodToCheck.boundCheck18(this.scope, argumentTypes);
+		if (problemMethod != null)
+			return problemMethod;
+
+		if (!haveProperTargetType && invocation.getExpressionContext().definesTargetType())
+			return method; // still not ready!
+
+		if (finalMethod != null) {
+			if (rebindInnerPolies(finalMethod, invocation))
+				return finalMethod;
+		}
+		return getReturnProblemMethodIfNeeded(targetType, method);
+	}
+
+	/**
+	 * Simplified API to perform Invocation Type Inference (JLS 18.5.2)
+	 * and perform subsequent steps: bound check, rebinding of inner poly expressions,
+	 * and creating of a problem method binding if needed.
+	 * Should only be called if the inference has not yet finished.
+	 * Version used for inner invocations, where argument types need to be extracted
+	 * from actual invocation arguments.
+	 * @param invocation invocation being inferred
+	 * @param method current candidate method binding for this invocation
+	 * @return a valid method binding with updated type parameters,
+	 * 	or a problem method binding signaling either inference failure or a bound mismatch.
+	 */
+	public /*@NonNull*/ MethodBinding inferInvocationType(Invocation invocation, ParameterizedGenericMethodBinding method) {
+		TypeBinding[] argumentTypes = null;
+		Expression[] arguments = invocation.arguments();
+		if (arguments != null) {
+			argumentTypes = new TypeBinding[arguments.length];
+			for (int i = 0; i < arguments.length; i++)
+				argumentTypes[i] = arguments[i].resolvedType;
+		}
+		return inferInvocationType(invocation, argumentTypes, method);
+	}
+
+	public boolean hasResultFor(TypeBinding targetType) {
+		if (targetType == null)
+			return this.stepCompleted >= TYPE_INFERRED;
+		else
+			return this.solutionsPerTargetType.containsKey(targetType);
+	}
+
+	public boolean registerSolution(TypeBinding targetType, MethodBinding updatedBinding) {
+		Solution solution = this.solutionsPerTargetType.get(targetType);
+		if (solution != null)
+			return false; // no update
+		this.solutionsPerTargetType.put(targetType, new Solution(updatedBinding, null));
+		this.stepCompleted = Math.max(this.stepCompleted, TYPE_INFERRED);
+		return true;
+	}
+
+	/**
+	 * 18.5.3 Functional Interface Parameterization Inference
+	 */
+	public ReferenceBinding inferFunctionalInterfaceParameterization(LambdaExpression lambda, BlockScope blockScope, 
+			ParameterizedTypeBinding targetTypeWithWildCards) 
+	{
+		TypeBinding[] q = createBoundsForFunctionalInterfaceParameterizationInference(targetTypeWithWildCards);
+		if (q == null || q.length != lambda.arguments().length) {
+			// fail  TODO: can this still happen here?
+		} else {
+			if (reduceWithEqualityConstraints(lambda.argumentTypes(), q)) {
+				ReferenceBinding genericType = targetTypeWithWildCards.genericType();
+				TypeBinding[] a = targetTypeWithWildCards.arguments; // a is not-null by construction of parameterizedWithWildcard()
+				TypeBinding[] aprime = getFunctionInterfaceArgumentSolutions(a);
+				// TODO If F<A'1, ..., A'm> is a well-formed type, ...
+				return blockScope.environment().createParameterizedType(genericType, aprime, genericType.enclosingType());
+			}
+		}
+		return targetTypeWithWildCards;
+	}
+
+	/**
+	 * Create initial bound set for 18.5.3 Functional Interface Parameterization Inference
+	 * @param functionalInterface the functional interface F<A1,..Am>
+	 * @return the parameter types Q1..Qk of the function type of the type F<α1, ..., αm>, or null 
+	 */
+	TypeBinding[] createBoundsForFunctionalInterfaceParameterizationInference(ParameterizedTypeBinding functionalInterface) {
+		if (this.currentBounds == null)
+			this.currentBounds = new BoundSet();
+		TypeBinding[] a = functionalInterface.arguments;
+		if (a == null)
+			return null;
+		InferenceVariable[] alpha = addInitialTypeVariableSubstitutions(a);
+
+		for (int i = 0; i < a.length; i++) {
+			TypeBound bound;
+			if (a[i].kind() == Binding.WILDCARD_TYPE) {
+				WildcardBinding wildcard = (WildcardBinding) a[i];
+				switch(wildcard.boundKind) {
+    				case Wildcard.EXTENDS :
+    					bound = new TypeBound(alpha[i], wildcard.allBounds(), ReductionResult.SUBTYPE);
+    					break;
+    				case Wildcard.SUPER :
+    					bound = new TypeBound(alpha[i], wildcard.bound, ReductionResult.SUPERTYPE);
+    					break;
+    				case Wildcard.UNBOUND :
+    					bound = new TypeBound(alpha[i], this.object, ReductionResult.SUBTYPE);
+    					break;
+    				default:
+    					continue; // cannot
+				}
+			} else {
+				bound = new TypeBound(alpha[i], a[i], ReductionResult.SAME);
+			}
+			this.currentBounds.addBound(bound, this.environment);
+		}
+		TypeBinding falpha = substitute(functionalInterface);
+		return falpha.getSingleAbstractMethod(this.scope, true).parameters;
+	}
+
+	public boolean reduceWithEqualityConstraints(TypeBinding[] p, TypeBinding[] q) {
+		if (p != null) {
+			for (int i = 0; i < p.length; i++) {
+				try {
+					if (!this.reduceAndIncorporate(ConstraintTypeFormula.create(p[i], q[i], ReductionResult.SAME)))
+						return false;
+				} catch (InferenceFailureException e) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 18.5.4 More Specific Method Inference
+	 */
+	public boolean isMoreSpecificThan(MethodBinding m1, MethodBinding m2, boolean isVarArgs, boolean isVarArgs2) {
+		// TODO: we don't yet distinguish vararg-with-passthrough from vararg-with-exactly-one-vararg-arg
+		if (isVarArgs != isVarArgs2) {
+			return isVarArgs2;
+		}
+		Expression[] arguments = this.invocationArguments;
+		int numInvocArgs = arguments == null ? 0 : arguments.length;
+		TypeVariableBinding[] p = m2.typeVariables();
+		TypeBinding[] s = m1.parameters;
+		TypeBinding[] t = new TypeBinding[m2.parameters.length];
+		createInitialBoundSet(p);
+		for (int i = 0; i < t.length; i++)
+			t[i] = substitute(m2.parameters[i]);
+
+		try {
+			for (int i = 0; i < numInvocArgs; i++) {
+				TypeBinding si = getParameter(s, i, isVarArgs);
+				TypeBinding ti = getParameter(t, i, isVarArgs);
+				Boolean result = moreSpecificMain(si, ti, this.invocationArguments[i]);
+				if (result == Boolean.FALSE)
+					return false;
+				if (result == null)
+					if (!reduceAndIncorporate(ConstraintTypeFormula.create(si, ti, ReductionResult.SUBTYPE)))
+						return false;
+			}
+			if (t.length == numInvocArgs + 1) {
+				TypeBinding skplus1 = getParameter(s, numInvocArgs, true);
+				TypeBinding tkplus1 = getParameter(t, numInvocArgs, true);
+				if (!reduceAndIncorporate(ConstraintTypeFormula.create(skplus1, tkplus1, ReductionResult.SUBTYPE)))
+					return false;
+			}
+			return solve() != null;
+		} catch (InferenceFailureException e) {
+			return false;
+		}
+	}
+	
+	// FALSE: inference fails
+	// TRUE:  constraints have been incorporated
+	// null:  need the otherwise branch
+	private Boolean moreSpecificMain(TypeBinding si, TypeBinding ti, Expression expri) throws InferenceFailureException {
+		if (si.isProperType(true) && ti.isProperType(true)) {
+			return expri.sIsMoreSpecific(si, ti, this.scope) ? Boolean.TRUE : Boolean.FALSE;
+		}
+		if (si.isFunctionalInterface(this.scope)) {
+			TypeBinding funcI = ti.original();
+			if (funcI.isFunctionalInterface(this.scope)) {
+				// "... none of the following is true:" 
+				if (siSuperI(si, funcI) || siSubI(si, funcI))
+					return null;
+				if (si instanceof IntersectionCastTypeBinding) {
+					TypeBinding[] elements = ((IntersectionCastTypeBinding)si).intersectingTypes;
+					checkSuper: {
+						for (int i = 0; i < elements.length; i++)
+							if (!siSuperI(elements[i], funcI))
+								break checkSuper;
+						return null; // each element of the intersection is a superinterface of I, or a parameterization of a superinterface of I.
+					}
+					for (int i = 0; i < elements.length; i++)
+						if (siSubI(elements[i], funcI))
+							return null; // some element of the intersection is a subinterface of I, or a parameterization of a subinterface of I.	
+				}
+				// all passed, time to do some work:
+				TypeBinding siCapture = si.capture(this.scope, this.captureId++);
+				MethodBinding sam = siCapture.getSingleAbstractMethod(this.scope, false); // no wildcards should be left needing replacement
+				TypeBinding[] u = sam.parameters;
+				TypeBinding r1 = sam.isConstructor() ? sam.declaringClass : sam.returnType;
+				sam = ti.getSingleAbstractMethod(this.scope, true); // TODO
+				TypeBinding[] v = sam.parameters;
+				TypeBinding r2 = sam.isConstructor() ? sam.declaringClass : sam.returnType;
+				return Boolean.valueOf(checkExpression(expri, u, r1, v, r2));
+			}
+		}
+		return null;
+	}
+
+	private boolean checkExpression(Expression expri, TypeBinding[] u, TypeBinding r1, TypeBinding[] v, TypeBinding r2) 
+			throws InferenceFailureException {
+		if (expri instanceof LambdaExpression && !((LambdaExpression)expri).argumentsTypeElided()) {
+			if (r2.id == TypeIds.T_void)
+				return true;
+			LambdaExpression lambda = (LambdaExpression) expri;
+			Expression[] results = lambda.resultExpressions();
+			if (r1.isFunctionalInterface(this.scope) && r2.isFunctionalInterface(this.scope)
+					&& !(r1.isCompatibleWith(r2) || r2.isCompatibleWith(r1))) {
+				// "these rules are applied recursively to R1 and R2, for each result expression in expi."
+				// (what does "applied .. to R1 and R2" mean? Why mention R1/R2 and not U/V?)
+				for (int i = 0; i < results.length; i++) {
+					if (!checkExpression(results[i], u, r1, v, r2))
+						return false;
+				}
+				return true;
+			}
+			checkPrimitive1: if (r1.isPrimitiveType() && !r2.isPrimitiveType()) {
+				// check: each result expression is a standalone expression of a primitive type
+				for (int i = 0; i < results.length; i++) {
+					if (results[i].isPolyExpression() || (results[i].resolvedType != null && !results[i].resolvedType.isPrimitiveType()))
+						break checkPrimitive1;
+				}
+				return true;
+			}
+			checkPrimitive2: if (r2.isPrimitiveType() && !r1.isPrimitiveType()) {
+				for (int i = 0; i < results.length; i++) {
+					// for all expressions (not for any expression not)
+					if (!(
+							(!results[i].isPolyExpression() && (results[i].resolvedType != null && !results[i].resolvedType.isPrimitiveType())) // standalone of a referencetype
+							|| results[i].isPolyExpression()))	// or a poly
+						break checkPrimitive2;
+				}
+				return true;
+			}
+			return reduceAndIncorporate(ConstraintTypeFormula.create(r1, r2, ReductionResult.SUBTYPE));
+		} else if (expri instanceof ReferenceExpression && ((ReferenceExpression)expri).isExactMethodReference()) {
+			for (int i = 0; i < u.length; i++) {
+				ReferenceExpression reference = (ReferenceExpression) expri;
+				if (!reduceAndIncorporate(ConstraintTypeFormula.create(u[i], v[i], ReductionResult.SAME)))
+					return false;
+				if (r2.id == TypeIds.T_void)
+					return true;
+				MethodBinding method = reference.findCompileTimeMethodTargeting(null, this.scope); // TODO directly access exactMethodBinding!
+				TypeBinding returnType = method.isConstructor() ? method.declaringClass : method.returnType;
+				if (r1.isPrimitiveType() && !r2.isPrimitiveType() && returnType.isPrimitiveType()) 
+					return true;
+				if (r2.isPrimitiveType() && !r1.isPrimitiveType() && !returnType.isPrimitiveType())
+					return true;
+			}
+			return reduceAndIncorporate(ConstraintTypeFormula.create(r1, r2, ReductionResult.SUBTYPE));
+		} else if (expri instanceof ConditionalExpression) {
+			ConditionalExpression cond = (ConditionalExpression) expri;
+			return  checkExpression(cond.valueIfTrue, u, r1, v, r2) && checkExpression(cond.valueIfFalse, u, r1, v, r2);
+		} else {
+			return false;
+		}
+	}
+
+	private boolean siSuperI(TypeBinding si, TypeBinding funcI) {
+		if (TypeBinding.equalsEquals(si, funcI) || TypeBinding.equalsEquals(si.original(), funcI))
+			return true;
+		TypeBinding[] superIfcs = funcI.superInterfaces();
+		if (superIfcs == null) return false;
+		for (int i = 0; i < superIfcs.length; i++) {
+			if (siSuperI(si, superIfcs[i]))
+				return true;
+		}
+		return false;
+	}
+
+	private boolean siSubI(TypeBinding si, TypeBinding funcI) {
+		if (TypeBinding.equalsEquals(si, funcI) || TypeBinding.equalsEquals(si.original(), funcI))
+			return true;
+		TypeBinding[] superIfcs = si.superInterfaces();
+		if (superIfcs == null) return false;
+		for (int i = 0; i < superIfcs.length; i++) {
+			if (siSubI(superIfcs[i], funcI))
+				return true;
+		}
+		return false;
+	}
+
+	// ========== Below this point: implementation of the generic algorithm: ==========
+
+	/**
+	 * Try to solve the inference problem defined by constraints and bounds previously registered.
+	 * @return a bound set representing the solution, or null if inference failed
+	 * @throws InferenceFailureException a compile error has been detected during inference
+	 */
+	public /*@Nullable*/ BoundSet solve() throws InferenceFailureException {
+		if (!reduce())
+			return null;
+		if (!this.currentBounds.incorporate(this))
+			return null;
+
+		return resolve(this.inferenceVariables);
+	}
+	
+	public /*@Nullable*/ BoundSet solve(InferenceVariable[] toResolve) throws InferenceFailureException {
+		if (!reduce())
+			return null;
+		if (!this.currentBounds.incorporate(this))
+			return null;
+
+		return resolve(toResolve);
+	}
+
+	/**
+	 * JLS 18.2. reduce all initial constraints 
+	 * @throws InferenceFailureException 
+	 */
+	private boolean reduce() throws InferenceFailureException {
+		if (this.initialConstraints != null) {
+			for (int i = 0; i < this.initialConstraints.length; i++) {
+				if (!this.currentBounds.reduceOneConstraint(this, this.initialConstraints[i]))
+					return false;
+			}
+		}
+		this.initialConstraints = null;
+		return true;
+	}
+
+	/**
+	 * Have all inference variables been instantiated successfully?
+	 */
+	public boolean isResolved(BoundSet boundSet) {
+		if (this.inferenceVariables != null) {
+			for (int i = 0; i < this.inferenceVariables.length; i++) {
+				if (!boundSet.isInstantiated(this.inferenceVariables[i]))
+					return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Retrieve the resolved solutions for all given type variables.
+	 * @param typeParameters
+	 * @param boundSet where instantiations are to be found
+	 * @return array containing the substituted types or <code>null</code> elements for any type variable that could not be substituted.
+	 */
+	public TypeBinding /*@Nullable*/[] getSolutions(TypeVariableBinding[] typeParameters, InvocationSite site, BoundSet boundSet) {
+		int len = typeParameters.length;
+		TypeBinding[] substitutions = new TypeBinding[len];
+		for (int i = 0; i < typeParameters.length; i++) {
+			for (int j = 0; j < this.inferenceVariables.length; j++) {
+				InferenceVariable variable = this.inferenceVariables[j];
+				if (variable.site == site && TypeBinding.equalsEquals(variable.typeParameter, typeParameters[i])) {
+					substitutions[i] = boundSet.getInstantiation(variable, this.environment);
+					break;
+				}
+			}
+			if (substitutions[i] == null)
+				return null;
+		}
+		return substitutions;
+	}
+
+	/** When inference produces a new constraint, reduce it to a suitable type bound and add the latter to the bound set. */
+	public boolean reduceAndIncorporate(ConstraintFormula constraint) throws InferenceFailureException {
+		return this.currentBounds.reduceOneConstraint(this, constraint); // TODO(SH): should we immediately call a diat incorporate, or can we simply wait for the next round?
+	}
+
+	/**
+	 * <b>JLS 18.4</b> Resolution
+	 * @return answer null if some constraint resolved to FALSE, otherwise the boundset representing the solution
+	 * @throws InferenceFailureException 
+	 */
+	private /*@Nullable*/ BoundSet resolve(InferenceVariable[] toResolve) throws InferenceFailureException {
+		this.captureId = 0;
+		// NOTE: 18.5.2 ... 
+		// "(While it was necessary to demonstrate that the inference variables in B1 could be resolved
+		//   in order to establish applicability, the resulting instantiations are not considered part of B1.)
+		// For this reason, resolve works on a temporary bound set, copied before any modification.
+		BoundSet tmpBoundSet = this.currentBounds;
+		if (this.inferenceVariables != null) {
+			// find a minimal set of dependent variables:
+			Set<InferenceVariable> variableSet;
+			while ((variableSet = getSmallestVariableSet(tmpBoundSet, toResolve)) != null) {
+				int oldNumUninstantiated = tmpBoundSet.numUninstantiatedVariables(this.inferenceVariables);
+				final int numVars = variableSet.size();
+				if (numVars > 0) {
+					final InferenceVariable[] variables = variableSet.toArray(new InferenceVariable[numVars]);
+					if (!tmpBoundSet.hasCaptureBound(variableSet)) {
+						// try to instantiate this set of variables in a fresh copy of the bound set:
+						BoundSet prevBoundSet = tmpBoundSet;
+						tmpBoundSet = tmpBoundSet.copy();
+						for (int j = 0; j < variables.length; j++) {
+							InferenceVariable variable = variables[j];
+							// try lower bounds:
+							TypeBinding[] lowerBounds = tmpBoundSet.lowerBounds(variable, true/*onlyProper*/);
+							if (lowerBounds != Binding.NO_TYPES) {
+								TypeBinding lub = this.scope.lowerUpperBound(lowerBounds);
+								if (lub == TypeBinding.VOID || lub == null)
+									return null;
+								tmpBoundSet.addBound(new TypeBound(variable, lub, ReductionResult.SAME), this.environment);
+							} else {
+								TypeBinding[] upperBounds = tmpBoundSet.upperBounds(variable, true/*onlyProper*/);
+								// check exception bounds:
+								if (tmpBoundSet.inThrows.contains(variable) && tmpBoundSet.hasOnlyTrivialExceptionBounds(variable, upperBounds)) {
+									TypeBinding runtimeException = this.scope.getType(TypeConstants.JAVA_LANG_RUNTIMEEXCEPTION, 3);
+									tmpBoundSet.addBound(new TypeBound(variable, runtimeException, ReductionResult.SAME), this.environment);
+								} else {
+									// try upper bounds:
+									TypeBinding glb = this.object;
+									if (upperBounds != Binding.NO_TYPES) {
+										if (upperBounds.length == 1) {
+											glb = upperBounds[0];
+										} else {
+											ReferenceBinding[] glbs = Scope.greaterLowerBound((ReferenceBinding[])upperBounds);
+											if (glbs == null)
+												throw new UnsupportedOperationException("no glb for "+Arrays.asList(upperBounds)); //$NON-NLS-1$
+											else if (glbs.length == 1)
+												glb = glbs[0];
+											else
+												glb = new IntersectionCastTypeBinding(glbs, this.environment);
+										}
+									}
+									tmpBoundSet.addBound(new TypeBound(variable, glb, ReductionResult.SAME), this.environment);
+								}
+							}
+						}
+						if (tmpBoundSet.incorporate(this))
+							continue;
+						tmpBoundSet = prevBoundSet;// clean-up for second attempt
+					}
+					// Otherwise, a second attempt is made...
+					Sorting.sortInferenceVariables(variables); // ensure stability of capture IDs
+					final CaptureBinding18[] zs = new CaptureBinding18[numVars];
+					for (int j = 0; j < numVars; j++)
+						zs[j] = freshCapture(variables[j]);
+					Substitution theta = new Substitution() {
+						public LookupEnvironment environment() { 
+							return InferenceContext18.this.environment;
+						}
+						public boolean isRawSubstitution() {
+							return false;
+						}
+						public TypeBinding substitute(TypeVariableBinding typeVariable) {
+							for (int j = 0; j < numVars; j++)
+								if (variables[j] == typeVariable) //$IDENTITY-COMPARISON$ InferenceVariable does not participate in type annotation encoding
+									return zs[j];
+							return typeVariable;
+						}
+					};
+					for (int j = 0; j < numVars; j++) {
+						InferenceVariable variable = variables[j];
+						CaptureBinding18 zsj = zs[j];
+						// add lower bounds:
+						TypeBinding[] lowerBounds = tmpBoundSet.lowerBounds(variable, true/*onlyProper*/);
+						if (lowerBounds != Binding.NO_TYPES) {
+							lowerBounds = Scope.substitute(theta, lowerBounds);
+							TypeBinding lub = this.scope.lowerUpperBound(lowerBounds);
+							if (lub != TypeBinding.VOID && lub != null)
+								zsj.lowerBound = lub;
+						}
+						// add upper bounds:
+						TypeBinding[] upperBounds = tmpBoundSet.upperBounds(variable, false/*onlyProper*/);
+						if (upperBounds != Binding.NO_TYPES) {
+							for (int k = 0; k < upperBounds.length; k++)
+								upperBounds[k] = Scope.substitute(theta, upperBounds[k]);
+							if (!setUpperBounds(zsj, upperBounds))
+								continue; // at violation of well-formedness skip this candidate and proceed
+						}
+						if (tmpBoundSet == this.currentBounds)
+							tmpBoundSet = tmpBoundSet.copy();
+						Iterator<ParameterizedTypeBinding> captureKeys = tmpBoundSet.captures.keySet().iterator();
+						Set<ParameterizedTypeBinding> toRemove = new HashSet<ParameterizedTypeBinding>();
+						while (captureKeys.hasNext()) {
+							ParameterizedTypeBinding key = captureKeys.next();
+							int len = key.arguments.length;
+							for (int i = 0; i < len; i++) {
+								if (key.arguments[i] == variable) { //$IDENTITY-COMPARISON$
+									toRemove.add(key);
+									break;
+								}
+							}
+						}
+						captureKeys = toRemove.iterator();
+						while (captureKeys.hasNext())
+							tmpBoundSet.captures.remove(captureKeys.next());
+						tmpBoundSet.addBound(new TypeBound(variable, zsj, ReductionResult.SAME), this.environment);
+					}
+					if (tmpBoundSet.incorporate(this)) {
+						if (tmpBoundSet.numUninstantiatedVariables(this.inferenceVariables) == oldNumUninstantiated)
+							return null; // abort because we made no progress
+						continue;
+					}
+					return null;
+				}
+			}
+		}
+		return tmpBoundSet;
+	}
+	
+	int captureId = 0;
+	
+	/** For 18.4: "Let Z1, ..., Zn be fresh type variables" use capture bindings. */
+	private CaptureBinding18 freshCapture(InferenceVariable variable) {
+		int id = this.captureId++;
+		char[] sourceName = CharOperation.concat("Z".toCharArray(), '#', String.valueOf(id).toCharArray(), '-', variable.sourceName); //$NON-NLS-1$
+		int position = this.currentInvocation != null ? this.currentInvocation.sourceStart() : 0;
+		return new CaptureBinding18(this.scope.enclosingSourceType(), sourceName, variable.typeParameter.shortReadableName(),
+						position, id, this.environment);
+	}
+	// === ===
+	
+	private boolean setUpperBounds(CaptureBinding18 typeVariable, TypeBinding[] substitutedUpperBounds) {
+		// 18.4: ... define the upper bound of Zi as glb(L1θ, ..., Lkθ)
+		if (substitutedUpperBounds.length == 1) {
+			typeVariable.setUpperBounds(substitutedUpperBounds, this.object); // shortcut
+		} else {
+			TypeBinding[] glbs = Scope.greaterLowerBound(substitutedUpperBounds, this.scope, this.environment);
+			if (glbs == null)
+				return false;
+			if (typeVariable.lowerBound != null) {
+				for (int i = 0; i < glbs.length; i++) {
+					if (!typeVariable.lowerBound.isCompatibleWith(glbs[i]))
+						return false; // not well-formed
+				}
+			}
+			// for deterministic results sort this array by id:
+			sortTypes(glbs);
+			if (!typeVariable.setUpperBounds(glbs, this.object))
+				return false;
+		}
+		return true;
+	}
+
+	static void sortTypes(TypeBinding[] types) {
+		Arrays.sort(types, new Comparator<TypeBinding>() {
+			public int compare(TypeBinding o1, TypeBinding o2) {
+				int i1 = o1.id, i2 = o2.id; 
+				return (i1<i2 ? -1 : (i1==i2 ? 0 : 1));
+			}
+		});
+	}
+
+	/**
+	 * Find the smallest set of uninstantiated inference variables not depending
+	 * on any uninstantiated variable outside the set.
+	 */
+	private Set<InferenceVariable> getSmallestVariableSet(BoundSet bounds, InferenceVariable[] subSet) {
+		int min = Integer.MAX_VALUE;
+		Set<InferenceVariable> result = null;
+		for (int i = 0; i < subSet.length; i++) {
+			InferenceVariable currentVariable = subSet[i];
+			if (!bounds.isInstantiated(currentVariable)) {
+				Set<InferenceVariable> set = new HashSet<InferenceVariable>();
+				if (!addDependencies(bounds, set, currentVariable, min))
+					continue;
+				int cur = set.size();
+				if (cur == 1)
+					return set; // won't get smaller
+				if (cur < min) {
+					result = set;
+					min = cur;
+				}
+			}
+		}
+		return result;
+	}
+
+	private boolean addDependencies(BoundSet boundSet, Set<InferenceVariable> variableSet, InferenceVariable currentVariable, int min) {
+		if (variableSet.size() >= min)
+			return false; // no improvement
+		if (boundSet.isInstantiated(currentVariable)) return true; // not added
+		if (!variableSet.add(currentVariable)) return true; // already present
+		for (int j = 0; j < this.inferenceVariables.length; j++) {
+			InferenceVariable nextVariable = this.inferenceVariables[j];
+			if (nextVariable == currentVariable) continue; //$IDENTITY-COMPARISON$ Inference variables
+			if (boundSet.dependsOnResolutionOf(currentVariable, nextVariable))
+				if (!addDependencies(boundSet, variableSet, nextVariable, min))
+					return false; // abort traversal: no improvement
+		}
+		return true;
+	}
+
+	private ConstraintFormula pickFromCycle(Set<ConstraintFormula> c) {
+		// Detail from 18.5.2 bullet 6.1
+
+		// Note on performance: this implementation could quite possibly be optimized a lot.
+		// However, we only *very rarely* reach here,
+		// so nobody should really be affected by the performance penalty paid here.
+
+		// Note on spec conformance: the spec seems to require _all_ criteria (i)-(iv) to be fulfilled
+		// with the sole exception of (iii), which should only be used, if _any_ constraints matching (i) & (ii)
+		// also fulfill this condition.
+		// Experiments, however, show that strict application of the above is prone to failing to pick any constraint,
+		// causing non-termination of the algorithm.
+		// Since that is not acceptable, I'm *interpreting* the spec to request a search for a constraint
+		// that "best matches" the given conditions.
+		
+		// collect all constraints participating in a cycle
+		HashMap<ConstraintFormula,Set<ConstraintFormula>> dependencies = new HashMap<ConstraintFormula, Set<ConstraintFormula>>();
+		Set<ConstraintFormula> cycles = new HashSet<ConstraintFormula>();
+		for (ConstraintFormula constraint : c) {
+			Collection<InferenceVariable> infVars = constraint.inputVariables(this);
+			for (ConstraintFormula other : c) {
+				if (other == constraint) continue;
+				if (dependsOn(infVars, other.outputVariables(this))) {
+					// found a dependency, record it:
+					Set<ConstraintFormula> targetSet = dependencies.get(constraint);
+					if (targetSet == null)
+						dependencies.put(constraint, targetSet = new HashSet<ConstraintFormula>());
+					targetSet.add(other);
+					// look for a cycle:
+					Set<ConstraintFormula> nodesInCycle = new HashSet<ConstraintFormula>();
+					if (isReachable(dependencies, other, constraint, new HashSet<ConstraintFormula>(), nodesInCycle)) {
+						// found a cycle, record the involved nodes:
+						cycles.addAll(nodesInCycle);
+					}
+				}
+			}
+		}
+		Set<ConstraintFormula> outside = new HashSet<ConstraintFormula>(c);
+		outside.removeAll(cycles);
+
+		Set<ConstraintFormula> candidatesII = new HashSet<ConstraintFormula>();
+		// (i): participates in a cycle:
+		candidates: for (ConstraintFormula candidate : cycles) {
+			Collection<InferenceVariable> infVars = candidate.inputVariables(this);
+			// (ii) does not depend on any constraints outside the cycle
+			for (ConstraintFormula out : outside) {
+				if (dependsOn(infVars, out.outputVariables(this)))
+					continue candidates;
+			}
+			candidatesII.add(candidate);
+		}
+		if (candidatesII.isEmpty())
+			candidatesII = c; // not spec'ed but needed to avoid returning null below, witness: java.util.stream.Collectors
+		
+		// tentatively: (iii)  has the form ⟨Expression → T⟩
+		Set<ConstraintFormula> candidatesIII = new HashSet<ConstraintFormula>();
+		for (ConstraintFormula candidate : candidatesII) {
+			if (candidate instanceof ConstraintExpressionFormula)
+				candidatesIII.add(candidate);
+		}
+		if (candidatesIII.isEmpty()) {
+			candidatesIII = candidatesII; // no constraint fulfills (iii) -> ignore this condition
+		} else { // candidatesIII contains all relevant constraints ⟨Expression → T⟩
+			// (iv) contains an expression that appears to the left of the expression
+			// 		of every other constraint satisfying the previous three requirements
+			
+			// collect containment info regarding all expressions in candidate constraints:
+			// (a) find minimal enclosing expressions:
+			Map<ConstraintExpressionFormula,ConstraintExpressionFormula> expressionContainedBy = new HashMap<ConstraintExpressionFormula, ConstraintExpressionFormula>();
+			for (ConstraintFormula one : candidatesIII) {
+				ConstraintExpressionFormula oneCEF = (ConstraintExpressionFormula) one;
+				Expression exprOne = oneCEF.left;
+				for (ConstraintFormula two : candidatesIII) {
+					if (one == two) continue;
+					ConstraintExpressionFormula twoCEF = (ConstraintExpressionFormula) two;
+					Expression exprTwo = twoCEF.left;
+					if (doesExpressionContain(exprOne, exprTwo)) {
+						ConstraintExpressionFormula previous = expressionContainedBy.get(two);
+						if (previous == null || doesExpressionContain(previous.left, exprOne)) // only if improving
+							expressionContainedBy.put(twoCEF, oneCEF);
+					}
+				}
+			}
+			// (b) build the tree from the above
+			Map<ConstraintExpressionFormula,Set<ConstraintExpressionFormula>> containmentForest = new HashMap<ConstraintExpressionFormula, Set<ConstraintExpressionFormula>>();
+			for (Map.Entry<ConstraintExpressionFormula, ConstraintExpressionFormula> parentRelation : expressionContainedBy.entrySet()) {
+				ConstraintExpressionFormula parent = parentRelation.getValue();
+				Set<ConstraintExpressionFormula> children = containmentForest.get(parent);
+				if (children == null)
+					containmentForest.put(parent, children = new HashSet<ConstraintExpressionFormula>());
+				children.add(parentRelation.getKey());
+			}
+			
+			// approximate the spec by searching the largest containment tree:
+			int bestRank = -1;
+			ConstraintExpressionFormula candidate = null;
+			for (ConstraintExpressionFormula parent : containmentForest.keySet()) {
+				int rank = rankNode(parent, expressionContainedBy, containmentForest);
+				if (rank > bestRank) {
+					bestRank = rank;
+					candidate = parent;
+				}
+			}
+			if (candidate != null)
+				return candidate;
+		}
+		
+		if (candidatesIII.isEmpty())
+			throw new IllegalStateException("cannot pick constraint from cyclic set"); //$NON-NLS-1$
+		return candidatesIII.iterator().next();
+	}
+
+	/**
+	 * Does the first constraint depend on the other?
+	 * The first constraint is represented by its input variables and the other constraint by its output variables.
+	 */
+	private boolean dependsOn(Collection<InferenceVariable> inputsOfFirst, Collection<InferenceVariable> outputsOfOther) {
+		for (InferenceVariable iv : inputsOfFirst) {
+			for (InferenceVariable otherIV : outputsOfOther)
+				if (this.currentBounds.dependsOnResolutionOf(iv, otherIV))
+					return true;
+		}
+		return false;
+	}
+
+	/** Does 'deps' contain a chain of dependencies leading from 'from' to 'to'? */
+	private boolean isReachable(Map<ConstraintFormula,Set<ConstraintFormula>> deps, ConstraintFormula from, ConstraintFormula to,
+			Set<ConstraintFormula> nodesVisited, Set<ConstraintFormula> nodesInCycle)
+	{
+		if (from == to) {
+			nodesInCycle.add(from);
+			return true;
+		}
+		if (!nodesVisited.add(from))
+			return false;
+		Set<ConstraintFormula> targetSet = deps.get(from);
+		if (targetSet != null) {
+			for (ConstraintFormula tgt : targetSet) {
+				if (isReachable(deps, tgt, to, nodesVisited, nodesInCycle)) {
+					nodesInCycle.add(from);
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/** Does exprOne lexically contain exprTwo? */
+	private boolean doesExpressionContain(Expression exprOne, Expression exprTwo) {
+		if (exprTwo.sourceStart > exprOne.sourceStart) {
+			return exprTwo.sourceEnd <= exprOne.sourceEnd;
+		} else if (exprTwo.sourceStart == exprOne.sourceStart) {
+			return exprTwo.sourceEnd < exprOne.sourceEnd;
+		}
+		return false;
+	}
+
+	/** non-roots answer -1, roots answer the size of the spanned tree */
+	private int rankNode(ConstraintExpressionFormula parent, 
+			Map<ConstraintExpressionFormula,ConstraintExpressionFormula> expressionContainedBy,
+			Map<ConstraintExpressionFormula, Set<ConstraintExpressionFormula>> containmentForest)
+	{
+		if (expressionContainedBy.get(parent) != null)
+			return -1; // not a root
+		Set<ConstraintExpressionFormula> children = containmentForest.get(parent);
+		if (children == null)
+			return 1; // unconnected node or leaf
+		int sum = 1;
+		for (ConstraintExpressionFormula child : children) {
+			int cRank = rankNode(child, expressionContainedBy, containmentForest);
+			if (cRank > 0)
+				sum += cRank;
+		}
+		return sum;
+	}
+
+	private Set<ConstraintFormula> findBottomSet(Set<ConstraintFormula> constraints, Set<InferenceVariable> allOutputVariables) {
+		// 18.5.2 bullet 6.1
+		//  A subset of constraints is selected, satisfying the property
+		// that, for each constraint, no input variable depends on an
+		// output variable of another constraint in C ...
+		Set<ConstraintFormula> result = new HashSet<ConstraintFormula>();
+		Iterator<ConstraintFormula> it = constraints.iterator();
+		constraintLoop: while (it.hasNext()) {
+			ConstraintFormula constraint = it.next();
+			Iterator<InferenceVariable> inputIt = constraint.inputVariables(this).iterator();
+			Iterator<InferenceVariable> outputIt = allOutputVariables.iterator();
+			while (inputIt.hasNext()) {
+				InferenceVariable in = inputIt.next();
+				if (allOutputVariables.contains(in)) // not explicit in the spec, but let's assume any inference variable depends on itself
+					continue constraintLoop;
+				while (outputIt.hasNext()) {
+					if (this.currentBounds.dependsOnResolutionOf(in, outputIt.next()))
+						continue constraintLoop;
+				}
+			}
+			result.add(constraint);
+		}		
+		return result;
+	}
+
+	Set<InferenceVariable> allOutputVariables(Set<ConstraintFormula> constraints) {
+		Set<InferenceVariable> result = new HashSet<InferenceVariable>();
+		Iterator<ConstraintFormula> it = constraints.iterator();
+		while (it.hasNext()) {
+			result.addAll(it.next().outputVariables(this));
+		}
+		return result;
+	}
+
+	private TypeBinding[] varArgTypes(TypeBinding[] parameters, int k) {
+		TypeBinding[] types = new TypeBinding[k];
+		int declaredLength = parameters.length-1;
+		System.arraycopy(parameters, 0, types, 0, declaredLength);
+		TypeBinding last = ((ArrayBinding)parameters[declaredLength]).elementsType();
+		for (int i = declaredLength; i < k; i++)
+			types[i] = last;
+		return types;
+	}
+	
+	public SuspendedInferenceRecord enterPolyInvocation(InvocationSite invocation, Expression[] innerArguments) {
+		SuspendedInferenceRecord record = new SuspendedInferenceRecord(this.currentInvocation, this.invocationArguments, this.inferenceVariables, this.inferenceKind);
+		this.inferenceVariables = null;
+		this.invocationArguments = innerArguments;
+		this.currentInvocation = invocation;
+		
+		// schedule for re-binding the inner after inference success:
+		this.innerPolies.add(invocation);
+		return record;
+	}
+	
+	public SuspendedInferenceRecord enterLambda(LambdaExpression lambda) {
+		SuspendedInferenceRecord record = new SuspendedInferenceRecord(this.currentInvocation, this.invocationArguments, this.inferenceVariables, this.inferenceKind);
+		this.inferenceVariables = null;
+		this.invocationArguments = null;
+		this.currentInvocation = null;
+		return record;
+	}
+
+	public void resumeSuspendedInference(SuspendedInferenceRecord record) {
+		// merge inference variables:
+		if (this.inferenceVariables == null) { // no new ones, assume we aborted prematurely
+			this.inferenceVariables = record.inferenceVariables;
+		} else {
+			int l1 = this.inferenceVariables.length;
+			int l2 = record.inferenceVariables.length;
+			// move to back, add previous to front:
+			System.arraycopy(this.inferenceVariables, 0, this.inferenceVariables=new InferenceVariable[l1+l2], l2, l1);
+			System.arraycopy(record.inferenceVariables, 0, this.inferenceVariables, 0, l2);
+		}
+
+		// replace invocation site & arguments:
+		this.currentInvocation = record.site;
+		this.invocationArguments = record.invocationArguments;
+		this.inferenceKind = record.inferenceKind;
+	}
+
+	public boolean rebindInnerPolies(MethodBinding method, InvocationSite site) {
+		BoundSet bounds = this.currentBounds;
+		TypeBinding targetType = site.invocationTargetType();
+		if (targetType == null || !targetType.isProperType(true)) {
+			if (!site.getExpressionContext().definesTargetType()) {
+				// in this case we may not yet have the solution(?, get or compute it now:
+				Solution solution = this.solutionsPerTargetType.get(targetType);
+				try {
+					if (solution != null && solution.bounds != null)
+						bounds = solution.bounds;
+					else
+						bounds = inferInvocationType(this.currentBounds, null, site, method.shallowOriginal());
+				} catch (InferenceFailureException e) {
+					return false;
+				}
+				if (bounds == null)
+					return false;
+			}
+		} else {
+			Solution solution = this.solutionsPerTargetType.get(targetType);
+			if (solution != null && solution.bounds != null)
+				bounds = solution.bounds;
+		}
+		rebindInnerPolies(bounds, method.parameters);
+		return true;
+	}
+
+	/**
+	 * After inference has finished, iterate all inner poly expressions (Invocations), that
+	 * have been included in the inference. For each of these update some type information
+	 * from the inference result and perhaps trigger follow-up resolving as needed.
+	 * Similar for poly expressions that did not directly participate in the inference
+	 * but are direct arguments of the current invocation (FunctionalExpression, ConditionalExpression).
+	 */
+	public void rebindInnerPolies(BoundSet bounds, TypeBinding[] parameterTypes) {
+		// This updates all remaining poly expressions that are direct arguments of the current invocation:
+		// (handles FunctionalExpression & ConditionalExpression)
+		boolean isVarargs = this.inferenceKind == CHECK_VARARG;
+		acceptPendingPolyArguments(bounds, parameterTypes, isVarargs);
+		// This loops over all poly expressions for which a sub-inference was triggered:
+		// (handles generic invocations)
+		int len = this.innerPolies.size();
+		for (int i = 0; i < len; i++) {
+			Expression inner = (Expression) this.innerPolies.get(i);
+			if (inner instanceof Invocation) {
+				Invocation innerMessage = (Invocation) inner;
+				TypeBinding innerTargetType = inner.expectedType(); // may be set from acceptPendingPolyArguments
+				if (innerTargetType != null && !innerTargetType.isProperType(true))
+					innerTargetType = null;
+				MethodBinding binding = innerMessage.binding(innerTargetType, innerTargetType != null, this.scope);
+				if (binding == null)
+					continue;
+				MethodBinding original = binding.shallowOriginal();
+
+				// apply inference results onto the allocation type of inner diamonds:
+				if (original.isConstructor() && inner.isPolyExpression()) {
+					ReferenceBinding declaringClass = original.declaringClass;
+					TypeBinding[] arguments = getSolutions(declaringClass.typeVariables(), innerMessage, bounds);
+					declaringClass = this.environment.createParameterizedType(declaringClass, arguments, declaringClass.enclosingType());
+					original = ((ParameterizedTypeBinding)declaringClass).createParameterizedMethod(original);
+					inner.checkAgainstFinalTargetType(innerTargetType, this.scope);	
+					if (this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled)
+						NullAnnotationMatching.checkForContraditions(original, innerMessage, this.scope);
+				}
+				
+				// apply results of the combined inference onto the binding of the inner invocation:
+				TypeBinding[] solutions = getSolutions(original.typeVariables(), innerMessage, bounds);
+				if (solutions == null) {
+					if (binding instanceof ParameterizedGenericMethodBinding) {
+						InferenceContext18 innerCtx = innerMessage.getInferenceContext((ParameterizedGenericMethodBinding) binding);
+						if (innerCtx != null && !binding.isValidBinding()) {
+							innerCtx.reportInvalidInvocation(innerMessage, binding);
+						}
+					}
+					continue; // inner inference not requested -> not a problem
+				}
+				ParameterizedGenericMethodBinding innerBinding = this.environment.createParameterizedGenericMethod(original, solutions);
+				
+				if (innerMessage.updateBindings(innerBinding, innerTargetType)) { // only if we are actually improving anything
+					ASTNode.resolvePolyExpressionArguments(innerMessage, innerBinding, this.scope);
+				}
+			}
+		}
+		this.stepCompleted = BINDINGS_UPDATED; // we're done-done
+	}
+
+	private void acceptPendingPolyArguments(BoundSet acceptedResult, TypeBinding[] parameterTypes, boolean isVarArgs) {
+		if (acceptedResult == null || this.invocationArguments == null) return;
+		Substitution substitution = getResultSubstitution(acceptedResult);
+		for (int i = 0; i < this.invocationArguments.length; i++) {
+			TypeBinding targetType = getParameter(parameterTypes, i, isVarArgs);
+			if (!targetType.isProperType(true))
+				targetType = Scope.substitute(substitution, targetType);
+			Expression expression = this.invocationArguments[i];
+			if (expression instanceof Invocation) {
+				Invocation invocation = (Invocation) expression;
+				if (!this.innerPolies.contains(invocation)) {
+					MethodBinding method = invocation.binding(targetType, true, this.scope);
+					if (method instanceof ParameterizedGenericMethodBinding) {
+						ParameterizedGenericMethodBinding previousBinding = (ParameterizedGenericMethodBinding) method;
+						InferenceContext18 innerCtx = invocation.getInferenceContext(previousBinding);
+						if (innerCtx != null) {
+							// we have a non-poly generic invocation, which needs inference but is not connected via innerPolis.
+							// Finish that inner inference now (incl. binding updates):
+							MethodBinding innerBinding = innerCtx.inferInvocationType(invocation, previousBinding);
+							if (!innerBinding.isValidBinding()) {
+								innerCtx.reportInvalidInvocation(invocation, innerBinding);
+							}
+							if (invocation.updateBindings(innerBinding, targetType)) { // only if we are actually improving anything
+								ASTNode.resolvePolyExpressionArguments(invocation, innerBinding, this.scope);
+							}
+						}
+					}
+				} else {
+					expression.setExpectedType(targetType);
+				}
+			} else {
+				expression.checkAgainstFinalTargetType(targetType, this.scope);
+			}
+		}
+	}
+
+	private Substitution getResultSubstitution(final BoundSet result) {
+		return new Substitution() {
+			public LookupEnvironment environment() { 
+				return InferenceContext18.this.environment;
+			}
+			public boolean isRawSubstitution() {
+				return false;
+			}
+			public TypeBinding substitute(TypeVariableBinding typeVariable) {
+				if (typeVariable instanceof InferenceVariable) {
+					return result.getInstantiation((InferenceVariable) typeVariable, InferenceContext18.this.environment);
+				}
+				return typeVariable;
+			}
+		};
+	}
+
+	public boolean isVarArgs() {
+		return this.inferenceKind == CHECK_VARARG;
+	}
+
+	/**
+	 * Retrieve the rank'th parameter, possibly respecting varargs invocation, see 15.12.2.4.
+	 * Returns null if out of bounds and CHECK_VARARG was not requested.
+	 * Precondition: isVarArgs implies method.isVarargs()
+	 */
+	public static TypeBinding getParameter(TypeBinding[] parameters, int rank, boolean isVarArgs) {
+		if (isVarArgs) {
+			if (rank >= parameters.length-1)
+				return ((ArrayBinding)parameters[parameters.length-1]).elementsType();			
+		} else if (rank >= parameters.length) {
+			return null;
+		}
+		return parameters[rank];
+	}
+
+	/**
+	 * Create a problem method signaling failure of invocation type inference,
+	 * unless the given candidate is tolerable to be compatible with buggy javac.
+	 */
+	public MethodBinding getReturnProblemMethodIfNeeded(TypeBinding expectedType, MethodBinding method) {
+		if (InferenceContext18.SIMULATE_BUG_JDK_8026527 && expectedType != null && method.returnType instanceof ReferenceBinding) {
+			if (method.returnType.erasure().isCompatibleWith(expectedType))
+				return method; // don't count as problem.
+		}
+		if (expectedType == null)
+			return method; // assume inference failure concerned another expression
+		ProblemMethodBinding problemMethod = new ProblemMethodBinding(method, method.selector, method.parameters, ProblemReasons.ParameterizedMethodExpectedTypeProblem);
+		problemMethod.returnType = expectedType;
+		problemMethod.inferenceContext = this;
+		return problemMethod;
+	}
+
+	public void reportInvalidInvocation(Invocation invocation, MethodBinding binding) {
+		if (invocation instanceof MessageSend)
+			this.scope.problemReporter().invalidMethod((MessageSend) invocation, binding);
+		else
+			this.scope.problemReporter().invalidConstructor((Statement)invocation, binding);
+	}
+
+	// debugging:
+	public String toString() {
+		StringBuffer buf = new StringBuffer("Inference Context"); //$NON-NLS-1$
+		switch (this.stepCompleted) {
+			case NOT_INFERRED: buf.append(" (initial)");break; //$NON-NLS-1$
+			case APPLICABILITY_INFERRED: buf.append(" (applicability inferred)");break; //$NON-NLS-1$
+			case TYPE_INFERRED: buf.append(" (type inferred)");break; //$NON-NLS-1$
+			case BINDINGS_UPDATED: buf.append(" (bindings updated)");break; //$NON-NLS-1$
+		}
+		switch (this.inferenceKind) {
+			case CHECK_STRICT: buf.append(" (strict)");break; //$NON-NLS-1$
+			case CHECK_LOOSE: buf.append(" (loose)");break; //$NON-NLS-1$
+			case CHECK_VARARG: buf.append(" (vararg)");break; //$NON-NLS-1$
+		}
+		if (this.currentBounds != null && isResolved(this.currentBounds))
+			buf.append(" (resolved)"); //$NON-NLS-1$
+		buf.append('\n');
+		if (this.inferenceVariables != null) {
+			buf.append("Inference Variables:\n"); //$NON-NLS-1$
+			for (int i = 0; i < this.inferenceVariables.length; i++) {
+				buf.append('\t').append(this.inferenceVariables[i].sourceName).append("\t:\t"); //$NON-NLS-1$
+				if (this.currentBounds != null && this.currentBounds.isInstantiated(this.inferenceVariables[i]))
+					buf.append(this.currentBounds.getInstantiation(this.inferenceVariables[i], this.environment).readableName());
+				else
+					buf.append("NOT INSTANTIATED"); //$NON-NLS-1$
+				buf.append('\n');
+			}
+		}
+		if (this.initialConstraints != null) {
+			buf.append("Initial Constraints:\n"); //$NON-NLS-1$
+			for (int i = 0; i < this.initialConstraints.length; i++)
+				if (this.initialConstraints[i] != null)
+					buf.append('\t').append(this.initialConstraints[i].toString()).append('\n');
+		}
+		if (this.currentBounds != null)
+			buf.append(this.currentBounds.toString());
+		return buf.toString();
+	}
+
+	public void addProblemMethod(ProblemMethodBinding problemMethod) {
+		if (this.problemMethods == null)
+			this.problemMethods = new ArrayList<MethodBinding>();
+		this.problemMethods.add(problemMethod);
+	}
+
+	/**
+	 * If 'type' is a parameterized type and one of its arguments is a wildcard answer the casted type, else null.
+	 * A nonnull answer is ensured to also have nonnull arguments.
+	 */
+	public static ParameterizedTypeBinding parameterizedWithWildcard(TypeBinding type) {
+		if (type == null || type.kind() != Binding.PARAMETERIZED_TYPE)
+			return null;
+		ParameterizedTypeBinding parameterizedType = (ParameterizedTypeBinding) type;
+		TypeBinding[] arguments = parameterizedType.arguments;
+		if (arguments != null) {
+			for (int i = 0; i < arguments.length; i++)
+				if (arguments[i].isWildcard())
+					return parameterizedType;
+		}
+		return null;
+	}
+
+	public TypeBinding[] getFunctionInterfaceArgumentSolutions(TypeBinding[] a) {
+		int m = a.length;
+		TypeBinding[] aprime = new TypeBinding[m];
+		for (int i = 0; i < this.inferenceVariables.length; i++) {
+			InferenceVariable alphai = this.inferenceVariables[i];
+			TypeBinding t = this.currentBounds.getInstantiation(alphai, this.environment);
+			if (t != null)
+				aprime[i] = t;
+			else
+				aprime[i] = a[i];
+		}
+		return aprime;
+	}
+
+	/** Record the fact that the given constraint requires unchecked conversion. */
+	public void recordUncheckedConversion(ConstraintTypeFormula constraint) {
+		if (this.constraintsWithUncheckedConversion == null)
+			this.constraintsWithUncheckedConversion = new ArrayList<ConstraintFormula>();
+		this.constraintsWithUncheckedConversion.add(constraint);
+	}
+	
+	void reportUncheckedConversions(BoundSet solution) {
+		if (this.constraintsWithUncheckedConversion != null) {
+			int len = this.constraintsWithUncheckedConversion.size();
+			Substitution substitution = getResultSubstitution(solution);
+			for (int i = 0; i < len; i++) {
+				ConstraintTypeFormula constraint = (ConstraintTypeFormula) this.constraintsWithUncheckedConversion.get(i);
+				TypeBinding expectedType = constraint.right;
+				TypeBinding providedType = constraint.left;
+				if (!expectedType.isProperType(true)) {
+					expectedType = Scope.substitute(substitution, expectedType);
+				}
+				if (!providedType.isProperType(true)) {
+					providedType = Scope.substitute(substitution, providedType);
+				}
+/* FIXME(stephan): enable once we solved:
+                    (a) avoid duplication with traditional reporting
+                    (b) improve location to report against
+				if (this.currentInvocation instanceof Expression)
+					this.scope.problemReporter().unsafeTypeConversion((Expression) this.currentInvocation, providedType, expectedType);
+ */
+			}
+		}
+	}
+	
+	/** For use by 15.12.2.6 Method Invocation Type */
+	public boolean usesUncheckedConversion() {
+		return this.constraintsWithUncheckedConversion != null;
+	}
+
+	// INTERIM: infrastructure for detecting failures caused by specific known incompleteness:
+	public static void missingImplementation(String msg) {
+		throw new UnsupportedOperationException(msg);
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceFailureException.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceFailureException.java
new file mode 100644
index 0000000..8f3a37c
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceFailureException.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2013 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+/**
+ * Thrown when a definite compile error is detected deep within the type inference.
+ */
+public class InferenceFailureException extends Exception {
+
+	private static final long serialVersionUID = 1L;
+
+	// TODO(stephan); add more details so that ProblemReported can eventually manufacture an appropriate message
+	
+	public InferenceFailureException(String message) {
+		super(message);
+	}
+	
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceSubstitution.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceSubstitution.java
new file mode 100644
index 0000000..675275a
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceSubstitution.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+/**
+ * A type variable substitution strategy based on inference variables (JLS8 18.1.1)
+ */
+public class InferenceSubstitution extends Scope.Substitutor implements Substitution {
+
+	private LookupEnvironment environment;
+	private InferenceVariable[] variables;
+
+	public InferenceSubstitution(LookupEnvironment environment, InferenceVariable[] variables) {
+		this.environment = environment;
+		this.variables = variables;
+	}
+	
+	/**
+	 * Override method {@link Scope.Substitutor#substitute(Substitution, TypeBinding)}, 
+	 * to add substitution of types other than type variables.
+	 */
+	public TypeBinding substitute(Substitution substitution, TypeBinding originalType) {
+		for (int i = 0; i < this.variables.length; i++) {
+			InferenceVariable variable = this.variables[i];
+			if (TypeBinding.equalsEquals(variable.typeParameter, originalType)) {
+				variable.nullHints |= originalType.tagBits & TagBits.AnnotationNullMASK;
+				return variable;
+			}
+		}
+
+		return super.substitute(substitution, originalType);
+	}
+
+	public TypeBinding substitute(TypeVariableBinding typeVariable) {
+		ReferenceBinding superclass = typeVariable.superclass;
+		ReferenceBinding[] superInterfaces = typeVariable.superInterfaces;
+		boolean hasSubstituted = false;
+		variableLoop: for (int i = 0; i < this.variables.length; i++) {
+			InferenceVariable variable = this.variables[i];
+			if (TypeBinding.equalsEquals(variable.typeParameter, typeVariable))
+				return variable;
+			if (TypeBinding.equalsEquals(variable.typeParameter, superclass)) {
+				superclass = variable;
+				hasSubstituted = true;
+				continue;
+			}
+			if (superInterfaces != null) {
+				int ifcLen = superInterfaces.length; 
+				for (int j = 0; j < ifcLen; j++) {
+					if (TypeBinding.equalsEquals(variable.typeParameter, superInterfaces[j])) {
+						if (superInterfaces == typeVariable.superInterfaces)
+							System.arraycopy(superInterfaces, 0, superInterfaces = new ReferenceBinding[ifcLen], 0, ifcLen);
+						superInterfaces[j] = variable;
+						hasSubstituted = true;
+						continue variableLoop;
+					}
+				}
+			}
+		}
+		if (hasSubstituted) {
+			typeVariable = new TypeVariableBinding(typeVariable.sourceName, typeVariable.declaringElement, typeVariable.rank, this.environment);
+			typeVariable.superclass = superclass;
+			typeVariable.superInterfaces = superInterfaces;
+			typeVariable.firstBound = superclass != null ? superclass : superInterfaces[0];
+			if (typeVariable.firstBound.hasNullTypeAnnotations())
+				typeVariable.tagBits |= TagBits.HasNullTypeAnnotation;
+		}
+		return typeVariable;
+	}
+
+	public LookupEnvironment environment() {
+		return this.environment;
+	}
+
+	public boolean isRawSubstitution() {
+		// FIXME Auto-generated method stub
+		return false;
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceVariable.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceVariable.java
new file mode 100644
index 0000000..739df0e
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InferenceVariable.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import java.util.Set;
+
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+
+/**
+ * Implementation of 18.1.1 in JLS8
+ */
+public class InferenceVariable extends TypeVariableBinding {
+
+	InvocationSite site;
+	TypeBinding typeParameter;
+	long nullHints;
+	
+	public InferenceVariable(TypeBinding typeParameter, int variableRank, InvocationSite site, LookupEnvironment environment, ReferenceBinding object) {
+		super(CharOperation.concat(typeParameter.shortReadableName(), Integer.toString(variableRank).toCharArray(), '#'), 
+				null/*declaringElement*/, variableRank, environment);
+		this.site = site;
+		this.typeParameter = typeParameter;
+		this.tagBits |= typeParameter.tagBits & TagBits.AnnotationNullMASK;
+		if (typeParameter.isTypeVariable()) {
+			TypeVariableBinding typeVariable = (TypeVariableBinding) typeParameter;
+			if (typeVariable.firstBound != null) {
+				long boundBits = typeVariable.firstBound.tagBits & TagBits.AnnotationNullMASK;
+				if (boundBits == TagBits.AnnotationNonNull)
+					this.tagBits |= boundBits; // @NonNull must be preserved
+				else
+					this.nullHints |= boundBits; // @Nullable is only a hint
+			}
+		}
+		this.superclass = object;
+	}
+
+	public char[] constantPoolName() {
+		throw new UnsupportedOperationException();
+	}
+
+	public PackageBinding getPackage() {
+		throw new UnsupportedOperationException();
+	}
+
+	public boolean isCompatibleWith(TypeBinding right, Scope scope) {
+		// if inference variables are ever checked for compatibility
+		// (like during inner resolve of a ReferenceExpression during inference)
+		// treat it as a wildcard, compatible with any any and every type.
+		return true;
+	}
+
+	public boolean isProperType(boolean admitCapture18) {
+		return false;
+	}
+
+	TypeBinding substituteInferenceVariable(InferenceVariable var, TypeBinding substituteType) {
+		if (this == var) //$IDENTITY-COMPARISON$ InferenceVariable
+			return substituteType;
+		return this;
+	}
+
+	void collectInferenceVariables(Set<InferenceVariable> variables) {
+		variables.add(this);
+	}
+
+	public ReferenceBinding[] superInterfaces() {
+		return Binding.NO_SUPERINTERFACES;
+	}
+
+	public char[] qualifiedSourceName() {
+		throw new UnsupportedOperationException();
+	}
+
+	public char[] sourceName() {
+		return this.sourceName;
+	}
+
+	public char[] readableName() {
+		return this.sourceName;
+	}
+
+	public boolean hasTypeBit(int bit) {
+		throw new UnsupportedOperationException();
+	}
+	
+	public String debugName() {
+		return String.valueOf(this.sourceName);
+	}
+	
+	public String toString() {
+		return debugName();
+	}
+	
+	public int hashCode() {
+		if (this.sourceName != null)
+			return this.sourceName.hashCode();
+		return super.hashCode();
+	}
+	public boolean equals(Object obj) {
+		if (!(obj instanceof InferenceVariable))
+			return false;
+		if (this.sourceName != null)
+			return this.sourceName.equals(((InferenceVariable)obj).sourceName);
+		return super.equals(obj);
+	}
+
+	public TypeBinding erasure() {
+		// lazily initialize field that may be required in super.erasure():
+		if (this.superclass == null)
+			this.superclass = this.environment.getType(TypeConstants.JAVA_LANG_OBJECT);
+		return super.erasure();
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IntersectionCastTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IntersectionCastTypeBinding.java
index 02df6ee..e322717 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IntersectionCastTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/IntersectionCastTypeBinding.java
@@ -1,20 +1,26 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *							Bug 423504 - [1.8] Implement "18.5.3 Functional Interface Parameterization Inference"
+ *							Bug 426676 - [1.8][compiler] Wrong generic method type inferred from lambda expression
+ *							Bug 426542 - [1.8] Most specific method not picked when one method has intersection type as type parameter
+ *							Bug 428019 - [1.8][compiler] Type inference failure with nested generic invocation.
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
+import java.util.Set;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 
 public class IntersectionCastTypeBinding extends ReferenceBinding {
@@ -32,22 +38,27 @@
 		}
 	}
 	
-	public MethodBinding getSingleAbstractMethod(Scope scope) {
-		if (this.singleAbstractMethod != null)
-			return this.singleAbstractMethod;
+	public MethodBinding getSingleAbstractMethod(Scope scope, boolean replaceWildcards) {
+		int index = replaceWildcards ? 0 : 1;
+		if (this.singleAbstractMethod != null) {
+			if (this.singleAbstractMethod[index] != null)
+			return this.singleAbstractMethod[index];
+		} else {
+			this.singleAbstractMethod = new MethodBinding[2];
+		}
 		MethodBinding sam = samProblemBinding;  // guilty unless proven innocent !
 		for (int i = 0; i < this.length; i++) {
-			MethodBinding method = this.intersectingTypes[i].getSingleAbstractMethod(scope);
+			MethodBinding method = this.intersectingTypes[i].getSingleAbstractMethod(scope, replaceWildcards);
 			if (method != null) {
 				if (method.isValidBinding()) {
 					if (sam.isValidBinding())
-						return this.singleAbstractMethod = new ProblemMethodBinding(TypeConstants.ANONYMOUS_METHOD, null, ProblemReasons.IntersectionHasMultipleFunctionalInterfaces);
+						return this.singleAbstractMethod[index] = new ProblemMethodBinding(TypeConstants.ANONYMOUS_METHOD, null, ProblemReasons.IntersectionHasMultipleFunctionalInterfaces);
 					else
 						sam = method;
 				}
 			}
 		}
-		return this.singleAbstractMethod = sam; // I don't see a value in building the notional interface described in 9.8 - it appears just pedantic/normative - perhaps it plays a role in wildcard parameterized types ?
+		return this.singleAbstractMethod[index] = sam; // I don't see a value in building the notional interface described in 9.8 - it appears just pedantic/normative - perhaps it plays a role in wildcard parameterized types ?
 	}
 
 	public boolean hasTypeBit(int bit) { // Stephan ??
@@ -58,6 +69,35 @@
 		return false;
 	}
 
+	public boolean canBeInstantiated() {
+		return false;
+	}
+	
+	public boolean canBeSeenBy(PackageBinding invocationPackage) {
+		for (int i = 0; i < this.length; i++) {
+			if (!this.intersectingTypes[i].canBeSeenBy(invocationPackage))
+				return false;
+		}
+		return true;
+	}
+	
+	public boolean canBeSeenBy(Scope scope) {
+		for (int i = 0; i < this.length; i++) {
+			if (!this.intersectingTypes[i].canBeSeenBy(scope))
+				return false;
+		}
+		return true;
+	}
+	
+	public boolean canBeSeenBy(ReferenceBinding receiverType, ReferenceBinding invocationType) {
+		for (int i = 0; i < this.length; i++) {
+			if (!this.intersectingTypes[i].canBeSeenBy(receiverType, invocationType))
+				return false;
+		}
+		return true;
+	}
+	
+	
 	public char[] constantPoolName() {
 		return this.intersectingTypes[0].constantPoolName();
 	}
@@ -82,15 +122,67 @@
 		}
 		return this.intersectingTypes;
 	}
+	
+	@Override
+	public boolean isBoxedPrimitiveType() {
+		return this.intersectingTypes[0].isBoxedPrimitiveType();
+	}
+	
 	/* Answer true if the receiver type can be assigned to the argument type (right)
 	 */
 	public boolean isCompatibleWith(TypeBinding right, Scope scope) {
+
+		// easy way out?
+		if (TypeBinding.equalsEquals(this, right))
+			return true;
+
+		// need to compare two intersection types?
+		int rightKind = right.kind();
+		TypeBinding[] rightIntersectingTypes = null;
+		if (rightKind == INTERSECTION_TYPE && right.boundKind() == Wildcard.EXTENDS) {
+			TypeBinding allRightBounds = ((WildcardBinding) right).allBounds();
+			if (allRightBounds instanceof IntersectionCastTypeBinding)
+				rightIntersectingTypes = ((IntersectionCastTypeBinding) allRightBounds).intersectingTypes;
+		} else if (rightKind == INTERSECTION_CAST_TYPE) {
+			rightIntersectingTypes = ((IntersectionCastTypeBinding) right).intersectingTypes;
+		}
+		if (rightIntersectingTypes != null) {
+			int numRequired = rightIntersectingTypes.length;
+			TypeBinding[] required = new TypeBinding[numRequired];
+			System.arraycopy(rightIntersectingTypes, 0, required, 0, numRequired);
+			for (int i = 0; i < this.length; i++) {
+				TypeBinding provided = this.intersectingTypes[i];
+				for (int j = 0; j < required.length; j++) {
+					if (required[j] == null) continue;
+					if (provided.isCompatibleWith(required[j], scope)) {
+						required[j] = null;
+						if (--numRequired == 0)
+							return true;
+						break;
+					}
+				}
+			}
+			return false;
+		}
+
+		// normal case:
 		for (int i = 0; i < this.length; i++) {		
 			if (this.intersectingTypes[i].isCompatibleWith(right, scope))
 				return true;
 		}
 		return false;
 	}
+	
+	@Override
+	public boolean isSubtypeOf(TypeBinding other) {
+		if (TypeBinding.equalsEquals(this, other))
+			return true;
+		for (int i = 0; i < this.intersectingTypes.length; i++) {
+			if (this.intersectingTypes[i].isSubtypeOf(other))
+				return true;
+		}
+		return false;
+	}
 
 	public char[] qualifiedSourceName() {
 		StringBuffer qualifiedSourceName = new StringBuffer(16);
@@ -148,4 +240,39 @@
 	public String toString() {
 	    return debugName();
 	}
+
+	public TypeBinding getSAMType(Scope scope) {
+		TypeBinding samType = null;
+		for (int i = 0, max = this.intersectingTypes.length; i < max; i++) {
+			TypeBinding typeBinding = this.intersectingTypes[i];
+			MethodBinding methodBinding = typeBinding.getSingleAbstractMethod(scope, true);
+			// Why doesn't getSingleAbstractMethod do as the javadoc says, and return null
+			// when it is not a SAM type
+			if (methodBinding instanceof ProblemMethodBinding && ((ProblemMethodBinding) methodBinding).problemId()==ProblemReasons.NoSuchSingleAbstractMethod) {
+				continue;
+			}
+			if (samType != null) {
+				return null; // There is more than one (!), so we don't know which
+			}
+			samType = typeBinding;
+		}
+		return samType;
+	}
+
+	@Override
+	void collectInferenceVariables(Set<InferenceVariable> variables) {
+		for (int i = 0; i < this.intersectingTypes.length; i++)
+			this.intersectingTypes[i].collectInferenceVariables(variables);
+	}
+	
+	@Override
+	public boolean mentionsAny(TypeBinding[] parameters, int idx) {
+		if (super.mentionsAny(parameters, idx))
+			return true;
+		for (int i = 0; i < this.intersectingTypes.length; i++) {
+			if (this.intersectingTypes[i].mentionsAny(parameters, -1))
+				return true;
+		}
+		return false;
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.java
index fb3f6cc..287e655 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.java
@@ -5,18 +5,16 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for
  *								bug 384380 - False positive on a « Potential null pointer access » after a continue
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext;
 
 public interface InvocationSite {
 
@@ -32,8 +30,11 @@
 	void setFieldIndex(int depth);
 	int sourceEnd();
 	int sourceStart();
-	TypeBinding expectedType();
+	TypeBinding invocationTargetType();
 	boolean receiverIsImplicitThis();
+	/** When inference for this invocationSite starts, get a fresh inference context, initialized from this site. */
+	InferenceContext18 freshInferenceContext(Scope scope);
+	ExpressionContext getExpressionContext();
 	
 	static class EmptyWithAstNode implements InvocationSite {
 		ASTNode node;
@@ -48,7 +49,9 @@
 		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; }
+		public TypeBinding invocationTargetType() { return null; }
 		public boolean receiverIsImplicitThis() { return false; }
+		public InferenceContext18 freshInferenceContext(Scope scope) { return null; }
+		public ExpressionContext getExpressionContext() { return ExpressionContext.VANILLA_CONTEXT; }
 	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalTypeBinding.java
index 9c4a1b0..370964b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalTypeBinding.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -28,7 +24,6 @@
 	final static char[] LocalTypePrefix = { '$', 'L', 'o', 'c', 'a', 'l', '$' };
 
 	private InnerEmulationDependency[] dependents;
-	public ArrayBinding[] localArrayBindings; // used to cache array bindings of various dimensions for this local type
 	public CaseStatement enclosingCase; // from 1.4 on, local types should not be accessed across switch case blocks (52221)
 	public int sourceStart; // used by computeUniqueKey to uniquely identify this binding
 	public MethodBinding enclosingMethod;
@@ -53,11 +48,20 @@
 	}
 }
 
+public LocalTypeBinding(LocalTypeBinding prototype) {
+	super(prototype);
+	this.dependents = prototype.dependents;
+	this.enclosingCase = prototype.enclosingCase;
+	this.sourceStart = prototype.sourceStart;
+	this.enclosingMethod = prototype.enclosingMethod;
+}
+
 /* Record a dependency onto a source target type which may be altered
 * by the end of the innerclass emulation. Later on, we will revisit
 * all its dependents so as to update them (see updateInnerEmulationDependents()).
 */
 public void addInnerEmulationDependent(BlockScope dependentScope, boolean wasEnclosingInstanceSupplied) {
+	if (!isPrototype()) throw new IllegalStateException();
 	int index;
 	if (this.dependents == null) {
 		index = 0;
@@ -77,6 +81,9 @@
  * Returns the anonymous original super type (in some error cases, superclass may get substituted with Object)
  */
 public ReferenceBinding anonymousOriginalSuperType() {
+	if (!isPrototype())
+		return ((LocalTypeBinding) this.prototype).anonymousOriginalSuperType();
+	
 	if (this.superInterfaces != Binding.NO_SUPERINTERFACES) {
 		return this.superInterfaces[0];
 	}
@@ -93,6 +100,9 @@
 }
 
 protected void checkRedundantNullnessDefaultRecurse(ASTNode location, Annotation[] annotations, long annotationTagBits) {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	long outerDefault = this.enclosingMethod != null ? this.enclosingMethod.tagBits & ((TagBits.AnnotationNonNullByDefault|TagBits.AnnotationNullUnspecifiedByDefault)) : 0;
 	if (outerDefault != 0) {
 		if (outerDefault == annotationTagBits) {
@@ -104,6 +114,9 @@
 }
 
 public char[] computeUniqueKey(boolean isLeaf) {
+	if (!isPrototype())
+		return this.prototype.computeUniqueKey(isLeaf);
+	
 	char[] outerKey = outermostEnclosingType().computeUniqueKey(isLeaf);
 	int semicolon = CharOperation.lastIndexOf(';', outerKey);
 
@@ -130,6 +143,10 @@
 }
 
 public char[] constantPoolName() /* java/lang/Object */ {
+	if (this.constantPoolName != null)
+		return this.constantPoolName;
+	if (!isPrototype())
+		return this.constantPoolName = this.prototype.constantPoolName();
 	if (this.constantPoolName == null && this.scope != null) {
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=322154, we do have some
 		// cases where the left hand does not know what the right is doing.
@@ -138,28 +155,25 @@
 	return this.constantPoolName;	
 }
 
-ArrayBinding createArrayType(int dimensionCount, LookupEnvironment lookupEnvironment) {
-	if (this.localArrayBindings == null) {
-		this.localArrayBindings = new ArrayBinding[] {new ArrayBinding(this, dimensionCount, lookupEnvironment)};
-		return this.localArrayBindings[0];
-	}
-	// find the cached array binding for this dimensionCount (if any)
-	int length = this.localArrayBindings.length;
-	for (int i = 0; i < length; i++)
-		if (this.localArrayBindings[i].dimensions == dimensionCount)
-			return this.localArrayBindings[i];
-
-	// no matching array
-	System.arraycopy(this.localArrayBindings, 0, this.localArrayBindings = new ArrayBinding[length + 1], 0, length);
-	return this.localArrayBindings[length] = new ArrayBinding(this, dimensionCount, lookupEnvironment);
+public TypeBinding clone(TypeBinding outerType) {
+	LocalTypeBinding copy = new LocalTypeBinding(this);
+	copy.enclosingType = (SourceTypeBinding) outerType;
+	return copy;
 }
 
+public int hashCode() {
+	return this.enclosingType.hashCode();
+}
 /*
  * Overriden for code assist. In this case, the constantPoolName() has not been computed yet.
  * Slam the source name so that the signature is syntactically correct.
  * (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=99686)
  */
 public char[] genericTypeSignature() {
+	
+	if (!isPrototype())
+		return this.prototype.genericTypeSignature();
+	
 	if (this.genericReferenceTypeSignature == null && this.constantPoolName == null) {
 		if (isAnonymousType())
 			setConstantPoolName(superclass().sourceName());
@@ -221,10 +235,20 @@
 
 // Record that the type is a local member type
 public void setAsMemberType() {
+	if (!isPrototype()) {
+		this.tagBits |= TagBits.MemberTypeMask;
+		((LocalTypeBinding) this.prototype).setAsMemberType();
+		return;
+	}
 	this.tagBits |= TagBits.MemberTypeMask;
 }
 
 public void setConstantPoolName(char[] computedConstantPoolName) /* java/lang/Object */ {
+	if (!isPrototype()) {
+		this.constantPoolName = computedConstantPoolName;
+		((LocalTypeBinding) this.prototype).setConstantPoolName(computedConstantPoolName);
+		return;
+	}
 	this.constantPoolName = computedConstantPoolName;
 }
 
@@ -234,6 +258,10 @@
  * (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=102284)
  */
 public char[] signature() {
+	
+	if (!isPrototype())
+		return this.prototype.signature();
+	
 	if (this.signature == null && this.constantPoolName == null) {
 		if (isAnonymousType())
 			setConstantPoolName(superclass().sourceName());
@@ -251,6 +279,9 @@
 }
 
 public String toString() {
+	if (this.hasTypeAnnotations())
+		return annotatedDebugName() + " (local)"; //$NON-NLS-1$
+    
 	if (isAnonymousType())
 		return "Anonymous type : " + super.toString(); //$NON-NLS-1$
 	if (isMemberType())
@@ -262,6 +293,7 @@
 * to be propagated to all dependent source types.
 */
 public void updateInnerEmulationDependents() {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.dependents != null) {
 		for (int i = 0; i < this.dependents.length; i++) {
 			InnerEmulationDependency dependency = this.dependents[i];
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.java
index de34a8f..8c7bc28 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - Contributions for
@@ -25,6 +21,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FakedTrackingVariable;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
@@ -61,7 +58,13 @@
 
 		this(declaration.name, type, modifiers, isArgument);
 		this.declaration = declaration;
-		this.tagBits |= TagBits.IsEffectivelyFinal;
+	}
+	
+	// argument
+	public LocalVariableBinding(LocalDeclaration declaration, TypeBinding type, int modifiers, MethodScope declaringScope) {
+
+		this(declaration, type, modifiers, true);
+		this.declaringScope = declaringScope;
 	}
 
 	/* API
@@ -95,6 +98,11 @@
 				if (typeBinding != null) {
 					buffer.append(typeBinding.computeUniqueKey(false/*not a leaf*/));
 				}
+			} else if (referenceContext instanceof LambdaExpression) {
+				MethodBinding methodBinding = ((LambdaExpression) referenceContext).binding;
+				if (methodBinding != null) {
+					buffer.append(methodBinding.computeUniqueKey(false/*not a leaf*/));
+				}
 			}
 
 			// scope index
@@ -155,21 +163,15 @@
 		if (sourceType == null)
 			return Binding.NO_ANNOTATIONS;
 
-		AnnotationBinding[] annotations = sourceType.retrieveAnnotations(this);
 		if ((this.tagBits & TagBits.AnnotationResolved) == 0) {
 			if (((this.tagBits & TagBits.IsArgument) != 0) && this.declaration != null) {
 				Annotation[] annotationNodes = this.declaration.annotations;
 				if (annotationNodes != null) {
-					int length = annotationNodes.length;
-					ASTNode.resolveAnnotations(this.declaringScope, annotationNodes, this);
-					annotations = new AnnotationBinding[length];
-					for (int i = 0; i < length; i++)
-						annotations[i] = new AnnotationBinding(annotationNodes[i]);
-					setAnnotations(annotations, this.declaringScope);
+					ASTNode.resolveAnnotations(this.declaringScope, annotationNodes, this, true);
 				}
 			}
 		}
-		return annotations;
+		return sourceType.retrieveAnnotations(this);
 	}
 
 	private void getScopeKey(BlockScope scope, StringBuffer buffer) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
index 7cb1df7..5756ad0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -17,11 +13,21 @@
  *								bug 365531 - [compiler][null] investigate alternative strategy for internally encoding nullness defaults
  *								bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *								bug 392862 - [1.8][compiler][null] Evaluate null annotations on array types
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415291 - [1.8][null] differentiate type incompatibilities due to null annotations
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 415850 - [1.8] Ensure RunJDTCoreTests can cope with null annotations enabled
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 416183 - [1.8][compiler][null] Overload resolution fails with null annotations
+ *								Bug 416307 - [1.8][compiler][null] subclass with type parameter substitution confuses null checking
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 416190 - [1.8][null] detect incompatible overrides due to null type annotations
+ *								Bug 424624 - [1.8][null] if a static-object with annotation @NonNull is used, a warning is shown
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -32,6 +38,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.TypeAnnotationWalker;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.ITypeRequestor;
@@ -46,6 +53,7 @@
  * Also modified error checking on getType(char[][] compoundName) to allow
  * refering to inner types directly.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class LookupEnvironment implements ProblemReasons, TypeConstants {
 
 	/**
@@ -60,6 +68,8 @@
 	protected int lastUnitIndex = -1;
 	// End AspectJ Extension
 
+	private TypeSystem typeSystem;
+	
 	public INameEnvironment nameEnvironment;
 	public CompilerOptions globalOptions;
 
@@ -72,11 +82,6 @@
 	protected int stepCompleted; // AspectJ Extension - raised visibility
 	public ITypeRequestor typeRequestor;
 
-	private ArrayBinding[][] uniqueArrayBindings;
-	private IntersectionCastTypeBinding[][] uniqueIntersectionCastTypeBindings;
-	private SimpleLookupTable uniqueParameterizedTypeBindings;
-	private SimpleLookupTable uniqueRawTypeBindings;
-	private SimpleLookupTable uniqueWildcardBindings;
 	private SimpleLookupTable uniqueParameterizedGenericMethodBindings;
 	
 	// key is a string with the method selector value is an array of method bindings
@@ -100,6 +105,9 @@
 	PackageBinding nonnullAnnotationPackage;			// the package supposed to contain the NonNull annotation type
 	PackageBinding nonnullByDefaultAnnotationPackage;	// the package supposed to contain the NonNullByDefault annotation type
 
+	AnnotationBinding nonNullAnnotation;
+	AnnotationBinding nullableAnnotation;
+	
 	// AspectJ extension - raised visibility to protected on these four fields
 	protected final static int BUILD_FIELDS_AND_METHODS = 4;
 	protected final static int BUILD_TYPE_HIERARCHY = 1;
@@ -118,18 +126,13 @@
 	this.defaultImports = null;
 	this.nameEnvironment = nameEnvironment;
 	this.knownPackages = new HashtableOfPackage();
-	this.uniqueArrayBindings = new ArrayBinding[5][];
-	this.uniqueArrayBindings[0] = new ArrayBinding[50]; // start off the most common 1 dimension array @ 50
-	this.uniqueIntersectionCastTypeBindings = new IntersectionCastTypeBinding[0][0];
-	this.uniqueParameterizedTypeBindings = new SimpleLookupTable(3);
-	this.uniqueRawTypeBindings = new SimpleLookupTable(3);
-	this.uniqueWildcardBindings = new SimpleLookupTable(3);
 	this.uniqueParameterizedGenericMethodBindings = new SimpleLookupTable(3);
 	this.uniquePolymorphicMethodBindings = new SimpleLookupTable(3);
 	this.missingTypes = null;
 	this.accessRestrictions = new HashMap(3);
 	this.classFilePool = ClassFilePool.newInstance();
 	this.typesBeingConnected = new HashSet();
+	this.typeSystem = this.globalOptions.sourceLevel >= ClassFileConstants.JDK1_8 && this.globalOptions.storeAnnotations ? new AnnotatableTypeSystem(this) : new TypeSystem(this);
 }
 
 /**
@@ -437,6 +440,11 @@
 				case TypeIds.T_JavaLangLong :
 					return TypeBinding.LONG;
 			}
+			break;
+		case Binding.POLY_TYPE:
+			return ((PolyTypeBinding) type).computeBoxingType();
+		case Binding.INTERSECTION_CAST_TYPE:
+			return computeBoxingType(type.getIntersectingTypes()[0]);
 	}
 	return type;
 }
@@ -479,7 +487,7 @@
 			convertedEnclosingType = originalType.isStatic()
 				? (ReferenceBinding) convertToRawType(originalEnclosingType, false /*do not force conversion of enclosing types*/)
 				: convertToParameterizedType(originalEnclosingType);
-			needToConvert |= originalEnclosingType != convertedEnclosingType;
+			needToConvert |= TypeBinding.notEquals(originalEnclosingType, convertedEnclosingType);
 		}
 		if (needToConvert) {
 			return createParameterizedType(originalType, isGeneric ? originalType.typeVariables() : null, convertedEnclosingType);
@@ -540,7 +548,7 @@
 			convertedEnclosing = originalEnclosing;
 		} else if (forceRawEnclosingType && !needToConvert/*stop recursion when conversion occurs*/) {
 			convertedEnclosing = (ReferenceBinding) convertToRawType(originalEnclosing, forceRawEnclosingType);
-			needToConvert = originalEnclosing != convertedEnclosing; // only convert generic or parameterized types
+			needToConvert = TypeBinding.notEquals(originalEnclosing, convertedEnclosing); // only convert generic or parameterized types
 		} else if (needToConvert || ((ReferenceBinding)originalType).isStatic()) {
 			convertedEnclosing = (ReferenceBinding) convertToRawType(originalEnclosing, false);
 		} else {
@@ -548,13 +556,13 @@
 		}
 		if (needToConvert) {
 			convertedType = createRawType((ReferenceBinding) originalType.erasure(), convertedEnclosing);
-		} else if (originalEnclosing != convertedEnclosing) {
+		} else if (TypeBinding.notEquals(originalEnclosing, convertedEnclosing)) {
 			convertedType = createParameterizedType((ReferenceBinding) originalType.erasure(), null, convertedEnclosing);
 		} else {
 			convertedType = originalType;
 		}
 	}
-	if (originalType != convertedType) {
+	if (TypeBinding.notEquals(originalType, convertedType)) {
 		return dimension > 0 ? (TypeBinding)createArrayType(convertedType, dimension) : convertedType;
 	}
 	return type;
@@ -570,7 +578,7 @@
     for (int i = 0, length = originalTypes.length; i < length; i++) {
         ReferenceBinding originalType = originalTypes[i];
         ReferenceBinding convertedType = (ReferenceBinding) convertToRawType(forceErasure ? originalType.erasure() : originalType, forceRawEnclosingType);
-        if (convertedType != originalType) {        
+        if (TypeBinding.notEquals(convertedType, originalType)) {        
             if (convertedTypes == originalTypes) {
                 System.arraycopy(originalTypes, 0, convertedTypes = new ReferenceBinding[length], 0, i);
             }
@@ -624,118 +632,58 @@
 		convertedType = needToConvert ? createRawType((ReferenceBinding)originalType.erasure(), null) : originalType;
 	} else {
 		ReferenceBinding convertedEnclosing = (ReferenceBinding) convertUnresolvedBinaryToRawType(originalEnclosing);
-		if (convertedEnclosing != originalEnclosing) {
+		if (TypeBinding.notEquals(convertedEnclosing, originalEnclosing)) {
 			needToConvert |= !((ReferenceBinding)originalType).isStatic();
 		}
 		if (needToConvert) {
 			convertedType = createRawType((ReferenceBinding) originalType.erasure(), convertedEnclosing);
-		} else if (originalEnclosing != convertedEnclosing) {
+		} else if (TypeBinding.notEquals(originalEnclosing, convertedEnclosing)) {
 			convertedType = createParameterizedType((ReferenceBinding) originalType.erasure(), null, convertedEnclosing);
 		} else {
 			convertedType = originalType;
 		}
 	}
-	if (originalType != convertedType) {
+	if (TypeBinding.notEquals(originalType, convertedType)) {
 		return dimension > 0 ? (TypeBinding)createArrayType(convertedType, dimension) : convertedType;
 	}
 	return type;
 }
-/*
- *  Used to guarantee annotation identity.
- */
+/* Used to guarantee annotation identity: we do that only for marker annotations and others with all default values.
+   We don't have the machinery for the general case as of now.
+*/
 public AnnotationBinding createAnnotation(ReferenceBinding annotationType, ElementValuePair[] pairs) {
 	if (pairs.length != 0) {
 		AnnotationBinding.setMethodBindings(annotationType, pairs);
+		return new AnnotationBinding(annotationType, pairs);
 	}
-	return new AnnotationBinding(annotationType, pairs);
+	return this.typeSystem.getAnnotationType(annotationType, true);
+}
+
+/* Used to guarantee annotation identity: we do that only for marker annotations and others with all default values.
+   We don't have the machinery for the general case as of now.
+*/
+public AnnotationBinding createUnresolvedAnnotation(ReferenceBinding annotationType, ElementValuePair[] pairs) {
+	if (pairs.length != 0) {
+		return new UnresolvedAnnotationBinding(annotationType, pairs, this);
+	}
+	return this.typeSystem.getAnnotationType(annotationType, false);
 }
 
 /*
  *  Used to guarantee array type identity.
  */
 public ArrayBinding createArrayType(TypeBinding leafComponentType, int dimensionCount) {
-	return createArrayType(leafComponentType, dimensionCount, null);
+	return this.typeSystem.getArrayType(leafComponentType, dimensionCount);
 }
-public ArrayBinding createArrayType(TypeBinding leafComponentType, int dimensionCount, long[] nullTagBitsPerDimension) {
-	if (leafComponentType instanceof LocalTypeBinding) // cache local type arrays with the local type itself
-		return ((LocalTypeBinding) leafComponentType).createArrayType(dimensionCount, this);
 
-	// find the array binding cache for this dimension
-	int dimIndex = dimensionCount - 1;
-	int length = this.uniqueArrayBindings.length;
-	ArrayBinding[] arrayBindings;
-	if (dimIndex < length) {
-		if ((arrayBindings = this.uniqueArrayBindings[dimIndex]) == null)
-			this.uniqueArrayBindings[dimIndex] = arrayBindings = new ArrayBinding[10];
-	} else {
-		System.arraycopy(
-			this.uniqueArrayBindings, 0,
-			this.uniqueArrayBindings = new ArrayBinding[dimensionCount][], 0,
-			length);
-		this.uniqueArrayBindings[dimIndex] = arrayBindings = new ArrayBinding[10];
-	}
-
-	// find the cached array binding for this leaf component type (if any)
-	int index = -1;
-	length = arrayBindings.length;
-	while (++index < length) {
-		ArrayBinding currentBinding = arrayBindings[index];
-		if (currentBinding == null) // no matching array, but space left
-			return arrayBindings[index] = new ArrayBinding(leafComponentType, dimensionCount, this, nullTagBitsPerDimension);
-		if (currentBinding.leafComponentType == leafComponentType
-				&& (nullTagBitsPerDimension == null || Arrays.equals(currentBinding.nullTagBitsPerDimension, nullTagBitsPerDimension)))
-			return currentBinding;
-	}
-
-	// no matching array, no space left
-	System.arraycopy(
-		arrayBindings, 0,
-		(arrayBindings = new ArrayBinding[length * 2]), 0,
-		length);
-	this.uniqueArrayBindings[dimIndex] = arrayBindings;
-	return arrayBindings[length] = new ArrayBinding(leafComponentType, dimensionCount, this, nullTagBitsPerDimension);
+public ArrayBinding createArrayType(TypeBinding leafComponentType, int dimensionCount, AnnotationBinding [] annotations) {
+	return this.typeSystem.getArrayType(leafComponentType, dimensionCount, annotations);
 }
+
 public TypeBinding createIntersectionCastType(ReferenceBinding[] intersectingTypes) {
-	
-	// this is perhaps an overkill, but since what is worth doing is worth doing well ...
-	
-	int count = intersectingTypes.length;
-	int length = this.uniqueIntersectionCastTypeBindings.length;
-	IntersectionCastTypeBinding[] intersectionCastTypeBindings;
+	return this.typeSystem.getIntersectionCastType(intersectingTypes);
+}	
 
-	if (count < length) {
-		if ((intersectionCastTypeBindings = this.uniqueIntersectionCastTypeBindings[count]) == null)
-			this.uniqueIntersectionCastTypeBindings[count] = intersectionCastTypeBindings = new IntersectionCastTypeBinding[10];
-	} else {
-		System.arraycopy(
-			this.uniqueIntersectionCastTypeBindings, 0,
-			this.uniqueIntersectionCastTypeBindings = new IntersectionCastTypeBinding[count + 1][], 0,
-			length);
-		this.uniqueIntersectionCastTypeBindings[count] = intersectionCastTypeBindings = new IntersectionCastTypeBinding[10];
-	}
-
-	int index = -1;
-	length = intersectionCastTypeBindings.length;
-	next:while (++index < length) {
-		IntersectionCastTypeBinding priorBinding = intersectionCastTypeBindings[index];
-		if (priorBinding == null) // no matching intersection type, but space left
-			return intersectionCastTypeBindings[index] = new IntersectionCastTypeBinding(intersectingTypes, this);
-		ReferenceBinding [] priorIntersectingTypes = priorBinding.intersectingTypes;
-		for (int i = 0; i < count; i++) {
-			if (intersectingTypes[i] != priorIntersectingTypes[i])
-					continue next;
-		}	
-		return priorBinding;
-	}
-
-	// no matching cached binding & no space left
-	System.arraycopy(
-		intersectionCastTypeBindings, 0,
-		(intersectionCastTypeBindings = new IntersectionCastTypeBinding[length * 2]), 0,
-		length);
-	this.uniqueIntersectionCastTypeBindings[count] = intersectionCastTypeBindings;
-	return intersectionCastTypeBindings[length] = new IntersectionCastTypeBinding(intersectingTypes, this);
-}
 public BinaryTypeBinding createBinaryTypeFrom(IBinaryType binaryType, PackageBinding packageBinding, AccessRestriction accessRestriction) {
 	return createBinaryTypeFrom(binaryType, packageBinding, true, accessRestriction);
 }
@@ -745,22 +693,15 @@
 
 	// resolve any array bindings which reference the unresolvedType
 	ReferenceBinding cachedType = packageBinding.getType0(binaryBinding.compoundName[binaryBinding.compoundName.length - 1]);
-	if (cachedType != null) { // update reference to unresolved binding after having read classfile (knows whether generic for raw conversion)
-		if (cachedType instanceof UnresolvedReferenceBinding) {
-			((UnresolvedReferenceBinding) cachedType).setResolvedType(binaryBinding, this);
-		} else {
-			if (cachedType.isBinaryBinding()) // sanity check... at this point the cache should ONLY contain unresolved types
-				return (BinaryTypeBinding) cachedType;
-			// it is possible with a large number of source files (exceeding AbstractImageBuilder.MAX_AT_ONCE) that a member type can be in the cache as an UnresolvedType,
-			// but because its enclosingType is resolved while its created (call to BinaryTypeBinding constructor), its replaced with a source type
-			return null;
-		}
+	if (cachedType != null && !cachedType.isUnresolvedType()) {
+		if (cachedType.isBinaryBinding()) // sanity check... at this point the cache should ONLY contain unresolved types
+			return (BinaryTypeBinding) cachedType;
+		// it is possible with a large number of source files (exceeding AbstractImageBuilder.MAX_AT_ONCE) that a member type can be in the cache as an UnresolvedType,
+		// but because its enclosingType is resolved while its created (call to BinaryTypeBinding constructor), its replaced with a source type
+		return null;
 	}
 	packageBinding.addType(binaryBinding);
 	setAccessRestriction(binaryBinding, accessRestriction);
-	// need type annotations before processing methods (for @NonNullByDefault)
-	if (this.globalOptions.isAnnotationBasedNullAnalysisEnabled)
-		binaryBinding.scanTypeForNullDefaultAnnotation(binaryType, packageBinding, binaryBinding);
 	binaryBinding.cachePartsFrom(binaryType, needFieldsAndMethods);
 	return binaryBinding;
 }
@@ -843,7 +784,7 @@
 				ParameterizedGenericMethodBinding cachedMethod = cachedInfo[index];
 				if (cachedMethod == null) break nextCachedMethod;
 				if (!cachedMethod.isRaw) continue nextCachedMethod;
-				if (cachedMethod.declaringClass != (rawType == null ? genericMethod.declaringClass : rawType)) continue nextCachedMethod;
+				if (cachedMethod.declaringClass != (rawType == null ? genericMethod.declaringClass : rawType)) continue nextCachedMethod; //$IDENTITY-COMPARISON$
 				return cachedMethod;
 		}
 		needToGrow = true;
@@ -880,7 +821,7 @@
 				int cachedArgLength = cachedArguments == null ? 0 : cachedArguments.length;
 				if (argLength != cachedArgLength) continue nextCachedMethod;
 				for (int j = 0; j < cachedArgLength; j++){
-					if (typeArguments[j] != cachedArguments[j]) continue nextCachedMethod;
+					if (typeArguments[j] != cachedArguments[j]) continue nextCachedMethod; //$IDENTITY-COMPARISON$
 				}
 				// all arguments match, reuse current
 				return cachedMethod;
@@ -947,6 +888,11 @@
 	cachedInfo[index] = polymorphicMethod;
 	return polymorphicMethod;
 }
+
+public boolean usesAnnotatedTypeSystem() {
+	return this.typeSystem.isAnnotatedTypeSystem();
+}
+
 public MethodBinding updatePolymorphicMethodReturnType(PolymorphicMethodBinding binding, TypeBinding typeBinding) {
 	// update the return type to be the given return type, but reuse existing binding if one can match
 	String key = new String(binding.selector);
@@ -999,130 +945,73 @@
 	}
 	return retVal;
 }
-
-public ParameterizedTypeBinding createParameterizedType(ReferenceBinding genericType, TypeBinding[] typeArguments, ReferenceBinding enclosingType) {
-	return createParameterizedType(genericType, typeArguments, 0L, enclosingType);
+public ReferenceBinding createMemberType(ReferenceBinding memberType, ReferenceBinding enclosingType) {
+	return this.typeSystem.getMemberType(memberType, enclosingType);
 }
-/* Note: annotationBits are exactly those tagBits from annotations on type parameters that are interpreted by the compiler, currently: null annotations. */
-public ParameterizedTypeBinding createParameterizedType(ReferenceBinding genericType, TypeBinding[] typeArguments, long annotationBits, ReferenceBinding enclosingType) {
-	// cached info is array of already created parameterized types for this type
-	ParameterizedTypeBinding[] cachedInfo = (ParameterizedTypeBinding[])this.uniqueParameterizedTypeBindings.get(genericType);
-	int argLength = typeArguments == null ? 0: typeArguments.length;
-	boolean needToGrow = false;
-	int index = 0;
-	if (cachedInfo != null){
-		nextCachedType :
-			// iterate existing parameterized for reusing one with same type arguments if any
-			for (int max = cachedInfo.length; index < max; index++){
-			    ParameterizedTypeBinding cachedType = cachedInfo[index];
-			    if (cachedType == null) break nextCachedType;
-			    if (cachedType.actualType() != genericType) continue nextCachedType; // remain of unresolved type
-			    if (cachedType.enclosingType() != enclosingType) continue nextCachedType;
-			    if (annotationBits != 0 && ((cachedType.tagBits & annotationBits) != annotationBits)) continue nextCachedType;
-				TypeBinding[] cachedArguments = cachedType.arguments;
-				int cachedArgLength = cachedArguments == null ? 0 : cachedArguments.length;
-				if (argLength != cachedArgLength) continue nextCachedType; // would be an error situation (from unresolved binaries)
-				for (int j = 0; j < cachedArgLength; j++){
-					if (typeArguments[j] != cachedArguments[j]) continue nextCachedType;
-				}
-				// all arguments match, reuse current
-				return cachedType;
+public ParameterizedTypeBinding createParameterizedType(ReferenceBinding genericType, TypeBinding[] typeArguments, ReferenceBinding enclosingType) {
+	return this.typeSystem.getParameterizedType(genericType, typeArguments, enclosingType);
+}
+
+public ParameterizedTypeBinding createParameterizedType(ReferenceBinding genericType, TypeBinding[] typeArguments, ReferenceBinding enclosingType, AnnotationBinding [] annotations) {
+	return this.typeSystem.getParameterizedType(genericType, typeArguments, enclosingType, annotations);
+}
+
+public TypeBinding createAnnotatedType(TypeBinding type, AnnotationBinding[][] annotations) {
+	return this.typeSystem.getAnnotatedType(type, annotations);
+}
+
+// Variant to handle incoming type possibly carrying annotations.
+public TypeBinding createAnnotatedType(TypeBinding type, AnnotationBinding[] newbies) {
+	final int newLength = newbies == null ? 0 :  newbies.length;
+	if (type == null || newLength == 0)
+		return type;
+	AnnotationBinding [] oldies = type.getTypeAnnotations();
+	final int oldLength = oldies == null ? 0 : oldies.length;
+	if (oldLength > 0) {
+		System.arraycopy(newbies, 0, newbies = new AnnotationBinding[newLength + oldLength], 0, newLength);
+		System.arraycopy(oldies, 0, newbies, newLength, oldLength);
+	}
+	if (this.globalOptions.isAnnotationBasedNullAnalysisEnabled) {
+		// filter duplicate null annotations
+		// (do we want to filter other annotations as well? only if not repeatable?)
+		long tagBitsSeen = 0;
+		AnnotationBinding[] filtered = new AnnotationBinding[newbies.length];
+		int count = 0;
+		for (int i = 0; i < newbies.length; i++) {
+			if (newbies[i] == null) {
+				filtered[count++] = null;
+				continue;
+			}
+			long tagBits = 0;
+			switch (newbies[i].type.id) {
+				case TypeIds.T_ConfiguredAnnotationNonNull  : tagBits = TagBits.AnnotationNonNull; break;
+				case TypeIds.T_ConfiguredAnnotationNullable : tagBits = TagBits.AnnotationNullable; break;
+			}
+			if ((tagBitsSeen & tagBits) == 0) {
+				tagBitsSeen |= tagBits;
+				filtered[count++] = newbies[i];
+			}
 		}
-		needToGrow = true;
-	} else {
-		cachedInfo = new ParameterizedTypeBinding[5];
-		this.uniqueParameterizedTypeBindings.put(genericType, cachedInfo);
+		if (count < newbies.length)
+			System.arraycopy(filtered, 0, newbies = new AnnotationBinding[count], 0, count);
 	}
-	// grow cache ?
-	int length = cachedInfo.length;
-	if (needToGrow && index == length){
-		System.arraycopy(cachedInfo, 0, cachedInfo = new ParameterizedTypeBinding[length*2], 0, length);
-		this.uniqueParameterizedTypeBindings.put(genericType, cachedInfo);
-	}
-	// add new binding
-	ParameterizedTypeBinding parameterizedType = new ParameterizedTypeBinding(genericType,typeArguments, enclosingType, this);
-	parameterizedType.tagBits |= annotationBits;
-	cachedInfo[index] = parameterizedType;
-	return parameterizedType;
+	return this.typeSystem.getAnnotatedType(type, new AnnotationBinding [][] { newbies });
 }
 
 public RawTypeBinding createRawType(ReferenceBinding genericType, ReferenceBinding enclosingType) {
-	// cached info is array of already created raw types for this type
-	RawTypeBinding[] cachedInfo = (RawTypeBinding[])this.uniqueRawTypeBindings.get(genericType);
-	boolean needToGrow = false;
-	int index = 0;
-	if (cachedInfo != null){
-		nextCachedType :
-			// iterate existing parameterized for reusing one with same type arguments if any
-			for (int max = cachedInfo.length; index < max; index++){
-			    RawTypeBinding cachedType = cachedInfo[index];
-			    if (cachedType == null) break nextCachedType;
-			    if (cachedType.actualType() != genericType) continue nextCachedType; // remain of unresolved type
-			    if (cachedType.enclosingType() != enclosingType) continue nextCachedType;
-				// all enclosing type match, reuse current
-				return cachedType;
-		}
-		needToGrow = true;
-	} else {
-		cachedInfo = new RawTypeBinding[1];
-		this.uniqueRawTypeBindings.put(genericType, cachedInfo);
-	}
-	// grow cache ?
-	int length = cachedInfo.length;
-	if (needToGrow && index == length){
-		System.arraycopy(cachedInfo, 0, cachedInfo = new RawTypeBinding[length*2], 0, length);
-		this.uniqueRawTypeBindings.put(genericType, cachedInfo);
-	}
-	// add new binding
-	RawTypeBinding rawType = new RawTypeBinding(genericType, enclosingType, this);
-	cachedInfo[index] = rawType;
-	return rawType;
+	return this.typeSystem.getRawType(genericType, enclosingType);
+}
 
+public RawTypeBinding createRawType(ReferenceBinding genericType, ReferenceBinding enclosingType, AnnotationBinding [] annotations) {
+	return this.typeSystem.getRawType(genericType, enclosingType, annotations);
 }
 
 public WildcardBinding createWildcard(ReferenceBinding genericType, int rank, TypeBinding bound, TypeBinding[] otherBounds, int boundKind) {
-	// cached info is array of already created wildcard  types for this type
-	if (genericType == null) // pseudo wildcard denoting composite bounds for lub computation
-		genericType = ReferenceBinding.LUB_GENERIC;
-	WildcardBinding[] cachedInfo = (WildcardBinding[])this.uniqueWildcardBindings.get(genericType);
-	boolean needToGrow = false;
-	int index = 0;
-	if (cachedInfo != null){
-		nextCachedType :
-			// iterate existing wildcards for reusing one with same information if any
-			for (int max = cachedInfo.length; index < max; index++){
-			    WildcardBinding cachedType = cachedInfo[index];
-			    if (cachedType == null) break nextCachedType;
-			    if (cachedType.genericType != genericType) continue nextCachedType; // remain of unresolved type
-			    if (cachedType.rank != rank) continue nextCachedType;
-			    if (cachedType.boundKind != boundKind) continue nextCachedType;
-			    if (cachedType.bound != bound) continue nextCachedType;
-			    if (cachedType.otherBounds != otherBounds) {
-			    	int cachedLength = cachedType.otherBounds == null ? 0 : cachedType.otherBounds.length;
-			    	int length = otherBounds == null ? 0 : otherBounds.length;
-			    	if (cachedLength != length) continue nextCachedType;
-			    	for (int j = 0; j < length; j++) {
-			    		if (cachedType.otherBounds[j] != otherBounds[j]) continue nextCachedType;
-			    	}
-			    }
-				// all match, reuse current
-				return cachedType;
-		}
-		needToGrow = true;
-	} else {
-		cachedInfo = new WildcardBinding[10];
-		this.uniqueWildcardBindings.put(genericType, cachedInfo);
-	}
-	// grow cache ?
-	int length = cachedInfo.length;
-	if (needToGrow && index == length){
-		System.arraycopy(cachedInfo, 0, cachedInfo = new WildcardBinding[length*2], 0, length);
-		this.uniqueWildcardBindings.put(genericType, cachedInfo);
-	}
-	// add new binding
-	WildcardBinding wildcard = new WildcardBinding(genericType, rank, bound, otherBounds, boundKind, this);
-	cachedInfo[index] = wildcard;
-	return wildcard;
+	return this.typeSystem.getWildcard(genericType, rank, bound, otherBounds, boundKind);
+}
+
+public WildcardBinding createWildcard(ReferenceBinding genericType, int rank, TypeBinding bound, TypeBinding[] otherBounds, int boundKind, AnnotationBinding [] annotations) {
+	return this.typeSystem.getWildcard(genericType, rank, bound, otherBounds, boundKind, annotations);
 }
 
 /**
@@ -1154,10 +1043,32 @@
 	return packageBinding.getType0(compoundName[compoundName.length - 1]);
 }
 
+public AnnotationBinding getNullableAnnotation() {
+	if (this.nullableAnnotation != null)
+		return this.nullableAnnotation;
+	ReferenceBinding nullable = getResolvedType(this.globalOptions.nullableAnnotationName, null);
+	return this.nullableAnnotation = this.typeSystem.getAnnotationType(nullable, true);
+}
+
 public char[][] getNullableAnnotationName() {
 	return this.globalOptions.nullableAnnotationName;
 }
 
+public AnnotationBinding getNonNullAnnotation() {
+	if (this.nonNullAnnotation != null) 
+		return this.nonNullAnnotation;
+	ReferenceBinding nonNull = getResolvedType(this.globalOptions.nonNullAnnotationName, null);
+	return this.nonNullAnnotation = this.typeSystem.getAnnotationType(nonNull, true);
+}
+
+public AnnotationBinding[] nullAnnotationsFromTagBits(long nullTagBits) {
+	if (nullTagBits == TagBits.AnnotationNonNull)
+		return new AnnotationBinding[] { getNonNullAnnotation() };
+	else if (nullTagBits == TagBits.AnnotationNullable)
+		return new AnnotationBinding[] { getNullableAnnotation() };
+	return null;
+}
+
 public char[][] getNonNullAnnotationName() {
 	return this.globalOptions.nonNullAnnotationName;
 }
@@ -1262,11 +1173,14 @@
 	return referenceBinding;
 }
 
-private TypeBinding[] getTypeArgumentsFromSignature(SignatureWrapper wrapper, TypeVariableBinding[] staticVariables, ReferenceBinding enclosingType, ReferenceBinding genericType, char[][][] missingTypeNames) {
+private TypeBinding[] getTypeArgumentsFromSignature(SignatureWrapper wrapper, TypeVariableBinding[] staticVariables, ReferenceBinding enclosingType, ReferenceBinding genericType,
+		char[][][] missingTypeNames, TypeAnnotationWalker walker)
+{
 	java.util.ArrayList args = new java.util.ArrayList(2);
 	int rank = 0;
 	do {
-		args.add(getTypeFromVariantTypeSignature(wrapper, staticVariables, enclosingType, genericType, rank++, missingTypeNames));
+		args.add(getTypeFromVariantTypeSignature(wrapper, staticVariables, enclosingType, genericType, rank, missingTypeNames,
+					walker.toTypeArgument(rank++)));
 	} while (wrapper.signature[wrapper.start] != '>');
 	wrapper.start++; // skip '>'
 	TypeBinding[] typeArguments = new TypeBinding[args.size()];
@@ -1313,7 +1227,7 @@
 *
 * NOTE: Does NOT answer base types nor array types!
 */
-ReferenceBinding getTypeFromConstantPoolName(char[] signature, int start, int end, boolean isParameterized, char[][][] missingTypeNames) {
+ReferenceBinding getTypeFromConstantPoolName(char[] signature, int start, int end, boolean isParameterized, char[][][] missingTypeNames, TypeAnnotationWalker walker) {
 	if (end == -1)
 		end = signature.length;
 	char[][] compoundName = CharOperation.splitOn('/', signature, start, end);
@@ -1326,7 +1240,15 @@
 			}
 		}
 	}
-	return getTypeFromCompoundName(compoundName, isParameterized, wasMissingType);
+	ReferenceBinding binding = getTypeFromCompoundName(compoundName, isParameterized, wasMissingType);
+	if (walker != TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER) {
+		binding = (ReferenceBinding) annotateType(binding, walker, missingTypeNames);
+	}
+	return binding;
+}
+
+ReferenceBinding getTypeFromConstantPoolName(char[] signature, int start, int end, boolean isParameterized, char[][][] missingTypeNames) {
+	return getTypeFromConstantPoolName(signature, start, end, isParameterized, missingTypeNames, TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER);
 }
 
 /* Answer the type corresponding to the signature from the binary file.
@@ -1335,12 +1257,28 @@
 *
 * NOTE: Does answer base types & array types.
 */
-TypeBinding getTypeFromSignature(char[] signature, int start, int end, boolean isParameterized, TypeBinding enclosingType, char[][][] missingTypeNames) {
+TypeBinding getTypeFromSignature(char[] signature, int start, int end, boolean isParameterized, TypeBinding enclosingType, 
+		char[][][] missingTypeNames, TypeAnnotationWalker walker)
+{
 	int dimension = 0;
 	while (signature[start] == '[') {
 		start++;
 		dimension++;
 	}
+	// annotations on dimensions?
+	AnnotationBinding [][] annotationsOnDimensions = null;
+	if (dimension > 0 && walker != TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER) {
+		for (int i = 0; i < dimension; i++) {
+			AnnotationBinding [] annotations = BinaryTypeBinding.createAnnotations(walker.getAnnotationsAtCursor(), this, missingTypeNames);
+			if (annotations != Binding.NO_ANNOTATIONS) { 
+				if (annotationsOnDimensions == null)
+					annotationsOnDimensions = new AnnotationBinding[dimension][];
+					annotationsOnDimensions[i] = annotations;
+			}
+			walker = walker.toNextArrayDimension();
+		}
+	}
+	
 	if (end == -1)
 		end = signature.length - 1;
 
@@ -1382,13 +1320,71 @@
 	} else {
 		binding = getTypeFromConstantPoolName(signature, start + 1, end, isParameterized, missingTypeNames); // skip leading 'L' or 'T'
 	}
-
-	if (dimension == 0)
+	
+	if (isParameterized) {
+		if (dimension != 0)
+			throw new IllegalStateException();
 		return binding;
-	return createArrayType(binding, dimension);
+	}
+	
+	if (walker != TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER) {
+		binding = annotateType(binding, walker, missingTypeNames);
+	}
+	
+	if (dimension != 0)
+		binding =  this.typeSystem.getArrayType(binding, dimension, AnnotatableTypeSystem.flattenedAnnotations(annotationsOnDimensions));
+	
+	return binding;
 }
 
-public TypeBinding getTypeFromTypeSignature(SignatureWrapper wrapper, TypeVariableBinding[] staticVariables, ReferenceBinding enclosingType, char[][][] missingTypeNames) {
+private TypeBinding annotateType(TypeBinding binding, TypeAnnotationWalker walker, char[][][] missingTypeNames) {
+	int depth = binding.depth() + 1;
+	if (depth > 1) {
+		// need to count non-static nesting levels, resolved binding required for precision
+		if (binding.isUnresolvedType())
+			binding = ((UnresolvedReferenceBinding) binding).resolve(this, true);
+		TypeBinding currentBinding = binding;
+		depth = 0;
+		while (currentBinding != null) {
+			depth++;
+			if (currentBinding.isStatic())
+				break;
+			currentBinding = currentBinding.enclosingType();
+		}
+	}
+	AnnotationBinding [][] annotations = null;
+	for (int i = 0; i < depth; i++) {
+		AnnotationBinding[] annots = BinaryTypeBinding.createAnnotations(walker.getAnnotationsAtCursor(), this, missingTypeNames);
+		if (annots != null && annots.length > 0) {
+			if (annotations == null)
+				annotations = new AnnotationBinding[depth][];
+			annotations[i] = annots;
+		}
+		walker = walker.toNextNestedType();
+	}
+	if (annotations != null)
+		binding = createAnnotatedType(binding, annotations);
+	return binding;
+}
+
+boolean qualifiedNameMatchesSignature(char[][] name, char[] signature) {
+	int s = 1; // skip 'L'
+	for (int i = 0; i < name.length; i++) {
+		char[] n = name[i];
+		for (int j = 0; j < n.length; j++)
+			if (n[j] != signature[s++])
+				return false;
+		if (signature[s] == ';' && i == name.length-1)
+			return true;
+		if (signature[s++] != '/')
+			return false;
+	}
+	return false;
+}
+
+public TypeBinding getTypeFromTypeSignature(SignatureWrapper wrapper, TypeVariableBinding[] staticVariables, ReferenceBinding enclosingType, 
+		char[][][] missingTypeNames, TypeAnnotationWalker walker) 
+{
 	// TypeVariableSignature = 'T' Identifier ';'
 	// ArrayTypeSignature = '[' TypeSignature
 	// ClassTypeSignature = 'L' Identifier TypeArgs(optional) ';'
@@ -1399,12 +1395,25 @@
 		wrapper.start++;
 		dimension++;
 	}
+	// annotations on dimensions?
+	AnnotationBinding [][] annotationsOnDimensions = null;
+	if (dimension > 0 && walker != TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER) {
+		for (int i = 0; i < dimension; i++) {
+			AnnotationBinding [] annotations = BinaryTypeBinding.createAnnotations(walker.getAnnotationsAtCursor(), this, missingTypeNames);
+			if (annotations != Binding.NO_ANNOTATIONS) { 
+				if (annotationsOnDimensions == null)
+					annotationsOnDimensions = new AnnotationBinding[dimension][];
+					annotationsOnDimensions[i] = annotations;
+			}
+			walker = walker.toNextArrayDimension();
+		}
+	}
 	if (wrapper.signature[wrapper.start] == 'T') {
 	    int varStart = wrapper.start + 1;
 	    int varEnd = wrapper.computeEnd();
 		for (int i = staticVariables.length; --i >= 0;)
 			if (CharOperation.equals(staticVariables[i].sourceName, wrapper.signature, varStart, varEnd))
-				return dimension == 0 ? (TypeBinding) staticVariables[i] : createArrayType(staticVariables[i], dimension);
+				return getTypeFromTypeVariable(staticVariables[i], dimension, annotationsOnDimensions, walker, missingTypeNames);
 	    ReferenceBinding initialType = enclosingType;
 		do {
 			TypeVariableBinding[] enclosingTypeVariables;
@@ -1415,15 +1424,16 @@
 			}
 			for (int i = enclosingTypeVariables.length; --i >= 0;)
 				if (CharOperation.equals(enclosingTypeVariables[i].sourceName, wrapper.signature, varStart, varEnd))
-					return dimension == 0 ? (TypeBinding) enclosingTypeVariables[i] : createArrayType(enclosingTypeVariables[i], dimension);
+					return getTypeFromTypeVariable(enclosingTypeVariables[i], dimension, annotationsOnDimensions, walker, missingTypeNames);
 		} while ((enclosingType = enclosingType.enclosingType()) != null);
 		this.problemReporter.undefinedTypeVariableSignature(CharOperation.subarray(wrapper.signature, varStart, varEnd), initialType);
 		return null; // cannot reach this, since previous problem will abort compilation
 	}
 	boolean isParameterized;
-	TypeBinding type = getTypeFromSignature(wrapper.signature, wrapper.start, wrapper.computeEnd(), isParameterized = (wrapper.end == wrapper.bracket), enclosingType, missingTypeNames);
+	TypeBinding type = getTypeFromSignature(wrapper.signature, wrapper.start, wrapper.computeEnd(), isParameterized = (wrapper.end == wrapper.bracket), enclosingType, missingTypeNames, walker);
+
 	if (!isParameterized)
-		return dimension == 0 ? type : createArrayType(type, dimension);
+		return dimension == 0 ? type : createArrayType(type, dimension, AnnotatableTypeSystem.flattenedAnnotations(annotationsOnDimensions));
 
 	// type must be a ReferenceBinding at this point, cannot be a BaseTypeBinding or ArrayTypeBinding
 	ReferenceBinding actualType = (ReferenceBinding) type;
@@ -1434,8 +1444,9 @@
 	if (actualEnclosing != null) { // convert needed if read some static member type
 		actualEnclosing = (ReferenceBinding) convertToRawType(actualEnclosing, false /*do not force conversion of enclosing types*/);
 	}
-	TypeBinding[] typeArguments = getTypeArgumentsFromSignature(wrapper, staticVariables, enclosingType, actualType, missingTypeNames);
-	ParameterizedTypeBinding parameterizedType = createParameterizedType(actualType, typeArguments, actualEnclosing);
+	AnnotationBinding [] annotations = BinaryTypeBinding.createAnnotations(walker.getAnnotationsAtCursor(), this, missingTypeNames);
+	TypeBinding[] typeArguments = getTypeArgumentsFromSignature(wrapper, staticVariables, enclosingType, actualType, missingTypeNames, walker);
+	ParameterizedTypeBinding parameterizedType = createParameterizedType(actualType, typeArguments, actualEnclosing, annotations);
 
 	while (wrapper.signature[wrapper.start] == '.') {
 		wrapper.start++; // skip '.'
@@ -1446,16 +1457,29 @@
 		// need to protect against the member type being null when the signature is invalid
 		if (memberType == null)
 			this.problemReporter.corruptedSignature(parameterizedType, wrapper.signature, memberStart); // aborts
+		walker = walker.toNextNestedType();
+		annotations = BinaryTypeBinding.createAnnotations(walker.getAnnotationsAtCursor(), this, missingTypeNames);
 		if (wrapper.signature[wrapper.start] == '<') {
 			wrapper.start++; // skip '<'
-			typeArguments = getTypeArgumentsFromSignature(wrapper, staticVariables, enclosingType, memberType, missingTypeNames);
+			typeArguments = getTypeArgumentsFromSignature(wrapper, staticVariables, enclosingType, memberType, missingTypeNames, walker);
 		} else {
 			typeArguments = null;
 		}
-		parameterizedType = createParameterizedType(memberType, typeArguments, parameterizedType);
+		parameterizedType = createParameterizedType(memberType, typeArguments, parameterizedType, annotations);
 	}
 	wrapper.start++; // skip ';'
-	return dimension == 0 ? (TypeBinding) parameterizedType : createArrayType(parameterizedType, dimension);
+	return dimension == 0 ? (TypeBinding) parameterizedType : createArrayType(parameterizedType, dimension, AnnotatableTypeSystem.flattenedAnnotations(annotationsOnDimensions));
+}
+
+private TypeBinding getTypeFromTypeVariable(TypeVariableBinding typeVariableBinding, int dimension, AnnotationBinding [][] annotationsOnDimensions, TypeAnnotationWalker walker, char [][][] missingTypeNames) {
+	AnnotationBinding [] annotations = BinaryTypeBinding.createAnnotations(walker.getAnnotationsAtCursor(), this, missingTypeNames);
+	if (annotations != null && annotations != Binding.NO_ANNOTATIONS)
+		typeVariableBinding = (TypeVariableBinding) createAnnotatedType(typeVariableBinding, new AnnotationBinding [][] { annotations });
+
+	if (dimension == 0) {
+		return typeVariableBinding;
+	}
+	return this.typeSystem.getArrayType(typeVariableBinding, dimension, AnnotatableTypeSystem.flattenedAnnotations(annotationsOnDimensions));
 }
 
 TypeBinding getTypeFromVariantTypeSignature(
@@ -1464,7 +1488,8 @@
 		ReferenceBinding enclosingType,
 		ReferenceBinding genericType,
 		int rank,
-		char[][][] missingTypeNames) {
+		char[][][] missingTypeNames,
+		TypeAnnotationWalker walker) {
 	// VariantTypeSignature = '-' TypeSignature
 	//   or '+' TypeSignature
 	//   or TypeSignature
@@ -1473,19 +1498,22 @@
 		case '-' :
 			// ? super aType
 			wrapper.start++;
-			TypeBinding bound = getTypeFromTypeSignature(wrapper, staticVariables, enclosingType, missingTypeNames);
-			return createWildcard(genericType, rank, bound, null /*no extra bound*/, Wildcard.SUPER);
+			TypeBinding bound = getTypeFromTypeSignature(wrapper, staticVariables, enclosingType, missingTypeNames, walker.toWildcardBound());
+			AnnotationBinding [] annotations = BinaryTypeBinding.createAnnotations(walker.getAnnotationsAtCursor(), this, missingTypeNames);
+			return this.typeSystem.getWildcard(genericType, rank, bound, null /*no extra bound*/, Wildcard.SUPER, annotations);
 		case '+' :
 			// ? extends aType
 			wrapper.start++;
-			bound = getTypeFromTypeSignature(wrapper, staticVariables, enclosingType, missingTypeNames);
-			return createWildcard(genericType, rank, bound, null /*no extra bound*/, Wildcard.EXTENDS);
+			bound = getTypeFromTypeSignature(wrapper, staticVariables, enclosingType, missingTypeNames, walker.toWildcardBound());
+			annotations = BinaryTypeBinding.createAnnotations(walker.getAnnotationsAtCursor(), this, missingTypeNames);
+			return this.typeSystem.getWildcard(genericType, rank, bound, null /*no extra bound*/, Wildcard.EXTENDS, annotations);
 		case '*' :
 			// ?
 			wrapper.start++;
-			return createWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND);
+			annotations = BinaryTypeBinding.createAnnotations(walker.getAnnotationsAtCursor(), this, missingTypeNames);
+			return this.typeSystem.getWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND, annotations);
 		default :
-			return getTypeFromTypeSignature(wrapper, staticVariables, enclosingType, missingTypeNames);
+			return getTypeFromTypeSignature(wrapper, staticVariables, enclosingType, missingTypeNames, walker);
 	}
 }
 
@@ -1533,16 +1561,8 @@
 	this.accessRestrictions = new HashMap(3);
 
 	this.verifier = null;
-	for (int i = this.uniqueArrayBindings.length; --i >= 0;) {
-		ArrayBinding[] arrayBindings = this.uniqueArrayBindings[i];
-		if (arrayBindings != null)
-			for (int j = arrayBindings.length; --j >= 0;)
-				arrayBindings[j] = null;
-	}
+	
 	// NOTE: remember to fix #updateCaches(...) when adding unique binding caches
-	this.uniqueParameterizedTypeBindings = new SimpleLookupTable(3);
-	this.uniqueRawTypeBindings = new SimpleLookupTable(3);
-	this.uniqueWildcardBindings = new SimpleLookupTable(3);
 	this.uniqueParameterizedGenericMethodBindings = new SimpleLookupTable(3);
 	this.uniquePolymorphicMethodBindings = new SimpleLookupTable(3);
 	this.uniqueGetClassMethodBinding = null;
@@ -1556,7 +1576,7 @@
 	this.unitBeingCompleted = null; // in case AbortException occurred
 
 	this.classFilePool.reset();
-
+	this.typeSystem.reset();
 	// name environment has a longer life cycle, and must be reset in
 	// the code which created it.
 }
@@ -1572,35 +1592,7 @@
 }
 
 void updateCaches(UnresolvedReferenceBinding unresolvedType, ReferenceBinding resolvedType) {
-	// walk all the unique collections & replace the unresolvedType with the resolvedType
-	// must prevent 2 entries so == still works (1 containing the unresolvedType and the other containing the resolvedType)
-	if (this.uniqueParameterizedTypeBindings.get(unresolvedType) != null) { // update the key
-		Object[] keys = this.uniqueParameterizedTypeBindings.keyTable;
-		for (int i = 0, l = keys.length; i < l; i++) {
-			if (keys[i] == unresolvedType) {
-				keys[i] = resolvedType; // hashCode is based on compoundName so this works - cannot be raw since type of parameterized type
-				break;
-			}
-		}
-	}
-	if (this.uniqueRawTypeBindings.get(unresolvedType) != null) { // update the key
-		Object[] keys = this.uniqueRawTypeBindings.keyTable;
-		for (int i = 0, l = keys.length; i < l; i++) {
-			if (keys[i] == unresolvedType) {
-				keys[i] = resolvedType; // hashCode is based on compoundName so this works
-				break;
-			}
-		}
-	}
-	if (this.uniqueWildcardBindings.get(unresolvedType) != null) { // update the key
-		Object[] keys = this.uniqueWildcardBindings.keyTable;
-		for (int i = 0, l = keys.length; i < l; i++) {
-			if (keys[i] == unresolvedType) {
-				keys[i] = resolvedType; // hashCode is based on compoundName so this works
-				break;
-			}
-		}
-	}
+	this.typeSystem.updateCaches(unresolvedType, resolvedType);
 }
 
 public IQualifiedTypeResolutionListener[] resolutionListeners = new IQualifiedTypeResolutionListener[0];
@@ -1615,4 +1607,14 @@
 			this.resolutionListeners = new IQualifiedTypeResolutionListener[length + 1], 0, length);
 	this.resolutionListeners[length] = resolutionListener;
 }
+
+
+public TypeBinding getUnannotatedType(TypeBinding typeBinding) {
+	return this.typeSystem.getUnannotatedType(typeBinding);
+}
+
+// Given a type, return all its variously annotated versions.
+public TypeBinding[] getAnnotatedTypes(TypeBinding type) {
+	return this.typeSystem.getAnnotatedTypes(type);
+}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MemberTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MemberTypeBinding.java
index 528e014..e32badd 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MemberTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MemberTypeBinding.java
@@ -11,15 +11,26 @@
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+
 // AspectJ Extension: made non-final 
 public class MemberTypeBinding extends NestedTypeBinding {
 public MemberTypeBinding(char[][] compoundName, ClassScope scope, SourceTypeBinding enclosingType) {
 	super(compoundName, scope, enclosingType);
 	this.tagBits |= TagBits.MemberTypeMask;
 }
+
+public MemberTypeBinding(MemberTypeBinding prototype) {
+	super(prototype);
+}
+
 void checkSyntheticArgsAndFields() {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (isStatic()) return;
 	if (isInterface()) return;
+	if (!isPrototype()) {
+		((MemberTypeBinding) this.prototype).checkSyntheticArgsAndFields();
+		return;
+	}
 	this.addSyntheticArgumentAndField(this.enclosingType);
 }
 /* Answer the receiver's constant pool name.
@@ -28,16 +39,31 @@
 */
 
 public char[] constantPoolName() /* java/lang/Object */ {
+	
 	if (this.constantPoolName != null)
 		return this.constantPoolName;
+	
+	if (!isPrototype()) {
+		return this.prototype.constantPoolName();
+	}
 
 	return this.constantPoolName = CharOperation.concat(enclosingType().constantPoolName(), this.sourceName, '$');
 }
 
+public TypeBinding clone(TypeBinding outerType) {
+	MemberTypeBinding copy = new MemberTypeBinding(this);
+	copy.enclosingType = (SourceTypeBinding) outerType;
+	return copy;
+}
+
 /**
  * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding#initializeDeprecatedAnnotationTagBits()
  */
 public void initializeDeprecatedAnnotationTagBits() {
+	if (!isPrototype()) {
+		this.prototype.initializeDeprecatedAnnotationTagBits();
+		return;
+	}
 	if ((this.tagBits & TagBits.DeprecatedAnnotationResolved) == 0) {
 		super.initializeDeprecatedAnnotationTagBits();
 		if ((this.tagBits & TagBits.AnnotationDeprecated) == 0) {
@@ -53,6 +79,10 @@
 	}
 }
 public String toString() {
-	return "Member type : " + new String(sourceName()) + " " + super.toString(); //$NON-NLS-2$ //$NON-NLS-1$
+	if (this.hasTypeAnnotations()) {
+		return annotatedDebugName();
+    } else {
+    	return "Member type : " + new String(sourceName()) + " " + super.toString(); //$NON-NLS-2$ //$NON-NLS-1$
+    }
 }
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java
index 4897fc0..7e8790c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -18,6 +14,13 @@
  *								bug 365662 - [compiler][null] warn on contradictory and redundant null annotations
  *								bug 365531 - [compiler][null] investigate alternative strategy for internally encoding nullness defaults
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 425152 - [1.8] [compiler] Lambda Expression not resolved but flow analyzed leading to NPE.
+ *								Bug 423505 - [1.8] Implement "18.5.4 More Specific Method Inference"
+ *     Jesper Steen Moller - Contributions for
+ *								Bug 412150 [1.8] [compiler] Enable reflected parameter names during annotation processing
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -34,6 +37,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.ConstantPool;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings("rawtypes")
 public class MethodBinding extends Binding {
 
 	public int modifiers;
@@ -50,6 +54,9 @@
 	/** Store nullness information from annotation (incl. applicable default). */
 	public Boolean[] parameterNonNullness;  // TRUE means @NonNull declared, FALSE means @Nullable declared, null means nothing declared
 
+	/** Store parameter names from MethodParameters attribute (incl. applicable default). */
+	public char[][] parameterNames = Binding.NO_PARAMETER_NAMES;
+
 protected MethodBinding() {
 	// for creating problem or synthetic method
 }
@@ -93,7 +100,7 @@
 		return false;
 
 	for (int i = 0; i < length; i++)
-		if (this.parameters[i] != args[i] && this.parameters[i].erasure() != args[i].erasure())
+		if (TypeBinding.notEquals(this.parameters[i], args[i]) && TypeBinding.notEquals(this.parameters[i].erasure(), args[i].erasure()))
 			return false;
 	return true;
 }
@@ -111,12 +118,12 @@
 		if (paramLength == argLength) { // accept X[] but not X or X[][]
 			TypeBinding varArgType = this.parameters[lastIndex]; // is an ArrayBinding by definition
 			TypeBinding lastArgument = arguments[lastIndex];
-			if (varArgType != lastArgument && !lastArgument.isCompatibleWith(varArgType))
+			if (TypeBinding.notEquals(varArgType, lastArgument) && !lastArgument.isCompatibleWith(varArgType))
 				return false;
 		} else if (paramLength < argLength) { // all remainig argument types must be compatible with the elementsType of varArgType
 			TypeBinding varArgType = ((ArrayBinding) this.parameters[lastIndex]).elementsType();
 			for (int i = lastIndex; i < argLength; i++)
-				if (varArgType != arguments[i] && !arguments[i].isCompatibleWith(varArgType))
+				if (TypeBinding.notEquals(varArgType, arguments[i]) && !arguments[i].isCompatibleWith(varArgType))
 					return false;
 		} else if (lastIndex != argLength) { // can call foo(int i, X ... x) with foo(1) but NOT foo();
 			return false;
@@ -124,7 +131,7 @@
 		// now compare standard arguments from 0 to lastIndex
 	}
 	for (int i = 0; i < lastIndex; i++)
-		if (this.parameters[i] != arguments[i] && !arguments[i].isCompatibleWith(this.parameters[i]))
+		if (TypeBinding.notEquals(this.parameters[i], arguments[i]) && !arguments[i].isCompatibleWith(this.parameters[i]))
 			return false;
 	return true;
 }
@@ -140,7 +147,7 @@
 		return false;
 
 	for (int i = 0; i < length; i++)
-		if (this.parameters[i] != args[i])
+		if (TypeBinding.notEquals(this.parameters[i], args[i]))
 			return false;
 	return true;
 }
@@ -161,11 +168,11 @@
 		return false;
 
 	for (int i = 0; i < length; i++)
-		if (this.typeVariables[i] != vars[i] && this.typeVariables[i].erasure() != vars[i].erasure())
+		if (TypeBinding.notEquals(this.typeVariables[i], vars[i]) && TypeBinding.notEquals(this.typeVariables[i].erasure(), vars[i].erasure()))
 			return false;
 	return true;
 }
-MethodBinding asRawMethod(LookupEnvironment env) {
+public MethodBinding asRawMethod(LookupEnvironment env) {
 	if (this.typeVariables == Binding.NO_TYPE_VARIABLES) return this;
 
 	// substitute type arguments with raw types
@@ -213,12 +220,12 @@
 	// AspectJ Extension: was
 	/*{
 	SourceTypeBinding invocationType = scope.enclosingSourceType();
-	if (invocationType == this.declaringClass) return true;
+	if (TypeBinding.equalsEquals(invocationType, this.declaringClass)) return true;
 	}*/// new:
     ReferenceBinding declaringType = original().declaringClass;  // AspectJ Extension - new local variable to hold the declaringType
 
 	SourceTypeBinding invocationType = scope.invocationType();// AspectJ Extension - was enclosingSourceType();
-	if (invocationType == declaringType) return true; // AspectJ Extension - was declaringClass
+	if (TypeBinding.equalsEquals(invocationType, declaringType)) return true; // AspectJ Extension - was declaringClass
 	// Aspectj Extension end
 
 	if (isProtected()) {
@@ -243,7 +250,7 @@
 			outerDeclaringClass = temp;
 			temp = temp.enclosingType();
 		}
-		return outerInvocationType == outerDeclaringClass;
+		return TypeBinding.equalsEquals(outerInvocationType, outerDeclaringClass);
 	}
 
 	// isDefault()
@@ -295,12 +302,10 @@
 	SourceTypeBinding invocationType = scope.invocationType(); // AspectJ Extension - was scope.enclosingSourceType()
 
 	if (this.declaringClass.isInterface() && isStatic()) {
-		// Static interface methods can be explicitly invoked only through the type reference of the declaring interface or implicitly in the interface itself.
+		// Static interface methods can be explicitly invoked only through the type reference of the declaring interface or implicitly in the interface itself or via static import.
 		if (scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_8)
 			return false;
-		if (invocationSite.isTypeAccess() && receiverType == this.declaringClass)
-			return true;
-		if (invocationSite.receiverIsImplicitThis() && invocationType == this.declaringClass)
+		if ((invocationSite.isTypeAccess() || invocationSite.receiverIsImplicitThis()) && TypeBinding.equalsEquals(receiverType, this.declaringClass))
 			return true;
 		return false;
 	}
@@ -308,7 +313,7 @@
 	if (isPublic()) return true;
 	
 
-	if (invocationType == this.declaringClass && invocationType == receiverType) return true;
+	if (TypeBinding.equalsEquals(invocationType, this.declaringClass) && TypeBinding.equalsEquals(invocationType, receiverType)) return true;
 
 	if (invocationType == null) // static import call
 		return !isPrivate() && scope.getCurrentPackage() == this.declaringClass.fPackage;
@@ -319,7 +324,7 @@
 		//    AND the receiverType is the invocationType or its subclass
 		//    OR the method is a static method accessed directly through a type
 		//    OR previous assertions are true for one of the enclosing type
-		if (invocationType == this.declaringClass) return true;
+		if (TypeBinding.equalsEquals(invocationType, this.declaringClass)) return true;
 		if (invocationType.fPackage == this.declaringClass.fPackage) return true;
 
 		//	AspectJ Extension
@@ -348,7 +353,7 @@
 					if (depth > 0) invocationSite.setDepth(depth);
 					return true; // see 1FMEPDL - return invocationSite.isTypeAccess();
 				}
-				if (currentType == receiverErasure || receiverErasure.findSuperTypeOriginatingFrom(currentType) != null) {
+				if (TypeBinding.equalsEquals(currentType, receiverErasure) || receiverErasure.findSuperTypeOriginatingFrom(currentType) != null) {
 					if (depth > 0) invocationSite.setDepth(depth);
 					return true;
 				}
@@ -363,7 +368,7 @@
 		// answer true if the receiverType is the declaringClass
 		// AND the invocationType and the declaringClass have a common enclosingType
 		receiverCheck: {
-			if (receiverType != this.declaringClass) {
+			if (TypeBinding.notEquals(receiverType, this.declaringClass)) {
 				// special tolerance for type variable direct bounds, but only if compliance <= 1.6, see: https://bugs.eclipse.org/bugs/show_bug.cgi?id=334622
 				if (scope.compilerOptions().complianceLevel <= ClassFileConstants.JDK1_6 && receiverType.isTypeVariable() && ((TypeVariableBinding) receiverType).isErasureBoundTo(this.declaringClass.erasure()))
 					break receiverCheck;
@@ -371,7 +376,7 @@
 			}
 		}
 
-		if (invocationType != this.declaringClass) {
+		if (TypeBinding.notEquals(invocationType, this.declaringClass)) {
 			ReferenceBinding outerInvocationType = invocationType;
 			ReferenceBinding temp = outerInvocationType.enclosingType();
 			while (temp != null) {
@@ -385,7 +390,7 @@
 				outerDeclaringClass = temp;
 				temp = temp.enclosingType();
 			}
-			if (outerInvocationType != outerDeclaringClass) return false;
+			if (TypeBinding.notEquals(outerInvocationType, outerDeclaringClass)) return false;
 		}
 		return true;
 	}
@@ -401,9 +406,9 @@
 	ReferenceBinding currentType = (ReferenceBinding) (receiverType);
 	do {
 		if (currentType.isCapture()) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=285002
-			if (originalDeclaringClass == currentType.erasure().original()) return true;
+			if (TypeBinding.equalsEquals(originalDeclaringClass, currentType.erasure().original())) return true;
 		} else {
-			if (originalDeclaringClass == currentType.original()) return true;
+			if (TypeBinding.equalsEquals(originalDeclaringClass, currentType.original())) return true;
 		}
 		PackageBinding currentPackage = currentType.fPackage;
 		// package could be null for wildcards/intersection types, ignore and recurse in superclass
@@ -541,7 +546,7 @@
 		this.tagBits |= TagBits.HasParameterAnnotations;
 	if (   this.returnType != null
 		&& !this.returnType.isBaseType()
-		&& (this.tagBits & (TagBits.AnnotationNonNull|TagBits.AnnotationNullable)) == 0)
+		&& (this.tagBits & TagBits.AnnotationNullMASK) == 0)
 	{
 		this.tagBits |= TagBits.AnnotationNonNull;
 	} else if (sourceMethod != null && (this.tagBits & TagBits.AnnotationNonNull) != 0) {
@@ -549,12 +554,42 @@
 	}
 }
 
+protected void fillInDefaultNonNullness18(AbstractMethodDeclaration sourceMethod, LookupEnvironment env) {
+	boolean added = false;
+	int length = this.parameters.length;
+	for (int i = 0; i < length; i++) {
+		TypeBinding parameter = this.parameters[i];
+		if (parameter.isBaseType())
+			continue;
+		long existing = parameter.tagBits & TagBits.AnnotationNullMASK;
+		if (existing == 0L) {
+			added = true;
+			if (!parameter.isBaseType()) {
+				this.parameters[i] = env.createAnnotatedType(parameter, new AnnotationBinding[]{env.getNonNullAnnotation()});
+				if (sourceMethod != null)
+					sourceMethod.arguments[i].binding.type = this.parameters[i];
+			}
+		} else if (sourceMethod != null && (parameter.tagBits & TagBits.AnnotationNonNull) != 0) {
+			sourceMethod.scope.problemReporter().nullAnnotationIsRedundant(sourceMethod, i);
+		}
+	}
+	if (added)
+		this.tagBits |= TagBits.HasParameterAnnotations;
+	if (this.returnType != null) {
+		if (!this.returnType.isBaseType() && (this.returnType.tagBits & TagBits.AnnotationNullMASK) == 0) {
+			this.returnType = env.createAnnotatedType(this.returnType, new AnnotationBinding[]{env.getNonNullAnnotation()});
+		} else if (sourceMethod != null && (this.returnType.tagBits & TagBits.AnnotationNonNull) != 0) {
+			sourceMethod.scope.problemReporter().nullAnnotationIsRedundant(sourceMethod, -1/*signifies method return*/);
+		}
+	}
+}
+
 public MethodBinding findOriginalInheritedMethod(MethodBinding inheritedMethod) {
 	MethodBinding inheritedOriginal = inheritedMethod.original();
 	TypeBinding superType = this.declaringClass.findSuperTypeOriginatingFrom(inheritedOriginal.declaringClass);
 	if (superType == null || !(superType instanceof ReferenceBinding)) return null;
 
-	if (inheritedOriginal.declaringClass != superType) {
+	if (TypeBinding.notEquals(inheritedOriginal.declaringClass, superType)) {
 		// must find inherited method with the same substituted variables
 		MethodBinding[] superMethods = ((ReferenceBinding) superType).getMethods(inheritedOriginal.selector, inheritedOriginal.parameters.length);
 		for (int m = 0, l = superMethods.length; m < l; m++)
@@ -612,7 +647,7 @@
 }
 
 public final int getAccessFlags() {
-	return this.modifiers & ExtraCompilerModifiers.AccJustFlag;
+	return this.modifiers & (ExtraCompilerModifiers.AccJustFlag | ExtraCompilerModifiers.AccDefaultMethod);
 }
 
 public AnnotationBinding[] getAnnotations() {
@@ -899,6 +934,18 @@
 	return this;
 }
 
+/**
+ * Strips one level of parameterization, so if both class & method are parameterized,
+ * leave the class parameters in place.
+ */
+public MethodBinding shallowOriginal() {
+	return original();
+}
+
+public MethodBinding genericMethod() {
+	return this;
+}
+
 public char[] readableName() /* foo(int, Thread) */ {
 	StringBuffer buffer = new StringBuffer(this.parameters.length + 1 * 20);
 	if (isConstructor())
@@ -1294,4 +1341,7 @@
 	}
 	return false;
 }
+public boolean isVoidMethod() {
+	return this.returnType == TypeBinding.VOID;
+}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodScope.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodScope.java
index 7740e70..77c7546 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodScope.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodScope.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -16,7 +12,8 @@
  *								bug 374605 - Unreasonable warning for enum-based switch statements
  *								bug 382353 - [1.8][compiler] Implementation property modifiers should be accepted on default methods.
  *								bug 382354 - [1.8][compiler] Compiler silent on conflicting modifier
- *								bug 401030 - [1.8][null] Null analysis support for lambda methods. 
+ *								bug 401030 - [1.8][null] Null analysis support for lambda methods.
+ *								Bug 416176 - [1.8][compiler][null] null type annotations cause grief on type variables
  *     Jesper S Moller - Contributions for
  *							bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
  *******************************************************************************/
@@ -74,6 +71,11 @@
 	this.startIndex = 0;
 }
 
+public MethodScope(Scope parent, ReferenceContext context, boolean isStatic, int lastVisibleFieldID) {
+	this(parent, context, isStatic);
+	this.lastVisibleFieldID = lastVisibleFieldID;
+}
+
 String basicToString(int tab) {
 	String newLine = "\n"; //$NON-NLS-1$
 	for (int i = tab; --i >= 0;)
@@ -302,7 +304,7 @@
 		// assign variable position
 		local.resolvedPosition = this.offset;
 
-		if ((local.type == TypeBinding.LONG) || (local.type == TypeBinding.DOUBLE)) {
+		if ((TypeBinding.equalsEquals(local.type, TypeBinding.LONG)) || (TypeBinding.equalsEquals(local.type, TypeBinding.DOUBLE))) {
 			this.offset += 2;
 		} else {
 			this.offset++;
@@ -319,7 +321,7 @@
 		for (int iarg = 0, maxArguments = this.extraSyntheticArguments.length; iarg < maxArguments; iarg++){
 			SyntheticArgumentBinding argument = this.extraSyntheticArguments[iarg];
 			argument.resolvedPosition = this.offset;
-			if ((argument.type == TypeBinding.LONG) || (argument.type == TypeBinding.DOUBLE)){
+			if ((TypeBinding.equalsEquals(argument.type, TypeBinding.LONG)) || (TypeBinding.equalsEquals(argument.type, TypeBinding.DOUBLE))){
 				this.offset += 2;
 			} else {
 				this.offset++;
@@ -422,7 +424,7 @@
 	if (field.isStatic())
 		return field; // static fields are always accessible
 
-	if (!this.isConstructorCall || receiverType != enclosingSourceType())
+	if (!this.isConstructorCall || TypeBinding.notEquals(receiverType, enclosingSourceType()))
 		return field;
 
 	if (invocationSite instanceof SingleNameReference)
@@ -558,4 +560,8 @@
 	ClassScope scope = enclosingClassScope();
 	return scope == null ? null : scope.referenceContext;
 }
+
+void resolveTypeParameter(TypeParameter typeParameter) {
+	typeParameter.resolve(this);
+}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java
index b6c4142..e211103 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java
@@ -5,23 +5,20 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Benjamin Muskalla - Contribution for bug 239066
  *     Stephan Herrmann - Contribution for
- *     								bug 382347 - [1.8][compiler] Compiler accepts incorrect default method inheritance
- *									bug 388954 - [1.8][compiler] detect default methods in class files
- *									bug 388281 - [compiler][null] inheritance of null annotations as an option
- *									bug 388739 - [1.8][compiler] consider default methods when detecting whether a class needs to be declared abstract
- *									bug 390883 - [1.8][compiler] Unable to override default method
- *									bug 401796 - [1.8][compiler] don't treat default methods as overriding an independent inherited abstract method
- *									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 382347 - [1.8][compiler] Compiler accepts incorrect default method inheritance
+ *								bug 388954 - [1.8][compiler] detect default methods in class files
+ *								bug 388281 - [compiler][null] inheritance of null annotations as an option
+ *								bug 388739 - [1.8][compiler] consider default methods when detecting whether a class needs to be declared abstract
+ *								bug 390883 - [1.8][compiler] Unable to override default method
+ *								bug 401796 - [1.8][compiler] don't treat default methods as overriding an independent inherited abstract method
+ *								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
+ *								Bug 420080 - [1.8] Overridden Default method is reported as duplicated
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -38,11 +35,11 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleSet;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Sorting;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class MethodVerifier extends ImplicitNullAnnotationVerifier {
 	SourceTypeBinding type;
 	HashtableOfObject inheritedMethods;
 	HashtableOfObject currentMethods;
-	LookupEnvironment environment;
 	/*
 Binding creation is responsible for reporting all problems with types:
 	- all modifier problems (duplicates & multiple visibility modifiers + incompatible combinations - abstract/final)
@@ -61,11 +58,10 @@
 		- defining an interface as a local type (local types can only be classes)
 */
 MethodVerifier(LookupEnvironment environment) {
-	super(environment.globalOptions);
+	super(environment);
 	this.type = null;  // Initialized with the public method verify(SourceTypeBinding)
 	this.inheritedMethods = null;
 	this.currentMethods = null;
-	this.environment = environment;
 }
 boolean areMethodsCompatible(MethodBinding one, MethodBinding two) {
 	return areMethodsCompatible(one, two, this.environment);
@@ -83,8 +79,8 @@
 boolean areReturnTypesCompatible(MethodBinding one, MethodBinding two) {
 	return areReturnTypesCompatible(one, two, this.type.scope.environment());
 }
-static boolean areReturnTypesCompatible(MethodBinding one, MethodBinding two, LookupEnvironment environment) {
-	if (one.returnType == two.returnType) return true;
+public static boolean areReturnTypesCompatible(MethodBinding one, MethodBinding two, LookupEnvironment environment) {
+	if (TypeBinding.equalsEquals(one.returnType, two.returnType)) return true;
 	if (environment.globalOptions.sourceLevel >= ClassFileConstants.JDK1_5) {
 		// short is compatible with int, but as far as covariance is concerned, its not
 		if (one.returnType.isBaseType()) return false;
@@ -104,7 +100,7 @@
 }
 boolean canSkipInheritedMethods(MethodBinding one, MethodBinding two) {
 	return two == null // already know one is not null
-		|| one.declaringClass == two.declaringClass;
+		|| TypeBinding.equalsEquals(one.declaringClass, two.declaringClass);
 }
 void checkAbstractMethod(MethodBinding abstractMethod) {
 	if (mustImplementAbstractMethod(abstractMethod.declaringClass)) {
@@ -289,7 +285,7 @@
 				}
 				// AspectJ Extension end
 				for (int r = 0, rl = refs.length; r < rl; r++) {
-					if (refs[r].resolvedType == toCheck) {
+					if (TypeBinding.equalsEquals(refs[r].resolvedType, toCheck)) {
 						problemReporter().redundantSuperInterface(this.type, refs[j], implementedInterface, toCheck);
 						break; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911
 					}
@@ -324,7 +320,7 @@
 						}
 						// AspectJ Extension end
 						for (int r = 0, rl = refs.length; r < rl; r++) {
-							if (refs[r].resolvedType == inheritedInterface) {
+							if (TypeBinding.equalsEquals(refs[r].resolvedType, inheritedInterface)) {
 								problemReporter().redundantSuperInterface(this.type, refs[r], inheritedInterface, superType);
 								break;
 							}
@@ -368,7 +364,7 @@
 						}
 						// AspectJ Extension end
 						for (int r = 0, rl = refs.length; r < rl; r++) {
-							if (refs[r].resolvedType == inheritedInterface) {
+							if (TypeBinding.equalsEquals(refs[r].resolvedType, inheritedInterface)) {
 								problemReporter().redundantSuperInterface(this.type, refs[r], inheritedInterface, superType);
 								break;
 							}
@@ -383,7 +379,7 @@
 	}
 }
 
-void checkInheritedMethods(MethodBinding[] methods, int length, boolean[] isOverridden) {
+void checkInheritedMethods(MethodBinding[] methods, int length, boolean[] isOverridden, boolean[] isInherited) {
 	/*
 	1. find concrete method
 	2. if it doesn't exist then find first inherited abstract method whose return type is compatible with all others
@@ -441,7 +437,7 @@
 	MethodBinding[] abstractMethods = new MethodBinding[length - 1];
 	index = 0;
 	for (int i = 0; i < length; i++)
-		if (methods[i].isAbstract())
+		if (methods[i].isAbstract() || (methods[i] != concreteMethod && methods[i].isDefaultMethod()))
 			abstractMethods[index++] = methods[i];
 	if (index == 0) return; // can happen with methods that contain 'equal' Missing Types, see bug 257384
 	if (index < abstractMethods.length)
@@ -499,7 +495,7 @@
 					return; // found concrete implementation of abstract method in same package
 			}
 		}
-	} while ((superType = superType.superclass()) != abstractMethod.declaringClass);
+	} while (TypeBinding.notEquals((superType = superType.superclass()), abstractMethod.declaringClass));
 
 	// non visible abstract methods cannot be overridden so the type must be defined abstract
 	problemReporter().abstractMethodCannotBeOverridden(this.type, abstractMethod);
@@ -547,7 +543,7 @@
 					MethodBinding existingMethod = existingMethods[i];
 					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=302358, skip inherited method only if any overriding version
 					// in a subclass is guaranteed to have the same erasure as an existing method.
-					if (existingMethod.declaringClass != inheritedMethod.declaringClass && areMethodsCompatible(existingMethod, inheritedMethod) && !canOverridingMethodDifferInErasure(existingMethod, inheritedMethod)) {
+					if (TypeBinding.notEquals(existingMethod.declaringClass, inheritedMethod.declaringClass) && areMethodsCompatible(existingMethod, inheritedMethod) && !canOverridingMethodDifferInErasure(existingMethod, inheritedMethod)) {
 						if (inheritedMethod.isDefault()) {
 							if (inheritedMethod.isAbstract()) {
 								checkPackagePrivateAbstractMethod(inheritedMethod);
@@ -711,7 +707,7 @@
 	return computeSubstituteMethod(inheritedMethod, currentMethod, this.environment);
 }
 
-static MethodBinding computeSubstituteMethod(MethodBinding inheritedMethod, MethodBinding currentMethod, LookupEnvironment environment) {
+public static MethodBinding computeSubstituteMethod(MethodBinding inheritedMethod, MethodBinding currentMethod, LookupEnvironment environment) {
 	if (inheritedMethod == null) return null;
 	if (currentMethod.parameters.length != inheritedMethod.parameters.length) return null; // no match
 
@@ -740,31 +736,26 @@
 		environment.createParameterizedGenericMethod(inheritedMethod, arguments);
 	for (int i = 0; i < inheritedLength; i++) {
 		TypeVariableBinding inheritedTypeVariable = inheritedTypeVariables[i];
-		TypeBinding argument = arguments[i];
-		if (argument instanceof TypeVariableBinding) {
-			TypeVariableBinding typeVariable = (TypeVariableBinding) argument;
-			if (typeVariable.firstBound == inheritedTypeVariable.firstBound) {
-				if (typeVariable.firstBound == null)
-					continue; // both are null
-			} else if (typeVariable.firstBound != null && inheritedTypeVariable.firstBound != null) {
-				if (typeVariable.firstBound.isClass() != inheritedTypeVariable.firstBound.isClass())
-					return inheritedMethod; // not a match
-			}
-			if (Scope.substitute(substitute, inheritedTypeVariable.superclass) != typeVariable.superclass)
+		TypeVariableBinding typeVariable = (TypeVariableBinding) arguments[i]; // cast is safe by construction: arguments is copied from TypeVariableBinding[]
+		if (TypeBinding.equalsEquals(typeVariable.firstBound, inheritedTypeVariable.firstBound)) {
+			if (typeVariable.firstBound == null)
+				continue; // both are null
+		} else if (typeVariable.firstBound != null && inheritedTypeVariable.firstBound != null) {
+			if (typeVariable.firstBound.isClass() != inheritedTypeVariable.firstBound.isClass())
 				return inheritedMethod; // not a match
-			int interfaceLength = inheritedTypeVariable.superInterfaces.length;
-			ReferenceBinding[] interfaces = typeVariable.superInterfaces;
-			if (interfaceLength != interfaces.length)
-				return inheritedMethod; // not a match
-			next : for (int j = 0; j < interfaceLength; j++) {
-				TypeBinding superType = Scope.substitute(substitute, inheritedTypeVariable.superInterfaces[j]);
-				for (int k = 0; k < interfaceLength; k++)
-					if (superType == interfaces[k])
-						continue next;
-				return inheritedMethod; // not a match
-			}
-		} else if (inheritedTypeVariable.boundCheck(substitute, argument, null) != TypeConstants.OK) {
-	    	return inheritedMethod;
+		}
+		if (TypeBinding.notEquals(Scope.substitute(substitute, inheritedTypeVariable.superclass), typeVariable.superclass))
+			return inheritedMethod; // not a match
+		int interfaceLength = inheritedTypeVariable.superInterfaces.length;
+		ReferenceBinding[] interfaces = typeVariable.superInterfaces;
+		if (interfaceLength != interfaces.length)
+			return inheritedMethod; // not a match
+		next : for (int j = 0; j < interfaceLength; j++) {
+			TypeBinding superType = Scope.substitute(substitute, inheritedTypeVariable.superInterfaces[j]);
+			for (int k = 0; k < interfaceLength; k++)
+				if (TypeBinding.equalsEquals(superType, interfaces[k]))
+					continue next;
+			return inheritedMethod; // not a match
 		}
 	}
    return substitute;
@@ -831,7 +822,7 @@
 		// only keep methods from the closest superclass, all others from higher superclasses can be skipped
 		// NOTE: methods were added in order by walking up the superclass hierarchy
 		ReferenceBinding declaringClass2 = methods[++i].declaringClass;
-		while (declaringClass == declaringClass2) {
+		while (TypeBinding.equalsEquals(declaringClass, declaringClass2)) {
 			if (++i == length) return null;
 			declaringClass2 = methods[i].declaringClass;
 		}
@@ -854,7 +845,7 @@
 		for (int j = i + 1; j < length; j++) {
 			if (toSkip != null && toSkip[j] == -1) continue;
 			ReferenceBinding declaringClass2 = methods[j].declaringClass;
-			if (declaringClass == declaringClass2) continue;
+			if (TypeBinding.equalsEquals(declaringClass, declaringClass2)) continue;
 			if (declaringClass.implementsInterface(declaringClass2, true)) {
 				if (toSkip == null)
 					toSkip = new int[length];
@@ -906,7 +897,7 @@
 	return isSubstituteParameterSubsignature(method, substituteMethod, this.environment);
 }
 
-static boolean isSubstituteParameterSubsignature(MethodBinding method, MethodBinding substituteMethod, LookupEnvironment environment) {
+public static boolean isSubstituteParameterSubsignature(MethodBinding method, MethodBinding substituteMethod, LookupEnvironment environment) {
 	if (!areParametersEqual(method, substituteMethod)) {
 		// method can still override substituteMethod in cases like :
 		// <U extends Number> void c(U u) {}
@@ -951,7 +942,7 @@
 
 boolean isSameClassOrSubclassOf(ReferenceBinding testClass, ReferenceBinding superclass) {
 	do {
-		if (testClass == superclass) return true;
+		if (TypeBinding.equalsEquals(testClass, superclass)) return true;
 	} while ((testClass = testClass.superclass()) != null);
 	return false;
 }
@@ -962,7 +953,7 @@
 	if (!mustImplementAbstractMethods()) return false;
 	ReferenceBinding superclass = this.type.superclass();
 	if (declaringClass.isClass()) {
-		while (superclass.isAbstract() && superclass != declaringClass)
+		while (superclass.isAbstract() && TypeBinding.notEquals(superclass, declaringClass))
 			superclass = superclass.superclass(); // find the first concrete superclass or the abstract declaringClass
 	} else {
 		if (this.type.implementsInterface(declaringClass, false))
@@ -984,7 +975,7 @@
 
 ProblemReporter problemReporter(MethodBinding currentMethod) {
 	ProblemReporter reporter = problemReporter();
-	if (currentMethod.declaringClass == this.type && currentMethod.sourceMethod() != null)	// only report against the currentMethod if its implemented by the type
+	if (TypeBinding.equalsEquals(currentMethod.declaringClass, this.type) && currentMethod.sourceMethod() != null)	// only report against the currentMethod if its implemented by the type
 		reporter.referenceContext = currentMethod.sourceMethod();
 	return reporter;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.java
index 7ffce54..9fd09e1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -23,10 +19,17 @@
  *								bug 401796 - [1.8][compiler] don't treat default methods as overriding an independent inherited abstract method
  *								bug 403867 - [1.8][compiler] Suspect error about duplicate default methods
  *								bug 391376 - [1.8] check interaction of default methods with bridge methods and generics
+ *								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
+ *								Bug 420080 - [1.8] Overridden Default method is reported as duplicated
+ *								Bug 404690 - [1.8][compiler] revisit bridge generation after VM bug is fixed
+ *								Bug 410325 - [1.7][compiler] Generified method override different between javac and eclipse compiler
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 
+import java.util.Arrays;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Argument;
@@ -62,7 +65,7 @@
 }
 boolean canSkipInheritedMethods(MethodBinding one, MethodBinding two) {
 	return two == null // already know one is not null
-		|| (one.declaringClass == two.declaringClass && !one.declaringClass.isParameterizedType());
+		|| (TypeBinding.equalsEquals(one.declaringClass, two.declaringClass) && !one.declaringClass.isParameterizedType());
 }
 void checkConcreteInheritedMethod(MethodBinding concreteMethod, MethodBinding[] abstractMethods) {
 	super.checkConcreteInheritedMethod(concreteMethod, abstractMethods);
@@ -79,7 +82,7 @@
 
 		// so the parameters are equal and the return type is compatible b/w the currentMethod & the substituted inheritedMethod
 		MethodBinding originalInherited = abstractMethod.original();
-		if (originalInherited.returnType != concreteMethod.returnType)
+		if (TypeBinding.notEquals(originalInherited.returnType, concreteMethod.returnType))
 			if (!isAcceptableReturnTypeOverride(concreteMethod, abstractMethod))
 				problemReporter().unsafeReturnTypeOverride(concreteMethod, originalInherited, this.type);
 
@@ -88,7 +91,7 @@
 		// bridge will be/would have been generated in the context of the super class since
 		// the bridge itself will be inherited. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=298362
 		if (originalInherited.declaringClass.isInterface()) {
-			if ((concreteMethod.declaringClass == this.type.superclass && this.type.superclass.isParameterizedType() && !areMethodsCompatible(concreteMethod, originalInherited))
+			if ((TypeBinding.equalsEquals(concreteMethod.declaringClass, this.type.superclass) && this.type.superclass.isParameterizedType() && !areMethodsCompatible(concreteMethod, originalInherited))
 				|| this.type.superclass.erasure().findSuperTypeOriginatingFrom(originalInherited.declaringClass) == null)
 					this.type.addSyntheticBridgeMethod(originalInherited, concreteMethod.original());
 		}
@@ -103,7 +106,7 @@
 
 	// so the parameters are equal and the return type is compatible b/w the currentMethod & the substituted inheritedMethod
 	MethodBinding originalInherited = inheritedMethod.original();
-	if (originalInherited.returnType != currentMethod.returnType)
+	if (TypeBinding.notEquals(originalInherited.returnType, currentMethod.returnType))
 		if (!isAcceptableReturnTypeOverride(currentMethod, inheritedMethod))
 			problemReporter(currentMethod).unsafeReturnTypeOverride(currentMethod, originalInherited, this.type);
 
@@ -120,7 +123,7 @@
 		MethodBinding[] current = (MethodBinding[]) this.currentMethods.get(bridge.selector);
 		for (int i = current.length - 1; i >= 0; --i) {
 			final MethodBinding thisMethod = current[i];
-			if (thisMethod.areParameterErasuresEqual(bridge) && thisMethod.returnType.erasure() == bridge.returnType.erasure()) {
+			if (thisMethod.areParameterErasuresEqual(bridge) && TypeBinding.equalsEquals(thisMethod.returnType.erasure(), bridge.returnType.erasure())) {
 				// use inherited method for problem reporting.
 				problemReporter(thisMethod).methodNameClash(thisMethod, inheritedMethod.declaringClass.isRawType() ? inheritedMethod : inheritedMethod.original(), ProblemSeverities.Error);
 				return;	
@@ -176,7 +179,7 @@
 		if (length != inheritedParams.length) return; // no match
 
 		for (int i = 0; i < length; i++)
-			if (currentParams[i] != inheritedParams[i])
+			if (TypeBinding.notEquals(currentParams[i], inheritedParams[i]))
 				if (currentParams[i].isBaseType() != inheritedParams[i].isBaseType() || !inheritedParams[i].isCompatibleWith(currentParams[i]))
 					return; // no chance that another inherited method's bridge method can collide
 
@@ -207,7 +210,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -231,7 +234,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -258,14 +261,14 @@
 	detectInheritedNameClash(inheritedMethod.original(), otherInheritedMethod.original());
 }
 // 8.4.8.4
-void checkInheritedMethods(MethodBinding[] methods, int length, boolean[] isOverridden) {
+void checkInheritedMethods(MethodBinding[] methods, int length, boolean[] isOverridden, boolean[] isInherited) {
 	boolean continueInvestigation = true;
 	MethodBinding concreteMethod = null;
 	MethodBinding abstractSuperClassMethod = null;
 	boolean playingTrump = false; // invariant: playingTrump => (concreteMethod == null)
 	for (int i = 0; i < length; i++) {
 		if (!methods[i].declaringClass.isInterface()
-				&& methods[i].declaringClass != this.type
+				&& TypeBinding.notEquals(methods[i].declaringClass, this.type)
 				&& methods[i].isAbstract())
 		{
 			abstractSuperClassMethod = methods[i];
@@ -273,7 +276,9 @@
 		}
 	}
 	for (int i = 0; i < length; i++) {
-		if (!methods[i].isAbstract()) {
+		// methods not inherited as of 8.4.8 cannot create a name clash,
+		// but could still cause errors against return types etc. (below)
+		if (isInherited[i] && !methods[i].isAbstract()) {
 			// 8.4.8.4 defines an exception for default methods if
 			// (a) there exists an abstract method declared in a superclass of C and inherited by C
 			// (b) that is override-equivalent with the two methods.
@@ -289,10 +294,26 @@
 					// re-checking compatibility is needed for https://bugs.eclipse.org/346029
 					if (isOverridden[i] && areMethodsCompatible(concreteMethod, methods[i])) {
 						continue;
-					} else {
-						problemReporter().duplicateInheritedMethods(this.type, concreteMethod, methods[i]);
-						continueInvestigation = false;
 					}
+					// https://bugs.eclipse.org/195802 with https://bugs.eclipse.org/410325
+					// If a replace method (from findReplacedMethod()) is the rawified version of another
+					// don't count this as duplicates:
+					//   (Not asking ParameterizedGenericMethodBinding.isRawMethod(),
+					//    because that is true only for methods of a RawTypeBinding,
+					//    but here we look for rawness regarding the method's type variables).
+					if (TypeBinding.equalsEquals(concreteMethod.declaringClass, methods[i].declaringClass) 
+							&& concreteMethod.typeVariables.length != methods[i].typeVariables.length) 
+					{
+						if (concreteMethod.typeVariables == Binding.NO_TYPE_VARIABLES
+								&& concreteMethod.original() == methods[i])
+							continue;
+						if (methods[i].typeVariables == Binding.NO_TYPE_VARIABLES
+								&& methods[i].original() == concreteMethod)
+							continue;
+					}
+
+					problemReporter().duplicateInheritedMethods(this.type, concreteMethod, methods[i]);
+					continueInvestigation = false;
 				}
 				concreteMethod = methods[i];
 			}
@@ -313,7 +334,7 @@
 				}
 			}
 		}
-		super.checkInheritedMethods(methods, length, isOverridden);
+		super.checkInheritedMethods(methods, length, isOverridden, isInherited);
 	}
 }
 boolean checkInheritedDefaultMethods(MethodBinding[] methods, int length) {
@@ -383,10 +404,10 @@
 		return;
 	}
 	// in this context currentMethod can be inherited, too. Recurse if needed.
-	if (currentMethod.declaringClass != this.type 
+	if (TypeBinding.notEquals(currentMethod.declaringClass, this.type) 
 			&& (currentMethod.tagBits & TagBits.IsNullnessKnown) == 0) 
 	{
-		this.buddyImplicitNullAnnotationsVerifier.checkImplicitNullAnnotations(currentMethod, srcMethod, complain, this.type.scope);
+		this.buddyImplicitNullAnnotationsVerifier.checkImplicitNullAnnotations(currentMethod, srcMethod, complain, scope);
 	}
 	super.checkNullSpecInheritance(currentMethod, srcMethod, hasNonNullDefault, complain, inheritedMethod, scope, inheritedNonNullnessInfos);
 }
@@ -485,7 +506,6 @@
 	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];
 		// ensure that if we have a concrete method this shows up at position [0]:
@@ -503,7 +523,7 @@
 			int length = inherited.length;
 			for (int i = 0; i < length; i++) {
 				MethodBinding inheritedMethod = inherited[i];
-				if (inheritedMethod.isPublic() && !inheritedMethod.declaringClass.isPublic())
+				if (inheritedMethod.isPublic() && (!inheritedMethod.declaringClass.isInterface() && !inheritedMethod.declaringClass.isPublic()))
 					this.type.addSyntheticBridgeMethod(inheritedMethod.original());
 			}
 		}
@@ -528,6 +548,8 @@
 		// - methods that are overridden by a current method
 		boolean[] skip = new boolean[inheritedLength];
 		boolean[] isOverridden = new boolean[inheritedLength];
+		boolean[] isInherited = new boolean[inheritedLength];
+		Arrays.fill(isInherited, true);
 		if (current != null) {
 			for (int i = 0, length1 = current.length; i < length1; i++) {
 				MethodBinding currentMethod = current[i];
@@ -566,9 +588,10 @@
 		// (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.
 				MethodBinding inheritedMethod = inherited[i];
-				if (inheritedMethod.isPublic() && !inheritedMethod.declaringClass.isPublic()) {
+				if (inheritedMethod.isPublic() && (!inheritedMethod.declaringClass.isInterface() && !inheritedMethod.declaringClass.isPublic())) {
 					this.type.addSyntheticBridgeMethod(inheritedMethod.original());
 				}
 			}
@@ -587,11 +610,11 @@
 				// Skip the otherInheritedMethod if it is completely replaced by inheritedMethod
 				// 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 (TypeBinding.notEquals(inheritedMethod.declaringClass, otherInheritedMethod.declaringClass)) {
 					// these method calls produce their effect as side-effects into skip and isOverridden:
-					if (isSkippableOrOverridden(inheritedMethod, otherInheritedMethod, skip, isOverridden, j))
+					if (isSkippableOrOverridden(inheritedMethod, otherInheritedMethod, skip, isOverridden, isInherited, j))
 						continue;
-					if (isSkippableOrOverridden(otherInheritedMethod, inheritedMethod, skip, isOverridden, i))
+					if (isSkippableOrOverridden(otherInheritedMethod, inheritedMethod, skip, isOverridden, isInherited, i))
 						continue;
 				}
 			}
@@ -626,8 +649,29 @@
 			}
 			if (index == -1) continue;
 
-			if (index > 0)
-				checkInheritedMethods(matchingInherited, index + 1, isOverridden); // pass in the length of matching
+			if (index > 0) {
+				int length = index + 1;
+				boolean[] matchingIsOverridden;
+				boolean[] matchingIsInherited;
+				if (length != inheritedLength) { // transfer inherited & overridden status to align with subset of methods.
+					matchingIsOverridden = new boolean[length];
+					matchingIsInherited = new boolean[length];
+					for (int j = 0; j < length; j++) {
+						for (int k = 0; k < inheritedLength; k++) {
+							if (matchingInherited[j] == inherited[k]) {
+								matchingIsOverridden[j] = isOverridden[k];
+								matchingIsInherited[j] = isInherited[k];
+								break;
+							}
+						}
+					}
+				} else {
+					matchingIsOverridden = isOverridden;
+					matchingIsInherited = isInherited;
+				}
+				
+				checkInheritedMethods(matchingInherited, length, matchingIsOverridden, matchingIsInherited); // 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
@@ -640,20 +684,26 @@
  * 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'
+ * TODO(stephan) currently (as of Bug 410325), the boarder between skip and isOverridden is blurred,
+ *                should reassess after more experience with this patch.
  */
-boolean isSkippableOrOverridden(MethodBinding specific, MethodBinding general, boolean[] skip, boolean[] isOverridden, int idx) {
+boolean isSkippableOrOverridden(MethodBinding specific, MethodBinding general, boolean[] skip, boolean[] isOverridden, boolean[] isInherited, int idx) {
 	boolean specificIsInterface = specific.declaringClass.isInterface();
 	boolean generalIsInterface = general.declaringClass.isInterface();
 	if (!specificIsInterface && generalIsInterface) {
-		if (isInterfaceMethodImplemented(general, specific, general.declaringClass)) {
+		if (!specific.isAbstract() && isParameterSubsignature(specific, general)) {
+			// 8.4.8: abstract and default methods are not inherited if a concrete method with a subsignature is defined or inherited in C
+			isInherited[idx] = false;
+			return true;
+		} else if (isInterfaceMethodImplemented(general, specific, general.declaringClass)) {
 			skip[idx] = true;
 			isOverridden[idx] = true;
 			return true;
 		}
 	} else if (specificIsInterface == generalIsInterface) { 
-		if (isParameterSubsignature(specific, general)) {
+		if (specific.declaringClass.isCompatibleWith(general.declaringClass) && isMethodSubsignature(specific, general)) {
 			skip[idx] = true;
-			isOverridden[idx] |= specific.declaringClass.isCompatibleWith(general.declaringClass);
+			isOverridden[idx] = true;
 			return true;
 		}
 	}
@@ -662,11 +712,12 @@
 /* '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)  
+ * - default methods should also be considered replaced by class methods that meet the signature that is a subsignature criteria.
  */
 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' 
+			&& (!specific.isAbstract() || general.isAbstract() || (general.isDefaultMethod() && specific.declaringClass.isClass()))	// if (abstract(specific) => abstract(general)) check if 'specific' overrides 'general' 
 			&& isSubstituteParameterSubsignature(specific, generalSubstitute)) 
 	{
 		return generalSubstitute;
@@ -739,11 +790,11 @@
 	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=323693
 	// When reporting a name clash between two inherited methods, we should not look for a
 	// signature clash, but instead should be looking for method descriptor clash. 
-	if (inherited.returnType.erasure() != otherInherited.returnType.erasure())
+	if (TypeBinding.notEquals(inherited.returnType.erasure(), otherInherited.returnType.erasure()))
 		return false;
 	// skip it if otherInherited is defined by a subtype of inherited's declaringClass or vice versa.
 	// avoid being order sensitive and check with the roles reversed also.
-	if (inherited.declaringClass.erasure() != otherInherited.declaringClass.erasure()) {
+	if (TypeBinding.notEquals(inherited.declaringClass.erasure(), otherInherited.declaringClass.erasure())) {
 		if (inherited.declaringClass.findSuperTypeOriginatingFrom(otherInherited.declaringClass) != null)
 			return false;
 		if (otherInherited.declaringClass.findSuperTypeOriginatingFrom(inherited.declaringClass) != null)
@@ -762,7 +813,7 @@
 	if (this.environment.globalOptions.complianceLevel == ClassFileConstants.JDK1_6) {
 		// for 1.6 return types also need to be checked
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=317719
-		if (current.returnType.erasure() != original.returnType.erasure())
+		if (TypeBinding.notEquals(current.returnType.erasure(), original.returnType.erasure()))
 			severity = ProblemSeverities.Warning;
 	}
 	if (!treatAsSynthetic) {
@@ -820,7 +871,7 @@
 				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;
+						if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 					interfacesToVisit[nextPosition++] = next;
 				}
 			}
@@ -839,7 +890,7 @@
 				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;
+						if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 					interfacesToVisit[nextPosition++] = next;
 				}
 			}
@@ -854,7 +905,7 @@
 			TypeBinding erasure = current.erasure();
 			for (int j = i + 1; j < nextPosition; j++) {
 				ReferenceBinding next = interfacesToVisit[j];
-				if (next.isValidBinding() && next.erasure() == erasure) {
+				if (next.isValidBinding() && TypeBinding.equalsEquals(next.erasure(), erasure)) {
 					if (copy == null)
 						copy = new SimpleSet(nextPosition);
 					copy.add(interfacesToVisit[i]);
@@ -879,7 +930,7 @@
 	TypeBinding currentReturnType = currentMethod.returnType.leafComponentType();
 	switch (currentReturnType.kind()) {
 	   	case Binding.TYPE_PARAMETER :
-	   		if (currentReturnType == inheritedMethod.returnType.leafComponentType())
+	   		if (TypeBinding.equalsEquals(currentReturnType, inheritedMethod.returnType.leafComponentType()))
 	   			return true;
 	   		//$FALL-THROUGH$
 		default :
@@ -896,8 +947,8 @@
 
 	inheritedMethod = computeSubstituteMethod(inheritedMethod, existingMethod);
 	return inheritedMethod != null
-		&& (inheritedMethod.returnType == existingMethod.returnType	// need to keep around to produce bridge methods? ...
-			|| (this.type != existingMethod.declaringClass 			// ... not if inheriting the bridge situation from a superclass
+		&& (TypeBinding.equalsEquals(inheritedMethod.returnType, existingMethod.returnType)	// need to keep around to produce bridge methods? ...
+			|| (TypeBinding.notEquals(this.type, existingMethod.declaringClass) 			// ... not if inheriting the bridge situation from a superclass
 					&& !existingMethod.declaringClass.isInterface()))
 		&& doesMethodOverride(existingMethod, inheritedMethod);
 }
@@ -916,7 +967,7 @@
 	// called when currentMethod's return type is NOT compatible with inheritedMethod's return type
 
 	// JLS 3 �8.4.5: more are accepted, with an unchecked conversion
-	if (currentMethod.returnType == inheritedMethod.returnType.erasure()) {
+	if (TypeBinding.equalsEquals(currentMethod.returnType, inheritedMethod.returnType.erasure())) {
 		TypeBinding[] currentParams = currentMethod.parameters;
 		TypeBinding[] inheritedParams = inheritedMethod.parameters;
 		for (int i = 0, l = currentParams.length; i < l; i++)
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MissingTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MissingTypeBinding.java
index f841c5f..1f090d5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MissingTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/MissingTypeBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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 @@
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 
+@SuppressWarnings({"rawtypes"})
 public class MissingTypeBinding extends BinaryTypeBinding {
 
 /**
@@ -41,6 +42,10 @@
 	this.methods = Binding.NO_METHODS;
 }
 
+public TypeBinding clone(TypeBinding outerType) {
+	return this; // shouldn't get here.
+}
+
 /**
  * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#collectMissingTypes(java.util.List)
  */
@@ -71,6 +76,10 @@
 	this.superclass = missingSuperclass;
 }
 
+public void setTypeAnnotations(AnnotationBinding[] annotations, boolean evalNullAnnotations) {
+	return; // reject misguided attempts.
+}
+
 public String toString() {
 		return "[MISSING:" + new String(CharOperation.concatWith(this.compoundName, '.')) + "]"; //$NON-NLS-1$ //$NON-NLS-2$
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java
index 3c69e19..46b72f6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java
@@ -15,7 +15,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
 
-public class NestedTypeBinding extends SourceTypeBinding {
+public abstract class NestedTypeBinding extends SourceTypeBinding {
 
 	public SourceTypeBinding enclosingType;
 
@@ -30,10 +30,22 @@
 	this.enclosingType = enclosingType;
 }
 
+public NestedTypeBinding(NestedTypeBinding prototype) {
+	super(prototype);
+	this.enclosingType = prototype.enclosingType;
+	this.enclosingInstances = prototype.enclosingInstances;
+	this.enclosingTypes = prototype.enclosingTypes;
+	this.outerLocalVariables = prototype.outerLocalVariables;
+	this.outerLocalVariablesSlotSize = prototype.outerLocalVariablesSlotSize;
+}
+
 /* Add a new synthetic argument for <actualOuterLocalVariable>.
 * Answer the new argument or the existing argument if one already existed.
 */
 public SyntheticArgumentBinding addSyntheticArgument(LocalVariableBinding actualOuterLocalVariable) {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	SyntheticArgumentBinding synthLocal = null;
 
 	if (this.outerLocalVariables == null) {
@@ -64,6 +76,7 @@
 * Answer the new argument or the existing argument if one already existed.
 */
 public SyntheticArgumentBinding addSyntheticArgument(ReferenceBinding targetEnclosingType) {
+	if (!isPrototype()) throw new IllegalStateException();
 	SyntheticArgumentBinding synthLocal = null;
 	if (this.enclosingInstances == null) {
 		synthLocal = new SyntheticArgumentBinding(targetEnclosingType);
@@ -71,7 +84,7 @@
 	} else {
 		int size = this.enclosingInstances.length;
 		int newArgIndex = size;
-		if (enclosingType() == targetEnclosingType)
+		if (TypeBinding.equalsEquals(enclosingType(), targetEnclosingType))
 			newArgIndex = 0;
 		SyntheticArgumentBinding[] newInstances = new SyntheticArgumentBinding[size + 1];
 		System.arraycopy(this.enclosingInstances, 0, newInstances, newArgIndex == 0 ? 1 : 0, size);
@@ -88,6 +101,7 @@
 * Answer the new argument or the existing argument if one already existed.
 */
 public SyntheticArgumentBinding addSyntheticArgumentAndField(LocalVariableBinding actualOuterLocalVariable) {
+	if (!isPrototype()) throw new IllegalStateException();
 	SyntheticArgumentBinding synthLocal = addSyntheticArgument(actualOuterLocalVariable);
 	if (synthLocal == null) return null;
 
@@ -100,6 +114,7 @@
 * Answer the new argument or the existing argument if one already existed.
 */
 public SyntheticArgumentBinding addSyntheticArgumentAndField(ReferenceBinding targetEnclosingType) {
+	if (!isPrototype()) throw new IllegalStateException();
 	SyntheticArgumentBinding synthLocal = addSyntheticArgument(targetEnclosingType);
 	if (synthLocal == null) return null;
 
@@ -109,6 +124,7 @@
 }
 
 protected void checkRedundantNullnessDefaultRecurse(ASTNode location, Annotation[] annotations, long annotationTagBits) {
+	if (!isPrototype()) throw new IllegalStateException();
 	ReferenceBinding currentType = this.enclosingType;
 	do {
 		if (!((SourceTypeBinding)currentType).checkRedundantNullnessDefaultOne(location, annotations, annotationTagBits)) {
@@ -129,6 +145,7 @@
  * @return the enclosingInstancesSlotSize
  */
 public int getEnclosingInstancesSlotSize() {
+	if (!isPrototype()) throw new IllegalStateException();
 	return this.enclosingInstances == null ? 0 : this.enclosingInstances.length;
 }
 
@@ -136,6 +153,7 @@
  * @return the outerLocalVariablesSlotSize
  */
 public int getOuterLocalVariablesSlotSize() {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.outerLocalVariablesSlotSize < 0) {
 		this.outerLocalVariablesSlotSize = 0;
 		int outerLocalsCount = this.outerLocalVariables == null ? 0 : this.outerLocalVariables.length;
@@ -158,6 +176,7 @@
 /* Answer the synthetic argument for <actualOuterLocalVariable> or null if one does not exist.
 */
 public SyntheticArgumentBinding getSyntheticArgument(LocalVariableBinding actualOuterLocalVariable) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.outerLocalVariables == null) return null;		// is null if no outer local variables are known
 	for (int i = this.outerLocalVariables.length; --i >= 0;)
 		if (this.outerLocalVariables[i].actualOuterLocalVariable == actualOuterLocalVariable)
@@ -168,6 +187,9 @@
 /* Answer the synthetic argument for <targetEnclosingType> or null if one does not exist.
 */
 public SyntheticArgumentBinding getSyntheticArgument(ReferenceBinding targetEnclosingType, boolean onlyExactMatch, boolean scopeIsConstructorCall) {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	if (this.enclosingInstances == null) return null;		// is null if no enclosing instances are known
 	
 	// exact match
@@ -183,13 +205,13 @@
 	//   }
 	// }
 	if (scopeIsConstructorCall && this.enclosingInstances.length > 0)
-		if (this.enclosingInstances[0].type == targetEnclosingType) 
+		if (TypeBinding.equalsEquals(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 (TypeBinding.equalsEquals(this.enclosingInstances[i].type, targetEnclosingType))
 			if (this.enclosingInstances[i].actualOuterLocalVariable == null)
 				return this.enclosingInstances[i];
 
@@ -206,10 +228,12 @@
 }
 
 public SyntheticArgumentBinding[] syntheticEnclosingInstances() {
+	if (!isPrototype()) throw new IllegalStateException();
 	return this.enclosingInstances;		// is null if no enclosing instances are required
 }
 
 public ReferenceBinding[] syntheticEnclosingInstanceTypes() {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.enclosingTypes == UNINITIALIZED_REFERENCE_TYPES) {
 		if (this.enclosingInstances == null) {
 			this.enclosingTypes = null;
@@ -225,6 +249,7 @@
 }
 
 public SyntheticArgumentBinding[] syntheticOuterLocalVariables() {
+	if (!isPrototype()) throw new IllegalStateException();
 	return this.outerLocalVariables;		// is null if no outer locals are required
 }
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NullTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NullTypeBinding.java
new file mode 100644
index 0000000..d18553f
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/NullTypeBinding.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+// Give it an identity of its own to discriminate the fact that this type is not annotatable and so is a singleton.
+public class NullTypeBinding extends BaseTypeBinding {
+
+	NullTypeBinding() {
+		super(TypeIds.T_null, TypeConstants.NULL, new char[] { 'N' }); // N stands for null even if it is never internally used);
+	}
+	
+	public TypeBinding clone(TypeBinding enclosingType) {
+		return this;  // enforce solitude.
+	}
+	
+	public void setTypeAnnotations(AnnotationBinding[] annotations, boolean evalNullAnnotations) {
+		return; // reject misguided attempt.
+	}
+	
+	public TypeBinding unannotated() {
+		return this;
+	}
+}
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.java
index 73ff072..9b104d8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.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
@@ -68,7 +68,11 @@
 	if ((element.tagBits & TagBits.HasMissingType) == 0) clearMissingTagBit();
 	if (this.knownTypes == null)
 		this.knownTypes = new HashtableOfType(25);
-	this.knownTypes.put(element.compoundName[element.compoundName.length - 1], element);
+	char [] name = element.compoundName[element.compoundName.length - 1];
+	ReferenceBinding priorType = this.knownTypes.getput(name, element);
+	if (priorType != null && priorType.isUnresolvedType() && !element.isUnresolvedType()) {
+		((UnresolvedReferenceBinding) priorType).setResolvedType(element, this.environment);
+	}
 	if (this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled)
 		if (element.isAnnotationType() || element instanceof UnresolvedReferenceBinding) // unresolved types don't yet have the modifiers set
 			checkIfNullAnnotationType(element);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java
index 5df859f..3736e26 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,10 +10,23 @@
  *     Stephan Herrmann - Contributions for
  *								bug 186342 - [compiler][null] Using annotations for null checking
  *								bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								bug 413958 - Function override returning inherited Generic Type
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 424710 - [1.8][compiler] CCE in SingleNameReference.localVariableBinding
+ *								Bug 423505 - [1.8] Implement "18.5.4 More Specific Method Inference"
+ *								Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
+ *								Bug 418743 - [1.8][null] contradictory annotations on invocation of generic method not reported
+ *								Bug 416182 - [1.8][compiler][null] Contradictory null annotations not rejected
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Invocation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 /**
  * Binding denoting a generic method after type parameter substitutions got performed.
@@ -32,8 +45,33 @@
 
 	/**
 	 * Perform inference of generic method type parameters and/or expected type
+	 * <p>
+	 * In 1.8+ the following discipline has to be observed by callers:
+	 * Each invocation must be subjected to two levels of inference:
+	 * </p>
+	 * <ul>
+	 * <li> {@link Scope#APPLICABILITY Invocation Applicability Inference}, which may be applied
+	 *     multiple times for the same invocation</li>
+	 * <li> {@link Scope#INVOCATION_TYPE Invocation Type Inference}, which is finally performed
+	 *     for the selected method and which adds information from the "target type".</li>
+	 * </ul>
+	 * <p>
+	 * Clients can control which parts of the inference should be performed by passing the appropriate
+	 * flags into argument 'inferenceLevel'. On each call path it must be ensured that one or more
+	 * invocation applicability inferences are always followed by exactly one invocation type inference
+	 * (unless errors have been detected).
+	 * </p>
+	 * <p>
+	 * Initial clients are the direct callers of
+	 * {@link Scope#computeCompatibleMethod(MethodBinding,TypeBinding[],InvocationSite,int)},
+	 * which should either invoke both levels of inference <em>or</em> delegate the second part to
+	 * {@link Scope#mostSpecificMethodBinding(MethodBinding[],int,TypeBinding[],InvocationSite,ReferenceBinding)},
+	 * which is intended to ensure completing the inference on all non-error exits.
+	 * </p>  
 	 */
-	public static MethodBinding computeCompatibleMethod(MethodBinding originalMethod, TypeBinding[] arguments, Scope scope, InvocationSite invocationSite) {
+	public static MethodBinding computeCompatibleMethod(MethodBinding originalMethod, TypeBinding[] arguments, Scope scope,
+			InvocationSite invocationSite, int inferenceLevel)
+	{
 		ParameterizedGenericMethodBinding methodSubstitute;
 		TypeVariableBinding[] typeVariables = originalMethod.typeVariables;
 		TypeBinding[] substitutes = invocationSite.genericTypeArguments();
@@ -52,31 +90,121 @@
 			// perform type argument inference (15.12.2.7)
 			// initializes the map of substitutes (var --> type[][]{ equal, extends, super}
 			TypeBinding[] parameters = originalMethod.parameters;
-			inferenceContext = new InferenceContext(originalMethod);
-			methodSubstitute = inferFromArgumentTypes(scope, originalMethod, arguments, parameters, inferenceContext);
-			if (methodSubstitute == null)
-				return null;
-			
-			// substitutes may hold null to denote unresolved vars, but null arguments got replaced with respective original variable in param method
-			// 15.12.2.8 - inferring unresolved type arguments
-			if (inferenceContext.hasUnresolvedTypeArgument()) {
-				if (inferenceContext.isUnchecked) { // only remember unchecked status post 15.12.2.7
-					int length = inferenceContext.substitutes.length;
-					System.arraycopy(inferenceContext.substitutes, 0, uncheckedArguments = new TypeBinding[length], 0, length);
-				}
-				if (methodSubstitute.returnType != TypeBinding.VOID) {
-					TypeBinding expectedType = invocationSite.expectedType();
-					if (expectedType != null) {
-						// record it was explicit from context, as opposed to assumed by default (see below)
-						inferenceContext.hasExplicitExpectedType = true;
+
+// ==== 1.8: The main driver for inference of generic methods: ====
+			InferenceContext18 infCtx18 = null;
+			CompilerOptions compilerOptions = scope.compilerOptions();
+			if (compilerOptions.sourceLevel >= ClassFileConstants.JDK1_8) {
+				if ((inferenceLevel & Scope.APPLICABILITY) != 0)
+					infCtx18 = invocationSite.freshInferenceContext(scope);
+				else if (invocationSite instanceof Invocation && originalMethod instanceof ParameterizedGenericMethodBinding)
+					infCtx18 = ((Invocation) invocationSite).getInferenceContext((ParameterizedGenericMethodBinding) originalMethod);
+			}
+			if (infCtx18 != null) {
+				try {
+					BoundSet provisionalResult = null;
+					BoundSet result = null;
+					if ((inferenceLevel & Scope.APPLICABILITY) != 0) {
+
+						// ---- 18.5.1 (Applicability): ----
+						boolean isDiamond = originalMethod.isConstructor()
+								&& invocationSite instanceof Expression
+								&& ((Expression)invocationSite).isPolyExpression(originalMethod);
+						if (arguments.length == parameters.length) {
+							infCtx18.inferenceKind = InferenceContext18.CHECK_LOOSE; // TODO: validate if 2 phase checking (strict/loose + vararg) is sufficient.
+							infCtx18.inferInvocationApplicability(originalMethod, arguments, isDiamond);
+							provisionalResult = infCtx18.solve();
+						}
+						if (provisionalResult == null && originalMethod.isVarargs()) {
+							// check for variable-arity applicability
+							infCtx18 = invocationSite.freshInferenceContext(scope); // start over
+							infCtx18.inferenceKind = InferenceContext18.CHECK_VARARG;
+							infCtx18.inferInvocationApplicability(originalMethod, arguments, isDiamond);
+							provisionalResult = infCtx18.solve();
+						}
+						if (provisionalResult != null && infCtx18.isResolved(provisionalResult)) {
+							infCtx18.storedSolution = provisionalResult;
+							infCtx18.stepCompleted = InferenceContext18.APPLICABILITY_INFERRED;
+						}
 					} else {
-						expectedType = scope.getJavaLangObject(); // assume Object by default
+						provisionalResult = infCtx18.storedSolution;
 					}
-					inferenceContext.expectedType = expectedType;
+					result = infCtx18.currentBounds.copy(); // the result after reduction, without effects of resolve()
+
+					TypeBinding expectedType = invocationSite.invocationTargetType();
+					boolean hasReturnProblem = false;
+					boolean invocationTypeInferred = false;
+					if ((inferenceLevel & Scope.INVOCATION_TYPE) != 0 // requested?
+							&& (expectedType != null || !invocationSite.getExpressionContext().definesTargetType())) { // possible?
+
+						// ---- 18.5.2 (Invocation type): ----
+						result = infCtx18.inferInvocationType(result, expectedType, invocationSite, originalMethod);
+						invocationTypeInferred = true;
+						hasReturnProblem |= result == null;
+						if (hasReturnProblem)
+							result = provisionalResult; // let's prefer a type error regarding the return type over reporting no match at all
+					} else {
+						// we're not yet ready for invocation type inference
+						result = provisionalResult;
+					}
+
+					if (result != null) {
+						// assemble the solution etc:
+						TypeBinding[] solutions = infCtx18.getSolutions(typeVariables, invocationSite, result);
+						if (solutions != null) {
+							
+							methodSubstitute = scope.environment().createParameterizedGenericMethod(originalMethod, solutions);
+							if (hasReturnProblem) { // illegally working from the provisional result?
+								MethodBinding problemMethod = infCtx18.getReturnProblemMethodIfNeeded(expectedType, methodSubstitute);
+								if (problemMethod instanceof ProblemMethodBinding)
+									return problemMethod;
+							}
+							if (invocationTypeInferred) {
+								if (compilerOptions.isAnnotationBasedNullAnalysisEnabled)
+									NullAnnotationMatching.checkForContraditions(methodSubstitute, invocationSite, scope);
+								infCtx18.rebindInnerPolies(result, methodSubstitute.parameters);
+								return methodSubstitute.boundCheck18(scope, arguments);
+							} else {
+								if (invocationSite instanceof Invocation)
+									((Invocation) invocationSite).registerInferenceContext(methodSubstitute, infCtx18); // keep context so we can finish later
+								return methodSubstitute;
+							}
+						}
+					}
+					return null;
+				} catch (InferenceFailureException e) {
+					// FIXME stop-gap measure
+					scope.problemReporter().genericInferenceError(e.getMessage(), invocationSite);
+					return null;
 				}
-				methodSubstitute = methodSubstitute.inferFromExpectedType(scope, inferenceContext);
+			} else {
+// ==== 1.8 ====
+				inferenceContext = new InferenceContext(originalMethod);
+				methodSubstitute = inferFromArgumentTypes(scope, originalMethod, arguments, parameters, inferenceContext);
 				if (methodSubstitute == null)
 					return null;
+				
+				// substitutes may hold null to denote unresolved vars, but null arguments got replaced with respective original variable in param method
+				// 15.12.2.8 - inferring unresolved type arguments
+				if (inferenceContext.hasUnresolvedTypeArgument()) {
+					if (inferenceContext.isUnchecked) { // only remember unchecked status post 15.12.2.7
+						int length = inferenceContext.substitutes.length;
+						System.arraycopy(inferenceContext.substitutes, 0, uncheckedArguments = new TypeBinding[length], 0, length);
+					}
+					if (methodSubstitute.returnType != TypeBinding.VOID) {
+						TypeBinding expectedType = invocationSite.invocationTargetType();
+						if (expectedType != null) {
+							// record it was explicit from context, as opposed to assumed by default (see below)
+							inferenceContext.hasExplicitExpectedType = true;
+						} else {
+							expectedType = scope.getJavaLangObject(); // assume Object by default
+						}
+						inferenceContext.expectedType = expectedType;
+					}
+					methodSubstitute = methodSubstitute.inferFromExpectedType(scope, inferenceContext);
+					if (methodSubstitute == null)
+						return null;
+				}
 			}
 		}
 
@@ -128,6 +256,43 @@
 		return methodSubstitute;
 	}
 
+	MethodBinding boundCheck18(Scope scope, TypeBinding[] arguments) {
+		Substitution substitution = this;
+		ParameterizedGenericMethodBinding methodSubstitute = this;
+		TypeVariableBinding[] originalTypeVariables = this.originalMethod.typeVariables;
+		// mostly original extract from above, TODO: remove stuff that's no longer needed in 1.8+
+		for (int i = 0, length = originalTypeVariables.length; i < length; i++) {
+		    TypeVariableBinding typeVariable = originalTypeVariables[i];
+		    TypeBinding substitute = methodSubstitute.typeArguments[i]; // retain for diagnostics
+		    /* https://bugs.eclipse.org/bugs/show_bug.cgi?id=375394, To avoid spurious bounds check failures due to circularity in formal bounds, 
+		       we should eliminate only the lingering embedded type variable references after substitution, not alien type variable references
+		       that constitute the inference per se.
+		     */ 
+		    TypeBinding substituteForChecks;
+		    if (substitute instanceof TypeVariableBinding) {
+		    	substituteForChecks = substitute;
+		    } else {
+		    	substituteForChecks = Scope.substitute(new LingeringTypeVariableEliminator(originalTypeVariables, null, scope), substitute); // while using this for bounds check
+		    }
+		    
+			switch (typeVariable.boundCheck(substitution, substituteForChecks, scope)) {
+				case TypeConstants.MISMATCH :
+			        // incompatible due to bound check
+					int argLength = arguments.length;
+					TypeBinding[] augmentedArguments = new TypeBinding[argLength + 2]; // append offending substitute and typeVariable
+					System.arraycopy(arguments, 0, augmentedArguments, 0, argLength);
+					augmentedArguments[argLength] = substitute;
+					augmentedArguments[argLength+1] = typeVariable;
+			        return new ProblemMethodBinding(methodSubstitute, this.originalMethod.selector, augmentedArguments, ProblemReasons.ParameterBoundMismatch);
+				case TypeConstants.UNCHECKED :
+					// tolerate unchecked bounds
+					methodSubstitute.tagBits |= TagBits.HasUncheckedTypeArgumentForBoundCheck;
+					break;
+			}
+		}
+		return null;
+	}
+
 	/**
 	 * Collect argument type mapping, handling varargs
 	 */
@@ -209,11 +374,11 @@
 						for (int j = 0, equalLength = equalSubstitutes.length; j < equalLength; j++) {
 							TypeBinding equalSubstitute = equalSubstitutes[j];
 							if (equalSubstitute == null) continue nextConstraint;
-							if (equalSubstitute == current) {
+							if (TypeBinding.equalsEquals(equalSubstitute, current)) {
 								// try to find a better different match if any in subsequent equal candidates
 								for (int k = j+1; k < equalLength; k++) {
 									equalSubstitute = equalSubstitutes[k];
-									if (equalSubstitute != current && equalSubstitute != null) {
+									if (TypeBinding.notEquals(equalSubstitute, current) && equalSubstitute != null) {
 										substitutes[i] = equalSubstitute;
 										continue nextTypeParameter;
 									}
@@ -261,7 +426,7 @@
 					if (substitute != null) continue nextTypeParameter; // already inferred previously
 					TypeBinding [] bounds = inferenceContext.getSubstitutes(current, TypeConstants.CONSTRAINT_EXTENDS);
 					if (bounds == null) continue nextTypeParameter;
-					TypeBinding[] glb = Scope.greaterLowerBound(bounds, scope);
+					TypeBinding[] glb = Scope.greaterLowerBound(bounds, scope, scope.environment());
 					TypeBinding mostSpecificSubstitute = null;
 					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=341795 - Per 15.12.2.8, we should fully apply glb
 					if (glb != null) {
@@ -357,6 +522,19 @@
 		}
 	    this.wasInferred = true;// resulting from method invocation inferrence
 	    this.parameterNonNullness = originalMethod.parameterNonNullness;
+	    // special case: @NonNull for a parameter that is inferred to 'null' is encoded the old way
+	    // because we cannot (and don't want to) add type annotations to NullTypeBinding.
+	    int len = this.parameters.length;
+	    for (int i = 0; i < len; i++) {
+	    	if (this.parameters[i] == TypeBinding.NULL) {
+	    		long nullBits = originalMethod.parameters[i].tagBits & TagBits.AnnotationNullMASK;
+	    		if (nullBits == TagBits.AnnotationNonNull) {
+	    			if (this.parameterNonNullness == null)
+	    				this.parameterNonNullness = new Boolean[len];
+	    			this.parameterNonNullness[i] = Boolean.TRUE;
+	    		}
+	    	}
+	    }
 	}
 
 	/*
@@ -423,8 +601,8 @@
 		for (int i = 0; i < varLength; i++) {
 			TypeVariableBinding originalVariable = originalVariables[i];
 			TypeBinding argument = this.typeArguments[i];
-			boolean argAlreadyInferred = argument != originalVariable;
-			if (originalVariable.firstBound == originalVariable.superclass) {
+			boolean argAlreadyInferred = TypeBinding.notEquals(argument, originalVariable);
+			if (TypeBinding.equalsEquals(originalVariable.firstBound, originalVariable.superclass)) {
 				TypeBinding substitutedBound = Scope.substitute(this, originalVariable.superclass);
 				argument.collectSubstitutes(scope, substitutedBound, inferenceContext, TypeConstants.CONSTRAINT_SUPER);
 				if (inferenceContext.status == InferenceContext.FAILED) return null; // impossible substitution
@@ -472,7 +650,7 @@
     	// adjust method types to reflect latest inference
 		TypeBinding oldReturnType = this.returnType;
 		this.returnType = Scope.substitute(this, this.returnType);
-		this.inferredReturnType = inferenceContext.hasExplicitExpectedType && this.returnType != oldReturnType;
+		this.inferredReturnType = inferenceContext.hasExplicitExpectedType && TypeBinding.notEquals(this.returnType, oldReturnType);
 	    this.parameters = Scope.substitute(this, this.parameters);
 	    this.thrownExceptions = Scope.substitute(this, this.thrownExceptions);
 	    // error case where exception type variable would have been substituted by a non-reference type (207573)
@@ -523,14 +701,14 @@
 		}
 		// With T mapping to I<T>, answer of I<?>, when given T, having eliminated the circularity/self reference.
 		public TypeBinding substitute(TypeVariableBinding typeVariable) {
-			if (typeVariable.rank >= this.variables.length || this.variables[typeVariable.rank] != typeVariable) {   // not kosher, don't touch.
+			if (typeVariable.rank >= this.variables.length || TypeBinding.notEquals(this.variables[typeVariable.rank], typeVariable)) {   // not kosher, don't touch.
 				return typeVariable;
 			}
 			if (this.substitutes != null) {
 				return Scope.substitute(new LingeringTypeVariableEliminator(this.variables, null, this.scope), this.substitutes[typeVariable.rank]); 
 			}
 			ReferenceBinding genericType = (ReferenceBinding) (typeVariable.declaringElement instanceof ReferenceBinding ? typeVariable.declaringElement : null);
-			return this.scope.environment().createWildcard(genericType, typeVariable.rank, null, null, Wildcard.UNBOUND);
+			return this.scope.environment().createWildcard(genericType, typeVariable.rank, null, null, Wildcard.UNBOUND, typeVariable.getTypeAnnotations());
 		}
 
 		public LookupEnvironment environment() {
@@ -556,8 +734,9 @@
         TypeVariableBinding[] variables = this.originalMethod.typeVariables;
         int length = variables.length;
         // check this variable can be substituted given parameterized type
-        if (originalVariable.rank < length && variables[originalVariable.rank] == originalVariable) {
-			return this.typeArguments[originalVariable.rank];
+        if (originalVariable.rank < length && TypeBinding.equalsEquals(variables[originalVariable.rank], originalVariable)) {
+        	TypeBinding substitute = this.typeArguments[originalVariable.rank];
+        	return originalVariable.hasTypeAnnotations() ? this.environment.createAnnotatedType(substitute, originalVariable.getTypeAnnotations()) : substitute;
         }
 	    return originalVariable;
 	}
@@ -569,7 +748,14 @@
 			this.tiebreakMethod = this.originalMethod.asRawMethod(this.environment);
 		return this.tiebreakMethod;
 	}
-		
+
+	@Override
+	public MethodBinding genericMethod() {
+		if (this.isRaw) // mostSpecificMethodBinding() would need inference, but that doesn't work well for raw methods
+			return this; // -> prefer traditional comparison using the substituted method
+		return this.originalMethod;
+	}
+	
 	// AspectJ Extension
 	// delegate to the original method since it might be an intertypemethodbinding ...
 	public boolean alwaysNeedsAccessMethod() { return originalMethod.alwaysNeedsAccessMethod(); }
@@ -578,4 +764,5 @@
 		return originalMethod.getAccessMethod(staticReference);
     }
 	// End AspectJ Extension
-}
\ No newline at end of file
+	
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding.java
index d950f9e..7d70c62 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding.java
@@ -1,23 +1,24 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
  *								bug 186342 - [compiler][null] Using annotations for null checking
  *								bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 425152 - [1.8] [compiler] Lambda Expression not resolved but flow analyzed leading to NPE.
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
 
 /**
@@ -61,6 +62,7 @@
 			for (int i = 0; i < length; i++) { // copy original type variable to relocate
 				TypeVariableBinding originalVariable = originalVariables[i];
 				substitutedVariables[i] = new TypeVariableBinding(originalVariable.sourceName, this, originalVariable.rank, parameterizedDeclaringClass.environment);
+				substitutedVariables[i].tagBits |= (originalVariable.tagBits & (TagBits.AnnotationNullMASK|TagBits.HasNullTypeAnnotation));
 			}
 			this.typeVariables = substitutedVariables;
 
@@ -74,8 +76,9 @@
 				}
 				public TypeBinding substitute(TypeVariableBinding typeVariable) {
 					// check this variable can be substituted given copied variables
-					if (typeVariable.rank < length && originalVariables[typeVariable.rank] == typeVariable) {
-						return substitutedVariables[typeVariable.rank];
+					if (typeVariable.rank < length && TypeBinding.equalsEquals(originalVariables[typeVariable.rank], typeVariable)) {
+						TypeBinding substitute = substitutedVariables[typeVariable.rank];
+						return typeVariable.hasTypeAnnotations() ? environment().createAnnotatedType(substitute, typeVariable.getTypeAnnotations()) : substitute;
 					}
 					if (!isStatic)
 						return parameterizedDeclaringClass.substitute(typeVariable);
@@ -90,25 +93,27 @@
 				TypeBinding substitutedSuperclass = Scope.substitute(substitution, originalVariable.superclass);
 				ReferenceBinding[] substitutedInterfaces = Scope.substitute(substitution, originalVariable.superInterfaces);
 				if (originalVariable.firstBound != null) {
-					substitutedVariable.firstBound = originalVariable.firstBound == originalVariable.superclass
+					TypeBinding firstBound;
+					firstBound = TypeBinding.equalsEquals(originalVariable.firstBound, originalVariable.superclass)
 						? substitutedSuperclass // could be array type or interface
 						: substitutedInterfaces[0];
+					substitutedVariable.setFirstBound(firstBound);
 				}
 				switch (substitutedSuperclass.kind()) {
 					case Binding.ARRAY_TYPE :
-						substitutedVariable.superclass = parameterizedDeclaringClass.environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null);
-						substitutedVariable.superInterfaces = substitutedInterfaces;
+						substitutedVariable.setSuperClass(parameterizedDeclaringClass.environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null));
+						substitutedVariable.setSuperInterfaces(substitutedInterfaces);
 						break;
 					default:
 						if (substitutedSuperclass.isInterface()) {
-							substitutedVariable.superclass = parameterizedDeclaringClass.environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null);
+							substitutedVariable.setSuperClass(parameterizedDeclaringClass.environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null));
 							int interfaceCount = substitutedInterfaces.length;
 							System.arraycopy(substitutedInterfaces, 0, substitutedInterfaces = new ReferenceBinding[interfaceCount+1], 1, interfaceCount);
 							substitutedInterfaces[0] = (ReferenceBinding) substitutedSuperclass;
-							substitutedVariable.superInterfaces = substitutedInterfaces;
+							substitutedVariable.setSuperInterfaces(substitutedInterfaces);
 						} else {
-							substitutedVariable.superclass = (ReferenceBinding) substitutedSuperclass; // typeVar was extending other typeVar which got substituted with interface
-							substitutedVariable.superInterfaces = substitutedInterfaces;
+							substitutedVariable.setSuperClass((ReferenceBinding) substitutedSuperclass); // typeVar was extending other typeVar which got substituted with interface
+							substitutedVariable.setSuperInterfaces(substitutedInterfaces);
 						}
 				}
 			}
@@ -122,14 +127,14 @@
 
 			// after substitution transfer nullness information from type annotations:
 			if (parameterizedDeclaringClass.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled) {
-				long returnNullBits = this.returnType.tagBits & TagBits.AnnotationNullMASK;
+				long returnNullBits = NullAnnotationMatching.validNullTagBits(this.returnType.tagBits);
 				if (returnNullBits != 0L) {
 					this.tagBits &= ~TagBits.AnnotationNullMASK;
 					this.tagBits |= returnNullBits;
 				}
 				int parametersLen = this.parameters.length;
 				for (int i=0; i<parametersLen; i++) {
-					long paramTagBits = this.parameters[i].tagBits & TagBits.AnnotationNullMASK;
+					long paramTagBits = NullAnnotationMatching.validNullTagBits(this.parameters[i].tagBits);
 					if (paramTagBits != 0) {
 						if (this.parameterNonNullness == null)
 							this.parameterNonNullness = new Boolean[parametersLen];
@@ -196,6 +201,7 @@
 							this,
 							originalVariable.rank,
 							environment);
+				substitutedVariables[i].tagBits |= (originalVariable.tagBits & (TagBits.AnnotationNullMASK|TagBits.HasNullTypeAnnotation));
 			}
 			this.typeVariables = substitutedVariables;
 
@@ -209,8 +215,9 @@
 				}
 				public TypeBinding substitute(TypeVariableBinding typeVariable) {
 			        // check this variable can be substituted given copied variables
-			        if (typeVariable.rank < length && originalVariables[typeVariable.rank] == typeVariable) {
-						return substitutedVariables[typeVariable.rank];
+			        if (typeVariable.rank < length && TypeBinding.equalsEquals(originalVariables[typeVariable.rank], typeVariable)) {
+			        	TypeBinding substitute = substitutedVariables[typeVariable.rank];
+						return typeVariable.hasTypeAnnotations() ? environment().createAnnotatedType(substitute, typeVariable.getTypeAnnotations()) : substitute;
 			        }
 			        return typeVariable;
 				}
@@ -223,25 +230,27 @@
 				TypeBinding substitutedSuperclass = Scope.substitute(substitution, originalVariable.superclass);
 				ReferenceBinding[] substitutedInterfaces = Scope.substitute(substitution, originalVariable.superInterfaces);
 				if (originalVariable.firstBound != null) {
-					substitutedVariable.firstBound = originalVariable.firstBound == originalVariable.superclass
+					TypeBinding firstBound;
+					firstBound = TypeBinding.equalsEquals(originalVariable.firstBound, originalVariable.superclass)
 						? substitutedSuperclass // could be array type or interface
 						: substitutedInterfaces[0];
+					substitutedVariable.setFirstBound(firstBound);
 				}
 				switch (substitutedSuperclass.kind()) {
 					case Binding.ARRAY_TYPE :
-						substitutedVariable.superclass = environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null);
-						substitutedVariable.superInterfaces = substitutedInterfaces;
+						substitutedVariable.setSuperClass(environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null));
+						substitutedVariable.setSuperInterfaces(substitutedInterfaces);
 						break;
 					default:
 						if (substitutedSuperclass.isInterface()) {
-							substitutedVariable.superclass = environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null);
+							substitutedVariable.setSuperClass(environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null));
 							int interfaceCount = substitutedInterfaces.length;
 							System.arraycopy(substitutedInterfaces, 0, substitutedInterfaces = new ReferenceBinding[interfaceCount+1], 1, interfaceCount);
 							substitutedInterfaces[0] = (ReferenceBinding) substitutedSuperclass;
-							substitutedVariable.superInterfaces = substitutedInterfaces;
+							substitutedVariable.setSuperInterfaces(substitutedInterfaces);
 						} else {
-							substitutedVariable.superclass = (ReferenceBinding) substitutedSuperclass; // typeVar was extending other typeVar which got substituted with interface
-							substitutedVariable.superInterfaces = substitutedInterfaces;
+							substitutedVariable.setSuperClass((ReferenceBinding) substitutedSuperclass); // typeVar was extending other typeVar which got substituted with interface
+							substitutedVariable.setSuperInterfaces(substitutedInterfaces);
 						}
 				}
 			}
@@ -316,7 +325,7 @@
 	 * Returns true if the return type got substituted.
 	 */
 	public boolean hasSubstitutedReturnType() {
-		return this.returnType != this.originalMethod.returnType;
+		return this.returnType != this.originalMethod.returnType; //$IDENTITY-COMPARISON$
 	}
 
 	/**
@@ -326,7 +335,11 @@
 		return this.originalMethod.original();
 	}
 	
-    // AspectJ Extension - delegate to the original method
+	public MethodBinding shallowOriginal() {
+		return this.originalMethod;
+	}
+	
+	// AspectJ Extension - delegate to the original method
 	
 	public boolean alwaysNeedsAccessMethod() {
 		return originalMethod.alwaysNeedsAccessMethod();
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java
index a233266..60660c6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2013 IBM Corporation and others.
+ * Copyright (c) 2005, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -15,14 +11,40 @@
  *								bug 349326 - [1.7] new warning for missing try-with-resources
  *								bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *								bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415291 - [1.8][null] differentiate type incompatibilities due to null annotations
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 412076 - [compiler] @NonNullByDefault doesn't work for varargs parameter when in generic interface
+ *								Bug 403216 - [1.8][null] TypeReference#captureTypeAnnotations treats type annotations as type argument annotations
+ *								Bug 415850 - [1.8] Ensure RunJDTCoreTests can cope with null annotations enabled
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 416175 - [1.8][compiler][null] NPE with a code snippet that used null annotations on wildcards
+ *								Bug 416174 - [1.8][compiler][null] Bogus name clash error with null annotations
+ *								Bug 416176 - [1.8][compiler][null] null type annotations cause grief on type variables
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 423504 - [1.8] Implement "18.5.3 Functional Interface Parameterization Inference"
+ *								Bug 425278 - [1.8][compiler] Suspect error: The target type of this expression is not a well formed parameterized type due to bound(s) mismatch
+ *								Bug 425798 - [1.8][compiler] Another NPE in ConstraintTypeFormula.reduceSubType
+ *								Bug 425156 - [1.8] Lambda as an argument is flagged with incompatible error
+ *								Bug 426563 - [1.8] AIOOBE when method with error invoked with lambda expression as argument
+ *								Bug 426792 - [1.8][inference][impl] generify new type inference engine
+ *								Bug 428294 - [1.8][compiler] Type mismatch: cannot convert from List<Object> to Collection<Object[]>
+ *								Bug 427199 - [1.8][resource] avoid resource leak warnings on Streams that have no resource
+ *								Bug 416182 - [1.8][compiler][null] Contradictory null annotations not rejected
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 /**
  * A parameterized type encapsulates a type with type arguments,
@@ -43,22 +65,19 @@
 	public ParameterizedTypeBinding(ReferenceBinding type, TypeBinding[] arguments,  ReferenceBinding enclosingType, LookupEnvironment environment){
 		this.environment = environment;
 		this.enclosingType = enclosingType; // never unresolved, never lazy per construction
-//		if (enclosingType != null && enclosingType.isGenericType()) {
-//			RuntimeException e = new RuntimeException("PARAM TYPE with GENERIC ENCLOSING");
-//			e.printStackTrace();
-//			throw e;
-//		}
-//		if (!(type instanceof UnresolvedReferenceBinding) && type.typeVariables() == Binding.NO_TYPE_VARIABLES) {
-//			System.out.println();
-//		}
 		initialize(type, arguments);
 		if (type instanceof UnresolvedReferenceBinding)
 			((UnresolvedReferenceBinding) type).addWrapper(this, environment);
 		if (arguments != null) {
-			for (int i = 0, l = arguments.length; i < l; i++)
+			for (int i = 0, l = arguments.length; i < l; i++) {
 				if (arguments[i] instanceof UnresolvedReferenceBinding)
 					((UnresolvedReferenceBinding) arguments[i]).addWrapper(this, environment);
+				if (arguments[i].hasNullTypeAnnotations())
+					this.tagBits |= TagBits.HasNullTypeAnnotation;
+			}
 		}
+		if (enclosingType != null && enclosingType.hasNullTypeAnnotations())
+			this.tagBits |= TagBits.HasNullTypeAnnotation;
 		this.tagBits |=  TagBits.HasUnresolvedTypeVariables; // cleared in resolve()
 	}
 
@@ -66,10 +85,14 @@
 	 * May return an UnresolvedReferenceBinding.
 	 * @see ParameterizedTypeBinding#genericType()
 	 */
-	protected ReferenceBinding actualType() {
+	public ReferenceBinding actualType() {
 		return this.type;
 	}
 
+	public boolean isParameterizedType() {
+		return true;
+	}
+
 	/**
 	 * Iterate type arguments, and validate them according to corresponding variable bounds.
 	 */
@@ -116,12 +139,16 @@
 		for (int i = 0; i < length; i++) {
 			TypeBinding argument = originalArguments[i];
 			if (argument.kind() == Binding.WILDCARD_TYPE) { // no capture for intersection types
-				capturedArguments[i] = new CaptureBinding((WildcardBinding) argument, contextType, position, scope.compilationUnitScope().nextCaptureID());
+				final WildcardBinding wildcard = (WildcardBinding) argument;
+				if (wildcard.boundKind == Wildcard.SUPER && wildcard.bound.id == TypeIds.T_JavaLangObject)
+					capturedArguments[i] = wildcard.bound;
+				else
+					capturedArguments[i] = new CaptureBinding(wildcard, contextType, position, scope.compilationUnitScope().nextCaptureID());
 			} else {
 				capturedArguments[i] = argument;
 			}
 		}
-		ParameterizedTypeBinding capturedParameterizedType = this.environment.createParameterizedType(this.type, capturedArguments, enclosingType());
+		ParameterizedTypeBinding capturedParameterizedType = this.environment.createParameterizedType(this.type, capturedArguments, enclosingType(), this.typeAnnotations);
 		for (int i = 0; i < length; i++) {
 			TypeBinding argument = capturedArguments[i];
 			if (argument.isCapture()) {
@@ -130,6 +157,23 @@
 		}
 		return capturedParameterizedType;
 	}
+	
+	/**
+	 * Perform capture deconversion for a parameterized type with captured wildcard arguments
+	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#uncapture(Scope)
+	 */
+	public TypeBinding uncapture(Scope scope) {
+		if ((this.tagBits & TagBits.HasCapturedWildcard) == 0)
+			return this;
+
+		int length = this.arguments == null ? 0 : this.arguments.length;
+		TypeBinding[] freeTypes = new TypeBinding[length];
+
+		for (int i = 0; i < length; i++) {
+			freeTypes[i] = this.arguments[i].uncapture(scope);
+		}
+		return scope.environment().createParameterizedType(this.type, freeTypes, (ReferenceBinding) (this.enclosingType != null ? this.enclosingType.uncapture(scope) : null), this.typeAnnotations);
+	}
 
 	/**
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#collectMissingTypes(java.util.List)
@@ -296,7 +340,7 @@
 		    sig.append('>');
 		}
 		sig.append(';');
-		if (captureSourceType != null && captureSourceType != this.type) {
+		if (captureSourceType != null && TypeBinding.notEquals(captureSourceType, this.type)) {
 			// contains a capture binding
 			sig.insert(0, "&"); //$NON-NLS-1$
 			sig.insert(0, captureSourceType.computeUniqueKey(false/*not a leaf*/));
@@ -314,32 +358,27 @@
 	public char[] constantPoolName() {
 		return this.type.constantPoolName(); // erasure
 	}
+	
+	public TypeBinding clone(TypeBinding outerType) {
+		return new ParameterizedTypeBinding(this.type, this.arguments, (ReferenceBinding) outerType, this.environment);
+	}
 
 	public ParameterizedMethodBinding createParameterizedMethod(MethodBinding originalMethod) {
 		return new ParameterizedMethodBinding(this, originalMethod);
 	}
-
 	/**
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#debugName()
 	 */
 	public String debugName() {
-	    StringBuffer nameBuffer = new StringBuffer(10);
-	    if (this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled) {
-	    	// restore applied null annotation from tagBits:
-		    if ((this.tagBits & TagBits.AnnotationNonNull) != 0) {
-		    	char[][] nonNullAnnotationName = environment().getNonNullAnnotationName();
-				nameBuffer.append('@').append(nonNullAnnotationName[nonNullAnnotationName.length-1]).append(' ');
-		    } else if ((this.tagBits & TagBits.AnnotationNullable) != 0) {
-		    	char[][] nullableAnnotationName = environment().getNullableAnnotationName();
-				nameBuffer.append('@').append(nullableAnnotationName[nullableAnnotationName.length-1]).append(' ');
-		    }
-	    }
+	    if (this.hasTypeAnnotations())
+	    	return annotatedDebugName();
+		StringBuffer nameBuffer = new StringBuffer(10);	
 	    if (this.type instanceof UnresolvedReferenceBinding) {
 	    	nameBuffer.append(this.type);
 	    } else {
 			nameBuffer.append(this.type.sourceName());
 	    }
-		if (this.arguments != null && this.arguments.length > 0) { // empty arguments array happens when PTB has been created just to capture type annotations
+		if (this.arguments != null && this.arguments.length > 0) {
 			nameBuffer.append('<');
 		    for (int i = 0, length = this.arguments.length; i < length; i++) {
 		        if (i > 0) nameBuffer.append(',');
@@ -349,6 +388,19 @@
 		}
 	    return nameBuffer.toString();
 	}
+	
+	public String annotatedDebugName() {
+		StringBuffer nameBuffer = new StringBuffer(super.annotatedDebugName());
+		if (this.arguments != null && this.arguments.length > 0) {
+			nameBuffer.append('<');
+			for (int i = 0, length = this.arguments.length; i < length; i++) {
+				if (i > 0) nameBuffer.append(',');
+				nameBuffer.append(this.arguments[i].annotatedDebugName());
+			}
+			nameBuffer.append('>');
+		}
+		return nameBuffer.toString();
+	}
 
 	/**
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding#enclosingType()
@@ -478,7 +530,7 @@
 					if (method.parameters.length == argCount) {
 						TypeBinding[] toMatch = method.parameters;
 						for (int iarg = 0; iarg < argCount; iarg++)
-							if (toMatch[iarg] != argumentTypes[iarg])
+							if (TypeBinding.notEquals(toMatch[iarg], argumentTypes[iarg]))
 								continue nextMethod;
 						if (match != null) return null; // collision case
 						match = method;
@@ -492,7 +544,7 @@
 				TypeBinding[] toMatch = method.parameters;
 				if (toMatch.length == argCount) {
 					for (int p = 0; p < argCount; p++)
-						if (toMatch[p] != argumentTypes[p])
+						if (TypeBinding.notEquals(toMatch[p], argumentTypes[p]))
 							continue nextMethod;
 						if (match != null) return null; // collision case
 						match = method;
@@ -520,7 +572,7 @@
 					if (method.parameters.length == argCount) {
 						TypeBinding[] toMatch = method.parameters;
 						for (int iarg = 0; iarg < argCount; iarg++)
-							if (toMatch[iarg] != argumentTypes[iarg])
+							if (TypeBinding.notEquals(toMatch[iarg], argumentTypes[iarg]))
 								continue nextMethod;
 						if (match != null) return null; // collision case
 						match = method;
@@ -535,7 +587,7 @@
 				TypeBinding[] toMatch = method.parameters;
 				if (toMatch.length == argCount) {
 					for (int p = 0; p < argCount; p++)
-						if (toMatch[p] != argumentTypes[p])
+						if (TypeBinding.notEquals(toMatch[p], argumentTypes[p]))
 							continue nextMethod;
 						if (match != null) return null; // collision case
 						match = method;
@@ -615,9 +667,14 @@
 		    if (length == 0) return Binding.NO_METHODS;
 
 		    parameterizedMethods = new MethodBinding[length];
-		    for (int i = 0; i < length; i++)
+		    CompilerOptions options = this.environment.globalOptions;
+			boolean useNullTypeAnnotations = options.isAnnotationBasedNullAnalysisEnabled && options.sourceLevel >= ClassFileConstants.JDK1_8;
+		    for (int i = 0; i < length; i++) {
 		    	// substitute methods, so as to get updated declaring class at least
 	            parameterizedMethods[i] = createParameterizedMethod(originalMethods[i]);
+	            if (useNullTypeAnnotations)
+	            	parameterizedMethods[i] = NullAnnotationMatching.checkForContraditions(parameterizedMethods[i], null, null);
+		    }
 		    if (this.methods == null) {
 				MethodBinding[] temp = new MethodBinding[length];
 				System.arraycopy(parameterizedMethods, 0, temp, 0, length);
@@ -678,7 +735,7 @@
 			this.modifiers |= ExtraCompilerModifiers.AccGenericSignature;
 		} else if (this.enclosingType != null) {
 			this.modifiers |= (this.enclosingType.modifiers & ExtraCompilerModifiers.AccGenericSignature);
-			this.tagBits |= this.enclosingType.tagBits & (TagBits.HasTypeVariable | TagBits.HasMissingType);
+			this.tagBits |= this.enclosingType.tagBits & (TagBits.HasTypeVariable | TagBits.HasMissingType | TagBits.HasCapturedWildcard);
 		}
 		if (someArguments != null) {
 			this.arguments = someArguments;
@@ -698,10 +755,12 @@
 						this.tagBits |= TagBits.IsBoundParameterizedType;
 						break;
 				}
-				this.tagBits |= someArgument.tagBits & (TagBits.HasTypeVariable | TagBits.HasMissingType | TagBits.ContainsNestedTypeReferences);
+				this.tagBits |= someArgument.tagBits & (TagBits.HasTypeVariable | TagBits.HasMissingType | TagBits.ContainsNestedTypeReferences | TagBits.HasCapturedWildcard);
 			}
 		}
-		this.tagBits |= someType.tagBits & (TagBits.IsLocalType| TagBits.IsMemberType | TagBits.IsNestedType | TagBits.HasMissingType | TagBits.ContainsNestedTypeReferences | TagBits.AnnotationNullMASK);
+		this.tagBits |= someType.tagBits & (TagBits.IsLocalType| TagBits.IsMemberType | TagBits.IsNestedType | TagBits.ContainsNestedTypeReferences
+				 | TagBits.HasMissingType | TagBits.AnnotationNullMASK
+				 | TagBits.AnnotationNonNullByDefault | TagBits.AnnotationNullUnspecifiedByDefault | TagBits.HasCapturedWildcard);
 		this.tagBits &= ~(TagBits.AreFieldsComplete|TagBits.AreMethodsComplete);
 	}
 
@@ -712,9 +771,16 @@
 	void initializeForStaticImports() {
 		this.type.initializeForStaticImports();
 	}
+	
+	/**
+	 *  Returns true if parameterized type AND not of the form List<?>
+	 */
+	public boolean isBoundParameterizedType() {
+		return (this.tagBits & TagBits.IsBoundParameterizedType) != 0;
+	}
 
 	public boolean isEquivalentTo(TypeBinding otherType) {
-		if (this == otherType)
+		if (equalsEquals(this, otherType))
 		    return true;
 	    if (otherType == null)
 	        return false;
@@ -726,7 +792,7 @@
 
 	    	case Binding.PARAMETERIZED_TYPE :
 	            ParameterizedTypeBinding otherParamType = (ParameterizedTypeBinding) otherType;
-	            if (this.type != otherParamType.type)
+	            if (TypeBinding.notEquals(this.type, otherParamType.type)) 
 	                return false;
 	            if (!isStatic()) { // static member types do not compare their enclosing
 	            	ReferenceBinding enclosing = enclosingType();
@@ -734,7 +800,7 @@
 	            		ReferenceBinding otherEnclosing = otherParamType.enclosingType();
 	            		if (otherEnclosing == null) return false;
 	            		if ((otherEnclosing.tagBits & TagBits.HasDirectWildcard) == 0) {
-							if (enclosing != otherEnclosing) return false;
+							if (TypeBinding.notEquals(enclosing, otherEnclosing)) return false;
 	            		} else {
 	            			if (!enclosing.isEquivalentTo(otherParamType.enclosingType())) return false;
 	            		}
@@ -753,7 +819,7 @@
 	            return true;
 
 	    	case Binding.RAW_TYPE :
-	            return erasure() == otherType.erasure();
+	            return TypeBinding.equalsEquals(erasure(), otherType.erasure());
 	    }
 	    /* With the hybrid 1.4/1.5+ projects modes, while establishing type equivalence, we need to
 	       be prepared for a type such as Map appearing in one of three forms: As (a) a ParameterizedTypeBinding 
@@ -762,7 +828,7 @@
 	       on whether the underlying type was "seen to be" a generic type in the particular build environment or
 	       not. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=328827 
 	     */
-	    if (erasure() == otherType) {
+	    if (TypeBinding.equalsEquals(erasure(), otherType)) {
 	    	return true;
 	    }
 	    return false;
@@ -772,6 +838,34 @@
 		return this.superclass != null && this.superInterfaces != null;
 	}
 
+	public boolean isProperType(boolean admitCapture18) {
+		if (this.arguments != null) {
+			for (int i = 0; i < this.arguments.length; i++)
+				if (!this.arguments[i].isProperType(admitCapture18))
+					return false;
+		}
+		return super.isProperType(admitCapture18);
+	}
+
+	TypeBinding substituteInferenceVariable(InferenceVariable var, TypeBinding substituteType) {
+		if (this.arguments != null) {
+			TypeBinding[] newArgs = null;
+			int length = this.arguments.length;
+			for (int i = 0; i < length; i++) {
+				TypeBinding oldArg = this.arguments[i];
+				TypeBinding newArg = oldArg.substituteInferenceVariable(var, substituteType);
+				if (TypeBinding.notEquals(newArg, oldArg)) {
+					if (newArgs == null)
+						System.arraycopy(this.arguments, 0, newArgs = new TypeBinding[length], 0, length); 
+					newArgs[i] = newArg;
+				}
+			}
+			if (newArgs != null)
+				return this.environment.createParameterizedType(this.type, newArgs, this.enclosingType);
+		}
+		return this;
+	}
+
 	/**
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Substitution#isRawSubstitution()
 	 */
@@ -779,6 +873,10 @@
 		return isRawType();
 	}
 
+	public TypeBinding unannotated() {
+		return this.hasTypeAnnotations() ? this.environment.getUnannotatedType(this) : this;
+	}
+
 	public int kind() {
 		return PARAMETERIZED_TYPE;
 	}
@@ -808,6 +906,29 @@
 		return this.memberTypes;
 	}
 
+	public boolean mentionsAny(TypeBinding[] parameters, int idx) {
+		if (super.mentionsAny(parameters, idx))
+			return true;
+		if (this.arguments != null) {
+			int len = this.arguments.length;
+			for (int i = 0; i < len; i++) {
+				if (TypeBinding.notEquals(this.arguments[i], this) && this.arguments[i].mentionsAny(parameters, idx))
+					return true;
+			}
+		}
+		return false;
+	}
+
+	void collectInferenceVariables(Set<InferenceVariable> variables) {
+		if (this.arguments != null) {
+			int len = this.arguments.length;
+			for (int i = 0; i < len; i++) {
+				if (TypeBinding.notEquals(this.arguments[i], this))
+					this.arguments[i].collectInferenceVariables(variables);
+			}
+		}
+	}
+
 	/**
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding#methods()
 	 */
@@ -819,9 +940,15 @@
 		    MethodBinding[] originalMethods = this.type.methods();
 		    int length = originalMethods.length;
 		    MethodBinding[] parameterizedMethods = new MethodBinding[length];
-		    for (int i = 0; i < length; i++)
+		    CompilerOptions options = this.environment.globalOptions;
+			boolean useNullTypeAnnotations = options.isAnnotationBasedNullAnalysisEnabled && options.sourceLevel >= ClassFileConstants.JDK1_8;
+		    for (int i = 0; i < length; i++) {
 		    	// substitute all methods, so as to get updated declaring class at least
 	            parameterizedMethods[i] = createParameterizedMethod(originalMethods[i]);
+	            if (useNullTypeAnnotations)
+	            	parameterizedMethods[i] = NullAnnotationMatching.checkForContraditions(parameterizedMethods[i], null, null);
+		    }
+
 		    this.methods = parameterizedMethods;
 		} finally {
 			// if the original methods cannot be retrieved (ex. AbortCompilation), then assume we do not have any methods
@@ -950,6 +1077,82 @@
 	}
 
 	/**
+	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#nullAnnotatedReadableName(CompilerOptions,boolean)
+	 */
+	public char[] nullAnnotatedReadableName(CompilerOptions options, boolean shortNames) {
+		if (shortNames)
+			return nullAnnotatedShortReadableName(options);
+		return nullAnnotatedReadableName(options);
+	}
+
+	char[] nullAnnotatedReadableName(CompilerOptions options) {
+	    StringBuffer nameBuffer = new StringBuffer(10);
+		if (isMemberType()) {
+			nameBuffer.append(enclosingType().nullAnnotatedReadableName(options, false));
+			nameBuffer.append('.');
+			appendNullAnnotation(nameBuffer, options);
+			nameBuffer.append(this.sourceName);
+		} else if (this.type.compoundName != null) {
+			int i;
+			int l=this.type.compoundName.length;
+			for (i=0; i<l-1; i++) {
+				nameBuffer.append(this.type.compoundName[i]);
+				nameBuffer.append('.');
+			}
+		    appendNullAnnotation(nameBuffer, options);
+			nameBuffer.append(this.type.compoundName[i]);
+		} else {
+			// case of TypeVariableBinding with nullAnnotationTagBits:
+			appendNullAnnotation(nameBuffer, options);
+			if (this.type.sourceName != null)
+				nameBuffer.append(this.type.sourceName);
+			else // WildcardBinding, CaptureBinding have no sourceName
+				nameBuffer.append(this.type.readableName());
+		}
+		if (this.arguments != null && this.arguments.length > 0) { // empty arguments array happens when PTB has been created just to capture type annotations
+			nameBuffer.append('<');
+		    for (int i = 0, length = this.arguments.length; i < length; i++) {
+		        if (i > 0) nameBuffer.append(',');
+		        nameBuffer.append(this.arguments[i].nullAnnotatedReadableName(options, false));
+		    }
+		    nameBuffer.append('>');
+		}
+		int nameLength = nameBuffer.length();
+		char[] readableName = new char[nameLength];
+		nameBuffer.getChars(0, nameLength, readableName, 0);
+	    return readableName;
+	}
+
+	char[] nullAnnotatedShortReadableName(CompilerOptions options) {
+	    StringBuffer nameBuffer = new StringBuffer(10);
+		if (isMemberType()) {
+			nameBuffer.append(enclosingType().nullAnnotatedReadableName(options, true));
+			nameBuffer.append('.');
+			appendNullAnnotation(nameBuffer, options);
+			nameBuffer.append(this.sourceName);
+		} else {
+			appendNullAnnotation(nameBuffer, options);
+			if (this.type.sourceName != null)
+				nameBuffer.append(this.type.sourceName);
+			else // WildcardBinding, CaptureBinding have no sourceName
+				nameBuffer.append(this.type.shortReadableName());
+		}
+		if (this.arguments != null && this.arguments.length > 0) { // empty arguments array happens when PTB has been created just to capture type annotations
+			nameBuffer.append('<');
+		    for (int i = 0, length = this.arguments.length; i < length; i++) {
+		        if (i > 0) nameBuffer.append(',');
+		        nameBuffer.append(this.arguments[i].nullAnnotatedReadableName(options, true));
+		    }
+		    nameBuffer.append('>');
+		}
+		int nameLength = nameBuffer.length();
+		char[] shortReadableName = new char[nameLength];
+		nameBuffer.getChars(0, nameLength, shortReadableName, 0);
+	    return shortReadableName;
+	}
+
+
+	/**
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#signature()
 	 */
 	public char[] signature() {
@@ -976,15 +1179,16 @@
 			TypeVariableBinding[] typeVariables = currentType.type.typeVariables();
 			int length = typeVariables.length;
 			// check this variable can be substituted given parameterized type
-			if (originalVariable.rank < length && typeVariables[originalVariable.rank] == originalVariable) {
+			if (originalVariable.rank < length && TypeBinding.equalsEquals(typeVariables[originalVariable.rank], originalVariable)) {
 			    // lazy init, since cannot do so during binding creation if during supertype connection
 			    if (currentType.arguments == null)
 					currentType.initializeArguments(); // only for raw types
 			    if (currentType.arguments != null) {
 			    	 if (currentType.arguments.length == 0) { // diamond type
 					    	return originalVariable;
-					    }
-			    	 return currentType.arguments[originalVariable.rank];
+					 }
+			    	 TypeBinding substitute = currentType.arguments[originalVariable.rank];
+			    	 return originalVariable.hasTypeAnnotations() ? this.environment.createAnnotatedType(substitute, originalVariable.getTypeAnnotations()) : substitute;
 			    }	
 			}
 			// recurse on enclosing type, as it may hold more substitutions to perform
@@ -1006,6 +1210,9 @@
 	        ReferenceBinding genericSuperclass = this.type.superclass();
 	        if (genericSuperclass == null) return null; // e.g. interfaces
 		    this.superclass = (ReferenceBinding) Scope.substitute(this, genericSuperclass);
+			this.typeBits |= (this.superclass.typeBits & TypeIds.InheritableBits);
+			if ((this.typeBits & (TypeIds.BitAutoCloseable|TypeIds.BitCloseable)) != 0) // avoid the side-effects of hasTypeBit()! 
+				this.typeBits |= applyCloseableClassWhitelists();
 	    }
 		return this.superclass;
 	}
@@ -1015,16 +1222,23 @@
 	 */
 	public ReferenceBinding[] superInterfaces() {
 	    if (this.superInterfaces == null) {
-	    		if (this.type.isHierarchyBeingConnected())
-	    			return Binding.NO_SUPERINTERFACES; // prevent superinterfaces from being assigned before they are connected
-	    		this.superInterfaces = Scope.substitute(this, this.type.superInterfaces());
+    		if (this.type.isHierarchyBeingConnected())
+    			return Binding.NO_SUPERINTERFACES; // prevent superinterfaces from being assigned before they are connected
+    		this.superInterfaces = Scope.substitute(this, this.type.superInterfaces());
+    		if (this.superInterfaces != null) {
+	    		for (int i = this.superInterfaces.length; --i >= 0;) {
+	    			this.typeBits |= (this.superInterfaces[i].typeBits & TypeIds.InheritableBits);
+	    			if ((this.typeBits & (TypeIds.BitAutoCloseable|TypeIds.BitCloseable)) != 0) // avoid the side-effects of hasTypeBit()! 
+	    				this.typeBits |= applyCloseableInterfaceWhitelists();
+	    		}
+    		}
 	    }
 		return this.superInterfaces;
 	}
 
 	public void swapUnresolved(UnresolvedReferenceBinding unresolvedType, ReferenceBinding resolvedType, LookupEnvironment env) {
 		boolean update = false;
-		if (this.type == unresolvedType) {
+		if (this.type == unresolvedType) { //$IDENTITY-COMPARISON$
 			this.type = resolvedType; // cannot be raw since being parameterized below
 			update = true;
 			ReferenceBinding enclosing = resolvedType.enclosingType();
@@ -1034,7 +1248,7 @@
 		}
 		if (this.arguments != null) {
 			for (int i = 0, l = this.arguments.length; i < l; i++) {
-				if (this.arguments[i] == unresolvedType) {
+				if (this.arguments[i] == unresolvedType) { //$IDENTITY-COMPARISON$
 					this.arguments[i] = env.convertUnresolvedBinaryToRawType(resolvedType);
 					update = true;
 				}
@@ -1062,8 +1276,11 @@
 	 * @see java.lang.Object#toString()
 	 */
 	public String toString() {
-	    StringBuffer buffer = new StringBuffer(30);
-	    if (this.type instanceof UnresolvedReferenceBinding) {
+		if (this.hasTypeAnnotations()) {
+			return annotatedDebugName();
+		}
+		StringBuffer buffer = new StringBuffer(30);
+		if (this.type instanceof UnresolvedReferenceBinding) {
 	    	buffer.append(debugName());
 	    } else {
 			if (isDeprecated()) buffer.append("deprecated "); //$NON-NLS-1$
@@ -1145,62 +1362,124 @@
 		return Binding.NO_TYPE_VARIABLES;
 	}
 	
+	public TypeBinding[] typeArguments() {
+		return this.arguments;
+	}
+	
 	public FieldBinding[] unResolvedFields() {
 		return this.fields;
 	}
-	public MethodBinding getSingleAbstractMethod(final Scope scope) {
+	public MethodBinding getSingleAbstractMethod(final Scope scope, boolean replaceWildcards) {
+		int index = replaceWildcards ? 0 : 1;
 		if (this.singleAbstractMethod != null) {
-			return this.singleAbstractMethod;
+			if (this.singleAbstractMethod[index] != null)
+			return this.singleAbstractMethod[index];
+		} else {
+			this.singleAbstractMethod = new MethodBinding[2];
 		}
+		if (!isValidBinding())
+			return null;
 		final ReferenceBinding genericType = genericType();
-		MethodBinding theAbstractMethod = genericType.getSingleAbstractMethod(scope);
+		MethodBinding theAbstractMethod = genericType.getSingleAbstractMethod(scope, replaceWildcards);
 		if (theAbstractMethod == null || !theAbstractMethod.isValidBinding())
-			return this.singleAbstractMethod = theAbstractMethod;
+			return this.singleAbstractMethod[index] = theAbstractMethod;
 		
-		TypeBinding [] typeArguments = this.arguments; // A1 ... An 
-		TypeVariableBinding [] typeParameters = genericType.typeVariables(); // P1 ... Pn
-		TypeBinding [] types = new TypeBinding[typeArguments.length];  // T1 ... Tn
-		for (int i = 0, length = typeArguments.length; i < length; i++) {
-			TypeBinding typeArgument = typeArguments[i];
-			switch (typeArgument.kind()) {
-				case Binding.WILDCARD_TYPE :
-					WildcardBinding wildcard = (WildcardBinding) typeArgument;
-					switch(wildcard.boundKind) {
-	    				case Wildcard.EXTENDS :
-	    				case Wildcard.SUPER :
-	    					types[i] = wildcard.bound;
-	    					break;
-	    				case Wildcard.UNBOUND :
-	    					// if Pi has upper bound Bi that mentions none of P1...Pn, then Ti = Bi; otherwise, Ti = Object
-	    					final TypeBinding upperBound = typeParameters[i].firstBound;
-							if (upperBound == null || typeParametersMentioned(upperBound)) {
-	    						types[i] = scope.getJavaLangObject();
-	    					} else {
-	    						types[i] = upperBound;
-	    					}
-	    					break;
-					}
-					break;
-				default :
-					types[i] = typeArgument;
-					break;
-			}
-			if (typeParameters[i].boundCheck(null, types[i], scope) != TypeConstants.OK)
-				return this.singleAbstractMethod = new ProblemMethodBinding(TypeConstants.ANONYMOUS_METHOD, null, ProblemReasons.NotAWellFormedParameterizedType);
+		ParameterizedTypeBinding declaringType = null;
+		TypeBinding [] types = this.arguments; 
+		if (replaceWildcards) {
+			types = getNonWildcardParameterization(scope);
+			if (types == null)
+				return this.singleAbstractMethod[index] = new ProblemMethodBinding(TypeConstants.ANONYMOUS_METHOD, null, ProblemReasons.NotAWellFormedParameterizedType);
+		} else if (types == null) {
+			types = NO_TYPES;
 		}
-		ReferenceBinding declaringType = scope.environment().createParameterizedType(genericType, types, genericType.enclosingType());
-		declaringType = (ReferenceBinding) declaringType.findSuperTypeOriginatingFrom(theAbstractMethod.declaringClass);
-		MethodBinding [] choices = declaringType.getMethods(theAbstractMethod.selector);
+		declaringType = scope.environment().createParameterizedType(genericType, types, genericType.enclosingType());
+		TypeVariableBinding [] typeParameters = genericType.typeVariables();
+		for (int i = 0, length = typeParameters.length; i < length; i++) {
+			if (typeParameters[i].boundCheck(declaringType, types[i], scope) != TypeConstants.OK)
+				return this.singleAbstractMethod[index] = new ProblemMethodBinding(TypeConstants.ANONYMOUS_METHOD, null, ProblemReasons.NotAWellFormedParameterizedType);			
+		}
+		ReferenceBinding substitutedDeclaringType = (ReferenceBinding) declaringType.findSuperTypeOriginatingFrom(theAbstractMethod.declaringClass);
+		MethodBinding [] choices = substitutedDeclaringType.getMethods(theAbstractMethod.selector);
 		for (int i = 0, length = choices.length; i < length; i++) {
 			MethodBinding method = choices[i];
 			if (!method.isAbstract() || method.redeclaresPublicObjectMethod(scope)) continue; // (re)skip statics, defaults, public object methods ...
-			this.singleAbstractMethod = method;
+			this.singleAbstractMethod[index] = method;
 			break;
 		}
-		return this.singleAbstractMethod;
+		return this.singleAbstractMethod[index];
 	}
 
-	private boolean typeParametersMentioned(TypeBinding upperBound) {
+	// from JLS 9.8
+	public TypeBinding[] getNonWildcardParameterization(Scope scope) {
+		// precondition: isValidBinding()
+		TypeBinding[] typeArguments = this.arguments; 							// A1 ... An
+		if (typeArguments == null)
+			return NO_TYPES;
+		TypeVariableBinding[] typeParameters = genericType().typeVariables(); 	// P1 ... Pn
+		TypeBinding[] types = new TypeBinding[typeArguments.length];  			// T1 ... Tn
+		for (int i = 0, length = typeArguments.length; i < length; i++) {
+			TypeBinding typeArgument = typeArguments[i];
+			if (typeArgument.kind() == Binding.WILDCARD_TYPE) {
+				if (typeParameters[i].mentionsAny(typeParameters, i))
+					return null;
+				WildcardBinding wildcard = (WildcardBinding) typeArgument;
+				switch(wildcard.boundKind) {
+					case Wildcard.EXTENDS :
+						// If Ai is a upper-bounded wildcard ? extends Ui, then Ti = glb(Ui, Bi).
+						// Note: neither Ui nor Bi is necessarily scalar -> need to collect all bounds
+						TypeBinding[] otherUBounds = wildcard.otherBounds;
+						TypeBinding[] otherBBounds = typeParameters[i].otherUpperBounds();
+						int len = 1 + (otherUBounds != null ? otherUBounds.length : 0) + otherBBounds.length;
+						if (typeParameters[i].firstBound != null)
+							len++;
+						TypeBinding[] allBounds = new TypeBinding[len]; // TypeBinding so that in this round we accept ArrayBinding, too.
+						int idx = 0;
+						// Ui
+						allBounds[idx++] = wildcard.bound;
+						if (otherUBounds != null)
+							for (int j = 0; j < otherUBounds.length; j++)
+								allBounds[idx++] = otherUBounds[j];
+						// Bi
+						if (typeParameters[i].firstBound != null)
+							allBounds[idx++] = typeParameters[i].firstBound;
+						for (int j = 0; j < otherBBounds.length; j++)
+							allBounds[idx++] = otherBBounds[j];
+						TypeBinding[] glb = Scope.greaterLowerBound(allBounds, null, this.environment);
+						if (glb == null || glb.length == 0) {
+							return null;
+						} else if (glb.length == 1) {
+							types[i] = glb[0];
+						} else {
+							try {
+								ReferenceBinding[] refs = new ReferenceBinding[glb.length];
+								System.arraycopy(glb, 0, refs, 0, glb.length); // TODO: if an array type plus more types get here, we get ArrayStoreException!
+								types[i] = new IntersectionCastTypeBinding(refs, this.environment);
+							} catch (ArrayStoreException ase) {
+								scope.problemReporter().genericInferenceError("Cannot compute glb of "+Arrays.toString(glb), null); //$NON-NLS-1$
+								return null;
+							}
+						}
+						break;
+					case Wildcard.SUPER :
+						// If Ai is a lower-bounded wildcard ? super Li, then Ti = Li.
+						types[i] = wildcard.bound;
+						break;
+					case Wildcard.UNBOUND :
+						// If Ai is an unbound wildcard ?, then Ti = Bi.
+						types[i] = typeParameters[i].firstBound;
+						if (types[i] == null)
+							types[i] = typeParameters[i].superclass; // assumably j.l.Object?
+						break;
+				}
+			} else {
+				// If Ai is a type, then Ti = Ai.
+				types[i] = typeArgument;
+			}
+		}
+		return types;
+	}
+	static boolean typeParametersMentioned(TypeBinding upperBound) {
 		class MentionListener extends TypeBindingVisitor {
 			private boolean typeParametersMentioned = false;
 			public boolean visit(TypeVariableBinding typeVariable) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.java
index a22cd25..0ca089e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.java
@@ -1,16 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								Bug 428811 - [1.8][compiler] Type witness unnecessarily required
  *******************************************************************************/
 
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
@@ -20,6 +18,7 @@
 public class PolyTypeBinding extends TypeBinding {
 
 	Expression expression;
+	boolean vanillaCompatibilty = true;
 	
 	public PolyTypeBinding(Expression expression) {
 		this.expression = expression;
@@ -34,7 +33,7 @@
 	}
 
 	public boolean isCompatibleWith(TypeBinding left, Scope scope) {
-		return this.expression.isCompatibleWith(left, scope);
+		return this.vanillaCompatibilty ? this.expression.isCompatibleWith(left, scope) : this.expression.isBoxingCompatibleWith(left, scope);
 	}
 
 	public char[] qualifiedSourceName() {
@@ -49,6 +48,10 @@
 		return this.expression.printExpression(0,  new StringBuffer()).toString().toCharArray();
 	}
 	
+	public boolean sIsMoreSpecific(TypeBinding s, TypeBinding t, Scope scope) {
+		return this.expression.sIsMoreSpecific(s, t, scope);
+	}
+	
 	public String toString() {
 		StringBuffer buffer = new StringBuffer("PolyTypeBinding for: "); //$NON-NLS-1$
 		return this.expression.printExpression(0,  buffer).toString();
@@ -57,4 +60,10 @@
 	public int kind() {
 		return Binding.POLY_TYPE;
 	}
+
+	public TypeBinding computeBoxingType() {
+		PolyTypeBinding type = new PolyTypeBinding(this.expression);
+		type.vanillaCompatibilty = !this.vanillaCompatibilty;
+		return type;
+	}
 }
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolymorphicMethodBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolymorphicMethodBinding.java
index 5c0241e..8d69c4e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolymorphicMethodBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/PolymorphicMethodBinding.java
@@ -56,7 +56,7 @@
 			return false;
 		}
 		for (int j = 0; j < cachedParametersLength; j++){
-			if (this.parameters[j] != matchingParameters[j]) {
+			if (TypeBinding.notEquals(this.parameters[j], matchingParameters[j])) {
 				return false;
 			}
 		}
@@ -67,7 +67,7 @@
 			}
 		} else if (cachedReturnType == null) {
 			return false;
-		} else if (matchingReturnType != cachedReturnType) {
+		} else if (TypeBinding.notEquals(matchingReturnType, cachedReturnType)) {
 			return false;
 		}
 		// all arguments match
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemMethodBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemMethodBinding.java
index d75941f..bde74a8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemMethodBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemMethodBinding.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
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -14,6 +16,7 @@
 
 	private int problemReason;
 	public MethodBinding closestMatch; // TODO (philippe) should rename into #alternateMatch
+	public InferenceContext18 inferenceContext; // inference context may help to coordinate error reporting
 
 public ProblemMethodBinding(char[] selector, TypeBinding[] args, int problemReason) {
 	this.selector = selector;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReasons.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReasons.java
index f74e8c7..0d540e5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReasons.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReasons.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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 @@
  *								bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
  *	   Stephan Herrmann - Contribution for
  *								bug 404649 - [1.8][compiler] detect illegal reference to indirect or redundant super
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 416182 - [1.8][compiler][null] Contradictory null annotations not rejected
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -37,4 +39,8 @@
 	final int IntersectionHasMultipleFunctionalInterfaces = 19;
 	final int NonStaticOrAlienTypeReceiver = 20;
 	final int AttemptToBypassDirectSuper = 21; // super access within default method
+	final int DefectiveContainerAnnotationType = 22;
+	final int ParameterizedMethodExpectedTypeProblem = 23;
+	final int ApplicableMethodOverriddenByInapplicable = 24;
+	final int ContradictoryNullAnnotations = 25;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.java
index 71c1a51..fd88254 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.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
@@ -15,6 +15,7 @@
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 
+@SuppressWarnings("rawtypes")
 public class ProblemReferenceBinding extends ReferenceBinding {
 	ReferenceBinding closestMatch;
 	private int problemReason;
@@ -27,6 +28,9 @@
 	this.problemReason = problemReason;
 }
 
+public TypeBinding clone(TypeBinding enclosingType) {
+	throw new IllegalStateException(); // shouldn't get here.
+}
 /**
  * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#closestMatch()
  */
@@ -77,6 +81,9 @@
 	return "unknown"; //$NON-NLS-1$
 }
 
+public void setTypeAnnotations(AnnotationBinding[] annotations, boolean evalNullAnnotations) {
+	return; // reject misguided attempts.
+}
 /**
  * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding#shortReadableName()
  */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.java
index 6a13b33..13317d5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.java
@@ -1,16 +1,18 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 416174 - [1.8][compiler][null] Bogus name clash error with null annotations
+ *								Bug 416176 - [1.8][compiler][null] null type annotations cause grief on type variables
+ *								Bug 423504 - [1.8] Implement "18.5.3 Functional Interface Parameterization Inference"
+ *								Bug 425783 - An internal error occurred during: "Requesting Java AST from selection". java.lang.StackOverflowError
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -72,6 +74,10 @@
 		sig.getChars(0, sigLength, uniqueKey, 0);
 		return uniqueKey;
    	}
+	
+	public TypeBinding clone(TypeBinding outerType) {
+		return new RawTypeBinding(this.actualType(), (ReferenceBinding) outerType, this.environment);
+	}
 
 	/**
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding#createParameterizedMethod(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding)
@@ -83,6 +89,10 @@
 		return this.environment.createParameterizedGenericMethod(originalMethod, this);
 	}
 
+	public boolean isParameterizedType() {
+		return false;
+	}
+
 	public int kind() {
 		return RAW_TYPE;
 	}
@@ -91,11 +101,17 @@
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#debugName()
 	 */
 	public String debugName() {
-	    StringBuffer nameBuffer = new StringBuffer(10);
+		if (this.hasTypeAnnotations())
+			return annotatedDebugName();
+		StringBuffer nameBuffer = new StringBuffer(10);
 		nameBuffer.append(actualType().sourceName()).append("#RAW"); //$NON-NLS-1$
 	    return nameBuffer.toString();
 	}
-
+	public String annotatedDebugName() {
+		StringBuffer buffer = new StringBuffer(super.annotatedDebugName());
+		buffer.append("#RAW"); //$NON-NLS-1$
+		return buffer.toString();
+	}
 	/**
 	 * Ltype<param1 ... paramN>;
 	 * LY<TT;>;
@@ -130,7 +146,7 @@
 	}
 
     public boolean isEquivalentTo(TypeBinding otherType) {
-		if (this == otherType || erasure() == otherType)
+		if (equalsEquals(this, otherType) || equalsEquals(erasure(), otherType))
 		    return true;
 	    if (otherType == null)
 	        return false;
@@ -143,13 +159,13 @@
 	    	case Binding.GENERIC_TYPE :
 	    	case Binding.PARAMETERIZED_TYPE :
 	    	case Binding.RAW_TYPE :
-	            return erasure() == otherType.erasure();
+	            return TypeBinding.equalsEquals(erasure(), otherType.erasure());
 	    }
         return false;
 	}
 
     public boolean isProvablyDistinct(TypeBinding otherType) {
-		if (this == otherType || erasure() == otherType) // https://bugs.eclipse.org/bugs/show_bug.cgi?id=329588
+		if (TypeBinding.equalsEquals(this, otherType) || TypeBinding.equalsEquals(erasure(), otherType)) // https://bugs.eclipse.org/bugs/show_bug.cgi?id=329588
 		    return false;
 	    if (otherType == null)
 	        return true;
@@ -158,11 +174,16 @@
 	    	case Binding.GENERIC_TYPE :
 	    	case Binding.PARAMETERIZED_TYPE :
 	    	case Binding.RAW_TYPE :
-	            return erasure() != otherType.erasure();
+	            return TypeBinding.notEquals(erasure(), otherType.erasure());
 	    }
         return true;
 	}
 
+    public boolean isProperType(boolean admitCapture18) {
+    	TypeBinding type = actualType();
+    	return type != null && type.isProperType(admitCapture18);
+    }
+
 	protected void initializeArguments() {
 		TypeVariableBinding[] typeVariables = genericType().typeVariables();
 		int length = typeVariables.length;
@@ -174,14 +195,18 @@
 		this.arguments = typeArguments;
 	}
 	
-	public MethodBinding getSingleAbstractMethod(Scope scope) {
+	public MethodBinding getSingleAbstractMethod(Scope scope, boolean replaceWildcards) {
+		int index = replaceWildcards ? 0 : 1;
 		if (this.singleAbstractMethod != null) {
-			return this.singleAbstractMethod;
+			if (this.singleAbstractMethod[index] != null)
+			return this.singleAbstractMethod[index];
+		} else {
+			this.singleAbstractMethod = new MethodBinding[2];
 		}
 		final ReferenceBinding genericType = genericType();
-		MethodBinding theAbstractMethod = genericType.getSingleAbstractMethod(scope);
+		MethodBinding theAbstractMethod = genericType.getSingleAbstractMethod(scope, replaceWildcards);
 		if (theAbstractMethod == null || !theAbstractMethod.isValidBinding())
-			return this.singleAbstractMethod = theAbstractMethod;
+			return this.singleAbstractMethod[index] = theAbstractMethod;
 		
 		ReferenceBinding declaringType = (ReferenceBinding) scope.environment().convertToRawType(genericType, true);
 		declaringType = (ReferenceBinding) declaringType.findSuperTypeOriginatingFrom(theAbstractMethod.declaringClass);
@@ -189,10 +214,10 @@
 		for (int i = 0, length = choices.length; i < length; i++) {
 			MethodBinding method = choices[i];
 			if (!method.isAbstract() || method.redeclaresPublicObjectMethod(scope)) continue; // (re)skip statics, defaults, public object methods ...
-			this.singleAbstractMethod = method;
+			this.singleAbstractMethod[index] = method;
 			break;
 		}
-		return this.singleAbstractMethod;
+		return this.singleAbstractMethod[index];
 	}
 	/**
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding#readableName()
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult.java
new file mode 100644
index 0000000..cb4fbd1
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReductionResult.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2013 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+/**
+ * Generalization over TypeBounds and ConstraintFormulas which both
+ * can be created during reduction.
+ */
+public abstract class ReductionResult {
+
+	protected static final ConstraintTypeFormula TRUE = new ConstraintTypeFormula() {
+		/* empty body just to make abstract class instantiable */
+		public Object reduce(InferenceContext18 context) { return this; }
+		public String toString() { return "TRUE"; } //$NON-NLS-1$
+	};
+	protected static final ConstraintTypeFormula FALSE = new ConstraintTypeFormula() { 
+		/* empty body just to make abstract class instantiable */ 
+		public Object reduce(InferenceContext18 context) { return this; }
+		public String toString() { return "FALSE"; } //$NON-NLS-1$
+	};
+	/** Used to accept unchecked conversion to make ecj conform with javac bug https://bugs.openjdk.java.net/browse/JDK-8026527 */
+	
+	// Relation kinds, mimic an enum:
+	protected static final int COMPATIBLE = 1;
+	protected static final int SUBTYPE = 2;
+	protected static final int SUPERTYPE = 3;
+	protected static final int SAME = 4;
+	protected static final int TYPE_ARGUMENT_CONTAINED = 5;
+	protected static final int CAPTURE = 6;
+	static final int EXCEPTIONS_CONTAINED = 7;
+	
+	protected TypeBinding right; // note that the LHS differs between sub-classes.
+	protected int relation;
+
+	protected static String relationToString(int relation) {
+		switch (relation) {
+			case SAME: 			return " = "; //$NON-NLS-1$
+			case COMPATIBLE: 	return " \u2192 "; //$NON-NLS-1$
+			case SUBTYPE: 		return " <: "; //$NON-NLS-1$
+			case SUPERTYPE: 	return " :> "; //$NON-NLS-1$
+			case TYPE_ARGUMENT_CONTAINED:
+								return " <= "; //$NON-NLS-1$
+			case CAPTURE:
+								return " captureOf "; //$NON-NLS-1$
+			default:
+				throw new IllegalArgumentException("Unknown type relation "+relation); //$NON-NLS-1$
+		}
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
index aee686c..2728883 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -22,8 +18,20 @@
  *								bug 392862 - [1.8][compiler][null] Evaluate null annotations on array types
  *								bug 400421 - [compiler] Null analysis for fields does not take @com.google.inject.Inject into account
  *								bug 382069 - [null] Make the null analysis consider JUnit's assertNotNull similarly to assertions
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415291 - [1.8][null] differentiate type incompatibilities due to null annotations
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 416176 - [1.8][compiler][null] null type annotations cause grief on type variables
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 423504 - [1.8] Implement "18.5.3 Functional Interface Parameterization Inference"
+ *								Bug 426792 - [1.8][inference][impl] generify new type inference engine
+ *								Bug 428019 - [1.8][compiler] Type inference failure with nested generic invocation.
+ *								Bug 427199 - [1.8][resource] avoid resource leak warnings on Streams that have no resource
+ *								Bug 418743 - [1.8][null] contradictory annotations on invocation of generic method not reported
  *      Jesper S Moller - Contributions for
  *								bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
+ *								bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -34,6 +42,7 @@
 import org.aspectj.org.eclipse.jdt.core.compiler.InvalidInputException;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
 
 /*
@@ -60,23 +69,24 @@
 	private SimpleLookupTable compatibleCache;
 
 	int typeBits; // additional bits characterizing this type
-	protected MethodBinding singleAbstractMethod;
+	protected MethodBinding [] singleAbstractMethod;
 
 	public static final ReferenceBinding LUB_GENERIC = new ReferenceBinding() { /* used for lub computation */
+		{ this.id = TypeIds.T_undefined; }
 		public boolean hasTypeBit(int bit) { return false; }
 	};
 
-	private static final Comparator FIELD_COMPARATOR = new Comparator() {
-		public int compare(Object o1, Object o2) {
-			char[] n1 = ((FieldBinding) o1).name;
-			char[] n2 = ((FieldBinding) o2).name;
+	private static final Comparator<FieldBinding> FIELD_COMPARATOR = new Comparator<FieldBinding>() {
+		public int compare(FieldBinding o1, FieldBinding o2) {
+			char[] n1 = o1.name;
+			char[] n2 = o2.name;
 			return ReferenceBinding.compare(n1, n2, n1.length, n2.length);
 		}
 	};
-	private static final Comparator METHOD_COMPARATOR = new Comparator() {
-		public int compare(Object o1, Object o2) {
-			MethodBinding m1 = (MethodBinding) o1;
-			MethodBinding m2 = (MethodBinding) o2;
+	private static final Comparator<MethodBinding> METHOD_COMPARATOR = new Comparator<MethodBinding>() {
+		public int compare(MethodBinding o1, MethodBinding o2) {
+			MethodBinding m1 = o1;
+			MethodBinding m2 = o2;
 			char[] s1 = m1.selector;
 			char[] s2 = m2.selector;
 			int c = ReferenceBinding.compare(s1, s2, s1.length, s2.length);
@@ -85,6 +95,26 @@
 	};
 	static protected ProblemMethodBinding samProblemBinding = new ProblemMethodBinding(TypeConstants.ANONYMOUS_METHOD, null, ProblemReasons.NoSuchSingleAbstractMethod);
 
+
+	public ReferenceBinding(ReferenceBinding prototype) {
+	super(prototype);
+
+	this.compoundName = prototype.compoundName;
+	this.sourceName = prototype.sourceName;
+	this.modifiers = prototype.modifiers;
+	this.fPackage = prototype.fPackage;
+	this.fileName = prototype.fileName;
+	this.constantPoolName = prototype.constantPoolName;
+	this.signature = prototype.signature;
+	this.compatibleCache = prototype.compatibleCache;
+	this.typeBits = prototype.typeBits;
+	this.singleAbstractMethod = prototype.singleAbstractMethod;
+}
+
+public ReferenceBinding() {
+	super();
+}
+
 public static FieldBinding binarySearch(char[] name, FieldBinding[] sortedFields) {
 	if (sortedFields == null)
 		return null;
@@ -207,7 +237,7 @@
 /**
  * Answer true if the receiver is visible to the invocationPackage.
  */
-public final boolean canBeSeenBy(PackageBinding invocationPackage) {
+public boolean canBeSeenBy(PackageBinding invocationPackage) {
 	if (isPublic()) return true;
 	if (isPrivate()) return false;
 
@@ -220,7 +250,7 @@
  */
 
 //AspectJ Extension - replace original impl with this one
-public final boolean canBeSeenBy(ReferenceBinding receiverType, ReferenceBinding invocationType) {
+public boolean canBeSeenBy(ReferenceBinding receiverType, ReferenceBinding invocationType) {
 	boolean ret = innerCanBeSeenBy(receiverType, invocationType);
 	if (ret) return true;
 
@@ -237,7 +267,7 @@
     // End AspectJ Extension - this is the original implementation
     if (isPublic()) return true;
 
-	if (invocationType == this && invocationType == receiverType) return true;
+	if (TypeBinding.equalsEquals(invocationType, this) && TypeBinding.equalsEquals(invocationType, receiverType)) return true;
 
 	if (isProtected()) {
 		// answer true if the invocationType is the declaringClass or they are in the same package
@@ -245,12 +275,12 @@
 		//    AND the invocationType is the invocationType or its subclass
 		//    OR the type is a static method accessed directly through a type
 		//    OR previous assertions are true for one of the enclosing type
-		if (invocationType == this) return true;
+		if (TypeBinding.equalsEquals(invocationType, this)) return true;
 		if (invocationType.fPackage == this.fPackage) return true;
 
 		TypeBinding currentType = invocationType.erasure();
 		TypeBinding declaringClass = enclosingType().erasure(); // protected types always have an enclosing one
-		if (declaringClass == invocationType) return true;
+		if (TypeBinding.equalsEquals(declaringClass, invocationType)) return true;
 		if (declaringClass == null) return false; // could be null if incorrect top-level protected type
 		//int depth = 0;
 		do {
@@ -265,7 +295,7 @@
 		// answer true if the receiverType is the receiver or its enclosingType
 		// AND the invocationType and the receiver have a common enclosingType
 		receiverCheck: {
-			if (!(receiverType == this || receiverType == enclosingType())) {
+			if (!(TypeBinding.equalsEquals(receiverType, this) || TypeBinding.equalsEquals(receiverType, enclosingType()))) {
 				// special tolerance for type variable direct bounds, but only if compliance <= 1.6, see: https://bugs.eclipse.org/bugs/show_bug.cgi?id=334622
 				if (receiverType.isTypeVariable()) {
 					TypeVariableBinding typeVariable = (TypeVariableBinding) receiverType;
@@ -276,7 +306,7 @@
 			}
 		}
 
-		if (invocationType != this) {
+		if (TypeBinding.notEquals(invocationType, this)) {
 			ReferenceBinding outerInvocationType = invocationType;
 			ReferenceBinding temp = outerInvocationType.enclosingType();
 			while (temp != null) {
@@ -290,7 +320,7 @@
 				outerDeclaringClass = temp;
 				temp = temp.enclosingType();
 			}
-			if (outerInvocationType != outerDeclaringClass) return false;
+			if (TypeBinding.notEquals(outerInvocationType, outerDeclaringClass)) return false;
 		}
 		return true;
 	}
@@ -302,9 +332,9 @@
 	TypeBinding originalDeclaringClass = (enclosingType() == null ? this : enclosingType()).original();
 	do {
 		if (currentType.isCapture()) {  // https://bugs.eclipse.org/bugs/show_bug.cgi?id=285002
-			if (originalDeclaringClass == currentType.erasure().original()) return true;
+			if (TypeBinding.equalsEquals(originalDeclaringClass, currentType.erasure().original())) return true;
 		} else { 
-			if (originalDeclaringClass == currentType.original()) return true;
+			if (TypeBinding.equalsEquals(originalDeclaringClass, currentType.original())) return true;
 		}
 		PackageBinding currentPackage = currentType.fPackage;
 		// package could be null for wildcards/intersection types, ignore and recurse in superclass
@@ -316,7 +346,8 @@
 /**
  * Answer true if the receiver is visible to the type provided by the scope.
  */
-public final boolean canBeSeenBy(Scope scope) {
+// AspectJ Extension: replace existing implementation with alternative that can access the privileged handler
+public boolean canBeSeenBy(Scope scope) {
 	
 	boolean ret = innerCanBeSeenBy(scope);
 	if (ret) return true;
@@ -341,7 +372,7 @@
 	if (isPublic()) return true;
 
 	SourceTypeBinding invocationType = scope.invocationType(); // AspectJ Extension - use invocationType() rather than enclosingSourceType()
-	if (invocationType == this) return true;
+	if (TypeBinding.equalsEquals(invocationType, this)) return true;
 
 	if (invocationType == null) // static import call
 		return !isPrivate() && scope.getCurrentPackage() == this.fPackage;
@@ -360,7 +391,7 @@
 		TypeBinding currentType = invocationType.erasure();
 		// int depth = 0;
 		do {
-			if (declaringClass == invocationType) return true;
+			if (TypeBinding.equalsEquals(declaringClass, invocationType)) return true;
 			if (currentType.findSuperTypeOriginatingFrom(declaringClass) != null) return true;
 			// depth++;
 			currentType = currentType.enclosingType();
@@ -383,7 +414,7 @@
 			outerDeclaringClass = temp;
 			temp = temp.enclosingType();
 		}
-		return outerInvocationType == outerDeclaringClass;
+		return TypeBinding.equalsEquals(outerInvocationType, outerDeclaringClass);
 	}
 
 	// isDefault()
@@ -717,6 +748,10 @@
 										if (CharOperation.equals(typeName, TypeConstants.JAVA_LANG_ANNOTATION_RETENTION[3]))
 											this.id = TypeIds.T_JavaLangAnnotationRetention;
 										return;
+									case 10 :
+										if (CharOperation.equals(typeName, TypeConstants.JAVA_LANG_ANNOTATION_REPEATABLE[3]))
+											this.id = TypeIds.T_JavaLangAnnotationRepeatable;
+										return;
 									case 15 :
 										if (CharOperation.equals(typeName, TypeConstants.JAVA_LANG_ANNOTATION_RETENTIONPOLICY[3]))
 											this.id = TypeIds.T_JavaLangAnnotationRetentionPolicy;
@@ -844,6 +879,18 @@
 					return;
 			}
 			break;
+		case 6:
+			if (!CharOperation.equals(TypeConstants.JDT, this.compoundName[2]) || !CharOperation.equals(TypeConstants.ITYPEBINDING, this.compoundName[5]))
+				return;
+			if (CharOperation.equals(TypeConstants.ORG_ECLIPSE_JDT_CORE_DOM_ITYPEBINDING, this.compoundName))
+				this.typeBits |= TypeIds.BitUninternedType;
+			break;
+		case 7 :
+			if (!CharOperation.equals(TypeConstants.JDT, this.compoundName[2]) || !CharOperation.equals(TypeConstants.TYPEBINDING, this.compoundName[6]))
+				return;
+			if (CharOperation.equals(TypeConstants.ORG_ECLIPSE_JDT_INTERNAL_COMPILER_LOOKUP_TYPEBINDING, this.compoundName))
+				this.typeBits |= TypeIds.BitUninternedType;
+			break;
 	}
 }
 
@@ -866,10 +913,10 @@
 }
 
 public String debugName() {
-	return (this.compoundName != null) ? new String(readableName()) : "UNNAMED TYPE"; //$NON-NLS-1$
+	return (this.compoundName != null) ? this.hasTypeAnnotations() ? annotatedDebugName() : new String(readableName()) : "UNNAMED TYPE"; //$NON-NLS-1$
 }
 
-public final int depth() {
+public int depth() {
 	int depth = 0;
 	ReferenceBinding current = this;
 	while ((current = current.enclosingType()) != null)
@@ -886,7 +933,7 @@
 	boolean inCycle = false; // check each method before failing
 	for (int i = 0, l = currentMethods.length; i < l; i++) {
 		TypeBinding returnType = currentMethods[i].returnType.leafComponentType().erasure();
-		if (this == returnType) {
+		if (TypeBinding.equalsEquals(this, returnType)) {
 			if (this instanceof SourceTypeBinding) {
 				MethodDeclaration decl = (MethodDeclaration) currentMethods[i].sourceMethod();
 				((SourceTypeBinding) this).scope.problemReporter().annotationCircularity(this, this, decl != null ? decl.returnType : null);
@@ -1036,7 +1083,7 @@
  */
 public boolean hasIncompatibleSuperType(ReferenceBinding otherType) {
 
-    if (this == otherType) return false;
+    if (TypeBinding.equalsEquals(this, otherType)) return false;
 
 	ReferenceBinding[] interfacesToVisit = null;
 	int nextPosition = 0;
@@ -1059,7 +1106,7 @@
 				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;
+						if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 					interfacesToVisit[nextPosition++] = next;
 				}
 			}
@@ -1068,7 +1115,7 @@
 
 	for (int i = 0; i < nextPosition; i++) {
 		currentType = interfacesToVisit[i];
-		if (currentType == otherType) return false;
+		if (TypeBinding.equalsEquals(currentType, otherType)) return false;
 		match = otherType.findSuperTypeOriginatingFrom(currentType);
 		if (match != null && match.isProvablyDistinct(currentType))
 			return true;
@@ -1081,7 +1128,7 @@
 			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;
+					if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 				interfacesToVisit[nextPosition++] = next;
 			}
 		}
@@ -1113,8 +1160,6 @@
 public final boolean hasRestrictedAccess() {
 	return (this.modifiers & ExtraCompilerModifiers.AccRestrictedAccess) != 0;
 }
-/** Answer an additional bit characterizing this type, like {@link TypeIds#BitAutoCloseable}. */
-abstract public boolean hasTypeBit(int bit);
 
 /** Answer true if the receiver implements anInterface or is identical to anInterface.
 * If searchHierarchy is true, then also search the receiver's superclasses.
@@ -1122,7 +1167,7 @@
 * NOTE: Assume that anInterface is an interface.
 */
 public boolean implementsInterface(ReferenceBinding anInterface, boolean searchHierarchy) {
-	if (this == anInterface)
+	if (TypeBinding.equalsEquals(this, anInterface))
 		return true;
 
 	ReferenceBinding[] interfacesToVisit = null;
@@ -1141,7 +1186,7 @@
 				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;
+						if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 					interfacesToVisit[nextPosition++] = next;
 				}
 			}
@@ -1161,7 +1206,7 @@
 			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;
+					if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 				interfacesToVisit[nextPosition++] = next;
 			}
 		}
@@ -1207,14 +1252,22 @@
 	return (this.modifiers & (ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation | ClassFileConstants.AccEnum)) == 0;
 }
 
+public boolean isProperType(boolean admitCapture18) {
+	ReferenceBinding outer = enclosingType();
+	if (outer != null && !outer.isProperType(admitCapture18))
+		return false;
+	return super.isProperType(admitCapture18);
+}
+
 /**
  * Answer true if the receiver type can be assigned to the argument type (right)
  * In addition to improving performance, caching also ensures there is no infinite regression
  * since per nature, the compatibility check is recursive through parameterized type arguments (122775)
  */
 public boolean isCompatibleWith(TypeBinding otherType, /*@Nullable*/ Scope captureScope) {
-	if (otherType == this)
+	if (equalsEquals(otherType, this))
 		return true;
+	
 	if (otherType.id == TypeIds.T_JavaLangObject)
 		return true;
 	Object result;
@@ -1247,7 +1300,7 @@
  * Answer true if the receiver type can be assigned to the argument type (right)
  */
 private boolean isCompatibleWith0(TypeBinding otherType, /*@Nullable*/ Scope captureScope) {
-	if (otherType == this)
+	if (TypeBinding.equalsEquals(otherType, this))
 		return true;
 	if (otherType.id == TypeIds.T_JavaLangObject)
 		return true;
@@ -1279,7 +1332,7 @@
 				case Binding.GENERIC_TYPE :
 				case Binding.PARAMETERIZED_TYPE :
 				case Binding.RAW_TYPE :
-					if (erasure() == otherType.erasure())
+					if (TypeBinding.equalsEquals(erasure(), otherType.erasure())) 
 						return false; // should have passed equivalence check
 										// above if same erasure
 			}
@@ -1304,6 +1357,54 @@
 	}
 }
 
+public boolean isSubtypeOf(TypeBinding other) {
+	if (isSubTypeOfRTL(other))
+		return true;
+	// TODO: if this has wildcards, perform capture before the next call:
+	TypeBinding candidate = findSuperTypeOriginatingFrom(other);
+	if (candidate == null)
+		return false;
+	if (TypeBinding.equalsEquals(candidate, other))
+		return true;
+	
+	// T<Ai...> <: T#RAW:
+	if (other.isRawType() && TypeBinding.equalsEquals(candidate.erasure(), other.erasure()))
+		return true;
+	
+	TypeBinding[] sis = other.typeArguments();
+	TypeBinding[] tis = candidate.typeArguments();
+	if (tis == null || sis == null)
+		return false;
+	if (sis.length != tis.length)
+		return false;
+	for (int i = 0; i < sis.length; i++) {
+		if (!tis[i].isTypeArgumentContainedBy(sis[i]))
+			return false;
+	}
+	return true;
+}
+
+protected boolean isSubTypeOfRTL(TypeBinding other) {
+	if (TypeBinding.equalsEquals(this, other))
+		return true;
+	if (other instanceof CaptureBinding) {
+		// for this one kind we must first unwrap the rhs:
+		TypeBinding lower = ((CaptureBinding) other).lowerBound;
+		return (lower != null && isSubtypeOf(lower));
+	}
+	if (other instanceof ReferenceBinding) {
+		TypeBinding[] intersecting = ((ReferenceBinding) other).getIntersectingTypes();
+		if (intersecting != null) {
+			for (int i = 0; i < intersecting.length; i++) {
+				if (!isSubtypeOf(intersecting[i]))
+					return false;
+			}
+			return true;
+		}
+	}
+	return false;
+}
+
 /**
  * Answer true if the receiver has default visibility
  */
@@ -1357,7 +1458,7 @@
 
 public boolean isFunctionalInterface(Scope scope) {
 	MethodBinding method;
-	return isInterface() && (method = getSingleAbstractMethod(scope)) != null && method.isValidBinding();
+	return isInterface() && (method = getSingleAbstractMethod(scope, true)) != null && method.isValidBinding();
 }
 
 /**
@@ -1506,24 +1607,6 @@
 	return Binding.NO_METHODS;
 }
 
-public char[] nullAnnotatedReadableName(LookupEnvironment env, boolean shortNames) /* java.lang.Object @o.e.j.a.NonNull[] */ {
-	char[] typeName = shortNames ? shortReadableName() : readableName();
-	if ((this.tagBits & TagBits.AnnotationNullMASK) == 0)
-		return typeName;
-	char[][] fqAnnotationName;
-	if ((this.tagBits & TagBits.AnnotationNonNull) != 0)
-		fqAnnotationName = env.getNonNullAnnotationName();
-	else
-		fqAnnotationName = env.getNullableAnnotationName();
-	char[] annotationName = shortNames
-								? fqAnnotationName[fqAnnotationName.length-1]
-								: CharOperation.concatWith(fqAnnotationName, '.');				
-	char[] prefix = new char[annotationName.length+1];
-	prefix[0] = '@';
-	System.arraycopy(annotationName, 0, prefix, 1, annotationName.length);
-	return CharOperation.concat(prefix, typeName, ' ');
-}
-
 public final ReferenceBinding outermostEnclosingType() {
 	ReferenceBinding current = this;
 	while (true) {
@@ -1572,6 +1655,20 @@
 	return readableName;
 }
 
+protected void appendNullAnnotation(StringBuffer nameBuffer, CompilerOptions options) {
+	if (options.isAnnotationBasedNullAnalysisEnabled) {
+		// restore applied null annotation from tagBits:
+	    if ((this.tagBits & TagBits.AnnotationNonNull) != 0) {
+	    	char[][] nonNullAnnotationName = options.nonNullAnnotationName;
+			nameBuffer.append('@').append(nonNullAnnotationName[nonNullAnnotationName.length-1]).append(' ');
+	    }
+	    if ((this.tagBits & TagBits.AnnotationNullable) != 0) {
+	    	char[][] nullableAnnotationName = options.nullableAnnotationName;
+			nameBuffer.append('@').append(nullableAnnotationName[nullableAnnotationName.length-1]).append(' ');
+	    }
+	}
+}
+
 public AnnotationHolder retrieveAnnotationHolder(Binding binding, boolean forceInitialization) {
 	SimpleLookupTable store = storedAnnotations(forceInitialization);
 	return store == null ? null : (AnnotationHolder) store.get(binding);
@@ -1585,6 +1682,89 @@
 public void setAnnotations(AnnotationBinding[] annotations) {
 	storeAnnotations(this, annotations);
 }
+public void setContainerAnnotationType(ReferenceBinding value) {
+	// Leave this to subclasses
+}
+public void tagAsHavingDefectiveContainerType() {
+	// Leave this to subclasses
+}
+
+/**
+ * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#nullAnnotatedReadableName(CompilerOptions,boolean)
+ */
+public char[] nullAnnotatedReadableName(CompilerOptions options, boolean shortNames) {
+	if (shortNames)
+		return nullAnnotatedShortReadableName(options);
+	return nullAnnotatedReadableName(options);
+}
+
+char[] nullAnnotatedReadableName(CompilerOptions options) {
+    StringBuffer nameBuffer = new StringBuffer(10);
+	if (isMemberType()) {
+		nameBuffer.append(enclosingType().nullAnnotatedReadableName(options, false));
+		nameBuffer.append('.');
+		appendNullAnnotation(nameBuffer, options);
+		nameBuffer.append(this.sourceName);
+	} else if (this.compoundName != null) {
+		int i;
+		int l=this.compoundName.length;
+		for (i=0; i<l-1; i++) {
+			nameBuffer.append(this.compoundName[i]);
+			nameBuffer.append('.');
+		}
+	    appendNullAnnotation(nameBuffer, options);
+		nameBuffer.append(this.compoundName[i]);
+	} else {
+		// case of TypeVariableBinding with nullAnnotationTagBits:
+		appendNullAnnotation(nameBuffer, options);
+		if (this.sourceName != null)
+			nameBuffer.append(this.sourceName);
+		else // WildcardBinding, CaptureBinding have no sourceName
+			nameBuffer.append(this.readableName());
+	}
+	TypeBinding [] arguments = typeArguments();
+	if (arguments != null && arguments.length > 0) { // empty arguments array happens when PTB has been created just to capture type annotations
+		nameBuffer.append('<');
+	    for (int i = 0, length = arguments.length; i < length; i++) {
+	        if (i > 0) nameBuffer.append(',');
+	        nameBuffer.append(arguments[i].nullAnnotatedReadableName(options, false));
+	    }
+	    nameBuffer.append('>');
+	}
+	int nameLength = nameBuffer.length();
+	char[] readableName = new char[nameLength];
+	nameBuffer.getChars(0, nameLength, readableName, 0);
+    return readableName;
+}
+
+char[] nullAnnotatedShortReadableName(CompilerOptions options) {
+    StringBuffer nameBuffer = new StringBuffer(10);
+	if (isMemberType()) {
+		nameBuffer.append(enclosingType().nullAnnotatedReadableName(options, true));
+		nameBuffer.append('.');
+		appendNullAnnotation(nameBuffer, options);
+		nameBuffer.append(this.sourceName);
+	} else {
+		appendNullAnnotation(nameBuffer, options);
+		if (this.sourceName != null)
+			nameBuffer.append(this.sourceName);
+		else // WildcardBinding, CaptureBinding have no sourceName
+			nameBuffer.append(this.shortReadableName());
+	}
+	TypeBinding [] arguments = typeArguments();
+	if (arguments != null && arguments.length > 0) { // empty arguments array happens when PTB has been created just to capture type annotations
+		nameBuffer.append('<');
+	    for (int i = 0, length = arguments.length; i < length; i++) {
+	        if (i > 0) nameBuffer.append(',');
+	        nameBuffer.append(arguments[i].nullAnnotatedReadableName(options, true));
+	    }
+	    nameBuffer.append('>');
+	}
+	int nameLength = nameBuffer.length();
+	char[] shortReadableName = new char[nameLength];
+	nameBuffer.getChars(0, nameLength, shortReadableName, 0);
+    return shortReadableName;
+}
 
 public char[] shortReadableName() /*Object*/ {
 	char[] shortReadableName;
@@ -1668,9 +1848,6 @@
 		return null;
 	return new ReferenceBinding[] {enclosingType};
 }
-public SyntheticArgumentBinding[] syntheticOuterLocalVariables() {
-	return null;		// is null if no enclosing instances are required
-}
 
 MethodBinding[] unResolvedMethods() { // for the MethodVerifier so it doesn't resolve types
 	return methods();
@@ -1684,7 +1861,7 @@
  * If a type - known to be a Closeable - is mentioned in one of our white lists
  * answer the typeBit for the white list (BitWrapperCloseable or BitResourceFreeCloseable).
  */
-protected int applyCloseableWhitelists() {
+protected int applyCloseableClassWhitelists() {
 	switch (this.compoundName.length) {
 		case 3:
 			if (CharOperation.equals(TypeConstants.JAVA, this.compoundName[0])) {
@@ -1727,6 +1904,20 @@
 }
 
 
+/*
+ * If a type - known to be a Closeable - is mentioned in one of our white lists
+ * answer the typeBit for the white list (BitWrapperCloseable or BitResourceFreeCloseable).
+ */
+protected int applyCloseableInterfaceWhitelists() {
+	switch (this.compoundName.length) {
+		case 4:
+			if (CharOperation.equals(this.compoundName, TypeConstants.RESOURCE_FREE_CLOSEABLE_STREAM))
+				return TypeIds.BitResourceFreeCloseable;
+			break;
+	}
+	return 0;
+}
+
 private MethodBinding [] getInterfaceAbstractContracts(Scope scope) throws InvalidInputException {
 	
 	if (!isInterface() || !isValidBinding()) {
@@ -1737,28 +1928,13 @@
 	MethodBinding [] contracts = new MethodBinding[0];
 	int contractsCount = 0;
 	int contractsLength = 0;
+	
+	// -- the following are used for early termination.
 	MethodBinding aContract = null;
 	int contractParameterLength = 0;
 	char [] contractSelector = null;
+	// ---
 	
-	for (int i = 0, length = methods == null ? 0 : methods.length; i < length; i++) {
-		final MethodBinding method = methods[i];
-		if (!method.isAbstract() || method.redeclaresPublicObjectMethod(scope)) continue; // skips statics, defaults, public object methods ...
-		final boolean validBinding = method.isValidBinding();
-		if (aContract == null && validBinding) {
-			aContract = method;
-			contractParameterLength = aContract.parameters.length;
-			contractSelector = aContract.selector;
-		} else {
-			if (!validBinding || method.parameters.length != contractParameterLength || !CharOperation.equals(contractSelector, method.selector)) {
-				throw new InvalidInputException("Not a functional interface"); //$NON-NLS-1$
-			}
-		}
-		if (contractsCount == contractsLength) {
-			System.arraycopy(contracts, 0, contracts = new MethodBinding[contractsLength += 16], 0, contractsCount);
-		}
-		contracts[contractsCount++] = method;
-	}
 	ReferenceBinding [] superInterfaces = superInterfaces();
 	for (int i = 0, length = superInterfaces.length; i < length; i++) {
 		MethodBinding [] superInterfaceContracts = superInterfaces[i].getInterfaceAbstractContracts(scope);
@@ -1782,29 +1958,72 @@
 			contractsCount += superInterfaceContractsLength;
 		}
 	}
+	for (int i = 0, length = methods == null ? 0 : methods.length; i < length; i++) {
+		final MethodBinding method = methods[i];
+		if (method.isStatic() || method.redeclaresPublicObjectMethod(scope)) continue;
+		if (method.isDefaultMethod()) {
+			for (int j = 0; j < contractsCount; j++) {
+				if (contracts[j] == null)
+					continue;
+				if (MethodVerifier.doesMethodOverride(method, contracts[j], scope.environment())) {
+					if (aContract == contracts[j]) {
+						aContract = null;
+						contractParameterLength = 0;
+						contractSelector = null;
+					}
+					contractsCount--;
+					// abstract method from super type rendered default by present interface ==> contracts[j] = null;
+					if (j < contractsCount)
+						System.arraycopy(contracts, j+1, contracts, j, contractsCount - j);
+				}
+			}
+			continue; // skip default method itself
+		}
+		final boolean validBinding = method.isValidBinding();
+		if (aContract == null && validBinding) {
+			aContract = method;
+			contractParameterLength = aContract.parameters.length;
+			contractSelector = aContract.selector;
+		} else {
+			if (!validBinding || method.parameters.length != contractParameterLength || !CharOperation.equals(contractSelector, method.selector)) {
+				throw new InvalidInputException("Not a functional interface"); //$NON-NLS-1$
+			}
+		}
+		if (contractsCount == contractsLength) {
+			System.arraycopy(contracts, 0, contracts = new MethodBinding[contractsLength += 16], 0, contractsCount);
+		}
+		contracts[contractsCount++] = method;
+	}
 	if (contractsCount < contractsLength) {
 		System.arraycopy(contracts, 0, contracts = new MethodBinding[contractsCount], 0, contractsCount);
 	}
 	return contracts;
 }
-public MethodBinding getSingleAbstractMethod(Scope scope) {
+public MethodBinding getSingleAbstractMethod(Scope scope, boolean replaceWildcards) {
 	
+	int index = replaceWildcards ? 0 : 1;
 	if (this.singleAbstractMethod != null) {
-		return this.singleAbstractMethod;
+		if (this.singleAbstractMethod[index] != null)
+		return this.singleAbstractMethod[index];
+	} else {
+		this.singleAbstractMethod = new MethodBinding[2];
 	}
 
+	if (this.compoundName != null)
+		scope.compilationUnitScope().recordQualifiedReference(this.compoundName);
 	MethodBinding[] methods = null;
 	try {
 		methods = getInterfaceAbstractContracts(scope);
 	} catch (InvalidInputException e) {
-		return this.singleAbstractMethod = samProblemBinding;
+		return this.singleAbstractMethod[index] = samProblemBinding;
 	}
 	if (methods != null && methods.length == 1)
-		return this.singleAbstractMethod = methods[0];
+		return this.singleAbstractMethod[index] = methods[0];
 	
 	final LookupEnvironment environment = scope.environment();
 	boolean genericMethodSeen = false;
-	next:for (int i = 0, length = methods.length; i < length; i++) {
+	int length = methods.length;
+	next:for (int i = length - 1; i >= 0; --i) {
 		MethodBinding method = methods[i], otherMethod = null;
 		if (method.typeVariables != Binding.NO_TYPE_VARIABLES)
 			genericMethodSeen = true;
@@ -1884,15 +2103,15 @@
 		if (exceptionsCount != exceptionsLength) {
 			System.arraycopy(exceptions, 0, exceptions = new ReferenceBinding[exceptionsCount], 0, exceptionsCount);
 		}
-		this.singleAbstractMethod = new MethodBinding(theAbstractMethod.modifiers, 
+		this.singleAbstractMethod[index] = new MethodBinding(theAbstractMethod.modifiers | ClassFileConstants.AccSynthetic, 
 				theAbstractMethod.selector, 
 				theAbstractMethod.returnType, 
 				theAbstractMethod.parameters, 
 				exceptions, 
 				theAbstractMethod.declaringClass);
-	    this.singleAbstractMethod.typeVariables = theAbstractMethod.typeVariables;
-		return this.singleAbstractMethod;
+	    this.singleAbstractMethod[index].typeVariables = theAbstractMethod.typeVariables;
+		return this.singleAbstractMethod[index];
 	}
-	return this.singleAbstractMethod = samProblemBinding;
+	return this.singleAbstractMethod[index] = samProblemBinding;
 }
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope.java
index 162a947..dfaf506 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/Scope.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -18,9 +14,38 @@
  *								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
+ *								Bug 408441 - Type mismatch using Arrays.asList with 3 or more implementations of an interface with the interface type as the last parameter
+ *								Bug 413958 - Function override returning inherited Generic Type
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 416183 - [1.8][compiler][null] Overload resolution fails with null annotations
+ *								Bug 416176 - [1.8][compiler][null] null type annotations cause grief on type variables
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 424710 - [1.8][compiler] CCE in SingleNameReference.localVariableBinding
+ *								Bug 424205 - [1.8] Cannot infer type for diamond type with lambda on method invocation
+ *								Bug 424415 - [1.8][compiler] Eventual resolution of ReferenceExpression is not seen to be happening.
+ *								Bug 426366 - [1.8][compiler] Type inference doesn't handle multiple candidate target types in outer overload context
+ *								Bug 426290 - [1.8][compiler] Inference + overloading => wrong method resolution ?
+ *								Bug 426589 - [1.8][compiler] Compiler error with generic method/constructor invocation as vargs argument
+ *								Bug 426590 - [1.8][compiler] Compiler error with tenary operator
+ *								Bug 426764 - [1.8] Presence of conditional expression as method argument confuses compiler
+ *								Bug 426998 - [1.8][compiler] method(java.lang.Class, java.lang.String) not applicable for the arguments (java.lang.Class, java.lang.String)
+ *								Bug 423505 - [1.8] Implement "18.5.4 More Specific Method Inference"
+ *								Bug 427196 - [1.8][compiler] Compiler error for method reference to overloaded method
+ *								Bug 427483 - [Java 8] Variables in lambdas sometimes can't be resolved
+ *								Bug 427728 - [1.8] Type Inference rejects calls requiring boxing/unboxing
+ *								Bug 427218 - [1.8][compiler] Verify error varargs + inference
+ *								Bug 426836 - [1.8] special handling for return type in references to method getClass()?
+ *								Bug 427628 - [1.8] regression : The method * is ambiguous for the type *
+ *								Bug 428352 - [1.8][compiler] Resolution errors don't always surface
+ *								Bug 428366 - [1.8] [compiler] The method valueAt(ObservableList<Object>, int) is ambiguous for the type Bindings
+ *								Bug 424728 - [1.8][null] Unexpected error: The nullness annotation 'XXXX' is not applicable at this location 
+ *								Bug 428811 - [1.8][compiler] Type witness unnecessarily required
+ *								Bug 429424 - [1.8][inference] Problem inferring type of method's parameter
  *     Jesper S Moller - Contributions for
  *								Bug 378674 - "The method can be declared as static" is wrong
  *  							Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          	Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -38,6 +63,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleSet;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public abstract class Scope {
 
 	/* Scope kinds */
@@ -57,6 +83,17 @@
 	public static final int NOT_RELATED = 0;
 	public static final int MORE_GENERIC = 1;
 
+	/*
+	 * Flags for PGMB.computeCompatibleMethod() and its callers, to request
+	 * which of two levels of inference should be performed (or both).
+	 */
+	/** Request Invocation Applicability Inference (18.5.1). */
+	public static final int APPLICABILITY = 1;
+	/** Request Invocation Type Inference (18.5.2). */
+	public static final int INVOCATION_TYPE = 2;
+	/** Request both {@link #APPLICABILITY} and {@link #INVOCATION_TYPE} inference. */
+	public static final int FULL_INFERENCE = APPLICABILITY | INVOCATION_TYPE;
+
 	public int kind;
 	public Scope parent;
 
@@ -90,7 +127,7 @@
 					ArrayBinding originalArrayType = (ArrayBinding) originalType;
 					TypeBinding originalLeafComponentType = originalArrayType.leafComponentType;
 					TypeBinding substitute = convertEliminatingTypeVariables(originalLeafComponentType, genericType, rank, eliminatedVariables); // substitute could itself be array type
-					if (substitute != originalLeafComponentType) {
+					if (TypeBinding.notEquals(substitute, originalLeafComponentType)) {
 						return originalArrayType.environment.createArrayType(substitute.leafComponentType(), substitute.dimensions() + originalArrayType.dimensions());
 					}
 					break;
@@ -106,7 +143,7 @@
 					for (int i = 0, length = originalArguments == null ? 0 : originalArguments.length; i < length; i++) {
 						TypeBinding originalArgument = originalArguments[i];
 						TypeBinding substitutedArgument = convertEliminatingTypeVariables(originalArgument, paramType.genericType(), i, eliminatedVariables);
-						if (substitutedArgument != originalArgument) {
+						if (TypeBinding.notEquals(substitutedArgument, originalArgument)) {
 							if (substitutedArguments == originalArguments) {
 								System.arraycopy(originalArguments, 0, substitutedArguments = new TypeBinding[length], 0, i);
 							}
@@ -115,7 +152,7 @@
 							substitutedArguments[i] = originalArgument;
 						}
 					}
-					if (originalEnclosing != substitutedEnclosing || originalArguments != substitutedArguments) {
+					if (TypeBinding.notEquals(originalEnclosing, substitutedEnclosing) || originalArguments != substitutedArguments) {
 						return paramType.environment.createParameterizedType(paramType.genericType(), substitutedArguments, substitutedEnclosing);
 					}
 					break;
@@ -149,7 +186,7 @@
 					for (int i = 0, length = originalArguments == null ? 0 : originalArguments.length; i < length; i++) {
 						TypeBinding originalArgument = originalArguments[i];
 						TypeBinding substitutedArgument = convertEliminatingTypeVariables(originalArgument, currentType, i, eliminatedVariables);
-						if (substitutedArgument != originalArgument) {
+						if (TypeBinding.notEquals(substitutedArgument, originalArgument)) {
 							if (substitutedArguments == originalArguments) {
 								System.arraycopy(originalArguments, 0, substitutedArguments = new TypeBinding[length], 0, i);
 							}
@@ -158,7 +195,7 @@
 							substitutedArguments[i] = originalArgument;
 						}
 					}
-					if (originalEnclosing != substitutedEnclosing || originalArguments != substitutedArguments) {
+					if (TypeBinding.notEquals(originalEnclosing, substitutedEnclosing) || originalArguments != substitutedArguments) {
 						return ((TypeVariableBinding)originalArguments[0]).environment.createParameterizedType(genericType, substitutedArguments, substitutedEnclosing);
 					}
 					break;
@@ -168,7 +205,7 @@
 					TypeBinding substitutedBound = originalBound;
 					if (originalBound != null) {
 						substitutedBound = convertEliminatingTypeVariables(originalBound, genericType, rank, eliminatedVariables);
-						if (substitutedBound != originalBound) {
+						if (TypeBinding.notEquals(substitutedBound, originalBound)) {
 							return wildcard.environment.createWildcard(wildcard.genericType, wildcard.rank, substitutedBound, null, wildcard.boundKind);
 						}
 					}
@@ -185,7 +222,7 @@
 					for (int i = 0, length = originalOtherBounds == null ? 0 : originalOtherBounds.length; i < length; i++) {
 						TypeBinding originalOtherBound = originalOtherBounds[i];
 						TypeBinding substitutedOtherBound = convertEliminatingTypeVariables(originalOtherBound, genericType, rank, eliminatedVariables);
-						if (substitutedOtherBound != originalOtherBound) {
+						if (TypeBinding.notEquals(substitutedOtherBound, originalOtherBound)) {
 							if (substitutedOtherBounds == originalOtherBounds) {
 								System.arraycopy(originalOtherBounds, 0, substitutedOtherBounds = new TypeBinding[length], 0, i);
 							}
@@ -194,7 +231,7 @@
 							substitutedOtherBounds[i] = originalOtherBound;
 						}
 					}
-					if (substitutedBound != originalBound || substitutedOtherBounds != originalOtherBounds) {
+					if (TypeBinding.notEquals(substitutedBound, originalBound) || substitutedOtherBounds != originalOtherBounds) {
 						return intersection.environment.createWildcard(intersection.genericType, intersection.rank, substitutedBound, substitutedOtherBounds, intersection.boundKind);
 					}
 					break;
@@ -301,7 +338,7 @@
 	}
 
 	// 5.1.10
-	public static TypeBinding[] greaterLowerBound(TypeBinding[] types, /*@Nullable*/ Scope scope) {
+	public static TypeBinding[] greaterLowerBound(TypeBinding[] types, /*@Nullable*/ Scope scope, LookupEnvironment environment) {
 		if (types == null) return null;
 		int length = types.length;
 		if (length == 0) return null;
@@ -323,10 +360,39 @@
 				} 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
+						// if the wider of the two types (judged by originals) has type variables
+						// substitute those with their upper bounds and re-check (see https://bugs.eclipse.org/413958):
+						ParameterizedTypeBinding wideType, narrowType;
+						if (iType.original().isCompatibleWith(jType.original(), scope)) {
+							wideType = (ParameterizedTypeBinding) jType;
+							narrowType = (ParameterizedTypeBinding) iType;
+						} else if (jType.original().isCompatibleWith(iType.original(), scope)) {
+							wideType = (ParameterizedTypeBinding) iType;
+							narrowType = (ParameterizedTypeBinding) jType;
+						} else {
+							continue;
+						}
+						if (wideType.arguments == null)
+							continue; // assume we already have an error here
+						// Skip the following check if inference variables or CaptureBinding18 are involved,
+						// hopefully during inference a contradictory glb will simply not produce a solution
+						// (should essentially be detected beforehand in CaptureBinding18.setUpperBounds()): 
+						if (!narrowType.isProperType(false) || !wideType.isProperType(false))
+							continue;
+						int numTypeArgs = wideType.arguments.length;
+						TypeBinding[] bounds = new TypeBinding[numTypeArgs];
+						for (int k = 0; k < numTypeArgs; k++) {
+							TypeBinding argument = wideType.arguments[k];
+							bounds[k] = argument.isTypeVariable() ? ((TypeVariableBinding)argument).upperBound() : argument;
+						}
+						ReferenceBinding wideOriginal = (ReferenceBinding) wideType.original();
+						TypeBinding substitutedWideType =
+								environment.createParameterizedType(wideOriginal, bounds, wideOriginal.enclosingType());
+						// if the narrow type is compatible with the substituted wide type, we keep silent, 
+						// substituting type variables with proper types can still satisfy all constraints,
+						// otherwise ... 
+						if (!narrowType.isCompatibleWith(substitutedWideType, scope)) {
+							// ... parameterized types are incompatible due to incompatible type arguments => unsatisfiable
 							return null;
 						}
 					}
@@ -350,24 +416,7 @@
 	 * Only allocate an array if anything is different.
 	 */
 	public static ReferenceBinding[] substitute(Substitution substitution, ReferenceBinding[] originalTypes) {
-		if (originalTypes == null) return null;
-	    ReferenceBinding[] substitutedTypes = originalTypes;
-	    for (int i = 0, length = originalTypes.length; i < length; i++) {
-	        ReferenceBinding originalType = originalTypes[i];
-	        TypeBinding substitutedType = substitute(substitution, originalType);
-	        if (!(substitutedType instanceof ReferenceBinding)) {
-	        	return null; // impossible substitution
-	        }
-	        if (substitutedType != originalType) {
-	            if (substitutedTypes == originalTypes) {
-	                System.arraycopy(originalTypes, 0, substitutedTypes = new ReferenceBinding[length], 0, i);
-	            }
-	            substitutedTypes[i] = (ReferenceBinding)substitutedType;
-	        } else if (substitutedTypes != originalTypes) {
-	            substitutedTypes[i] = originalType;
-	        }
-	    }
-	    return substitutedTypes;
+		return defaultSubstitutor.substitute(substitution, originalTypes);
 	}
 
 	/**
@@ -381,127 +430,7 @@
 	 *  of its type in the generic declaration corresponding to C." 
 	 */
 	public static TypeBinding substitute(Substitution substitution, TypeBinding originalType) {
-		if (originalType == null) return null;
-		switch (originalType.kind()) {
-
-			case Binding.TYPE_PARAMETER:
-				return substitution.substitute((TypeVariableBinding) originalType);
-
-			case Binding.PARAMETERIZED_TYPE:
-				ParameterizedTypeBinding originalParameterizedType = (ParameterizedTypeBinding) originalType;
-				ReferenceBinding originalEnclosing = originalType.enclosingType();
-				ReferenceBinding substitutedEnclosing = originalEnclosing;
-				if (originalEnclosing != null) {
-					substitutedEnclosing = (ReferenceBinding) substitute(substitution, originalEnclosing);
-					if (isMemberTypeOfRaw(originalType, substitutedEnclosing))
-						return originalParameterizedType.environment.createRawType(
-								originalParameterizedType.genericType(), substitutedEnclosing);
-				}
-				TypeBinding[] originalArguments = originalParameterizedType.arguments;
-				TypeBinding[] substitutedArguments = originalArguments;
-				if (originalArguments != null) {
-					if (substitution.isRawSubstitution()) {
-						return originalParameterizedType.environment.createRawType(originalParameterizedType.genericType(), substitutedEnclosing);
-					}
-					substitutedArguments = substitute(substitution, originalArguments);
-				}
-				if (substitutedArguments != originalArguments || substitutedEnclosing != originalEnclosing) {
-					return originalParameterizedType.environment.createParameterizedType(
-							originalParameterizedType.genericType(), substitutedArguments, substitutedEnclosing);
-				}
-				break;
-
-			case Binding.ARRAY_TYPE:
-				ArrayBinding originalArrayType = (ArrayBinding) originalType;
-				TypeBinding originalLeafComponentType = originalArrayType.leafComponentType;
-				TypeBinding substitute = substitute(substitution, originalLeafComponentType); // substitute could itself be array type
-				if (substitute != originalLeafComponentType) {
-					return originalArrayType.environment.createArrayType(substitute.leafComponentType(), substitute.dimensions() + originalType.dimensions());
-				}
-				break;
-
-			case Binding.WILDCARD_TYPE:
-			case Binding.INTERSECTION_TYPE:
-		        WildcardBinding wildcard = (WildcardBinding) originalType;
-		        if (wildcard.boundKind != Wildcard.UNBOUND) {
-			        TypeBinding originalBound = wildcard.bound;
-			        TypeBinding substitutedBound = substitute(substitution, originalBound);
-			        TypeBinding[] originalOtherBounds = wildcard.otherBounds;
-			        TypeBinding[] substitutedOtherBounds = substitute(substitution, originalOtherBounds);
-			        if (substitutedBound != originalBound || originalOtherBounds != substitutedOtherBounds) {
-			        	if (originalOtherBounds != null) {
-			        		/* https://bugs.eclipse.org/bugs/show_bug.cgi?id=347145: the constituent intersecting types have changed
-			        		   in the last round of substitution. Reevaluate the composite intersection type, as there is a possibility
-			        		   of the intersection collapsing into one of the constituents, the other being fully subsumed.
-			        		*/
-			    			TypeBinding [] bounds = new TypeBinding[1 + substitutedOtherBounds.length];
-			    			bounds[0] = substitutedBound;
-			    			System.arraycopy(substitutedOtherBounds, 0, bounds, 1, substitutedOtherBounds.length);
-			    			TypeBinding[] glb = Scope.greaterLowerBound(bounds, null); // re-evaluate
-			    			if (glb != null && glb != bounds) {
-			    				substitutedBound = glb[0];
-		    					if (glb.length == 1) {
-			    					substitutedOtherBounds = null;
-			    				} else {
-			    					System.arraycopy(glb, 1, substitutedOtherBounds = new TypeBinding[glb.length - 1], 0, glb.length - 1);
-			    				}
-			    			}
-			        	}
-		        		return wildcard.environment.createWildcard(wildcard.genericType, wildcard.rank, substitutedBound, substitutedOtherBounds, wildcard.boundKind);
-			        }
-		        }
-				break;
-
-			case Binding.TYPE:
-				if (!originalType.isMemberType()) break;
-				ReferenceBinding originalReferenceType = (ReferenceBinding) originalType;
-				originalEnclosing = originalType.enclosingType();
-				substitutedEnclosing = originalEnclosing;
-				if (originalEnclosing != null) {
-					substitutedEnclosing = (ReferenceBinding) substitute(substitution, originalEnclosing);
-					if (isMemberTypeOfRaw(originalType, substitutedEnclosing))
-						return substitution.environment().createRawType(originalReferenceType, substitutedEnclosing);
-				}
-
-			    // treat as if parameterized with its type variables (non generic type gets 'null' arguments)
-				if (substitutedEnclosing != originalEnclosing) {
-					return substitution.isRawSubstitution()
-						? substitution.environment().createRawType(originalReferenceType, substitutedEnclosing)
-						:  substitution.environment().createParameterizedType(originalReferenceType, null, substitutedEnclosing);
-				}
-				break;
-			case Binding.GENERIC_TYPE:
-				originalReferenceType = (ReferenceBinding) originalType;
-				originalEnclosing = originalType.enclosingType();
-				substitutedEnclosing = originalEnclosing;
-				if (originalEnclosing != null) {
-					substitutedEnclosing = (ReferenceBinding) substitute(substitution, originalEnclosing);
-					if (isMemberTypeOfRaw(originalType, substitutedEnclosing))
-						return substitution.environment().createRawType(originalReferenceType, substitutedEnclosing);
-				}
-
-				if (substitution.isRawSubstitution()) {
-					return substitution.environment().createRawType(originalReferenceType, substitutedEnclosing);
-				}
-			    // treat as if parameterized with its type variables (non generic type gets 'null' arguments)
-				originalArguments = originalReferenceType.typeVariables();
-				substitutedArguments = substitute(substitution, originalArguments);
-				return substitution.environment().createParameterizedType(originalReferenceType, substitutedArguments, substitutedEnclosing);
-		}
-		return originalType;
-	}
-
-	private static boolean isMemberTypeOfRaw(TypeBinding originalType, ReferenceBinding substitutedEnclosing) {
-		// 4.8:
-		// "a raw type is defined to be one of:
-		// ...
-	    // * A non-static member type of a raw type R that is not 
-		//   inherited from a superclass or superinterface of R."
-
-		// Due to staticness, e.g., Map.Entry<String,Object> is *not* considered as a raw type
-
-		return (substitutedEnclosing != null && substitutedEnclosing.isRawType()) 
-				&& ((originalType instanceof ReferenceBinding) && !((ReferenceBinding)originalType).isStatic());
+		return defaultSubstitutor.substitute(substitution, originalType);
 	}
 
 	/**
@@ -509,28 +438,201 @@
 	 * Only allocate an array if anything is different.
 	 */
 	public static TypeBinding[] substitute(Substitution substitution, TypeBinding[] originalTypes) {
-		if (originalTypes == null) return null;
-	    TypeBinding[] substitutedTypes = originalTypes;
-	    for (int i = 0, length = originalTypes.length; i < length; i++) {
-	        TypeBinding originalType = originalTypes[i];
-	        TypeBinding substitutedParameter = substitute(substitution, originalType);
-	        if (substitutedParameter != originalType) {
-	            if (substitutedTypes == originalTypes) {
-	                System.arraycopy(originalTypes, 0, substitutedTypes = new TypeBinding[length], 0, i);
-	            }
-	            substitutedTypes[i] = substitutedParameter;
-	        } else if (substitutedTypes != originalTypes) {
-	            substitutedTypes[i] = originalType;
-	        }
-	    }
-	    return substitutedTypes;
+		return defaultSubstitutor.substitute(substitution, originalTypes);
+	}
+
+	/** Bridge to non-static implementation in {@link Substitutor}, to make methods overridable. */ 
+	private static Substitutor defaultSubstitutor = new Substitutor();
+	public static class Substitutor {
+		/**
+		 * Returns an array of types, where original types got substituted given a substitution.
+		 * Only allocate an array if anything is different.
+		 */
+		public ReferenceBinding[] substitute(Substitution substitution, ReferenceBinding[] originalTypes) {
+			if (originalTypes == null) return null;
+		    ReferenceBinding[] substitutedTypes = originalTypes;
+		    for (int i = 0, length = originalTypes.length; i < length; i++) {
+		        ReferenceBinding originalType = originalTypes[i];
+		        TypeBinding substitutedType = substitute(substitution, originalType);
+		        if (!(substitutedType instanceof ReferenceBinding)) {
+		        	return null; // impossible substitution
+		        }
+		        if (substitutedType != originalType) { //$IDENTITY-COMPARISON$
+		            if (substitutedTypes == originalTypes) {
+		                System.arraycopy(originalTypes, 0, substitutedTypes = new ReferenceBinding[length], 0, i);
+		            }
+		            substitutedTypes[i] = (ReferenceBinding)substitutedType;
+		        } else if (substitutedTypes != originalTypes) {
+		            substitutedTypes[i] = originalType;
+		        }
+		    }
+		    return substitutedTypes;
+		}
+
+		/**
+		 * Returns a type, where original type was substituted using the receiver
+		 * parameterized type.
+		 * In raw mode (see {@link Substitution#isRawSubstitution()}),
+		 * all parameterized types are converted to raw types.
+		 * Cf. 4.8: "The type of a constructor (8.8), instance method (8.4, 9.4),
+		 *  or non-static field (8.3) M of a raw type C that is not inherited from its 
+		 *  superclasses or superinterfaces is the raw type that corresponds to the erasure
+		 *  of its type in the generic declaration corresponding to C." 
+		 */
+		public TypeBinding substitute(Substitution substitution, TypeBinding originalType) {
+			if (originalType == null) return null;
+	
+			switch (originalType.kind()) {
+	
+				case Binding.TYPE_PARAMETER:
+					return substitution.substitute((TypeVariableBinding) originalType);
+	
+				case Binding.PARAMETERIZED_TYPE:
+					ParameterizedTypeBinding originalParameterizedType = (ParameterizedTypeBinding) originalType;
+					ReferenceBinding originalEnclosing = originalType.enclosingType();
+					ReferenceBinding substitutedEnclosing = originalEnclosing;
+					if (originalEnclosing != null) {
+						substitutedEnclosing = (ReferenceBinding) substitute(substitution, originalEnclosing);
+						if (isMemberTypeOfRaw(originalType, substitutedEnclosing))
+							return originalParameterizedType.environment.createRawType(
+									originalParameterizedType.genericType(), substitutedEnclosing, originalType.getTypeAnnotations());
+					}
+					TypeBinding[] originalArguments = originalParameterizedType.arguments;
+					TypeBinding[] substitutedArguments = originalArguments;
+					if (originalArguments != null) {
+						if (substitution.isRawSubstitution()) {
+							return originalParameterizedType.environment.createRawType(originalParameterizedType.genericType(), substitutedEnclosing, originalType.getTypeAnnotations());
+						}
+						substitutedArguments = substitute(substitution, originalArguments);
+					}
+					if (substitutedArguments != originalArguments || substitutedEnclosing != originalEnclosing) { //$IDENTITY-COMPARISON$
+						return originalParameterizedType.environment.createParameterizedType(
+								originalParameterizedType.genericType(), substitutedArguments, substitutedEnclosing, originalType.getTypeAnnotations());
+					}
+					break;
+	
+				case Binding.ARRAY_TYPE:
+					ArrayBinding originalArrayType = (ArrayBinding) originalType;
+					TypeBinding originalLeafComponentType = originalArrayType.leafComponentType;
+					TypeBinding substitute = substitute(substitution, originalLeafComponentType); // substitute could itself be array type, TODO(Srikanth): need a test case.
+					if (substitute != originalLeafComponentType) { //$IDENTITY-COMPARISON$
+						return originalArrayType.environment.createArrayType(substitute.leafComponentType(), substitute.dimensions() + originalType.dimensions(), originalType.getTypeAnnotations());
+					}
+					break;
+	
+				case Binding.WILDCARD_TYPE:
+				case Binding.INTERSECTION_TYPE:
+			        WildcardBinding wildcard = (WildcardBinding) originalType;
+			        if (wildcard.boundKind != Wildcard.UNBOUND) {
+				        TypeBinding originalBound = wildcard.bound;
+				        TypeBinding substitutedBound = substitute(substitution, originalBound);
+				        TypeBinding[] originalOtherBounds = wildcard.otherBounds;
+				        TypeBinding[] substitutedOtherBounds = substitute(substitution, originalOtherBounds);
+				        if (substitutedBound != originalBound || originalOtherBounds != substitutedOtherBounds) { //$IDENTITY-COMPARISON$
+				        	if (originalOtherBounds != null) {
+				        		/* https://bugs.eclipse.org/bugs/show_bug.cgi?id=347145: the constituent intersecting types have changed
+				        		   in the last round of substitution. Reevaluate the composite intersection type, as there is a possibility
+				        		   of the intersection collapsing into one of the constituents, the other being fully subsumed.
+				        		*/
+				    			TypeBinding [] bounds = new TypeBinding[1 + substitutedOtherBounds.length];
+				    			bounds[0] = substitutedBound;
+				    			System.arraycopy(substitutedOtherBounds, 0, bounds, 1, substitutedOtherBounds.length);
+				    			TypeBinding[] glb = Scope.greaterLowerBound(bounds, null, substitution.environment()); // re-evaluate
+				    			if (glb != null && glb != bounds) {
+				    				substitutedBound = glb[0];
+			    					if (glb.length == 1) {
+				    					substitutedOtherBounds = null;
+				    				} else {
+				    					System.arraycopy(glb, 1, substitutedOtherBounds = new TypeBinding[glb.length - 1], 0, glb.length - 1);
+				    				}
+				    			}
+				        	}
+			        		return wildcard.environment.createWildcard(wildcard.genericType, wildcard.rank, substitutedBound, substitutedOtherBounds, wildcard.boundKind, wildcard.getTypeAnnotations());
+				        }
+			        } 
+					break;
+	
+				case Binding.TYPE:
+					if (!originalType.isMemberType()) break;
+					ReferenceBinding originalReferenceType = (ReferenceBinding) originalType;
+					originalEnclosing = originalType.enclosingType();
+					substitutedEnclosing = originalEnclosing;
+					if (originalEnclosing != null) {
+						substitutedEnclosing = (ReferenceBinding) substitute(substitution, originalEnclosing);
+						if (isMemberTypeOfRaw(originalType, substitutedEnclosing))
+							return substitution.environment().createRawType(originalReferenceType, substitutedEnclosing, originalType.getTypeAnnotations());
+					}
+	
+				    // treat as if parameterized with its type variables (non generic type gets 'null' arguments)
+					if (substitutedEnclosing != originalEnclosing) { //$IDENTITY-COMPARISON$
+						return substitution.isRawSubstitution()
+							? substitution.environment().createRawType(originalReferenceType, substitutedEnclosing, originalType.getTypeAnnotations())
+							:  substitution.environment().createParameterizedType(originalReferenceType, null, substitutedEnclosing, originalType.getTypeAnnotations());
+					}
+					break;
+				case Binding.GENERIC_TYPE:
+					originalReferenceType = (ReferenceBinding) originalType;
+					originalEnclosing = originalType.enclosingType();
+					substitutedEnclosing = originalEnclosing;
+					if (originalEnclosing != null) {
+						substitutedEnclosing = (ReferenceBinding) (originalType.isStatic() ? substitution.environment().convertToRawType(originalEnclosing, true) : 
+																							(ReferenceBinding) substitute(substitution, originalEnclosing));
+						if (isMemberTypeOfRaw(originalType, substitutedEnclosing))
+							return substitution.environment().createRawType(originalReferenceType, substitutedEnclosing, originalType.getTypeAnnotations());
+					}
+	
+					if (substitution.isRawSubstitution()) {
+						return substitution.environment().createRawType(originalReferenceType, substitutedEnclosing, originalType.getTypeAnnotations());
+					}
+				    // treat as if parameterized with its type variables (non generic type gets 'null' arguments)
+					originalArguments = originalReferenceType.typeVariables();
+					substitutedArguments = substitute(substitution, originalArguments);
+					return substitution.environment().createParameterizedType(originalReferenceType, substitutedArguments, substitutedEnclosing, originalType.getTypeAnnotations());
+			}
+			return originalType;
+		}
+		
+		private static boolean isMemberTypeOfRaw(TypeBinding originalType, ReferenceBinding substitutedEnclosing) {
+			// 4.8:
+			// "a raw type is defined to be one of:
+			// ...
+			// * A non-static member type of a raw type R that is not 
+			//   inherited from a superclass or superinterface of R."
+			
+			// Due to staticness, e.g., Map.Entry<String,Object> is *not* considered as a raw type
+			
+			return (substitutedEnclosing != null && substitutedEnclosing.isRawType()) 
+					&& ((originalType instanceof ReferenceBinding) && !((ReferenceBinding)originalType).isStatic());
+		}
+		
+		/**
+		 * Returns an array of types, where original types got substituted given a substitution.
+		 * Only allocate an array if anything is different.
+		 */
+		public TypeBinding[] substitute(Substitution substitution, TypeBinding[] originalTypes) {
+			if (originalTypes == null) return null;
+			TypeBinding[] substitutedTypes = originalTypes;
+			for (int i = 0, length = originalTypes.length; i < length; i++) {
+				TypeBinding originalType = originalTypes[i];
+				TypeBinding substitutedParameter = substitute(substitution, originalType);
+				if (substitutedParameter != originalType) { //$IDENTITY-COMPARISON$
+					if (substitutedTypes == originalTypes) {
+						System.arraycopy(originalTypes, 0, substitutedTypes = new TypeBinding[length], 0, i);
+					}
+					substitutedTypes[i] = substitutedParameter;
+				} else if (substitutedTypes != originalTypes) {
+					substitutedTypes[i] = originalType;
+				}
+			}
+			return substitutedTypes;
+		}
 	}
 
 	/*
 	 * Boxing primitive
 	 */
 	public TypeBinding boxing(TypeBinding type) {
-		if (type.isBaseType())
+		if (type.isBaseType() || type.kind() == Binding.POLY_TYPE)
 			return environment().computeBoxingType(type);
 		return type;
 	}
@@ -587,8 +689,8 @@
 	 * Will answer a substituted method in case the method was generic and type inference got triggered;
 	 * in case the method was originally compatible, then simply answer it back.
 	 */
-	protected final MethodBinding computeCompatibleMethod(MethodBinding method, TypeBinding[] arguments, InvocationSite invocationSite) {
-		return computeCompatibleMethod(method, arguments, invocationSite, false);
+	protected final MethodBinding computeCompatibleMethod(MethodBinding method, TypeBinding[] arguments, InvocationSite invocationSite, int inferenceLevel) {
+		return computeCompatibleMethod(method, arguments, invocationSite, inferenceLevel, false);
 	}	
 	/**
 	 * Internal use only
@@ -596,7 +698,9 @@
 	 * Will answer a substituted method in case the method was generic and type inference got triggered;
 	 * in case the method was originally compatible, then simply answer it back.
 	 */
-	protected final MethodBinding computeCompatibleMethod(MethodBinding method, TypeBinding[] arguments, InvocationSite invocationSite, boolean tiebreakingVarargsMethods) {
+	protected final MethodBinding computeCompatibleMethod(MethodBinding method, TypeBinding[] arguments,
+			InvocationSite invocationSite, int inferenceLevel, boolean tiebreakingVarargsMethods)
+	{
 		TypeBinding[] genericTypeArguments = invocationSite.genericTypeArguments();
 		TypeBinding[] parameters = method.parameters;
 		TypeVariableBinding[] typeVariables = method.typeVariables;
@@ -628,7 +732,9 @@
 			}
 			if (newArgs != null)
 				arguments = newArgs;
-			method = ParameterizedGenericMethodBinding.computeCompatibleMethod(method, arguments, this, invocationSite);
+			else  // ensure that computeCompatibleMethod() below can update arguments without harming our caller: (TODO: always copy before the loop? only in 1.8?)
+				System.arraycopy(arguments, 0, arguments=new TypeBinding[argLength], 0, argLength);
+			method = ParameterizedGenericMethodBinding.computeCompatibleMethod(method, arguments, this, invocationSite, inferenceLevel);
 			if (method == null) return null; // incompatible
 			if (!method.isValidBinding()) return method; // bound check issue is taking precedence
 		} else if (genericTypeArguments != null && compilerOptions.complianceLevel < ClassFileConstants.JDK1_7) {
@@ -641,20 +747,11 @@
 			}
 		}
 
-		int compatibilityLevel;
 		if (tiebreakingVarargsMethods) {
 			if (CompilerOptions.tolerateIllegalAmbiguousVarargsInvocation && compilerOptions.complianceLevel < ClassFileConstants.JDK1_7)
 				tiebreakingVarargsMethods = false;
 		}
-		if ((compatibilityLevel = parameterCompatibilityLevel(method, arguments, tiebreakingVarargsMethods)) > NOT_COMPATIBLE) {
-			if (compatibilityLevel == VARARGS_COMPATIBLE) {
-				TypeBinding varargsElementType = method.parameters[method.parameters.length - 1].leafComponentType();
-				if (varargsElementType instanceof ReferenceBinding) {
-					if (!((ReferenceBinding) varargsElementType).canBeSeenBy(this)) {
-						return new ProblemMethodBinding(method, method.selector, genericTypeArguments, ProblemReasons.VarargsElementTypeNotVisible);
-					}
-				}
-			}
+		if ((parameterCompatibilityLevel18(method, arguments, tiebreakingVarargsMethods, invocationSite)) > NOT_COMPATIBLE) {
 			if ((method.tagBits & TagBits.AnnotationPolymorphicSignature) != 0) {
 				// generate polymorphic method
 				return this.environment().createPolymorphicMethod(method, arguments);
@@ -669,6 +766,148 @@
 		return null; // incompatible
 	}
 
+	private int parameterCompatibilityLevel18(MethodBinding method, TypeBinding[] arguments, boolean tiebreakingVarargsMethods, InvocationSite site) {
+		jdk18checks:
+		if (site instanceof Invocation && compilerOptions().complianceLevel >= ClassFileConstants.JDK1_8) {
+			Invocation invocation = (Invocation) site;
+			if (method instanceof ParameterizedGenericMethodBinding) {
+				InferenceContext18 infCtx = invocation.getInferenceContext((ParameterizedGenericMethodBinding) method);
+				if (infCtx != null) {
+					// inference is responsible, no need to recheck
+					if (infCtx.isVarArgs())
+						return VARARGS_COMPATIBLE;
+					return COMPATIBLE;
+				}
+			}
+			// collect inner invocations where the outer did not involve any inference:
+			Expression[] invocationArguments = invocation.arguments();
+			if (invocationArguments != null) {
+				InnerInferenceHelper innerInferenceHelper = invocation.innerInferenceHelper();
+				int argLen = invocationArguments.length;
+				boolean isVarArgs[] = new boolean[1]; // emulate an in-out parameter for compatibilityLevel18FromInner(..)
+				isVarArgs[0] = method.isVarargs() && argLen != method.parameters.length; // if same lengths, isVarArgs can still be updated below
+				int level = COMPATIBLE;
+				for (int i = 0; i < argLen; i++) {
+					TypeBinding argumentType = i < arguments.length ? arguments[i] : null; // length mismatch may happen from CodeSnippetMessageSend.resolveType() in the if (argHasError) block.
+					int nextLevel = compatibilityLevel18FromInner(method, innerInferenceHelper, invocationArguments[i], argumentType, argLen, i, isVarArgs);
+					if (nextLevel == NOT_COMPATIBLE)
+						return nextLevel;
+					if (nextLevel == -2)
+						break jdk18checks;
+					level = Math.max(level,  nextLevel);
+				}
+				return level; // neither NOT_COMPATIBLE nor unknown(-2) seen
+			}
+		}
+		// fall back to old method:
+		return parameterCompatibilityLevel(method, arguments, tiebreakingVarargsMethods);
+	}
+
+	private int compatibilityLevel18FromInner(MethodBinding method, InnerInferenceHelper innerInferenceHelper, Expression invocArg, TypeBinding argType, int argLen, int i, boolean[] isVarArgs)
+	{
+		int compatible = isVarArgs[0] ? VARARGS_COMPATIBLE : COMPATIBLE;
+		TypeBinding resolvedType = invocArg.resolvedType;
+		TypeBinding targetType = InferenceContext18.getParameter(method.parameters, i, isVarArgs[0]);
+		if (!isVarArgs[0] && shouldTryVarargs(method, resolvedType, targetType)) {
+			isVarArgs[0] = true;
+			targetType = InferenceContext18.getParameter(method.parameters, i, true);
+		}
+		if (targetType == null)
+			return NOT_COMPATIBLE; // mismatching number of args or other severe problem inside method binding
+		int level = -2; // don't know
+		if (invocArg instanceof Invocation && resolvedType != null) {
+			Invocation innerPoly = (Invocation) invocArg;
+			level = parameterCompatibilityLevel(resolvedType, targetType);
+			if (level != NOT_COMPATIBLE) {
+				if (TypeBinding.notEquals(argType, resolvedType) && innerInferenceHelper != null)
+					innerInferenceHelper.registerInnerResult(method, resolvedType, argLen, i);
+				return Math.max(compatible, level);
+			} else {
+				MethodBinding innerBinding = innerPoly.binding(null, false, null); // 1. try without update
+				if (innerBinding instanceof ParameterizedGenericMethodBinding) {
+					ParameterizedGenericMethodBinding innerParameterized = (ParameterizedGenericMethodBinding) innerBinding;
+					InferenceContext18 infCtx18 = innerPoly.getInferenceContext(innerParameterized);
+					if (infCtx18 != null && !infCtx18.hasResultFor(targetType)) {
+						// not detected as compatible, because inference still needs to complete?
+						invocArg.setExpectedType(targetType);
+						MethodBinding solution = infCtx18.inferInvocationType(innerPoly, innerParameterized);
+						if (solution != null && solution.isValidBinding()) {
+							if (innerPoly.updateBindings(solution, targetType)) {
+								if (innerInferenceHelper != null)
+									innerInferenceHelper.registerInnerResult(method, invocArg.resolvedType, argLen, i);
+							}
+							if (solution.returnType != null) {
+								level = parameterCompatibilityLevel(solution.returnType, targetType);
+								if (level != NOT_COMPATIBLE)
+									return Math.max(compatible, level);
+							}
+						}
+						invocArg.setExpectedType(null);
+						return NOT_COMPATIBLE;
+					} else if (innerPoly instanceof AllocationExpression) {
+						// not detected as compatible, because its a diamond whose type hasn't yet been inferred?
+						TypeBinding[] typeArguments = resolvedType.typeArguments();
+						if (typeArguments != null && typeArguments.length == 0) {
+							AllocationExpression alloc = (AllocationExpression) innerPoly;
+							if ((alloc.type.bits & ASTNode.IsDiamond) != 0) {
+								// not-yet-inferred diamond: erasure compatibility should suffice, detail will be checked using inference
+								if (resolvedType.isCompatibleWith(targetType.erasure(), this))
+									return compatible;
+								return NOT_COMPATIBLE;
+							}
+						}
+					}
+				} else if (innerPoly instanceof AllocationExpression) {
+					MethodBinding updatedMethod = innerPoly.binding(targetType, false, null); // 2. try with updating
+					if (updatedMethod != innerBinding && updatedMethod != null) {
+						if (updatedMethod.isValidBinding()) {
+						if (updatedMethod.declaringClass.isCompatibleWith(targetType))
+							return compatible;
+						return NOT_COMPATIBLE;
+						} else if (updatedMethod.problemId() == ProblemReasons.Ambiguous) {
+							level = -2; // neither good nor bad, answer "unknown"
+						}
+					}
+				}
+			}
+		} else if (invocArg.isPolyExpression()) {
+			if (invocArg instanceof ConditionalExpression) {
+				ConditionalExpression ce = (ConditionalExpression) invocArg;
+				int level1 = compatibilityLevel18FromInner(method, innerInferenceHelper, ce.valueIfTrue, argType, argLen, i, isVarArgs);
+				if (level1 == NOT_COMPATIBLE)
+					return NOT_COMPATIBLE;
+				int level2 = compatibilityLevel18FromInner(method, innerInferenceHelper, ce.valueIfFalse, argType, argLen, i, isVarArgs);
+				if (level2 == NOT_COMPATIBLE)
+					return NOT_COMPATIBLE;
+				return Math.max(level1, level2);
+			}
+			// LE or RE:
+			if (invocArg.isCompatibleWith(targetType, this))
+				return COMPATIBLE;
+			if (!isVarArgs[0] && method.isVarargs()) { // can't use shouldTryVarargs without a resolvedType, so just try it:
+				isVarArgs[0] = true;
+				targetType = InferenceContext18.getParameter(method.parameters, i, true);
+				if (targetType != null && invocArg.isCompatibleWith(targetType, this))
+					return VARARGS_COMPATIBLE;
+			}
+			return NOT_COMPATIBLE;
+		} else if (resolvedType != null && resolvedType.isValidBinding()) {
+			// need to handle "normal" expressions too, since mixed poly/standalone argument lists must be fully analyzed.
+			return parameterCompatibilityLevel(resolvedType, targetType);
+		}
+		return level;
+	}
+
+	private boolean shouldTryVarargs(MethodBinding method, TypeBinding resolvedType, TypeBinding targetType) {
+		if (!method.isVarargs())
+			return false;
+		if (targetType == null)
+			return true;	// off range
+		if (targetType.isArrayType() && resolvedType != null && !resolvedType.isCompatibleWith(targetType, this))
+			return true;	// not a direct match but hope to improve
+		return false;
+	}
+
 	/**
 	 * Connect type variable supertypes, and returns true if no problem was detected
 	 * @param typeParameters
@@ -685,17 +924,18 @@
 		Map invocations = new HashMap(2);
 		boolean noProblems = true;
 		// preinitializing each type variable
-		for (int i = 0, paramLength = typeParameters.length; i < paramLength; i++) {
+		int paramLength = typeParameters.length;
+		for (int i = 0; i < paramLength; i++) {
 			TypeParameter typeParameter = typeParameters[i];
 			TypeVariableBinding typeVariable = typeParameter.binding;
 			if (typeVariable == null) return false;
 
-			typeVariable.superclass = getJavaLangObject();
-			typeVariable.superInterfaces = Binding.NO_SUPERINTERFACES;
+			typeVariable.setSuperClass(getJavaLangObject());
+			typeVariable.setSuperInterfaces(Binding.NO_SUPERINTERFACES);
 			// set firstBound to the binding of the first explicit bound in parameter declaration
-			typeVariable.firstBound = null; // first bound used to compute erasure
+			typeVariable.setFirstBound(null); // first bound used to compute erasure
 		}
-		nextVariable: for (int i = 0, paramLength = typeParameters.length; i < paramLength; i++) {
+		nextVariable: for (int i = 0; i < paramLength; i++) {
 			TypeParameter typeParameter = typeParameters[i];
 			TypeVariableBinding typeVariable = typeParameter.binding;
 			TypeReference typeRef = typeParameter.type;
@@ -752,12 +992,12 @@
 					}
 					ReferenceBinding superRefType = (ReferenceBinding) superType;
 					if (!superType.isInterface()) {
-						typeVariable.superclass = superRefType;
+						typeVariable.setSuperClass(superRefType);
 					} else {
-						typeVariable.superInterfaces = new ReferenceBinding[] {superRefType};
+						typeVariable.setSuperInterfaces(new ReferenceBinding[] {superRefType});
 					}
 					typeVariable.tagBits |= superType.tagBits & TagBits.ContainsNestedTypeReferences;
-					typeVariable.firstBound = superRefType; // first bound used to compute erasure
+					typeVariable.setFirstBound(superRefType); // first bound used to compute erasure
 				}
 			}
 			TypeReference[] boundRefs = typeParameter.bounds;
@@ -794,7 +1034,7 @@
 							}
 						}
 						// check against superclass
-						if (checkForErasedCandidateCollisions && typeVariable.firstBound == typeVariable.superclass) {
+						if (checkForErasedCandidateCollisions && TypeBinding.equalsEquals(typeVariable.firstBound, typeVariable.superclass)) {
 							if (hasErasedCandidatesCollisions(superType, typeVariable.superclass, invocations, typeVariable, typeRef)) {
 								continue nextBound;
 							}
@@ -803,7 +1043,7 @@
 						ReferenceBinding superRefType = (ReferenceBinding) superType;
 						for (int index = typeVariable.superInterfaces.length; --index >= 0;) {
 							ReferenceBinding previousInterface = typeVariable.superInterfaces[index];
-							if (previousInterface == superRefType) {
+							if (TypeBinding.equalsEquals(previousInterface, superRefType)) {
 								problemReporter().duplicateBounds(typeRef, superType);
 								typeVariable.tagBits |= TagBits.HierarchyHasProblems;
 								continue nextBound;
@@ -815,19 +1055,27 @@
 							}
 						}
 						int size = typeVariable.superInterfaces.length;
-						System.arraycopy(typeVariable.superInterfaces, 0, typeVariable.superInterfaces = new ReferenceBinding[size + 1], 0, size);
+						System.arraycopy(typeVariable.superInterfaces, 0, typeVariable.setSuperInterfaces(new ReferenceBinding[size + 1]), 0, size);
 						typeVariable.superInterfaces[size] = superRefType;
 					}
 				}
 			}
 			noProblems &= (typeVariable.tagBits & TagBits.HierarchyHasProblems) == 0;
 		}
+		// after bounds have been resolved we're ready for resolving the type parameter itself,
+		// which includes resolving/evaluating type annotations and checking for inconsistencies
+		for (int i = 0; i < paramLength; i++)
+			resolveTypeParameter(typeParameters[i]);
 		return noProblems;
 	}
 
 	public ArrayBinding createArrayType(TypeBinding type, int dimension) {
+		return createArrayType(type, dimension, Binding.NO_ANNOTATIONS);
+	}
+
+	public ArrayBinding createArrayType(TypeBinding type, int dimension, AnnotationBinding[] annotations) {
 		if (type.isValidBinding())
-			return environment().createArrayType(type, dimension);
+			return environment().createArrayType(type, dimension, annotations);
 		// do not cache obvious invalid types
 		return new ArrayBinding(type, dimension, environment());
 	}
@@ -896,6 +1144,10 @@
 		return typeVariableBindings;
 	}
 
+	void resolveTypeParameter(TypeParameter typeParameter) {
+		// valid only for ClassScope and MethodScope
+	}
+
 	public final ClassScope enclosingClassScope() {
 		Scope scope = this;
 		while ((scope = scope.parent) != null) {
@@ -911,6 +1163,18 @@
 		}
 		return null; // may answer null if no method around
 	}
+	
+	public final MethodScope enclosingLambdaScope() {
+		Scope scope = this;
+		while ((scope = scope.parent) != null) {
+			if (scope instanceof MethodScope) {
+				MethodScope methodScope = (MethodScope) scope;
+				if (methodScope.referenceContext instanceof LambdaExpression) 
+					return methodScope;
+			}
+		}
+		return null; // may answer null if no method around
+	}
 
 	/* Answer the scope receiver type (could be parameterized)
 	*/
@@ -981,7 +1245,11 @@
 		return ((CompilationUnitScope) unitScope).environment;
 	}
 
-	// abstract method lookup lookup (since maybe missing default abstract methods)
+	/* Abstract method lookup (since maybe missing default abstract methods). "Default abstract methods" are methods that used to be emitted into 
+	   abstract classes for unimplemented interface methods at JDK 1.1 time frame. See SourceTypeBinding.addDefaultAbstractMethods()
+	   See also https://bugs.eclipse.org/bugs/show_bug.cgi?id=174588 for details of problem addressed here. Problem was in the method call in the 
+	   *abstract* class. Unless the interface methods are looked up, we will emit code that results in infinite recursion.
+	*/
 	protected MethodBinding findDefaultAbstractMethod(
 		ReferenceBinding receiverType,
 		char[] selector,
@@ -992,6 +1260,7 @@
 		MethodBinding concreteMatch) {
 
 		int startFoundSize = found.size;
+		final boolean sourceLevel18 = this.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8;
 		ReferenceBinding currentType = classHierarchyStart;
 		while (currentType != null) {
 			findMethodInSuperInterfaces(currentType, selector, found, invocationSite);
@@ -1003,13 +1272,24 @@
 		int foundSize = found.size;
 		if (foundSize > startFoundSize) {
 			// argument type compatibility check
+			final MethodVerifier methodVerifier = environment().methodVerifier();
+			next:
 			for (int i = startFoundSize; i < foundSize; i++) {
 				MethodBinding methodBinding = (MethodBinding) found.elementAt(i);
-				MethodBinding compatibleMethod = computeCompatibleMethod(methodBinding, argumentTypes, invocationSite);
+				MethodBinding compatibleMethod = computeCompatibleMethod(methodBinding, argumentTypes, invocationSite, APPLICABILITY);
 				if (compatibleMethod != null) {
 					if (compatibleMethod.isValidBinding()) {
-						if (concreteMatch != null && environment().methodVerifier().areMethodsCompatible(concreteMatch, compatibleMethod))
-							continue; // can skip this method since concreteMatch overrides it
+						if (concreteMatch != null) {
+							if (methodVerifier.areMethodsCompatible(concreteMatch, compatibleMethod))
+								continue; // can skip this method since concreteMatch overrides it
+						}
+						if (sourceLevel18) {
+							for (int j = 0; j < startFoundSize; j++) {
+								MethodBinding classMethod = (MethodBinding) found.elementAt(j);
+								if (classMethod != null && methodVerifier.areMethodsCompatible(classMethod, compatibleMethod))
+									continue next; // can skip this method since classMethod overrides it
+							}
+						}
 						if (candidatesCount == 0) {
 							candidates = new MethodBinding[foundSize - startFoundSize + 1];
 							if (concreteMatch != null)
@@ -1029,6 +1309,8 @@
 					return problemMethod; // can be null
 				concreteMatch = candidates[0];
 			}
+			// 1.8: Give inference a chance to perform outstanding tasks (18.5.2):
+			concreteMatch = inferInvocationType(invocationSite, concreteMatch, argumentTypes);
 			compilationUnitScope().recordTypeReferences(concreteMatch.thrownExceptions);
 			return concreteMatch;
 		}
@@ -1100,7 +1382,7 @@
 				// targeting a generic method could find an exact match with variable return type
 				if (invocationSite.genericTypeArguments() != null) {
 					// computeCompatibleMethod(..) will return a PolymorphicMethodBinding if needed
-					exactMethod = computeCompatibleMethod(exactMethod, argumentTypes, invocationSite);
+					exactMethod = computeCompatibleMethod(exactMethod, argumentTypes, invocationSite, FULL_INFERENCE);
 				} else if ((exactMethod.tagBits & TagBits.AnnotationPolymorphicSignature) != 0) {
 					// generate polymorphic method
 					return this.environment().createPolymorphicMethod(exactMethod, argumentTypes);
@@ -1187,16 +1469,16 @@
 			return new ProblemFieldBinding(currentType, fieldName, ProblemReasons.ReceiverTypeNotVisible);
 
 		currentType.initializeForStaticImports();
-		FieldBinding field = currentType.getField(fieldName,true/*resolve*/,invocationSite,this); // AspectJ Extension, was getField(fieldName, needResolve);
+		FieldBinding field = currentType.getField(fieldName,true/*resolve*/,invocationSite,this); // AspectJ extension, was getField(fieldName,needResolve);
 //		FieldBinding field = currentType.getField(fieldName, needResolve);
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=316456
 		boolean insideTypeAnnotations = this instanceof MethodScope && ((MethodScope) this).insideTypeAnnotation;
 		if (field != null) {
-			//	AspectJ Extension
-			FieldBinding ret = field.getVisibleBinding(currentType, invocationSite, this);
-			if (ret != null)
-				return ret;
-			//	End AspectJ Extension				
+                        //      AspectJ Extension
+                        FieldBinding ret = field.getVisibleBinding(currentType, invocationSite, this);
+                        if (ret != null)
+                                return ret;
+                        //      End AspectJ Extension
 			if (invisibleFieldsOk) {
 				return field;
 			}
@@ -1226,7 +1508,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -1237,14 +1519,14 @@
 			unitScope.recordTypeReference(currentType);
 			currentType.initializeForStaticImports();
 			currentType = (ReferenceBinding) currentType.capture(this, invocationSite == null ? 0 : invocationSite.sourceEnd());
-			if ((field = currentType.getField(fieldName, needResolve,invocationSite,this)) != null) { // AspectJ Extension - was getField(fieldname,needResolve)
+			if ((field = currentType.getField(fieldName, needResolve, invocationSite, this)) != null) { // AspectJ Extension - was getField(fieldName,needResolve)
 				if (invisibleFieldsOk) {
 					return field;
 				}
 				keepLooking = false;
-				//	AspectJ Extension
-				field = field.getVisibleBinding(receiverType, invocationSite, this);
-				if (field != null) {
+                                //      AspectJ Extension
+                                field = field.getVisibleBinding(receiverType, invocationSite, this);
+                                if (field != null) {
 				// End AspectJ Extension
 				if (field.canBeSeenBy(receiverType, invocationSite, this)) {
 					if (visibleField == null)
@@ -1266,11 +1548,11 @@
 				ReferenceBinding anInterface = interfacesToVisit[i];
 				unitScope.recordTypeReference(anInterface);
 				// no need to capture rcv interface, since member field is going to be static anyway
-				if ((field = anInterface.getField(fieldName, true /*resolve*/,invocationSite,this)) != null) { // AspectJ Extension - was getField(fieldName,true /*resolve*/)
-					//	AspectJ Extension
-					field = field.getVisibleBinding(receiverType, invocationSite, this);
-					if (field != null) {
-				    //	End AspectJ Extension
+				if ((field = anInterface.getField(fieldName, true /*resolve*/, invocationSite, this)) != null) { // AspectJ Extension - was getField(fieldName,true/*resolve*/)
+									 //      AspectJ Extension
+                                        field = field.getVisibleBinding(receiverType, invocationSite, this);
+                                        if (field != null) {
+                                    //  End AspectJ Extension
 					if (invisibleFieldsOk) {
 						return field;
 					}
@@ -1290,7 +1572,7 @@
 						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;
+								if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 							interfacesToVisit[nextPosition++] = next;
 						}
 					}
@@ -1313,7 +1595,7 @@
 		if ((enclosingType.tagBits & TagBits.HasNoMemberTypes) != 0)
 			return null; // know it has no member types (nor inherited member types)
 
-		ReferenceBinding enclosingSourceType = invocationType();//enclosingSourceType();  AspectJ Extension
+		ReferenceBinding enclosingSourceType = invocationType();// AspectJ Extension - was enclosingSourceType();
 		PackageBinding currentPackage = getCurrentPackage();
 		CompilationUnitScope unitScope = compilationUnitScope();
 		unitScope.recordReference(enclosingType, typeName);
@@ -1357,7 +1639,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -1404,7 +1686,7 @@
 						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;
+								if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 							interfacesToVisit[nextPosition++] = next;
 						}
 					}
@@ -1421,12 +1703,20 @@
 	}
 
 	// Internal use only - use findMethod()
-	public MethodBinding findMethod(ReferenceBinding receiverType, char[] selector, TypeBinding[] argumentTypes, InvocationSite invocationSite) {
-		return findMethod(receiverType, selector, argumentTypes, invocationSite, false);
-	}
-
-	// Internal use only - use findMethod()
 	public MethodBinding findMethod(ReferenceBinding receiverType, char[] selector, TypeBinding[] argumentTypes, InvocationSite invocationSite, boolean inStaticContext) {
+		MethodBinding method = findMethod0(receiverType, selector, argumentTypes, invocationSite, inStaticContext);
+		if (method != null && method.isValidBinding() && method.isVarargs()) {
+			TypeBinding elementType = method.parameters[method.parameters.length - 1].leafComponentType();
+			if (elementType instanceof ReferenceBinding) {
+				if (!((ReferenceBinding) elementType).canBeSeenBy(this)) {
+					return new ProblemMethodBinding(method, method.selector, invocationSite.genericTypeArguments(), ProblemReasons.VarargsElementTypeNotVisible);
+				}
+			}
+		}
+		return method;
+	}	
+	
+	public MethodBinding findMethod0(ReferenceBinding receiverType, char[] selector, TypeBinding[] argumentTypes, InvocationSite invocationSite, boolean inStaticContext) {
 		ReferenceBinding currentType = receiverType;
 		boolean receiverTypeIsInterface = receiverType.isInterface();
 		ObjectVector found = new ObjectVector(3);
@@ -1446,6 +1736,7 @@
 		long complianceLevel = compilerOptions().complianceLevel;
 		boolean isCompliant14 = complianceLevel >= ClassFileConstants.JDK1_4;
 		boolean isCompliant15 = complianceLevel >= ClassFileConstants.JDK1_5;
+		boolean soureLevel18 = compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8;
 		ReferenceBinding classHierarchyStart = currentType;
 		MethodVerifier verifier = environment().methodVerifier();
 		while (currentType != null) {
@@ -1507,18 +1798,27 @@
 		MethodBinding[] candidates = null;
 		int candidatesCount = 0;
 		MethodBinding problemMethod = null;
-		boolean searchForDefaultAbstractMethod = isCompliant14 && ! receiverTypeIsInterface && (receiverType.isAbstract() || receiverType.isTypeVariable());
+		boolean searchForDefaultAbstractMethod = soureLevel18 || (isCompliant14 && ! receiverTypeIsInterface && (receiverType.isAbstract() || receiverType.isTypeVariable()));
 		if (foundSize > 0) {
 			// argument type compatibility check
 			for (int i = 0; i < foundSize; i++) {
 				MethodBinding methodBinding = (MethodBinding) found.elementAt(i);
-				MethodBinding compatibleMethod = computeCompatibleMethod(methodBinding, argumentTypes, invocationSite);
+				MethodBinding compatibleMethod = computeCompatibleMethod(methodBinding, argumentTypes, invocationSite, APPLICABILITY);
 				if (compatibleMethod != null) {
 					if (compatibleMethod.isValidBinding()) {
 						if (foundSize == 1 && compatibleMethod.canBeSeenBy(receiverType, invocationSite, this)) {
 							// return the single visible match now
 							if (searchForDefaultAbstractMethod)
 								return findDefaultAbstractMethod(receiverType, selector, argumentTypes, invocationSite, classHierarchyStart, found, compatibleMethod);
+// ==== 1.8: Finalize type inference of generic methods: ====
+							MethodBinding improved = inferInvocationType(invocationSite, compatibleMethod, argumentTypes);
+							if (improved.isValidBinding()) {
+								compatibleMethod = improved;
+							} else {
+								problemMethod = improved;
+								continue;
+							}
+// ==== 1.8 ====
 							unitScope.recordTypeReferences(compatibleMethod.thrownExceptions);
 							return compatibleMethod;
 						}
@@ -1546,7 +1846,20 @@
 			// error is already reported
 			MethodBinding interfaceMethod =
 				findDefaultAbstractMethod(receiverType, selector, argumentTypes, invocationSite, classHierarchyStart, found, null);
-			if (interfaceMethod != null) return interfaceMethod;
+			if (interfaceMethod != null) {
+				if (soureLevel18 && foundSize > 0 && interfaceMethod.isVarargs() && interfaceMethod instanceof ParameterizedGenericMethodBinding) {
+					MethodBinding original = interfaceMethod.original();
+					for (int i = 0; i < foundSize; i++) {
+						MethodBinding classMethod = (MethodBinding) found.elementAt(i);
+						if (!classMethod.isAbstract()) { // this check shouldn't matter, but to compatible with javac...
+							MethodBinding substitute = verifier.computeSubstituteMethod(original, classMethod);
+							if (substitute != null && verifier.isSubstituteParameterSubsignature(classMethod, substitute)) 
+								return new ProblemMethodBinding(interfaceMethod, selector, argumentTypes, ProblemReasons.ApplicableMethodOverriddenByInapplicable);
+						}
+					}
+				}
+				return interfaceMethod;
+			}
 			if (found.size == 0) return null;
 			if (problemMethod != null) return problemMethod;
 
@@ -1569,7 +1882,7 @@
 				next: for (int a = 0; a < argLength; a++) {
 					TypeBinding arg = argumentTypes[a];
 					for (int p = a == 0 ? 0 : a - 1; p < paramLength && p < a + 1; p++) { // look one slot before & after to see if the type matches
-						if (params[p] == arg) {
+						if (TypeBinding.equalsEquals(params[p], arg)) {
 							argMatches++;
 							continue next;
 						}
@@ -1616,12 +1929,12 @@
 						visiblesCount++;
 					}
 				} else {
-					if (visiblesCount != i) {
-						candidates[i] = null;
-						candidates[visiblesCount] = methodBinding;
-					}
-					visiblesCount++;
+				if (visiblesCount != i) {
+					candidates[i] = null;
+					candidates[visiblesCount] = methodBinding;
 				}
+				visiblesCount++;
+			}
 //				// End AspectJ Extension
 		}
 		switch (visiblesCount) {
@@ -1635,8 +1948,10 @@
 			case 1 :
 				if (searchForDefaultAbstractMethod)
 					return findDefaultAbstractMethod(receiverType, selector, argumentTypes, invocationSite, classHierarchyStart, found, candidates[0]);
-				unitScope.recordTypeReferences(candidates[0].thrownExceptions);
-				return candidates[0];
+				// 1.8: Give inference a chance to perform outstanding tasks (18.5.2):
+				candidate = inferInvocationType(invocationSite, candidates[0], argumentTypes);
+				unitScope.recordTypeReferences(candidate.thrownExceptions);
+				return candidate;
 			default :
 				break;
 		}
@@ -1659,7 +1974,7 @@
 						MethodBinding otherCandidate = candidates[j];
 						if (otherCandidate.hasSubstitutedParameters()) {
 							if (otherCandidate == candidate
-									|| (candidate.declaringClass == otherCandidate.declaringClass && candidate.areParametersEqual(otherCandidate))) {
+									|| (TypeBinding.equalsEquals(candidate.declaringClass, otherCandidate.declaringClass) && candidate.areParametersEqual(otherCandidate))) {
 								return new ProblemMethodBinding(candidates[i], candidates[i].selector, candidates[i].parameters, ProblemReasons.Ambiguous);
 							}
 						}
@@ -1726,7 +2041,7 @@
 			if (methodBinding.canBeSeenBy(receiverType, invocationSite, this))
 				return methodBinding;
 		}
-		methodBinding = findMethod(object, selector, argumentTypes, invocationSite);
+		methodBinding = findMethod(object, selector, argumentTypes, invocationSite, false);
 		if (methodBinding == null)
 			return new ProblemMethodBinding(selector, argumentTypes, ProblemReasons.NotFound);
 		return methodBinding;
@@ -1764,7 +2079,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -1917,7 +2232,7 @@
 														ProblemReasons.NonStaticReferenceInStaticContext);
 											}
 										}
-										if (receiverType == fieldBinding.declaringClass || compilerOptions().complianceLevel >= ClassFileConstants.JDK1_4) {
+										if (TypeBinding.equalsEquals(receiverType, fieldBinding.declaringClass) || compilerOptions().complianceLevel >= ClassFileConstants.JDK1_4) {
 											// found a valid field in the 'immediate' scope (i.e. not inherited)
 											// OR in 1.4 mode (inherited shadows enclosing)
 											if (foundField == null) {
@@ -1931,8 +2246,8 @@
 											if (foundField.isValidBinding())
 												// if a valid field was found, complain when another is found in an 'immediate' enclosing type (that is, not inherited)
 												// but only if "valid field" was inherited in the first place.
-												if (foundField.declaringClass != fieldBinding.declaringClass &&
-												    foundField.declaringClass != foundActualReceiverType) // https://bugs.eclipse.org/bugs/show_bug.cgi?id=316956
+												if (TypeBinding.notEquals(foundField.declaringClass, fieldBinding.declaringClass) &&
+												    TypeBinding.notEquals(foundField.declaringClass, foundActualReceiverType)) // https://bugs.eclipse.org/bugs/show_bug.cgi?id=316956
 													// i.e. have we found the same field - do not trust field identity yet
 													return new ProblemFieldBinding(
 														foundField, // closest match
@@ -2074,7 +2389,133 @@
 		}
 	}
 
+	class MethodClashException extends RuntimeException {
+		private static final long serialVersionUID = -7996779527641476028L;
+	}
+	
+	// For exact method references. 15.28.1
+	private MethodBinding getExactMethod(TypeBinding receiverType, TypeBinding type, char[] selector, InvocationSite invocationSite, MethodBinding candidate) {
+
+		if (type == null)
+			return null;
+		
+		TypeBinding [] superInterfaces = type.superInterfaces();
+		TypeBinding [] typePlusSupertypes = new TypeBinding[2 + superInterfaces.length];
+		typePlusSupertypes[0] = type;
+		typePlusSupertypes[1] = type.superclass();
+		if (superInterfaces.length != 0)
+			System.arraycopy(superInterfaces, 0, typePlusSupertypes, 2, superInterfaces.length);
+		
+		CompilationUnitScope unitScope = compilationUnitScope();
+		unitScope.recordTypeReference(type);
+		type = type.capture(this, invocationSite.sourceEnd());
+		
+		for (int i = 0, typesLength = typePlusSupertypes.length; i < typesLength; i++) {
+			MethodBinding[] methods = i == 0 ? type.getMethods(selector) : new MethodBinding [] { getExactMethod(receiverType, typePlusSupertypes[i], selector, invocationSite, candidate) };
+			for (int j = 0, length = methods.length; j < length; j++) {
+				MethodBinding currentMethod = methods[j];
+				if (currentMethod == null || candidate == currentMethod)
+					continue;
+				if (i == 0 && (!currentMethod.canBeSeenBy(receiverType, invocationSite, this) || currentMethod.isSynthetic() || currentMethod.isBridge()))
+					continue;
+				if (candidate != null) {
+					if (!candidate.areParameterErasuresEqual(currentMethod))
+						throw new MethodClashException();
+				} else {
+					candidate = currentMethod;
+				}
+			}	
+		}
+		return candidate;
+	}
+		
+	// For exact method references. 15.28.1
+	public MethodBinding getExactMethod(TypeBinding receiverType, char[] selector, InvocationSite invocationSite) {
+		if (receiverType == null || !receiverType.isValidBinding() || receiverType.isBaseType())
+			return null;
+		TypeBinding currentType = receiverType;
+		if (currentType.isArrayType()) {
+			if (!currentType.leafComponentType().canBeSeenBy(this))
+				return null;
+			currentType = getJavaLangObject();
+		}
+		
+		MethodBinding exactMethod = null;
+		try {
+			exactMethod = getExactMethod(receiverType, currentType, selector, invocationSite, null);
+		} catch (MethodClashException e) {
+			return null;
+		}
+		if (exactMethod == null || !exactMethod.canBeSeenBy(invocationSite, this))
+			return null;
+		if (exactMethod.isVarargs() || exactMethod.typeVariables() != Binding.NO_TYPE_VARIABLES && invocationSite.genericTypeArguments() == null)
+			return null;
+		
+		if (receiverType.isArrayType()) {
+			if (CharOperation.equals(selector, TypeConstants.CLONE))
+				return environment().computeArrayClone(exactMethod);
+			if (CharOperation.equals(selector, TypeConstants.GETCLASS))
+				return environment().createGetClassMethod(receiverType, exactMethod, this);
+		}
+		if (exactMethod.declaringClass.id == TypeIds.T_JavaLangObject
+				&& CharOperation.equals(selector, TypeConstants.GETCLASS)
+			    && exactMethod.returnType.isParameterizedType())
+		{
+			return environment().createGetClassMethod(receiverType, exactMethod, this);
+		}
+		return exactMethod;
+	}
+		
+	// For exact constructor references. 15.28.1
+	public MethodBinding getExactConstructor(TypeBinding receiverType, InvocationSite invocationSite) {
+		if (receiverType == null || !receiverType.isValidBinding() || !receiverType.canBeInstantiated() || receiverType.isBaseType())
+			return null;
+		if (receiverType.isArrayType()) {
+			TypeBinding leafType = receiverType.leafComponentType();
+			if (!leafType.canBeSeenBy(this) || !leafType.isReifiable())
+				return null;
+			return new MethodBinding(ClassFileConstants.AccPublic | ClassFileConstants.AccSynthetic, TypeConstants.INIT,
+								receiverType,
+								new TypeBinding[] { TypeBinding.INT },
+								Binding.NO_EXCEPTIONS,
+								getJavaLangObject()); // just lie.
+		}
+
+		CompilationUnitScope unitScope = compilationUnitScope();
+		MethodBinding exactConstructor = null;
+		unitScope.recordTypeReference(receiverType);
+		MethodBinding[] methods = receiverType.getMethods(TypeConstants.INIT);
+		for (int i = 0, length = methods.length; i < length; i++) {
+			MethodBinding constructor = methods[i];
+			if (!constructor.canBeSeenBy(invocationSite, this))
+				continue;
+			if (constructor.isVarargs())
+				return null;
+			if (constructor.typeVariables() != Binding.NO_TYPE_VARIABLES && invocationSite.genericTypeArguments() == null)
+				return null;
+			if (exactConstructor == null) {
+				exactConstructor = constructor;
+			} else {
+				return null;
+			}
+		}
+		return exactConstructor;
+	}
+
 	public MethodBinding getConstructor(ReferenceBinding receiverType, TypeBinding[] argumentTypes, InvocationSite invocationSite) {
+		MethodBinding method = getConstructor0(receiverType, argumentTypes, invocationSite);
+		if (method != null && method.isValidBinding() && method.isVarargs()) {
+			TypeBinding elementType = method.parameters[method.parameters.length - 1].leafComponentType();
+			if (elementType instanceof ReferenceBinding) {
+				if (!((ReferenceBinding) elementType).canBeSeenBy(this)) {
+					return new ProblemMethodBinding(method, method.selector, invocationSite.genericTypeArguments(), ProblemReasons.VarargsElementTypeNotVisible);
+				}
+			}
+		}
+		return method;
+	}
+
+	public MethodBinding getConstructor0(ReferenceBinding receiverType, TypeBinding[] argumentTypes, InvocationSite invocationSite) {
 		CompilationUnitScope unitScope = compilationUnitScope();
 		LookupEnvironment env = unitScope.environment;
 		try {
@@ -2090,7 +2531,7 @@
 			if (methodBinding != null && methodBinding.canBeSeenBy(invocationSite, this)) {
 			    // targeting a non generic constructor with type arguments ?
 			    if (invocationSite.genericTypeArguments() != null)
-			    	methodBinding = computeCompatibleMethod(methodBinding, argumentTypes, invocationSite);
+			    	methodBinding = computeCompatibleMethod(methodBinding, argumentTypes, invocationSite, FULL_INFERENCE);
 				return methodBinding;
 			}
 			MethodBinding[] methods = receiverType.getMethods(TypeConstants.INIT, argumentTypes.length);
@@ -2104,7 +2545,7 @@
 			int compatibleIndex = 0;
 			MethodBinding problemMethod = null;
 			for (int i = 0, length = methods.length; i < length; i++) {
-				MethodBinding compatibleMethod = computeCompatibleMethod(methods[i], argumentTypes, invocationSite);
+				MethodBinding compatibleMethod = computeCompatibleMethod(methods[i], argumentTypes, invocationSite, APPLICABILITY);
 				if (compatibleMethod != null) {
 					if (compatibleMethod.isValidBinding())
 						compatible[compatibleIndex++] = compatibleMethod;
@@ -2131,7 +2572,10 @@
 					visible[visibleIndex++] = method;
 				} // AspectJ Extension - completes new if()
 			}
-			if (visibleIndex == 1) return visible[0];
+			if (visibleIndex == 1) {
+				// 1.8: Give inference a chance to perform outstanding tasks (18.5.2):
+				return inferInvocationType(invocationSite, visible[0], argumentTypes);
+			}
 			if (visibleIndex == 0)
 				return new ProblemMethodBinding(
 					compatible[0],
@@ -2251,7 +2695,7 @@
 						// compilationUnitScope().recordTypeReference(receiverType);   not needed since receiver is the source type
 						MethodBinding methodBinding = classScope.findExactMethod(receiverType, selector, argumentTypes, invocationSite);
 						if (methodBinding == null)
-							methodBinding = classScope.findMethod(receiverType, selector, argumentTypes, invocationSite);
+							methodBinding = classScope.findMethod(receiverType, selector, argumentTypes, invocationSite, false);
 						if (methodBinding != null) { // skip it if we did not find anything
 							if (foundMethod == null) {
 								if (methodBinding.isValidBinding()) {
@@ -2269,7 +2713,7 @@
 										tagAsAccessingEnclosingInstanceStateOf(receiverType, false /* type variable access */);
 									}
 									if (inheritedHasPrecedence
-											|| receiverType == methodBinding.declaringClass
+											|| TypeBinding.equalsEquals(receiverType, methodBinding.declaringClass)
 											|| (receiverType.getMethods(selector)) != Binding.NO_METHODS) {
 										// found a valid method in the 'immediate' scope (i.e. not inherited)
 										// OR in 1.4 mode (inherited visible shadows enclosing)
@@ -2317,8 +2761,8 @@
 								}
 							} else { // found a valid method so check to see if this is a hiding case
 								if (methodBinding.problemId() == ProblemReasons.Ambiguous
-									|| (foundMethod.declaringClass != methodBinding.declaringClass
-										&& (receiverType == methodBinding.declaringClass || receiverType.getMethods(selector) != Binding.NO_METHODS)))
+									|| (TypeBinding.notEquals(foundMethod.declaringClass, methodBinding.declaringClass)
+										&& (TypeBinding.equalsEquals(receiverType, methodBinding.declaringClass) || receiverType.getMethods(selector) != Binding.NO_METHODS)))
 									// ambiguous case -> must qualify the method (javac generates an ambiguous error instead)
 									// otherwise if a method was found, complain when another is found in an 'immediate' enclosing type (that is, not inherited)
 									// NOTE: Unlike fields, a non visible method hides a visible method
@@ -2394,7 +2838,7 @@
 								if (foundProblem == null)
 									foundProblem = possible; // answer as error case match
 							} else if (possible.isStatic()) {
-								MethodBinding compatibleMethod = computeCompatibleMethod(possible, argumentTypes, invocationSite);
+								MethodBinding compatibleMethod = computeCompatibleMethod(possible, argumentTypes, invocationSite, APPLICABILITY);
 								if (compatibleMethod != null) {
 									if (compatibleMethod.isValidBinding()) {
 										if (compatibleMethod.canBeSeenBy(unitScope.fPackage)) {
@@ -2425,9 +2869,13 @@
 					}
 				}
 				if (visible != null) {
-					MethodBinding[] temp = new MethodBinding[visible.size];
-					visible.copyInto(temp);
-					foundMethod = mostSpecificMethodBinding(temp, temp.length, argumentTypes, invocationSite, null);
+					if (visible.size == 1) {
+						foundMethod = (MethodBinding) visible.elementAt(0);
+					} else {
+						MethodBinding[] temp = new MethodBinding[visible.size];
+						visible.copyInto(temp);
+						foundMethod = mostSpecificMethodBinding(temp, temp.length, argumentTypes, invocationSite, null);
+					}
 				}
 			}
 		}
@@ -2482,6 +2930,12 @@
 		unitScope.recordQualifiedReference(TypeConstants.JAVA_LANG_INVOKE_LAMBDAMETAFACTORY);
 		return unitScope.environment.getResolvedType(TypeConstants.JAVA_LANG_INVOKE_LAMBDAMETAFACTORY, this);
 	}
+	
+	public final ReferenceBinding getJavaLangInvokeSerializedLambda() {
+		CompilationUnitScope unitScope = compilationUnitScope();
+		unitScope.recordQualifiedReference(TypeConstants.JAVA_LANG_INVOKE_SERIALIZEDLAMBDA);
+		return unitScope.environment.getResolvedType(TypeConstants.JAVA_LANG_INVOKE_SERIALIZEDLAMBDA, this);
+	}
 
 	public final ReferenceBinding getJavaLangInvokeMethodHandlesLookup() {
 		CompilationUnitScope unitScope = compilationUnitScope();
@@ -2512,6 +2966,13 @@
 		unitScope.recordQualifiedReference(TypeConstants.JAVA_LANG_THROWABLE);
 		return unitScope.environment.getResolvedType(TypeConstants.JAVA_LANG_THROWABLE, this);
 	}
+	
+	public final ReferenceBinding getJavaLangIllegalArgumentException() {
+		CompilationUnitScope unitScope = compilationUnitScope();
+		unitScope.recordQualifiedReference(TypeConstants.JAVA_LANG_ILLEGALARGUMENTEXCEPTION);
+		return unitScope.environment.getResolvedType(TypeConstants.JAVA_LANG_ILLEGALARGUMENTEXCEPTION, this);
+	}
+	
 	public final ReferenceBinding getJavaUtilIterator() {
 		CompilationUnitScope unitScope = compilationUnitScope();
 		unitScope.recordQualifiedReference(TypeConstants.JAVA_UTIL_ITERATOR);
@@ -2549,11 +3010,12 @@
 			MethodBinding methodBinding = findExactMethod(currentType, selector, argumentTypes, invocationSite);
 			if (methodBinding != null) return methodBinding;
 
-			methodBinding = findMethod(currentType, selector, argumentTypes, invocationSite);
+			methodBinding = findMethod(currentType, selector, argumentTypes, invocationSite, false);
 			if (methodBinding == null)
 				return new ProblemMethodBinding(selector, argumentTypes, ProblemReasons.NotFound);
 			if (!methodBinding.isValidBinding())
 				return methodBinding;
+				// MERGECONFLICT
 			// New AspectJ Extension - trying this? looked very different in the old compiler
 			if (!methodBinding.canBeSeenBy(currentType, invocationSite, this)) {
 				MethodBinding visMethodBinding = methodBinding.getVisibleBinding(invocationSite,this);
@@ -2825,7 +3287,7 @@
 					case BLOCK_SCOPE :
 						ReferenceBinding localType = ((BlockScope) scope).findLocalType(name); // looks in this scope only
 						if (localType != null) {
-							if (foundType != null && foundType != localType)
+							if (foundType != null && TypeBinding.notEquals(foundType, localType))
 								return new ProblemReferenceBinding(new char[][]{name}, foundType, ProblemReasons.InheritedNameHidesEnclosingName);
 							return localType;
 						}
@@ -2861,7 +3323,7 @@
 									return new ProblemReferenceBinding(new char[][]{name}, foundType, ProblemReasons.InheritedNameHidesEnclosingName);
 								}
 								if (memberType.isValidBinding()) {
-									if (sourceType == memberType.enclosingType() || inheritedHasPrecedence) {
+									if (TypeBinding.equalsEquals(sourceType, memberType.enclosingType()) || inheritedHasPrecedence) {
 										if (insideStaticContext && !memberType.isStatic() && sourceType.isGenericType())
 											return new ProblemReferenceBinding(new char[][]{name}, memberType, ProblemReasons.NonStaticReferenceInStaticContext);
 										// found a valid type in the 'immediate' scope (i.e. not inherited)
@@ -2869,7 +3331,7 @@
 										if (foundType == null || (inheritedHasPrecedence && foundType.problemId() == ProblemReasons.NotVisible))
 											return memberType;
 										// if a valid type was found, complain when another is found in an 'immediate' enclosing type (i.e. not inherited)
-										if (foundType.isValidBinding() && foundType != memberType)
+										if (foundType.isValidBinding() && TypeBinding.notEquals(foundType, memberType))
 											return new ProblemReferenceBinding(new char[][]{name}, foundType, ProblemReasons.InheritedNameHidesEnclosingName);
 									}
 								}
@@ -2896,7 +3358,7 @@
 						if (sourceType!=null) {
 						// ASPECTJ END
 						if (CharOperation.equals(sourceType.sourceName, name)) {
-							if (foundType != null && foundType != sourceType && foundType.problemId() != ProblemReasons.NotVisible)
+							if (foundType != null && TypeBinding.notEquals(foundType, sourceType) && foundType.problemId() != ProblemReasons.NotVisible)
 								return new ProblemReferenceBinding(new char[][]{name}, foundType, ProblemReasons.InheritedNameHidesEnclosingName);
 							return sourceType;
 						}
@@ -2996,7 +3458,7 @@
 						} else {
 							temp = findDirectMemberType(name, (ReferenceBinding) resolvedImport);
 						}
-						if (temp != type && temp != null) {
+						if (TypeBinding.notEquals(temp, type) && temp != null) {
 							if (temp.isValidBinding()) {
 								ImportReference importReference = someImport.reference;
 								if (importReference != null) {
@@ -3132,7 +3594,7 @@
 		return qualifiedType;
 	}
 
-	protected boolean hasErasedCandidatesCollisions(TypeBinding one, TypeBinding two, Map invocations, ReferenceBinding type, ASTNode typeRef) {
+	public boolean hasErasedCandidatesCollisions(TypeBinding one, TypeBinding two, Map invocations, ReferenceBinding type, ASTNode typeRef) {
 		invocations.clear();
 		TypeBinding[] mecs = minimalErasedCandidates(new TypeBinding[] {one, two}, invocations);
 		if (mecs != null) {
@@ -3181,7 +3643,7 @@
 			next : for (int i = 0; i < oneParamsLength; i++) {
 				TypeBinding oneParam = applyErasure ? oneParams[i].erasure() : oneParams[i];
 				TypeBinding twoParam = applyErasure ? twoParams[i].erasure() : twoParams[i];
-				if (oneParam == twoParam || oneParam.isCompatibleWith(twoParam)) {
+				if (TypeBinding.equalsEquals(oneParam, twoParam) || oneParam.isCompatibleWith(twoParam)) {
 					if (two.declaringClass.isRawType()) continue next;
 
 					TypeBinding leafComponentType = two.original().parameters[i].leafComponentType();
@@ -3214,10 +3676,10 @@
 						TypeBinding oType = ((ArrayBinding) oneParam).elementsType();
 						TypeBinding eType = ((ArrayBinding) twoParam).elementsType();
 						if (CompilerOptions.tolerateIllegalAmbiguousVarargsInvocation && this.compilerOptions().complianceLevel < ClassFileConstants.JDK1_7) {
-							if (oneParam == eType || oneParam.isCompatibleWith(eType))
+							if (TypeBinding.equalsEquals(oneParam, eType) || oneParam.isCompatibleWith(eType))
 								return true; // special case to choose between 2 varargs methods when the last arg is Object[]
 						} else {
-							if (oType == eType || oType.isCompatibleWith(eType))
+							if (TypeBinding.equalsEquals(oType, eType) || oType.isCompatibleWith(eType))
 								return true; // special case to choose between 2 varargs methods when the last arg is Object[]
 						}
 					}
@@ -3236,7 +3698,7 @@
 			}
 			// check that each parameter before the vararg parameters are compatible (no autoboxing allowed here)
 			for (int i = (oneParamsLength > twoParamsLength ? twoParamsLength : oneParamsLength) - 2; i >= 0; i--)
-				if (oneParams[i] != twoParams[i] && !oneParams[i].isCompatibleWith(twoParams[i]))
+				if (TypeBinding.notEquals(oneParams[i], twoParams[i]) && !oneParams[i].isCompatibleWith(twoParams[i]))
 					return false;
 			if (parameterCompatibilityLevel(one, twoParams, true) == NOT_COMPATIBLE
 					&& parameterCompatibilityLevel(two, oneParams, true) == VARARGS_COMPATIBLE)
@@ -3252,7 +3714,7 @@
 
 		// check if autoboxed type is compatible
 		TypeBinding convertedType = environment.computeBoxingType(expressionType);
-		return convertedType == targetType || convertedType.isCompatibleWith(targetType);
+		return TypeBinding.equalsEquals(convertedType, targetType) || convertedType.isCompatibleWith(targetType, this);
 	}
 
 	/* Answer true if the scope is nested inside a given field declaration.
@@ -3304,7 +3766,7 @@
 		// test that the enclosingType is not part of the compilation unit
 		SourceTypeBinding[] topLevelTypes = ((CompilationUnitScope) unitScope).topLevelTypes;
 		for (int i = topLevelTypes.length; --i >= 0;)
-			if (topLevelTypes[i] == enclosingType.original())
+			if (TypeBinding.equalsEquals(topLevelTypes[i], enclosingType.original()))
 				return true;
 		return false;
 	}
@@ -3315,7 +3777,7 @@
 		Scope scope = this;
 		do {
 			if (scope instanceof ClassScope)
-				if (((ClassScope) scope).referenceContext.binding == type)
+				if (TypeBinding.equalsEquals(((ClassScope) scope).referenceContext.binding, type))
 					return true;
 			scope = scope.parent;
 		} while (scope != null);
@@ -3425,7 +3887,7 @@
 					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;
+							if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -3444,7 +3906,7 @@
 				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;
+						if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 					interfacesToVisit[nextPosition++] = next;
 				}
 			}
@@ -3452,7 +3914,7 @@
 		return false;
 	}
 
-	private TypeBinding leastContainingInvocation(TypeBinding mec, Object invocationData, List lubStack) {
+	private TypeBinding leastContainingInvocation(TypeBinding mec, Object invocationData, ArrayList lubStack) {
 		if (invocationData == null) return mec; // no alternate invocation
 		if (invocationData instanceof TypeBinding) { // only one invocation, simply return it (array only allocated if more than one)
 			return (TypeBinding) invocationData;
@@ -3474,7 +3936,7 @@
 				case Binding.GENERIC_TYPE :
 					TypeVariableBinding[] invocationVariables = invocation.typeVariables();
 					for (int j = 0; j < argLength; j++) {
-						TypeBinding bestArgument = leastContainingTypeArgument(bestArguments[j], invocationVariables[j], (ReferenceBinding) mec, j, lubStack);
+						TypeBinding bestArgument = leastContainingTypeArgument(bestArguments[j], invocationVariables[j], (ReferenceBinding) mec, j, (ArrayList)lubStack.clone());
 						if (bestArgument == null) return null;
 						bestArguments[j] = bestArgument;
 					}
@@ -3482,7 +3944,7 @@
 				case Binding.PARAMETERIZED_TYPE :
 					ParameterizedTypeBinding parameterizedType = (ParameterizedTypeBinding)invocation;
 					for (int j = 0; j < argLength; j++) {
-						TypeBinding bestArgument = leastContainingTypeArgument(bestArguments[j], parameterizedType.arguments[j], (ReferenceBinding) mec, j, lubStack);
+						TypeBinding bestArgument = leastContainingTypeArgument(bestArguments[j], parameterizedType.arguments[j], (ReferenceBinding) mec, j, (ArrayList)lubStack.clone());
 						if (bestArgument == null) return null;
 						bestArguments[j] = bestArgument;
 					}
@@ -3496,9 +3958,9 @@
 	}
 
 	// JLS 15.12.2
-	private TypeBinding leastContainingTypeArgument(TypeBinding u, TypeBinding v, ReferenceBinding genericType, int rank, List lubStack) {
+	private TypeBinding leastContainingTypeArgument(TypeBinding u, TypeBinding v, ReferenceBinding genericType, int rank, ArrayList lubStack) {
 		if (u == null) return v;
-		if (u == v) return u;
+		if (TypeBinding.equalsEquals(u, v)) return u;
 		if (v.isWildcard()) {
 			WildcardBinding wildV = (WildcardBinding) v;
 			if (u.isWildcard()) {
@@ -3512,11 +3974,11 @@
 								TypeBinding lub = lowerUpperBound(new TypeBinding[]{wildU.bound,wildV.bound}, lubStack);
 								if (lub == null) return null;
 								// int is returned to denote cycle detected in lub computation - stop recursion by answering unbound wildcard
-								if (lub == TypeBinding.INT) return environment().createWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND);
+								if (TypeBinding.equalsEquals(lub, TypeBinding.INT)) return environment().createWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND);
 								return environment().createWildcard(genericType, rank, lub, null /*no extra bound*/, Wildcard.EXTENDS);
 							// ? extends U, ? SUPER V
 							case Wildcard.SUPER :
-								if (wildU.bound == wildV.bound) return wildU.bound;
+								if (TypeBinding.equalsEquals(wildU.bound, wildV.bound)) return wildU.bound;
 								return environment().createWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND);
 						}
 						break;
@@ -3524,7 +3986,7 @@
 					case Wildcard.SUPER :
 						// ? super U, ? super V
 						if (wildU.boundKind == Wildcard.SUPER) {
-							TypeBinding[] glb = greaterLowerBound(new TypeBinding[]{wildU.bound,wildV.bound}, this);
+							TypeBinding[] glb = greaterLowerBound(new TypeBinding[]{wildU.bound,wildV.bound}, this, this.environment());
 							if (glb == null) return null;
 							return environment().createWildcard(genericType, rank, glb[0], null /*no extra bound*/, Wildcard.SUPER);	// TODO (philippe) need to capture entire bounds
 						}
@@ -3536,11 +3998,11 @@
 						TypeBinding lub = lowerUpperBound(new TypeBinding[]{u,wildV.bound}, lubStack);
 						if (lub == null) return null;
 						// int is returned to denote cycle detected in lub computation - stop recursion by answering unbound wildcard
-						if (lub == TypeBinding.INT) return environment().createWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND);
+						if (TypeBinding.equalsEquals(lub, TypeBinding.INT)) return environment().createWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND);
 						return environment().createWildcard(genericType, rank, lub, null /*no extra bound*/, Wildcard.EXTENDS);
 					// U, ? super V
 					case Wildcard.SUPER :
-						TypeBinding[] glb = greaterLowerBound(new TypeBinding[]{u,wildV.bound}, this);
+						TypeBinding[] glb = greaterLowerBound(new TypeBinding[]{u,wildV.bound}, this, this.environment());
 						if (glb == null) return null;
 						return environment().createWildcard(genericType, rank, glb[0], null /*no extra bound*/, Wildcard.SUPER);	// TODO (philippe) need to capture entire bounds
 					case Wildcard.UNBOUND :
@@ -3554,11 +4016,11 @@
 					TypeBinding lub = lowerUpperBound(new TypeBinding[]{wildU.bound, v}, lubStack);
 					if (lub == null) return null;
 					// int is returned to denote cycle detected in lub computation - stop recursion by answering unbound wildcard
-					if (lub == TypeBinding.INT) return environment().createWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND);
+					if (TypeBinding.equalsEquals(lub, TypeBinding.INT)) return environment().createWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND);
 					return environment().createWildcard(genericType, rank, lub, null /*no extra bound*/, Wildcard.EXTENDS);
 				// U, ? super V
 				case Wildcard.SUPER :
-					TypeBinding[] glb = greaterLowerBound(new TypeBinding[]{wildU.bound, v}, this);
+					TypeBinding[] glb = greaterLowerBound(new TypeBinding[]{wildU.bound, v}, this, this.environment());
 					if (glb == null) return null;
 					return environment().createWildcard(genericType, rank, glb[0], null /*no extra bound*/, Wildcard.SUPER); // TODO (philippe) need to capture entire bounds
 				case Wildcard.UNBOUND :
@@ -3567,7 +4029,7 @@
 		TypeBinding lub = lowerUpperBound(new TypeBinding[]{u,v}, lubStack);
 		if (lub == null) return null;
 		// int is returned to denote cycle detected in lub computation - stop recursion by answering unbound wildcard
-		if (lub == TypeBinding.INT) return environment().createWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND);
+		if (TypeBinding.equalsEquals(lub, TypeBinding.INT)) return environment().createWildcard(genericType, rank, null, null /*no extra bound*/, Wildcard.UNBOUND);
 		return environment().createWildcard(genericType, rank, lub, null /*no extra bound*/, Wildcard.EXTENDS);
 	}
 
@@ -3586,7 +4048,7 @@
 	}
 
 	// 15.12.2
-	private TypeBinding lowerUpperBound(TypeBinding[] types, List lubStack) {
+	private TypeBinding lowerUpperBound(TypeBinding[] types, ArrayList lubStack) {
 
 		int typeLength = types.length;
 		if (typeLength == 1) {
@@ -3605,7 +4067,7 @@
 				for (int k = 0; k < lubTypeLength; k++) {
 					TypeBinding lubType = lubTypes[k];
 					if (lubType == null) continue; // ignore
-					if (lubType == type || lubType.isEquivalentTo(type)) continue nextTypeCheck; // type found, jump to next one
+					if (TypeBinding.equalsEquals(lubType, type) || lubType.isEquivalentTo(type)) continue nextTypeCheck; // type found, jump to next one
 				}
 				continue nextLubCheck; // type not found in current lubTypes
 			}
@@ -3640,6 +4102,7 @@
 			case 0 : return TypeBinding.VOID;
 			case 1 : return mecs[0];
 			case 2 :
+				// TODO(Stephan) : if null annotations differ, we need to create an intersection type and return.
 				if ((commonDim == 0 ? mecs[1].id : mecs[1].leafComponentType().id) == TypeIds.T_JavaLangObject) return mecs[0];
 				if ((commonDim == 0 ? mecs[0].id : mecs[0].leafComponentType().id) == TypeIds.T_JavaLangObject) return mecs[1];
 		}
@@ -3651,7 +4114,7 @@
 				otherBounds[rank++] = mec;
 			}
 		}
-		TypeBinding intersectionType = environment().createWildcard(null, 0, firstBound, otherBounds, Wildcard.EXTENDS);
+		TypeBinding intersectionType = environment().createWildcard(null, 0, firstBound, otherBounds, Wildcard.EXTENDS);  // pass common null annotations by synthesized annotation bindings.
 		return commonDim == 0 ? intersectionType : environment().createArrayType(intersectionType, commonDim);
 	}
 
@@ -3688,6 +4151,8 @@
 		int indexOfFirst = -1, actualLength = 0;
 		for (int i = 0; i < length; i++) {
 			TypeBinding type = types[i];
+			if (type == TypeBinding.NULL)
+				types[i] = type = null; // completely ignore null-type now and further down
 			if (type == null) continue;
 			if (type.isBaseType()) return null;
 			if (indexOfFirst < 0) indexOfFirst = i;
@@ -3718,7 +4183,7 @@
 				firstErasure = firstType;
 				break;
 		}
-		if (firstErasure != firstType) {
+		if (TypeBinding.notEquals(firstErasure, firstType)) {
 			allInvocations.put(firstErasure, firstType);
 		}
 		typesToVisit.add(firstType);
@@ -3778,7 +4243,7 @@
 						typesToVisit.add(superType);
 						max++;
 						TypeBinding superTypeErasure = (firstBound.isTypeVariable() || firstBound.isWildcard() /*&& !itsInterface.isCapture()*/) ? superType : superType.erasure();
-						if (superTypeErasure != superType) {
+						if (TypeBinding.notEquals(superTypeErasure, superType)) {
 							allInvocations.put(superTypeErasure, superType);
 						}
 					}
@@ -3795,7 +4260,7 @@
 						typesToVisit.add(superType);
 						max++;
 						TypeBinding superTypeErasure = (itsInterface.isTypeVariable() || itsInterface.isWildcard() /*&& !itsInterface.isCapture()*/) ? superType : superType.erasure();
-						if (superTypeErasure != superType) {
+						if (TypeBinding.notEquals(superTypeErasure, superType)) {
 							allInvocations.put(superTypeErasure, superType);
 						}
 					}
@@ -3808,7 +4273,7 @@
 					typesToVisit.add(superType);
 					max++;
 					TypeBinding superTypeErasure = (itsSuperclass.isTypeVariable() || itsSuperclass.isWildcard() /*&& !itsSuperclass.isCapture()*/) ? superType : superType.erasure();
-					if (superTypeErasure != superType) {
+					if (TypeBinding.notEquals(superTypeErasure, superType)) {
 						allInvocations.put(superTypeErasure, superType);
 					}
 				}
@@ -3830,7 +4295,7 @@
 			if (otherType.isArrayType()) {
 				nextSuperType: for (int j = 0; j < superLength; j++) {
 					TypeBinding erasedSuperType = erasedSuperTypes[j];
-					if (erasedSuperType == null || erasedSuperType == otherType) continue nextSuperType;
+					if (erasedSuperType == null || TypeBinding.equalsEquals(erasedSuperType, otherType)) continue nextSuperType;
 					TypeBinding match;
 					if ((match = otherType.findSuperTypeOriginatingFrom(erasedSuperType)) == null) {
 						erasedSuperTypes[j] = null;
@@ -3842,7 +4307,7 @@
 					if (invocationData == null) {
 						allInvocations.put(erasedSuperType, match); // no array for singleton
 					} else if (invocationData instanceof TypeBinding) {
-						if (match != invocationData) {
+						if (TypeBinding.notEquals(match, (TypeBinding) invocationData)) {
 							// using an array to record invocations in order (188103)
 							TypeBinding[] someInvocations = { (TypeBinding) invocationData, match, };
 							allInvocations.put(erasedSuperType, someInvocations);
@@ -3852,7 +4317,7 @@
 						checkExisting: {
 							int invocLength = someInvocations.length;
 							for (int k = 0; k < invocLength; k++) {
-								if (someInvocations[k] == match) break checkExisting;
+								if (TypeBinding.equalsEquals(someInvocations[k], match)) break checkExisting;
 							}
 							System.arraycopy(someInvocations, 0, someInvocations = new TypeBinding[invocLength+1], 0, invocLength);
 							allInvocations.put(erasedSuperType, someInvocations);
@@ -3866,7 +4331,7 @@
 				TypeBinding erasedSuperType = erasedSuperTypes[j];
 				if (erasedSuperType == null) continue nextSuperType;
 				TypeBinding match;
-				if (erasedSuperType == otherType || erasedSuperType.id == TypeIds.T_JavaLangObject && otherType.isInterface()) {
+				if (TypeBinding.equalsEquals(erasedSuperType, otherType) || erasedSuperType.id == TypeIds.T_JavaLangObject && otherType.isInterface()) {
 					match = erasedSuperType;
 				} else {
 					if (erasedSuperType.isArrayType()) {
@@ -3885,7 +4350,7 @@
 				if (invocationData == null) {
 					allInvocations.put(erasedSuperType, match); // no array for singleton
 				} else if (invocationData instanceof TypeBinding) {
-					if (match != invocationData) {
+					if (TypeBinding.notEquals(match, (TypeBinding) invocationData)) {
 						// using an array to record invocations in order (188103)
 						TypeBinding[] someInvocations = { (TypeBinding) invocationData, match, };
 						allInvocations.put(erasedSuperType, someInvocations);
@@ -3895,7 +4360,7 @@
 					checkExisting: {
 						int invocLength = someInvocations.length;
 						for (int k = 0; k < invocLength; k++) {
-							if (someInvocations[k] == match) break checkExisting;
+							if (TypeBinding.equalsEquals(someInvocations[k], match)) break checkExisting;
 						}
 						System.arraycopy(someInvocations, 0, someInvocations = new TypeBinding[invocLength+1], 0, invocLength);
 						allInvocations.put(erasedSuperType, someInvocations);
@@ -3949,7 +4414,7 @@
 		MethodBinding previous = null;
 		nextVisible : for (int i = 0; i < visibleSize; i++) {
 			MethodBinding method = visible[i];
-			if (previous != null && method.declaringClass != previous.declaringClass)
+			if (previous != null && TypeBinding.notEquals(method.declaringClass, previous.declaringClass))
 				break; // cannot answer a method farther up the hierarchy than the first method found
 
 			if (!method.isStatic()) previous = method; // no ambiguity for static methods
@@ -4009,79 +4474,183 @@
 
 	// caveat: this is not a direct implementation of JLS
 	protected final MethodBinding mostSpecificMethodBinding(MethodBinding[] visible, int visibleSize, TypeBinding[] argumentTypes, final InvocationSite invocationSite, ReferenceBinding receiverType) {
+
+		boolean isJdk18 = compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8;
+
+		// common part for all compliance levels:
 		int[] compatibilityLevels = new int[visibleSize];
-		for (int i = 0; i < visibleSize; i++)
-			compatibilityLevels[i] = parameterCompatibilityLevel(visible[i], argumentTypes);
-
-		InvocationSite tieBreakInvocationSite = new InvocationSite() {
-			public TypeBinding[] genericTypeArguments() { return null; } // ignore genericTypeArgs
-			public boolean isSuperAccess() { return invocationSite.isSuperAccess(); }
-			public boolean isTypeAccess() { return invocationSite.isTypeAccess(); }
-			public void setActualReceiverType(ReferenceBinding actualReceiverType) { /* ignore */}
-			public void setDepth(int depth) { /* ignore */}
-			public void setFieldIndex(int depth) { /* ignore */}
-			public int sourceStart() { return invocationSite.sourceStart(); }
-			public int sourceEnd() { return invocationSite.sourceStart(); }
-			public TypeBinding expectedType() { return invocationSite.expectedType(); }
-			public boolean receiverIsImplicitThis() { return invocationSite.receiverIsImplicitThis();}
-		};
-		MethodBinding[] moreSpecific = new MethodBinding[visibleSize];
-		int count = 0;
-		for (int level = 0, max = VARARGS_COMPATIBLE; level <= max; level++) {
-			nextVisible : for (int i = 0; i < visibleSize; i++) {
-				if (compatibilityLevels[i] != level) continue nextVisible;
-				max = level; // do not examine further categories, will either return mostSpecific or report ambiguous case
-				MethodBinding current = visible[i];
-				MethodBinding original = current.original();
-				MethodBinding tiebreakMethod = current.tiebreakMethod();
-				for (int j = 0; j < visibleSize; j++) {
-					if (i == j || compatibilityLevels[j] != level) continue;
-					MethodBinding next = visible[j];
-					if (original == next.original()) {
-						// parameterized superclasses & interfaces may be walked twice from different paths so skip next from now on
-						compatibilityLevels[j] = -1;
-						continue;
-					}
-
-					MethodBinding methodToTest = next;
-					if (next instanceof ParameterizedGenericMethodBinding) {
-						ParameterizedGenericMethodBinding pNext = (ParameterizedGenericMethodBinding) next;
-						if (pNext.isRaw && !pNext.isStatic()) {
-							// hold onto the raw substituted method
-						} else {
-							methodToTest = pNext.originalMethod;
-						}
-					}
-					MethodBinding acceptable = computeCompatibleMethod(methodToTest, tiebreakMethod.parameters, tieBreakInvocationSite, level == VARARGS_COMPATIBLE);
-					/* There are 4 choices to consider with current & next :
-					 foo(B) & foo(A) where B extends A
-					 1. the 2 methods are equal (both accept each others parameters) -> want to continue
-					 2. current has more specific parameters than next (so acceptable is a valid method) -> want to continue
-					 3. current has less specific parameters than next (so acceptable is null) -> go on to next
-					 4. current and next are not compatible with each other (so acceptable is null) -> go on to next
-					 */
-					if (acceptable == null || !acceptable.isValidBinding())
-						continue nextVisible;
-					if (!isAcceptableMethod(tiebreakMethod, acceptable))
-						continue nextVisible;
-					// pick a concrete method over a bridge method when parameters are equal since the return type of the concrete method is more specific
-					if (current.isBridge() && !next.isBridge())
-						if (tiebreakMethod.areParametersEqual(acceptable))
-							continue nextVisible; // skip current so acceptable wins over this bridge method
+		int compatibleCount = 0;
+		for (int i = 0; i < visibleSize; i++) {
+			TypeBinding[] argTypes = argumentTypes;
+			if (isJdk18 && invocationSite instanceof Invocation) {
+				InnerInferenceHelper innerInferenceHelper = ((Invocation)invocationSite).innerInferenceHelper();
+				if (innerInferenceHelper != null)
+					argTypes = innerInferenceHelper.getArgumentTypesForCandidate(visible[i], argumentTypes);
+			}
+			if ((compatibilityLevels[i] = parameterCompatibilityLevel(visible[i], argTypes)) != NOT_COMPATIBLE) {
+				if (i != compatibleCount) {
+					visible[compatibleCount] = visible[i];
+					compatibilityLevels[compatibleCount] = compatibilityLevels[i];
 				}
-				moreSpecific[i] = current;
-				count++;
+				compatibleCount++;
 			}
 		}
-		if (count == 1) {
-			for (int i = 0; i < visibleSize; i++) {
-				if (moreSpecific[i] != null) {
-					compilationUnitScope().recordTypeReferences(visible[i].thrownExceptions);
-					return visible[i];
+// TODO: Disabled, because we know a situation where this is expected, see https://bugs.eclipse.org/429490
+//		if (compatibleCount != visibleSize) {
+//			problemReporter().genericInferenceProblem("(Recovered) Internal inconsistency while checking invocation ambiguity", invocationSite, ProblemSeverities.Warning); //$NON-NLS-1$
+//		}
+		if (compatibleCount == 0) {
+			return new ProblemMethodBinding(visible[0].selector, argumentTypes, ProblemReasons.NotFound);
+		} else if (compatibleCount == 1) {
+			MethodBinding candidate = inferInvocationType(invocationSite, visible[0], argumentTypes);
+			compilationUnitScope().recordTypeReferences(candidate.thrownExceptions);
+			return candidate;
+		}
+		if (compatibleCount != visibleSize) {
+			System.arraycopy(visible, 0, visible = new MethodBinding[visibleSize = compatibleCount], 0, compatibleCount);
+			System.arraycopy(compatibilityLevels, 0, compatibilityLevels = new int[compatibleCount], 0, compatibleCount);
+		}
+		
+		MethodBinding[] moreSpecific = new MethodBinding[visibleSize];
+
+		if (isJdk18) {
+			// 15.12.2.5 Choosing the Most Specific Method
+			int count = 0;
+				
+			nextJ: for (int j = 0; j < visibleSize; j++) {
+				MethodBinding mbj = visible[j].genericMethod();
+				final TypeBinding[] mbjParameters = mbj.parameters;	
+				int levelj = compatibilityLevels[j];
+				nextK: for (int k = 0; k < visibleSize; k++) {
+					if (j == k) continue;
+					// TODO do we want to check existing inference contexts whether they can tell us better about the used inferenceKind?
+					int levelk = compatibilityLevels[k];
+					if (levelj > -1 && levelk > -1 && levelj != levelk) {
+						if (levelj < levelk)
+							continue nextK; // j is more specific than this k
+						else
+							continue nextJ; // j cannot be more specific
+					}
+					MethodBinding mbk = visible[k].genericMethod();
+					final TypeBinding[] mbkParameters = mbk.parameters;
+					// TODO: should the following line also find diamond-typeVariables?
+					if (((invocationSite instanceof Invocation) || (invocationSite instanceof ReferenceExpression))
+							&& mbk.typeVariables() != Binding.NO_TYPE_VARIABLES) 
+					{
+						// 18.5.4 More Specific Method Inference
+						Expression[] expressions = null;
+						if (invocationSite instanceof Invocation) {
+							expressions = ((Invocation)invocationSite).arguments();
+						} else {
+							expressions = ((ReferenceExpression)invocationSite).createPseudoExpressions(argumentTypes);
+						}
+						InferenceContext18 ic18 = new InferenceContext18(this, expressions, null);
+						if (!ic18.isMoreSpecificThan(mbj, mbk, levelj == VARARGS_COMPATIBLE, levelk == VARARGS_COMPATIBLE)) {
+							continue nextJ;
+						}
+					} else {
+						for (int i = 0, length = argumentTypes.length; i < length; i++) {
+							TypeBinding argumentType = argumentTypes[i];
+							TypeBinding s = InferenceContext18.getParameter(mbjParameters, i, levelj == VARARGS_COMPATIBLE); 
+							TypeBinding t = InferenceContext18.getParameter(mbkParameters, i, levelk == VARARGS_COMPATIBLE); 
+							if (TypeBinding.equalsEquals(s, t))
+								continue;
+							if (!argumentType.sIsMoreSpecific(s,t, this)) {
+								continue nextJ;
+							}
+						}
+					}
+				}
+				moreSpecific[count++] = visible[j];
+			}
+			if (count == 0) {
+				return new ProblemMethodBinding(visible[0], visible[0].selector, visible[0].parameters, ProblemReasons.Ambiguous);
+			} else if (count == 1) {
+				MethodBinding candidate = inferInvocationType(invocationSite, moreSpecific[0], argumentTypes);
+				compilationUnitScope().recordTypeReferences(candidate.thrownExceptions);
+				return candidate;
+			} else {
+				visibleSize = count;
+				// we proceed with pre 1.8 code below, which checks for overriding
+			}
+		} else {
+
+			// JLS7 implementation  
+	
+			InvocationSite tieBreakInvocationSite = new InvocationSite() {
+				public TypeBinding[] genericTypeArguments() { return null; } // ignore genericTypeArgs
+				public boolean isSuperAccess() { return invocationSite.isSuperAccess(); }
+				public boolean isTypeAccess() { return invocationSite.isTypeAccess(); }
+				public void setActualReceiverType(ReferenceBinding actualReceiverType) { /* ignore */}
+				public void setDepth(int depth) { /* ignore */}
+				public void setFieldIndex(int depth) { /* ignore */}
+				public int sourceStart() { return invocationSite.sourceStart(); }
+				public int sourceEnd() { return invocationSite.sourceStart(); }
+				public TypeBinding invocationTargetType() { return invocationSite.invocationTargetType(); }
+				public boolean receiverIsImplicitThis() { return invocationSite.receiverIsImplicitThis();}
+				public InferenceContext18 freshInferenceContext(Scope scope) { return null; /* no inference when ignoring genericTypeArgs */ }
+				public ExpressionContext getExpressionContext() { return ExpressionContext.VANILLA_CONTEXT; }
+			};
+			int count = 0;
+			for (int level = 0, max = VARARGS_COMPATIBLE; level <= max; level++) {
+				nextVisible : for (int i = 0; i < visibleSize; i++) {
+					if (compatibilityLevels[i] != level) continue nextVisible;
+					max = level; // do not examine further categories, will either return mostSpecific or report ambiguous case
+					MethodBinding current = visible[i];
+					MethodBinding original = current.original();
+					MethodBinding tiebreakMethod = current.tiebreakMethod();
+					for (int j = 0; j < visibleSize; j++) {
+						if (i == j || compatibilityLevels[j] != level) continue;
+						MethodBinding next = visible[j];
+						if (original == next.original()) {
+							// parameterized superclasses & interfaces may be walked twice from different paths so skip next from now on
+							compatibilityLevels[j] = -1;
+							continue;
+						}
+	
+						MethodBinding methodToTest = next;
+						if (next instanceof ParameterizedGenericMethodBinding) {
+							ParameterizedGenericMethodBinding pNext = (ParameterizedGenericMethodBinding) next;
+							if (pNext.isRaw && !pNext.isStatic()) {
+								// hold onto the raw substituted method
+							} else {
+								methodToTest = pNext.originalMethod;
+							}
+						}
+						MethodBinding acceptable = computeCompatibleMethod(methodToTest, tiebreakMethod.parameters,
+								tieBreakInvocationSite, INVOCATION_TYPE, level == VARARGS_COMPATIBLE);
+						/* There are 4 choices to consider with current & next :
+						 foo(B) & foo(A) where B extends A
+						 1. the 2 methods are equal (both accept each others parameters) -> want to continue
+						 2. current has more specific parameters than next (so acceptable is a valid method) -> want to continue
+						 3. current has less specific parameters than next (so acceptable is null) -> go on to next
+						 4. current and next are not compatible with each other (so acceptable is null) -> go on to next
+						 */
+						if (acceptable == null || !acceptable.isValidBinding())
+							continue nextVisible;
+						if (!isAcceptableMethod(tiebreakMethod, acceptable))
+							continue nextVisible;
+						// pick a concrete method over a bridge method when parameters are equal since the return type of the concrete method is more specific
+						if (current.isBridge() && !next.isBridge())
+							if (tiebreakMethod.areParametersEqual(acceptable))
+								continue nextVisible; // skip current so acceptable wins over this bridge method
+					}
+					moreSpecific[i] = current;
+					count++;
 				}
 			}
-		} else if (count == 0) {
-			return new ProblemMethodBinding(visible[0], visible[0].selector, visible[0].parameters, ProblemReasons.Ambiguous);
+			if (count == 1) {
+				for (int i = 0; i < visibleSize; i++) {
+					if (moreSpecific[i] != null) {
+						// 1.8: Give inference a chance to perform outstanding tasks (18.5.2):
+						MethodBinding candidate = inferInvocationType(invocationSite, visible[i], argumentTypes);
+						compilationUnitScope().recordTypeReferences(candidate.thrownExceptions);
+						return candidate;
+					}
+				}
+			} else if (count == 0) {
+				return new ProblemMethodBinding(visible[0], visible[0].selector, visible[0].parameters, ProblemReasons.Ambiguous);
+			}
 		}
 
 		// found several methods that are mutually acceptable -> must be equal
@@ -4099,11 +4668,13 @@
 					MethodBinding next = moreSpecific[j];
 					if (next == null || i == j) continue;
 					MethodBinding original2 = next.original();
-					if (original.getOwningClass() == original2.getOwningClass()) // AspectJ Extension - was (original.declaringClass == original2.declaringClass)
+					// ASPECTJ EXTENSION
+//					if (TypeBinding.equalsEquals(original.declaringClass, original2.declaringClass))
+					if (TypeBinding.equalsEquals(original.getOwningClass(),original2.getOwningClass())) 
 						break nextSpecific; // duplicates thru substitution
 
 					if (!original.isAbstract()) {
-						if (original2.isAbstract())
+						if (original2.isAbstract() || original2.isDefaultMethod())
 							continue; // only compare current against other concrete methods
 						// AspectJ Extension - moved this test down into the if block (pr233838)
 						//original2 = original.findOriginalInheritedMethod(original2);
@@ -4112,16 +4683,16 @@
 						// AspectJ Extension End
 						if (current.hasSubstitutedParameters() || original.typeVariables != Binding.NO_TYPE_VARIABLES) {
 							// AspectJ Extension - from above
-							original2 = original.findOriginalInheritedMethod(original2);
-							if (original2 == null)
-								continue nextSpecific; // current's declaringClass is not a subtype of next's declaringClass
+						original2 = original.findOriginalInheritedMethod(original2);
+						if (original2 == null)
+							continue nextSpecific; // current's declaringClass is not a subtype of next's declaringClass
 							// AspectJ Extension End
 							if (!environment().methodVerifier().isParameterSubsignature(original, original2))
 								continue nextSpecific; // current does not override next
 						}
 					} else if (receiverType != null) { // should not be null if original isAbstract, but be safe
 						TypeBinding superType = receiverType.findSuperTypeOriginatingFrom(original.getOwningClass().erasure());// AspectJ Extension - was declaringClass, now getOwningClass()
-						if (original.declaringClass == superType || !(superType instanceof ReferenceBinding)) {
+						if (TypeBinding.equalsEquals(original.declaringClass, superType) || !(superType instanceof ReferenceBinding)) {
 							// keep original
 						} else {
 							// must find inherited method with the same substituted variables
@@ -4133,9 +4704,8 @@
 								}
 							}
 						}
-//						superType = receiverType.findSuperTypeOriginatingFrom(original2.declaringClass.erasure());
-						superType = receiverType.findSuperTypeOriginatingFrom(original2.getOwningClass().erasure());// AspectJ Extension - was declaringClass, now getOwningClass()
-						if (original2.declaringClass == superType || !(superType instanceof ReferenceBinding)) {
+						superType = receiverType.findSuperTypeOriginatingFrom(original2.declaringClass.erasure());
+						if (TypeBinding.equalsEquals(original2.declaringClass, superType) || !(superType instanceof ReferenceBinding)) {
 							// keep original2
 						} else {
 							// must find inherited method with the same substituted variables
@@ -4151,7 +4721,7 @@
 							original2 = original.computeSubstitutedMethod(original2, environment());
 						if (original2 == null || !original.areParameterErasuresEqual(original2))
 							continue nextSpecific; // current does not override next
-						if (original.returnType != original2.returnType) {
+						if (TypeBinding.notEquals(original.returnType, original2.returnType)) {
 							if (next.original().typeVariables != Binding.NO_TYPE_VARIABLES) {
 								if (original.returnType.erasure().findSuperTypeOriginatingFrom(original2.returnType.erasure()) == null)
 									continue nextSpecific;
@@ -4201,11 +4771,11 @@
 				if (mostSpecificExceptions != null && mostSpecificExceptions != current.thrownExceptions) {
 					return new MostSpecificExceptionMethodBinding(current, mostSpecificExceptions);
 				}
-				return current;
+				// 1.8: Before returning give inference a chance to perform outstanding tasks (18.5.2):
+				return inferInvocationType(invocationSite, current, argumentTypes);
 			}
 		}
 
-		// if all moreSpecific methods are equal then see if duplicates exist because of substitution
 		return new ProblemMethodBinding(visible[0], visible[0].selector, visible[0].parameters, ProblemReasons.Ambiguous);
 	}
 
@@ -4223,7 +4793,7 @@
 			ReferenceBinding currentException = allExceptions[i];
 			for (int j = 0; j < length; j++) {
 				if (i == j) continue;
-				if (currentException == allExceptions[j]) {
+				if (TypeBinding.equalsEquals(currentException, allExceptions[j])) {
 					// duplicate same exception
 					if (i < j) 
 						break; // take only the first occurrence
@@ -4282,7 +4852,7 @@
 				TypeBinding param = parameters[i];
 				TypeBinding arg = arguments[i];
 				//https://bugs.eclipse.org/bugs/show_bug.cgi?id=330445
-				if (arg != param && !arg.isCompatibleWith(param.erasure(), this))
+				if (TypeBinding.notEquals(arg, param) && !arg.isCompatibleWith(param.erasure(), this))
 					return NOT_COMPATIBLE;
 			}
 			return COMPATIBLE;
@@ -4300,7 +4870,7 @@
 			if (paramLength == argLength) { // accept X or X[] but not X[][]
 				TypeBinding param = parameters[lastIndex]; // is an ArrayBinding by definition
 				TypeBinding arg = arguments[lastIndex];
-				if (param != arg) {
+				if (TypeBinding.notEquals(param, arg)) {
 					level = parameterCompatibilityLevel(arg, param, env, tiebreakingVarargsMethods);
 					if (level == NOT_COMPATIBLE) {
 						// expect X[], is it called with X
@@ -4318,7 +4888,7 @@
 					TypeBinding param = ((ArrayBinding) parameters[lastIndex]).elementsType();
 					for (int i = lastIndex; i < argLength; i++) {
 						TypeBinding arg = (tiebreakingVarargsMethods && (i == (argLength - 1))) ? ((ArrayBinding)arguments[i]).elementsType() : arguments[i];
-						if (param != arg && parameterCompatibilityLevel(arg, param, env, tiebreakingVarargsMethods) == NOT_COMPATIBLE)
+						if (TypeBinding.notEquals(param, arg) && parameterCompatibilityLevel(arg, param, env, tiebreakingVarargsMethods) == NOT_COMPATIBLE)
 							return NOT_COMPATIBLE;
 					}
 				}  else if (lastIndex != argLength) { // can call foo(int i, X ... x) with foo(1) but NOT foo();
@@ -4333,7 +4903,7 @@
 		for (int i = 0; i < lastIndex; i++) {
 			TypeBinding param = parameters[i];
 			TypeBinding arg = (tiebreakingVarargsMethods && (i == (argLength - 1))) ? ((ArrayBinding)arguments[i]).elementsType() : arguments[i];
-			if (arg != param) {
+			if (TypeBinding.notEquals(arg,param)) {
 				int newLevel = parameterCompatibilityLevel(arg, param, env, tiebreakingVarargsMethods);
 				if (newLevel == NOT_COMPATIBLE)
 					return NOT_COMPATIBLE;
@@ -4345,12 +4915,19 @@
 	}
 
 	public int parameterCompatibilityLevel(TypeBinding arg, TypeBinding param) {
-		if (arg.isCompatibleWith(param))
+		
+		if (TypeBinding.equalsEquals(arg, param))
 			return COMPATIBLE;
 		
-		if (arg.isBaseType() != param.isBaseType()) {
+		if (arg == null || param == null)
+			return NOT_COMPATIBLE;
+
+		if (arg.isCompatibleWith(param, this))
+			return COMPATIBLE;
+		
+		if (arg.kind() == Binding.POLY_TYPE || (arg.isBaseType() != param.isBaseType())) {
 			TypeBinding convertedType = environment().computeBoxingType(arg);
-			if (convertedType == param || convertedType.isCompatibleWith(param))
+			if (TypeBinding.equalsEquals(convertedType, param) || convertedType.isCompatibleWith(param, this))
 				return AUTOBOX_COMPATIBLE;
 		}
 		return NOT_COMPATIBLE;
@@ -4358,6 +4935,8 @@
 	
 	private int parameterCompatibilityLevel(TypeBinding arg, TypeBinding param, LookupEnvironment env, boolean tieBreakingVarargsMethods) {
 		// only called if env.options.sourceLevel >= ClassFileConstants.JDK1_5
+		if (arg == null || param == null)
+			return NOT_COMPATIBLE;
 		if (arg.isCompatibleWith(param, this))
 			return COMPATIBLE;
 		if (tieBreakingVarargsMethods && (this.compilerOptions().complianceLevel >= ClassFileConstants.JDK1_7 || !CompilerOptions.tolerateIllegalAmbiguousVarargsInvocation)) {
@@ -4369,9 +4948,9 @@
 			*/
 			return NOT_COMPATIBLE;
 		}
-		if (arg.isBaseType() != param.isBaseType()) {
+		if (arg.kind() == Binding.POLY_TYPE || (arg.isBaseType() != param.isBaseType())) {
 			TypeBinding convertedType = env.computeBoxingType(arg);
-			if (convertedType == param || convertedType.isCompatibleWith(param))
+			if (TypeBinding.equalsEquals(convertedType, param) || convertedType.isCompatibleWith(param, this))
 				return AUTOBOX_COMPATIBLE;
 		}
 		return NOT_COMPATIBLE;
@@ -4404,6 +4983,32 @@
 		} while ((current = current.parent) != null);
 		return null;
 	}
+	
+	/**
+	 * Returns the nearest original reference context, starting from current scope.
+	 * If starting on a class, it will return current class. If starting on unitScope, returns unit.
+	 */
+	public ReferenceContext originalReferenceContext() {
+		Scope current = this;
+		do {
+			switch(current.kind) {
+				case METHOD_SCOPE :
+					ReferenceContext context = ((MethodScope) current).referenceContext;
+					if (context instanceof LambdaExpression) {
+						LambdaExpression expression = (LambdaExpression) context;
+						while (expression != expression.original)
+							expression = expression.original;
+						return expression;
+					}
+					return context; 
+				case CLASS_SCOPE :
+					return ((ClassScope) current).referenceContext;
+				case COMPILATION_UNIT_SCOPE :
+					return ((CompilationUnitScope) current).referenceContext;
+			}
+		} while ((current = current.parent) != null);
+		return null;
+	}
 
 	public void deferBoundCheck(TypeReference typeRef) {
 		if (this.kind == CLASS_SCOPE) {
@@ -4425,50 +5030,69 @@
 	   that could instead be invoked with identical results. Return null if no compatible, visible, most specific method
 	   could be found. This method is modeled after Scope.getConstructor and Scope.getMethod.
 	 */
-	public MethodBinding getStaticFactory (ReferenceBinding allocationType, ReferenceBinding originalEnclosingType, TypeBinding[] argumentTypes, final InvocationSite allocationSite) {
-		TypeVariableBinding[] classTypeVariables = allocationType.typeVariables();
-		int classTypeVariablesArity = classTypeVariables.length;
-		MethodBinding[] methods = allocationType.getMethods(TypeConstants.INIT, argumentTypes.length);
+	public MethodBinding getStaticFactory (ParameterizedTypeBinding allocationType, ReferenceBinding originalEnclosingType, TypeBinding[] argumentTypes, final Invocation allocationSite) {
+		
+		// allocationType is the diamond type. originalEnclosingType is the real enclosing type ==> may be parameterized, parameterized with own type variables, raw, just plain type or null.
+		int classTypeVariablesArity = 0;
+		TypeVariableBinding[] classTypeVariables = Binding.NO_TYPE_VARIABLES;
+		ReferenceBinding genericType = allocationType.genericType();
+		ReferenceBinding currentType = genericType;
+		while (currentType != null) {
+			TypeVariableBinding[] typeVariables = currentType.typeVariables();
+			int length = typeVariables == null ? 0 : typeVariables.length;
+			if (length > 0) {
+				System.arraycopy(classTypeVariables, 0, classTypeVariables = new TypeVariableBinding[classTypeVariablesArity + length], 0, classTypeVariablesArity);
+				System.arraycopy(typeVariables, 0, classTypeVariables, classTypeVariablesArity, length);
+				classTypeVariablesArity += length;
+			}	
+			if (currentType.isStatic()) // any enclosing types cannot be parameterized, if generic treat as raw.
+				break;
+			currentType = currentType.enclosingType();
+		}
+	
+		MethodBinding[] methods = genericType.getMethods(TypeConstants.INIT, argumentTypes.length);
 		MethodBinding [] staticFactories = new MethodBinding[methods.length];
 		int sfi = 0;
 		for (int i = 0, length = methods.length; i < length; i++) {
 			MethodBinding method = methods[i];
+			if (!method.canBeSeenBy(allocationSite, this))
+				continue;
+				
 			int paramLength = method.parameters.length;
 			boolean isVarArgs = method.isVarargs();
 			if (argumentTypes.length != paramLength)
 				if (!isVarArgs || argumentTypes.length < paramLength - 1)
 					continue; // incompatible
+			
 			TypeVariableBinding[] methodTypeVariables = method.typeVariables();
 			int methodTypeVariablesArity = methodTypeVariables.length;
-	        
-			MethodBinding staticFactory = new MethodBinding(method.modifiers | ClassFileConstants.AccStatic, TypeConstants.SYNTHETIC_STATIC_FACTORY,
-																		null, null, null, method.declaringClass);
-			staticFactory.typeVariables = new TypeVariableBinding[classTypeVariablesArity + methodTypeVariablesArity];
-			final SimpleLookupTable map = new SimpleLookupTable(classTypeVariablesArity + methodTypeVariablesArity);
-			// Rename each type variable T of the type to T'
+			final int factoryArity = classTypeVariablesArity + methodTypeVariablesArity;
 			final LookupEnvironment environment = environment();
+			
+			MethodBinding staticFactory = new SyntheticFactoryMethodBinding(method, environment, originalEnclosingType);
+			staticFactory.typeVariables = new TypeVariableBinding[factoryArity];
+			final SimpleLookupTable map = new SimpleLookupTable(factoryArity);
+			
+			// Rename each type variable T of the type to T' or T'' or T''' based on the enclosing level to avoid a clash.
+			String prime = ""; //$NON-NLS-1$
+			Binding declaringElement = null;
 			for (int j = 0; j < classTypeVariablesArity; j++) {
-				map.put(classTypeVariables[j], staticFactory.typeVariables[j] = new TypeVariableBinding(CharOperation.concat(classTypeVariables[j].sourceName, "'".toCharArray()), //$NON-NLS-1$
+				TypeVariableBinding original;
+				original = classTypeVariables[j];
+				if (original.declaringElement != declaringElement) {
+					declaringElement = original.declaringElement;
+					prime += "'"; //$NON-NLS-1$
+				}
+				map.put(original, staticFactory.typeVariables[j] = new TypeVariableBinding(CharOperation.concat(original.sourceName, prime.toCharArray()),
 																			staticFactory, j, environment));
 			}
-			// Rename each type variable U of method U to U''.
-			for (int j = classTypeVariablesArity, max = classTypeVariablesArity + methodTypeVariablesArity; j < max; j++) {
-				map.put(methodTypeVariables[j - classTypeVariablesArity], 
-						(staticFactory.typeVariables[j] = new TypeVariableBinding(CharOperation.concat(methodTypeVariables[j - classTypeVariablesArity].sourceName, "''".toCharArray()), //$NON-NLS-1$
+			// Rename each type variable U of method
+			prime += "'"; //$NON-NLS-1$
+			for (int j = classTypeVariablesArity, k = 0; j < factoryArity; j++, k++) {
+				map.put(methodTypeVariables[k], 
+						(staticFactory.typeVariables[j] = new TypeVariableBinding(CharOperation.concat(methodTypeVariables[k].sourceName, prime.toCharArray()),
 																			staticFactory, j, environment)));
-			}
-			ReferenceBinding enclosingType = originalEnclosingType;
-			while (enclosingType != null) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=345968
-				if (enclosingType.kind() == Binding.PARAMETERIZED_TYPE) {
-					final ParameterizedTypeBinding parameterizedType = (ParameterizedTypeBinding) enclosingType;
-					final ReferenceBinding genericType = parameterizedType.genericType();
-					TypeVariableBinding[] enclosingClassTypeVariables = genericType.typeVariables();
-					int enclosingClassTypeVariablesArity = enclosingClassTypeVariables.length;
-					for (int j = 0; j < enclosingClassTypeVariablesArity; j++) {
-						map.put(enclosingClassTypeVariables[j], parameterizedType.arguments[j]);
-					}
-				}
-				enclosingType = enclosingType.enclosingType();
+
 			}
 			final Scope scope = this;
 			Substitution substitution = new Substitution() {
@@ -4480,47 +5104,43 @@
 					}
 					public TypeBinding substitute(TypeVariableBinding typeVariable) {
 						TypeBinding retVal = (TypeBinding) map.get(typeVariable);
-						return retVal != null ? retVal : typeVariable;
+						return retVal == null ? typeVariable : typeVariable.hasTypeAnnotations() ? environment().createAnnotatedType(retVal, typeVariable.getTypeAnnotations()) : retVal;
 					}
 				};
 
 			// initialize new variable bounds
-			for (int j = 0, max = classTypeVariablesArity + methodTypeVariablesArity; j < max; j++) {
+			for (int j = 0; j < factoryArity; j++) {
 				TypeVariableBinding originalVariable = j < classTypeVariablesArity ? classTypeVariables[j] : methodTypeVariables[j - classTypeVariablesArity];
-				TypeBinding substitutedType = (TypeBinding) map.get(originalVariable);
-				if (substitutedType instanceof TypeVariableBinding) {
-					TypeVariableBinding substitutedVariable = (TypeVariableBinding) substitutedType;
-					TypeBinding substitutedSuperclass = Scope.substitute(substitution, originalVariable.superclass);
-					ReferenceBinding[] substitutedInterfaces = Scope.substitute(substitution, originalVariable.superInterfaces);
-					if (originalVariable.firstBound != null) {
-						substitutedVariable.firstBound = originalVariable.firstBound == originalVariable.superclass
-								? substitutedSuperclass // could be array type or interface
-										: substitutedInterfaces[0];
-					}
-					switch (substitutedSuperclass.kind()) {
-						case Binding.ARRAY_TYPE :
-							substitutedVariable.superclass = environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null);
-							substitutedVariable.superInterfaces = substitutedInterfaces;
-							break;
-						default:
-							if (substitutedSuperclass.isInterface()) {
-								substitutedVariable.superclass = environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null);
-								int interfaceCount = substitutedInterfaces.length;
-								System.arraycopy(substitutedInterfaces, 0, substitutedInterfaces = new ReferenceBinding[interfaceCount+1], 1, interfaceCount);
-								substitutedInterfaces[0] = (ReferenceBinding) substitutedSuperclass;
-								substitutedVariable.superInterfaces = substitutedInterfaces;
-							} else {
-								substitutedVariable.superclass = (ReferenceBinding) substitutedSuperclass; // typeVar was extending other typeVar which got substituted with interface
-								substitutedVariable.superInterfaces = substitutedInterfaces;
-							}
-					}
+				TypeVariableBinding substitutedVariable = (TypeVariableBinding) map.get(originalVariable);
+				
+				TypeBinding substitutedSuperclass = Scope.substitute(substitution, originalVariable.superclass);
+				ReferenceBinding[] substitutedInterfaces = Scope.substitute(substitution, originalVariable.superInterfaces);
+				if (originalVariable.firstBound != null) {
+					TypeBinding firstBound;
+					firstBound = TypeBinding.equalsEquals(originalVariable.firstBound, originalVariable.superclass)
+							? substitutedSuperclass // could be array type or interface
+									: substitutedInterfaces[0];
+					substitutedVariable.setFirstBound(firstBound);
+				}
+				switch (substitutedSuperclass.kind()) {
+					case Binding.ARRAY_TYPE :
+						substitutedVariable.setSuperClass(environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null));
+						substitutedVariable.setSuperInterfaces(substitutedInterfaces);
+						break;
+					default:
+						if (substitutedSuperclass.isInterface()) {
+							substitutedVariable.setSuperClass(environment.getResolvedType(TypeConstants.JAVA_LANG_OBJECT, null));
+							int interfaceCount = substitutedInterfaces.length;
+							System.arraycopy(substitutedInterfaces, 0, substitutedInterfaces = new ReferenceBinding[interfaceCount+1], 1, interfaceCount);
+							substitutedInterfaces[0] = (ReferenceBinding) substitutedSuperclass;
+							substitutedVariable.setSuperInterfaces(substitutedInterfaces);
+						} else {
+							substitutedVariable.setSuperClass((ReferenceBinding) substitutedSuperclass); // typeVar was extending other typeVar which got substituted with interface
+							substitutedVariable.setSuperInterfaces(substitutedInterfaces);
+						}
 				}
 			}
-		    TypeVariableBinding[] returnTypeParameters = new TypeVariableBinding[classTypeVariablesArity];
-			for (int j = 0; j < classTypeVariablesArity; j++) {
-				returnTypeParameters[j] = (TypeVariableBinding) map.get(classTypeVariables[j]);
-			}
-			staticFactory.returnType = environment.createParameterizedType(allocationType, returnTypeParameters, allocationType.enclosingType());
+			staticFactory.returnType = environment.createParameterizedType(genericType, Scope.substitute(substitution, genericType.typeVariables()), originalEnclosingType);
 			staticFactory.parameters = Scope.substitute(substitution, method.parameters);
 			staticFactory.thrownExceptions = Scope.substitute(substitution, method.thrownExceptions);
 			if (staticFactory.thrownExceptions == null) { 
@@ -4537,7 +5157,7 @@
 		MethodBinding[] compatible = new MethodBinding[sfi];
 		int compatibleIndex = 0;
 		for (int i = 0; i < sfi; i++) {
-			MethodBinding compatibleMethod = computeCompatibleMethod(staticFactories[i], argumentTypes, allocationSite);
+			MethodBinding compatibleMethod = computeCompatibleMethod(staticFactories[i], argumentTypes, allocationSite, APPLICABILITY);
 			if (compatibleMethod != null) {
 				if (compatibleMethod.isValidBinding())
 					compatible[compatibleIndex++] = compatibleMethod;
@@ -4547,31 +5167,26 @@
 		if (compatibleIndex == 0) {
 			return null;
 		}
-		MethodBinding[] visible = new MethodBinding[compatibleIndex];
-		int visibleIndex = 0;
-		for (int i = 0; i < compatibleIndex; i++) {
-			MethodBinding method = compatible[i];
-			if (method.canBeSeenBy(allocationSite, this))
-				visible[visibleIndex++] = method;
+		if (compatibleIndex == 1) {
+			// 1.8: Give inference a chance to perform outstanding tasks (18.5.2):
+			compatible[0] = inferInvocationType(allocationSite, compatible[0], argumentTypes);
 		}
-		if (visibleIndex == 0) {
-			return null;
-		}
-		return visibleIndex == 1 ? visible[0] : mostSpecificMethodBinding(visible, visibleIndex, argumentTypes, allocationSite, allocationType);
+		return compatibleIndex == 1 ? compatible[0] : mostSpecificMethodBinding(compatible, compatibleIndex, argumentTypes, allocationSite, allocationType);
 	}
 
-	public void validateNullAnnotation(long tagBits, TypeReference typeRef, Annotation[] annotations) {
-		long nullAnnotationTagBit = tagBits & (TagBits.AnnotationNonNull|TagBits.AnnotationNullable);
+	public boolean validateNullAnnotation(long tagBits, TypeReference typeRef, Annotation[] annotations) {
+		long nullAnnotationTagBit = tagBits & (TagBits.AnnotationNullMASK);
 		if (nullAnnotationTagBit != 0) {
 			TypeBinding type = typeRef.resolvedType;
 			if (type != null && type.isBaseType()) {
-				char[][] annotationName = (nullAnnotationTagBit == TagBits.AnnotationNonNull)
-						? environment().getNonNullAnnotationName()
-						: environment().getNullableAnnotationName();
-				problemReporter().illegalAnnotationForBaseType(typeRef, annotations,
-						annotationName[annotationName.length-1], nullAnnotationTagBit);
+				// type annotations are *always* illegal for 'void' (already reported)
+				if (!(typeRef.resolvedType.id == TypeIds.T_void && compilerOptions().sourceLevel >= ClassFileConstants.JDK1_8))
+					problemReporter().illegalAnnotationForBaseType(typeRef, annotations, nullAnnotationTagBit);
+				return false;
 			}
+			// for type annotations, more problems are detected in Annotation.isTypeUseCompatible()
 		}
+		return true;
 	}
 	public static BlockScope typeAnnotationsResolutionScope(Scope scope) {
 		BlockScope resolutionScope = null;
@@ -4619,6 +5234,27 @@
 			}
 		}
 	}
+
+	/**
+	 * Given a selected applibable method, check if it has an unfinished InferenceContext18 associated.
+	 * If so perform the outstanding Invocation Type Inference and return the improved method,
+	 * otherwise return the applicable method unchanged.
+	 */
+	protected MethodBinding inferInvocationType(InvocationSite invocationSite, MethodBinding applicable, TypeBinding[] argumentTypes) {
+		if (invocationSite instanceof Invocation) {
+			Invocation invocation = (Invocation) invocationSite;
+			if (applicable instanceof ParameterizedGenericMethodBinding) {
+				ParameterizedGenericMethodBinding parameterizedMethod = (ParameterizedGenericMethodBinding) applicable;
+				InferenceContext18 infCtx18 = invocation.getInferenceContext(parameterizedMethod);
+				if (infCtx18 != null && !infCtx18.hasResultFor(invocation.invocationTargetType())) {
+					return infCtx18.inferInvocationType(invocation, argumentTypes, parameterizedMethod);
+				}
+			} else {
+				ASTNode.resolvePolyExpressionArguments(invocation, applicable, argumentTypes, this);
+			}
+		}
+		return applicable;
+	}
 	
 	// AspectJ Extension
 	/**
@@ -4628,4 +5264,5 @@
 		return sourceType.getTypeVariable(name);
 	}
 	// End AspectJ Extension
+	
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
index 5e71c30..a756fca 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - Contributions for
@@ -26,6 +22,20 @@
  *								bug 331649 - [compiler][null] consider null annotations for fields
  *								bug 380896 - [compiler][null] Enum constants not recognised as being NonNull.
  *								bug 391376 - [1.8] check interaction of default methods with bridge methods and generics
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 415850 - [1.8] Ensure RunJDTCoreTests can cope with null annotations enabled
+ *								Bug 416172 - [1.8][compiler][null] null type annotation not evaluated on method return type
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 426048 - [1.8] NPE in TypeVariableBinding.internalBoundCheck when parentheses are not balanced
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *      Jesper S Moller <jesper@selskabet.org> -  Contributions for
+ *								Bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
+ *      Till Brychcy - Contributions for
+ *     							bug 415269 - NonNullByDefault is not always inherited to nested classes
+ *      Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          	Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -53,15 +63,17 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class SourceTypeBinding extends ReferenceBinding {
-	public ReferenceBinding superclass;
-	public ReferenceBinding[] superInterfaces;
+	public ReferenceBinding superclass;                    // MUST NOT be modified directly, use setter !
+	public ReferenceBinding[] superInterfaces;             // MUST NOT be modified directly, use setter !
 	// AspectJ Extension - raised visibility to public of these fields
-	public FieldBinding[] fields;
-	public MethodBinding[] methods;
+	public FieldBinding[] fields;                         // MUST NOT be modified directly, use setter !
+	public MethodBinding[] methods;                       // MUST NOT be modified directly, use setter !
 	// End AspectJ Extension - raised visibility to public of these fields
-	public ReferenceBinding[] memberTypes;
-	public TypeVariableBinding[] typeVariables;
+	public ReferenceBinding[] memberTypes;                 // MUST NOT be modified directly, use setter !
+	public TypeVariableBinding[] typeVariables;            // MUST NOT be modified directly, use setter !
+
 
     //  AspectJ Extension
 
@@ -74,9 +86,10 @@
     public IMemberFinder memberFinder = null;
     public ITypeFinder typeFinder = null;
     //  End AspectJ Extension
-
- 
+    
 	public ClassScope scope;
+	protected SourceTypeBinding prototype;
+	LookupEnvironment environment;
 
 	// Synthetics are separated into 4 categories: methods, super methods, fields, class literals and bridge methods
 	// if a new category is added, also increment MAX_SYNTHETICS
@@ -91,16 +104,19 @@
 
 	private SimpleLookupTable storedAnnotations = null; // keys are this ReferenceBinding & its fields and methods, value is an AnnotationHolder
 
-    private int defaultNullness;
-    private int nullnessDefaultInitialized = 0; // 0: nothing; 1: type; 2: package
-    private int lambdaOrdinal = 0;
-
+	private int defaultNullness;
+	private int nullnessDefaultInitialized = 0; // 0: nothing; 1: type; 2: package
+	private int lambdaOrdinal = 0;
+	private ReferenceBinding containerAnnotationType = null;
   // AspectJ Extension
   // for AspectJ... (because we extend this type with BinaryTypeBinding)
   // (and yes, binary source is a bit odd...)
-  public SourceTypeBinding() {}
+  public SourceTypeBinding() {
+	  this.prototype = this;
+  }
   // End AspectJ Extension
-
+	
+	
 public SourceTypeBinding(char[][] compoundName, PackageBinding fPackage, ClassScope scope) {
 	this.compoundName = compoundName;
 	this.fPackage = fPackage;
@@ -108,15 +124,46 @@
 	this.modifiers = scope.referenceContext.modifiers;
 	this.sourceName = scope.referenceContext.name;
 	this.scope = scope;
+	this.environment = scope.environment();
 
 	// expect the fields & methods to be initialized correctly later
 	this.fields = Binding.UNINITIALIZED_FIELDS;
 	this.methods = Binding.UNINITIALIZED_METHODS;
-
+	this.prototype = this;
 	computeId();
 }
 
+public SourceTypeBinding(SourceTypeBinding prototype) {
+	super(prototype);
+	
+	this.prototype = prototype.prototype;
+	this.prototype.tagBits |= TagBits.HasAnnotatedVariants;
+	this.tagBits &= ~TagBits.HasAnnotatedVariants;
+    
+	this.superclass = prototype.superclass;
+	this.superInterfaces = prototype.superInterfaces;
+	this.fields = prototype.fields;
+	this.methods = prototype.methods;
+	this.memberTypes = prototype.memberTypes;
+	this.typeVariables = prototype.typeVariables;
+	this.environment = prototype.environment;
+
+	// this.scope = prototype.scope;  // Will defeat CompilationUnitDeclaration.cleanUp(TypeDeclaration) && CompilationUnitDeclaration.cleanUp(), so not copied, not an issue for JSR 308.
+
+	this.synthetics = prototype.synthetics;
+	this.genericReferenceTypeSignature = prototype.genericReferenceTypeSignature;
+	this.storedAnnotations = prototype.storedAnnotations;
+	this.defaultNullness = prototype.defaultNullness;
+	this.nullnessDefaultInitialized= prototype.nullnessDefaultInitialized;
+	this.lambdaOrdinal = prototype.lambdaOrdinal;
+	this.containerAnnotationType = prototype.containerAnnotationType;
+	this.tagBits |= TagBits.HasUnresolvedMemberTypes; // see memberTypes()
+}
+
 private void addDefaultAbstractMethods() {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	if ((this.tagBits & TagBits.KnowsDefaultAbstractMethods) != 0) return;
 
 	this.tagBits |= TagBits.KnowsDefaultAbstractMethods;
@@ -174,7 +221,7 @@
 						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;
+								if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 							interfacesToVisit[nextPosition++] = next;
 						}
 					}
@@ -182,7 +229,7 @@
 			}
 			if (defaultAbstractsCount > 0) {
 				int length = this.methods.length;
-				System.arraycopy(this.methods, 0, this.methods = new MethodBinding[length + defaultAbstractsCount], 0, length);
+				System.arraycopy(this.methods, 0, setMethods(new MethodBinding[length + defaultAbstractsCount]), 0, length);
 				System.arraycopy(defaultAbstracts, 0, this.methods, length, defaultAbstractsCount);
 				// re-sort methods
 				length = length + defaultAbstractsCount;
@@ -197,6 +244,9 @@
 *	Answer the new field or the existing field if one already existed.
 */
 public FieldBinding addSyntheticFieldForInnerclass(LocalVariableBinding actualOuterLocalVariable) {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.FIELD_EMUL] == null)
@@ -243,6 +293,9 @@
 *	Answer the new field or the existing field if one already existed.
 */
 public FieldBinding addSyntheticFieldForInnerclass(ReferenceBinding enclosingType) {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.FIELD_EMUL] == null)
@@ -292,6 +345,9 @@
 *	Answer the new field or the existing field if one already existed.
 */
 public FieldBinding addSyntheticFieldForClassLiteral(TypeBinding targetType, BlockScope blockScope) {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.CLASS_LITERAL_EMUL] == null)
@@ -331,6 +387,9 @@
 *	Answer the new field or the existing field if one already existed.
 */
 public FieldBinding addSyntheticFieldForAssert(BlockScope blockScope) {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.FIELD_EMUL] == null)
@@ -375,6 +434,8 @@
 *	Answer the new field or the existing field if one already existed.
 */
 public FieldBinding addSyntheticFieldForEnumValues() {
+
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.FIELD_EMUL] == null)
@@ -436,6 +497,7 @@
 	Answer the new method or the existing method if one already existed.
 */
 public SyntheticMethodBinding addSyntheticMethod(FieldBinding targetField, boolean isReadAccess, boolean isSuperAccess) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.METHOD_EMUL] == null)
@@ -459,6 +521,7 @@
  * char[] constants from TypeConstants must be used: TypeConstants.VALUES/VALUEOF
 */
 public SyntheticMethodBinding addSyntheticEnumMethod(char[] selector) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.METHOD_EMUL] == null)
@@ -482,6 +545,7 @@
  * Add a synthetic field to handle the cache of the switch translation table for the corresponding enum type
  */
 public SyntheticFieldBinding addSyntheticFieldForSwitchEnum(char[] fieldName, String key) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.FIELD_EMUL] == null)
@@ -526,6 +590,7 @@
  * char[] constants from TypeConstants must be used: TypeConstants.VALUES/VALUEOF
 */
 public SyntheticMethodBinding addSyntheticMethodForSwitchEnum(TypeBinding enumBinding) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.METHOD_EMUL] == null)
@@ -553,6 +618,7 @@
 	return accessMethod;
 }
 public SyntheticMethodBinding addSyntheticMethodForEnumInitialization(int begin, int end) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.METHOD_EMUL] == null)
@@ -565,6 +631,7 @@
 	return accessMethod;
 }
 public SyntheticMethodBinding addSyntheticMethod(LambdaExpression lambda) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.METHOD_EMUL] == null)
@@ -579,6 +646,17 @@
 	} else {
 		lambdaMethod = lambdaMethods[0];
 	}
+	
+	// Create a $deserializeLambda$ method if necessary, one is shared amongst all lambdas
+	if (lambda.isSerializable) {
+		SyntheticMethodBinding[] deserializeLambdaMethods = (SyntheticMethodBinding[]) this.synthetics[SourceTypeBinding.METHOD_EMUL].get(TypeConstants.DESERIALIZE_LAMBDA);
+		if (deserializeLambdaMethods == null) {
+			SyntheticMethodBinding deserializeLambdaMethod = new SyntheticMethodBinding(this);
+			this.synthetics[SourceTypeBinding.METHOD_EMUL].put(TypeConstants.DESERIALIZE_LAMBDA,deserializeLambdaMethods = new SyntheticMethodBinding[1]);
+			deserializeLambdaMethods[0] = deserializeLambdaMethod;
+		}
+	}
+	
 	return lambdaMethod;
 }
 
@@ -587,6 +665,7 @@
 	Answer the new method or the existing method if one already existed.
 */
 public SyntheticMethodBinding addSyntheticMethod(MethodBinding targetMethod, boolean isSuperAccess) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.METHOD_EMUL] == null)
@@ -616,6 +695,7 @@
 	return accessMethod;
 }
 public SyntheticMethodBinding addSyntheticArrayMethod(ArrayBinding arrayType, int purpose) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.METHOD_EMUL] == null)
@@ -638,6 +718,7 @@
 	return arrayMethod;
 }
 public SyntheticMethodBinding addSyntheticFactoryMethod(MethodBinding privateConstructor, MethodBinding publicConstructor, TypeBinding [] enclosingInstances) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null)
 		this.synthetics = new HashMap[MAX_SYNTHETICS];
 	if (this.synthetics[SourceTypeBinding.METHOD_EMUL] == null)
@@ -652,9 +733,10 @@
  * Record the fact that bridge methods need to be generated to override certain inherited methods
  */
 public SyntheticMethodBinding addSyntheticBridgeMethod(MethodBinding inheritedMethodToBridge, MethodBinding targetMethod) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (isInterface()) return null; // only classes & enums get bridge methods
 	// targetMethod may be inherited
-	if (inheritedMethodToBridge.returnType.erasure() == targetMethod.returnType.erasure()
+	if (TypeBinding.equalsEquals(inheritedMethodToBridge.returnType.erasure(), targetMethod.returnType.erasure())
 		&& inheritedMethodToBridge.areParameterErasuresEqual(targetMethod)) {
 			return null; // do not need bridge method
 	}
@@ -670,7 +752,7 @@
 			if (synthetic instanceof MethodBinding) {
 				MethodBinding method = (MethodBinding) synthetic;
 				if (CharOperation.equals(inheritedMethodToBridge.selector, method.selector)
-					&& inheritedMethodToBridge.returnType.erasure() == method.returnType.erasure()
+					&& TypeBinding.equalsEquals(inheritedMethodToBridge.returnType.erasure(), method.returnType.erasure())
 					&& inheritedMethodToBridge.areParameterErasuresEqual(method)) {
 						return null;
 				}
@@ -695,8 +777,10 @@
 /*
  * https://bugs.eclipse.org/bugs/show_bug.cgi?id=288658. Generate a bridge method if a public method is inherited
  * from a non-public class into a public class (only in 1.6 or greater)
+ * https://bugs.eclipse.org/404690 : this doesn't apply to inherited interface methods (i.e., default methods)
  */
 public SyntheticMethodBinding addSyntheticBridgeMethod(MethodBinding inheritedMethodToBridge) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.scope.compilerOptions().complianceLevel <= ClassFileConstants.JDK1_5) {
 		return null;
 	}
@@ -716,7 +800,7 @@
 			if (synthetic instanceof MethodBinding) {
 				MethodBinding method = (MethodBinding) synthetic;
 				if (CharOperation.equals(inheritedMethodToBridge.selector, method.selector)
-					&& inheritedMethodToBridge.returnType.erasure() == method.returnType.erasure()
+					&& TypeBinding.equalsEquals(inheritedMethodToBridge.returnType.erasure(), method.returnType.erasure())
 					&& inheritedMethodToBridge.areParameterErasuresEqual(method)) {
 						return null;
 				}
@@ -739,17 +823,29 @@
 	return accessMethod;
 }
 boolean areFieldsInitialized() {
+	if (!isPrototype())
+		return this.prototype.areFieldsInitialized();
 	return this.fields != Binding.UNINITIALIZED_FIELDS;
 }
 boolean areMethodsInitialized() {
+	if (!isPrototype())
+		return this.prototype.areMethodsInitialized();
 	return this.methods != Binding.UNINITIALIZED_METHODS;
 }
 public int kind() {
+	if (!isPrototype())
+		return this.prototype.kind();
 	if (this.typeVariables != Binding.NO_TYPE_VARIABLES) return Binding.GENERIC_TYPE;
 	return Binding.TYPE;
 }
 
+public TypeBinding clone(TypeBinding immaterial) {
+	return new SourceTypeBinding(this);
+}
+
 public char[] computeUniqueKey(boolean isLeaf) {
+	if (!isPrototype())
+		return this.prototype.computeUniqueKey();
 	char[] uniqueKey = super.computeUniqueKey(isLeaf);
 	if (uniqueKey.length == 2) return uniqueKey; // problem type's unique key is "L;"
 	if (Util.isClassFileName(this.fileName)) return uniqueKey; // no need to insert compilation unit name for a .class file
@@ -790,6 +886,7 @@
 }
 
 void faultInTypesForFieldsAndMethods() {
+	if (!isPrototype()) throw new IllegalStateException();
 	// check @Deprecated annotation
 	getAnnotationTagBits(); // marks as deprecated by side effect
 	ReferenceBinding enclosingType = enclosingType();
@@ -803,6 +900,14 @@
 }
 // NOTE: the type of each field of a source type is resolved when needed
 public FieldBinding[] fields() {
+	
+	if (!isPrototype()) {
+		if ((this.tagBits & TagBits.AreFieldsComplete) != 0)
+			return this.fields;
+		this.tagBits |= TagBits.AreFieldsComplete;
+		return this.fields = this.prototype.fields();
+	}
+	
 	if ((this.tagBits & TagBits.AreFieldsComplete) != 0)
 		return this.fields;
 
@@ -831,14 +936,14 @@
 			// ensure fields are consistent reqardless of the error
 			int newSize = resolvedFields.length - failed;
 			if (newSize == 0)
-				return this.fields = Binding.NO_FIELDS;
+				return setFields(Binding.NO_FIELDS);
 
 			FieldBinding[] newFields = new FieldBinding[newSize];
 			for (int i = 0, j = 0, length = resolvedFields.length; i < length; i++) {
 				if (resolvedFields[i] != null)
 					newFields[j++] = resolvedFields[i];
 			}
-			this.fields = newFields;
+			setFields(newFields);
 		}
 	}
 	this.tagBits |= TagBits.AreFieldsComplete;
@@ -848,6 +953,9 @@
  * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#genericTypeSignature()
  */
 public char[] genericTypeSignature() {
+	if (!isPrototype())
+		return this.prototype.genericTypeSignature();
+	
     if (this.genericReferenceTypeSignature == null)
     	this.genericReferenceTypeSignature = computeGenericTypeSignature(this.typeVariables);
     return this.genericReferenceTypeSignature;
@@ -857,6 +965,8 @@
  * <T:LY<TT;>;U:Ljava/lang/Object;V::Ljava/lang/Runnable;:Ljava/lang/Cloneable;:Ljava/util/Map;>Ljava/lang/Exception;Ljava/lang/Runnable;
  */
 public char[] genericSignature() {
+	if (!isPrototype())
+		return this.prototype.genericSignature();
 	
 	// AspectJ Extension
 	// messy messy.  We need to use the 'originalSuperclass/SuperInterfaces' if there are any
@@ -901,9 +1011,14 @@
 /**
  * Compute the tagbits for standard annotations. For source types, these could require
  * lazily resolving corresponding annotation nodes, in case of forward references.
+ * For type use bindings, this method still returns the tagbits corresponding to the type 
+ * declaration binding.
  * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding#getAnnotationTagBits()
  */
 public long getAnnotationTagBits() {
+	if (!isPrototype())
+		return this.prototype.getAnnotationTagBits();
+	
 	if ((this.tagBits & TagBits.AnnotationResolved) == 0 && this.scope != null) {
 		TypeDeclaration typeDecl = this.scope.referenceContext;
 		boolean old = typeDecl.staticInitializerScope.insideTypeAnnotation;
@@ -920,6 +1035,9 @@
 	return this.tagBits;
 }
 public MethodBinding[] getDefaultAbstractMethods() {
+	if (!isPrototype())
+		return this.prototype.getDefaultAbstractMethods();
+	
 	int count = 0;
 	for (int i = this.methods.length; --i >= 0;)
 		if (this.methods[i].isDefaultAbstract())
@@ -935,6 +1053,9 @@
 }
 // NOTE: the return type, arg & exception types of each method of a source type are resolved when needed
 public MethodBinding getExactConstructor(TypeBinding[] argumentTypes) {
+	if (!isPrototype())
+		return this.prototype.getExactConstructor(argumentTypes);
+	
 	int argCount = argumentTypes.length;
 	if ((this.tagBits & TagBits.AreMethodsComplete) != 0) { // have resolved all arg types & return type of the methods
 		long range;
@@ -944,7 +1065,7 @@
 				if (method.parameters.length == argCount) {
 					TypeBinding[] toMatch = method.parameters;
 					for (int iarg = 0; iarg < argCount; iarg++)
-						if (toMatch[iarg] != argumentTypes[iarg])
+						if (TypeBinding.notEquals(toMatch[iarg], argumentTypes[iarg]))
 							continue nextMethod;
 					return method;
 				}
@@ -969,7 +1090,7 @@
 				if (method.parameters.length == argCount) {
 					TypeBinding[] toMatch = method.parameters;
 					for (int iarg = 0; iarg < argCount; iarg++)
-						if (toMatch[iarg] != argumentTypes[iarg])
+						if (TypeBinding.notEquals(toMatch[iarg], argumentTypes[iarg]))
 							continue nextMethod;
 					return method;
 				}
@@ -991,6 +1112,9 @@
 //searches up the hierarchy as long as no potential (but not exact) match was found.
 public MethodBinding getExactMethodBase(char[] selector, TypeBinding[] argumentTypes, CompilationUnitScope refScope) {
     // End AspectJ Extension
+	if (!isPrototype())
+		return this.prototype.getExactMethod(selector, argumentTypes, refScope);
+	
 	// sender from refScope calls recordTypeReference(this)
 	int argCount = argumentTypes.length;
 	boolean foundNothing = true;
@@ -1004,7 +1128,7 @@
 				if (method.parameters.length == argCount) {
 					TypeBinding[] toMatch = method.parameters;
 					for (int iarg = 0; iarg < argCount; iarg++)
-						if (toMatch[iarg] != argumentTypes[iarg])
+						if (TypeBinding.notEquals(toMatch[iarg], argumentTypes[iarg]))
 							continue nextMethod;
 					return method;
 				}
@@ -1050,7 +1174,7 @@
 				TypeBinding[] toMatch = method.parameters;
 				if (toMatch.length == argCount) {
 					for (int iarg = 0; iarg < argCount; iarg++)
-						if (toMatch[iarg] != argumentTypes[iarg])
+						if (TypeBinding.notEquals(toMatch[iarg], argumentTypes[iarg]))
 							continue nextMethod;
 					return method;
 				}
@@ -1087,7 +1211,11 @@
 }
 
 public FieldBinding getFieldBase(char[] fieldName, boolean needResolve) {
-	// End ApsectJ Extension
+	// End AspectJ Extension
+	
+	if (!isPrototype())
+		return this.prototype.getField(fieldName, needResolve);
+	
 	if ((this.tagBits & TagBits.AreFieldsComplete) != 0)
 		return ReferenceBinding.binarySearch(fieldName, this.fields);
 
@@ -1110,7 +1238,7 @@
 				// ensure fields are consistent reqardless of the error
 				int newSize = this.fields.length - 1;
 				if (newSize == 0) {
-					this.fields = Binding.NO_FIELDS;
+					setFields(Binding.NO_FIELDS);
 				} else {
 					FieldBinding[] newFields = new FieldBinding[newSize];
 					int index = 0;
@@ -1119,13 +1247,14 @@
 						if (f == field) continue;
 						newFields[index++] = f;
 					}
-					this.fields = newFields;
+					setFields(newFields);
 				}
 			}
 		}
 	}
 	return null;
 }
+
 // AspectJ Extension - replaced original impl with this 
 public MethodBinding[] getMethods(char[] selector) {
   if (memberFinder != null) return memberFinder.getMethods(this, selector);
@@ -1141,6 +1270,9 @@
 // NOTE: the return type, arg & exception types of each method of a source type are resolved when needed
 public MethodBinding[] getMethodsBase(char[] selector) {
     // End AspectJ Extension
+    if (!isPrototype())
+		return this.prototype.getMethods(selector);
+	
 	if ((this.tagBits & TagBits.AreMethodsComplete) != 0) {
 		long range;
 		if ((range = ReferenceBinding.binarySearch(selector, this.methods)) >= 0) {
@@ -1195,6 +1327,7 @@
 *	or null if one does not exist.
 */
 public FieldBinding getSyntheticField(LocalVariableBinding actualOuterLocalVariable) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null || this.synthetics[SourceTypeBinding.FIELD_EMUL] == null) return null;
 	return (FieldBinding) this.synthetics[SourceTypeBinding.FIELD_EMUL].get(actualOuterLocalVariable);
 }
@@ -1202,7 +1335,7 @@
 *	or null if one does not exist.
 */
 public FieldBinding getSyntheticField(ReferenceBinding targetEnclosingType, boolean onlyExactMatch) {
-
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null || this.synthetics[SourceTypeBinding.FIELD_EMUL] == null) return null;
 	FieldBinding field = (FieldBinding) this.synthetics[SourceTypeBinding.FIELD_EMUL].get(targetEnclosingType);
 	if (field != null) return field;
@@ -1225,6 +1358,7 @@
  * Answer the bridge method associated for an  inherited methods or null if one does not exist
  */
 public SyntheticMethodBinding getSyntheticBridgeMethod(MethodBinding inheritedMethodToBridge) {
+	if (!isPrototype()) throw new IllegalStateException();
 	if (this.synthetics == null) return null;
 	if (this.synthetics[SourceTypeBinding.METHOD_EMUL] == null) return null;
 	SyntheticMethodBinding[] accessors = (SyntheticMethodBinding[]) this.synthetics[SourceTypeBinding.METHOD_EMUL].get(inheritedMethodToBridge);
@@ -1233,6 +1367,9 @@
 }
 
 public boolean hasTypeBit(int bit) {
+	if (!isPrototype()) {
+		return this.prototype.hasTypeBit(bit);
+	}
 	// source types initialize type bits during connectSuperclass/interfaces()
 	return (this.typeBits & bit) != 0;
 }
@@ -1241,6 +1378,10 @@
  * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding#initializeDeprecatedAnnotationTagBits()
  */
 public void initializeDeprecatedAnnotationTagBits() {
+	if (!isPrototype()) {
+		this.prototype.initializeDeprecatedAnnotationTagBits();
+		return;
+	}
 	if ((this.tagBits & TagBits.DeprecatedAnnotationResolved) == 0) {
 		TypeDeclaration typeDecl = this.scope.referenceContext;
 		boolean old = typeDecl.staticInitializerScope.insideTypeAnnotation;
@@ -1260,6 +1401,10 @@
 // ensure the receiver knows its hierarchy & fields/methods so static imports can be resolved correctly
 // see bug 230026
 void initializeForStaticImports() {
+	if (!isPrototype()) {
+		this.prototype.initializeForStaticImports();
+		return;
+	}
 	if (this.scope == null) return; // already initialized
 
 	if (this.superInterfaces == null)
@@ -1268,7 +1413,11 @@
 	this.scope.buildMethods();
 }
 
-private void initializeNullDefault() {
+private int getNullDefault() {
+	
+	if (!isPrototype()) {
+		return this.prototype.getNullDefault();
+	}
 	// ensure nullness defaults are initialized at all enclosing levels:
 	switch (this.nullnessDefaultInitialized) {
 	case 0:
@@ -1278,6 +1427,7 @@
 		getPackage().isViewedAsDeprecated(); // initialize annotations
 		this.nullnessDefaultInitialized = 2;
 	}
+	return this.defaultNullness;
 }
 
 /**
@@ -1285,8 +1435,10 @@
  * or for generic types, true if compared to its raw type.
  */
 public boolean isEquivalentTo(TypeBinding otherType) {
-
-	if (this == otherType) return true;
+	if (!isPrototype())
+		return this.prototype.isEquivalentTo(otherType);
+	
+	if (TypeBinding.equalsEquals(this, otherType)) return true;
 	if (otherType == null) return false;
 	switch(otherType.kind()) {
 
@@ -1298,7 +1450,7 @@
 			if ((otherType.tagBits & TagBits.HasDirectWildcard) == 0 && (!isMemberType() || !otherType.isMemberType()))
 				return false; // should have been identical
 			ParameterizedTypeBinding otherParamType = (ParameterizedTypeBinding) otherType;
-			if (this != otherParamType.genericType())
+			if (TypeBinding.notEquals(this, otherParamType.genericType()))
 				return false;
 			if (!isStatic()) { // static member types do not compare their enclosing
             	ReferenceBinding enclosing = enclosingType();
@@ -1306,7 +1458,7 @@
             		ReferenceBinding otherEnclosing = otherParamType.enclosingType();
             		if (otherEnclosing == null) return false;
             		if ((otherEnclosing.tagBits & TagBits.HasDirectWildcard) == 0) {
-						if (enclosing != otherEnclosing) return false;
+						if (TypeBinding.notEquals(enclosing, otherEnclosing)) return false;
             		} else {
             			if (!enclosing.isEquivalentTo(otherParamType.enclosingType())) return false;
             		}
@@ -1323,26 +1475,60 @@
 			return true;
 
 		case Binding.RAW_TYPE :
-	        return otherType.erasure() == this;
+	        return TypeBinding.equalsEquals(otherType.erasure(), this);
 	}
 	return false;
 }
 public boolean isGenericType() {
+	if (!isPrototype())
+		return this.prototype.isGenericType();
     return this.typeVariables != Binding.NO_TYPE_VARIABLES;
 }
 public boolean isHierarchyConnected() {
+	if (!isPrototype())
+		return this.prototype.isHierarchyConnected();
 	return (this.tagBits & TagBits.EndHierarchyCheck) != 0;
 }
+public boolean isRepeatableAnnotationType() {
+	if (!isPrototype()) throw new IllegalStateException();
+	return this.containerAnnotationType != null;
+}
+
+public boolean isTaggedRepeatable() {  // tagged but not necessarily repeatable. see isRepeatableAnnotationType.
+	return (this.tagBits & TagBits.AnnotationRepeatable) != 0;
+}
+
 public ReferenceBinding[] memberTypes() {
+	if (!isPrototype()) {
+		if ((this.tagBits & TagBits.HasUnresolvedMemberTypes) == 0)
+			return this.memberTypes;
+		ReferenceBinding [] members = this.memberTypes = this.prototype.memberTypes();
+		int membersLength = members == null ? 0 : members.length;
+		this.memberTypes = new ReferenceBinding[membersLength];
+		for (int i = 0; i < membersLength; i++) {
+			this.memberTypes[i] = this.environment.createMemberType(members[i], this);
+		}
+		this.tagBits &= ~TagBits.HasUnresolvedMemberTypes;
+	}
 	return this.memberTypes;
 }
 
 public boolean hasMemberTypes() {
+	if (!isPrototype())
+		return this.prototype.hasMemberTypes();
     return this.memberTypes.length > 0;
 }
 
 // NOTE: the return type, arg & exception types of each method of a source type are resolved when needed
 public MethodBinding[] methodsBase() {  // AspectJ Extension - added Base suffix, see methods()
+	
+	if (!isPrototype()) {
+		if ((this.tagBits & TagBits.AreMethodsComplete) != 0)
+			return this.methods;
+		this.tagBits |= TagBits.AreMethodsComplete;
+		return this.methods = this.prototype.methods();
+	}
+	
 	if ((this.tagBits & TagBits.AreMethodsComplete) != 0)
 		return this.methods;
 
@@ -1401,7 +1587,7 @@
 						// Only in 1.6, we have to make sure even return types are different
 						// https://bugs.eclipse.org/bugs/show_bug.cgi?id=317719
 						if (compliance16 && method.returnType != null && method2.returnType != null) {
-							if (method.returnType.erasure() != method2.returnType.erasure()) {
+							if (TypeBinding.notEquals(method.returnType.erasure(), method2.returnType.erasure())) {
 								// check to see if the erasure of either method is equal to the other
 								// if not, then change severity to WARNING
 								TypeBinding[] params1 = method.parameters;
@@ -1428,17 +1614,17 @@
 									int index = pLength;
 									// is erasure of signature of m2 same as signature of m1?
 									for (; --index >= 0;) {
-										if (params1[index] != params2[index].erasure()) {
+										if (TypeBinding.notEquals(params1[index], params2[index].erasure())) {
 											// If one of them is a raw type
 											if (params1[index] instanceof RawTypeBinding) {
-												if (params2[index].erasure() != ((RawTypeBinding)params1[index]).actualType()) {
+												if (TypeBinding.notEquals(params2[index].erasure(), ((RawTypeBinding)params1[index]).actualType())) {
 													break;
 												}
 											} else  {
 												break;
 											}
 										}
-										if (params1[index] == params2[index]) {
+										if (TypeBinding.equalsEquals(params1[index], params2[index])) {
 											TypeBinding type = params1[index].leafComponentType();
 											if (type instanceof SourceTypeBinding && type.typeVariables() != Binding.NO_TYPE_VARIABLES) {
 												index = pLength; // handle comparing identical source types like X<T>... its erasure is itself BUT we need to answer false
@@ -1449,10 +1635,10 @@
 									if (index >= 0 && index < pLength) {
 										// is erasure of signature of m1 same as signature of m2?
 										for (index = pLength; --index >= 0;)
-											if (params1[index].erasure() != params2[index]) {
+											if (TypeBinding.notEquals(params1[index].erasure(), params2[index])) {
 												// If one of them is a raw type
 												if (params2[index] instanceof RawTypeBinding) {
-													if (params1[index].erasure() != ((RawTypeBinding)params2[index]).actualType()) {
+													if (TypeBinding.notEquals(params1[index].erasure(), ((RawTypeBinding)params2[index]).actualType())) {
 														break;
 													}
 												} else  {
@@ -1492,7 +1678,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;
@@ -1511,7 +1697,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;
@@ -1542,13 +1728,13 @@
 		if (failed > 0) {
 			int newSize = resolvedMethods.length - failed;
 			if (newSize == 0) {
-				this.methods = Binding.NO_METHODS;
+				setMethods(Binding.NO_METHODS);
 			} else {
 				MethodBinding[] newMethods = new MethodBinding[newSize];
 				for (int i = 0, j = 0, length = resolvedMethods.length; i < length; i++)
 					if (resolvedMethods[i] != null)
 						newMethods[j++] = resolvedMethods[i];
-				this.methods = newMethods;
+				setMethods(newMethods);
 			}
 		}
 
@@ -1558,11 +1744,35 @@
 	}
 	return this.methods;
 }
+
+public TypeBinding prototype() {
+	return this.prototype;
+}
+
+public boolean isPrototype() {
+	return this == this.prototype;  //$IDENTITY-COMPARISON$
+}
+
+public ReferenceBinding containerAnnotationType() {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
+	if (this.containerAnnotationType instanceof UnresolvedReferenceBinding) {
+		this.containerAnnotationType = (ReferenceBinding)BinaryTypeBinding.resolveType(this.containerAnnotationType, this.scope.environment(), false);
+	}
+	return this.containerAnnotationType;
+}
+
 public FieldBinding resolveTypeFor(FieldBinding field) {
+	
+	if (!isPrototype())
+		return this.prototype.resolveTypeFor(field);
+
 	if ((field.modifiers & ExtraCompilerModifiers.AccUnresolved) == 0)
 		return field;
 
-	if (this.scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5) {
+	long sourceLevel = this.scope.compilerOptions().sourceLevel;
+	if (sourceLevel >= ClassFileConstants.JDK1_5) {
 		if ((field.getAnnotationTagBits() & TagBits.AnnotationDeprecated) != 0)
 			field.modifiers |= ClassFileConstants.AccDeprecated;
 	}
@@ -1611,19 +1821,26 @@
 				field.modifiers |= ExtraCompilerModifiers.AccGenericSignature;
 			}
 
+			if (sourceLevel >= ClassFileConstants.JDK1_8) {
+				Annotation [] annotations = fieldDecl.annotations;
+				if (annotations != null && annotations.length != 0) {
+					ASTNode.copySE8AnnotationsToType(initializationScope, field, fieldDecl.annotations);
+				}
+				Annotation.isTypeUseCompatible(fieldDecl.type, this.scope, fieldDecl.annotations);
+			}
 			// apply null default:
-			LookupEnvironment environment = this.scope.environment();
-			if (environment.globalOptions.isAnnotationBasedNullAnalysisEnabled) {
+			if (this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled) {
+				// TODO(SH): different strategy for 1.8, or is "repair" below enough?
 				if (fieldDecl.getKind() == AbstractVariableDeclaration.ENUM_CONSTANT) {
 					// enum constants neither have a type declaration nor can they be null
 					field.tagBits |= TagBits.AnnotationNonNull;
 				} else {
-					initializeNullDefault();
 					if (hasNonNullDefault()) {
 						field.fillInDefaultNonNullness(fieldDecl, initializationScope);
 					}
 					// validate null annotation:
-					this.scope.validateNullAnnotation(field.tagBits, fieldDecl.type, fieldDecl.annotations);
+					if (!this.scope.validateNullAnnotation(field.tagBits, fieldDecl.type, fieldDecl.annotations))
+						field.tagBits &= ~TagBits.AnnotationNullMASK;
 				}
 			}
 		} finally {
@@ -1634,10 +1851,20 @@
 	return null; // should never reach this point
 }
 public MethodBinding resolveTypesFor(MethodBinding method) {
+	
+	if (!isPrototype())
+		return this.prototype.resolveTypesFor(method);
+	
 	if ((method.modifiers & ExtraCompilerModifiers.AccUnresolved) == 0)
 		return method;
 
-	if (this.scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5) {
+	final long sourceLevel = this.scope.compilerOptions().sourceLevel;
+	if (sourceLevel >= ClassFileConstants.JDK1_5) {
+		ReferenceBinding object = this.scope.getJavaLangObject();
+		TypeVariableBinding[] tvb = method.typeVariables;
+		for (int i = 0; i < tvb.length; i++)
+			tvb[i].superclass = object;		// avoid null (see https://bugs.eclipse.org/426048)
+
 		if ((method.getAnnotationTagBits() & TagBits.AnnotationDeprecated) != 0)
 			method.modifiers |= ClassFileConstants.AccDeprecated;
 	}
@@ -1682,6 +1909,9 @@
 			if ((resolvedExceptionType.tagBits & TagBits.HasMissingType) != 0) {
 				method.tagBits |= TagBits.HasMissingType;
 			}
+			if (resolvedExceptionType.hasNullTypeAnnotations()) {
+				methodDecl.scope.problemReporter().nullAnnotationUnsupportedLocation(exceptionTypes[i]);
+			}
 			method.modifiers |= (resolvedExceptionType.modifiers & ExtraCompilerModifiers.AccGenericSignature);
 			method.thrownExceptions[count++] = resolvedExceptionType;
 		}
@@ -1731,7 +1961,7 @@
 				if (leafType instanceof ReferenceBinding && (((ReferenceBinding) leafType).modifiers & ExtraCompilerModifiers.AccGenericSignature) != 0)
 					method.modifiers |= ExtraCompilerModifiers.AccGenericSignature;
 				newParameters[i] = parameterType;
-				arg.binding = new LocalVariableBinding(arg, parameterType, arg.modifiers, true /*isArgument*/);
+				arg.binding = new LocalVariableBinding(arg, parameterType, arg.modifiers, methodDecl.scope);
 			}
 		}
 		// only assign parameters if no problems are found
@@ -1741,7 +1971,7 @@
 	}
 
 	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=337799
-	if (this.scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_7) {
+	if (sourceLevel >= ClassFileConstants.JDK1_7) {
 		if ((method.tagBits & TagBits.AnnotationSafeVarargs) != 0) {
 			if (!method.isVarargs()) {
 				methodDecl.scope.problemReporter().safeVarargsOnFixedArityMethod(method);
@@ -1785,6 +2015,13 @@
 					method.tagBits |= TagBits.HasMissingType;
 				}
 				method.returnType = methodType;
+				if (sourceLevel >= ClassFileConstants.JDK1_8 && !method.isVoidMethod()) {
+					Annotation [] annotations = methodDecl.annotations;
+					if (annotations != null && annotations.length != 0) {
+						ASTNode.copySE8AnnotationsToType(methodDecl.scope, method, methodDecl.annotations);
+					}
+					Annotation.isTypeUseCompatible(returnType, this.scope, methodDecl.annotations);
+				}
 				TypeBinding leafType = methodType.leafComponentType();
 				if (leafType instanceof ReferenceBinding && (((ReferenceBinding) leafType).modifiers & ExtraCompilerModifiers.AccGenericSignature) != 0)
 					method.modifiers |= ExtraCompilerModifiers.AccGenericSignature;
@@ -1805,8 +2042,26 @@
 	}
 	CompilerOptions compilerOptions = this.scope.compilerOptions();
 	if (compilerOptions.isAnnotationBasedNullAnalysisEnabled) {
-		createArgumentBindings(method, compilerOptions); // need annotations resolved already at this point
+		if (!method.isConstructor() && method.returnType != null) {
+			long nullTagBits = method.tagBits & TagBits.AnnotationNullMASK;
+			if (nullTagBits != 0) {
+				TypeReference returnTypeRef = ((MethodDeclaration)methodDecl).returnType;
+				if (compilerOptions.sourceLevel < ClassFileConstants.JDK1_8) {
+					if (!this.scope.validateNullAnnotation(nullTagBits, returnTypeRef, methodDecl.annotations))
+						method.tagBits &= ~TagBits.AnnotationNullMASK;
+				} else {
+					if (nullTagBits != (method.returnType.tagBits & TagBits.AnnotationNullMASK)) {
+						if (!this.scope.validateNullAnnotation(nullTagBits, returnTypeRef, methodDecl.annotations)) {
+							method.returnType.tagBits &= ~TagBits.AnnotationNullMASK;
+						}
+						method.tagBits &= ~TagBits.AnnotationNullMASK;
+					}
+				}
+			}
+		}
 	}
+	if (compilerOptions.storeAnnotations)
+		createArgumentBindings(method, compilerOptions); // need annotations resolved already at this point
 	if (foundReturnTypeProblem)
 		return method; // but its still unresolved with a null return type & is still connected to its method declaration
 
@@ -1814,7 +2069,7 @@
 	return method;
 }
 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=391108
-private void rejectTypeAnnotatedVoidMethod(AbstractMethodDeclaration methodDecl) {
+private static void rejectTypeAnnotatedVoidMethod(AbstractMethodDeclaration methodDecl) {
 	Annotation[] annotations = methodDecl.annotations;
 	int length = annotations == null ? 0 : annotations.length;
 	for (int i = 0; i < length; i++) {
@@ -1826,8 +2081,12 @@
 		}
 	}
 }
+
 private void createArgumentBindings(MethodBinding method, CompilerOptions compilerOptions) {
-	initializeNullDefault();
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	if (compilerOptions.isAnnotationBasedNullAnalysisEnabled)
+		getNullDefault(); // ensure initialized
 	AbstractMethodDeclaration methodDecl = method.sourceMethod();
 	if (methodDecl != null) {
 		// while creating argument bindings we also collect explicit null annotations:
@@ -1835,11 +2094,15 @@
 			methodDecl.createArgumentBindings();
 		// add implicit annotations (inherited(?) & default):
 		if (compilerOptions.isAnnotationBasedNullAnalysisEnabled) {
-			new ImplicitNullAnnotationVerifier(compilerOptions.inheritNullAnnotations).checkImplicitNullAnnotations(method, methodDecl, true, this.scope);
+			new ImplicitNullAnnotationVerifier(this.scope.environment()).checkImplicitNullAnnotations(method, methodDecl, true, this.scope);
 		}
 	}
 }
+
 private void evaluateNullAnnotations(long annotationTagBits) {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	if (this.nullnessDefaultInitialized > 0 || !this.scope.compilerOptions().isAnnotationBasedNullAnalysisEnabled)
 		return;
 	boolean isPackageInfo = CharOperation.equals(this.sourceName, TypeConstants.PACKAGE_INFO_NAME);
@@ -1886,6 +2149,9 @@
 }
 
 protected void checkRedundantNullnessDefaultRecurse(ASTNode location, Annotation[] annotations, long annotationTagBits) {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	if (this.fPackage.defaultNullness != NO_NULL_DEFAULT) {
 		if ((this.fPackage.defaultNullness == NONNULL_BY_DEFAULT
 				&& ((annotationTagBits & TagBits.AnnotationNonNullByDefault) != 0))) {
@@ -1897,7 +2163,10 @@
 
 // return: should caller continue searching?
 protected boolean checkRedundantNullnessDefaultOne(ASTNode location, Annotation[] annotations, long annotationTagBits) {
-	int thisDefault = this.defaultNullness;
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
+	int thisDefault = getNullDefault();
 	if (thisDefault == NONNULL_BY_DEFAULT) {
 		if ((annotationTagBits & TagBits.AnnotationNonNullByDefault) != 0) {
 			this.scope.problemReporter().nullDefaultAnnotationIsRedundant(location, annotations, this);
@@ -1908,6 +2177,9 @@
 }
 
 boolean hasNonNullDefault() {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	// find the applicable default inside->out:
 
 	SourceTypeBinding currentType = null;
@@ -1927,7 +2199,7 @@
 			case Scope.CLASS_SCOPE:
 				currentType = ((ClassScope)currentScope).referenceContext.binding;
 				if (currentType != null) {
-					int foundDefaultNullness = currentType.defaultNullness;
+					int foundDefaultNullness = currentType.getNullDefault();
 					if (foundDefaultNullness != NO_NULL_DEFAULT) {
 						return foundDefaultNullness == NONNULL_BY_DEFAULT;
 					}
@@ -1946,38 +2218,164 @@
 }
 
 public AnnotationHolder retrieveAnnotationHolder(Binding binding, boolean forceInitialization) {
+	if (!isPrototype())
+		return this.prototype.retrieveAnnotationHolder(binding, forceInitialization);
 	if (forceInitialization)
 		binding.getAnnotationTagBits(); // ensure annotations are up to date
 	return super.retrieveAnnotationHolder(binding, false);
 }
-public void setFields(FieldBinding[] fields) {
-	this.fields = fields;
+
+public void setContainerAnnotationType(ReferenceBinding value) {
+	if (!isPrototype()) throw new IllegalStateException();
+	this.containerAnnotationType  = value;
 }
-public void setMethods(MethodBinding[] methods) {
-	this.methods = methods;
+
+public void tagAsHavingDefectiveContainerType() {
+	if (!isPrototype()) throw new IllegalStateException();
+	if (this.containerAnnotationType != null && this.containerAnnotationType.isValidBinding())
+		this.containerAnnotationType = new ProblemReferenceBinding(this.containerAnnotationType.compoundName, this.containerAnnotationType, ProblemReasons.DefectiveContainerAnnotationType);
 }
+
+// Propagate writes to all annotated variants so the clones evolve along.
+public FieldBinding [] setFields(FieldBinding[] fields) {
+	
+	if (!isPrototype())
+		return this.prototype.setFields(fields);
+
+	if ((this.tagBits & TagBits.HasAnnotatedVariants) != 0) {
+		TypeBinding [] annotatedTypes = this.scope.environment().getAnnotatedTypes(this);
+		for (int i = 0, length = annotatedTypes == null ? 0 : annotatedTypes.length; i < length; i++) {
+			SourceTypeBinding annotatedType = (SourceTypeBinding) annotatedTypes[i];
+			annotatedType.fields = fields;
+		}
+	}
+	return this.fields = fields;
+}
+
+// We need to specialize member types, can't just propagate. Can't specialize here, clones could created post setMemberTypes()
+public ReferenceBinding [] setMemberTypes(ReferenceBinding[] memberTypes) {
+	
+	if (!isPrototype())
+		return this.prototype.setMemberTypes(memberTypes);
+
+	this.memberTypes = memberTypes;
+	if ((this.tagBits & TagBits.HasAnnotatedVariants) != 0) {
+		TypeBinding [] annotatedTypes = this.scope.environment().getAnnotatedTypes(this);
+		for (int i = 0, length = annotatedTypes == null ? 0 : annotatedTypes.length; i < length; i++) {
+			SourceTypeBinding annotatedType = (SourceTypeBinding) annotatedTypes[i];
+			annotatedType.tagBits |= TagBits.HasUnresolvedMemberTypes;
+			annotatedType.memberTypes(); // recompute.
+		}
+	}
+	return this.memberTypes;
+}
+
+// Propagate writes to all annotated variants so the clones evolve along.
+public MethodBinding [] setMethods(MethodBinding[] methods) {
+	
+	if (!isPrototype())
+		return this.prototype.setMethods(methods);
+	
+	if ((this.tagBits & TagBits.HasAnnotatedVariants) != 0) {
+		TypeBinding [] annotatedTypes = this.scope.environment().getAnnotatedTypes(this);
+		for (int i = 0, length = annotatedTypes == null ? 0 : annotatedTypes.length; i < length; i++) {
+			SourceTypeBinding annotatedType = (SourceTypeBinding) annotatedTypes[i];
+			annotatedType.methods = methods;
+		}
+	}
+	return this.methods = methods;
+}
+
+// Propagate writes to all annotated variants so the clones evolve along.
+public ReferenceBinding setSuperClass(ReferenceBinding superClass) {
+	
+	if (!isPrototype())
+		return this.prototype.setSuperClass(superClass);
+	
+	if ((this.tagBits & TagBits.HasAnnotatedVariants) != 0) {
+		TypeBinding [] annotatedTypes = this.scope.environment().getAnnotatedTypes(this);
+		for (int i = 0, length = annotatedTypes == null ? 0 : annotatedTypes.length; i < length; i++) {
+			SourceTypeBinding annotatedType = (SourceTypeBinding) annotatedTypes[i];
+			annotatedType.superclass = superClass;
+		}
+	}
+	return this.superclass = superClass;
+}
+
+// Propagate writes to all annotated variants so the clones evolve along.
+public ReferenceBinding [] setSuperInterfaces(ReferenceBinding [] superInterfaces) {
+	
+	if (!isPrototype())
+		return this.prototype.setSuperInterfaces(superInterfaces);
+	
+	if ((this.tagBits & TagBits.HasAnnotatedVariants) != 0) {
+		TypeBinding [] annotatedTypes = this.scope.environment().getAnnotatedTypes(this);
+		for (int i = 0, length = annotatedTypes == null ? 0 : annotatedTypes.length; i < length; i++) {
+			SourceTypeBinding annotatedType = (SourceTypeBinding) annotatedTypes[i];
+			annotatedType.superInterfaces = superInterfaces;
+		}
+	}
+	return this.superInterfaces = superInterfaces;
+}
+
+// Propagate writes to all annotated variants so the clones evolve along.
+public TypeVariableBinding [] setTypeVariables(TypeVariableBinding [] typeVariables) {
+	
+	if (!isPrototype())
+		return this.prototype.setTypeVariables(typeVariables);
+	
+	if ((this.tagBits & TagBits.HasAnnotatedVariants) != 0) {
+		TypeBinding [] annotatedTypes = this.scope.environment().getAnnotatedTypes(this);
+		for (int i = 0, length = annotatedTypes == null ? 0 : annotatedTypes.length; i < length; i++) {
+			SourceTypeBinding annotatedType = (SourceTypeBinding) annotatedTypes[i];
+			annotatedType.typeVariables = typeVariables;
+		}
+	}
+	return this.typeVariables = typeVariables;
+}
+
 public final int sourceEnd() {
+	if (!isPrototype())
+		return this.prototype.sourceEnd();
+
 	return this.scope.referenceContext.sourceEnd;
 }
 public final int sourceStart() {
+	if (!isPrototype())
+		return this.prototype.sourceStart();
+
 	return this.scope.referenceContext.sourceStart;
 }
 SimpleLookupTable storedAnnotations(boolean forceInitialize) {
+	if (!isPrototype())
+		return this.prototype.storedAnnotations(forceInitialize);
+
 	if (forceInitialize && this.storedAnnotations == null && this.scope != null) { // scope null when no annotation cached, and type got processed fully (159631)
 		this.scope.referenceCompilationUnit().compilationResult.hasAnnotations = true;
-		if (!this.scope.environment().globalOptions.storeAnnotations)
+		final CompilerOptions globalOptions = this.scope.environment().globalOptions;
+		if (!globalOptions.storeAnnotations)
 			return null; // not supported during this compile
 		this.storedAnnotations = new SimpleLookupTable(3);
 	}
 	return this.storedAnnotations;
 }
+
 public ReferenceBinding superclass() {
+	if (!isPrototype())
+		return this.superclass = this.prototype.superclass();
 	return this.superclass;
 }
+
 public ReferenceBinding[] superInterfaces() {
-	return this.superInterfaces;
+	if (!isPrototype())
+		return this.superInterfaces = this.prototype.superInterfaces();
+	return this.superInterfaces != null ? this.superInterfaces : isAnnotationType() ? this.superInterfaces = new ReferenceBinding [] { this.scope.getJavaLangAnnotationAnnotation() } : null;
 }
+
 public SyntheticMethodBinding[] syntheticMethods() {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	if (this.synthetics == null 
 			|| this.synthetics[SourceTypeBinding.METHOD_EMUL] == null 
 			|| this.synthetics[SourceTypeBinding.METHOD_EMUL].size() == 0) {
@@ -2011,6 +2409,9 @@
  * Answer the collection of synthetic fields to append into the classfile
  */
 public FieldBinding[] syntheticFields() {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	if (this.synthetics == null) return null;
 	int fieldSize = this.synthetics[SourceTypeBinding.FIELD_EMUL] == null ? 0 : this.synthetics[SourceTypeBinding.FIELD_EMUL].size();
 	int literalSize = this.synthetics[SourceTypeBinding.CLASS_LITERAL_EMUL] == null ? 0 :this.synthetics[SourceTypeBinding.CLASS_LITERAL_EMUL].size();
@@ -2037,7 +2438,11 @@
 	return bindings;
 }
 public String toString() {
-    StringBuffer buffer = new StringBuffer(30);
+	if (this.hasTypeAnnotations()) {
+		return annotatedDebugName();
+    }
+	
+	StringBuffer buffer = new StringBuffer(30);
     buffer.append("(id="); //$NON-NLS-1$
     if (this.id == TypeIds.NoId)
         buffer.append("NoId"); //$NON-NLS-1$
@@ -2128,20 +2533,35 @@
 	return buffer.toString();
 }
 public TypeVariableBinding[] typeVariables() {
+	if (!isPrototype())
+		return this.typeVariables = this.prototype.typeVariables();
 	return this.typeVariables != null ? this.typeVariables : Binding.NO_TYPE_VARIABLES;
 }
 void verifyMethods(MethodVerifier verifier) {
+	
+	if (!isPrototype()) throw new IllegalStateException();
+	
 	verifier.verify(this);
 
 	for (int i = this.memberTypes.length; --i >= 0;)
 		 ((SourceTypeBinding) this.memberTypes[i]).verifyMethods(verifier);
 }
 
+public TypeBinding unannotated() {
+	return this.prototype;
+}
+
 public FieldBinding[] unResolvedFields() {
+	if (!isPrototype())
+		return this.prototype.unResolvedFields();
 	return this.fields;
 }
 
 public void tagIndirectlyAccessibleMembers() {
+	if (!isPrototype()) {
+		this.prototype.tagIndirectlyAccessibleMembers();
+		return;
+	}
 	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=328281
 	for (int i = 0; i < this.fields.length; i++) {
 		if (!this.fields[i].isPrivate())
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticFactoryMethodBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticFactoryMethodBinding.java
new file mode 100644
index 0000000..2bb21a2
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticFactoryMethodBinding.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2014 GK Software AG.
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+
+/**
+ * Encodes a synthetic &lt;factory&gt; method used for resolving a diamond constructor.
+ */
+public class SyntheticFactoryMethodBinding extends MethodBinding {
+
+	private MethodBinding staticFactoryFor;
+	private LookupEnvironment environment;
+	private ReferenceBinding enclosingType;
+	
+	public SyntheticFactoryMethodBinding(MethodBinding method, LookupEnvironment environment, ReferenceBinding enclosingType) {
+		super(method.modifiers | ClassFileConstants.AccStatic, TypeConstants.SYNTHETIC_STATIC_FACTORY,
+				null, null, null, method.declaringClass);
+		this.environment = environment;
+		this.staticFactoryFor = method;
+		this.enclosingType = enclosingType;
+	}
+	
+	/** Apply the given type arguments on the (declaring class of the) actual constructor being represented by this factory method. */
+	public ParameterizedMethodBinding applyTypeArgumentsOnConstructor(TypeBinding[] typeArguments) {
+		ReferenceBinding parameterizedType = this.environment.createParameterizedType(this.declaringClass, typeArguments,
+																						this.enclosingType);
+		for (MethodBinding parameterizedMethod : parameterizedType.methods()) {
+			if (parameterizedMethod.original() == this.staticFactoryFor)
+				return (ParameterizedMethodBinding) parameterizedMethod;
+		}
+		throw new IllegalArgumentException("Type doesn't have its own method?"); //$NON-NLS-1$
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java
index dbf32e1..b93b4d8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java
@@ -1,18 +1,16 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *		IBM Corporation - initial API and implementation
  *		Stephan Herrmann - Contribution for
  *								bug 400710 - [1.8][compiler] synthetic access to default method generates wrong code
+ *      Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          	Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -52,6 +50,7 @@
 	public final static int ArrayConstructor = 14; // X[]::new
 	public static final int ArrayClone = 15; // X[]::clone
     public static final int FactoryMethod = 16; // for indy call to private constructor.
+    public static final int DeserializeLambda = 17; // For supporting lambda deserialization.
     
 	public int sourceStart = 0; // start position of the matching declaration
 	public int index; // used for sorting access methods in the class file
@@ -107,7 +106,7 @@
 						if (method.parameters.length == paramCount) {
 							TypeBinding[] toMatch = method.parameters;
 							for (int i = 0; i < paramCount; i++) {
-								if (toMatch[i] != this.parameters[i]) {
+								if (TypeBinding.notEquals(toMatch[i], this.parameters[i])) {
 									continue nextMethod;
 								}
 							}
@@ -196,7 +195,7 @@
 						if (method.parameters.length == paramCount) {
 							TypeBinding[] toMatch = method.parameters;
 							for (int i = 0; i < paramCount; i++) {
-								if (toMatch[i] != this.parameters[i]) {
+								if (TypeBinding.notEquals(toMatch[i], this.parameters[i])) {
 									continue nextMethod;
 								}
 							}
@@ -284,6 +283,23 @@
 	}
 	
 	/**
+	 * Construct $deserializeLambda$ method
+	 */
+	public SyntheticMethodBinding(SourceTypeBinding declaringClass) {
+		this.declaringClass = declaringClass;
+		this.selector = TypeConstants.DESERIALIZE_LAMBDA;
+		this.modifiers = ClassFileConstants.AccPrivate | ClassFileConstants.AccStatic | ClassFileConstants.AccSynthetic;
+		this.tagBits |= (TagBits.AnnotationResolved | TagBits.DeprecatedAnnotationResolved);
+		this.thrownExceptions = Binding.NO_EXCEPTIONS;
+		this.returnType = declaringClass.scope.getJavaLangObject();
+	    this.parameters = new TypeBinding[]{declaringClass.scope.getJavaLangInvokeSerializedLambda()};
+	    this.purpose = SyntheticMethodBinding.DeserializeLambda;
+		SyntheticMethodBinding[] knownAccessMethods = declaringClass.syntheticMethods();
+		int methodId = knownAccessMethods == null ? 0 : knownAccessMethods.length;
+		this.index = methodId;
+	}
+	
+	/**
 	 * Construct enum special methods: values or valueOf methods
 	 */
 	public SyntheticMethodBinding(SourceTypeBinding declaringEnum, int startIndex, int endIndex) {
@@ -462,7 +478,10 @@
 	public void initializeMethodAccessor(MethodBinding accessedMethod, boolean isSuperAccess, ReferenceBinding receiverType) {
 
 		this.targetMethod = accessedMethod;
-		this.modifiers = ClassFileConstants.AccDefault | ClassFileConstants.AccStatic | ClassFileConstants.AccSynthetic;
+		if (isSuperAccess && receiverType.isInterface() && !accessedMethod.isStatic())
+			this.modifiers = ClassFileConstants.AccPrivate | ClassFileConstants.AccSynthetic;
+		else
+			this.modifiers = ClassFileConstants.AccDefault | ClassFileConstants.AccStatic | ClassFileConstants.AccSynthetic;
 		this.tagBits |= (TagBits.AnnotationResolved | TagBits.DeprecatedAnnotationResolved);
 		SourceTypeBinding declaringSourceType = (SourceTypeBinding) receiverType;
 		SyntheticMethodBinding[] knownAccessMethods = declaringSourceType.syntheticMethods();
@@ -473,7 +492,7 @@
 		this.returnType = accessedMethod.returnType;
 		this.purpose = isSuperAccess ? SyntheticMethodBinding.SuperMethodAccess : SyntheticMethodBinding.MethodAccess;
 
-		if (accessedMethod.isStatic()) {
+		if (accessedMethod.isStatic() || (isSuperAccess && receiverType.isInterface())) {
 			this.parameters = accessedMethod.parameters;
 		} else {
 			this.parameters = new TypeBinding[accessedMethod.parameters.length + 1];
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TagBits.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TagBits.java
index 0e2767d..c66024f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TagBits.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TagBits.java
@@ -1,20 +1,17 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
  *								bug 186342 - [compiler][null] Using annotations for null checking
  *								bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -63,7 +60,7 @@
 	long IsArgument = ASTNode.Bit11; // local
 	long ClearPrivateModifier = ASTNode.Bit10; // constructor binding
 	
-	// for java 7
+	// for java 7 - this bit is also set if the variable is explicitly or implicitly final
 	long IsEffectivelyFinal = ASTNode.Bit12; // local
 	long MultiCatchParameter = ASTNode.Bit13; // local
 	long IsResource = ASTNode.Bit14; // local
@@ -90,14 +87,16 @@
 	long PassedBoundCheck = ASTNode.Bit23;
 
 	// set for parameterized type NOT of the form X<?,?>
-	long IsBoundParameterizedType = ASTNode.Bit24;
+	long IsBoundParameterizedType = ASTNode.Bit24; // PTB only.
+	
+	long HasAnnotatedVariants = ASTNode.Bit24; // TVB, STB
 
 	// used by BinaryTypeBinding
 	long HasUnresolvedTypeVariables = ASTNode.Bit25;
 	long HasUnresolvedSuperclass = ASTNode.Bit26;
 	long HasUnresolvedSuperinterfaces = ASTNode.Bit27;
 	long HasUnresolvedEnclosingType = ASTNode.Bit28;
-	long HasUnresolvedMemberTypes = ASTNode.Bit29;
+	long HasUnresolvedMemberTypes = ASTNode.Bit29;  // Also in use at STB.
 
 	long HasTypeVariable = ASTNode.Bit30; // set either for type variables (direct) or parameterized types indirectly referencing type variables
 	long HasDirectWildcard = ASTNode.Bit31; // set for parameterized types directly referencing wildcards
@@ -151,6 +150,8 @@
 	long AnnotationNullUnspecifiedByDefault = ASTNode.Bit59L;
 	/** From Java 8 */
 	long AnnotationFunctionalInterface = ASTNode.Bit60L;
+	/** From Java 8 */
+	long AnnotationRepeatable = ASTNode.Bit61L; // Only for annotation types and since these cannot have constructors, we can overload HasNonPrivateConstructor.
 
 
 	long AllStandardAnnotationsMask =
@@ -166,11 +167,20 @@
 				| AnnotationNullable
 				| AnnotationNonNull
 				| AnnotationNonNullByDefault
-				| AnnotationNullUnspecifiedByDefault;
+				| AnnotationNullUnspecifiedByDefault
+				| AnnotationRepeatable;
+	
 	long AnnotationNullMASK = AnnotationNullable | AnnotationNonNull;
+	/** @since 3.10 marks a type that has a nullness annotation directly or on a detail (array dimension/type argument). */
+	long HasNullTypeAnnotation = ASTNode.Bit21;
 
+	long HasTypeAnnotations = ASTNode.Bit22;
+	
 	long DefaultValueResolved = ASTNode.Bit60L;
 
 	// set when type contains non-private constructor(s)
 	long HasNonPrivateConstructor = ASTNode.Bit61L;
+	
+	// set when type binding has a captured wildcard somewhere
+	long HasCapturedWildcard = ASTNode.Bit62L;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java
index 14582c1..284c6c5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -15,15 +11,29 @@
  *								bug 317046 - Exception during debugging when hover mouse over a field
  *								bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
  *								bug 392862 - [1.8][compiler][null] Evaluate null annotations on array types
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415291 - [1.8][null] differentiate type incompatibilities due to null annotations
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 423504 - [1.8] Implement "18.5.3 Functional Interface Parameterization Inference"
+ *								Bug 424712 - [1.8][compiler] NPE in TypeBinding.isProvablyDistinctTypeArgument
+ *								Bug 426792 - [1.8][inference][impl] generify new type inference engine
+ *								Bug 426764 - [1.8] Presence of conditional expression as method argument confuses compiler
+ *								Bug 423505 - [1.8] Implement "18.5.4 More Specific Method Inference"
+ *								Bug 427626 - [1.8] StackOverflow while typing new ArrayList<String>().toArray( and asking for code completion
+ *								Bug 428019 - [1.8][compiler] Type inference failure with nested generic invocation.
  *      Jesper S Moller <jesper@selskabet.org> -  Contributions for
  *								bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 import java.util.List;
+import java.util.Set;
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 /*
  * Not all fields defined by this type (& its subclasses) are initialized when it is created.
@@ -35,12 +45,21 @@
  *
  * null is NOT a valid value for a non-public field... it just means the field is not initialized.
  */
+@SuppressWarnings("rawtypes")
 abstract public class TypeBinding extends Binding {
 
 	public int id = TypeIds.NoId;
 	public long tagBits = 0; // See values in the interface TagBits below
 
-
+	protected AnnotationBinding [] typeAnnotations = Binding.NO_ANNOTATIONS;
+	
+	// jsr 308
+	public static final ReferenceBinding TYPE_USE_BINDING = new ReferenceBinding() { /* used for type annotation resolution. */
+		{ this.id = TypeIds.T_undefined; }
+		public int kind() { return Binding.TYPE_USE; }
+		public boolean hasTypeBit(int bit) { return false; }
+	};
+	
 	/** Base type definitions */
 	public final static BaseTypeBinding INT = new BaseTypeBinding(
 			TypeIds.T_int, TypeConstants.INT, new char[] { 'I' });
@@ -66,11 +85,19 @@
 	public final static BaseTypeBinding BOOLEAN = new BaseTypeBinding(
 			TypeIds.T_boolean, TypeConstants.BOOLEAN, new char[] { 'Z' });
 
-	public final static BaseTypeBinding NULL = new BaseTypeBinding(
-			TypeIds.T_null, TypeConstants.NULL, new char[] { 'N' }); //N stands for null even if it is never internally used
+	public final static NullTypeBinding NULL = new NullTypeBinding();
 
-	public final static BaseTypeBinding VOID = new BaseTypeBinding(
-			TypeIds.T_void, TypeConstants.VOID, new char[] { 'V' });
+	public final static VoidTypeBinding VOID = new VoidTypeBinding();
+
+
+public TypeBinding() {
+	super();
+}
+	
+public TypeBinding(TypeBinding prototype) {  // faithfully copy all instance state - clone operation should specialize/override suitably.
+	this.id = prototype.id;
+	this.tagBits = prototype.tagBits;
+}
 
 /**
  * Match a well-known type id to its binding
@@ -102,6 +129,46 @@
 	}
 }
 
+public ReferenceBinding actualType() {
+	return null; // overridden in ParameterizedTypeBinding & WildcardBinding
+}
+
+TypeBinding [] additionalBounds() {
+	return null;  // overridden in WildcardBinding
+}
+
+public String annotatedDebugName() {
+	TypeBinding enclosingType = enclosingType();
+	StringBuffer buffer = new StringBuffer(16);
+	if (enclosingType != null) {
+		buffer.append(enclosingType.annotatedDebugName());
+		buffer.append('.');
+	}
+	AnnotationBinding [] annotations = getTypeAnnotations();
+	for (int i = 0, length = annotations == null ? 0 : annotations.length; i < length; i++) {
+		buffer.append(annotations[i]);
+		buffer.append(' ');
+	}
+	buffer.append(sourceName());
+	return buffer.toString();
+}
+
+TypeBinding bound() {
+	return null; // overridden in WildcardBinding
+}
+
+int boundKind() {
+	return -1; // overridden in WildcardBinding
+}
+
+int rank() {
+	return -1; // overridden in WildcardBinding
+}
+
+public ReferenceBinding containerAnnotationType() {
+	return null;
+}
+
 /* Answer true if the receiver can be instantiated
  */
 public boolean canBeInstantiated() {
@@ -116,6 +183,13 @@
 }
 
 /**
+ * Perform capture "deconversion" on a given type
+ */
+public TypeBinding uncapture(Scope scope) {
+	return this;
+}
+
+/**
  * In case of problems, returns the closest match found. It may not be perfect match, but the
  * result of a best effort to improve fault-tolerance.
  */
@@ -144,6 +218,15 @@
 	// no substitute by default
 }
 
+/** Virtual copy constructor: a copy is made of the receiver's entire instance state and then suitably
+    parameterized by the arguments to the clone operation as seen fit by each type. Parameters may not
+    make sense for every type in the hierarchy, in which case they are silently ignored. A type may
+    choose to retain a copy of the prototype for reference. 
+*/
+public TypeBinding clone(TypeBinding enclosingType) {
+	throw new IllegalStateException("TypeBinding#clone() should have been overridden"); //$NON-NLS-1$
+}
+
 /**
  *  Answer the receiver's constant pool name.
  *  NOTE: This method should only be used during/after code gen.
@@ -152,7 +235,7 @@
 public abstract char[] constantPoolName();
 
 public String debugName() {
-	return new String(readableName());
+	return this.hasTypeAnnotations() ? annotatedDebugName() : new String(readableName());
 }
 
 /*
@@ -162,7 +245,11 @@
 	return 0;
 }
 
-/* Answer the receiver's enclosing type... null if the receiver is a top level type.
+public int depth() {
+	return 0;
+}
+
+/* Answer the receiver's enclosing type... null if the receiver is a top level type or is an array or a non reference type.
  */
 public ReferenceBinding enclosingType() {
 	return null;
@@ -213,7 +300,7 @@
 				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;
+						if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 					interfacesToVisit[nextPosition++] = next;
 				}
 			}
@@ -234,7 +321,7 @@
 			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;
+					if (TypeBinding.equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 				interfacesToVisit[nextPosition++] = next;
 			}
 		}
@@ -246,7 +333,7 @@
  * Find supertype which originates from a given type, or null if not found
  */
 public TypeBinding findSuperTypeOriginatingFrom(TypeBinding otherType) {
-	if (this == otherType) return this;
+	if (equalsEquals(this, otherType)) return this;
 	if (otherType == null) return null;
 	switch(kind()) {
 		case Binding.ARRAY_TYPE :
@@ -287,16 +374,16 @@
 		case Binding.INTERSECTION_TYPE:
 		    // do not allow type variables/intersection types to match with erasures for free
 			otherType = otherType.original();
-		    if (this == otherType)
+		    if (equalsEquals(this, otherType))
 		    	return this;
-		    if (original() == otherType)
+		    if (equalsEquals(original(), otherType))
 		    	return this;
 		    ReferenceBinding currentType = (ReferenceBinding)this;
 		    if (!otherType.isInterface()) {
 				while ((currentType = currentType.superclass()) != null) {
-					if (currentType == otherType)
+					if (equalsEquals(currentType, otherType))
 						return currentType;
-					if (currentType.original() == otherType)
+					if (equalsEquals(currentType.original(), otherType))
 						return currentType;
 				}
 				return null;
@@ -316,7 +403,7 @@
 						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;
+								if (equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 							interfacesToVisit[nextPosition++] = next;
 						}
 					}
@@ -325,9 +412,9 @@
 
 			for (int i = 0; i < nextPosition; i++) {
 				currentType = interfacesToVisit[i];
-				if (currentType == otherType)
+				if (equalsEquals(currentType, otherType))
 					return currentType;
-				if (currentType.original() == otherType)
+				if (equalsEquals(currentType.original(), otherType))
 					return currentType;
 				ReferenceBinding[] itsInterfaces = currentType.superInterfaces();
 				if (itsInterfaces != null && itsInterfaces != Binding.NO_SUPERINTERFACES) {
@@ -337,7 +424,7 @@
 					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;
+							if (equalsEquals(next, interfacesToVisit[b])) continue nextInterface;
 						interfacesToVisit[nextPosition++] = next;
 					}
 				}
@@ -350,7 +437,7 @@
  * Returns the type to use for generic cast, or null if none required
  */
 public TypeBinding genericCast(TypeBinding targetType) {
-	if (this == targetType) 
+	if (TypeBinding.equalsEquals(this, targetType)) 
 		return null;
 	TypeBinding targetErasure = targetType.erasure();
 	// type var get replaced by upper bound
@@ -419,10 +506,6 @@
 	// only applicable to source types
 }
 
-public boolean isAnnotationType() {
-	return false;
-}
-
 public final boolean isAnonymousType() {
 	return (this.tagBits & TagBits.IsAnonymousType) != 0;
 }
@@ -439,10 +522,16 @@
 	return (this.tagBits & TagBits.IsBaseType) != 0;
 }
 
+/* Answer true if the receiver is a base type other than void or null
+ */
+public final boolean isPrimitiveType() {
+	return (this.tagBits & TagBits.IsBaseType) != 0 && this.id != TypeIds.T_void && this.id != TypeIds.T_null;
+}
+
 /* Answer true if the receiver is a primitive type or a boxed primitive type
  */
 public final boolean isPrimitiveOrBoxedPrimitiveType() {
-	if ((this.tagBits & TagBits.IsBaseType) != 0)
+	if (isPrimitiveType())
 		return true;
 	switch (this.id) {
 		case TypeIds.T_JavaLangBoolean :
@@ -459,11 +548,29 @@
 	}
 }
 
+/* Answer true if the receiver is a boxed primitive type
+ */
+public boolean isBoxedPrimitiveType() {
+	switch (this.id) {
+		case TypeIds.T_JavaLangBoolean :
+		case TypeIds.T_JavaLangByte :
+		case TypeIds.T_JavaLangCharacter :
+		case TypeIds.T_JavaLangShort :
+		case TypeIds.T_JavaLangDouble :
+		case TypeIds.T_JavaLangFloat :
+		case TypeIds.T_JavaLangInteger :
+		case TypeIds.T_JavaLangLong :
+			return true;
+		default: 
+			return false;
+	}
+}
+
 /**
  *  Returns true if parameterized type AND not of the form List<?>
  */
 public boolean isBoundParameterizedType() {
-	return (this.tagBits & TagBits.IsBoundParameterizedType) != 0;
+	return false;
 }
 
 /**
@@ -494,7 +601,7 @@
  * or for generic types, true if compared to its raw type.
  */
 public boolean isEquivalentTo(TypeBinding otherType) {
-	if (this == otherType)
+	if (equalsEquals(this, otherType))
 		return true;
 	if (otherType == null)
 		return false;
@@ -520,7 +627,7 @@
 	return false;
 }
 
-public boolean isFunctionalInterface() {
+public boolean isFunctionalInterface(Scope scope) {
 	return false;
 }
 
@@ -563,8 +670,16 @@
  * Note that some instances of ParameterizedTypeBinding have no arguments, like for non-generic members 
  * of a parameterized type. Use {@link #isParameterizedTypeWithActualArguments()} instead to find out.
  */
-public final boolean isParameterizedType() {
-	return kind() == Binding.PARAMETERIZED_TYPE;
+public boolean isParameterizedType() {
+	return false;
+}
+
+/**
+ * Does this type or any of its details (array dimensions, type arguments)
+ * have a null type annotation?
+ */
+public boolean hasNullTypeAnnotations() {
+	return (this.tagBits & TagBits.HasNullTypeAnnotation) != 0;
 }
 
 public boolean isIntersectionCastType() {
@@ -593,7 +708,7 @@
 		return false;
 	TypeVariableBinding[] variables = erasure().typeVariables();
 	for (int i = 0, length = variables.length; i < length; i++) {
-		if (variables[i] != paramType.arguments[i])
+		if (TypeBinding.notEquals(variables[i], paramType.arguments[i]))
 			return false;
 	}
 	ReferenceBinding enclosing = paramType.enclosingType();
@@ -604,6 +719,26 @@
 	return true;
 }
 
+/**
+ * JLS8 Sect 18.1.1
+ * @param admitCapture18 request if {@link CaptureBinding18} shuld be considered as a proper type.
+ * If unsure say 'true', only in {@link Scope#greaterLowerBound(TypeBinding[], Scope, LookupEnvironment)}
+ * CaptureBinding18 has to be excluded to prevent an NPE on a branch that heuristically tries to avoid
+ * inconsistent intersections.
+ */
+public boolean isProperType(boolean admitCapture18) {
+	return true;
+}
+/**
+ * Substitute all occurrences of 'var' within the current type by 'substituteType.
+ * @param var an inference variable (JLS8 18.1.1)
+ * @param substituteType its substitution
+ * @return the current type after a substitution (either 'this' unmodified or a new type with the substitution molded in).
+ */
+TypeBinding substituteInferenceVariable(InferenceVariable var, TypeBinding substituteType) {
+	return this; // default: not substituting anything
+}
+
 private boolean isProvableDistinctSubType(TypeBinding otherType) {
 	if (otherType.isInterface()) {
 		if (isInterface())
@@ -646,7 +781,7 @@
         https://bugs.eclipse.org/bugs/show_bug.cgi?id=329588
 	 */ 
 
-	if (this == otherType)
+	if (equalsEquals(this, otherType))
 	    return false;
     if (otherType == null)
         return true;
@@ -658,7 +793,7 @@
 		    switch(otherType.kind()) {
 		    	case Binding.PARAMETERIZED_TYPE :
 		            ParameterizedTypeBinding otherParamType = (ParameterizedTypeBinding) otherType;
-		            if (paramType.genericType() != otherParamType.genericType())
+		            if (notEquals(paramType.genericType(), otherParamType.genericType()))
 		                return true;
 		            if (!paramType.isStatic()) { // static member types do not compare their enclosing
 		            	ReferenceBinding enclosing = enclosingType();
@@ -684,7 +819,7 @@
 		            return false;
 
 		    	case Binding.GENERIC_TYPE :
-		            if (paramType.genericType() != otherType)
+		            if (notEquals(paramType.genericType(), otherType))
 		                return true;
 		            if (!paramType.isStatic()) { // static member types do not compare their enclosing
 		            	ReferenceBinding enclosing = enclosingType();
@@ -692,7 +827,7 @@
 		            		ReferenceBinding otherEnclosing = otherType.enclosingType();
 		            		if (otherEnclosing == null) return true;
 		            		if ((otherEnclosing.tagBits & TagBits.HasDirectWildcard) == 0) {
-								if (enclosing != otherEnclosing) return true;
+								if (notEquals(enclosing, otherEnclosing)) return true;
 		            		} else {
 		            			if (!enclosing.isEquivalentTo(otherType.enclosingType())) return true;
 		            		}
@@ -710,9 +845,9 @@
 		            return false;
 
 		    	case Binding.RAW_TYPE :
-		            return erasure() != otherType.erasure();
+		            return notEquals(erasure(), otherType.erasure());
 		    	case Binding.TYPE:  // https://bugs.eclipse.org/bugs/show_bug.cgi?id=329588
-		    		return erasure() != otherType;
+		    		return notEquals(erasure(), otherType);
 		    }
 	        return true;
 
@@ -724,7 +859,7 @@
 		    	case Binding.PARAMETERIZED_TYPE :
 		    	case Binding.RAW_TYPE :
 		    	case Binding.TYPE:  // https://bugs.eclipse.org/bugs/show_bug.cgi?id=329588
-		            return erasure() != otherType.erasure();
+		            return notEquals(erasure(), otherType.erasure());
 		    }
 	        return true;
 
@@ -732,7 +867,7 @@
 		    switch(otherType.kind()) {
 		    	case Binding.PARAMETERIZED_TYPE :
 		    	case Binding.RAW_TYPE :
-		            return this != otherType.erasure();
+		            return notEquals(this, otherType.erasure());
 		    }
 		    break;
 
@@ -749,7 +884,7 @@
  * List<? extends String> & List<? extends Runnable> --> false
  */
 private boolean isProvablyDistinctTypeArgument(TypeBinding otherArgument, final ParameterizedTypeBinding paramType, final int rank) {
-	if (this == otherArgument)
+	if (TypeBinding.equalsEquals(this, otherArgument))
 		return false;
 
 	TypeBinding upperBound1 = null;
@@ -774,16 +909,22 @@
 		case Binding.TYPE_PARAMETER :
 			final TypeVariableBinding variable = (TypeVariableBinding) this;
 			if (variable.isCapture()) {
-				CaptureBinding capture = (CaptureBinding) variable;
-				switch (capture.wildcard.boundKind) {
-					case Wildcard.EXTENDS:
-						upperBound1 = capture.wildcard.bound;
-						break;
-					case Wildcard.SUPER:
-						lowerBound1 = capture.wildcard.bound;
-						break;
-					case Wildcard.UNBOUND:
-						return false;
+				if (variable instanceof CaptureBinding18) {
+					CaptureBinding18 cb18 = (CaptureBinding18)variable;
+					upperBound1 = cb18.firstBound;
+					lowerBound1 = cb18.lowerBound;
+				} else {
+					CaptureBinding capture = (CaptureBinding) variable;
+					switch (capture.wildcard.boundKind) {
+						case Wildcard.EXTENDS:
+							upperBound1 = capture.wildcard.bound;
+							break;
+						case Wildcard.SUPER:
+							lowerBound1 = capture.wildcard.bound;
+							break;
+						case Wildcard.UNBOUND:
+							return false;
+					}
 				}
 				break;
 			}
@@ -829,16 +970,22 @@
 		case Binding.TYPE_PARAMETER :
 			TypeVariableBinding otherVariable = (TypeVariableBinding) otherArgument;
 			if (otherVariable.isCapture()) {
-				CaptureBinding otherCapture = (CaptureBinding) otherVariable;
-				switch (otherCapture.wildcard.boundKind) {
-					case Wildcard.EXTENDS:
-						upperBound2 = otherCapture.wildcard.bound;
-						break;
-					case Wildcard.SUPER:
-						lowerBound2 = otherCapture.wildcard.bound;
-						break;
-					case Wildcard.UNBOUND:
-						return false;
+				if (otherVariable instanceof CaptureBinding18) {
+					CaptureBinding18 cb18 = (CaptureBinding18)otherVariable;
+					upperBound2 = cb18.firstBound;
+					lowerBound2 = cb18.lowerBound;
+				} else {
+					CaptureBinding otherCapture = (CaptureBinding) otherVariable;
+					switch (otherCapture.wildcard.boundKind) {
+						case Wildcard.EXTENDS:
+							upperBound2 = otherCapture.wildcard.bound;
+							break;
+						case Wildcard.SUPER:
+							lowerBound2 = otherCapture.wildcard.bound;
+							break;
+						case Wildcard.UNBOUND:
+							return false;
+					}
 				}
 				break;
 			}
@@ -900,6 +1047,13 @@
 	}
 }
 
+/**
+ * Answer true if the receiver is an annotation which may be repeatable. Overridden as appropriate.
+ */
+public boolean isRepeatableAnnotationType() {
+	return false;
+}
+
 public final boolean isRawType() {
 	return kind() == Binding.RAW_TYPE;
 }
@@ -941,6 +1095,13 @@
 }
 
 /**
+ * Answer true if the receiver is a static member type (or toplevel)
+ */
+public boolean isStatic() {
+	return false;
+}
+
+/**
  * Returns true if a given type may be thrown
  */
 public boolean isThrowable() {
@@ -948,7 +1109,7 @@
 }
 // JLS3: 4.5.1.1
 public boolean isTypeArgumentContainedBy(TypeBinding otherType) {
-	if (this == otherType)
+	if (TypeBinding.equalsEquals(this, otherType))
 		return true;
 	switch (otherType.kind()) {
 		// handle captured wildcards.
@@ -958,27 +1119,45 @@
 				return false;
 			}
 			CaptureBinding capture = (CaptureBinding) otherType;
-			WildcardBinding wildcard = capture.wildcard;
-			TypeBinding upperBound = null;
-			TypeBinding [] otherBounds = null;
-			switch (wildcard.boundKind) {
-				case Wildcard.SUPER:
-					return false; // T super syntax isn't allowed, impossible capture.
-				case Wildcard.UNBOUND:
-					TypeVariableBinding variable = wildcard.genericType.typeVariables()[wildcard.rank];
-					upperBound = variable.upperBound();
-					otherBounds = variable.boundsCount() > 1 ? variable.otherUpperBounds() : null;
-					break;
-				case Wildcard.EXTENDS:
-					upperBound = wildcard.bound;
-					otherBounds = wildcard.otherBounds;
-					break;
+			if (capture instanceof CaptureBinding18) {
+				// by analogy to CaptureBinding but accepting the fact that .wildcard is null:
+				CaptureBinding18 cb18 = (CaptureBinding18) capture;
+				if (cb18.firstBound != null) {
+					if (cb18.lowerBound != null)
+						return false; // type containment is not defined for variables with both upper and lower bound
+					TypeBinding[] otherBounds = null; 
+					int len = cb18.upperBounds.length; // by construction non-null if firstBound is set
+					if (len > 1)
+						System.arraycopy(cb18.upperBounds, 1, otherBounds = new TypeBinding[len-1], 0, len-1);
+					otherType = capture.environment.createWildcard(null, 0, cb18.firstBound, otherBounds, Wildcard.EXTENDS);
+				} else if (cb18.lowerBound != null) {
+					otherType = capture.environment.createWildcard(null, 0, cb18.lowerBound, null, Wildcard.SUPER);
+				} else {
+					return false; // not wellformed
+				}
+			} else {
+				TypeBinding upperBound = null;
+				TypeBinding [] otherBounds = null;
+				WildcardBinding wildcard = capture.wildcard;
+				switch (wildcard.boundKind) {
+					case Wildcard.SUPER:
+						return false; // T super syntax isn't allowed, impossible capture.
+					case Wildcard.UNBOUND:
+						TypeVariableBinding variable = wildcard.genericType.typeVariables()[wildcard.rank];
+						upperBound = variable.upperBound();
+						otherBounds = variable.boundsCount() > 1 ? variable.otherUpperBounds() : null;
+						break;
+					case Wildcard.EXTENDS:
+						upperBound = wildcard.bound;
+						otherBounds = wildcard.otherBounds;
+						break;
+				}
+				// Given class A<T extends B<?>>, A<?> cannot be the universe of all parameterizations of A
+				if (upperBound.id == TypeIds.T_JavaLangObject && otherBounds == null) {
+					return false; // but given class A<T>, A<?> stays an unbounded wildcard, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=348956
+				}
+				otherType = capture.environment.createWildcard(null, 0, upperBound, otherBounds, Wildcard.EXTENDS);
 			}
-			// Given class A<T extends B<?>>, A<?> cannot be the universe of all parameterizations of A
-			if (upperBound.id == TypeIds.T_JavaLangObject && otherBounds == null) {
-				return false; // but given class A<T>, A<?> stays an unbounded wildcard, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=348956
-			}
-			otherType = capture.environment.createWildcard(null, 0, upperBound, otherBounds, Wildcard.EXTENDS);
 			return isTypeArgumentContainedBy(otherType);
 		}
 		// allow wildcard containment
@@ -1020,25 +1199,25 @@
 			TypeBinding otherBound = otherWildcard.bound;
 			switch (otherWildcard.boundKind) {
 				case Wildcard.EXTENDS:
-					if (otherBound == this)
+					if (TypeBinding.equalsEquals(otherBound, this))
 						return true; // ? extends T  <=  ? extends ? extends T
 					if (upperBound == null)
 						return false;
 					TypeBinding match = upperBound.findSuperTypeOriginatingFrom(otherBound);
 					if (match != null && (match = match.leafComponentType()).isRawType()) {
-						return match == otherBound.leafComponentType(); // forbide: Collection <=  ? extends Collection<?>
+						return TypeBinding.equalsEquals(match, otherBound.leafComponentType()); // forbide: Collection <=  ? extends Collection<?>
 																												// forbide: Collection[] <=  ? extends Collection<?>[]
 					}
 					return upperBound.isCompatibleWith(otherBound);
 
 				case Wildcard.SUPER:
-					if (otherBound == this)
+					if (TypeBinding.equalsEquals(otherBound, this))
 						return true; // ? super T  <=  ? super ? super T
 					if (lowerBound == null)
 						return false;
 					match = otherBound.findSuperTypeOriginatingFrom(lowerBound);
 					if (match != null && (match = match.leafComponentType()).isRawType()) {
-						return match == lowerBound.leafComponentType(); // forbide: Collection <=  ? super Collection<?>
+						return TypeBinding.equalsEquals(match, lowerBound.leafComponentType()); // forbide: Collection <=  ? super Collection<?>
 																												// forbide: Collection[] <=  ? super Collection<?>[]
 					}
 					return otherBound.isCompatibleWith(lowerBound);
@@ -1053,7 +1232,7 @@
 				return false;
 			ParameterizedTypeBinding paramType = (ParameterizedTypeBinding) this;
 			ParameterizedTypeBinding otherParamType = (ParameterizedTypeBinding) otherType;
-			if (paramType.actualType() != otherParamType.actualType())
+			if (TypeBinding.notEquals(paramType.actualType(), otherParamType.actualType()))
 				return false;
 			if (!paramType.isStatic()) { // static member types do not compare their enclosing
 				ReferenceBinding enclosing = enclosingType();
@@ -1062,7 +1241,7 @@
 					if (otherEnclosing == null)
 						return false;
 					if ((otherEnclosing.tagBits & TagBits.HasDirectWildcard) == 0) {
-						if (enclosing != otherEnclosing)
+						if (TypeBinding.notEquals(enclosing, otherEnclosing))
 							return false;
 					} else {
 						if (!enclosing.isEquivalentTo(otherParamType.enclosingType()))
@@ -1078,7 +1257,7 @@
 			nextArgument: for (int i = 0; i < length; i++) {
 				TypeBinding argument = paramType.arguments[i];
 				TypeBinding otherArgument = otherArguments[i];
-				if (argument == otherArgument)
+				if (TypeBinding.equalsEquals(argument, otherArgument))
 					continue nextArgument;
 				int kind = argument.kind();
 				if (otherArgument.kind() != kind)
@@ -1096,7 +1275,7 @@
 						case Wildcard.EXTENDS:
 							// match "? extends <upperBound>" with "?"
 							if (otherWildcard.boundKind == Wildcard.UNBOUND
-									&& wildcard.bound == wildcard.typeVariable().upperBound())
+									&& TypeBinding.equalsEquals(wildcard.bound, wildcard.typeVariable().upperBound()))
 								continue nextArgument;
 							break;
 						case Wildcard.SUPER:
@@ -1104,7 +1283,7 @@
 						case Wildcard.UNBOUND:
 							// match "?" with "? extends <upperBound>"
 							if (otherWildcard.boundKind == Wildcard.EXTENDS
-									&& otherWildcard.bound == otherWildcard.typeVariable().upperBound())
+									&& TypeBinding.equalsEquals(otherWildcard.bound, otherWildcard.typeVariable().upperBound()))
 								continue nextArgument;
 							break;
 						}
@@ -1172,7 +1351,7 @@
  */
 public boolean needsUncheckedConversion(TypeBinding targetType) {
 
-	if (this == targetType)
+	if (TypeBinding.equalsEquals(this, targetType))
 		return false;
 	targetType = targetType.leafComponentType();
 	if (!(targetType instanceof ReferenceBinding))
@@ -1197,7 +1376,7 @@
 }
 
 /** Answer a readable name (for error reporting) that includes nullness type annotations. */
-public char[] nullAnnotatedReadableName(LookupEnvironment env, boolean shortNames) /* e.g.: java.lang.Object @o.e.j.a.NonNull[] */ {
+public char[] nullAnnotatedReadableName(CompilerOptions options, boolean shortNames) /* e.g.: java.lang.Object @o.e.j.a.NonNull[] */ {
 	if (shortNames)
 		return shortReadableName();
 	else
@@ -1213,12 +1392,23 @@
 		case Binding.PARAMETERIZED_TYPE :
 		case Binding.RAW_TYPE :
 		case Binding.ARRAY_TYPE :
-			return erasure();
+			return erasure().unannotated();
 		default :
-			return this;
+			return this.unannotated();
 	}
 }
 
+/** 
+ * Return this type minus its type annotations
+ */
+public TypeBinding unannotated() {
+	return this;
+}
+
+public final boolean hasTypeAnnotations() {
+	return (this.tagBits & TagBits.HasTypeAnnotations) != 0;
+}
+
 /**
  * Answer the qualified name of the receiver's package separated by periods
  * or an empty string if its the default package.
@@ -1242,6 +1432,36 @@
 public abstract char[] qualifiedSourceName();
 
 /**
+ * @return the JSR 308 annotations for this type.
+ */
+final public AnnotationBinding[] getTypeAnnotations() {
+	return this.typeAnnotations;
+}
+
+public void setTypeAnnotations(AnnotationBinding[] annotations, boolean evalNullAnnotations) {
+	this.tagBits |= TagBits.HasTypeAnnotations;
+	if (annotations == null || annotations.length == 0)
+		return;
+	this.typeAnnotations = annotations;
+	if (evalNullAnnotations) {
+		for (int i = 0, length = annotations.length; i < length; i++) {
+			AnnotationBinding annotation = annotations[i];
+			if (annotation != null) {
+				switch (annotation.type.id) {
+					case TypeIds.T_ConfiguredAnnotationNullable :
+						this.tagBits |= TagBits.AnnotationNullable | TagBits.HasNullTypeAnnotation;
+						break;
+					case TypeIds.T_ConfiguredAnnotationNonNull :
+						this.tagBits |= TagBits.AnnotationNonNull  | TagBits.HasNullTypeAnnotation;
+						break;
+				}
+			}
+		}
+		// we do accept contradictory tagBits here, to support detecting contradictions caused by type substitution
+	}
+}
+
+/**
  * Answer the receiver classfile signature.
  * Arrays & base types do not distinguish between signature() & constantPoolName().
  * NOTE: This method should only be used during/after code gen.
@@ -1257,6 +1477,10 @@
 	// subclasses must override if they wrap another type binding
 }
 
+TypeBinding [] typeArguments () {
+	return null;
+}
+
 public TypeVariableBinding[] typeVariables() {
 	return Binding.NO_TYPE_VARIABLES;
 }
@@ -1264,10 +1488,11 @@
 /**
  * Return the single abstract method of a functional interface, or null, if the receiver is not a functional interface as defined in JLS 9.8.
  * @param scope scope
+ * @param replaceWildcards Should wildcards be replaced following JLS 9.8? Say false for lambdas with explicit argument types which should apply 18.5.3
  *  
  * @return The single abstract method of a functional interface, or null, if the receiver is not a functional interface. 
  */
-public MethodBinding getSingleAbstractMethod(Scope scope) {
+public MethodBinding getSingleAbstractMethod(Scope scope, boolean replaceWildcards) {
 	return null;
 }
 
@@ -1275,4 +1500,80 @@
 	return null;
 }
 
+public static boolean equalsEquals(TypeBinding that, TypeBinding other) {
+	if (that == other) //$IDENTITY-COMPARISON$
+		return true;
+	if (that == null || other == null)
+		return false;
+	if (that.id != TypeIds.NoId && that.id == other.id)
+		return true;
+	return false;
+}
+
+public static boolean notEquals(TypeBinding that, TypeBinding other) {
+	if (that == other) //$IDENTITY-COMPARISON$
+		return false;
+	if (that == null || other == null)
+		return true;
+	if (that.id != TypeIds.NoId && that.id == other.id)
+		return false;
+	return true;
+}
+/** Return the primordial type from which the receiver was cloned. Not all types track a prototype, only {@link SourceTypeBinding},
+ * {@link BinaryTypeBinding} and {@link UnresolvedReferenceBinding} do so as of now. In fact some types e.g {@link ParameterizedTypeBinding}
+ * should not do so. Deflecting a query to a prototype would lead to wrong results in the case of {@link ParameterizedTypeBinding}
+ */
+public TypeBinding prototype() {
+	return null;
+}
+
+public boolean isUnresolvedType() {
+	return false;
+}
+
+/** Does this type mention any of the given type parameters, except the one at position 'idx'? */
+public boolean mentionsAny(TypeBinding[] parameters, int idx) {
+	for (int i = 0; i < parameters.length; i++)
+		if (i != idx)
+			if (TypeBinding.equalsEquals(parameters[i], this))
+				return true;
+	return false;
+}
+
+/** Collect all inference variables mentioned in this type into the set 'variables'. */
+void collectInferenceVariables(Set<InferenceVariable> variables) {
+	// nop
+}
+/** Answer an additional bit characterizing this type, like {@link TypeIds#BitAutoCloseable}. */
+public boolean hasTypeBit(int bit) {
+	return false;
+}
+
+public boolean sIsMoreSpecific(TypeBinding s, TypeBinding t, Scope scope) {
+	return s.isCompatibleWith(t, scope) && !s.needsUncheckedConversion(t);
+}
+
+public boolean isSubtypeOf(TypeBinding right) {
+	return isCompatibleWith(right);
+}
+
+public MethodBinding[] getMethods(char[] selector) {
+	return Binding.NO_METHODS;
+}
+
+public boolean canBeSeenBy(Scope scope) {
+	return true;
+}
+
+public ReferenceBinding superclass() {
+	return null;
+}
+
+public ReferenceBinding[] superInterfaces() {
+	return Binding.NO_SUPERINTERFACES;
+}
+
+public SyntheticArgumentBinding[] syntheticOuterLocalVariables() {
+	return null;		// is null if no enclosing instances are required
+}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBindingVisitor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBindingVisitor.java
index 0b0be1d..1e6b202 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBindingVisitor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBindingVisitor.java
@@ -5,17 +5,12 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
-import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation.TypeUseBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
 
 
@@ -51,10 +46,6 @@
 		return true;  // continue traversal.
 	}
 	
-	public boolean visit(TypeUseBinding typeUseBinding) {
-		return true;  // continue traversal.
-	}
-	
 	public boolean visit(RawTypeBinding rawTypeBinding) {
 		return true;  // continue traversal.
 	}
@@ -139,10 +130,6 @@
 					visit(visitor, intersectionCastTypeBinding.intersectingTypes);
 				break;
 				
-			case Binding.TYPE_USE:
-				visitor.visit((TypeUseBinding) type);
-				break;
-				
 			default:
 				throw new InternalError("Unexpected binding type"); //$NON-NLS-1$
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBound.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBound.java
new file mode 100644
index 0000000..9069b07
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeBound.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 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
+ *     IBM Corporation - bug fixes
+ *******************************************************************************/
+package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+
+/**
+ * Implementation of 18.1.3 in JLS8
+ */
+public class TypeBound extends ReductionResult {
+	
+	InferenceVariable left;
+	
+	// this flag contributes to the workaround controlled by InferenceContext18.ARGUMENT_CONSTRAINTS_ARE_SOFT:
+	boolean isSoft;
+
+	// here we accumulate null tagBits from any types that have been related to this type bound during incorporation:
+	long nullHints;
+	
+	static TypeBound createBoundOrDependency(InferenceContext18 context, TypeBinding type, InferenceVariable variable) {
+        // Part of JLS8 sect 18.1.3:
+		return new TypeBound(variable, context.substitute(type), SUBTYPE, true);
+	}
+
+	/** Create a true type bound or a dependency. */
+	TypeBound(InferenceVariable inferenceVariable, TypeBinding typeBinding, int relation) {
+		this.left = inferenceVariable;
+		this.right = safeType(typeBinding);
+		this.relation = relation;
+	}
+	
+	TypeBound(InferenceVariable inferenceVariable, TypeBinding typeBinding, int relation, boolean isSoft) {
+		this.left = inferenceVariable;
+		this.right = safeType(typeBinding);
+		this.relation = relation;
+		this.isSoft = isSoft;
+	}
+	
+	private TypeBinding safeType(TypeBinding type) {
+		if (type != null && type.isLocalType()) {
+			MethodBinding enclosingMethod = ((LocalTypeBinding) type).enclosingMethod;
+			if (enclosingMethod != null && CharOperation.prefixEquals(TypeConstants.ANONYMOUS_METHOD, enclosingMethod.selector))
+				return type.superclass(); // don't use local class inside lambda: lambda is copied, type will be re-created and thus is unmatchable
+		}
+		return type;
+	}
+
+
+	/** distinguish bounds from dependencies. */
+	boolean isBound() {
+		return this.right.isProperType(true);
+	}
+	public int hashCode() {
+		return this.left.hashCode() + this.right.hashCode() + this.relation;
+	}
+	public boolean equals(Object obj) {
+		if (obj instanceof TypeBound) {
+			TypeBound other = (TypeBound) obj;
+			return this.left == other.left && TypeBinding.equalsEquals(this.right, other.right) && this.relation == other.relation; //$IDENTITY-COMPARISON$ InferenceVariable
+		}
+		return false;
+	}
+	
+	// debugging:
+	public String toString() {
+		boolean isBound = this.right.isProperType(true);
+		StringBuffer buf = new StringBuffer();
+		buf.append(isBound ? "TypeBound  " : "Dependency "); //$NON-NLS-1$ //$NON-NLS-2$
+		buf.append(this.left.sourceName);
+		buf.append(relationToString(this.relation));
+		buf.append(this.right.readableName());
+		return buf.toString();
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java
index 4a50cf0..900753d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -17,9 +13,14 @@
  *								bug 381445 - [compiler][resource] Can the resource leak check be made aware of Closeables.closeQuietly?
  *								bug 400421 - [compiler] Null analysis for fields does not take @com.google.inject.Inject into account
  *								bug 382069 - [null] Make the null analysis consider JUnit's assertNotNull similarly to assertions
- *
+ *								Bug 405569 - Resource leak check false positive when using DbUtils.closeQuietly
+ *								Bug 427199 - [1.8][resource] avoid resource leak warnings on Streams that have no resource
+ *								Bug 425183 - [1.8][inference] make CaptureBinding18 safe
  *    Jesper S Moller - Contributions for
- *							Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335
+ *								Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335
+ *								Bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
+ *    Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                              Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -64,6 +65,7 @@
     char[] WILDCARD_CAPTURE_NAME_PREFIX = "capture#".toCharArray(); //$NON-NLS-1$
     char[] WILDCARD_CAPTURE_NAME_SUFFIX = "-of ".toCharArray(); //$NON-NLS-1$
 	char[] WILDCARD_CAPTURE = { '!' };
+	char[] CAPTURE18 = { '^' };
 	char[] BYTE = "byte".toCharArray(); //$NON-NLS-1$
 	char[] SHORT = "short".toCharArray(); //$NON-NLS-1$
 	char[] INT = "int".toCharArray(); //$NON-NLS-1$
@@ -91,6 +93,8 @@
     char[] UPPER_ANNOTATION_TYPE = "ANNOTATION_TYPE".toCharArray(); //$NON-NLS-1$
     char[] UPPER_PACKAGE = "PACKAGE".toCharArray(); //$NON-NLS-1$
     char[] ANONYMOUS_METHOD = "lambda$".toCharArray(); //$NON-NLS-1$
+    char[] DESERIALIZE_LAMBDA = "$deserializeLambda$".toCharArray(); //$NON-NLS-1$
+    char[] LAMBDA_TYPE = "<lambda>".toCharArray(); //$NON-NLS-1$
     
 	// jsr308
 	char[] TYPE_USE_TARGET  = "TYPE_USE".toCharArray(); //$NON-NLS-1$
@@ -106,7 +110,14 @@
     char[] LANG3 = "lang3".toCharArray(); //$NON-NLS-1$
     char[] COM = "com".toCharArray(); //$NON-NLS-1$
     char[] GOOGLE = "google".toCharArray(); //$NON-NLS-1$
-
+    char[] JDT = "jdt".toCharArray(); //$NON-NLS-1$
+    char[] INTERNAL = "internal".toCharArray(); //$NON-NLS-1$
+    char[] COMPILER = "compiler".toCharArray(); //$NON-NLS-1$
+    char[] LOOKUP = "lookup".toCharArray(); //$NON-NLS-1$
+    char[] TYPEBINDING = "TypeBinding".toCharArray(); //$NON-NLS-1$
+    char[] DOM = "dom".toCharArray(); //$NON-NLS-1$
+    char[] ITYPEBINDING = "ITypeBinding".toCharArray(); //$NON-NLS-1$
+    
 	// Constant compound names
 	char[][] JAVA_LANG = {JAVA, LANG};
 	char[][] JAVA_IO = {JAVA, IO};
@@ -146,6 +157,7 @@
 	char[][] JAVA_LANG_DEPRECATED = {JAVA, LANG, "Deprecated".toCharArray()}; //$NON-NLS-1$
 	char[][] JAVA_LANG_ANNOTATION_DOCUMENTED = {JAVA, LANG, ANNOTATION, "Documented".toCharArray()}; //$NON-NLS-1$
 	char[][] JAVA_LANG_ANNOTATION_INHERITED = {JAVA, LANG, ANNOTATION, "Inherited".toCharArray()}; //$NON-NLS-1$
+	char[][] JAVA_LANG_ANNOTATION_REPEATABLE = {JAVA, LANG, ANNOTATION, "Repeatable".toCharArray()}; //$NON-NLS-1$
 	char[][] JAVA_LANG_OVERRIDE = {JAVA, LANG, "Override".toCharArray()}; //$NON-NLS-1$
 	char[][] JAVA_LANG_FUNCTIONAL_INTERFACE = {JAVA, LANG, "FunctionalInterface".toCharArray()}; //$NON-NLS-1$
 	char[][] JAVA_LANG_ANNOTATION_RETENTION = {JAVA, LANG, ANNOTATION, "Retention".toCharArray()}; //$NON-NLS-1$
@@ -161,6 +173,7 @@
 	char[][] JAVA_IO_IOEXCEPTION = new char[][] { JAVA, IO, "IOException".toCharArray()};//$NON-NLS-1$
 	char[][] JAVA_IO_OBJECTOUTPUTSTREAM = new char[][] { JAVA, IO, "ObjectOutputStream".toCharArray()}; //$NON-NLS-1$
 	char[][] JAVA_IO_OBJECTINPUTSTREAM = new char[][] { JAVA, IO, "ObjectInputStream".toCharArray()}; //$NON-NLS-1$
+	char[][] JAVA_NIO_FILE_FILES = new char[][] { JAVA, "nio".toCharArray(), "file".toCharArray(), "Files".toCharArray() };   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
 	// javax.rmi.CORBA.Stub
 	char[][] JAVAX_RMI_CORBA_STUB = new char[][] {
 			JAVAX,
@@ -184,6 +197,7 @@
 			"MethodHandle$PolymorphicSignature".toCharArray() //$NON-NLS-1$
 	};
 	char[][] JAVA_LANG_INVOKE_LAMBDAMETAFACTORY = {JAVA, LANG, INVOKE, "LambdaMetafactory".toCharArray()}; //$NON-NLS-1$
+	char[][] JAVA_LANG_INVOKE_SERIALIZEDLAMBDA = {JAVA, LANG, INVOKE, "SerializedLambda".toCharArray()}; //$NON-NLS-1$
 	char[][] JAVA_LANG_INVOKE_METHODHANDLES = {JAVA, LANG, INVOKE, "MethodHandles".toCharArray()}; //$NON-NLS-1$
 	char[][] JAVA_LANG_AUTOCLOSEABLE =  {JAVA, LANG, "AutoCloseable".toCharArray()}; //$NON-NLS-1$
 	char[] CLOSE = "close".toCharArray(); //$NON-NLS-1$
@@ -191,18 +205,27 @@
 	public static class CloseMethodRecord {
 		public char[][] typeName;
 		public char[] selector;
-		public CloseMethodRecord(char[][] typeName, char[] selector) {
+		public int numCloseableArgs;
+		public CloseMethodRecord(char[][] typeName, char[] selector, int num) {
 			this.typeName = typeName;
 			this.selector = selector;
+			this.numCloseableArgs = num;
 		}
 	}
 	char[][] GUAVA_CLOSEABLES = { COM, GOOGLE, "common".toCharArray(), IO, "Closeables".toCharArray() }; //$NON-NLS-1$ //$NON-NLS-2$
 	char[][] APACHE_IOUTILS = { ORG, APACHE, COMMONS, IO, "IOUtils".toCharArray() }; //$NON-NLS-1$
+	char[][] APACHE_DBUTILS = { ORG, APACHE, COMMONS, "dbutils".toCharArray(), "DbUtils".toCharArray() }; //$NON-NLS-1$ //$NON-NLS-2$
 	char[] CLOSE_QUIETLY = "closeQuietly".toCharArray(); //$NON-NLS-1$
 	CloseMethodRecord[] closeMethods = new CloseMethodRecord[] {
-		new CloseMethodRecord(GUAVA_CLOSEABLES, CLOSE_QUIETLY),
-		new CloseMethodRecord(GUAVA_CLOSEABLES, CLOSE),
-		new CloseMethodRecord(APACHE_IOUTILS, CLOSE_QUIETLY)
+		new CloseMethodRecord(GUAVA_CLOSEABLES, CLOSE_QUIETLY, 1),
+		new CloseMethodRecord(GUAVA_CLOSEABLES, CLOSE, 1),
+		new CloseMethodRecord(APACHE_IOUTILS, CLOSE_QUIETLY, 1),
+		new CloseMethodRecord(APACHE_DBUTILS, CLOSE, 1),
+		new CloseMethodRecord(APACHE_DBUTILS, CLOSE_QUIETLY, 3), // closeQuietly(Connection,Statement,ResultSet) 
+		new CloseMethodRecord(APACHE_DBUTILS, "commitAndClose".toCharArray(), 1), //$NON-NLS-1$
+		new CloseMethodRecord(APACHE_DBUTILS, "commitAndCloseQuietly".toCharArray(), 1), //$NON-NLS-1$
+		new CloseMethodRecord(APACHE_DBUTILS, "rollbackAndClose".toCharArray(), 1), //$NON-NLS-1$
+		new CloseMethodRecord(APACHE_DBUTILS, "rollbackAndCloseQuietly".toCharArray(), 1), //$NON-NLS-1$
 	};
 	// white lists of closeables:
 	char[][] JAVA_IO_WRAPPER_CLOSEABLES = new char[][] {
@@ -257,6 +280,9 @@
 		"CharArrayWriter".toCharArray(), //$NON-NLS-1$
 		"StringBufferInputStream".toCharArray(), //$NON-NLS-1$
 	};
+	char[][] RESOURCE_FREE_CLOSEABLE_STREAM = new char[][] {
+		JAVA, UTIL, "stream".toCharArray(), "Stream".toCharArray() //$NON-NLS-1$ //$NON-NLS-2$
+	};
 	
 	// different assertion utilities:
 	char[] ASSERT_CLASS = "Assert".toCharArray(); //$NON-NLS-1$
@@ -277,6 +303,9 @@
 	char[] VALIDATE_CLASS = "Validate".toCharArray(); //$NON-NLS-1$
 	char[][] ORG_APACHE_COMMONS_LANG_VALIDATE = new char[][] { ORG, APACHE, COMMONS, LANG, VALIDATE_CLASS };
 	char[][] ORG_APACHE_COMMONS_LANG3_VALIDATE = new char[][] { ORG, APACHE, COMMONS, LANG3, VALIDATE_CLASS };
+	char[][] ORG_ECLIPSE_JDT_INTERNAL_COMPILER_LOOKUP_TYPEBINDING = new char[][] { ORG, ECLIPSE, JDT, INTERNAL, COMPILER, LOOKUP, TYPEBINDING };
+	char[][] ORG_ECLIPSE_JDT_CORE_DOM_ITYPEBINDING = new char[][] { ORG, ECLIPSE, JDT, CORE, DOM, ITYPEBINDING };
+
 	// ... methods:
 	char[] IS_TRUE = "isTrue".toCharArray(); //$NON-NLS-1$
 	char[] NOT_NULL = "notNull".toCharArray(); //$NON-NLS-1$
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeIds.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeIds.java
index 9e50fae..8602c55 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeIds.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeIds.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contributions for
@@ -18,6 +14,8 @@
  *								bug 358903 - Filter practically unimportant resource leak warnings
  *								bug 400421 - [compiler] Null analysis for fields does not take @com.google.inject.Inject into account
  *								bug 382069 - [null] Make the null analysis consider JUnit's assertNotNull similarly to assertions
+ *      Jesper S Moller <jesper@selskabet.org> -  Contributions for
+ *								Bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -124,13 +122,16 @@
 	final int T_JavaUtilObjects = 74;
 
 	// java 8
-	final int T_JavaLangFunctionalInterface = 69;
+	final int T_JavaLangFunctionalInterface = 77;
 
 	// new in 3.9 to identify known @Inject annotations
 	final int T_JavaxInjectInject = 80;
 	final int T_ComGoogleInjectInject = 81;
-
-
+	// Java 8 - JEP 120
+	final int T_JavaLangAnnotationRepeatable = 90;
+	// If you add new type id, make sure to bump up T_LastWellKnownTypeId if there is a cross over.
+	final int T_LastWellKnownTypeId = 128;
+	
 	final int NoId = Integer.MAX_VALUE;
 
 	public static final int IMPLICIT_CONVERSION_MASK = 0xFF;
@@ -238,8 +239,9 @@
 	 */
 	final int BitResourceFreeCloseable = 8;
 	
+	final int BitUninternedType = 16;
 	/**
 	 * Set of type bits that should be inherited by any sub types.
 	 */
-	final int InheritableBits = BitAutoCloseable | BitCloseable;
+	final int InheritableBits = BitAutoCloseable | BitCloseable | BitUninternedType;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
new file mode 100644
index 0000000..780e763
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
@@ -0,0 +1,379 @@
+/*******************************************************************************
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
+import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
+
+/* TypeSystem: An abstraction responsible for keeping track of types that undergo "derivation" of some sort and the derived types produced thus.
+   Here we use the term derivation in the Pascal sense and not per object oriented parlance.
+   
+   As of Java SE8, a type can undergo derivation in a bunch of ways:
+   
+       - By being created arrays out of,
+       - By being parameterized,
+       - By being created raw forms of,
+       - By being the generic type which a wildcard type or an intersection type parameterizes,
+       - By being annotated.
+       
+   It is the responsibility of the TypeSystem to serve as the factory and ensure that unique types are created and maintained. Most of the
+   compiler depends on object identity given the derivation parameters are the same. E.g: If we dole out non-unique ParameterizedTypeBinding's
+   for two attempts to create List<String>, then one cannot be assigned to the other.
+   
+   Till Java SE7, we could manage to create a single binding for a type - not so with annotations coming into the picture. In order for
+   two uses of the same type to be annotated differently, the bindings for them need to be distinct and cannot be shared. If we start
+   doling out different bindings, then validating type identity and equivalence becomes an issue.
+   
+   What we do to solve the problem is produce different bindings when they need to be annotated differently, but stamp them with the
+   same id (TypeBinding#id). Thus types that fail == or != could quickly be ascertained to be mere annotation variants by comparing
+   the id field.
+       
+   This class is responsible for id stamping unique types. Only those types that are "derived from" in some form or participate in the 
+   derivation in some form (by being type arguments say) get tracked and id'd here. A type which is not thus derived from in one form or 
+   the other or participate in the derivation thus - we are completely oblivious to.
+   
+   TypeBinding.id computation: For primitive types and certain "well known" types, id assignment happens elsewhere. Here we start with an 
+   id value that is suitably high and proceed monotonically upwards so we will not accidentally collide with the id space in use already. 
+   id assignments happens in such a way that a naked type and its annotated variants - variously annotated - would all share the same id. 
+   Example: @T1 Map<@T2 String, @T3 Object> and Map<@T4 String, @T5 Object> and @T6 Map<String, Object> and @T7 Map<String, @T8 Object> and 
+   Map<String, @T9 Object> would all share the same id since the unadorned naked type in each case is the same: Map<String, Object>. None 
+   of this would share the id with Map<String, String>. Briefly put, if you take a certain annotated type and strip it of all annotations 
+   to come up with the naked type, that naked type and the annotated type would have the same id. Alternately, if you take a certain naked 
+   type and arrive at the universe of all differently annotated types, they would all share the same id while their bindings could be different - 
+   would be different unless they are identically annotated.
+   
+   Thus subsystems that are annotation agnostic could quickly ascertain binding equality by comparing the id field.
+*/
+public class TypeSystem {
+	
+	private int typeid = TypeIds.T_LastWellKnownTypeId;
+	private TypeBinding [][] types; 
+	private SimpleLookupTable annotationTypes; // cannot store in types, since AnnotationBinding is not a TypeBinding and we don't want types to operate at Binding level.
+	private LookupEnvironment environment;
+	
+	public TypeSystem(LookupEnvironment environment) {
+		this.environment = environment;
+		this.annotationTypes = new SimpleLookupTable(16);
+		this.typeid = TypeIds.T_LastWellKnownTypeId;
+		this.types = new TypeBinding[TypeIds.T_LastWellKnownTypeId * 2][]; 
+	}
+
+	// Given a type, answer its unannotated aka naked prototype. This is also a convenient way to "register" a type with TypeSystem and have it id stamped.
+	public final TypeBinding getUnannotatedType(TypeBinding type) {
+		if (type.isUnresolvedType() && CharOperation.indexOf('$', type.sourceName()) > 0)
+			type = BinaryTypeBinding.resolveType(type, this.environment, true); // to ensure unique id assignment (when enclosing type is parameterized, inner type is also) 
+		if (type.id == TypeIds.NoId) {
+			if (type.hasTypeAnnotations())
+				throw new IllegalStateException();
+			int typesLength = this.types.length;
+			if (this.typeid == typesLength)
+				System.arraycopy(this.types, 0, this.types = new TypeBinding[typesLength * 2][], 0, typesLength);
+			this.types[type.id = this.typeid++] = new TypeBinding[4];
+		} else {
+			TypeBinding nakedType = this.types[type.id] == null ? null : this.types[type.id][0];
+			if (type.hasTypeAnnotations() && nakedType == null)
+				throw new IllegalStateException();
+			if (nakedType != null)
+				return nakedType;
+			this.types[type.id] = new TypeBinding[4];  // well known type, assigned id elsewhere.
+		}
+	
+		return this.types[type.id][0] = type;
+	}
+	
+	// Given a type, return all its variously annotated versions.
+	public TypeBinding[] getAnnotatedTypes(TypeBinding type) {
+		return Binding.NO_TYPES;
+	}
+
+	/* Note: parameters will not have type type annotations if lookup environment directly uses TypeSystem as its typeSystem. When ATS is used however
+	   they may be annotated and we need to materialize the unannotated versions and work on them.
+	*/ 
+	public ArrayBinding getArrayType(TypeBinding leafType, int dimensions) {
+		TypeBinding unannotatedLeafType = getUnannotatedType(leafType);
+		TypeBinding[] derivedTypes = this.types[unannotatedLeafType.id];
+		int i, length = derivedTypes.length;
+		for (i = 0; i < length; i++) {
+			TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null) 
+				break;
+			if (!derivedType.isArrayType() || derivedType.hasTypeAnnotations())
+				continue;
+			if (derivedType.leafComponentType() == unannotatedLeafType && derivedType.dimensions() == dimensions) //$IDENTITY-COMPARISON$
+				return (ArrayBinding) derivedType;
+		}
+		if (i == length) {
+			System.arraycopy(derivedTypes, 0, derivedTypes = new TypeBinding[length * 2], 0, length);
+			this.types[unannotatedLeafType.id] = derivedTypes;
+		}
+		TypeBinding arrayType = derivedTypes[i] = new ArrayBinding(unannotatedLeafType, dimensions, this.environment);
+		int typesLength = this.types.length;
+		if (this.typeid == typesLength)
+			System.arraycopy(this.types, 0, this.types = new TypeBinding[typesLength * 2][], 0, typesLength);
+		this.types[this.typeid] = new TypeBinding[1];
+		return (ArrayBinding) (this.types[arrayType.id = this.typeid++][0] = arrayType);
+	}
+	
+	public ArrayBinding getArrayType(TypeBinding leafComponentType, int dimensions, AnnotationBinding[] annotations) {
+		return getArrayType(leafComponentType, dimensions);
+	}
+
+	public ReferenceBinding getMemberType(ReferenceBinding memberType, ReferenceBinding enclosingType) {
+		return memberType;  // nothing to do for plain vanilla type system, they are already hooked.
+	}
+
+	/* Note: parameters will not have type type annotations if lookup environment directly uses TypeSystem. When AnnotatableTypeSystem is in use
+	   they may and we need to materialize the unannotated versions and work on them.
+	*/ 
+	public ParameterizedTypeBinding getParameterizedType(ReferenceBinding genericType, TypeBinding[] typeArguments, ReferenceBinding enclosingType) {
+		ReferenceBinding unannotatedGenericType = (ReferenceBinding) getUnannotatedType(genericType);
+		int typeArgumentsLength = typeArguments == null ? 0: typeArguments.length;
+		TypeBinding [] unannotatedTypeArguments = typeArguments == null ? null : new TypeBinding[typeArgumentsLength];
+		for (int i = 0; i < typeArgumentsLength; i++) {
+			unannotatedTypeArguments[i] = getUnannotatedType(typeArguments[i]);
+		}
+		ReferenceBinding unannotatedEnclosingType = enclosingType == null ? null : (ReferenceBinding) getUnannotatedType(enclosingType);
+		
+		TypeBinding[] derivedTypes = this.types[unannotatedGenericType.id];
+		int i, length = derivedTypes.length;
+		for (i = 0 ; i < length; i++) {
+			TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null) 
+				break;
+			if (!derivedType.isParameterizedType() || derivedType.actualType() != unannotatedGenericType || derivedType.hasTypeAnnotations()) //$IDENTITY-COMPARISON$
+				continue;
+			if (derivedType.enclosingType() == unannotatedEnclosingType && Util.effectivelyEqual(derivedType.typeArguments(), unannotatedTypeArguments)) //$IDENTITY-COMPARISON$
+				return (ParameterizedTypeBinding) derivedType;
+		}
+
+		if (i == length) {
+			System.arraycopy(derivedTypes, 0, derivedTypes = new TypeBinding[length * 2], 0, length);
+			this.types[unannotatedGenericType.id] = derivedTypes;
+		}
+		TypeBinding parameterizedType = derivedTypes[i] = new ParameterizedTypeBinding(unannotatedGenericType, unannotatedTypeArguments, unannotatedEnclosingType, this.environment);
+	
+		int typesLength = this.types.length;
+		if (this.typeid == typesLength)
+			System.arraycopy(this.types, 0, this.types = new TypeBinding[typesLength * 2][], 0, typesLength);
+		this.types[this.typeid] = new TypeBinding[1];
+		return (ParameterizedTypeBinding) (this.types[parameterizedType.id = this.typeid++][0] = parameterizedType);
+	}
+	
+	public ParameterizedTypeBinding getParameterizedType(ReferenceBinding genericType, TypeBinding[] typeArguments, ReferenceBinding enclosingType, AnnotationBinding[] annotations) {
+		return getParameterizedType(genericType, typeArguments, enclosingType);
+	}
+
+	/* Note: Parameters will not have type type annotations if lookup environment directly uses TypeSystem. However when AnnotatableTypeSystem is in use,
+	   they may and we need to materialize the unannotated versions and work on them.
+	*/ 
+	public RawTypeBinding getRawType(ReferenceBinding genericType, ReferenceBinding enclosingType) {
+		ReferenceBinding unannotatedGenericType = (ReferenceBinding) getUnannotatedType(genericType);
+		ReferenceBinding unannotatedEnclosingType = enclosingType == null ? null : (ReferenceBinding) getUnannotatedType(enclosingType);
+	
+		TypeBinding[] derivedTypes = this.types[unannotatedGenericType.id];
+		int i, length = derivedTypes.length;
+		for (i = 0; i < length; i++) {
+			TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null) 
+				break;
+			if (!derivedType.isRawType() || derivedType.actualType() != unannotatedGenericType || derivedType.hasTypeAnnotations()) //$IDENTITY-COMPARISON$
+				continue;
+			if (derivedType.enclosingType() == unannotatedEnclosingType) //$IDENTITY-COMPARISON$
+				return (RawTypeBinding) derivedType;
+		}
+
+		if (i == length) {
+			System.arraycopy(derivedTypes, 0, derivedTypes = new TypeBinding[length * 2], 0, length);
+			this.types[unannotatedGenericType.id] = derivedTypes;
+		}
+		
+		TypeBinding rawTytpe = derivedTypes[i] = new RawTypeBinding(unannotatedGenericType, unannotatedEnclosingType, this.environment);
+		int typesLength = this.types.length;
+		if (this.typeid == typesLength)
+			System.arraycopy(this.types, 0, this.types = new TypeBinding[typesLength * 2][], 0, typesLength);
+		this.types[this.typeid] = new TypeBinding[1];
+		return (RawTypeBinding) (this.types[rawTytpe.id = this.typeid++][0] = rawTytpe);
+	}
+	
+	public RawTypeBinding getRawType(ReferenceBinding genericType, ReferenceBinding enclosingType, AnnotationBinding[] annotations) {
+		return getRawType(genericType, enclosingType);
+	}
+
+	/* Parameters will not have type type annotations if lookup environment directly uses TypeSystem. When AnnotatableTypeSystem is in use,
+	   they may and we need to materialize the unannotated versions and work on them.
+	*/ 
+	public WildcardBinding getWildcard(ReferenceBinding genericType, int rank, TypeBinding bound, TypeBinding[] otherBounds, int boundKind) {
+		if (genericType == null) // pseudo wildcard denoting composite bounds for lub computation
+			genericType = ReferenceBinding.LUB_GENERIC;
+		
+		ReferenceBinding unannotatedGenericType = (ReferenceBinding) getUnannotatedType(genericType);
+		int otherBoundsLength = otherBounds == null ? 0: otherBounds.length;
+		TypeBinding [] unannotatedOtherBounds = otherBounds == null ? null : new TypeBinding[otherBoundsLength];
+		for (int i = 0; i < otherBoundsLength; i++) {
+			unannotatedOtherBounds[i] = getUnannotatedType(otherBounds[i]);
+		}
+		TypeBinding unannotatedBound = bound == null ? null : getUnannotatedType(bound);
+
+		TypeBinding[] derivedTypes = this.types[unannotatedGenericType.id];  // by construction, cachedInfo != null now.
+		int i, length = derivedTypes.length;
+		for (i = 0; i < length; i++) {
+			TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null) 
+				break;
+			if (!derivedType.isWildcard() || derivedType.actualType() != unannotatedGenericType || derivedType.hasTypeAnnotations()) //$IDENTITY-COMPARISON$
+				continue;
+			if (derivedType.rank() != rank || derivedType.boundKind() != boundKind || derivedType.bound() != unannotatedBound) //$IDENTITY-COMPARISON$
+				continue;
+			if (Util.effectivelyEqual(derivedType.additionalBounds(), unannotatedOtherBounds))
+				return (WildcardBinding) derivedType;
+		}
+		
+		if (i == length) {
+			System.arraycopy(derivedTypes, 0, derivedTypes = new TypeBinding[length * 2], 0, length);
+			this.types[unannotatedGenericType.id] = derivedTypes;
+		}
+		TypeBinding wildcard = derivedTypes[i] = new WildcardBinding(unannotatedGenericType, rank, unannotatedBound, unannotatedOtherBounds, boundKind, this.environment);
+	
+		int typesLength = this.types.length;
+		if (this.typeid == typesLength)
+			System.arraycopy(this.types, 0, this.types = new TypeBinding[typesLength * 2][], 0, typesLength);
+		this.types[this.typeid] = new TypeBinding[1];
+		return (WildcardBinding) (this.types[wildcard.id = this.typeid++][0] = wildcard);
+	}
+	
+	public WildcardBinding getWildcard(ReferenceBinding genericType, int rank, TypeBinding bound, TypeBinding[] otherBounds, int boundKind, AnnotationBinding[] annotations) {
+		return getWildcard(genericType, rank, bound, otherBounds, boundKind);
+	}
+
+	public TypeBinding getAnnotatedType(TypeBinding type, AnnotationBinding[][] annotations) {
+		return type; // Nothing to do for plain vanilla type system.
+	}
+	
+	protected final TypeBinding /* @NonNull */ [] getDerivedTypes(TypeBinding keyType) {
+		keyType = getUnannotatedType(keyType);
+		return this.types[keyType.id];
+	}
+	
+	private TypeBinding cacheDerivedType(TypeBinding keyType, TypeBinding derivedType) {
+		if (keyType == null || derivedType == null || keyType.id == TypeIds.NoId)
+			throw new IllegalStateException();
+		
+		TypeBinding[] derivedTypes = this.types[keyType.id];
+		int i = 0, length = derivedTypes.length;
+		while (i < length && derivedTypes[i] != null) {
+			i++;
+		}
+		if (i == length) {
+			System.arraycopy(derivedTypes, 0, derivedTypes = new TypeBinding[length * 2], 0, length);
+			this.types[keyType.id] = derivedTypes;
+		}
+		return derivedTypes[i] = derivedType;
+	}
+	
+	protected final TypeBinding cacheDerivedType(TypeBinding keyType, TypeBinding nakedType, TypeBinding derivedType) {
+		
+		/* Cache the derived type, tagging it as a derivative of both the key type and the naked type.
+		   E.g: int @NonNull [] would be tagged as a derived type of both int and int []. This is not
+		   needed for correctness, but for annotated object reuse. We provide two alternate ways to
+		   annotate a type: 
+		   
+		   Taking parameterized types as an example, a call to getParamaterizedType can be made with annotations
+		   to create @NonNull List<@NonNull String> in one stroke. Or a parameterized type can be created first
+		   and then annotated via getAnnotatedType. In the former case, the tables get looked up with List as
+		   the key, in the latter with List<String> as the key.
+		   
+		   Binary vs source, substitutions, annotation re-attribution from SE7 locations etc trigger these
+		   alternate code paths. Unless care is exercised, we will end up with duplicate objects (that share
+		   the same TypeBinding.id => correctness is not an issue, but memory wastage is)
+		*/
+		cacheDerivedType(keyType, derivedType);
+		if (nakedType.id != keyType.id) {
+			cacheDerivedType(nakedType, derivedType);
+		}
+		return derivedType;
+	}
+	
+	/* Return a unique annotation binding for an annotation with either no or all default element-value pairs.
+	   We may return a resolved annotation when requested for unresolved one, but not vice versa. 
+	*/
+	public final AnnotationBinding getAnnotationType(ReferenceBinding annotationType, boolean requiredResolved) {
+		AnnotationBinding annotation = (AnnotationBinding) this.annotationTypes.get(annotationType);
+		if (annotation == null) {
+			if (requiredResolved)
+				annotation = new AnnotationBinding(annotationType, Binding.NO_ELEMENT_VALUE_PAIRS);
+			else 
+				annotation = new UnresolvedAnnotationBinding(annotationType, Binding.NO_ELEMENT_VALUE_PAIRS, this.environment);
+			this.annotationTypes.put(annotationType, annotation);
+		}
+		if (requiredResolved)
+			annotation.resolve();
+		return annotation;
+	}
+
+	public boolean isAnnotatedTypeSystem() {
+		return false;
+	}
+
+	public void reset() {
+		this.annotationTypes = new SimpleLookupTable(16);
+		this.typeid = TypeIds.T_LastWellKnownTypeId;
+		this.types = new TypeBinding[TypeIds.T_LastWellKnownTypeId * 2][];
+	}
+	
+	public void updateCaches(UnresolvedReferenceBinding unresolvedType, ReferenceBinding resolvedType) {
+		final int unresolvedTypeId = unresolvedType.id;
+		if (unresolvedTypeId != TypeIds.NoId) {
+			if (this.types[unresolvedTypeId] != null && this.types[unresolvedTypeId][0] == unresolvedType) { //$IDENTITY-COMPARISON$
+				resolvedType.id = unresolvedTypeId;
+				this.types[unresolvedTypeId][0] = resolvedType;
+			}
+		}
+		if (this.annotationTypes.get(unresolvedType) != null) { // update the key
+			Object[] keys = this.annotationTypes.keyTable;
+			for (int i = 0, l = keys.length; i < l; i++) {
+				if (keys[i] == unresolvedType) {
+					keys[i] = resolvedType; // hashCode is based on compoundName so this works.
+					break;
+				}
+			}
+		}
+	}
+
+	public final TypeBinding getIntersectionCastType(ReferenceBinding[] intersectingTypes) {
+		int intersectingTypesLength = intersectingTypes == null ? 0 : intersectingTypes.length;
+		if (intersectingTypesLength == 0)
+			return null;
+		TypeBinding keyType = intersectingTypes[0];
+		if (keyType == null || intersectingTypesLength == 1)
+			return keyType;
+					
+		TypeBinding[] derivedTypes = getDerivedTypes(keyType);
+		int i, length = derivedTypes.length;
+		next:
+		for (i = 0; i < length; i++) {
+			TypeBinding derivedType = derivedTypes[i];
+			if (derivedType == null) 
+				break;
+			if (!derivedType.isIntersectionCastType())
+				continue;
+			ReferenceBinding [] priorIntersectingTypes = derivedType.getIntersectingTypes();
+			if (priorIntersectingTypes.length != intersectingTypesLength)
+				continue;
+			for (int j = 0; j < intersectingTypesLength; j++) {
+				if (intersectingTypes[j] != priorIntersectingTypes[j]) //$IDENTITY-COMPARISON$
+					continue next;
+			}	
+			return derivedType;
+		}
+		return cacheDerivedType(keyType, new IntersectionCastTypeBinding(intersectingTypes, this.environment));
+	}
+}
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java
index e2b421d..a516a2e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - Contributions for
@@ -17,12 +13,26 @@
  *     							bug 359362 - FUP of bug 349326: Resource leak on non-Closeable resource
  *								bug 358903 - Filter practically unimportant resource leak warnings
  *								bug 395002 - Self bound generic class doesn't resolve bounds properly for wildcards for certain parametrisation.
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 426792 - [1.8][inference][impl] generify new type inference engine
+ *								Bug 428019 - [1.8][compiler] Type inference failure with nested generic invocation.
+ *								Bug 429384 - [1.8][null] implement conformance rules for null-annotated lower / upper type bounds
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
+import java.util.Set;
+
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeParameter;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 /**
  * Binding for a type parameter, held by source/binary type or method.
@@ -36,11 +46,11 @@
 	 * Denote the first explicit (binding) bound amongst the supertypes (from declaration in source)
 	 * If no superclass was specified, then it denotes the first superinterface, or null if none was specified.
 	 */
-	public TypeBinding firstBound;
+	public TypeBinding firstBound;             // MUST NOT be modified directly, use setter !
 
 	// actual resolved variable supertypes (if no superclass bound, then associated to Object)
-	public ReferenceBinding superclass;
-	public ReferenceBinding[] superInterfaces;
+	public ReferenceBinding superclass;        // MUST NOT be modified directly, use setter !
+	public ReferenceBinding[] superInterfaces; // MUST NOT be modified directly, use setter !
 	public char[] genericTypeSignature;
 	LookupEnvironment environment;
 	
@@ -53,6 +63,19 @@
 		this.environment = environment;
 		this.typeBits = TypeIds.BitUninitialized;
 	}
+	
+	public TypeVariableBinding(TypeVariableBinding prototype) {
+		super(prototype);
+		this.declaringElement = prototype.declaringElement;
+		this.rank = prototype.rank;
+		this.firstBound = prototype.firstBound;
+		this.superclass = prototype.superclass;
+		this.superInterfaces = prototype.superInterfaces;
+		this.genericTypeSignature = prototype.genericTypeSignature;
+		this.environment = prototype.environment;
+		prototype.tagBits |= TagBits.HasAnnotatedVariants;
+		this.tagBits &= ~TagBits.HasAnnotatedVariants;
+	}
 
 	/**
 	 * Returns true if the argument type satisfies all bounds of the type parameter
@@ -71,7 +94,7 @@
 		return code;
 	}
 	private int internalBoundCheck(Substitution substitution, TypeBinding argumentType, Scope scope) {
-		if (argumentType == TypeBinding.NULL || argumentType == this) {
+		if (argumentType == TypeBinding.NULL || TypeBinding.equalsEquals(argumentType, this)) {
 			return TypeConstants.OK;
 		}
 		boolean hasSubstitution = substitution != null;
@@ -87,7 +110,7 @@
 			switch(wildcard.boundKind) {
 				case Wildcard.EXTENDS :
 					TypeBinding wildcardBound = wildcard.bound;
-					if (wildcardBound == this)
+					if (TypeBinding.equalsEquals(wildcardBound, this))
 						return TypeConstants.OK;
 					boolean isArrayBound = wildcardBound.isArrayType();
 					if (!wildcardBound.isInterface()) {
@@ -151,7 +174,7 @@
 		boolean unchecked = false;
 		if (this.superclass.id != TypeIds.T_JavaLangObject) {
 			TypeBinding substitutedSuperType = hasSubstitution ? Scope.substitute(substitution, this.superclass) : this.superclass;
-	    	if (substitutedSuperType != argumentType) {
+	    	if (TypeBinding.notEquals(substitutedSuperType, argumentType)) {
 				if (!argumentType.isCompatibleWith(substitutedSuperType, scope)) {
 				    return TypeConstants.MISMATCH;
 				}
@@ -165,7 +188,7 @@
 		}
 	    for (int i = 0, length = this.superInterfaces.length; i < length; i++) {
 			TypeBinding substitutedSuperType = hasSubstitution ? Scope.substitute(substitution, this.superInterfaces[i]) : this.superInterfaces[i];
-	    	if (substitutedSuperType != argumentType) {
+	    	if (TypeBinding.notEquals(substitutedSuperType, argumentType)) {
 				if (!argumentType.isCompatibleWith(substitutedSuperType, scope)) {
 				    return TypeConstants.MISMATCH;
 				}
@@ -177,13 +200,20 @@
 				}
 	    	}
 	    }
+	    long nullTagBits = NullAnnotationMatching.validNullTagBits(this.tagBits);
+	    if (nullTagBits != 0) {
+	    	long argBits = NullAnnotationMatching.validNullTagBits(argumentType.tagBits);
+	    	if (argBits != nullTagBits) {
+//	    		System.err.println("TODO(stephan): issue proper error: bound conflict at "+String.valueOf(this.declaringElement.readableName()));
+	    	}
+	    }
 	    return unchecked ? TypeConstants.UNCHECKED : TypeConstants.OK;
 	}
 
 	public int boundsCount() {
 		if (this.firstBound == null) {
 			return 0;
-		} else if (this.firstBound == this.superclass) {
+		} else if (TypeBinding.equalsEquals(this.firstBound, this.superclass)) {
 			return this.superInterfaces.length + 1;
 		} else {
 			return this.superInterfaces.length;
@@ -214,7 +244,7 @@
 			case Binding.BASE_TYPE :
 				if (actualType == TypeBinding.NULL) return;
 				TypeBinding boxedType = scope.environment().computeBoxingType(actualType);
-				if (boxedType == actualType) return;
+				if (boxedType == actualType) return; //$IDENTITY-COMPARISON$
 				actualType = boxedType;
 				break;
 			case Binding.POLY_TYPE: // cannot steer inference, only learn from it.
@@ -277,10 +307,35 @@
 	    }
 	    return this.superclass.constantPoolName(); // java/lang/Object
 	}
+	
+	public TypeBinding clone(TypeBinding enclosingType) {
+		return new TypeVariableBinding(this);
+	}
+	public String annotatedDebugName() {
+		StringBuffer buffer = new StringBuffer(10);
+		buffer.append(super.annotatedDebugName());
+		if (this.superclass != null && TypeBinding.equalsEquals(this.firstBound, this.superclass)) {
+		    buffer.append(" extends ").append(this.superclass.annotatedDebugName()); //$NON-NLS-1$
+		}
+		if (this.superInterfaces != null && this.superInterfaces != Binding.NO_SUPERINTERFACES) {
+		   if (TypeBinding.notEquals(this.firstBound, this.superclass)) {
+		        buffer.append(" extends "); //$NON-NLS-1$
+	        }
+		    for (int i = 0, length = this.superInterfaces.length; i < length; i++) {
+		        if (i > 0 || TypeBinding.equalsEquals(this.firstBound, this.superclass)) {
+		            buffer.append(" & "); //$NON-NLS-1$
+		        }
+				buffer.append(this.superInterfaces[i].annotatedDebugName());
+			}
+		}
+		return buffer.toString();
+	}
 	/**
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#debugName()
 	 */
 	public String debugName() {
+		if (this.hasTypeAnnotations())
+			return super.annotatedDebugName();
 	    return new String(this.sourceName);
 	}
 	public TypeBinding erasure() {
@@ -297,7 +352,7 @@
 	    StringBuffer sig = new StringBuffer(10);
 	    sig.append(this.sourceName).append(':');
 	   	int interfaceLength = this.superInterfaces == null ? 0 : this.superInterfaces.length;
-	    if (interfaceLength == 0 || this.firstBound == this.superclass) {
+	    if (interfaceLength == 0 || TypeBinding.equalsEquals(this.firstBound, this.superclass)) {
 	    	if (this.superclass != null)
 		        sig.append(this.superclass.genericTypeSignature());
 	    }
@@ -318,8 +373,23 @@
 		return this.genericTypeSignature = CharOperation.concat('T', this.sourceName, ';');
 	}
 
+	/**
+	 * Compute the initial type bounds for one inference variable as per JLS8 sect 18.1.3.
+	 */
+	TypeBound[] getTypeBounds(InferenceVariable variable, InferenceContext18 context) {
+		int n = boundsCount();
+        if (n == 0)
+        	return NO_TYPE_BOUNDS;
+        TypeBound[] bounds = new TypeBound[n];
+        bounds[0] = TypeBound.createBoundOrDependency(context, this.firstBound, variable);
+        int ifcOffset = TypeBinding.equalsEquals(this.firstBound, this.superclass) ? -1 : 0;
+        for (int i = 1; i < n; i++)
+			bounds[i] = TypeBound.createBoundOrDependency(context, this.superInterfaces[i+ifcOffset], variable);
+        return bounds;
+	}
+
 	boolean hasOnlyRawBounds() {
-		if (this.superclass != null && this.firstBound == this.superclass)
+		if (this.superclass != null && TypeBinding.equalsEquals(this.firstBound, this.superclass))
 			if (!this.superclass.isRawType())
 				return false;
 
@@ -349,10 +419,10 @@
 	 * Returns true if the type variable is directly bound to a given type
 	 */
 	public boolean isErasureBoundTo(TypeBinding type) {
-		if (this.superclass.erasure() == type)
+		if (TypeBinding.equalsEquals(this.superclass.erasure(), type))
 			return true;
 		for (int i = 0, length = this.superInterfaces.length; i < length; i++) {
-			if (this.superInterfaces[i].erasure() == type)
+			if (TypeBinding.equalsEquals(this.superInterfaces[i].erasure(), type))
 				return true;
 		}
 		return false;
@@ -368,25 +438,105 @@
 	 * List<T1>> is interchangeable with <T2 extends List<T2>>.
 	 */
 	public boolean isInterchangeableWith(TypeVariableBinding otherVariable, Substitution substitute) {
-		if (this == otherVariable)
+		if (TypeBinding.equalsEquals(this, otherVariable))
 			return true;
 		int length = this.superInterfaces.length;
 		if (length != otherVariable.superInterfaces.length)
 			return false;
 
-		if (this.superclass != Scope.substitute(substitute, otherVariable.superclass))
+		if (TypeBinding.notEquals(this.superclass, Scope.substitute(substitute, otherVariable.superclass)))
 			return false;
 
 		next : for (int i = 0; i < length; i++) {
 			TypeBinding superType = Scope.substitute(substitute, otherVariable.superInterfaces[i]);
 			for (int j = 0; j < length; j++)
-				if (superType == this.superInterfaces[j])
+				if (TypeBinding.equalsEquals(superType, this.superInterfaces[j]))
 					continue next;
 			return false; // not a match
 		}
 		return true;
 	}
 
+	@Override
+	public boolean isSubtypeOf(TypeBinding other) {
+		if (isSubTypeOfRTL(other))
+			return true;
+		if (this.firstBound != null && this.firstBound.isSubtypeOf(other))
+			return true;
+		if (this.superclass != null && this.superclass.isSubtypeOf(other))
+			return true;
+		if (this.superInterfaces != null)
+			for (int i = 0, l = this.superInterfaces.length; i < l; i++)
+		   		if (this.superInterfaces[i].isSubtypeOf(other))
+					return true;
+		return other.id == TypeIds.T_JavaLangObject;
+	}
+
+	// to prevent infinite recursion when inspecting recursive generics:
+	boolean inRecursiveFunction = false;
+	
+	public boolean isProperType(boolean admitCapture18) {
+		// handle recursive calls:
+		if (this.inRecursiveFunction) // be optimistic, since this node is not an inference variable
+			return true;
+		
+		this.inRecursiveFunction = true;
+		try {
+			if (this.superclass != null && !this.superclass.isProperType(admitCapture18)) {
+				return false;
+			}
+			if (this.superInterfaces != null)
+				for (int i = 0, l = this.superInterfaces.length; i < l; i++)
+			   		if (!this.superInterfaces[i].isProperType(admitCapture18)) {
+						return false;
+					}
+			return true;
+		} finally {
+			this.inRecursiveFunction = false;
+		}
+	}
+
+	TypeBinding substituteInferenceVariable(InferenceVariable var, TypeBinding substituteType) {
+		if (this.inRecursiveFunction) return this;
+		this.inRecursiveFunction = true;
+		try {
+			boolean haveSubstitution = false;
+			ReferenceBinding currentSuperclass = this.superclass;
+			if (currentSuperclass != null) {
+				currentSuperclass = (ReferenceBinding) currentSuperclass.substituteInferenceVariable(var, substituteType);
+				haveSubstitution |= TypeBinding.notEquals(currentSuperclass, this.superclass);
+			}
+			ReferenceBinding[] currentSuperInterfaces = null;
+			if (this.superInterfaces != null) {
+				int length = this.superInterfaces.length;
+				if (haveSubstitution)
+					System.arraycopy(this.superInterfaces, 0, currentSuperInterfaces=new ReferenceBinding[length], 0, length);
+				for (int i = 0; i < length; i++) {
+					ReferenceBinding currentSuperInterface = this.superInterfaces[i];
+					if (currentSuperInterface != null) {
+						currentSuperInterface = (ReferenceBinding) currentSuperInterface.substituteInferenceVariable(var, substituteType);
+						if (TypeBinding.notEquals(currentSuperInterface, this.superInterfaces[i])) {
+							if (currentSuperInterfaces == null)
+								System.arraycopy(this.superInterfaces, 0, currentSuperInterfaces=new ReferenceBinding[length], 0, length);
+							currentSuperInterfaces[i] = currentSuperInterface;
+							haveSubstitution = true;
+						}
+					}
+				}
+			}
+			if (haveSubstitution) {
+				TypeVariableBinding newVar = new TypeVariableBinding(this.sourceName, this.declaringElement, this.rank, this.environment);
+				newVar.superclass = currentSuperclass;
+				newVar.superInterfaces = currentSuperInterfaces;
+				newVar.tagBits = this.tagBits;
+				return newVar;
+			}
+			return this;
+		} finally {
+			this.inRecursiveFunction = false;
+		}
+	}
+
 	/**
 	 * Returns true if the type was declared as a type variable
 	 */
@@ -418,11 +568,47 @@
 	public int kind() {
 		return Binding.TYPE_PARAMETER;
 	}
+	
+	public boolean mentionsAny(TypeBinding[] parameters, int idx) {
+		if (this.inRecursiveFunction)
+			return false; // nothing seen
+		this.inRecursiveFunction = true;
+		try {
+			if (super.mentionsAny(parameters, idx))
+				return true;
+			if (this.superclass != null && this.superclass.mentionsAny(parameters, idx))
+				return true;
+			if (this.superInterfaces != null)
+				for (int j = 0; j < this.superInterfaces.length; j++) {
+					if (this.superInterfaces[j].mentionsAny(parameters, idx))
+						return true;
+			}
+			return false;
+		} finally {
+			this.inRecursiveFunction = false;
+		}
+	}
+
+	void collectInferenceVariables(Set<InferenceVariable> variables) {
+		if (this.inRecursiveFunction)
+			return; // nothing seen
+		this.inRecursiveFunction = true;
+		try {
+			if (this.superclass != null)
+				this.superclass.collectInferenceVariables(variables);
+			if (this.superInterfaces != null)
+				for (int j = 0; j < this.superInterfaces.length; j++) {
+					this.superInterfaces[j].collectInferenceVariables(variables);
+			}
+		} finally {
+			this.inRecursiveFunction = false;
+		}
+	}
 
 	public TypeBinding[] otherUpperBounds() {
 		if (this.firstBound == null)
 			return Binding.NO_TYPES;
-		if (this.firstBound == this.superclass)
+		if (TypeBinding.equalsEquals(this.firstBound, this.superclass))
 			return this.superInterfaces;
 		int otherLength = this.superInterfaces.length - 1;
 		if (otherLength > 0) {
@@ -443,11 +629,21 @@
 		if ((this.modifiers & ExtraCompilerModifiers.AccUnresolved) == 0)
 			return this;
 
+		long nullTagBits = this.tagBits & TagBits.AnnotationNullMASK;
+		
 		TypeBinding oldSuperclass = this.superclass, oldFirstInterface = null;
 		if (this.superclass != null) {
 			ReferenceBinding resolveType = (ReferenceBinding) BinaryTypeBinding.resolveType(this.superclass, this.environment, true /* raw conversion */);
 			this.tagBits |= resolveType.tagBits & TagBits.ContainsNestedTypeReferences;
-			this.superclass = resolveType;
+			long superNullTagBits = resolveType.tagBits & TagBits.AnnotationNullMASK;
+			if (superNullTagBits != 0L) {
+				if (nullTagBits == 0L) {
+					this.tagBits |= (superNullTagBits | TagBits.HasNullTypeAnnotation);
+				} else {
+//					System.err.println("TODO(stephan): report proper error: conflict binary TypeVariable vs. first bound");
+				}
+			}
+			this.setSuperClass(resolveType);
 		}
 		ReferenceBinding[] interfaces = this.superInterfaces;
 		int length;
@@ -456,20 +652,33 @@
 			for (int i = length; --i >= 0;) {
 				ReferenceBinding resolveType = (ReferenceBinding) BinaryTypeBinding.resolveType(interfaces[i], this.environment, true /* raw conversion */);
 				this.tagBits |= resolveType.tagBits & TagBits.ContainsNestedTypeReferences;
+				long superNullTagBits = resolveType.tagBits & TagBits.AnnotationNullMASK;
+				if (superNullTagBits != 0L) {
+					if (nullTagBits == 0L) {
+						this.tagBits |= (superNullTagBits | TagBits.HasNullTypeAnnotation);
+					} else {
+//						System.err.println("TODO(stephan): report proper error: conflict binary TypeVariable vs. bound "+i);
+					}
+				}
 				interfaces[i] = resolveType;
 			}
 		}
 		// refresh the firstBound in case it changed
 		if (this.firstBound != null) {
-			if (this.firstBound == oldSuperclass) {
-				this.firstBound = this.superclass;
-			} else if (this.firstBound == oldFirstInterface) {
-				this.firstBound = interfaces[0];
+			if (TypeBinding.equalsEquals(this.firstBound, oldSuperclass)) {
+				this.setFirstBound(this.superclass);
+			} else if (TypeBinding.equalsEquals(this.firstBound, oldFirstInterface)) {
+				this.setFirstBound(interfaces[0]);
 			}
 		}
 		this.modifiers &= ~ExtraCompilerModifiers.AccUnresolved;
 		return this;
 	}
+	
+	public void setTypeAnnotations(AnnotationBinding[] annotations, boolean evalNullAnnotations) {
+		this.environment.getUnannotatedType(this); // exposes original TVB/capture to type system for id stamping purposes.
+		super.setTypeAnnotations(annotations, evalNullAnnotations);
+	}
 	/**
      * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding#shortReadableName()
      */
@@ -488,17 +697,19 @@
 	 * @see java.lang.Object#toString()
 	 */
 	public String toString() {
+		if (this.hasTypeAnnotations())
+			return annotatedDebugName();
 		StringBuffer buffer = new StringBuffer(10);
 		buffer.append('<').append(this.sourceName);//.append('[').append(this.rank).append(']');
-		if (this.superclass != null && this.firstBound == this.superclass) {
+		if (this.superclass != null && TypeBinding.equalsEquals(this.firstBound, this.superclass)) {
 		    buffer.append(" extends ").append(this.superclass.debugName()); //$NON-NLS-1$
 		}
 		if (this.superInterfaces != null && this.superInterfaces != Binding.NO_SUPERINTERFACES) {
-		   if (this.firstBound != this.superclass) {
+		   if (TypeBinding.notEquals(this.firstBound, this.superclass)) {
 		        buffer.append(" extends "); //$NON-NLS-1$
 	        }
 		    for (int i = 0, length = this.superInterfaces.length; i < length; i++) {
-		        if (i > 0 || this.firstBound == this.superclass) {
+		        if (i > 0 || TypeBinding.equalsEquals(this.firstBound, this.superclass)) {
 		            buffer.append(" & "); //$NON-NLS-1$
 		        }
 				buffer.append(this.superInterfaces[i].debugName());
@@ -508,6 +719,35 @@
 		return buffer.toString();
 	}
 
+	@Override
+	public char[] nullAnnotatedReadableName(CompilerOptions options, boolean shortNames) {
+	    StringBuffer nameBuffer = new StringBuffer(10);
+		appendNullAnnotation(nameBuffer, options);
+		nameBuffer.append(this.sourceName());
+		if (this.superclass != null && TypeBinding.equalsEquals(this.firstBound, this.superclass)) {
+			nameBuffer.append(" extends ").append(this.superclass.nullAnnotatedReadableName(options, shortNames)); //$NON-NLS-1$
+		}
+		if (this.superInterfaces != null && this.superInterfaces != Binding.NO_SUPERINTERFACES) {
+		   if (TypeBinding.notEquals(this.firstBound, this.superclass)) {
+			   nameBuffer.append(" extends "); //$NON-NLS-1$
+	        }
+		    for (int i = 0, length = this.superInterfaces.length; i < length; i++) {
+		        if (i > 0 || TypeBinding.equalsEquals(this.firstBound, this.superclass)) {
+		        	nameBuffer.append(" & "); //$NON-NLS-1$
+		        }
+		        nameBuffer.append(this.superInterfaces[i].nullAnnotatedReadableName(options, shortNames));
+			}
+		}
+		int nameLength = nameBuffer.length();
+		char[] readableName = new char[nameLength];
+		nameBuffer.getChars(0, nameLength, readableName, 0);
+	    return readableName;
+	}
+
+	// May still carry declaration site annotations.
+	public TypeBinding unannotated() {
+		return this.hasTypeAnnotations() ? this.environment.getUnannotatedType(this) : this;
+	}
 	/**
 	 * Upper bound doesn't perform erasure
 	 */
@@ -517,4 +757,101 @@
 		}
 		return this.superclass; // java/lang/Object
 	}
+
+	public void evaluateNullAnnotations(Scope scope, TypeParameter parameter) {
+		long nullTagBits = NullAnnotationMatching.validNullTagBits(this.tagBits);
+		if (this.firstBound != null && this.firstBound.isValidBinding()) {
+			long superNullTagBits = NullAnnotationMatching.validNullTagBits(this.firstBound.tagBits);
+			if (superNullTagBits != 0L) {
+				if (nullTagBits == 0L) {
+					nullTagBits |= superNullTagBits;
+				} else if (superNullTagBits != nullTagBits) {
+					// not finding either bound or ann should be considered a compiler bug
+					TypeReference bound = findBound(this.firstBound, parameter);
+					Annotation ann = bound.findAnnotation(superNullTagBits);
+					scope.problemReporter().contradictoryNullAnnotationsOnBounds(ann, nullTagBits);
+					this.tagBits &= ~TagBits.AnnotationNullMASK;
+				}
+			}
+		}	
+		ReferenceBinding[] interfaces = this.superInterfaces;
+		int length;
+		if ((length = interfaces.length) != 0) {
+			for (int i = length; --i >= 0;) {
+				ReferenceBinding resolveType = interfaces[i];
+				long superNullTagBits = NullAnnotationMatching.validNullTagBits(resolveType.tagBits);
+				if (superNullTagBits != 0L) {
+					if (nullTagBits == 0L) {
+						nullTagBits |= superNullTagBits;
+					} else if (superNullTagBits != nullTagBits) {
+						// not finding either bound or ann should be considered a compiler bug
+						TypeReference bound = findBound(this.firstBound, parameter);
+						Annotation ann = bound.findAnnotation(superNullTagBits);
+						scope.problemReporter().contradictoryNullAnnotationsOnBounds(ann, nullTagBits);
+						this.tagBits &= ~TagBits.AnnotationNullMASK;
+					}
+				}
+				interfaces[i] = resolveType;
+			}
+		}
+		if (nullTagBits != 0)
+			this.tagBits |= nullTagBits | TagBits.HasNullTypeAnnotation;
+	}
+	private TypeReference findBound(TypeBinding bound, TypeParameter parameter) {
+		if (parameter.type != null && TypeBinding.equalsEquals(parameter.type.resolvedType, bound))
+			return parameter.type;
+		TypeReference[] bounds = parameter.bounds;
+		if (bounds != null) {
+			for (int i = 0; i < bounds.length; i++) {
+				if (TypeBinding.equalsEquals(bounds[i].resolvedType, bound))
+					return bounds[i];
+			}
+		}
+		return null;
+	}
+
+	/* An annotated type variable use differs from its declaration exactly in its annotations and in nothing else.
+	   Propagate writes to all annotated variants so the clones evolve along.
+	*/
+	public TypeBinding setFirstBound(TypeBinding firstBound) {
+		this.firstBound = firstBound;
+		if ((this.tagBits & TagBits.HasAnnotatedVariants) != 0) {
+			TypeBinding [] annotatedTypes = this.environment.getAnnotatedTypes(this);
+			for (int i = 0, length = annotatedTypes == null ? 0 : annotatedTypes.length; i < length; i++) {
+				TypeVariableBinding annotatedType = (TypeVariableBinding) annotatedTypes[i];
+				annotatedType.firstBound = firstBound;
+			}
+		}
+		if (firstBound != null && firstBound.hasNullTypeAnnotations())
+			this.tagBits |= TagBits.HasNullTypeAnnotation;
+		return firstBound;
+	}
+	/* An annotated type variable use differs from its declaration exactly in its annotations and in nothing else.
+	   Propagate writes to all annotated variants so the clones evolve along.
+	*/
+	public ReferenceBinding setSuperClass(ReferenceBinding superclass) {
+		this.superclass = superclass;
+		if ((this.tagBits & TagBits.HasAnnotatedVariants) != 0) {
+			TypeBinding [] annotatedTypes = this.environment.getAnnotatedTypes(this);
+			for (int i = 0, length = annotatedTypes == null ? 0 : annotatedTypes.length; i < length; i++) {
+				TypeVariableBinding annotatedType = (TypeVariableBinding) annotatedTypes[i];
+				annotatedType.superclass = superclass;
+			}
+		}
+		return superclass;
+	}
+	/* An annotated type variable use differs from its declaration exactly in its annotations and in nothing else.
+	   Propagate writes to all annotated variants so the clones evolve along.
+	*/
+	public ReferenceBinding [] setSuperInterfaces(ReferenceBinding[] superInterfaces) {
+		this.superInterfaces = superInterfaces;
+		if ((this.tagBits & TagBits.HasAnnotatedVariants) != 0) {
+			TypeBinding [] annotatedTypes = this.environment.getAnnotatedTypes(this);
+			for (int i = 0, length = annotatedTypes == null ? 0 : annotatedTypes.length; i < length; i++) {
+				TypeVariableBinding annotatedType = (TypeVariableBinding) annotatedTypes[i];
+				annotatedType.superInterfaces = superInterfaces;
+			}
+		}
+		return superInterfaces;
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding.java
index 616581d..c7c0e93 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding.java
@@ -19,7 +19,7 @@
 	this.env = env;
 }
 
-public ReferenceBinding getAnnotationType() {
+public void resolve() { // in place resolution.
 	if (this.typeUnresolved) { // the type is resolved when requested
 		boolean wasToleratingMissingTypeProcessingAnnotations = this.env.mayTolerateMissingType;
 		this.env.mayTolerateMissingType = true; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=388042
@@ -31,13 +31,16 @@
 		}
 		this.typeUnresolved = false;
 	}
+}
+public ReferenceBinding getAnnotationType() {
+	resolve();
 	return this.type;
 }
 
 public ElementValuePair[] getElementValuePairs() {
 	if (this.env != null) {
 		if (this.typeUnresolved) {
-			getAnnotationType(); // resolve the annotation type
+			resolve();
 		}
 		// resolve method binding and value type (if unresolved) for each pair
 		for (int i = this.pairs.length; --i >= 0;) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
index 0043d75..56df9f3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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 349326 - [1.7] new warning for missing try-with-resources
+ *     Stephan Herrmann - Contributions for
+ *								bug 349326 - [1.7] new warning for missing try-with-resources
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -17,13 +20,32 @@
 
 ReferenceBinding resolvedType;
 TypeBinding[] wrappers;
+UnresolvedReferenceBinding prototype;
 
 UnresolvedReferenceBinding(char[][] compoundName, PackageBinding packageBinding) {
 	this.compoundName = compoundName;
 	this.sourceName = compoundName[compoundName.length - 1]; // reasonable guess
 	this.fPackage = packageBinding;
 	this.wrappers = null;
+	this.prototype = this;
+	computeId();
 }
+
+public UnresolvedReferenceBinding(UnresolvedReferenceBinding prototype) {
+	super(prototype);
+	this.resolvedType = prototype.resolvedType;
+	this.wrappers = null;
+	this.prototype = prototype.prototype;
+}
+
+public TypeBinding clone(TypeBinding outerType) {
+	if (this.resolvedType != null || this.depth() > 0)
+		throw new IllegalStateException();
+	UnresolvedReferenceBinding copy = new UnresolvedReferenceBinding(this);
+	this.addWrapper(copy, null);
+	return copy;
+}
+
 void addWrapper(TypeBinding wrapper, LookupEnvironment environment) {
 	if (this.resolvedType != null) {
 		// the type reference B<B<T>.M> means a signature of <T:Ljava/lang/Object;>LB<LB<TT;>.M;>;
@@ -39,21 +61,44 @@
 		this.wrappers[length] = wrapper;
 	}
 }
+public boolean isUnresolvedType() {
+	return true;
+}
 public String debugName() {
 	return toString();
 }
+public int depth() {
+	// we don't yet have our enclosing types wired, but we know the nesting depth from our compoundName:
+	int last = this.compoundName.length-1;
+	return CharOperation.occurencesOf('$', this.compoundName[last]);
+}
 public boolean hasTypeBit(int bit) {
 	// shouldn't happen since we are not called before analyseCode(), but play safe:
 	return false;
 }
+
+public TypeBinding prototype() {
+	return this.prototype;
+}
+
 ReferenceBinding resolve(LookupEnvironment environment, boolean convertGenericToRawType) {
-    ReferenceBinding targetType = this.resolvedType;
+	ReferenceBinding targetType;
+	if (this != this.prototype) { //$IDENTITY-COMPARISON$
+		targetType = this.prototype.resolve(environment, convertGenericToRawType);
+		if (convertGenericToRawType && targetType != null && targetType.isRawType()) {
+			targetType = (ReferenceBinding) environment.createAnnotatedType(targetType, this.typeAnnotations);
+		} else {
+			targetType = this.resolvedType;
+		}
+		return targetType;
+	}
+	targetType = this.resolvedType;
 	if (targetType == null) {
 		targetType = this.fPackage.getType0(this.compoundName[this.compoundName.length - 1]);
-		if (targetType == this) {
+		if (targetType == this) { //$IDENTITY-COMPARISON$
 			targetType = environment.askForType(this.compoundName);
 		}
-		if (targetType == null || targetType == this) { // could not resolve any better, error was already reported against it
+		if (targetType == null || targetType == this) { // could not resolve any better, error was already reported against it //$IDENTITY-COMPARISON$
 			// report the missing class file first - only if not resolving a previously missing type
 			if ((this.tagBits & TagBits.HasMissingType) == 0 && !environment.mayTolerateMissingType) {
 				environment.problemReporter.isClassPathCorrect(
@@ -72,18 +117,33 @@
 	return targetType;
 }
 void setResolvedType(ReferenceBinding targetType, LookupEnvironment environment) {
-	if (this.resolvedType == targetType) return; // already resolved
+	if (this.resolvedType == targetType) return; // already resolved //$IDENTITY-COMPARISON$
 
 	// targetType may be a source or binary type
 	this.resolvedType = targetType;
+	environment.updateCaches(this, targetType);
 	// must ensure to update any other type bindings that can contain the resolved type
 	// otherwise we could create 2 : 1 for this unresolved type & 1 for the resolved type
 	if (this.wrappers != null)
 		for (int i = 0, l = this.wrappers.length; i < l; i++)
 			this.wrappers[i].swapUnresolved(this, targetType, environment);
-	environment.updateCaches(this, targetType);
 }
+
+public void swapUnresolved(UnresolvedReferenceBinding unresolvedType, ReferenceBinding unannotatedType, LookupEnvironment environment) {
+	if (this.resolvedType != null) return;
+	ReferenceBinding annotatedType = (ReferenceBinding) unannotatedType.clone(null);
+	this.resolvedType = annotatedType;
+	annotatedType.setTypeAnnotations(getTypeAnnotations(), environment.globalOptions.isAnnotationBasedNullAnalysisEnabled);
+	annotatedType.id = unannotatedType.id = this.id;
+	environment.updateCaches(this, annotatedType);
+	if (this.wrappers != null)
+		for (int i = 0, l = this.wrappers.length; i < l; i++)
+			this.wrappers[i].swapUnresolved(this, annotatedType, environment);
+}
+
 public String toString() {
+	if (this.hasTypeAnnotations())
+		return super.annotatedDebugName() + "(unresolved)"; //$NON-NLS-1$
 	return "Unresolved type " + ((this.compoundName != null) ? CharOperation.toString(this.compoundName) : "UNNAMED"); //$NON-NLS-1$ //$NON-NLS-2$
 }
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.java
index f12c781..720fa69 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.java
@@ -4,11 +4,12 @@
  * 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
  *     Stephan Herrmann - Contribution for
  *								bug 331649 - [compiler][null] consider null annotations for fields
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
@@ -44,9 +45,11 @@
 	public final boolean isBlankFinal(){
 		return (this.modifiers & ExtraCompilerModifiers.AccBlankFinal) != 0;
 	}
-	/* Answer true if the receiver is final and cannot be changed
-	*/
 
+	/* Answer true if the receiver is explicitly or implicitly final
+	 * and cannot be changed. Resources on try and multi catch variables are
+	 * marked as implicitly final.
+	*/
 	public final boolean isFinal() {
 		return (this.modifiers & ClassFileConstants.AccFinal) != 0;
 	}
@@ -57,12 +60,16 @@
 
 	/** Answer true if null annotations are enabled and this field is specified @NonNull */
 	public boolean isNonNull() {
-		return (this.tagBits & TagBits.AnnotationNonNull) != 0;
+		return (this.tagBits & TagBits.AnnotationNonNull) != 0
+				|| (this.type != null 
+					&& (this.type.tagBits & TagBits.AnnotationNonNull) != 0);
 	}
 
 	/** Answer true if null annotations are enabled and this field is specified @Nullable */
 	public boolean isNullable() {
-		return (this.tagBits & TagBits.AnnotationNullable) != 0;
+		return (this.tagBits & TagBits.AnnotationNullable) != 0
+				|| (this.type != null 
+				&& (this.type.tagBits & TagBits.AnnotationNullable) != 0);
 	}
 
 	public char[] readableName() {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VoidTypeBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VoidTypeBinding.java
new file mode 100644
index 0000000..f22027c
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/VoidTypeBinding.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.lookup;
+
+// Give it an identity of its own to discriminate the fact that this type is not annotatable and so is a singleton.
+public class VoidTypeBinding extends BaseTypeBinding {
+
+	VoidTypeBinding() {
+		super(TypeIds.T_void, TypeConstants.VOID, new char[] { 'V' });
+	}
+	
+	public TypeBinding clone(TypeBinding enclosingType) {
+		return this;  // enforce solitude.
+	}
+	
+	public void setTypeAnnotations(AnnotationBinding[] annotations, boolean evalNullAnnotations) {
+		return; // reject misguided attempt.
+	}
+	
+	public TypeBinding unannotated() {
+		return this;
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.java
index 4b67164..087d9f3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2013 IBM Corporation and others.
+ * Copyright (c) 2005, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -15,14 +11,22 @@
  *     							bug 349326 - [1.7] new warning for missing try-with-resources
  *     							bug 359362 - FUP of bug 349326: Resource leak on non-Closeable resource
  *								bug 358903 - Filter practically unimportant resource leak warnings
+ *								Bug 417295 - [1.8[[null] Massage type annotated null analysis to gel well with deep encoded type bindings.
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 423504 - [1.8] Implement "18.5.3 Functional Interface Parameterization Inference"
+ *								Bug 426676 - [1.8][compiler] Wrong generic method type inferred from lambda expression
+ *								Bug 427411 - [1.8][generics] JDT reports type mismatch when using method that returns generic type
+ *								Bug 428019 - [1.8][compiler] Type inference failure with nested generic invocation.
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.lookup;
 
 import java.util.List;
+import java.util.Set;
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 /*
  * A wildcard acts as an argument for parameterized types, allowing to
@@ -51,12 +55,6 @@
 		this.modifiers = ClassFileConstants.AccPublic | ExtraCompilerModifiers.AccGenericSignature; // treat wildcard as public
 		this.environment = environment;
 		initialize(genericType, bound, otherBounds);
-
-//		if (!genericType.isGenericType() && !(genericType instanceof UnresolvedReferenceBinding)) {
-//			RuntimeException e = new RuntimeException("WILDCARD with NON GENERIC");
-//			e.printStackTrace();
-//			throw e;
-//		}
 		if (genericType instanceof UnresolvedReferenceBinding)
 			((UnresolvedReferenceBinding) genericType).addWrapper(this, environment);
 		if (bound instanceof UnresolvedReferenceBinding)
@@ -65,6 +63,37 @@
 		this.typeBits = TypeIds.BitUninitialized;
 	}
 
+	TypeBinding bound() {
+		return this.bound;
+	}
+	
+	int boundKind() {
+		return this.boundKind;
+	}
+	
+	public TypeBinding allBounds() {
+		if (this.otherBounds == null || this.otherBounds.length == 0)
+			return this.bound;
+		ReferenceBinding[] allBounds = new ReferenceBinding[this.otherBounds.length+1];
+		try {
+			allBounds[0] = (ReferenceBinding) this.bound;
+			System.arraycopy(this.otherBounds, 0, allBounds, 1, this.otherBounds.length);
+		} catch (ClassCastException cce) {
+			return this.bound;
+		} catch (ArrayStoreException ase) {
+			return this.bound;
+		}
+		return new IntersectionCastTypeBinding(allBounds, this.environment);
+	}
+
+	public ReferenceBinding actualType() {
+		return this.genericType;
+	}
+	
+	TypeBinding[] additionalBounds() {
+		return this.otherBounds;
+	}
+	
 	public int kind() {
 		return this.otherBounds == null ? Binding.WILDCARD_TYPE : Binding.INTERSECTION_TYPE;
 	}
@@ -122,6 +151,7 @@
 		if (actualType.isCapture()) {
 			CaptureBinding capture = (CaptureBinding) actualType;
 			actualType = capture.wildcard;
+			// this method should only be called in 1.7- inference, hence we don't expect to see CaptureBinding18 here.
 		}
 
 		switch (constraint) {
@@ -381,6 +411,32 @@
 		return erasure().constantPoolName();
 	}
 
+	public TypeBinding clone(TypeBinding immaterial) {
+		return new WildcardBinding(this.genericType, this.rank, this.bound, this.otherBounds, this.boundKind, this.environment);
+	}
+	
+	public String annotatedDebugName() {
+		StringBuffer buffer = new StringBuffer(16);
+		AnnotationBinding [] annotations = getTypeAnnotations();
+		for (int i = 0, length = annotations == null ? 0 : annotations.length; i < length; i++) {
+			buffer.append(annotations[i]);
+			buffer.append(' ');
+		}
+		switch (this.boundKind) {
+            case Wildcard.UNBOUND :
+                return buffer.append(TypeConstants.WILDCARD_NAME).toString();
+            case Wildcard.EXTENDS :
+            	if (this.otherBounds == null)
+                	return buffer.append(CharOperation.concat(TypeConstants.WILDCARD_NAME, TypeConstants.WILDCARD_EXTENDS, this.bound.annotatedDebugName().toCharArray())).toString();
+            	buffer.append(this.bound.annotatedDebugName());
+            	for (int i = 0, length = this.otherBounds.length; i < length; i++) {
+            		buffer.append(" & ").append(this.otherBounds[i].annotatedDebugName()); //$NON-NLS-1$
+            	}
+            	return buffer.toString();
+			default: // SUPER
+			    return buffer.append(CharOperation.concat(TypeConstants.WILDCARD_NAME, TypeConstants.WILDCARD_SUPER, this.bound.annotatedDebugName().toCharArray())).toString();
+        }
+	}
 	/**
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding#debugName()
 	 */
@@ -451,12 +507,13 @@
 			this.fPackage = someGenericType.getPackage();
 		}
 		if (someBound != null) {
-			this.tagBits |= someBound.tagBits & (TagBits.HasTypeVariable | TagBits.HasMissingType | TagBits.ContainsNestedTypeReferences);
+			this.tagBits |= someBound.tagBits & (TagBits.HasTypeVariable | TagBits.HasMissingType | TagBits.ContainsNestedTypeReferences | 
+					TagBits.HasNullTypeAnnotation | TagBits.HasCapturedWildcard);
 		}
 		if (someOtherBounds != null) {
 			for (int i = 0, max = someOtherBounds.length; i < max; i++) {
 				TypeBinding someOtherBound = someOtherBounds[i];
-				this.tagBits |= someOtherBound.tagBits & TagBits.ContainsNestedTypeReferences;
+				this.tagBits |= someOtherBound.tagBits & (TagBits.ContainsNestedTypeReferences | TagBits.HasNullTypeAnnotation | TagBits.HasCapturedWildcard);
 			}
 		}
 	}
@@ -482,11 +539,81 @@
     	return this.otherBounds != null;
     }
 
+    @Override
+    public ReferenceBinding[] getIntersectingTypes() {
+    	if (isIntersectionType()) {
+    		ReferenceBinding[] allBounds = new ReferenceBinding[this.otherBounds.length+1];
+    		try {
+    			allBounds[0] = (ReferenceBinding) this.bound;
+    			System.arraycopy(this.otherBounds, 0, allBounds, 1, this.otherBounds.length);
+    		} catch (ClassCastException cce) {
+    			return null;
+    		} catch (ArrayStoreException ase) {
+    			return null;
+    		}
+    		return allBounds;
+    	}
+    	return null;
+    }
+
 	public boolean isHierarchyConnected() {
 		return this.superclass != null && this.superInterfaces != null;
 	}
 
-    /**
+	// to prevent infinite recursion when inspecting recursive generics:
+	boolean inRecursiveFunction = false;
+
+	public boolean isProperType(boolean admitCapture18) {
+		if (this.inRecursiveFunction)
+			return true;
+		this.inRecursiveFunction = true;
+		try {
+			if (this.bound != null && !this.bound.isProperType(admitCapture18))
+				return false;
+			if (this.superclass != null && !this.superclass.isProperType(admitCapture18))
+				return false;
+			if (this.superInterfaces != null)
+				for (int i = 0, l = this.superInterfaces.length; i < l; i++)
+					if (!this.superInterfaces[i].isProperType(admitCapture18))
+						return false;
+			return true;
+		} finally {
+			this.inRecursiveFunction = false;
+		}
+	}
+
+	TypeBinding substituteInferenceVariable(InferenceVariable var, TypeBinding substituteType) {
+		boolean haveSubstitution = false;
+		TypeBinding currentBound = this.bound;
+		if (currentBound != null) {
+			currentBound = currentBound.substituteInferenceVariable(var, substituteType);
+			haveSubstitution |= TypeBinding.notEquals(currentBound, this.bound);
+		}
+		TypeBinding[] currentOtherBounds = null;
+		if (this.otherBounds != null) {
+			int length = this.otherBounds.length;
+			if (haveSubstitution)
+				System.arraycopy(this.otherBounds, 0, currentOtherBounds=new ReferenceBinding[length], 0, length);
+			for (int i = 0; i < length; i++) {
+				TypeBinding currentOtherBound = this.otherBounds[i];
+				if (currentOtherBound != null) {
+					currentOtherBound = currentOtherBound.substituteInferenceVariable(var, substituteType);
+					if (TypeBinding.notEquals(currentOtherBound, this.otherBounds[i])) {
+						if (currentOtherBounds == null)
+							System.arraycopy(this.otherBounds, 0, currentOtherBounds=new ReferenceBinding[length], 0, length);
+						currentOtherBounds[i] = currentOtherBound;
+					}
+				}
+			}
+		}
+		haveSubstitution |= currentOtherBounds != null;
+		if (haveSubstitution) {
+			return this.environment.createWildcard(this.genericType, this.rank, currentBound, currentOtherBounds, this.boundKind);
+		}
+		return this;
+	}
+
+	/**
 	 * Returns true if the type is a wildcard
 	 */
 	public boolean isUnboundWildcard() {
@@ -500,6 +627,10 @@
 	    return true;
 	}
 
+	int rank() {
+		return this.rank;
+	}
+	
     /* (non-Javadoc)
      * @see org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding#readableName()
      */
@@ -524,6 +655,33 @@
         }
     }
 
+    public char[] nullAnnotatedReadableName(CompilerOptions options, boolean shortNames) {
+    	StringBuffer buffer = new StringBuffer(10);
+    	appendNullAnnotation(buffer, options);
+        switch (this.boundKind) {
+            case Wildcard.UNBOUND :
+                buffer.append(TypeConstants.WILDCARD_NAME);
+                break;
+            case Wildcard.EXTENDS :
+            	if (this.otherBounds == null) {
+            		buffer.append(TypeConstants.WILDCARD_NAME).append(TypeConstants.WILDCARD_EXTENDS);
+            		buffer.append(this.bound.nullAnnotatedReadableName(options, shortNames));
+            	} else {
+	            	buffer.append(this.bound.nullAnnotatedReadableName(options, shortNames));
+	            	for (int i = 0, length = this.otherBounds.length; i < length; i++) {
+	            		buffer.append('&').append(this.otherBounds[i].nullAnnotatedReadableName(options, shortNames));
+	            	}
+            	}
+            	break;
+			default: // SUPER
+			    buffer.append(TypeConstants.WILDCARD_NAME).append(TypeConstants.WILDCARD_SUPER).append(this.bound.nullAnnotatedReadableName(options, shortNames));
+        }
+        int length;
+        char[] result = new char[length = buffer.length()];
+        buffer.getChars(0, length, result, 0);
+        return result;
+    }
+
 	ReferenceBinding resolve() {
 		if ((this.tagBits & TagBits.HasUnresolvedTypeVariables) == 0)
 			return this;
@@ -534,17 +692,17 @@
 			case Wildcard.EXTENDS :
 				TypeBinding resolveType = BinaryTypeBinding.resolveType(this.bound, this.environment, true /* raw conversion */);
 				this.bound = resolveType;
-				this.tagBits |= resolveType.tagBits & TagBits.ContainsNestedTypeReferences;
+				this.tagBits |= resolveType.tagBits & TagBits.ContainsNestedTypeReferences | TagBits.HasCapturedWildcard;
 				for (int i = 0, length = this.otherBounds == null ? 0 : this.otherBounds.length; i < length; i++) {
 					resolveType = BinaryTypeBinding.resolveType(this.otherBounds[i], this.environment, true /* raw conversion */);
 					this.otherBounds[i]= resolveType;
-					this.tagBits |= resolveType.tagBits & TagBits.ContainsNestedTypeReferences;
+					this.tagBits |= resolveType.tagBits & TagBits.ContainsNestedTypeReferences | TagBits.HasCapturedWildcard;
 				}
 				break;
 			case Wildcard.SUPER :
 				resolveType = BinaryTypeBinding.resolveType(this.bound, this.environment, true /* raw conversion */);
 				this.bound = resolveType;
-				this.tagBits |= resolveType.tagBits & TagBits.ContainsNestedTypeReferences;
+				this.tagBits |= resolveType.tagBits & TagBits.ContainsNestedTypeReferences | TagBits.HasCapturedWildcard;
 				break;
 			case Wildcard.UNBOUND :
 		}
@@ -659,17 +817,17 @@
 
 	public void swapUnresolved(UnresolvedReferenceBinding unresolvedType, ReferenceBinding resolvedType, LookupEnvironment env) {
 		boolean affected = false;
-		if (this.genericType == unresolvedType) {
+		if (this.genericType == unresolvedType) { //$IDENTITY-COMPARISON$
 			this.genericType = resolvedType; // no raw conversion
 			affected = true;
 		}
-		if (this.bound == unresolvedType) {
+		if (this.bound == unresolvedType) { //$IDENTITY-COMPARISON$
 			this.bound = env.convertUnresolvedBinaryToRawType(resolvedType);
 			affected = true;
 		}
 		if (this.otherBounds != null) {
 			for (int i = 0, length = this.otherBounds.length; i < length; i++) {
-				if (this.otherBounds[i] == unresolvedType) {
+				if (this.otherBounds[i] == unresolvedType) { //$IDENTITY-COMPARISON$
 					this.otherBounds[i] = env.convertUnresolvedBinaryToRawType(resolvedType);
 					affected = true;
 				}
@@ -683,6 +841,8 @@
 	 * @see java.lang.Object#toString()
 	 */
 	public String toString() {
+		if (this.hasTypeAnnotations())
+			return annotatedDebugName();
         switch (this.boundKind) {
             case Wildcard.UNBOUND :
                 return new String(TypeConstants.WILDCARD_NAME);
@@ -709,4 +869,41 @@
 		}
 		return this.typeVariable;
 	}
+
+	public TypeBinding unannotated() {
+		return this.hasTypeAnnotations() ? this.environment.getUnannotatedType(this) : this;
+	}
+	@Override
+	public TypeBinding uncapture(Scope scope) {
+		if ((this.tagBits & TagBits.HasCapturedWildcard) == 0)
+			return this;
+		TypeBinding freeBound = this.bound != null ? this.bound.uncapture(scope) : null;
+		int length = 0;
+		TypeBinding [] freeOtherBounds = this.otherBounds == null ? null : new TypeBinding[length = this.otherBounds.length];
+		for (int i = 0; i < length; i++) {
+			freeOtherBounds[i] = this.otherBounds[i] == null ? null : this.otherBounds[i].uncapture(scope);
+		}
+		return scope.environment().createWildcard(this.genericType, this.rank, freeBound, freeOtherBounds, this.boundKind, getTypeAnnotations());
+	}
+	@Override
+	void collectInferenceVariables(Set<InferenceVariable> variables) {
+		if (this.bound != null)
+			this.bound.collectInferenceVariables(variables);
+		if (this.otherBounds != null)
+			for (int i = 0, length = this.otherBounds.length; i < length; i++)
+				this.otherBounds[i].collectInferenceVariables(variables);
+	}
+	@Override
+	public boolean mentionsAny(TypeBinding[] parameters, int idx) {
+		if (super.mentionsAny(parameters, idx))
+			return true;
+		if (this.bound != null && 	this.bound.mentionsAny(parameters, -1))
+			return true;
+		if (this.otherBounds != null) {
+			for (int i = 0, length = this.otherBounds.length; i < length; i++)
+				if (this.otherBounds[i].mentionsAny(parameters, -1))
+					return true;
+		}
+		return false;
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
index a6e9e71..df13787 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
@@ -21,6 +21,7 @@
 /**
  * Parser specialized for decoding javadoc comments
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class AbstractCommentParser implements JavadocTagConstants {
 
 	// Kind of comment parser
@@ -526,8 +527,8 @@
 			isVarargs = false;
 			if (readToken() == TerminalTokens.TokenNameLBRACKET) {
 				// array declaration
-				int dimStart = this.scanner.getCurrentTokenStartPosition();
 				while (readToken() == TerminalTokens.TokenNameLBRACKET) {
+					int dimStart = this.scanner.getCurrentTokenStartPosition();
 					consumeToken();
 					if (readToken() != TerminalTokens.TokenNameRBRACKET) {
 						break nextArg;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/CommitRollbackParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/CommitRollbackParser.java
new file mode 100644
index 0000000..8cfabf4
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/CommitRollbackParser.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * 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.aspectj.org.eclipse.jdt.internal.compiler.parser;
+
+import org.aspectj.org.eclipse.jdt.core.compiler.InvalidInputException;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
+
+public abstract class CommitRollbackParser implements TerminalTokens, ParserBasicInformation {
+	
+	// resumeOnSyntaxError codes:
+	protected static final int HALT = 0;     // halt and throw up hands.
+	protected static final int RESTART = 1;  // stacks adjusted, alternate goal from check point.
+	protected static final int RESUME = 2;   // stacks untouched, just continue from where left off.
+
+	public Scanner scanner;
+	public int currentToken;
+	
+	public CommitRollbackParser snapShot;
+	private static final int[] RECOVERY_TOKENS = new int [] { TokenNameSEMICOLON, TokenNameRPAREN,};
+	
+	protected CommitRollbackParser createSnapShotParser() {
+		return new Parser();
+	}
+	
+	protected void commit() {
+		if (this.snapShot == null) {
+			this.snapShot = createSnapShotParser();
+		}
+		this.snapShot.copyState(this);
+	}
+	
+	public void copyState(CommitRollbackParser commitRollbackParser) {
+		// Subclasses should implement.
+	}
+
+	protected int getNextToken() {
+		try {
+			return this.scanner.getNextToken();
+		} catch (InvalidInputException e) {
+			return TokenNameEOF;
+		}
+	}
+	
+	protected void shouldStackAssistNode() {
+		// Not relevant here.
+	}
+	
+	// We get here on real syntax error or syntax error triggered by fake EOF at completion site, never due to triggered recovery.
+	protected int fallBackToSpringForward(Statement unused) {
+		int nextToken;
+		boolean atCompletionSite = false;
+		int automatonState = automatonState();
+				
+		// If triggered fake EOF at completion site, see if the real next token would have passed muster.
+		if (this.currentToken == TokenNameEOF) {
+			if (this.scanner.eofPosition < this.scanner.source.length) {
+				atCompletionSite = true;
+				this.scanner.eofPosition = this.scanner.source.length;
+				nextToken = getNextToken();
+				if (automatonWillShift(nextToken, automatonState)) {
+					this.currentToken = nextToken;
+					return RESUME;
+				}
+			} else {
+				nextToken = TokenNameEOF;
+			}
+		} else {
+			nextToken = this.currentToken;
+		}
+		if (nextToken == TokenNameEOF)
+			return HALT; // don't know how to proceed.
+		this.scanner.ungetToken(nextToken); // spit out what has been bitten more than we can chew.
+		// OK, next token is no good to resume "in place", attempt some local repair. FIXME: need to make sure we don't get stuck keep reducing empty statements !!
+		for (int i = 0, length = RECOVERY_TOKENS.length; i < length; i++) {
+			if (automatonWillShift(RECOVERY_TOKENS[i], automatonState)) {
+				this.currentToken = RECOVERY_TOKENS[i];
+				return RESUME;
+			}
+		}
+		// OK, no in place resumption, no local repair, fast forward to next statement.
+		if (this.snapShot == null)
+			return RESTART;
+
+		this.copyState(this.snapShot);
+		if (atCompletionSite) {
+			this.currentToken = TokenNameSEMICOLON;
+			shouldStackAssistNode();
+			return RESUME;
+		}
+		this.currentToken = this.scanner.fastForward(unused);
+		return RESUME;
+	}
+
+	public abstract int automatonState();
+
+	public abstract boolean automatonWillShift(int nextToken, int lastAction);
+}
+
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ConflictedParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ConflictedParser.java
index 67aa6c2..ecfb5c1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ConflictedParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ConflictedParser.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.java
index e21beae..405dcb7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser.java
index e08d4bf..41c43d5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/Parser.java
@@ -448,7 +448,7 @@
 
 	protected void consumeAroundDeclaration() {
 		// AroundDeclaration ::= AroundHeader MethodBody
-		consumeMethodDeclaration(true);
+		consumeMethodDeclaration(true,false);
 	}
 
 	protected void consumeAroundHeader() {
@@ -518,7 +518,7 @@
 	
 	protected void consumeBasicAdviceDeclaration() {
 		// BasicAdviceDeclaration ::= BasicAdviceHeader MethodBody
-		consumeMethodDeclaration(true);
+		consumeMethodDeclaration(true,false);
 	}
 
 	protected void consumeBasicAdviceHeader() {
@@ -749,7 +749,7 @@
 	}
 
 	protected void consumeInterTypeMethodDeclaration(boolean isNotAbstract) {
-		consumeMethodDeclaration(isNotAbstract);
+		consumeMethodDeclaration(isNotAbstract,false);
 	}
 
 	protected void consumeInterTypeMethodHeader() {
@@ -757,7 +757,7 @@
 	}
 
 	protected void consumeInterTypeConstructorDeclaration() {
-		consumeMethodDeclaration(true);
+		consumeMethodDeclaration(true,false);
 	}
 
 	protected void consumeInterTypeConstructorHeader() {
@@ -1000,2468 +1000,2477 @@
 	}
 	// This method is part of an automatic generation : do NOT edit-modify
 	protected void consumeRule(int act) {
-	  switch ( act ) {
-	    case 38 : if (DEBUG) { System.out.println("Type ::= PrimitiveType"); }  //$NON-NLS-1$
-			    consumePrimitiveType();  
-				break;
-	 
-	    case 52 : if (DEBUG) { System.out.println("ReferenceType ::= ClassOrInterfaceType"); }  //$NON-NLS-1$
-			    consumeReferenceType();  
-				break;
-	 
-	    case 56 : if (DEBUG) { System.out.println("ClassOrInterface ::= Name"); }  //$NON-NLS-1$
-			    consumeClassOrInterfaceName();  
-				break;
-	 
-	    case 57 : if (DEBUG) { System.out.println("ClassOrInterface ::= GenericType DOT Name"); }  //$NON-NLS-1$
-			    consumeClassOrInterface();  
-				break;
-	 
-	    case 58 : if (DEBUG) { System.out.println("GenericType ::= ClassOrInterface TypeArguments"); }  //$NON-NLS-1$
-			    consumeGenericType();  
-				break;
-	 
-	    case 59 : if (DEBUG) { System.out.println("GenericType ::= ClassOrInterface LESS GREATER"); }  //$NON-NLS-1$
-			    consumeGenericTypeWithDiamond();  
-				break;
-	 
-	    case 60 : if (DEBUG) { System.out.println("ArrayTypeWithTypeArgumentsName ::= GenericType DOT Name"); }  //$NON-NLS-1$
-			    consumeArrayTypeWithTypeArgumentsName();  
-				break;
-	 
-	    case 61 : if (DEBUG) { System.out.println("ArrayType ::= PrimitiveType Dims"); }  //$NON-NLS-1$
-			    consumePrimitiveArrayType();  
-				break;
-	 
-	    case 62 : if (DEBUG) { System.out.println("ArrayType ::= Name Dims"); }  //$NON-NLS-1$
-			    consumeNameArrayType();  
-				break;
-	 
-	    case 63 : if (DEBUG) { System.out.println("ArrayType ::= ArrayTypeWithTypeArgumentsName Dims"); }  //$NON-NLS-1$
-			    consumeGenericTypeNameArrayType();  
-				break;
-	 
-	    case 64 : if (DEBUG) { System.out.println("ArrayType ::= GenericType Dims"); }  //$NON-NLS-1$
-			    consumeGenericTypeArrayType();  
-				break;
-	 
-	    case 70 : if (DEBUG) { System.out.println("AjName ::= AjSimpleName"); }  //$NON-NLS-1$
-			    consumeZeroTypeAnnotations();  
-				break;
-	 
-	    case 71 : if (DEBUG) { System.out.println("AjName ::= AjQualifiedName"); }  //$NON-NLS-1$
-			    consumeZeroTypeAnnotations();  
-				break;
-	 
-	    case 80 : if (DEBUG) { System.out.println("AjQualifiedName ::= AjName DOT SimpleNameOrAj"); }  //$NON-NLS-1$
-			    consumeQualifiedName();  
-				break;
-	 
-	    case 83 : if (DEBUG) { System.out.println("Name ::= SimpleName"); }  //$NON-NLS-1$
-			    consumeZeroTypeAnnotations();  
-				break;
-	 
-	    case 88 : if (DEBUG) { System.out.println("UnannotatableName ::= UnannotatableName DOT SimpleName"); }  //$NON-NLS-1$
-			    consumeUnannotatableQualifiedName();  
-				break;
-	 
-	    case 89 : if (DEBUG) { System.out.println("QualifiedName ::= Name DOT JavaIdentifier"); }  //$NON-NLS-1$
-			    consumeQualifiedName(false);  
-				break;
-	 
-	    case 90 : if (DEBUG) { System.out.println("QualifiedName ::= Name DOT TypeAnnotations JavaIdentifier"); }  //$NON-NLS-1$
-			    consumeQualifiedName(true);  
-				break;
-	 
-	    case 91 : if (DEBUG) { System.out.println("TypeAnnotationsopt ::="); }  //$NON-NLS-1$
-			    consumeZeroTypeAnnotations();  
-				break;
-	 
-	     case 95 : if (DEBUG) { System.out.println("TypeAnnotations0 ::= TypeAnnotations0 TypeAnnotation"); }  //$NON-NLS-1$
-			    consumeOneMoreTypeAnnotation();  
-				break;
-	 
-	     case 96 : if (DEBUG) { System.out.println("TypeAnnotation ::= NormalTypeAnnotation"); }  //$NON-NLS-1$
-			    consumeTypeAnnotation();  
-				break;
-	 
-	     case 97 : if (DEBUG) { System.out.println("TypeAnnotation ::= MarkerTypeAnnotation"); }  //$NON-NLS-1$
-			    consumeTypeAnnotation();  
-				break;
-	 
-	     case 98 : if (DEBUG) { System.out.println("TypeAnnotation ::= SingleMemberTypeAnnotation"); }  //$NON-NLS-1$
-			    consumeTypeAnnotation();  
-				break;
-	 
-	    case 99 : if (DEBUG) { System.out.println("TypeAnnotationName ::= AT308 UnannotatableName"); }  //$NON-NLS-1$
-			    consumeAnnotationName() ;  
-				break;
-	 
-	    case 100 : if (DEBUG) { System.out.println("NormalTypeAnnotation ::= TypeAnnotationName LPAREN..."); }  //$NON-NLS-1$
-			    consumeNormalAnnotation(true) ;  
-				break;
-	 
-	    case 101 : if (DEBUG) { System.out.println("MarkerTypeAnnotation ::= TypeAnnotationName"); }  //$NON-NLS-1$
-			    consumeMarkerAnnotation(true) ;  
-				break;
-	 
-	    case 102 : if (DEBUG) { System.out.println("SingleMemberTypeAnnotation ::= TypeAnnotationName LPAREN"); }  //$NON-NLS-1$
-			    consumeSingleMemberAnnotation(true) ;  
-				break;
-	 
-	    case 103 : if (DEBUG) { System.out.println("RejectTypeAnnotations ::="); }  //$NON-NLS-1$
-			    consumeNonTypeUseName();  
-				break;
-	 
-	    case 104 : if (DEBUG) { System.out.println("PushZeroTypeAnnotations ::="); }  //$NON-NLS-1$
-			    consumeZeroTypeAnnotations();  
-				break;
-	 
-	    case 105 : if (DEBUG) { System.out.println("VariableDeclaratorIdOrThis ::= this"); }  //$NON-NLS-1$
-			    consumeExplicitThisParameter(false);  
-				break;
-	 
-	    case 106 : if (DEBUG) { System.out.println("VariableDeclaratorIdOrThis ::= UnannotatableName DOT..."); }  //$NON-NLS-1$
-			    consumeExplicitThisParameter(true);  
-				break;
-	 
-	    case 107 : if (DEBUG) { System.out.println("VariableDeclaratorIdOrThis ::= VariableDeclaratorId"); }  //$NON-NLS-1$
-			    consumeVariableDeclaratorIdParameter();  
-				break;
-	 
-	    case 108 : if (DEBUG) { System.out.println("CompilationUnit ::= EnterCompilationUnit..."); }  //$NON-NLS-1$
-			    consumeCompilationUnit();  
-				break;
-	 
-	    case 109 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= PackageDeclaration"); }  //$NON-NLS-1$
-			    consumeInternalCompilationUnit();  
-				break;
-	 
-	    case 110 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= PackageDeclaration..."); }  //$NON-NLS-1$
-			    consumeInternalCompilationUnit();  
-				break;
-	 
-	    case 111 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= PackageDeclaration..."); }  //$NON-NLS-1$
-			    consumeInternalCompilationUnitWithTypes();  
-				break;
-	 
-	    case 112 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= PackageDeclaration..."); }  //$NON-NLS-1$
-			    consumeInternalCompilationUnitWithTypes();  
-				break;
-	 
-	    case 113 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= ImportDeclarations..."); }  //$NON-NLS-1$
-			    consumeInternalCompilationUnit();  
-				break;
-	 
-	    case 114 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= TypeDeclarations"); }  //$NON-NLS-1$
-			    consumeInternalCompilationUnitWithTypes();  
-				break;
-	 
-	    case 115 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= ImportDeclarations..."); }  //$NON-NLS-1$
-			    consumeInternalCompilationUnitWithTypes();  
-				break;
-	 
-	    case 116 : if (DEBUG) { System.out.println("InternalCompilationUnit ::="); }  //$NON-NLS-1$
-			    consumeEmptyInternalCompilationUnit();  
-				break;
-	 
-	    case 117 : if (DEBUG) { System.out.println("ReduceImports ::="); }  //$NON-NLS-1$
-			    consumeReduceImports();  
-				break;
-	 
-	    case 118 : if (DEBUG) { System.out.println("EnterCompilationUnit ::="); }  //$NON-NLS-1$
-			    consumeEnterCompilationUnit();  
-				break;
-	 
-	    case 134 : if (DEBUG) { System.out.println("CatchHeader ::= catch LPAREN CatchFormalParameter RPAREN"); }  //$NON-NLS-1$
-			    consumeCatchHeader();  
-				break;
-	 
-	    case 136 : if (DEBUG) { System.out.println("ImportDeclarations ::= ImportDeclarations..."); }  //$NON-NLS-1$
-			    consumeImportDeclarations();  
-				break;
-	 
-	    case 138 : if (DEBUG) { System.out.println("TypeDeclarations ::= TypeDeclarations TypeDeclaration"); }  //$NON-NLS-1$
-			    consumeTypeDeclarations();  
-				break;
-	 
-	    case 139 : if (DEBUG) { System.out.println("PackageDeclaration ::= PackageDeclarationName SEMICOLON"); }  //$NON-NLS-1$
-			    consumePackageDeclaration();  
-				break;
-	 
-	    case 140 : if (DEBUG) { System.out.println("PackageDeclarationName ::= Modifiers package..."); }  //$NON-NLS-1$
-			    consumePackageDeclarationNameWithModifiers();  
-				break;
-	 
-	    case 141 : if (DEBUG) { System.out.println("PackageDeclarationName ::= PackageComment package Name"); }  //$NON-NLS-1$
-			    consumePackageDeclarationName();  
-				break;
-	 
-	    case 142 : if (DEBUG) { System.out.println("PackageComment ::="); }  //$NON-NLS-1$
-			    consumePackageComment();  
-				break;
-	 
-	    case 147 : if (DEBUG) { System.out.println("SingleTypeImportDeclaration ::=..."); }  //$NON-NLS-1$
-			    consumeImportDeclaration();  
-				break;
-	 
-	    case 148 : if (DEBUG) { System.out.println("SingleTypeImportDeclarationName ::= import Name..."); }  //$NON-NLS-1$
-			    consumeSingleTypeImportDeclarationName();  
-				break;
-	 
-	    case 149 : if (DEBUG) { System.out.println("TypeImportOnDemandDeclaration ::=..."); }  //$NON-NLS-1$
-			    consumeImportDeclaration();  
-				break;
-	 
-	    case 150 : if (DEBUG) { System.out.println("TypeImportOnDemandDeclarationName ::= import Name DOT..."); }  //$NON-NLS-1$
-			    consumeTypeImportOnDemandDeclarationName();  
-				break;
-	 
-	     case 153 : if (DEBUG) { System.out.println("TypeDeclaration ::= SEMICOLON"); }  //$NON-NLS-1$
-			    consumeEmptyTypeDeclaration();  
-				break;
-	 
-	    case 157 : if (DEBUG) { System.out.println("Modifiers ::= Modifiers Modifier"); }  //$NON-NLS-1$
-			    consumeModifiers2();  
-				break;
-	 
-	    case 170 : if (DEBUG) { System.out.println("Modifier ::= Annotation"); }  //$NON-NLS-1$
-			    consumeAnnotationAsModifier();  
-				break;
-	 
-	    case 183 : if (DEBUG) { System.out.println("AspectDeclaration ::= AspectHeader AspectBody"); }  //$NON-NLS-1$
-			    consumeAspectDeclaration();  
-				break;
-	 
-	    case 184 : if (DEBUG) { System.out.println("AspectHeader ::= AspectHeaderName ClassHeaderExtendsopt"); }  //$NON-NLS-1$
-			    consumeAspectHeader();  
-				break;
-	 
-	    case 187 : if (DEBUG) { System.out.println("AspectHeaderName ::= AspectHeaderName1 TypeParameters"); }  //$NON-NLS-1$
-			    consumeAspectHeaderNameWithTypeParameters(false);  
-				break;
-	 
-	    case 188 : if (DEBUG) { System.out.println("AspectHeaderName ::= AspectHeaderName2 TypeParameters"); }  //$NON-NLS-1$
-			    consumeAspectHeaderNameWithTypeParameters(true);  
-				break;
-	 
-	    case 189 : if (DEBUG) { System.out.println("AspectHeaderName1 ::= Modifiersopt aspect Identifier"); }  //$NON-NLS-1$
-			    consumeAspectHeaderName(false);  
-				break;
-	 
-	    case 190 : if (DEBUG) { System.out.println("AspectHeaderName2 ::= Modifiersopt privileged..."); }  //$NON-NLS-1$
-			    consumeAspectHeaderName(true);  
-				break;
-	 
-	    case 192 : if (DEBUG) { System.out.println("AspectHeaderRest ::= AspectHeaderRestStart PseudoTokens"); }  //$NON-NLS-1$
-			    consumeAspectHeaderRest();  
-				break;
-	 
-	    case 193 : if (DEBUG) { System.out.println("AspectHeaderRestStart ::= Identifier"); }  //$NON-NLS-1$
-			    consumePseudoTokenIdentifier();  
-				break;
-	 
-	    case 196 : if (DEBUG) { System.out.println("AspectBodyDeclarations ::= AspectBodyDeclarations..."); }  //$NON-NLS-1$
-			    consumeClassBodyDeclarations();  
-				break;
-	 
-	    case 197 : if (DEBUG) { System.out.println("AspectBodyDeclarationsopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyClassBodyDeclarationsopt();  
-				break;
-	 
-	    case 198 : if (DEBUG) { System.out.println("AspectBodyDeclarationsopt ::= NestedType..."); }  //$NON-NLS-1$
-			    consumeClassBodyDeclarationsopt();  
-				break;
-	 
-	    case 199 : if (DEBUG) { System.out.println("AspectBodyDeclaration ::=..."); }  //$NON-NLS-1$
-			    consumeClassBodyDeclarationInAspect();  
-				break;
-	 
-	    case 203 : if (DEBUG) { System.out.println("ClassBodyDeclarationNoAroundMethod ::= Diet NestedMethod"); }  //$NON-NLS-1$
-			    consumeClassBodyDeclaration();  
-				break;
-	 
-	    case 213 : if (DEBUG) { System.out.println("ClassMemberDeclarationNoAroundMethod ::= SEMICOLON"); }  //$NON-NLS-1$
-			    consumeEmptyTypeDeclaration();  
-				break;
+switch ( act ) {
+ case 39 : if (DEBUG) { System.out.println("Type ::= PrimitiveType"); }  //$NON-NLS-1$
+		    consumePrimitiveType();  
+			break;
 
-	    case 215 : if (DEBUG) { System.out.println("MethodDeclarationNoAround ::= MethodHeaderNoAround..."); }  //$NON-NLS-1$
-			    // set to true to consume a method with a body
-	  consumeMethodDeclaration(true);   
-				break;
-	 
-	    case 216 : if (DEBUG) { System.out.println("AbstractMethodDeclarationNoAround ::=..."); }  //$NON-NLS-1$
-			    // set to false to consume a method without body
-	  consumeMethodDeclaration(false);  
-				break;
-	 
-	    case 217 : if (DEBUG) { System.out.println("MethodHeaderNoAround ::= MethodHeaderNameNoAround..."); }  //$NON-NLS-1$
-			    consumeMethodHeader();  
-				break;
-	 
-	    case 218 : if (DEBUG) { System.out.println("MethodHeaderNameNoAround ::= Modifiersopt TypeParameters"); }  //$NON-NLS-1$
-			    consumeMethodHeaderNameWithTypeParameters(false);  
-				break;
-	 
-	    case 219 : if (DEBUG) { System.out.println("MethodHeaderNameNoAround ::= Modifiersopt Type..."); }  //$NON-NLS-1$
-			    consumeMethodHeaderName(false);  
-				break;
-	 
-	    case 220 : if (DEBUG) { System.out.println("PointcutDeclaration ::= PointcutHeader..."); }  //$NON-NLS-1$
-			    consumeEmptyPointcutDeclaration();  
-				break;
-	 
-	    case 221 : if (DEBUG) { System.out.println("PointcutDeclaration ::= PointcutHeader..."); }  //$NON-NLS-1$
-			    consumePointcutDeclaration();  
-				break;
-	 
-	    case 222 : if (DEBUG) { System.out.println("PointcutHeader ::= Modifiersopt pointcut JavaIdentifier"); }  //$NON-NLS-1$
-			    consumePointcutHeader();  
-				break;
-	 
-	    case 225 : if (DEBUG) { System.out.println("AroundDeclaration ::= AroundHeader MethodBody"); }  //$NON-NLS-1$
-			    consumeAroundDeclaration();  
-				break;
-	 
-	    case 226 : if (DEBUG) { System.out.println("AroundHeader ::= AroundHeaderName FormalParameterListopt"); }  //$NON-NLS-1$
-			    consumeAroundHeader();  
-				break;
-	 
-	    case 227 : if (DEBUG) { System.out.println("AroundHeaderName ::= Modifiersopt Type around LPAREN"); }  //$NON-NLS-1$
-			    consumeAroundHeaderName();  
-				break;
-	 
-	    case 228 : if (DEBUG) { System.out.println("AroundHeaderName ::= Modifiersopt around LPAREN"); }  //$NON-NLS-1$
-			    consumeAroundHeaderNameMissingReturnType();  
-				break;
-	 
-	    case 229 : if (DEBUG) { System.out.println("BasicAdviceDeclaration ::= BasicAdviceHeader MethodBody"); }  //$NON-NLS-1$
-			    consumeBasicAdviceDeclaration();  
-				break;
-	 
-	    case 232 : if (DEBUG) { System.out.println("BeforeAdviceHeader ::= BeforeAdviceHeaderName..."); }  //$NON-NLS-1$
-			    consumeBasicAdviceHeader();  
-				break;
-	 
-	    case 233 : if (DEBUG) { System.out.println("AfterAdviceHeader ::= AfterAdviceHeaderName..."); }  //$NON-NLS-1$
-			    consumeBasicAdviceHeader();  
-				break;
-	 
-	    case 234 : if (DEBUG) { System.out.println("BeforeAdviceHeaderName ::= Modifiersopt before LPAREN"); }  //$NON-NLS-1$
-			    consumeBasicAdviceHeaderName(false);  
-				break;
-	 
-	    case 235 : if (DEBUG) { System.out.println("AfterAdviceHeaderName ::= Modifiersopt after LPAREN"); }  //$NON-NLS-1$
-			    consumeBasicAdviceHeaderName(true);  
-				break;
-	 
-	    case 236 : if (DEBUG) { System.out.println("ExtraParamopt ::= Identifier LPAREN FormalParameter..."); }  //$NON-NLS-1$
-			    consumeExtraParameterWithFormal();  
-				break;
-	 
-	    case 237 : if (DEBUG) { System.out.println("ExtraParamopt ::= Identifier LPAREN RPAREN"); }  //$NON-NLS-1$
-			    consumeExtraParameterNoFormal();  
-				break;
-	 
-	    case 238 : if (DEBUG) { System.out.println("ExtraParamopt ::= Identifier"); }  //$NON-NLS-1$
-			    consumeExtraParameterNoFormal();  
-				break;
-	 
-	    case 240 : if (DEBUG) { System.out.println("OnType ::= JavaIdentifier"); }  //$NON-NLS-1$
-			    consumeZeroTypeAnnotations();  
-				break;
-	 
-	    case 241 : if (DEBUG) { System.out.println("OnType ::= OnType DOT JavaIdentifier"); }  //$NON-NLS-1$
-			    consumeZeroTypeAnnotations(); consumeQualifiedName();  
-				break;
-	 
-	    case 246 : if (DEBUG) { System.out.println("InterTypeMethodDeclaration ::= InterTypeMethodHeader..."); }  //$NON-NLS-1$
-			    // set to true to consume a method with a body
-	  consumeInterTypeMethodDeclaration(true);   
-				break;
-	 
-	    case 247 : if (DEBUG) { System.out.println("InterTypeMethodHeader ::= InterTypeMethodHeaderName..."); }  //$NON-NLS-1$
-			    consumeInterTypeMethodHeader();  
-				break;
-	 
-	    case 248 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt Type OnType"); }  //$NON-NLS-1$
-			    consumeInterTypeMethodHeaderName(false,false);  
-				break;
-	 
-	    case 249 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt Type OnType"); }  //$NON-NLS-1$
-			    consumeInterTypeMethodHeaderNameIllegallyUsingTypePattern("*");  
-				break;
-	 
-	    case 250 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt Type OnType"); }  //$NON-NLS-1$
-			    consumeInterTypeMethodHeaderNameIllegallyUsingTypePattern("+");  
-				break;
-	 
-	    case 251 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt Type OnType"); }  //$NON-NLS-1$
-			    consumeInterTypeMethodHeaderName(false,true);  
-				break;
-	 
-	    case 252 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
-			    consumeInterTypeMethodHeaderName(true,false);  
-				break;
-	 
-	    case 253 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
-			    consumeInterTypeMethodHeaderName(true,true);  
-				break;
-	 
-	    case 254 : if (DEBUG) { System.out.println("AbstractInterTypeMethodDeclaration ::=..."); }  //$NON-NLS-1$
-			    // set to false to consume a method without body
-	  consumeInterTypeMethodDeclaration(false);  
-				break;
-	 
-	    case 255 : if (DEBUG) { System.out.println("TypeParametersAsReference ::= TypeParameters"); }  //$NON-NLS-1$
-			    convertTypeParametersToSingleTypeReferences();  
-				break;
-	 
-	    case 256 : if (DEBUG) { System.out.println("InterTypeConstructorDeclaration ::=..."); }  //$NON-NLS-1$
-			    // set to true to consume a method with a body
-	  consumeInterTypeConstructorDeclaration();   
-				break;
-	 
-	    case 257 : if (DEBUG) { System.out.println("InterTypeConstructorHeader ::=..."); }  //$NON-NLS-1$
-			    consumeInterTypeConstructorHeader();  
-				break;
-	 
-	    case 258 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt Name DOT"); }  //$NON-NLS-1$
-			    consumeInterTypeConstructorHeaderName(false,false);  
-				break;
-	 
-	    case 259 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt Name DOT"); }  //$NON-NLS-1$
-			    consumeInterTypeConstructorHeaderNameIllegallyUsingTypePattern("*");  
-				break;
-	 
-	    case 260 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt Name..."); }  //$NON-NLS-1$
-			    consumeInterTypeConstructorHeaderNameIllegallyUsingTypePattern("+");  
-				break;
-	 
-	    case 261 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
-			    consumeInterTypeConstructorHeaderName(true,false);  
-				break;
-	 
-	    case 262 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
-			    consumeInterTypeConstructorHeaderName(false,true);  
-				break;
-	 
-	    case 263 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
-			    consumeInterTypeConstructorHeaderName(true,true);  
-				break;
-	 
-	    case 264 : if (DEBUG) { System.out.println("InterTypeFieldDeclaration ::= InterTypeFieldHeader..."); }  //$NON-NLS-1$
-			    consumeInterTypeFieldDeclaration();  
-				break;
-	 
-	    case 265 : if (DEBUG) { System.out.println("InterTypeFieldHeader ::= Modifiersopt Type OnType DOT..."); }  //$NON-NLS-1$
-			    consumeInterTypeFieldHeader(false);  
-				break;
-	 
-	    case 266 : if (DEBUG) { System.out.println("InterTypeFieldHeader ::= Modifiersopt Type OnType DOT..."); }  //$NON-NLS-1$
-			    consumeInterTypeFieldHeaderIllegallyAttemptingToUseATypePattern("*");  
-				break;
-	 
-	    case 267 : if (DEBUG) { System.out.println("InterTypeFieldHeader ::= Modifiersopt Type OnType PLUS"); }  //$NON-NLS-1$
-			    consumeInterTypeFieldHeaderIllegallyAttemptingToUseATypePattern("+");  
-				break;
-	 
-	    case 268 : if (DEBUG) { System.out.println("InterTypeFieldHeader ::= Modifiersopt Type OnType..."); }  //$NON-NLS-1$
-			    consumeInterTypeFieldHeader(true);  
-				break;
-	 
-	    case 269 : if (DEBUG) { System.out.println("InterTypeFieldBody ::="); }  //$NON-NLS-1$
-			    consumeExitITDVariableWithoutInitializer();  
-				break;
-	 
-	    case 270 : if (DEBUG) { System.out.println("InterTypeFieldBody ::= EQUAL ForceNoDiet..."); }  //$NON-NLS-1$
-			    consumeExitITDVariableWithInitializer();  
-				break;
-	 
-	    case 272 : if (DEBUG) { System.out.println("DeclareDeclaration ::= DeclareHeader PseudoTokens..."); }  //$NON-NLS-1$
-			    consumeDeclareDeclaration();  
-				break;
-	 
-	    case 273 : if (DEBUG) { System.out.println("DeclareHeader ::= declare Identifier COLON"); }  //$NON-NLS-1$
-			    consumeDeclareHeader();  
-				break;
-	 
-	    case 274 : if (DEBUG) { System.out.println("DeclareDeclaration ::= DeclareAnnotationHeader..."); }  //$NON-NLS-1$
-			    consumeDeclareAnnotation(' ');  
-				break;
-	 
-	    case 275 : if (DEBUG) { System.out.println("DeclareDeclaration ::= DeclareAnnotationHeader..."); }  //$NON-NLS-1$
-			    consumeDeclareAnnotation('+');  
-				break;
-	 
-	    case 276 : if (DEBUG) { System.out.println("DeclareDeclaration ::= DeclareAnnotationHeader..."); }  //$NON-NLS-1$
-			    consumeDeclareAnnotation('-');  
-				break;
-	 
-	    case 279 : if (DEBUG) { System.out.println("DeclareAnnotationHeader ::= declare AT Identifier COLON"); }  //$NON-NLS-1$
-			    consumeDeclareAnnotationHeader();  
-				break;
-	 
-	    case 282 : if (DEBUG) { System.out.println("PseudoTokens ::= PseudoTokens ColonPseudoToken"); }  //$NON-NLS-1$
-			    consumePseudoTokens();  
-				break;
-	 
-	    case 283 : if (DEBUG) { System.out.println("PseudoTokens ::= PseudoTokens PseudoToken"); }  //$NON-NLS-1$
-			    consumePseudoTokens();  
-				break;
-	 
-	    case 285 : if (DEBUG) { System.out.println("PseudoTokensNoColon ::= PseudoTokensNoColon PseudoToken"); }  //$NON-NLS-1$
-			    consumePseudoTokens();  
-				break;
-	 
-	    case 286 : if (DEBUG) { System.out.println("ColonPseudoToken ::= COLON"); }  //$NON-NLS-1$
-			    consumePseudoToken(":");  
-				break;
-	 
-	    case 287 : if (DEBUG) { System.out.println("PseudoToken ::= JavaIdentifier"); }  //$NON-NLS-1$
-			    consumePseudoTokenIdentifier();  
-				break;
-	 
-	    case 288 : if (DEBUG) { System.out.println("PseudoToken ::= LPAREN"); }  //$NON-NLS-1$
-			    consumePseudoToken("(");  
-				break;
-	 
-	    case 289 : if (DEBUG) { System.out.println("PseudoToken ::= RPAREN"); }  //$NON-NLS-1$
-			    consumePseudoToken(")");  
-				break;
-	 
-	    case 290 : if (DEBUG) { System.out.println("PseudoToken ::= DOT"); }  //$NON-NLS-1$
-			    consumePseudoToken(".");  
-				break;
-	 
-	    case 291 : if (DEBUG) { System.out.println("PseudoToken ::= MULTIPLY"); }  //$NON-NLS-1$
-			    consumePseudoToken("*");  
-				break;
-	 
-	    case 292 : if (DEBUG) { System.out.println("PseudoToken ::= PLUS"); }  //$NON-NLS-1$
-			    consumePseudoToken("+");  
-				break;
-	 
-	    case 293 : if (DEBUG) { System.out.println("PseudoToken ::= EQUAL"); }  //$NON-NLS-1$
-			    consumePseudoToken("=");  
-				break;
-	 
-	    case 294 : if (DEBUG) { System.out.println("PseudoToken ::= AND_AND"); }  //$NON-NLS-1$
-			    consumePseudoToken("&&");  
-				break;
-	 
-	    case 295 : if (DEBUG) { System.out.println("PseudoToken ::= OR_OR"); }  //$NON-NLS-1$
-			    consumePseudoToken("||");  
-				break;
-	 
-	    case 296 : if (DEBUG) { System.out.println("PseudoToken ::= NOT"); }  //$NON-NLS-1$
-			    consumePseudoToken("!");  
-				break;
-	 
-	    case 297 : if (DEBUG) { System.out.println("PseudoToken ::= COMMA"); }  //$NON-NLS-1$
-			    consumePseudoToken(",");  
-				break;
-	 
-	    case 298 : if (DEBUG) { System.out.println("PseudoToken ::= LBRACKET"); }  //$NON-NLS-1$
-			    consumePseudoToken("[");  
-				break;
-	 
-	    case 299 : if (DEBUG) { System.out.println("PseudoToken ::= RBRACKET"); }  //$NON-NLS-1$
-			    consumePseudoToken("]");  
-				break;
-	 
-	    case 300 : if (DEBUG) { System.out.println("PseudoToken ::= AT"); }  //$NON-NLS-1$
-			    consumePseudoToken("@");  
-				break;
-	 
-	    case 301 : if (DEBUG) { System.out.println("PseudoToken ::= ELLIPSIS"); }  //$NON-NLS-1$
-			    consumePseudoToken("...");  
-				break;
-	 
-	    case 302 : if (DEBUG) { System.out.println("PseudoToken ::= QUESTION"); }  //$NON-NLS-1$
-			    consumePseudoToken("?");  
-				break;
-	 
-	    case 303 : if (DEBUG) { System.out.println("PseudoToken ::= LESS"); }  //$NON-NLS-1$
-			    consumePseudoToken("<");  
-				break;
-	 
-	    case 304 : if (DEBUG) { System.out.println("PseudoToken ::= GREATER"); }  //$NON-NLS-1$
-			    consumePseudoToken(">");  
-				break;
-	 
-	    case 305 : if (DEBUG) { System.out.println("PseudoToken ::= RIGHT_SHIFT"); }  //$NON-NLS-1$
-			    consumePseudoToken(">>");  
-				break;
-	 
-	    case 306 : if (DEBUG) { System.out.println("PseudoToken ::= UNSIGNED_RIGHT_SHIFT"); }  //$NON-NLS-1$
-			    consumePseudoToken(">>>");  
-				break;
-	 
-	    case 307 : if (DEBUG) { System.out.println("PseudoToken ::= AND"); }  //$NON-NLS-1$
-			    consumePseudoToken("&");  
-				break;
-	 
-	    case 308 : if (DEBUG) { System.out.println("PseudoToken ::= NOT_EQUAL"); }  //$NON-NLS-1$
-			    consumePseudoToken("!=");  
-				break;
-	 
-	    case 309 : if (DEBUG) { System.out.println("PseudoToken ::= PrimitiveType"); }  //$NON-NLS-1$
-			    consumePseudoTokenPrimitiveType();  
-				break;
-	 
-	    case 310 : if (DEBUG) { System.out.println("PseudoToken ::= SimpleModifier"); }  //$NON-NLS-1$
-			    consumePseudoTokenModifier();  
-				break;
-	 
-	    case 311 : if (DEBUG) { System.out.println("PseudoToken ::= Literal"); }  //$NON-NLS-1$
-			    consumePseudoTokenLiteral();  
-				break;
-	 
-	    case 312 : if (DEBUG) { System.out.println("PseudoToken ::= this"); }  //$NON-NLS-1$
-			    consumePseudoToken("this", 1, true);  
-				break;
-	 
-	    case 313 : if (DEBUG) { System.out.println("PseudoToken ::= class"); }  //$NON-NLS-1$
-			    consumePseudoToken("class", 1, true);  
-				break;
-	 
-	    case 314 : if (DEBUG) { System.out.println("PseudoToken ::= super"); }  //$NON-NLS-1$
-			    consumePseudoToken("super", 1, true);  
-				break;
-	 
-	    case 315 : if (DEBUG) { System.out.println("PseudoToken ::= if LPAREN Expression RPAREN"); }  //$NON-NLS-1$
-			    consumePseudoTokenIf();  
-				break;
-	 
-	    case 316 : if (DEBUG) { System.out.println("PseudoToken ::= assert"); }  //$NON-NLS-1$
-			    consumePseudoToken("assert", 1, true);  
-				break;
-	 
-	    case 317 : if (DEBUG) { System.out.println("PseudoToken ::= import"); }  //$NON-NLS-1$
-			    consumePseudoToken("import", 1, true);  
-				break;
-	 
-	    case 318 : if (DEBUG) { System.out.println("PseudoToken ::= package"); }  //$NON-NLS-1$
-			    consumePseudoToken("package", 1, true);  
-				break;
-	 
-	    case 319 : if (DEBUG) { System.out.println("PseudoToken ::= throw"); }  //$NON-NLS-1$
-			    consumePseudoToken("throw", 1, true);  
-				break;
-	 
-	    case 320 : if (DEBUG) { System.out.println("PseudoToken ::= new"); }  //$NON-NLS-1$
-			    consumePseudoToken("new", 1, true);  
-				break;
-	 
-	    case 321 : if (DEBUG) { System.out.println("PseudoToken ::= do"); }  //$NON-NLS-1$
-			    consumePseudoToken("do", 1, true);  
-				break;
-	 
-	    case 322 : if (DEBUG) { System.out.println("PseudoToken ::= for"); }  //$NON-NLS-1$
-			    consumePseudoToken("for", 1, true);  
-				break;
-	 
-	    case 323 : if (DEBUG) { System.out.println("PseudoToken ::= switch"); }  //$NON-NLS-1$
-			    consumePseudoToken("switch", 1, true);  
-				break;
-	 
-	    case 324 : if (DEBUG) { System.out.println("PseudoToken ::= try"); }  //$NON-NLS-1$
-			    consumePseudoToken("try", 1, true);  
-				break;
-	 
-	    case 325 : if (DEBUG) { System.out.println("PseudoToken ::= while"); }  //$NON-NLS-1$
-			    consumePseudoToken("while", 1, true);  
-				break;
-	 
-	    case 326 : if (DEBUG) { System.out.println("PseudoToken ::= break"); }  //$NON-NLS-1$
-			    consumePseudoToken("break", 1, true);  
-				break;
-	 
-	    case 327 : if (DEBUG) { System.out.println("PseudoToken ::= continue"); }  //$NON-NLS-1$
-			    consumePseudoToken("continue", 1, true);  
-				break;
-	 
-	    case 328 : if (DEBUG) { System.out.println("PseudoToken ::= return"); }  //$NON-NLS-1$
-			    consumePseudoToken("return", 1, true);  
-				break;
-	 
-	    case 329 : if (DEBUG) { System.out.println("PseudoToken ::= case"); }  //$NON-NLS-1$
-			    consumePseudoToken("case", 1, true);  
-				break;
-	 
-	    case 330 : if (DEBUG) { System.out.println("PseudoToken ::= catch"); }  //$NON-NLS-1$
-			    consumePseudoToken("catch", 0, true);  
-				break;
-	 
-	    case 331 : if (DEBUG) { System.out.println("PseudoToken ::= instanceof"); }  //$NON-NLS-1$
-			    consumePseudoToken("instanceof", 0, true);  
-				break;
-	 
-	    case 332 : if (DEBUG) { System.out.println("PseudoToken ::= else"); }  //$NON-NLS-1$
-			    consumePseudoToken("else", 0, true);  
-				break;
-	 
-	    case 333 : if (DEBUG) { System.out.println("PseudoToken ::= extends"); }  //$NON-NLS-1$
-			    consumePseudoToken("extends", 0, true);  
-				break;
-	 
-	    case 334 : if (DEBUG) { System.out.println("PseudoToken ::= finally"); }  //$NON-NLS-1$
-			    consumePseudoToken("finally", 0, true);  
-				break;
-	 
-	    case 335 : if (DEBUG) { System.out.println("PseudoToken ::= implements"); }  //$NON-NLS-1$
-			    consumePseudoToken("implements", 0, true);  
-				break;
-	 
-	    case 336 : if (DEBUG) { System.out.println("PseudoToken ::= throws"); }  //$NON-NLS-1$
-			    consumePseudoToken("throws", 0, true);  
-				break;
-	 
-	    case 337 : if (DEBUG) { System.out.println("ClassDeclaration ::= ClassHeader ClassBody"); }  //$NON-NLS-1$
-			    consumeClassDeclaration();  
-				break;
-	 
-	    case 338 : if (DEBUG) { System.out.println("IntertypeClassDeclaration ::= IntertypeClassHeader..."); }  //$NON-NLS-1$
-			    consumeIntertypeClassDeclaration();  
-				break;
-	 
-	    case 339 : if (DEBUG) { System.out.println("IntertypeClassHeader ::= IntertypeClassHeaderName..."); }  //$NON-NLS-1$
-			    consumeIntertypeClassHeader();  
-				break;
-	 
-	    case 340 : if (DEBUG) { System.out.println("IntertypeClassHeaderName ::= IntertypeClassHeaderName1"); }  //$NON-NLS-1$
-			    consumeIntertypeTypeHeaderNameWithTypeParameters();  
-				break;
-	 
-	    case 342 : if (DEBUG) { System.out.println("IntertypeClassHeaderName1 ::= Modifiersopt class OnType"); }  //$NON-NLS-1$
-			    consumeIntertypeClassHeaderName(false);  
-				break;
-	 
-	    case 343 : if (DEBUG) { System.out.println("InterTypeClassHeaderName1 ::= Modifiersopt class OnType"); }  //$NON-NLS-1$
-			    consumeIntertypeClassHeaderName(true);  
-				break;
-	 
-	    case 344 : if (DEBUG) { System.out.println("ClassHeader ::= ClassHeaderName ClassHeaderExtendsopt..."); }  //$NON-NLS-1$
-			    consumeClassHeader();  
-				break;
-	 
-	    case 345 : if (DEBUG) { System.out.println("ClassHeaderName ::= ClassHeaderName1 TypeParameters"); }  //$NON-NLS-1$
-			    consumeTypeHeaderNameWithTypeParameters();  
-				break;
-	 
-	    case 347 : if (DEBUG) { System.out.println("ClassHeaderName1 ::= Modifiersopt class JavaIdentifier"); }  //$NON-NLS-1$
-			    consumeClassHeaderName1();  
-				break;
-	 
-	    case 348 : if (DEBUG) { System.out.println("ClassHeaderExtends ::= extends ClassType"); }  //$NON-NLS-1$
-			    consumeClassHeaderExtends();  
-				break;
-	 
-	    case 349 : if (DEBUG) { System.out.println("ClassHeaderImplements ::= implements InterfaceTypeList"); }  //$NON-NLS-1$
-			    consumeClassHeaderImplements();  
-				break;
-	 
-	    case 351 : if (DEBUG) { System.out.println("InterfaceTypeList ::= InterfaceTypeList COMMA..."); }  //$NON-NLS-1$
-			    consumeInterfaceTypeList();  
-				break;
-	 
-	    case 352 : if (DEBUG) { System.out.println("InterfaceType ::= ClassOrInterfaceType"); }  //$NON-NLS-1$
-			    consumeInterfaceType();  
-				break;
-	 
-	    case 355 : if (DEBUG) { System.out.println("ClassBodyDeclarations ::= ClassBodyDeclarations..."); }  //$NON-NLS-1$
-			    consumeClassBodyDeclarations();  
-				break;
-	 
-	    case 359 : if (DEBUG) { System.out.println("ClassBodyDeclaration ::= Diet NestedMethod..."); }  //$NON-NLS-1$
-			    consumeClassBodyDeclaration();  
-				break;
-	 
-	    case 360 : if (DEBUG) { System.out.println("Diet ::="); }  //$NON-NLS-1$
-			    consumeDiet();  
-				break;
+ case 53 : if (DEBUG) { System.out.println("ReferenceType ::= ClassOrInterfaceType"); }  //$NON-NLS-1$
+		    consumeReferenceType();  
+			break;
 
-	    case 361 : if (DEBUG) { System.out.println("Initializer ::= Diet NestedMethod CreateInitializer..."); }  //$NON-NLS-1$
-			    consumeClassBodyDeclaration();  
-				break;
-	 
-	    case 362 : if (DEBUG) { System.out.println("CreateInitializer ::="); }  //$NON-NLS-1$
-			    consumeCreateInitializer();  
-				break;
+ case 57 : if (DEBUG) { System.out.println("ClassOrInterface ::= Name"); }  //$NON-NLS-1$
+		    consumeClassOrInterfaceName();  
+			break;
 
-	    case 369 : if (DEBUG) { System.out.println("ClassMemberDeclaration ::= SEMICOLON"); }  //$NON-NLS-1$
-			    consumeEmptyTypeDeclaration();  
-				break;
+ case 58 : if (DEBUG) { System.out.println("ClassOrInterface ::= GenericType DOT Name"); }  //$NON-NLS-1$
+		    consumeClassOrInterface();  
+			break;
 
-	    case 372 : if (DEBUG) { System.out.println("FieldDeclaration ::= Modifiersopt Type..."); }  //$NON-NLS-1$
-			    consumeFieldDeclaration();  
-				break;
-	 
-	    case 374 : if (DEBUG) { System.out.println("VariableDeclarators ::= VariableDeclarators COMMA..."); }  //$NON-NLS-1$
-			    consumeVariableDeclarators();  
-				break;
-	 
-	    case 377 : if (DEBUG) { System.out.println("EnterVariable ::="); }  //$NON-NLS-1$
-			    consumeEnterVariable();  
-				break;
-	 
-	    case 378 : if (DEBUG) { System.out.println("ExitVariableWithInitialization ::="); }  //$NON-NLS-1$
-			    consumeExitVariableWithInitialization();  
-				break;
-	 
-	    case 379 : if (DEBUG) { System.out.println("ExitVariableWithoutInitialization ::="); }  //$NON-NLS-1$
-			    consumeExitVariableWithoutInitialization();  
-				break;
-	 
-	    case 380 : if (DEBUG) { System.out.println("ForceNoDiet ::="); }  //$NON-NLS-1$
-			    consumeForceNoDiet();  
-				break;
-	 
-	    case 381 : if (DEBUG) { System.out.println("RestoreDiet ::="); }  //$NON-NLS-1$
-			    consumeRestoreDiet();  
-				break;
-	 
-	    case 386 : if (DEBUG) { System.out.println("MethodDeclaration ::= MethodHeader MethodBody"); }  //$NON-NLS-1$
-			    // set to true to consume a method with a body
-	 consumeMethodDeclaration(true);  
-				break;
-	 
-	    case 387 : if (DEBUG) { System.out.println("AbstractMethodDeclaration ::= MethodHeader SEMICOLON"); }  //$NON-NLS-1$
-			    // set to false to consume a method without body
-	 consumeMethodDeclaration(false);  
-				break;
-	 
-	    case 388 : if (DEBUG) { System.out.println("MethodHeader ::= MethodHeaderName FormalParameterListopt"); }  //$NON-NLS-1$
-			    consumeMethodHeader();  
-				break;
-	 
-	    case 389 : if (DEBUG) { System.out.println("DefaultMethodHeader ::= DefaultMethodHeaderName..."); }  //$NON-NLS-1$
-			    consumeMethodHeader();  
-				break;
-	 
-	    case 390 : if (DEBUG) { System.out.println("MethodHeaderName ::= Modifiersopt TypeParameters Type..."); }  //$NON-NLS-1$
-			    consumeMethodHeaderNameWithTypeParameters(false);  
-				break;
-	 
-	    case 391 : if (DEBUG) { System.out.println("MethodHeaderName ::= Modifiersopt Type JavaIdentifier..."); }  //$NON-NLS-1$
-			    consumeMethodHeaderName(false);  
-				break;
-	 
-	    case 392 : if (DEBUG) { System.out.println("DefaultMethodHeaderName ::= ModifiersWithDefault..."); }  //$NON-NLS-1$
-			    consumeMethodHeaderNameWithTypeParameters(false);  
-				break;
-	 
-	    case 393 : if (DEBUG) { System.out.println("DefaultMethodHeaderName ::= ModifiersWithDefault Type..."); }  //$NON-NLS-1$
-			    consumeMethodHeaderName(false);  
-				break;
-	 
-	    case 394 : if (DEBUG) { System.out.println("ModifiersWithDefault ::= Modifiersopt default..."); }  //$NON-NLS-1$
-			    consumePushCombineModifiers();  
-				break;
-	 
-	    case 395 : if (DEBUG) { System.out.println("MethodHeaderRightParen ::= RPAREN"); }  //$NON-NLS-1$
-			    consumeMethodHeaderRightParen();  
-				break;
-	 
-	    case 396 : if (DEBUG) { System.out.println("MethodHeaderExtendedDims ::= Dimsopt"); }  //$NON-NLS-1$
-			    consumeMethodHeaderExtendedDims();  
-				break;
-	 
-	    case 397 : if (DEBUG) { System.out.println("MethodHeaderThrowsClause ::= throws ClassTypeList"); }  //$NON-NLS-1$
-			    consumeMethodHeaderThrowsClause();  
-				break;
-	 
-	    case 398 : if (DEBUG) { System.out.println("ConstructorHeader ::= ConstructorHeaderName..."); }  //$NON-NLS-1$
-			    consumeConstructorHeader();  
-				break;
-	 
-	    case 399 : if (DEBUG) { System.out.println("ConstructorHeaderName ::= Modifiersopt TypeParameters..."); }  //$NON-NLS-1$
-			    consumeConstructorHeaderNameWithTypeParameters();  
-				break;
-	 
-	    case 400 : if (DEBUG) { System.out.println("ConstructorHeaderName ::= Modifiersopt Identifier LPAREN"); }  //$NON-NLS-1$
-			    consumeConstructorHeaderName();  
-				break;
-	 
-	    case 401 : if (DEBUG) { System.out.println("ConstructorHeaderName ::= Modifiersopt aspect LPAREN"); }  //$NON-NLS-1$
-			    consumeConstructorHeaderName();  
-				break;
-	 
-	    case 403 : if (DEBUG) { System.out.println("FormalParameterList ::= FormalParameterList COMMA..."); }  //$NON-NLS-1$
-			    consumeFormalParameterList();  
-				break;
-	 
-	    case 404 : if (DEBUG) { System.out.println("FormalParameter ::= Modifiersopt Type..."); }  //$NON-NLS-1$
-			    consumeFormalParameter(false);  
-				break;
-	 
-	    case 405 : if (DEBUG) { System.out.println("FormalParameter ::= Modifiersopt Type..."); }  //$NON-NLS-1$
-			    consumeFormalParameter(true);  
-				break;
-	 
-	    case 406 : if (DEBUG) { System.out.println("FormalParameter ::= Modifiersopt Type AT308DOTDOTDOT..."); }  //$NON-NLS-1$
-			    consumeFormalParameter(true);  
-				break;
-	 
-	    case 407 : if (DEBUG) { System.out.println("CatchFormalParameter ::= Modifiersopt CatchType..."); }  //$NON-NLS-1$
-			    consumeCatchFormalParameter();  
-				break;
-	 
-	    case 408 : if (DEBUG) { System.out.println("CatchType ::= UnionType"); }  //$NON-NLS-1$
-			    consumeCatchType();  
-				break;
-	 
-	    case 409 : if (DEBUG) { System.out.println("UnionType ::= Type"); }  //$NON-NLS-1$
-			    consumeUnionTypeAsClassType();  
-				break;
-	 
-	    case 410 : if (DEBUG) { System.out.println("UnionType ::= UnionType OR Type"); }  //$NON-NLS-1$
-			    consumeUnionType();  
-				break;
-	 
-	    case 412 : if (DEBUG) { System.out.println("ClassTypeList ::= ClassTypeList COMMA ClassTypeElt"); }  //$NON-NLS-1$
-			    consumeClassTypeList();  
-				break;
-	 
-	    case 413 : if (DEBUG) { System.out.println("ClassTypeElt ::= ClassType"); }  //$NON-NLS-1$
-			    consumeClassTypeElt();  
-				break;
-	 
-	    case 414 : if (DEBUG) { System.out.println("MethodBody ::= NestedMethod LBRACE BlockStatementsopt..."); }  //$NON-NLS-1$
-			    consumeMethodBody();  
-				break;
-	 
-	    case 415 : if (DEBUG) { System.out.println("NestedMethod ::="); }  //$NON-NLS-1$
-			    consumeNestedMethod();  
-				break;
-	 
-	    case 416 : if (DEBUG) { System.out.println("StaticInitializer ::= StaticOnly Block"); }  //$NON-NLS-1$
-			    consumeStaticInitializer();  
-				break;
+ case 59 : if (DEBUG) { System.out.println("GenericType ::= ClassOrInterface TypeArguments"); }  //$NON-NLS-1$
+		    consumeGenericType();  
+			break;
 
-	    case 417 : if (DEBUG) { System.out.println("StaticOnly ::= static"); }  //$NON-NLS-1$
-			    consumeStaticOnly();  
-				break;
-	 
-	    case 418 : if (DEBUG) { System.out.println("ConstructorDeclaration ::= ConstructorHeader MethodBody"); }  //$NON-NLS-1$
-			    consumeConstructorDeclaration() ;  
-				break;
-	 
-	    case 419 : if (DEBUG) { System.out.println("ConstructorDeclaration ::= ConstructorHeader SEMICOLON"); }  //$NON-NLS-1$
-			    consumeInvalidConstructorDeclaration() ;  
-				break;
-	 
-	    case 420 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= this LPAREN..."); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocation(0, THIS_CALL);  
-				break;
-	 
-	    case 421 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= OnlyTypeArguments this"); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocationWithTypeArguments(0,THIS_CALL);  
-				break;
-	 
-	    case 422 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= super LPAREN..."); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocation(0,SUPER_CALL);  
-				break;
-	 
-	    case 423 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= OnlyTypeArguments..."); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocationWithTypeArguments(0,SUPER_CALL);  
-				break;
-	 
-	    case 424 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT super..."); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocation(1, SUPER_CALL);  
-				break;
-	 
-	    case 425 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT..."); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocationWithTypeArguments(1, SUPER_CALL);  
-				break;
-	 
-	    case 426 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT super LPAREN"); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocation(2, SUPER_CALL);  
-				break;
-	 
-	    case 427 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT..."); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocationWithTypeArguments(2, SUPER_CALL);  
-				break;
-	 
-	    case 428 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT this..."); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocation(1, THIS_CALL);  
-				break;
-	 
-	    case 429 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT..."); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocationWithTypeArguments(1, THIS_CALL);  
-				break;
-	 
-	    case 430 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT this LPAREN"); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocation(2, THIS_CALL);  
-				break;
-	 
-	    case 431 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT..."); }  //$NON-NLS-1$
-			    consumeExplicitConstructorInvocationWithTypeArguments(2, THIS_CALL);  
-				break;
-	 
-	    case 432 : if (DEBUG) { System.out.println("InterfaceDeclaration ::= InterfaceHeader InterfaceBody"); }  //$NON-NLS-1$
-			    consumeInterfaceDeclaration();  
-				break;
-	 
-	    case 433 : if (DEBUG) { System.out.println("InterfaceHeader ::= InterfaceHeaderName..."); }  //$NON-NLS-1$
-			    consumeInterfaceHeader();  
-				break;
-	 
-	    case 434 : if (DEBUG) { System.out.println("InterfaceHeaderName ::= InterfaceHeaderName1..."); }  //$NON-NLS-1$
-			    consumeTypeHeaderNameWithTypeParameters();  
-				break;
-	 
-	    case 436 : if (DEBUG) { System.out.println("InterfaceHeaderName1 ::= Modifiersopt interface..."); }  //$NON-NLS-1$
-			    consumeInterfaceHeaderName1();  
-				break;
-	 
-	    case 437 : if (DEBUG) { System.out.println("InterfaceHeaderExtends ::= extends InterfaceTypeList"); }  //$NON-NLS-1$
-			    consumeInterfaceHeaderExtends();  
-				break;
-	 
-	    case 440 : if (DEBUG) { System.out.println("InterfaceMemberDeclarations ::=..."); }  //$NON-NLS-1$
-			    consumeInterfaceMemberDeclarations();  
-				break;
-	 
-	    case 441 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= SEMICOLON"); }  //$NON-NLS-1$
-			    consumeEmptyTypeDeclaration();  
-				break;
-	 
-	    case 443 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= DefaultMethodHeader..."); }  //$NON-NLS-1$
-			    consumeInterfaceMethodDeclaration(false);  
-				break;
-	 
-	    case 444 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= MethodHeader MethodBody"); }  //$NON-NLS-1$
-			    consumeInterfaceMethodDeclaration(false);  
-				break;
-	 
-	    case 445 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= DefaultMethodHeader..."); }  //$NON-NLS-1$
-			    consumeInterfaceMethodDeclaration(true);  
-				break;
-	 
-	    case 446 : if (DEBUG) { System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader..."); }  //$NON-NLS-1$
-			    consumeInvalidConstructorDeclaration(true);  
-				break;
-	 
-	    case 447 : if (DEBUG) { System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader..."); }  //$NON-NLS-1$
-			    consumeInvalidConstructorDeclaration(false);  
-				break;
-	 
-	    case 458 : if (DEBUG) { System.out.println("PushLeftBrace ::="); }  //$NON-NLS-1$
-			    consumePushLeftBrace();  
-				break;
-	 
-	    case 459 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace ,opt RBRACE"); }  //$NON-NLS-1$
-			    consumeEmptyArrayInitializer();  
-				break;
-	 
-	    case 460 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace..."); }  //$NON-NLS-1$
-			    consumeArrayInitializer();  
-				break;
-	 
-	    case 461 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace..."); }  //$NON-NLS-1$
-			    consumeArrayInitializer();  
-				break;
-	 
-	    case 463 : if (DEBUG) { System.out.println("VariableInitializers ::= VariableInitializers COMMA..."); }  //$NON-NLS-1$
-			    consumeVariableInitializers();  
-				break;
-	 
-	    case 464 : if (DEBUG) { System.out.println("Block ::= OpenBlock LBRACE BlockStatementsopt RBRACE"); }  //$NON-NLS-1$
-			    consumeBlock();  
-				break;
-	 
-	    case 465 : if (DEBUG) { System.out.println("OpenBlock ::="); }  //$NON-NLS-1$
-			    consumeOpenBlock() ;  
-				break;
-	 
-	    case 467 : if (DEBUG) { System.out.println("BlockStatements ::= BlockStatements BlockStatement"); }  //$NON-NLS-1$
-			    consumeBlockStatements() ;  
-				break;
-	 
-	    case 471 : if (DEBUG) { System.out.println("BlockStatement ::= InterfaceDeclaration"); }  //$NON-NLS-1$
-			    consumeInvalidInterfaceDeclaration();  
-				break;
-	 
-	    case 472 : if (DEBUG) { System.out.println("BlockStatement ::= AnnotationTypeDeclaration"); }  //$NON-NLS-1$
-			    consumeInvalidAnnotationTypeDeclaration();  
-				break;
-	 
-	    case 473 : if (DEBUG) { System.out.println("BlockStatement ::= EnumDeclaration"); }  //$NON-NLS-1$
-			    consumeInvalidEnumDeclaration();  
-				break;
-	 
-	    case 474 : if (DEBUG) { System.out.println("LocalVariableDeclarationStatement ::=..."); }  //$NON-NLS-1$
-			    consumeLocalVariableDeclarationStatement();  
-				break;
-	 
-	    case 475 : if (DEBUG) { System.out.println("LocalVariableDeclaration ::= Type PushModifiers..."); }  //$NON-NLS-1$
-			    consumeLocalVariableDeclaration();  
-				break;
-	 
-	    case 476 : if (DEBUG) { System.out.println("LocalVariableDeclaration ::= Modifiers Type..."); }  //$NON-NLS-1$
-			    consumeLocalVariableDeclaration();  
-				break;
-	 
-	    case 477 : if (DEBUG) { System.out.println("PushModifiers ::="); }  //$NON-NLS-1$
-			    consumePushModifiers();  
-				break;
-	 
-	    case 478 : if (DEBUG) { System.out.println("PushModifiersForHeader ::="); }  //$NON-NLS-1$
-			    consumePushModifiersForHeader();  
-				break;
-	 
-	    case 479 : if (DEBUG) { System.out.println("PushRealModifiers ::="); }  //$NON-NLS-1$
-			    consumePushRealModifiers();  
-				break;
-	 
-	    case 506 : if (DEBUG) { System.out.println("EmptyStatement ::= SEMICOLON"); }  //$NON-NLS-1$
-			    consumeEmptyStatement();  
-				break;
-	 
-	    case 507 : if (DEBUG) { System.out.println("LabeledStatement ::= Label COLON Statement"); }  //$NON-NLS-1$
-			    consumeStatementLabel() ;  
-				break;
-	 
-	    case 508 : if (DEBUG) { System.out.println("LabeledStatementNoShortIf ::= Label COLON..."); }  //$NON-NLS-1$
-			    consumeStatementLabel() ;  
-				break;
-	 
-	    case 509 : if (DEBUG) { System.out.println("Label ::= JavaIdentifier"); }  //$NON-NLS-1$
-			    consumeLabel() ;  
-				break;
-	 
-	     case 510 : if (DEBUG) { System.out.println("ExpressionStatement ::= StatementExpression SEMICOLON"); }  //$NON-NLS-1$
-			    consumeExpressionStatement();  
-				break;
-	 
-	    case 519 : if (DEBUG) { System.out.println("IfThenStatement ::= if LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
-			    consumeStatementIfNoElse();  
-				break;
-	 
-	    case 520 : if (DEBUG) { System.out.println("IfThenElseStatement ::= if LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
-			    consumeStatementIfWithElse();  
-				break;
-	 
-	    case 521 : if (DEBUG) { System.out.println("IfThenElseStatementNoShortIf ::= if LPAREN Expression..."); }  //$NON-NLS-1$
-			    consumeStatementIfWithElse();  
-				break;
-	 
-	    case 522 : if (DEBUG) { System.out.println("SwitchStatement ::= switch LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
-			    consumeStatementSwitch() ;  
-				break;
-	 
-	    case 523 : if (DEBUG) { System.out.println("SwitchBlock ::= LBRACE RBRACE"); }  //$NON-NLS-1$
-			    consumeEmptySwitchBlock() ;  
-				break;
-	 
-	    case 526 : if (DEBUG) { System.out.println("SwitchBlock ::= LBRACE SwitchBlockStatements..."); }  //$NON-NLS-1$
-			    consumeSwitchBlock() ;  
-				break;
-	 
-	    case 528 : if (DEBUG) { System.out.println("SwitchBlockStatements ::= SwitchBlockStatements..."); }  //$NON-NLS-1$
-			    consumeSwitchBlockStatements() ;  
-				break;
-	 
-	    case 529 : if (DEBUG) { System.out.println("SwitchBlockStatement ::= SwitchLabels BlockStatements"); }  //$NON-NLS-1$
-			    consumeSwitchBlockStatement() ;  
-				break;
-	 
-	    case 531 : if (DEBUG) { System.out.println("SwitchLabels ::= SwitchLabels SwitchLabel"); }  //$NON-NLS-1$
-			    consumeSwitchLabels() ;  
-				break;
-	 
-	     case 532 : if (DEBUG) { System.out.println("SwitchLabel ::= case ConstantExpression COLON"); }  //$NON-NLS-1$
-			    consumeCaseLabel();  
-				break;
-	 
-	     case 533 : if (DEBUG) { System.out.println("SwitchLabel ::= default COLON"); }  //$NON-NLS-1$
-			    consumeDefaultLabel();  
-				break;
-	 
-	    case 534 : if (DEBUG) { System.out.println("WhileStatement ::= while LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
-			    consumeStatementWhile() ;  
-				break;
-	 
-	    case 535 : if (DEBUG) { System.out.println("WhileStatementNoShortIf ::= while LPAREN Expression..."); }  //$NON-NLS-1$
-			    consumeStatementWhile() ;  
-				break;
-	 
-	    case 536 : if (DEBUG) { System.out.println("DoStatement ::= do Statement while LPAREN Expression..."); }  //$NON-NLS-1$
-			    consumeStatementDo() ;  
-				break;
-	 
-	    case 537 : if (DEBUG) { System.out.println("ForStatement ::= for LPAREN ForInitopt SEMICOLON..."); }  //$NON-NLS-1$
-			    consumeStatementFor() ;  
-				break;
-	 
-	    case 538 : if (DEBUG) { System.out.println("ForStatementNoShortIf ::= for LPAREN ForInitopt..."); }  //$NON-NLS-1$
-			    consumeStatementFor() ;  
-				break;
-	 
-	    case 539 : if (DEBUG) { System.out.println("ForInit ::= StatementExpressionList"); }  //$NON-NLS-1$
-			    consumeForInit() ;  
-				break;
-	 
-	    case 543 : if (DEBUG) { System.out.println("StatementExpressionList ::= StatementExpressionList..."); }  //$NON-NLS-1$
-			    consumeStatementExpressionList() ;  
-				break;
-	 
-	    case 544 : if (DEBUG) { System.out.println("AssertStatement ::= assert Expression SEMICOLON"); }  //$NON-NLS-1$
-			    consumeSimpleAssertStatement() ;  
-				break;
-	 
-	    case 545 : if (DEBUG) { System.out.println("AssertStatement ::= assert Expression COLON Expression"); }  //$NON-NLS-1$
-			    consumeAssertStatement() ;  
-				break;
-	 
-	    case 546 : if (DEBUG) { System.out.println("BreakStatement ::= break SEMICOLON"); }  //$NON-NLS-1$
-			    consumeStatementBreak() ;  
-				break;
-	 
-	    case 547 : if (DEBUG) { System.out.println("BreakStatement ::= break Identifier SEMICOLON"); }  //$NON-NLS-1$
-			    consumeStatementBreakWithLabel() ;  
-				break;
-	 
-	    case 548 : if (DEBUG) { System.out.println("ContinueStatement ::= continue SEMICOLON"); }  //$NON-NLS-1$
-			    consumeStatementContinue() ;  
-				break;
-	 
-	    case 549 : if (DEBUG) { System.out.println("ContinueStatement ::= continue Identifier SEMICOLON"); }  //$NON-NLS-1$
-			    consumeStatementContinueWithLabel() ;  
-				break;
-	 
-	    case 550 : if (DEBUG) { System.out.println("ReturnStatement ::= return Expressionopt SEMICOLON"); }  //$NON-NLS-1$
-			    consumeStatementReturn() ;  
-				break;
-	 
-	    case 551 : if (DEBUG) { System.out.println("ThrowStatement ::= throw Expression SEMICOLON"); }  //$NON-NLS-1$
-			    consumeStatementThrow();  
-				break;
-	 
-	    case 552 : if (DEBUG) { System.out.println("SynchronizedStatement ::= OnlySynchronized LPAREN..."); }  //$NON-NLS-1$
-			    consumeStatementSynchronized();  
-				break;
-	 
-	    case 553 : if (DEBUG) { System.out.println("OnlySynchronized ::= synchronized"); }  //$NON-NLS-1$
-			    consumeOnlySynchronized();  
-				break;
-	 
-	    case 554 : if (DEBUG) { System.out.println("TryStatement ::= try TryBlock Catches"); }  //$NON-NLS-1$
-			    consumeStatementTry(false, false);  
-				break;
-	 
-	    case 555 : if (DEBUG) { System.out.println("TryStatement ::= try TryBlock Catchesopt Finally"); }  //$NON-NLS-1$
-			    consumeStatementTry(true, false);  
-				break;
-	 
-	    case 556 : if (DEBUG) { System.out.println("TryStatementWithResources ::= try ResourceSpecification"); }  //$NON-NLS-1$
-			    consumeStatementTry(false, true);  
-				break;
-	 
-	    case 557 : if (DEBUG) { System.out.println("TryStatementWithResources ::= try ResourceSpecification"); }  //$NON-NLS-1$
-			    consumeStatementTry(true, true);  
-				break;
-	 
-	    case 558 : if (DEBUG) { System.out.println("ResourceSpecification ::= LPAREN Resources ;opt RPAREN"); }  //$NON-NLS-1$
-			    consumeResourceSpecification();  
-				break;
-	 
-	    case 559 : if (DEBUG) { System.out.println(";opt ::="); }  //$NON-NLS-1$
-			    consumeResourceOptionalTrailingSemiColon(false);  
-				break;
-	 
-	    case 560 : if (DEBUG) { System.out.println(";opt ::= SEMICOLON"); }  //$NON-NLS-1$
-			    consumeResourceOptionalTrailingSemiColon(true);  
-				break;
-	 
-	    case 561 : if (DEBUG) { System.out.println("Resources ::= Resource"); }  //$NON-NLS-1$
-			    consumeSingleResource();  
-				break;
-	 
-	    case 562 : if (DEBUG) { System.out.println("Resources ::= Resources TrailingSemiColon Resource"); }  //$NON-NLS-1$
-			    consumeMultipleResources();  
-				break;
-	 
-	    case 563 : if (DEBUG) { System.out.println("TrailingSemiColon ::= SEMICOLON"); }  //$NON-NLS-1$
-			    consumeResourceOptionalTrailingSemiColon(true);  
-				break;
-	 
-	    case 564 : if (DEBUG) { System.out.println("Resource ::= Type PushModifiers VariableDeclaratorId..."); }  //$NON-NLS-1$
-			    consumeResourceAsLocalVariableDeclaration();  
-				break;
-	 
-	    case 565 : if (DEBUG) { System.out.println("Resource ::= Modifiers Type PushRealModifiers..."); }  //$NON-NLS-1$
-			    consumeResourceAsLocalVariableDeclaration();  
-				break;
-	 
-	    case 567 : if (DEBUG) { System.out.println("ExitTryBlock ::="); }  //$NON-NLS-1$
-			    consumeExitTryBlock();  
-				break;
-	 
-	    case 569 : if (DEBUG) { System.out.println("Catches ::= Catches CatchClause"); }  //$NON-NLS-1$
-			    consumeCatches();  
-				break;
-	 
-	    case 570 : if (DEBUG) { System.out.println("CatchClause ::= catch LPAREN CatchFormalParameter RPAREN"); }  //$NON-NLS-1$
-			    consumeStatementCatch() ;  
-				break;
-	 
-	    case 572 : if (DEBUG) { System.out.println("PushLPAREN ::= LPAREN"); }  //$NON-NLS-1$
-			    consumeLeftParen();  
-				break;
-	 
-	    case 573 : if (DEBUG) { System.out.println("PushRPAREN ::= RPAREN"); }  //$NON-NLS-1$
-			    consumeRightParen();  
-				break;
-	 
-	    case 578 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= this"); }  //$NON-NLS-1$
-			    consumePrimaryNoNewArrayThis();  
-				break;
-	 
-	    case 579 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PushLPAREN Expression_NotName..."); }  //$NON-NLS-1$
-			    consumePrimaryNoNewArray();  
-				break;
-	 
-	    case 580 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PushLPAREN Name PushRPAREN"); }  //$NON-NLS-1$
-			    consumePrimaryNoNewArrayWithName();  
-				break;
-	 
-	    case 583 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT this"); }  //$NON-NLS-1$
-			    consumePrimaryNoNewArrayNameThis();  
-				break;
-	 
-	    case 584 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT super"); }  //$NON-NLS-1$
-			    consumePrimaryNoNewArrayNameSuper();  
-				break;
-	 
-	    case 585 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT class"); }  //$NON-NLS-1$
-			    consumePrimaryNoNewArrayName();  
-				break;
-	 
-	    case 586 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name Dims DOT class"); }  //$NON-NLS-1$
-			    consumePrimaryNoNewArrayArrayType();  
-				break;
-	 
-	    case 587 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PrimitiveType Dims DOT class"); }  //$NON-NLS-1$
-			    consumePrimaryNoNewArrayPrimitiveArrayType();  
-				break;
-	 
-	    case 588 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PrimitiveType DOT class"); }  //$NON-NLS-1$
-			    consumePrimaryNoNewArrayPrimitiveType();  
-				break;
-	 
-	    case 594 : if (DEBUG) { System.out.println("ReferenceExpressionTypeArgumentsAndTrunk0 ::=..."); }  //$NON-NLS-1$
-			    consumeReferenceExpressionTypeArgumentsAndTrunk(false);  
-				break;
-	 
-	    case 595 : if (DEBUG) { System.out.println("ReferenceExpressionTypeArgumentsAndTrunk0 ::=..."); }  //$NON-NLS-1$
-			    consumeReferenceExpressionTypeArgumentsAndTrunk(true);  
-				break;
-	 
-	    case 596 : if (DEBUG) { System.out.println("ReferenceExpression ::= PrimitiveType Dims COLON_COLON"); }  //$NON-NLS-1$
-			    consumeReferenceExpressionTypeForm(true);  
-				break;
-	 
-	    case 597 : if (DEBUG) { System.out.println("ReferenceExpression ::= Name Dimsopt COLON_COLON..."); }  //$NON-NLS-1$
-			    consumeReferenceExpressionTypeForm(false);  
-				break;
-	 
-	    case 598 : if (DEBUG) { System.out.println("ReferenceExpression ::= Name BeginTypeArguments..."); }  //$NON-NLS-1$
-			    consumeReferenceExpressionGenericTypeForm();  
-				break;
-	 
-	    case 599 : if (DEBUG) { System.out.println("ReferenceExpression ::= Primary COLON_COLON..."); }  //$NON-NLS-1$
-			    consumeReferenceExpressionPrimaryForm();  
-				break;
-	 
-	    case 600 : if (DEBUG) { System.out.println("ReferenceExpression ::= super COLON_COLON..."); }  //$NON-NLS-1$
-			    consumeReferenceExpressionSuperForm();  
-				break;
-	 
-	    case 601 : if (DEBUG) { System.out.println("NonWildTypeArgumentsopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyTypeArguments();  
-				break;
-	 
-	    case 603 : if (DEBUG) { System.out.println("IdentifierOrNew ::= Identifier"); }  //$NON-NLS-1$
-			    consumeIdentifierOrNew(false);  
-				break;
-	 
-	    case 604 : if (DEBUG) { System.out.println("IdentifierOrNew ::= new"); }  //$NON-NLS-1$
-			    consumeIdentifierOrNew(true);  
-				break;
-	 
-	    case 605 : if (DEBUG) { System.out.println("LambdaExpression ::= LambdaParameters ARROW LambdaBody"); }  //$NON-NLS-1$
-			    consumeLambdaExpression();  
-				break;
-	 
-	    case 606 : if (DEBUG) { System.out.println("LambdaParameters ::= Identifier"); }  //$NON-NLS-1$
-			    consumeTypeElidedLambdaParameter(false);  
-				break;
-	 
-	    case 612 : if (DEBUG) { System.out.println("TypeElidedFormalParameterList ::=..."); }  //$NON-NLS-1$
-			    consumeFormalParameterList();  
-				break;
-	 
-	    case 613 : if (DEBUG) { System.out.println("TypeElidedFormalParameter ::= Modifiersopt Identifier"); }  //$NON-NLS-1$
-			    consumeTypeElidedLambdaParameter(true);  
-				break;
-	 
-	    case 615 : if (DEBUG) { System.out.println("LambdaBody ::= NestedType NestedMethod LBRACE..."); }  //$NON-NLS-1$
-			    consumeBlock();  
-				break;
-	 
-	    case 616 : if (DEBUG) { System.out.println("ElidedLeftBraceAndReturn ::="); }  //$NON-NLS-1$
-			    consumeElidedLeftBraceAndReturn();  
-				break;
-	 
-	    case 617 : if (DEBUG) { System.out.println("AllocationHeader ::= new ClassType LPAREN..."); }  //$NON-NLS-1$
-			    consumeAllocationHeader();  
-				break;
-	 
-	    case 618 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= new..."); }  //$NON-NLS-1$
-			    consumeClassInstanceCreationExpressionWithTypeArguments();  
-				break;
-	 
-	    case 619 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= new ClassType..."); }  //$NON-NLS-1$
-			    consumeClassInstanceCreationExpression();  
-				break;
-	 
-	    case 620 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= Primary DOT new..."); }  //$NON-NLS-1$
-			    consumeClassInstanceCreationExpressionQualifiedWithTypeArguments() ;  
-				break;
-	 
-	    case 621 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= Primary DOT new..."); }  //$NON-NLS-1$
-			    consumeClassInstanceCreationExpressionQualified() ;  
-				break;
-	 
-	    case 622 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::=..."); }  //$NON-NLS-1$
-			    consumeClassInstanceCreationExpressionQualified() ;  
-				break;
-	 
-	    case 623 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::=..."); }  //$NON-NLS-1$
-			    consumeClassInstanceCreationExpressionQualifiedWithTypeArguments() ;  
-				break;
-	 
-	    case 624 : if (DEBUG) { System.out.println("EnterInstanceCreationArgumentList ::="); }  //$NON-NLS-1$
-			    consumeEnterInstanceCreationArgumentList();  
-				break;
-	 
-	    case 625 : if (DEBUG) { System.out.println("ClassInstanceCreationExpressionName ::= Name DOT"); }  //$NON-NLS-1$
-			    consumeClassInstanceCreationExpressionName() ;  
-				break;
-	 
-	    case 626 : if (DEBUG) { System.out.println("UnqualifiedClassBodyopt ::="); }  //$NON-NLS-1$
-			    consumeClassBodyopt();  
-				break;
-	 
-	    case 628 : if (DEBUG) { System.out.println("UnqualifiedEnterAnonymousClassBody ::="); }  //$NON-NLS-1$
-			    consumeEnterAnonymousClassBody(false);  
-				break;
-	 
-	    case 629 : if (DEBUG) { System.out.println("QualifiedClassBodyopt ::="); }  //$NON-NLS-1$
-			    consumeClassBodyopt();  
-				break;
-	 
-	    case 631 : if (DEBUG) { System.out.println("QualifiedEnterAnonymousClassBody ::="); }  //$NON-NLS-1$
-			    consumeEnterAnonymousClassBody(true);  
-				break;
-	 
-	    case 633 : if (DEBUG) { System.out.println("ArgumentList ::= ArgumentList COMMA Expression"); }  //$NON-NLS-1$
-			    consumeArgumentList();  
-				break;
-	 
-	    case 634 : if (DEBUG) { System.out.println("ArrayCreationHeader ::= new PrimitiveType..."); }  //$NON-NLS-1$
-			    consumeArrayCreationHeader();  
-				break;
-	 
-	    case 635 : if (DEBUG) { System.out.println("ArrayCreationHeader ::= new ClassOrInterfaceType..."); }  //$NON-NLS-1$
-			    consumeArrayCreationHeader();  
-				break;
-	 
-	    case 636 : if (DEBUG) { System.out.println("ArrayCreationWithoutArrayInitializer ::= new..."); }  //$NON-NLS-1$
-			    consumeArrayCreationExpressionWithoutInitializer();  
-				break;
-	 
-	    case 637 : if (DEBUG) { System.out.println("ArrayCreationWithArrayInitializer ::= new PrimitiveType"); }  //$NON-NLS-1$
-			    consumeArrayCreationExpressionWithInitializer();  
-				break;
-	 
-	    case 638 : if (DEBUG) { System.out.println("ArrayCreationWithoutArrayInitializer ::= new..."); }  //$NON-NLS-1$
-			    consumeArrayCreationExpressionWithoutInitializer();  
-				break;
-	 
-	    case 639 : if (DEBUG) { System.out.println("ArrayCreationWithArrayInitializer ::= new..."); }  //$NON-NLS-1$
-			    consumeArrayCreationExpressionWithInitializer();  
-				break;
-	 
-	    case 641 : if (DEBUG) { System.out.println("DimWithOrWithOutExprs ::= DimWithOrWithOutExprs..."); }  //$NON-NLS-1$
-			    consumeDimWithOrWithOutExprs();  
-				break;
-	 
-	     case 643 : if (DEBUG) { System.out.println("DimWithOrWithOutExpr ::= TypeAnnotationsopt LBRACKET..."); }  //$NON-NLS-1$
-			    consumeDimWithOrWithOutExpr();  
-				break;
-	 
-	     case 644 : if (DEBUG) { System.out.println("Dims ::= DimsLoop"); }  //$NON-NLS-1$
-			    consumeDims();  
-				break;
-	 
-	     case 647 : if (DEBUG) { System.out.println("OneDimLoop ::= LBRACKET RBRACKET"); }  //$NON-NLS-1$
-			    consumeOneDimLoop(false);  
-				break;
-	 
-	     case 648 : if (DEBUG) { System.out.println("OneDimLoop ::= TypeAnnotations LBRACKET RBRACKET"); }  //$NON-NLS-1$
-			    consumeOneDimLoop(true);  
-				break;
-	 
-	    case 649 : if (DEBUG) { System.out.println("FieldAccess ::= Primary DOT JavaIdentifier"); }  //$NON-NLS-1$
-			    consumeFieldAccess(false);  
-				break;
-	 
-	    case 650 : if (DEBUG) { System.out.println("FieldAccess ::= super DOT JavaIdentifier"); }  //$NON-NLS-1$
-			    consumeFieldAccess(true);  
-				break;
-	 
-	    case 651 : if (DEBUG) { System.out.println("MethodInvocation ::= NameOrAj LPAREN ArgumentListopt..."); }  //$NON-NLS-1$
-			    consumeMethodInvocationName();  
-				break;
-	 
-	    case 652 : if (DEBUG) { System.out.println("MethodInvocation ::= Name DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
-			    consumeMethodInvocationNameWithTypeArguments();  
-				break;
-	 
-	    case 653 : if (DEBUG) { System.out.println("MethodInvocation ::= Primary DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
-			    consumeMethodInvocationPrimaryWithTypeArguments();  
-				break;
-	 
-	    case 654 : if (DEBUG) { System.out.println("MethodInvocation ::= Primary DOT JavaIdentifier LPAREN"); }  //$NON-NLS-1$
-			    consumeMethodInvocationPrimary();  
-				break;
-	 
-	    case 655 : if (DEBUG) { System.out.println("MethodInvocation ::= super DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
-			    consumeMethodInvocationSuperWithTypeArguments();  
-				break;
-	 
-	    case 656 : if (DEBUG) { System.out.println("MethodInvocation ::= super DOT JavaIdentifier LPAREN..."); }  //$NON-NLS-1$
-			    consumeMethodInvocationSuper();  
-				break;
-	 
-	    case 657 : if (DEBUG) { System.out.println("ArrayAccess ::= Name LBRACKET Expression RBRACKET"); }  //$NON-NLS-1$
-			    consumeArrayAccess(true);  
-				break;
-	 
-	    case 658 : if (DEBUG) { System.out.println("ArrayAccess ::= AjName LBRACKET Expression RBRACKET"); }  //$NON-NLS-1$
-			    consumeArrayAccess(true);  
-				break;
-	 
-	    case 659 : if (DEBUG) { System.out.println("ArrayAccess ::= PrimaryNoNewArray LBRACKET Expression..."); }  //$NON-NLS-1$
-			    consumeArrayAccess(false);  
-				break;
-	 
-	    case 660 : if (DEBUG) { System.out.println("ArrayAccess ::= ArrayCreationWithArrayInitializer..."); }  //$NON-NLS-1$
-			    consumeArrayAccess(false);  
-				break;
-	 
-	    case 662 : if (DEBUG) { System.out.println("PostfixExpression ::= NameOrAj"); }  //$NON-NLS-1$
-			    consumePostfixExpression();  
-				break;
-	 
-	    case 665 : if (DEBUG) { System.out.println("PostIncrementExpression ::= PostfixExpression PLUS_PLUS"); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.PLUS,true);  
-				break;
-	 
-	    case 666 : if (DEBUG) { System.out.println("PostDecrementExpression ::= PostfixExpression..."); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.MINUS,true);  
-				break;
-	 
-	    case 667 : if (DEBUG) { System.out.println("PushPosition ::="); }  //$NON-NLS-1$
-			    consumePushPosition();  
-				break;
-	 
-	    case 670 : if (DEBUG) { System.out.println("UnaryExpression ::= PLUS PushPosition UnaryExpression"); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.PLUS);  
-				break;
-	 
-	    case 671 : if (DEBUG) { System.out.println("UnaryExpression ::= MINUS PushPosition UnaryExpression"); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.MINUS);  
-				break;
-	 
-	    case 673 : if (DEBUG) { System.out.println("PreIncrementExpression ::= PLUS_PLUS PushPosition..."); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.PLUS,false);  
-				break;
-	 
-	    case 674 : if (DEBUG) { System.out.println("PreDecrementExpression ::= MINUS_MINUS PushPosition..."); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.MINUS,false);  
-				break;
-	 
-	    case 676 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus ::= TWIDDLE PushPosition..."); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.TWIDDLE);  
-				break;
-	 
-	    case 677 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus ::= NOT PushPosition..."); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.NOT);  
-				break;
-	 
-	    case 679 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN PrimitiveType Dimsopt..."); }  //$NON-NLS-1$
-			    consumeCastExpressionWithPrimitiveType();  
-				break;
-	 
-	    case 680 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name..."); }  //$NON-NLS-1$
-			    consumeCastExpressionWithGenericsArray();  
-				break;
-	 
-	    case 681 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name..."); }  //$NON-NLS-1$
-			    consumeCastExpressionWithQualifiedGenericsArray();  
-				break;
-	 
-	    case 682 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name PushRPAREN..."); }  //$NON-NLS-1$
-			    consumeCastExpressionLL1();  
-				break;
-	 
-	    case 683 : if (DEBUG) { System.out.println("CastExpression ::= BeginIntersectionCast PushLPAREN..."); }  //$NON-NLS-1$
-			    consumeCastExpressionLL1WithBounds();  
-				break;
-	 
-	    case 684 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name Dims..."); }  //$NON-NLS-1$
-			    consumeCastExpressionWithNameArray();  
-				break;
-	 
-	    case 685 : if (DEBUG) { System.out.println("AdditionalBoundsListOpt ::="); }  //$NON-NLS-1$
-			    consumeZeroAdditionalBounds();  
-				break;
-	 
-	    case 689 : if (DEBUG) { System.out.println("OnlyTypeArgumentsForCastExpression ::= OnlyTypeArguments"); }  //$NON-NLS-1$
-			    consumeOnlyTypeArgumentsForCastExpression();  
-				break;
-	 
-	    case 690 : if (DEBUG) { System.out.println("InsideCastExpression ::="); }  //$NON-NLS-1$
-			    consumeInsideCastExpression();  
-				break;
-	 
-	    case 691 : if (DEBUG) { System.out.println("InsideCastExpressionLL1 ::="); }  //$NON-NLS-1$
-			    consumeInsideCastExpressionLL1();  
-				break;
-	 
-	    case 692 : if (DEBUG) { System.out.println("InsideCastExpressionLL1WithBounds ::="); }  //$NON-NLS-1$
-			    consumeInsideCastExpressionLL1WithBounds ();  
-				break;
-	 
-	    case 693 : if (DEBUG) { System.out.println("InsideCastExpressionWithQualifiedGenerics ::="); }  //$NON-NLS-1$
-			    consumeInsideCastExpressionWithQualifiedGenerics();  
-				break;
-	 
-	    case 695 : if (DEBUG) { System.out.println("MultiplicativeExpression ::= MultiplicativeExpression..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.MULTIPLY);  
-				break;
-	 
-	    case 696 : if (DEBUG) { System.out.println("MultiplicativeExpression ::= MultiplicativeExpression..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.DIVIDE);  
-				break;
-	 
-	    case 697 : if (DEBUG) { System.out.println("MultiplicativeExpression ::= MultiplicativeExpression..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.REMAINDER);  
-				break;
-	 
-	    case 699 : if (DEBUG) { System.out.println("AdditiveExpression ::= AdditiveExpression PLUS..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.PLUS);  
-				break;
-	 
-	    case 700 : if (DEBUG) { System.out.println("AdditiveExpression ::= AdditiveExpression MINUS..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.MINUS);  
-				break;
-	 
-	    case 702 : if (DEBUG) { System.out.println("ShiftExpression ::= ShiftExpression LEFT_SHIFT..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.LEFT_SHIFT);  
-				break;
-	 
-	    case 703 : if (DEBUG) { System.out.println("ShiftExpression ::= ShiftExpression RIGHT_SHIFT..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.RIGHT_SHIFT);  
-				break;
-	 
-	    case 704 : if (DEBUG) { System.out.println("ShiftExpression ::= ShiftExpression UNSIGNED_RIGHT_SHIFT"); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.UNSIGNED_RIGHT_SHIFT);  
-				break;
-	 
-	    case 706 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression LESS..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.LESS);  
-				break;
-	 
-	    case 707 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression GREATER..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.GREATER);  
-				break;
-	 
-	    case 708 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression LESS_EQUAL"); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.LESS_EQUAL);  
-				break;
-	 
-	    case 709 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.GREATER_EQUAL);  
-				break;
-	 
-	    case 711 : if (DEBUG) { System.out.println("InstanceofExpression ::= InstanceofExpression instanceof"); }  //$NON-NLS-1$
-			    consumeInstanceOfExpression();  
-				break;
-	 
-	    case 713 : if (DEBUG) { System.out.println("EqualityExpression ::= EqualityExpression EQUAL_EQUAL..."); }  //$NON-NLS-1$
-			    consumeEqualityExpression(OperatorIds.EQUAL_EQUAL);  
-				break;
-	 
-	    case 714 : if (DEBUG) { System.out.println("EqualityExpression ::= EqualityExpression NOT_EQUAL..."); }  //$NON-NLS-1$
-			    consumeEqualityExpression(OperatorIds.NOT_EQUAL);  
-				break;
-	 
-	    case 716 : if (DEBUG) { System.out.println("AndExpression ::= AndExpression AND EqualityExpression"); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.AND);  
-				break;
-	 
-	    case 718 : if (DEBUG) { System.out.println("ExclusiveOrExpression ::= ExclusiveOrExpression XOR..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.XOR);  
-				break;
-	 
-	    case 720 : if (DEBUG) { System.out.println("InclusiveOrExpression ::= InclusiveOrExpression OR..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.OR);  
-				break;
-	 
-	    case 722 : if (DEBUG) { System.out.println("ConditionalAndExpression ::= ConditionalAndExpression..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.AND_AND);  
-				break;
-	 
-	    case 724 : if (DEBUG) { System.out.println("ConditionalOrExpression ::= ConditionalOrExpression..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.OR_OR);  
-				break;
-	 
-	    case 726 : if (DEBUG) { System.out.println("ConditionalExpression ::= ConditionalOrExpression..."); }  //$NON-NLS-1$
-			    consumeConditionalExpression(OperatorIds.QUESTIONCOLON) ;  
-				break;
-	 
-	    case 729 : if (DEBUG) { System.out.println("Assignment ::= PostfixExpression AssignmentOperator..."); }  //$NON-NLS-1$
-			    consumeAssignment();  
-				break;
-	 
-	    case 731 : if (DEBUG) { System.out.println("Assignment ::= InvalidArrayInitializerAssignement"); }  //$NON-NLS-1$
-			    ignoreExpressionAssignment(); 
-				break;
-	 
-	    case 732 : if (DEBUG) { System.out.println("AssignmentOperator ::= EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(EQUAL);  
-				break;
-	 
-	    case 733 : if (DEBUG) { System.out.println("AssignmentOperator ::= MULTIPLY_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(MULTIPLY);  
-				break;
-	 
-	    case 734 : if (DEBUG) { System.out.println("AssignmentOperator ::= DIVIDE_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(DIVIDE);  
-				break;
-	 
-	    case 735 : if (DEBUG) { System.out.println("AssignmentOperator ::= REMAINDER_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(REMAINDER);  
-				break;
-	 
-	    case 736 : if (DEBUG) { System.out.println("AssignmentOperator ::= PLUS_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(PLUS);  
-				break;
-	 
-	    case 737 : if (DEBUG) { System.out.println("AssignmentOperator ::= MINUS_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(MINUS);  
-				break;
-	 
-	    case 738 : if (DEBUG) { System.out.println("AssignmentOperator ::= LEFT_SHIFT_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(LEFT_SHIFT);  
-				break;
-	 
-	    case 739 : if (DEBUG) { System.out.println("AssignmentOperator ::= RIGHT_SHIFT_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(RIGHT_SHIFT);  
-				break;
-	 
-	    case 740 : if (DEBUG) { System.out.println("AssignmentOperator ::= UNSIGNED_RIGHT_SHIFT_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(UNSIGNED_RIGHT_SHIFT);  
-				break;
-	 
-	    case 741 : if (DEBUG) { System.out.println("AssignmentOperator ::= AND_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(AND);  
-				break;
-	 
-	    case 742 : if (DEBUG) { System.out.println("AssignmentOperator ::= XOR_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(XOR);  
-				break;
-	 
-	    case 743 : if (DEBUG) { System.out.println("AssignmentOperator ::= OR_EQUAL"); }  //$NON-NLS-1$
-			    consumeAssignmentOperator(OR);  
-				break;
-	 
-	    case 744 : if (DEBUG) { System.out.println("Expression ::= AssignmentExpression"); }  //$NON-NLS-1$
-			    consumeExpression();  
-				break;
-	 
-	    case 747 : if (DEBUG) { System.out.println("Expressionopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyExpression();  
-				break;
-	 
-	    case 752 : if (DEBUG) { System.out.println("ClassBodyDeclarationsopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyClassBodyDeclarationsopt();  
-				break;
-	 
-	    case 753 : if (DEBUG) { System.out.println("ClassBodyDeclarationsopt ::= NestedType..."); }  //$NON-NLS-1$
-			    consumeClassBodyDeclarationsopt();  
-				break;
-	 
-	     case 754 : if (DEBUG) { System.out.println("Modifiersopt ::="); }  //$NON-NLS-1$
-			    consumeDefaultModifiers();  
-				break;
-	 
-	    case 755 : if (DEBUG) { System.out.println("Modifiersopt ::= Modifiers"); }  //$NON-NLS-1$
-			    consumeModifiers();  
-				break;
-	 
-	    case 756 : if (DEBUG) { System.out.println("BlockStatementsopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyBlockStatementsopt();  
-				break;
-	 
-	     case 758 : if (DEBUG) { System.out.println("Dimsopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyDimsopt();  
-				break;
-	 
-	     case 760 : if (DEBUG) { System.out.println("ArgumentListopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyArgumentListopt();  
-				break;
-	 
-	    case 764 : if (DEBUG) { System.out.println("FormalParameterListopt ::="); }  //$NON-NLS-1$
-			    consumeFormalParameterListopt();  
-				break;
-	 
-	     case 768 : if (DEBUG) { System.out.println("InterfaceMemberDeclarationsopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyInterfaceMemberDeclarationsopt();  
-				break;
-	 
-	     case 769 : if (DEBUG) { System.out.println("InterfaceMemberDeclarationsopt ::= NestedType..."); }  //$NON-NLS-1$
-			    consumeInterfaceMemberDeclarationsopt();  
-				break;
-	 
-	    case 770 : if (DEBUG) { System.out.println("NestedType ::="); }  //$NON-NLS-1$
-			    consumeNestedType();  
-				break;
+ case 60 : if (DEBUG) { System.out.println("GenericType ::= ClassOrInterface LESS GREATER"); }  //$NON-NLS-1$
+		    consumeGenericTypeWithDiamond();  
+			break;
 
-	     case 771 : if (DEBUG) { System.out.println("ForInitopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyForInitopt();  
-				break;
-	 
-	     case 773 : if (DEBUG) { System.out.println("ForUpdateopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyForUpdateopt();  
-				break;
-	 
-	     case 777 : if (DEBUG) { System.out.println("Catchesopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyCatchesopt();  
-				break;
-	 
-	     case 779 : if (DEBUG) { System.out.println("EnumDeclaration ::= EnumHeader EnumBody"); }  //$NON-NLS-1$
-			    consumeEnumDeclaration();  
-				break;
-	 
-	     case 780 : if (DEBUG) { System.out.println("EnumHeader ::= EnumHeaderName ClassHeaderImplementsopt"); }  //$NON-NLS-1$
-			    consumeEnumHeader();  
-				break;
-	 
-	     case 781 : if (DEBUG) { System.out.println("EnumHeaderName ::= Modifiersopt enum JavaIdentifier"); }  //$NON-NLS-1$
-			    consumeEnumHeaderName();  
-				break;
-	 
-	     case 782 : if (DEBUG) { System.out.println("EnumHeaderName ::= Modifiersopt enum JavaIdentifier..."); }  //$NON-NLS-1$
-			    consumeEnumHeaderNameWithTypeParameters();  
-				break;
-	 
-	     case 783 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE EnumBodyDeclarationsopt RBRACE"); }  //$NON-NLS-1$
-			    consumeEnumBodyNoConstants();  
-				break;
-	 
-	     case 784 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE COMMA EnumBodyDeclarationsopt..."); }  //$NON-NLS-1$
-			    consumeEnumBodyNoConstants();  
-				break;
-	 
-	     case 785 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE EnumConstants COMMA..."); }  //$NON-NLS-1$
-			    consumeEnumBodyWithConstants();  
-				break;
-	 
-	     case 786 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE EnumConstants..."); }  //$NON-NLS-1$
-			    consumeEnumBodyWithConstants();  
-				break;
-	 
-	    case 788 : if (DEBUG) { System.out.println("EnumConstants ::= EnumConstants COMMA EnumConstant"); }  //$NON-NLS-1$
-			    consumeEnumConstants();  
-				break;
-	 
-	    case 789 : if (DEBUG) { System.out.println("EnumConstantHeaderName ::= Modifiersopt Identifier"); }  //$NON-NLS-1$
-			    consumeEnumConstantHeaderName();  
-				break;
-	 
-	    case 790 : if (DEBUG) { System.out.println("EnumConstantHeader ::= EnumConstantHeaderName..."); }  //$NON-NLS-1$
-			    consumeEnumConstantHeader();  
-				break;
-	 
-	    case 791 : if (DEBUG) { System.out.println("EnumConstant ::= EnumConstantHeader ForceNoDiet..."); }  //$NON-NLS-1$
-			    consumeEnumConstantWithClassBody();  
-				break;
-	 
-	    case 792 : if (DEBUG) { System.out.println("EnumConstant ::= EnumConstantHeader"); }  //$NON-NLS-1$
-			    consumeEnumConstantNoClassBody();  
-				break;
-	 
-	    case 793 : if (DEBUG) { System.out.println("Arguments ::= LPAREN ArgumentListopt RPAREN"); }  //$NON-NLS-1$
-			    consumeArguments();  
-				break;
-	 
-	    case 794 : if (DEBUG) { System.out.println("Argumentsopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyArguments();  
-				break;
-	 
-	    case 796 : if (DEBUG) { System.out.println("EnumDeclarations ::= SEMICOLON ClassBodyDeclarationsopt"); }  //$NON-NLS-1$
-			    consumeEnumDeclarations();  
-				break;
-	 
-	    case 797 : if (DEBUG) { System.out.println("EnumBodyDeclarationsopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyEnumDeclarations();  
-				break;
-	 
-	    case 799 : if (DEBUG) { System.out.println("EnhancedForStatement ::= EnhancedForStatementHeader..."); }  //$NON-NLS-1$
-			    consumeEnhancedForStatement();  
-				break;
-	 
-	    case 800 : if (DEBUG) { System.out.println("EnhancedForStatementNoShortIf ::=..."); }  //$NON-NLS-1$
-			    consumeEnhancedForStatement();  
-				break;
-	 
-	    case 801 : if (DEBUG) { System.out.println("EnhancedForStatementHeaderInit ::= for LPAREN Type..."); }  //$NON-NLS-1$
-			    consumeEnhancedForStatementHeaderInit(false);  
-				break;
-	 
-	    case 802 : if (DEBUG) { System.out.println("EnhancedForStatementHeaderInit ::= for LPAREN Modifiers"); }  //$NON-NLS-1$
-			    consumeEnhancedForStatementHeaderInit(true);  
-				break;
-	 
-	    case 803 : if (DEBUG) { System.out.println("EnhancedForStatementHeader ::=..."); }  //$NON-NLS-1$
-			    consumeEnhancedForStatementHeader();  
-				break;
-	 
-	    case 804 : if (DEBUG) { System.out.println("SingleStaticImportDeclaration ::=..."); }  //$NON-NLS-1$
-			    consumeImportDeclaration();  
-				break;
-	 
-	    case 805 : if (DEBUG) { System.out.println("SingleStaticImportDeclarationName ::= import static Name"); }  //$NON-NLS-1$
-			    consumeSingleStaticImportDeclarationName();  
-				break;
-	 
-	    case 806 : if (DEBUG) { System.out.println("StaticImportOnDemandDeclaration ::=..."); }  //$NON-NLS-1$
-			    consumeImportDeclaration();  
-				break;
-	 
-	    case 807 : if (DEBUG) { System.out.println("StaticImportOnDemandDeclarationName ::= import static..."); }  //$NON-NLS-1$
-			    consumeStaticImportOnDemandDeclarationName();  
-				break;
-	 
-	    case 808 : if (DEBUG) { System.out.println("TypeArguments ::= LESS TypeArgumentList1"); }  //$NON-NLS-1$
-			    consumeTypeArguments();  
-				break;
-	 
-	    case 809 : if (DEBUG) { System.out.println("OnlyTypeArguments ::= LESS TypeArgumentList1"); }  //$NON-NLS-1$
-			    consumeOnlyTypeArguments();  
-				break;
-	 
-	    case 811 : if (DEBUG) { System.out.println("TypeArgumentList1 ::= TypeArgumentList COMMA..."); }  //$NON-NLS-1$
-			    consumeTypeArgumentList1();  
-				break;
-	 
-	    case 813 : if (DEBUG) { System.out.println("TypeArgumentList ::= TypeArgumentList COMMA TypeArgument"); }  //$NON-NLS-1$
-			    consumeTypeArgumentList();  
-				break;
-	 
-	    case 814 : if (DEBUG) { System.out.println("TypeArgument ::= ReferenceType"); }  //$NON-NLS-1$
-			    consumeTypeArgument();  
-				break;
-	 
-	    case 818 : if (DEBUG) { System.out.println("ReferenceType1 ::= ReferenceType GREATER"); }  //$NON-NLS-1$
-			    consumeReferenceType1();  
-				break;
-	 
-	    case 819 : if (DEBUG) { System.out.println("ReferenceType1 ::= ClassOrInterface LESS..."); }  //$NON-NLS-1$
-			    consumeTypeArgumentReferenceType1();  
-				break;
-	 
-	    case 821 : if (DEBUG) { System.out.println("TypeArgumentList2 ::= TypeArgumentList COMMA..."); }  //$NON-NLS-1$
-			    consumeTypeArgumentList2();  
-				break;
-	 
-	    case 824 : if (DEBUG) { System.out.println("ReferenceType2 ::= ReferenceType RIGHT_SHIFT"); }  //$NON-NLS-1$
-			    consumeReferenceType2();  
-				break;
-	 
-	    case 825 : if (DEBUG) { System.out.println("ReferenceType2 ::= ClassOrInterface LESS..."); }  //$NON-NLS-1$
-			    consumeTypeArgumentReferenceType2();  
-				break;
-	 
-	    case 827 : if (DEBUG) { System.out.println("TypeArgumentList3 ::= TypeArgumentList COMMA..."); }  //$NON-NLS-1$
-			    consumeTypeArgumentList3();  
-				break;
-	 
-	    case 830 : if (DEBUG) { System.out.println("ReferenceType3 ::= ReferenceType UNSIGNED_RIGHT_SHIFT"); }  //$NON-NLS-1$
-			    consumeReferenceType3();  
-				break;
-	 
-	    case 831 : if (DEBUG) { System.out.println("Wildcard ::= TypeAnnotationsopt QUESTION"); }  //$NON-NLS-1$
-			    consumeWildcard();  
-				break;
-	 
-	    case 832 : if (DEBUG) { System.out.println("Wildcard ::= TypeAnnotationsopt QUESTION WildcardBounds"); }  //$NON-NLS-1$
-			    consumeWildcardWithBounds();  
-				break;
-	 
-	    case 833 : if (DEBUG) { System.out.println("WildcardBounds ::= extends ReferenceType"); }  //$NON-NLS-1$
-			    consumeWildcardBoundsExtends();  
-				break;
-	 
-	    case 834 : if (DEBUG) { System.out.println("WildcardBounds ::= super ReferenceType"); }  //$NON-NLS-1$
-			    consumeWildcardBoundsSuper();  
-				break;
-	 
-	    case 835 : if (DEBUG) { System.out.println("Wildcard1 ::= TypeAnnotationsopt QUESTION GREATER"); }  //$NON-NLS-1$
-			    consumeWildcard1();  
-				break;
-	 
-	    case 836 : if (DEBUG) { System.out.println("Wildcard1 ::= TypeAnnotationsopt QUESTION..."); }  //$NON-NLS-1$
-			    consumeWildcard1WithBounds();  
-				break;
-	 
-	    case 837 : if (DEBUG) { System.out.println("WildcardBounds1 ::= extends ReferenceType1"); }  //$NON-NLS-1$
-			    consumeWildcardBounds1Extends();  
-				break;
-	 
-	    case 838 : if (DEBUG) { System.out.println("WildcardBounds1 ::= super ReferenceType1"); }  //$NON-NLS-1$
-			    consumeWildcardBounds1Super();  
-				break;
-	 
-	    case 839 : if (DEBUG) { System.out.println("Wildcard2 ::= TypeAnnotationsopt QUESTION RIGHT_SHIFT"); }  //$NON-NLS-1$
-			    consumeWildcard2();  
-				break;
-	 
-	    case 840 : if (DEBUG) { System.out.println("Wildcard2 ::= TypeAnnotationsopt QUESTION..."); }  //$NON-NLS-1$
-			    consumeWildcard2WithBounds();  
-				break;
-	 
-	    case 841 : if (DEBUG) { System.out.println("WildcardBounds2 ::= extends ReferenceType2"); }  //$NON-NLS-1$
-			    consumeWildcardBounds2Extends();  
-				break;
-	 
-	    case 842 : if (DEBUG) { System.out.println("WildcardBounds2 ::= super ReferenceType2"); }  //$NON-NLS-1$
-			    consumeWildcardBounds2Super();  
-				break;
-	 
-	    case 843 : if (DEBUG) { System.out.println("Wildcard3 ::= TypeAnnotationsopt QUESTION..."); }  //$NON-NLS-1$
-			    consumeWildcard3();  
-				break;
-	 
-	    case 844 : if (DEBUG) { System.out.println("Wildcard3 ::= TypeAnnotationsopt QUESTION..."); }  //$NON-NLS-1$
-			    consumeWildcard3WithBounds();  
-				break;
-	 
-	    case 845 : if (DEBUG) { System.out.println("WildcardBounds3 ::= extends ReferenceType3"); }  //$NON-NLS-1$
-			    consumeWildcardBounds3Extends();  
-				break;
-	 
-	    case 846 : if (DEBUG) { System.out.println("WildcardBounds3 ::= super ReferenceType3"); }  //$NON-NLS-1$
-			    consumeWildcardBounds3Super();  
-				break;
-	 
-	    case 847 : if (DEBUG) { System.out.println("TypeParameterHeader ::= TypeAnnotationsopt..."); }  //$NON-NLS-1$
-			    consumeTypeParameterHeader();  
-				break;
-	 
-	    case 848 : if (DEBUG) { System.out.println("TypeParameters ::= LESS TypeParameterList1"); }  //$NON-NLS-1$
-			    consumeTypeParameters();  
-				break;
-	 
-	    case 850 : if (DEBUG) { System.out.println("TypeParameterList ::= TypeParameterList COMMA..."); }  //$NON-NLS-1$
-			    consumeTypeParameterList();  
-				break;
-	 
-	    case 852 : if (DEBUG) { System.out.println("TypeParameter ::= TypeParameterHeader extends..."); }  //$NON-NLS-1$
-			    consumeTypeParameterWithExtends();  
-				break;
-	 
-	    case 853 : if (DEBUG) { System.out.println("TypeParameter ::= TypeParameterHeader extends..."); }  //$NON-NLS-1$
-			    consumeTypeParameterWithExtendsAndBounds();  
-				break;
-	 
-	    case 855 : if (DEBUG) { System.out.println("AdditionalBoundList ::= AdditionalBoundList..."); }  //$NON-NLS-1$
-			    consumeAdditionalBoundList();  
-				break;
-	 
-	    case 856 : if (DEBUG) { System.out.println("AdditionalBound ::= AND ReferenceType"); }  //$NON-NLS-1$
-			    consumeAdditionalBound();  
-				break;
-	 
-	    case 858 : if (DEBUG) { System.out.println("TypeParameterList1 ::= TypeParameterList COMMA..."); }  //$NON-NLS-1$
-			    consumeTypeParameterList1();  
-				break;
-	 
-	    case 859 : if (DEBUG) { System.out.println("TypeParameter1 ::= TypeParameterHeader GREATER"); }  //$NON-NLS-1$
-			    consumeTypeParameter1();  
-				break;
-	 
-	    case 860 : if (DEBUG) { System.out.println("TypeParameter1 ::= TypeParameterHeader extends..."); }  //$NON-NLS-1$
-			    consumeTypeParameter1WithExtends();  
-				break;
-	 
-	    case 861 : if (DEBUG) { System.out.println("TypeParameter1 ::= TypeParameterHeader extends..."); }  //$NON-NLS-1$
-			    consumeTypeParameter1WithExtendsAndBounds();  
-				break;
-	 
-	    case 863 : if (DEBUG) { System.out.println("AdditionalBoundList1 ::= AdditionalBoundList..."); }  //$NON-NLS-1$
-			    consumeAdditionalBoundList1();  
-				break;
-	 
-	    case 864 : if (DEBUG) { System.out.println("AdditionalBound1 ::= AND ReferenceType1"); }  //$NON-NLS-1$
-			    consumeAdditionalBound1();  
-				break;
-	 
-	    case 870 : if (DEBUG) { System.out.println("UnaryExpression_NotName ::= PLUS PushPosition..."); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.PLUS);  
-				break;
-	 
-	    case 871 : if (DEBUG) { System.out.println("UnaryExpression_NotName ::= MINUS PushPosition..."); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.MINUS);  
-				break;
-	 
-	    case 874 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus_NotName ::= TWIDDLE..."); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.TWIDDLE);  
-				break;
-	 
-	    case 875 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus_NotName ::= NOT PushPosition"); }  //$NON-NLS-1$
-			    consumeUnaryExpression(OperatorIds.NOT);  
-				break;
-	 
-	    case 878 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.MULTIPLY);  
-				break;
-	 
-	    case 879 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::= NameOrAj MULTIPLY"); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.MULTIPLY);  
-				break;
-	 
-	    case 880 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.DIVIDE);  
-				break;
-	 
-	    case 881 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::= NameOrAj DIVIDE..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.DIVIDE);  
-				break;
-	 
-	    case 882 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.REMAINDER);  
-				break;
-	 
-	    case 883 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::= NameOrAj REMAINDER"); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.REMAINDER);  
-				break;
-	 
-	    case 885 : if (DEBUG) { System.out.println("AdditiveExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.PLUS);  
-				break;
-	 
-	    case 886 : if (DEBUG) { System.out.println("AdditiveExpression_NotName ::= NameOrAj PLUS..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.PLUS);  
-				break;
-	 
-	    case 887 : if (DEBUG) { System.out.println("AdditiveExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.MINUS);  
-				break;
-	 
-	    case 888 : if (DEBUG) { System.out.println("AdditiveExpression_NotName ::= NameOrAj MINUS..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.MINUS);  
-				break;
-	 
-	    case 890 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= ShiftExpression_NotName..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.LEFT_SHIFT);  
-				break;
-	 
-	    case 891 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= NameOrAj LEFT_SHIFT..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.LEFT_SHIFT);  
-				break;
-	 
-	    case 892 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= ShiftExpression_NotName..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.RIGHT_SHIFT);  
-				break;
-	 
-	    case 893 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= NameOrAj RIGHT_SHIFT..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.RIGHT_SHIFT);  
-				break;
-	 
-	    case 894 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= ShiftExpression_NotName..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.UNSIGNED_RIGHT_SHIFT);  
-				break;
-	 
-	    case 895 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= NameOrAj..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.UNSIGNED_RIGHT_SHIFT);  
-				break;
-	 
-	    case 897 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= ShiftExpression_NotName"); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.LESS);  
-				break;
-	 
-	    case 898 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= Name LESS..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.LESS);  
-				break;
-	 
-	    case 899 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= ShiftExpression_NotName"); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.GREATER);  
-				break;
-	 
-	    case 900 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= NameOrAj GREATER..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.GREATER);  
-				break;
-	 
-	    case 901 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.LESS_EQUAL);  
-				break;
-	 
-	    case 902 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= NameOrAj LESS_EQUAL..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.LESS_EQUAL);  
-				break;
-	 
-	    case 903 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.GREATER_EQUAL);  
-				break;
-	 
-	    case 904 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= NameOrAj GREATER_EQUAL"); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.GREATER_EQUAL);  
-				break;
-	 
-	    case 906 : if (DEBUG) { System.out.println("InstanceofExpression_NotName ::= NameOrAj instanceof..."); }  //$NON-NLS-1$
-			    consumeInstanceOfExpressionWithName();  
-				break;
-	 
-	    case 907 : if (DEBUG) { System.out.println("InstanceofExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeInstanceOfExpression();  
-				break;
-	 
-	    case 909 : if (DEBUG) { System.out.println("EqualityExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeEqualityExpression(OperatorIds.EQUAL_EQUAL);  
-				break;
-	 
-	    case 910 : if (DEBUG) { System.out.println("EqualityExpression_NotName ::= NameOrAj EQUAL_EQUAL..."); }  //$NON-NLS-1$
-			    consumeEqualityExpressionWithName(OperatorIds.EQUAL_EQUAL);  
-				break;
-	 
-	    case 911 : if (DEBUG) { System.out.println("EqualityExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeEqualityExpression(OperatorIds.NOT_EQUAL);  
-				break;
-	 
-	    case 912 : if (DEBUG) { System.out.println("EqualityExpression_NotName ::= NameOrAj NOT_EQUAL..."); }  //$NON-NLS-1$
-			    consumeEqualityExpressionWithName(OperatorIds.NOT_EQUAL);  
-				break;
-	 
-	    case 914 : if (DEBUG) { System.out.println("AndExpression_NotName ::= AndExpression_NotName AND..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.AND);  
-				break;
-	 
-	    case 915 : if (DEBUG) { System.out.println("AndExpression_NotName ::= NameOrAj AND..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.AND);  
-				break;
-	 
-	    case 917 : if (DEBUG) { System.out.println("ExclusiveOrExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.XOR);  
-				break;
-	 
-	    case 918 : if (DEBUG) { System.out.println("ExclusiveOrExpression_NotName ::= NameOrAj XOR..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.XOR);  
-				break;
-	 
-	    case 920 : if (DEBUG) { System.out.println("InclusiveOrExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.OR);  
-				break;
-	 
-	    case 921 : if (DEBUG) { System.out.println("InclusiveOrExpression_NotName ::= NameOrAj OR..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.OR);  
-				break;
-	 
-	    case 923 : if (DEBUG) { System.out.println("ConditionalAndExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.AND_AND);  
-				break;
-	 
-	    case 924 : if (DEBUG) { System.out.println("ConditionalAndExpression_NotName ::= NameOrAj AND_AND..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.AND_AND);  
-				break;
-	 
-	    case 926 : if (DEBUG) { System.out.println("ConditionalOrExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeBinaryExpression(OperatorIds.OR_OR);  
-				break;
-	 
-	    case 927 : if (DEBUG) { System.out.println("ConditionalOrExpression_NotName ::= NameOrAj OR_OR..."); }  //$NON-NLS-1$
-			    consumeBinaryExpressionWithName(OperatorIds.OR_OR);  
-				break;
-	 
-	    case 929 : if (DEBUG) { System.out.println("ConditionalExpression_NotName ::=..."); }  //$NON-NLS-1$
-			    consumeConditionalExpression(OperatorIds.QUESTIONCOLON) ;  
-				break;
-	 
-	    case 930 : if (DEBUG) { System.out.println("ConditionalExpression_NotName ::= NameOrAj QUESTION..."); }  //$NON-NLS-1$
-			    consumeConditionalExpressionWithName(OperatorIds.QUESTIONCOLON) ;  
-				break;
-	 
-	    case 934 : if (DEBUG) { System.out.println("AnnotationTypeDeclarationHeaderName ::= Modifiers AT..."); }  //$NON-NLS-1$
-			    consumeAnnotationTypeDeclarationHeaderName() ;  
-				break;
-	 
-	    case 935 : if (DEBUG) { System.out.println("AnnotationTypeDeclarationHeaderName ::= Modifiers AT..."); }  //$NON-NLS-1$
-			    consumeAnnotationTypeDeclarationHeaderNameWithTypeParameters() ;  
-				break;
-	 
-	    case 936 : if (DEBUG) { System.out.println("AnnotationTypeDeclarationHeaderName ::= AT..."); }  //$NON-NLS-1$
-			    consumeAnnotationTypeDeclarationHeaderNameWithTypeParameters() ;  
-				break;
-	 
-	    case 937 : if (DEBUG) { System.out.println("AnnotationTypeDeclarationHeaderName ::= AT..."); }  //$NON-NLS-1$
-			    consumeAnnotationTypeDeclarationHeaderName() ;  
-				break;
-	 
-	    case 938 : if (DEBUG) { System.out.println("AnnotationTypeDeclarationHeader ::=..."); }  //$NON-NLS-1$
-			    consumeAnnotationTypeDeclarationHeader() ;  
-				break;
-	 
-	    case 939 : if (DEBUG) { System.out.println("AnnotationTypeDeclaration ::=..."); }  //$NON-NLS-1$
-			    consumeAnnotationTypeDeclaration() ;  
-				break;
-	 
-	    case 941 : if (DEBUG) { System.out.println("AnnotationTypeMemberDeclarationsopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyAnnotationTypeMemberDeclarationsopt() ;  
-				break;
-	 
-	    case 942 : if (DEBUG) { System.out.println("AnnotationTypeMemberDeclarationsopt ::= NestedType..."); }  //$NON-NLS-1$
-			    consumeAnnotationTypeMemberDeclarationsopt() ;  
-				break;
-	 
-	    case 944 : if (DEBUG) { System.out.println("AnnotationTypeMemberDeclarations ::=..."); }  //$NON-NLS-1$
-			    consumeAnnotationTypeMemberDeclarations() ;  
-				break;
-	 
-	    case 945 : if (DEBUG) { System.out.println("AnnotationMethodHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
-			    consumeMethodHeaderNameWithTypeParameters(true);  
-				break;
-	 
-	    case 946 : if (DEBUG) { System.out.println("AnnotationMethodHeaderName ::= Modifiersopt Type..."); }  //$NON-NLS-1$
-			    consumeMethodHeaderName(true);  
-				break;
-	 
-	    case 947 : if (DEBUG) { System.out.println("AnnotationMethodHeaderDefaultValueopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyMethodHeaderDefaultValue() ;  
-				break;
-	 
-	    case 948 : if (DEBUG) { System.out.println("AnnotationMethodHeaderDefaultValueopt ::= DefaultValue"); }  //$NON-NLS-1$
-			    consumeMethodHeaderDefaultValue();  
-				break;
-	 
-	    case 949 : if (DEBUG) { System.out.println("AnnotationMethodHeader ::= AnnotationMethodHeaderName..."); }  //$NON-NLS-1$
-			    consumeMethodHeader();  
-				break;
-	 
-	    case 950 : if (DEBUG) { System.out.println("AnnotationTypeMemberDeclaration ::=..."); }  //$NON-NLS-1$
-			    consumeAnnotationTypeMemberDeclaration() ;  
-				break;
-	 
-	    case 958 : if (DEBUG) { System.out.println("AnnotationName ::= AT UnannotatableNameOrAj"); }  //$NON-NLS-1$
-			    consumeAnnotationName() ;  
-				break;
-	 
-	    case 959 : if (DEBUG) { System.out.println("NormalAnnotation ::= AnnotationName LPAREN..."); }  //$NON-NLS-1$
-			    consumeNormalAnnotation(false) ;  
-				break;
-	 
-	    case 960 : if (DEBUG) { System.out.println("MemberValuePairsopt ::="); }  //$NON-NLS-1$
-			    consumeEmptyMemberValuePairsopt() ;  
-				break;
-	 
-	    case 963 : if (DEBUG) { System.out.println("MemberValuePairs ::= MemberValuePairs COMMA..."); }  //$NON-NLS-1$
-			    consumeMemberValuePairs() ;  
-				break;
-	 
-	    case 964 : if (DEBUG) { System.out.println("MemberValuePair ::= SimpleNameOrAj EQUAL..."); }  //$NON-NLS-1$
-			    consumeMemberValuePair() ;  
-				break;
-	 
-	    case 965 : if (DEBUG) { System.out.println("EnterMemberValue ::="); }  //$NON-NLS-1$
-			    consumeEnterMemberValue() ;  
-				break;
-	 
-	    case 966 : if (DEBUG) { System.out.println("ExitMemberValue ::="); }  //$NON-NLS-1$
-			    consumeExitMemberValue() ;  
-				break;
-	 
-	    case 968 : if (DEBUG) { System.out.println("MemberValue ::= NameOrAj"); }  //$NON-NLS-1$
-			    consumeMemberValueAsName() ;  
-				break;
-	 
-	    case 971 : if (DEBUG) { System.out.println("MemberValueArrayInitializer ::=..."); }  //$NON-NLS-1$
-			    consumeMemberValueArrayInitializer() ;  
-				break;
-	 
-	    case 972 : if (DEBUG) { System.out.println("MemberValueArrayInitializer ::=..."); }  //$NON-NLS-1$
-			    consumeMemberValueArrayInitializer() ;  
-				break;
-	 
-	    case 973 : if (DEBUG) { System.out.println("MemberValueArrayInitializer ::=..."); }  //$NON-NLS-1$
-			    consumeEmptyMemberValueArrayInitializer() ;  
-				break;
-	 
-	    case 974 : if (DEBUG) { System.out.println("MemberValueArrayInitializer ::=..."); }  //$NON-NLS-1$
-			    consumeEmptyMemberValueArrayInitializer() ;  
-				break;
-	 
-	    case 975 : if (DEBUG) { System.out.println("EnterMemberValueArrayInitializer ::="); }  //$NON-NLS-1$
-			    consumeEnterMemberValueArrayInitializer() ;  
-				break;
-	 
-	    case 977 : if (DEBUG) { System.out.println("MemberValues ::= MemberValues COMMA MemberValue"); }  //$NON-NLS-1$
-			    consumeMemberValues() ;  
-				break;
-	 
-	    case 978 : if (DEBUG) { System.out.println("MarkerAnnotation ::= AnnotationName"); }  //$NON-NLS-1$
-			    consumeMarkerAnnotation(false) ;  
-				break;
-	 
-	    case 979 : if (DEBUG) { System.out.println("SingleMemberAnnotationMemberValue ::= MemberValue"); }  //$NON-NLS-1$
-			    consumeSingleMemberAnnotationMemberValue() ;  
-				break;
-	 
-	    case 980 : if (DEBUG) { System.out.println("SingleMemberAnnotation ::= AnnotationName LPAREN..."); }  //$NON-NLS-1$
-			    consumeSingleMemberAnnotation(false) ;  
-				break;
-	 
-	    case 981 : if (DEBUG) { System.out.println("RecoveryMethodHeaderName ::= Modifiersopt TypeParameters"); }  //$NON-NLS-1$
-			    consumeRecoveryMethodHeaderNameWithTypeParameters();  
-				break;
-	 
-	    case 982 : if (DEBUG) { System.out.println("RecoveryMethodHeaderName ::= Modifiersopt Type..."); }  //$NON-NLS-1$
-			    consumeRecoveryMethodHeaderName();  
-				break;
-	 
-	    case 983 : if (DEBUG) { System.out.println("RecoveryMethodHeaderName ::= ModifiersWithDefault..."); }  //$NON-NLS-1$
-			    consumeRecoveryMethodHeaderNameWithTypeParameters();  
-				break;
-	 
-	    case 984 : if (DEBUG) { System.out.println("RecoveryMethodHeaderName ::= ModifiersWithDefault Type"); }  //$NON-NLS-1$
-			    consumeRecoveryMethodHeaderName();  
-				break;
-	 
-	    case 985 : if (DEBUG) { System.out.println("RecoveryMethodHeader ::= RecoveryMethodHeaderName..."); }  //$NON-NLS-1$
-			    consumeMethodHeader();  
-				break;
-	 
-	    case 986 : if (DEBUG) { System.out.println("RecoveryMethodHeader ::= RecoveryMethodHeaderName..."); }  //$NON-NLS-1$
-			    consumeMethodHeader();  
-				break;
-	 
-		}
+ case 61 : if (DEBUG) { System.out.println("ArrayTypeWithTypeArgumentsName ::= GenericType DOT Name"); }  //$NON-NLS-1$
+		    consumeArrayTypeWithTypeArgumentsName();  
+			break;
+
+ case 62 : if (DEBUG) { System.out.println("ArrayType ::= PrimitiveType Dims"); }  //$NON-NLS-1$
+		    consumePrimitiveArrayType();  
+			break;
+
+ case 63 : if (DEBUG) { System.out.println("ArrayType ::= Name Dims"); }  //$NON-NLS-1$
+		    consumeNameArrayType();  
+			break;
+
+ case 64 : if (DEBUG) { System.out.println("ArrayType ::= ArrayTypeWithTypeArgumentsName Dims"); }  //$NON-NLS-1$
+		    consumeGenericTypeNameArrayType();  
+			break;
+
+ case 65 : if (DEBUG) { System.out.println("ArrayType ::= GenericType Dims"); }  //$NON-NLS-1$
+		    consumeGenericTypeArrayType();  
+			break;
+
+ case 71 : if (DEBUG) { System.out.println("AjName ::= AjSimpleName"); }  //$NON-NLS-1$
+		    consumeZeroTypeAnnotations();  
+			break;
+
+ case 72 : if (DEBUG) { System.out.println("AjName ::= AjQualifiedName"); }  //$NON-NLS-1$
+		    consumeZeroTypeAnnotations();  
+			break;
+
+ case 81 : if (DEBUG) { System.out.println("AjQualifiedName ::= AjName DOT SimpleNameOrAj"); }  //$NON-NLS-1$
+		    consumeQualifiedName();  
+			break;
+
+ case 84 : if (DEBUG) { System.out.println("Name ::= SimpleName"); }  //$NON-NLS-1$
+		    consumeZeroTypeAnnotations();  
+			break;
+
+ case 89 : if (DEBUG) { System.out.println("UnannotatableName ::= UnannotatableName DOT SimpleName"); }  //$NON-NLS-1$
+		    consumeUnannotatableQualifiedName();  
+			break;
+
+ case 90 : if (DEBUG) { System.out.println("QualifiedName ::= Name DOT JavaIdentifier"); }  //$NON-NLS-1$
+		    consumeQualifiedName(false);  
+			break;
+
+ case 91 : if (DEBUG) { System.out.println("QualifiedName ::= Name DOT TypeAnnotations JavaIdentifier"); }  //$NON-NLS-1$
+		    consumeQualifiedName(true);  
+			break;
+
+ case 92 : if (DEBUG) { System.out.println("TypeAnnotationsopt ::="); }  //$NON-NLS-1$
+		    consumeZeroTypeAnnotations();  
+			break;
+
+  case 96 : if (DEBUG) { System.out.println("TypeAnnotations0 ::= TypeAnnotations0 TypeAnnotation"); }  //$NON-NLS-1$
+		    consumeOneMoreTypeAnnotation();  
+			break;
+
+  case 97 : if (DEBUG) { System.out.println("TypeAnnotation ::= NormalTypeAnnotation"); }  //$NON-NLS-1$
+		    consumeTypeAnnotation();  
+			break;
+
+  case 98 : if (DEBUG) { System.out.println("TypeAnnotation ::= MarkerTypeAnnotation"); }  //$NON-NLS-1$
+		    consumeTypeAnnotation();  
+			break;
+
+  case 99 : if (DEBUG) { System.out.println("TypeAnnotation ::= SingleMemberTypeAnnotation"); }  //$NON-NLS-1$
+		    consumeTypeAnnotation();  
+			break;
+
+ case 100 : if (DEBUG) { System.out.println("TypeAnnotationName ::= AT308 UnannotatableName"); }  //$NON-NLS-1$
+		    consumeAnnotationName() ;  
+			break;
+
+ case 101 : if (DEBUG) { System.out.println("NormalTypeAnnotation ::= TypeAnnotationName LPAREN..."); }  //$NON-NLS-1$
+		    consumeNormalAnnotation(true) ;  
+			break;
+
+ case 102 : if (DEBUG) { System.out.println("MarkerTypeAnnotation ::= TypeAnnotationName"); }  //$NON-NLS-1$
+		    consumeMarkerAnnotation(true) ;  
+			break;
+
+ case 103 : if (DEBUG) { System.out.println("SingleMemberTypeAnnotation ::= TypeAnnotationName LPAREN"); }  //$NON-NLS-1$
+		    consumeSingleMemberAnnotation(true) ;  
+			break;
+
+ case 104 : if (DEBUG) { System.out.println("RejectTypeAnnotations ::="); }  //$NON-NLS-1$
+		    consumeNonTypeUseName();  
+			break;
+
+ case 105 : if (DEBUG) { System.out.println("PushZeroTypeAnnotations ::="); }  //$NON-NLS-1$
+		    consumeZeroTypeAnnotations();  
+			break;
+
+ case 106 : if (DEBUG) { System.out.println("VariableDeclaratorIdOrThis ::= this"); }  //$NON-NLS-1$
+		    consumeExplicitThisParameter(false);  
+			break;
+
+ case 107 : if (DEBUG) { System.out.println("VariableDeclaratorIdOrThis ::= UnannotatableName DOT..."); }  //$NON-NLS-1$
+		    consumeExplicitThisParameter(true);  
+			break;
+
+ case 108 : if (DEBUG) { System.out.println("VariableDeclaratorIdOrThis ::= VariableDeclaratorId"); }  //$NON-NLS-1$
+		    consumeVariableDeclaratorIdParameter();  
+			break;
+
+ case 109 : if (DEBUG) { System.out.println("CompilationUnit ::= EnterCompilationUnit..."); }  //$NON-NLS-1$
+		    consumeCompilationUnit();  
+			break;
+
+ case 110 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= PackageDeclaration"); }  //$NON-NLS-1$
+		    consumeInternalCompilationUnit();  
+			break;
+
+ case 111 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= PackageDeclaration..."); }  //$NON-NLS-1$
+		    consumeInternalCompilationUnit();  
+			break;
+
+ case 112 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= PackageDeclaration..."); }  //$NON-NLS-1$
+		    consumeInternalCompilationUnitWithTypes();  
+			break;
+
+ case 113 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= PackageDeclaration..."); }  //$NON-NLS-1$
+		    consumeInternalCompilationUnitWithTypes();  
+			break;
+
+ case 114 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= ImportDeclarations..."); }  //$NON-NLS-1$
+		    consumeInternalCompilationUnit();  
+			break;
+
+ case 115 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= TypeDeclarations"); }  //$NON-NLS-1$
+		    consumeInternalCompilationUnitWithTypes();  
+			break;
+
+ case 116 : if (DEBUG) { System.out.println("InternalCompilationUnit ::= ImportDeclarations..."); }  //$NON-NLS-1$
+		    consumeInternalCompilationUnitWithTypes();  
+			break;
+
+ case 117 : if (DEBUG) { System.out.println("InternalCompilationUnit ::="); }  //$NON-NLS-1$
+		    consumeEmptyInternalCompilationUnit();  
+			break;
+
+ case 118 : if (DEBUG) { System.out.println("ReduceImports ::="); }  //$NON-NLS-1$
+		    consumeReduceImports();  
+			break;
+
+ case 119 : if (DEBUG) { System.out.println("EnterCompilationUnit ::="); }  //$NON-NLS-1$
+		    consumeEnterCompilationUnit();  
+			break;
+
+ case 135 : if (DEBUG) { System.out.println("CatchHeader ::= catch LPAREN CatchFormalParameter RPAREN"); }  //$NON-NLS-1$
+		    consumeCatchHeader();  
+			break;
+
+ case 137 : if (DEBUG) { System.out.println("ImportDeclarations ::= ImportDeclarations..."); }  //$NON-NLS-1$
+		    consumeImportDeclarations();  
+			break;
+
+ case 139 : if (DEBUG) { System.out.println("TypeDeclarations ::= TypeDeclarations TypeDeclaration"); }  //$NON-NLS-1$
+		    consumeTypeDeclarations();  
+			break;
+
+ case 140 : if (DEBUG) { System.out.println("PackageDeclaration ::= PackageDeclarationName SEMICOLON"); }  //$NON-NLS-1$
+		    consumePackageDeclaration();  
+			break;
+
+ case 141 : if (DEBUG) { System.out.println("PackageDeclarationName ::= Modifiers package..."); }  //$NON-NLS-1$
+		    consumePackageDeclarationNameWithModifiers();  
+			break;
+
+ case 142 : if (DEBUG) { System.out.println("PackageDeclarationName ::= PackageComment package Name"); }  //$NON-NLS-1$
+		    consumePackageDeclarationName();  
+			break;
+
+ case 143 : if (DEBUG) { System.out.println("PackageComment ::="); }  //$NON-NLS-1$
+		    consumePackageComment();  
+			break;
+
+ case 148 : if (DEBUG) { System.out.println("SingleTypeImportDeclaration ::=..."); }  //$NON-NLS-1$
+		    consumeImportDeclaration();  
+			break;
+
+ case 149 : if (DEBUG) { System.out.println("SingleTypeImportDeclarationName ::= import Name..."); }  //$NON-NLS-1$
+		    consumeSingleTypeImportDeclarationName();  
+			break;
+
+ case 150 : if (DEBUG) { System.out.println("TypeImportOnDemandDeclaration ::=..."); }  //$NON-NLS-1$
+		    consumeImportDeclaration();  
+			break;
+
+ case 151 : if (DEBUG) { System.out.println("TypeImportOnDemandDeclarationName ::= import Name DOT..."); }  //$NON-NLS-1$
+		    consumeTypeImportOnDemandDeclarationName();  
+			break;
+
+  case 154 : if (DEBUG) { System.out.println("TypeDeclaration ::= SEMICOLON"); }  //$NON-NLS-1$
+		    consumeEmptyTypeDeclaration();  
+			break;
+
+ case 158 : if (DEBUG) { System.out.println("Modifiers ::= Modifiers Modifier"); }  //$NON-NLS-1$
+		    consumeModifiers2();  
+			break;
+
+ case 171 : if (DEBUG) { System.out.println("Modifier ::= Annotation"); }  //$NON-NLS-1$
+		    consumeAnnotationAsModifier();  
+			break;
+
+ case 184 : if (DEBUG) { System.out.println("AspectDeclaration ::= AspectHeader AspectBody"); }  //$NON-NLS-1$
+		    consumeAspectDeclaration();  
+			break;
+
+ case 185 : if (DEBUG) { System.out.println("AspectHeader ::= AspectHeaderName ClassHeaderExtendsopt"); }  //$NON-NLS-1$
+		    consumeAspectHeader();  
+			break;
+
+ case 188 : if (DEBUG) { System.out.println("AspectHeaderName ::= AspectHeaderName1 TypeParameters"); }  //$NON-NLS-1$
+		    consumeAspectHeaderNameWithTypeParameters(false);  
+			break;
+
+ case 189 : if (DEBUG) { System.out.println("AspectHeaderName ::= AspectHeaderName2 TypeParameters"); }  //$NON-NLS-1$
+		    consumeAspectHeaderNameWithTypeParameters(true);  
+			break;
+
+ case 190 : if (DEBUG) { System.out.println("AspectHeaderName1 ::= Modifiersopt aspect Identifier"); }  //$NON-NLS-1$
+		    consumeAspectHeaderName(false);  
+			break;
+
+ case 191 : if (DEBUG) { System.out.println("AspectHeaderName2 ::= Modifiersopt privileged..."); }  //$NON-NLS-1$
+		    consumeAspectHeaderName(true);  
+			break;
+
+ case 193 : if (DEBUG) { System.out.println("AspectHeaderRest ::= AspectHeaderRestStart PseudoTokens"); }  //$NON-NLS-1$
+		    consumeAspectHeaderRest();  
+			break;
+
+ case 194 : if (DEBUG) { System.out.println("AspectHeaderRestStart ::= Identifier"); }  //$NON-NLS-1$
+		    consumePseudoTokenIdentifier();  
+			break;
+
+ case 197 : if (DEBUG) { System.out.println("AspectBodyDeclarations ::= AspectBodyDeclarations..."); }  //$NON-NLS-1$
+		    consumeClassBodyDeclarations();  
+			break;
+
+ case 198 : if (DEBUG) { System.out.println("AspectBodyDeclarationsopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyClassBodyDeclarationsopt();  
+			break;
+
+ case 199 : if (DEBUG) { System.out.println("AspectBodyDeclarationsopt ::= NestedType..."); }  //$NON-NLS-1$
+		    consumeClassBodyDeclarationsopt();  
+			break;
+
+ case 200 : if (DEBUG) { System.out.println("AspectBodyDeclaration ::=..."); }  //$NON-NLS-1$
+		    consumeClassBodyDeclarationInAspect();  
+			break;
+
+ case 204 : if (DEBUG) { System.out.println("ClassBodyDeclarationNoAroundMethod ::= Diet NestedMethod"); }  //$NON-NLS-1$
+		    consumeClassBodyDeclaration();  
+			break;
+
+ case 214 : if (DEBUG) { System.out.println("ClassMemberDeclarationNoAroundMethod ::= SEMICOLON"); }  //$NON-NLS-1$
+		    consumeEmptyTypeDeclaration();  
+			break;
+
+ case 216 : if (DEBUG) { System.out.println("MethodDeclarationNoAround ::= MethodHeaderNoAround..."); }  //$NON-NLS-1$
+		    // set to true to consume a method with a body
+consumeMethodDeclaration(true,false);   
+			break;
+
+ case 217 : if (DEBUG) { System.out.println("AbstractMethodDeclarationNoAround ::=..."); }  //$NON-NLS-1$
+		    // set to false to consume a method without body
+consumeMethodDeclaration(false,false);  
+			break;
+
+ case 218 : if (DEBUG) { System.out.println("MethodHeaderNoAround ::= MethodHeaderNameNoAround..."); }  //$NON-NLS-1$
+		    consumeMethodHeader();  
+			break;
+
+ case 219 : if (DEBUG) { System.out.println("MethodHeaderNameNoAround ::= Modifiersopt TypeParameters"); }  //$NON-NLS-1$
+		    consumeMethodHeaderNameWithTypeParameters(false);  
+			break;
+
+ case 220 : if (DEBUG) { System.out.println("MethodHeaderNameNoAround ::= Modifiersopt Type..."); }  //$NON-NLS-1$
+		    consumeMethodHeaderName(false);  
+			break;
+
+ case 221 : if (DEBUG) { System.out.println("PointcutDeclaration ::= PointcutHeader..."); }  //$NON-NLS-1$
+		    consumeEmptyPointcutDeclaration();  
+			break;
+
+ case 222 : if (DEBUG) { System.out.println("PointcutDeclaration ::= PointcutHeader..."); }  //$NON-NLS-1$
+		    consumePointcutDeclaration();  
+			break;
+
+ case 223 : if (DEBUG) { System.out.println("PointcutHeader ::= Modifiersopt pointcut JavaIdentifier"); }  //$NON-NLS-1$
+		    consumePointcutHeader();  
+			break;
+
+ case 226 : if (DEBUG) { System.out.println("AroundDeclaration ::= AroundHeader MethodBody"); }  //$NON-NLS-1$
+		    consumeAroundDeclaration();  
+			break;
+
+ case 227 : if (DEBUG) { System.out.println("AroundHeader ::= AroundHeaderName FormalParameterListopt"); }  //$NON-NLS-1$
+		    consumeAroundHeader();  
+			break;
+
+ case 228 : if (DEBUG) { System.out.println("AroundHeaderName ::= Modifiersopt Type around LPAREN"); }  //$NON-NLS-1$
+		    consumeAroundHeaderName();  
+			break;
+
+ case 229 : if (DEBUG) { System.out.println("AroundHeaderName ::= Modifiersopt around LPAREN"); }  //$NON-NLS-1$
+		    consumeAroundHeaderNameMissingReturnType();  
+			break;
+
+ case 230 : if (DEBUG) { System.out.println("BasicAdviceDeclaration ::= BasicAdviceHeader MethodBody"); }  //$NON-NLS-1$
+		    consumeBasicAdviceDeclaration();  
+			break;
+
+ case 233 : if (DEBUG) { System.out.println("BeforeAdviceHeader ::= BeforeAdviceHeaderName..."); }  //$NON-NLS-1$
+		    consumeBasicAdviceHeader();  
+			break;
+
+ case 234 : if (DEBUG) { System.out.println("AfterAdviceHeader ::= AfterAdviceHeaderName..."); }  //$NON-NLS-1$
+		    consumeBasicAdviceHeader();  
+			break;
+
+ case 235 : if (DEBUG) { System.out.println("BeforeAdviceHeaderName ::= Modifiersopt before LPAREN"); }  //$NON-NLS-1$
+		    consumeBasicAdviceHeaderName(false);  
+			break;
+
+ case 236 : if (DEBUG) { System.out.println("AfterAdviceHeaderName ::= Modifiersopt after LPAREN"); }  //$NON-NLS-1$
+		    consumeBasicAdviceHeaderName(true);  
+			break;
+
+ case 237 : if (DEBUG) { System.out.println("ExtraParamopt ::= Identifier LPAREN FormalParameter..."); }  //$NON-NLS-1$
+		    consumeExtraParameterWithFormal();  
+			break;
+
+ case 238 : if (DEBUG) { System.out.println("ExtraParamopt ::= Identifier LPAREN RPAREN"); }  //$NON-NLS-1$
+		    consumeExtraParameterNoFormal();  
+			break;
+
+ case 239 : if (DEBUG) { System.out.println("ExtraParamopt ::= Identifier"); }  //$NON-NLS-1$
+		    consumeExtraParameterNoFormal();  
+			break;
+
+ case 241 : if (DEBUG) { System.out.println("OnType ::= JavaIdentifier"); }  //$NON-NLS-1$
+		    consumeZeroTypeAnnotations();  
+			break;
+
+ case 242 : if (DEBUG) { System.out.println("OnType ::= OnType DOT JavaIdentifier"); }  //$NON-NLS-1$
+		    consumeZeroTypeAnnotations(); consumeQualifiedName();  
+			break;
+
+ case 247 : if (DEBUG) { System.out.println("InterTypeMethodDeclaration ::= InterTypeMethodHeader..."); }  //$NON-NLS-1$
+		    // set to true to consume a method with a body
+consumeInterTypeMethodDeclaration(true);   
+			break;
+
+ case 248 : if (DEBUG) { System.out.println("InterTypeMethodHeader ::= InterTypeMethodHeaderName..."); }  //$NON-NLS-1$
+		    consumeInterTypeMethodHeader();  
+			break;
+
+ case 249 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt Type OnType"); }  //$NON-NLS-1$
+		    consumeInterTypeMethodHeaderName(false,false);  
+			break;
+
+ case 250 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt Type OnType"); }  //$NON-NLS-1$
+		    consumeInterTypeMethodHeaderNameIllegallyUsingTypePattern("*");  
+			break;
+
+ case 251 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt Type OnType"); }  //$NON-NLS-1$
+		    consumeInterTypeMethodHeaderNameIllegallyUsingTypePattern("+");  
+			break;
+
+ case 252 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt Type OnType"); }  //$NON-NLS-1$
+		    consumeInterTypeMethodHeaderName(false,true);  
+			break;
+
+ case 253 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
+		    consumeInterTypeMethodHeaderName(true,false);  
+			break;
+
+ case 254 : if (DEBUG) { System.out.println("InterTypeMethodHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
+		    consumeInterTypeMethodHeaderName(true,true);  
+			break;
+
+ case 255 : if (DEBUG) { System.out.println("AbstractInterTypeMethodDeclaration ::=..."); }  //$NON-NLS-1$
+		    // set to false to consume a method without body
+consumeInterTypeMethodDeclaration(false);  
+			break;
+
+ case 256 : if (DEBUG) { System.out.println("TypeParametersAsReference ::= TypeParameters"); }  //$NON-NLS-1$
+		    convertTypeParametersToSingleTypeReferences();  
+			break;
+
+ case 257 : if (DEBUG) { System.out.println("InterTypeConstructorDeclaration ::=..."); }  //$NON-NLS-1$
+		    // set to true to consume a method with a body
+consumeInterTypeConstructorDeclaration();   
+			break;
+
+ case 258 : if (DEBUG) { System.out.println("InterTypeConstructorHeader ::=..."); }  //$NON-NLS-1$
+		    consumeInterTypeConstructorHeader();  
+			break;
+
+ case 259 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt Name DOT"); }  //$NON-NLS-1$
+		    consumeInterTypeConstructorHeaderName(false,false);  
+			break;
+
+ case 260 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt Name DOT"); }  //$NON-NLS-1$
+		    consumeInterTypeConstructorHeaderNameIllegallyUsingTypePattern("*");  
+			break;
+
+ case 261 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt Name..."); }  //$NON-NLS-1$
+		    consumeInterTypeConstructorHeaderNameIllegallyUsingTypePattern("+");  
+			break;
+
+ case 262 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
+		    consumeInterTypeConstructorHeaderName(true,false);  
+			break;
+
+ case 263 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
+		    consumeInterTypeConstructorHeaderName(false,true);  
+			break;
+
+ case 264 : if (DEBUG) { System.out.println("InterTypeConstructorHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
+		    consumeInterTypeConstructorHeaderName(true,true);  
+			break;
+
+ case 265 : if (DEBUG) { System.out.println("InterTypeFieldDeclaration ::= InterTypeFieldHeader..."); }  //$NON-NLS-1$
+		    consumeInterTypeFieldDeclaration();  
+			break;
+
+ case 266 : if (DEBUG) { System.out.println("InterTypeFieldHeader ::= Modifiersopt Type OnType DOT..."); }  //$NON-NLS-1$
+		    consumeInterTypeFieldHeader(false);  
+			break;
+
+ case 267 : if (DEBUG) { System.out.println("InterTypeFieldHeader ::= Modifiersopt Type OnType DOT..."); }  //$NON-NLS-1$
+		    consumeInterTypeFieldHeaderIllegallyAttemptingToUseATypePattern("*");  
+			break;
+
+ case 268 : if (DEBUG) { System.out.println("InterTypeFieldHeader ::= Modifiersopt Type OnType PLUS"); }  //$NON-NLS-1$
+		    consumeInterTypeFieldHeaderIllegallyAttemptingToUseATypePattern("+");  
+			break;
+
+ case 269 : if (DEBUG) { System.out.println("InterTypeFieldHeader ::= Modifiersopt Type OnType..."); }  //$NON-NLS-1$
+		    consumeInterTypeFieldHeader(true);  
+			break;
+
+ case 270 : if (DEBUG) { System.out.println("InterTypeFieldBody ::="); }  //$NON-NLS-1$
+		    consumeExitITDVariableWithoutInitializer();  
+			break;
+
+ case 271 : if (DEBUG) { System.out.println("InterTypeFieldBody ::= EQUAL ForceNoDiet..."); }  //$NON-NLS-1$
+		    consumeExitITDVariableWithInitializer();  
+			break;
+
+ case 273 : if (DEBUG) { System.out.println("DeclareDeclaration ::= DeclareHeader PseudoTokens..."); }  //$NON-NLS-1$
+		    consumeDeclareDeclaration();  
+			break;
+
+ case 274 : if (DEBUG) { System.out.println("DeclareHeader ::= declare Identifier COLON"); }  //$NON-NLS-1$
+		    consumeDeclareHeader();  
+			break;
+
+ case 275 : if (DEBUG) { System.out.println("DeclareDeclaration ::= DeclareAnnotationHeader..."); }  //$NON-NLS-1$
+		    consumeDeclareAnnotation(' ');  
+			break;
+
+ case 276 : if (DEBUG) { System.out.println("DeclareDeclaration ::= DeclareAnnotationHeader..."); }  //$NON-NLS-1$
+		    consumeDeclareAnnotation('+');  
+			break;
+
+ case 277 : if (DEBUG) { System.out.println("DeclareDeclaration ::= DeclareAnnotationHeader..."); }  //$NON-NLS-1$
+		    consumeDeclareAnnotation('-');  
+			break;
+
+ case 280 : if (DEBUG) { System.out.println("DeclareAnnotationHeader ::= declare AT Identifier COLON"); }  //$NON-NLS-1$
+		    consumeDeclareAnnotationHeader();  
+			break;
+
+ case 283 : if (DEBUG) { System.out.println("PseudoTokens ::= PseudoTokens ColonPseudoToken"); }  //$NON-NLS-1$
+		    consumePseudoTokens();  
+			break;
+
+ case 284 : if (DEBUG) { System.out.println("PseudoTokens ::= PseudoTokens PseudoToken"); }  //$NON-NLS-1$
+		    consumePseudoTokens();  
+			break;
+
+ case 286 : if (DEBUG) { System.out.println("PseudoTokensNoColon ::= PseudoTokensNoColon PseudoToken"); }  //$NON-NLS-1$
+		    consumePseudoTokens();  
+			break;
+
+ case 287 : if (DEBUG) { System.out.println("ColonPseudoToken ::= COLON"); }  //$NON-NLS-1$
+		    consumePseudoToken(":");  
+			break;
+
+ case 288 : if (DEBUG) { System.out.println("PseudoToken ::= JavaIdentifier"); }  //$NON-NLS-1$
+		    consumePseudoTokenIdentifier();  
+			break;
+
+ case 289 : if (DEBUG) { System.out.println("PseudoToken ::= LPAREN"); }  //$NON-NLS-1$
+		    consumePseudoToken("(");  
+			break;
+
+ case 290 : if (DEBUG) { System.out.println("PseudoToken ::= RPAREN"); }  //$NON-NLS-1$
+		    consumePseudoToken(")");  
+			break;
+
+ case 291 : if (DEBUG) { System.out.println("PseudoToken ::= DOT"); }  //$NON-NLS-1$
+		    consumePseudoToken(".");  
+			break;
+
+ case 292 : if (DEBUG) { System.out.println("PseudoToken ::= MULTIPLY"); }  //$NON-NLS-1$
+		    consumePseudoToken("*");  
+			break;
+
+ case 293 : if (DEBUG) { System.out.println("PseudoToken ::= PLUS"); }  //$NON-NLS-1$
+		    consumePseudoToken("+");  
+			break;
+
+ case 294 : if (DEBUG) { System.out.println("PseudoToken ::= EQUAL"); }  //$NON-NLS-1$
+		    consumePseudoToken("=");  
+			break;
+
+ case 295 : if (DEBUG) { System.out.println("PseudoToken ::= AND_AND"); }  //$NON-NLS-1$
+		    consumePseudoToken("&&");  
+			break;
+
+ case 296 : if (DEBUG) { System.out.println("PseudoToken ::= OR_OR"); }  //$NON-NLS-1$
+		    consumePseudoToken("||");  
+			break;
+
+ case 297 : if (DEBUG) { System.out.println("PseudoToken ::= NOT"); }  //$NON-NLS-1$
+		    consumePseudoToken("!");  
+			break;
+
+ case 298 : if (DEBUG) { System.out.println("PseudoToken ::= COMMA"); }  //$NON-NLS-1$
+		    consumePseudoToken(",");  
+			break;
+
+ case 299 : if (DEBUG) { System.out.println("PseudoToken ::= LBRACKET"); }  //$NON-NLS-1$
+		    consumePseudoToken("[");  
+			break;
+
+ case 300 : if (DEBUG) { System.out.println("PseudoToken ::= RBRACKET"); }  //$NON-NLS-1$
+		    consumePseudoToken("]");  
+			break;
+
+ case 301 : if (DEBUG) { System.out.println("PseudoToken ::= AT"); }  //$NON-NLS-1$
+		    consumePseudoToken("@");  
+			break;
+
+ case 302 : if (DEBUG) { System.out.println("PseudoToken ::= ELLIPSIS"); }  //$NON-NLS-1$
+		    consumePseudoToken("...");  
+			break;
+
+ case 303 : if (DEBUG) { System.out.println("PseudoToken ::= QUESTION"); }  //$NON-NLS-1$
+		    consumePseudoToken("?");  
+			break;
+
+ case 304 : if (DEBUG) { System.out.println("PseudoToken ::= LESS"); }  //$NON-NLS-1$
+		    consumePseudoToken("<");  
+			break;
+
+ case 305 : if (DEBUG) { System.out.println("PseudoToken ::= GREATER"); }  //$NON-NLS-1$
+		    consumePseudoToken(">");  
+			break;
+
+ case 306 : if (DEBUG) { System.out.println("PseudoToken ::= RIGHT_SHIFT"); }  //$NON-NLS-1$
+		    consumePseudoToken(">>");  
+			break;
+
+ case 307 : if (DEBUG) { System.out.println("PseudoToken ::= UNSIGNED_RIGHT_SHIFT"); }  //$NON-NLS-1$
+		    consumePseudoToken(">>>");  
+			break;
+
+ case 308 : if (DEBUG) { System.out.println("PseudoToken ::= AND"); }  //$NON-NLS-1$
+		    consumePseudoToken("&");  
+			break;
+
+ case 309 : if (DEBUG) { System.out.println("PseudoToken ::= NOT_EQUAL"); }  //$NON-NLS-1$
+		    consumePseudoToken("!=");  
+			break;
+
+ case 310 : if (DEBUG) { System.out.println("PseudoToken ::= PrimitiveType"); }  //$NON-NLS-1$
+		    consumePseudoTokenPrimitiveType();  
+			break;
+
+ case 311 : if (DEBUG) { System.out.println("PseudoToken ::= SimpleModifier"); }  //$NON-NLS-1$
+		    consumePseudoTokenModifier();  
+			break;
+
+ case 312 : if (DEBUG) { System.out.println("PseudoToken ::= Literal"); }  //$NON-NLS-1$
+		    consumePseudoTokenLiteral();  
+			break;
+
+ case 313 : if (DEBUG) { System.out.println("PseudoToken ::= this"); }  //$NON-NLS-1$
+		    consumePseudoToken("this", 1, true);  
+			break;
+
+ case 314 : if (DEBUG) { System.out.println("PseudoToken ::= class"); }  //$NON-NLS-1$
+		    consumePseudoToken("class", 1, true);  
+			break;
+
+ case 315 : if (DEBUG) { System.out.println("PseudoToken ::= super"); }  //$NON-NLS-1$
+		    consumePseudoToken("super", 1, true);  
+			break;
+
+ case 316 : if (DEBUG) { System.out.println("PseudoToken ::= if LPAREN Expression RPAREN"); }  //$NON-NLS-1$
+		    consumePseudoTokenIf();  
+			break;
+
+ case 317 : if (DEBUG) { System.out.println("PseudoToken ::= assert"); }  //$NON-NLS-1$
+		    consumePseudoToken("assert", 1, true);  
+			break;
+
+ case 318 : if (DEBUG) { System.out.println("PseudoToken ::= import"); }  //$NON-NLS-1$
+		    consumePseudoToken("import", 1, true);  
+			break;
+
+ case 319 : if (DEBUG) { System.out.println("PseudoToken ::= package"); }  //$NON-NLS-1$
+		    consumePseudoToken("package", 1, true);  
+			break;
+
+ case 320 : if (DEBUG) { System.out.println("PseudoToken ::= throw"); }  //$NON-NLS-1$
+		    consumePseudoToken("throw", 1, true);  
+			break;
+
+ case 321 : if (DEBUG) { System.out.println("PseudoToken ::= new"); }  //$NON-NLS-1$
+		    consumePseudoToken("new", 1, true);  
+			break;
+
+ case 322 : if (DEBUG) { System.out.println("PseudoToken ::= do"); }  //$NON-NLS-1$
+		    consumePseudoToken("do", 1, true);  
+			break;
+
+ case 323 : if (DEBUG) { System.out.println("PseudoToken ::= for"); }  //$NON-NLS-1$
+		    consumePseudoToken("for", 1, true);  
+			break;
+
+ case 324 : if (DEBUG) { System.out.println("PseudoToken ::= switch"); }  //$NON-NLS-1$
+		    consumePseudoToken("switch", 1, true);  
+			break;
+
+ case 325 : if (DEBUG) { System.out.println("PseudoToken ::= try"); }  //$NON-NLS-1$
+		    consumePseudoToken("try", 1, true);  
+			break;
+
+ case 326 : if (DEBUG) { System.out.println("PseudoToken ::= while"); }  //$NON-NLS-1$
+		    consumePseudoToken("while", 1, true);  
+			break;
+
+ case 327 : if (DEBUG) { System.out.println("PseudoToken ::= break"); }  //$NON-NLS-1$
+		    consumePseudoToken("break", 1, true);  
+			break;
+
+ case 328 : if (DEBUG) { System.out.println("PseudoToken ::= continue"); }  //$NON-NLS-1$
+		    consumePseudoToken("continue", 1, true);  
+			break;
+
+ case 329 : if (DEBUG) { System.out.println("PseudoToken ::= return"); }  //$NON-NLS-1$
+		    consumePseudoToken("return", 1, true);  
+			break;
+
+ case 330 : if (DEBUG) { System.out.println("PseudoToken ::= case"); }  //$NON-NLS-1$
+		    consumePseudoToken("case", 1, true);  
+			break;
+
+ case 331 : if (DEBUG) { System.out.println("PseudoToken ::= catch"); }  //$NON-NLS-1$
+		    consumePseudoToken("catch", 0, true);  
+			break;
+
+ case 332 : if (DEBUG) { System.out.println("PseudoToken ::= instanceof"); }  //$NON-NLS-1$
+		    consumePseudoToken("instanceof", 0, true);  
+			break;
+
+ case 333 : if (DEBUG) { System.out.println("PseudoToken ::= else"); }  //$NON-NLS-1$
+		    consumePseudoToken("else", 0, true);  
+			break;
+
+ case 334 : if (DEBUG) { System.out.println("PseudoToken ::= extends"); }  //$NON-NLS-1$
+		    consumePseudoToken("extends", 0, true);  
+			break;
+
+ case 335 : if (DEBUG) { System.out.println("PseudoToken ::= finally"); }  //$NON-NLS-1$
+		    consumePseudoToken("finally", 0, true);  
+			break;
+
+ case 336 : if (DEBUG) { System.out.println("PseudoToken ::= implements"); }  //$NON-NLS-1$
+		    consumePseudoToken("implements", 0, true);  
+			break;
+
+ case 337 : if (DEBUG) { System.out.println("PseudoToken ::= throws"); }  //$NON-NLS-1$
+		    consumePseudoToken("throws", 0, true);  
+			break;
+
+ case 338 : if (DEBUG) { System.out.println("ClassDeclaration ::= ClassHeader ClassBody"); }  //$NON-NLS-1$
+		    consumeClassDeclaration();  
+			break;
+
+ case 339 : if (DEBUG) { System.out.println("IntertypeClassDeclaration ::= IntertypeClassHeader..."); }  //$NON-NLS-1$
+		    consumeIntertypeClassDeclaration();  
+			break;
+
+ case 340 : if (DEBUG) { System.out.println("IntertypeClassHeader ::= IntertypeClassHeaderName..."); }  //$NON-NLS-1$
+		    consumeIntertypeClassHeader();  
+			break;
+
+ case 341 : if (DEBUG) { System.out.println("IntertypeClassHeaderName ::= IntertypeClassHeaderName1"); }  //$NON-NLS-1$
+		    consumeIntertypeTypeHeaderNameWithTypeParameters();  
+			break;
+
+ case 343 : if (DEBUG) { System.out.println("IntertypeClassHeaderName1 ::= Modifiersopt class OnType"); }  //$NON-NLS-1$
+		    consumeIntertypeClassHeaderName(false);  
+			break;
+
+ case 344 : if (DEBUG) { System.out.println("InterTypeClassHeaderName1 ::= Modifiersopt class OnType"); }  //$NON-NLS-1$
+		    consumeIntertypeClassHeaderName(true);  
+			break;
+
+ case 345 : if (DEBUG) { System.out.println("ClassHeader ::= ClassHeaderName ClassHeaderExtendsopt..."); }  //$NON-NLS-1$
+		    consumeClassHeader();  
+			break;
+
+ case 346 : if (DEBUG) { System.out.println("ClassHeaderName ::= ClassHeaderName1 TypeParameters"); }  //$NON-NLS-1$
+		    consumeTypeHeaderNameWithTypeParameters();  
+			break;
+
+ case 348 : if (DEBUG) { System.out.println("ClassHeaderName1 ::= Modifiersopt class JavaIdentifier"); }  //$NON-NLS-1$
+		    consumeClassHeaderName1();  
+			break;
+
+ case 349 : if (DEBUG) { System.out.println("ClassHeaderExtends ::= extends ClassType"); }  //$NON-NLS-1$
+		    consumeClassHeaderExtends();  
+			break;
+
+ case 350 : if (DEBUG) { System.out.println("ClassHeaderImplements ::= implements InterfaceTypeList"); }  //$NON-NLS-1$
+		    consumeClassHeaderImplements();  
+			break;
+
+ case 352 : if (DEBUG) { System.out.println("InterfaceTypeList ::= InterfaceTypeList COMMA..."); }  //$NON-NLS-1$
+		    consumeInterfaceTypeList();  
+			break;
+
+ case 353 : if (DEBUG) { System.out.println("InterfaceType ::= ClassOrInterfaceType"); }  //$NON-NLS-1$
+		    consumeInterfaceType();  
+			break;
+
+ case 356 : if (DEBUG) { System.out.println("ClassBodyDeclarations ::= ClassBodyDeclarations..."); }  //$NON-NLS-1$
+		    consumeClassBodyDeclarations();  
+			break;
+
+ case 360 : if (DEBUG) { System.out.println("ClassBodyDeclaration ::= Diet NestedMethod..."); }  //$NON-NLS-1$
+		    consumeClassBodyDeclaration();  
+			break;
+
+ case 361 : if (DEBUG) { System.out.println("Diet ::="); }  //$NON-NLS-1$
+		    consumeDiet();  
+			break;
+
+ case 362 : if (DEBUG) { System.out.println("Initializer ::= Diet NestedMethod CreateInitializer..."); }  //$NON-NLS-1$
+		    consumeClassBodyDeclaration();  
+			break;
+
+ case 363 : if (DEBUG) { System.out.println("CreateInitializer ::="); }  //$NON-NLS-1$
+		    consumeCreateInitializer();  
+			break;
+
+ case 370 : if (DEBUG) { System.out.println("ClassMemberDeclaration ::= SEMICOLON"); }  //$NON-NLS-1$
+		    consumeEmptyTypeDeclaration();  
+			break;
+
+ case 373 : if (DEBUG) { System.out.println("FieldDeclaration ::= Modifiersopt Type..."); }  //$NON-NLS-1$
+		    consumeFieldDeclaration();  
+			break;
+
+ case 375 : if (DEBUG) { System.out.println("VariableDeclarators ::= VariableDeclarators COMMA..."); }  //$NON-NLS-1$
+		    consumeVariableDeclarators();  
+			break;
+
+ case 378 : if (DEBUG) { System.out.println("EnterVariable ::="); }  //$NON-NLS-1$
+		    consumeEnterVariable();  
+			break;
+
+ case 379 : if (DEBUG) { System.out.println("ExitVariableWithInitialization ::="); }  //$NON-NLS-1$
+		    consumeExitVariableWithInitialization();  
+			break;
+
+ case 380 : if (DEBUG) { System.out.println("ExitVariableWithoutInitialization ::="); }  //$NON-NLS-1$
+		    consumeExitVariableWithoutInitialization();  
+			break;
+
+ case 381 : if (DEBUG) { System.out.println("ForceNoDiet ::="); }  //$NON-NLS-1$
+		    consumeForceNoDiet();  
+			break;
+
+ case 382 : if (DEBUG) { System.out.println("RestoreDiet ::="); }  //$NON-NLS-1$
+		    consumeRestoreDiet();  
+			break;
+
+ case 387 : if (DEBUG) { System.out.println("MethodDeclaration ::= MethodHeader MethodBody"); }  //$NON-NLS-1$
+		    // set to true to consume a method with a body
+consumeMethodDeclaration(true, false);  
+			break;
+
+ case 388 : if (DEBUG) { System.out.println("MethodDeclaration ::= DefaultMethodHeader MethodBody"); }  //$NON-NLS-1$
+		    // set to true to consume a method with a body
+consumeMethodDeclaration(true, true);  
+			break;
+
+ case 389 : if (DEBUG) { System.out.println("AbstractMethodDeclaration ::= MethodHeader SEMICOLON"); }  //$NON-NLS-1$
+		    // set to false to consume a method without body
+consumeMethodDeclaration(false, false);  
+			break;
+
+ case 390 : if (DEBUG) { System.out.println("MethodHeader ::= MethodHeaderName FormalParameterListopt"); }  //$NON-NLS-1$
+		    consumeMethodHeader();  
+			break;
+
+ case 391 : if (DEBUG) { System.out.println("DefaultMethodHeader ::= DefaultMethodHeaderName..."); }  //$NON-NLS-1$
+		    consumeMethodHeader();  
+			break;
+
+ case 392 : if (DEBUG) { System.out.println("MethodHeaderName ::= Modifiersopt TypeParameters Type..."); }  //$NON-NLS-1$
+		    consumeMethodHeaderNameWithTypeParameters(false);  
+			break;
+
+ case 393 : if (DEBUG) { System.out.println("MethodHeaderName ::= Modifiersopt Type JavaIdentifier..."); }  //$NON-NLS-1$
+		    consumeMethodHeaderName(false);  
+			break;
+
+ case 394 : if (DEBUG) { System.out.println("DefaultMethodHeaderName ::= ModifiersWithDefault..."); }  //$NON-NLS-1$
+		    consumeMethodHeaderNameWithTypeParameters(false);  
+			break;
+
+ case 395 : if (DEBUG) { System.out.println("DefaultMethodHeaderName ::= ModifiersWithDefault Type..."); }  //$NON-NLS-1$
+		    consumeMethodHeaderName(false);  
+			break;
+
+ case 396 : if (DEBUG) { System.out.println("ModifiersWithDefault ::= Modifiersopt default..."); }  //$NON-NLS-1$
+		    consumePushCombineModifiers();  
+			break;
+
+ case 397 : if (DEBUG) { System.out.println("MethodHeaderRightParen ::= RPAREN"); }  //$NON-NLS-1$
+		    consumeMethodHeaderRightParen();  
+			break;
+
+ case 398 : if (DEBUG) { System.out.println("MethodHeaderExtendedDims ::= Dimsopt"); }  //$NON-NLS-1$
+		    consumeMethodHeaderExtendedDims();  
+			break;
+
+ case 399 : if (DEBUG) { System.out.println("MethodHeaderThrowsClause ::= throws ClassTypeList"); }  //$NON-NLS-1$
+		    consumeMethodHeaderThrowsClause();  
+			break;
+
+ case 400 : if (DEBUG) { System.out.println("ConstructorHeader ::= ConstructorHeaderName..."); }  //$NON-NLS-1$
+		    consumeConstructorHeader();  
+			break;
+
+ case 401 : if (DEBUG) { System.out.println("ConstructorHeaderName ::= Modifiersopt TypeParameters..."); }  //$NON-NLS-1$
+		    consumeConstructorHeaderNameWithTypeParameters();  
+			break;
+
+ case 402 : if (DEBUG) { System.out.println("ConstructorHeaderName ::= Modifiersopt Identifier LPAREN"); }  //$NON-NLS-1$
+		    consumeConstructorHeaderName();  
+			break;
+
+ case 403 : if (DEBUG) { System.out.println("ConstructorHeaderName ::= Modifiersopt aspect LPAREN"); }  //$NON-NLS-1$
+		    consumeConstructorHeaderName();  
+			break;
+
+ case 405 : if (DEBUG) { System.out.println("FormalParameterList ::= FormalParameterList COMMA..."); }  //$NON-NLS-1$
+		    consumeFormalParameterList();  
+			break;
+
+ case 406 : if (DEBUG) { System.out.println("FormalParameter ::= Modifiersopt Type..."); }  //$NON-NLS-1$
+		    consumeFormalParameter(false);  
+			break;
+
+ case 407 : if (DEBUG) { System.out.println("FormalParameter ::= Modifiersopt Type..."); }  //$NON-NLS-1$
+		    consumeFormalParameter(true);  
+			break;
+
+ case 408 : if (DEBUG) { System.out.println("FormalParameter ::= Modifiersopt Type AT308DOTDOTDOT..."); }  //$NON-NLS-1$
+		    consumeFormalParameter(true);  
+			break;
+
+ case 409 : if (DEBUG) { System.out.println("CatchFormalParameter ::= Modifiersopt CatchType..."); }  //$NON-NLS-1$
+		    consumeCatchFormalParameter();  
+			break;
+
+ case 410 : if (DEBUG) { System.out.println("CatchType ::= UnionType"); }  //$NON-NLS-1$
+		    consumeCatchType();  
+			break;
+
+ case 411 : if (DEBUG) { System.out.println("UnionType ::= Type"); }  //$NON-NLS-1$
+		    consumeUnionTypeAsClassType();  
+			break;
+
+ case 412 : if (DEBUG) { System.out.println("UnionType ::= UnionType OR Type"); }  //$NON-NLS-1$
+		    consumeUnionType();  
+			break;
+
+ case 414 : if (DEBUG) { System.out.println("ClassTypeList ::= ClassTypeList COMMA ClassTypeElt"); }  //$NON-NLS-1$
+		    consumeClassTypeList();  
+			break;
+
+ case 415 : if (DEBUG) { System.out.println("ClassTypeElt ::= ClassType"); }  //$NON-NLS-1$
+		    consumeClassTypeElt();  
+			break;
+
+ case 416 : if (DEBUG) { System.out.println("MethodBody ::= NestedMethod LBRACE BlockStatementsopt..."); }  //$NON-NLS-1$
+		    consumeMethodBody();  
+			break;
+
+ case 417 : if (DEBUG) { System.out.println("NestedMethod ::="); }  //$NON-NLS-1$
+		    consumeNestedMethod();  
+			break;
+
+ case 418 : if (DEBUG) { System.out.println("StaticInitializer ::= StaticOnly Block"); }  //$NON-NLS-1$
+		    consumeStaticInitializer();  
+			break;
+
+ case 419 : if (DEBUG) { System.out.println("StaticOnly ::= static"); }  //$NON-NLS-1$
+		    consumeStaticOnly();  
+			break;
+
+ case 420 : if (DEBUG) { System.out.println("ConstructorDeclaration ::= ConstructorHeader MethodBody"); }  //$NON-NLS-1$
+		    consumeConstructorDeclaration() ;  
+			break;
+
+ case 421 : if (DEBUG) { System.out.println("ConstructorDeclaration ::= ConstructorHeader SEMICOLON"); }  //$NON-NLS-1$
+		    consumeInvalidConstructorDeclaration() ;  
+			break;
+
+ case 422 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= this LPAREN..."); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocation(0, THIS_CALL);  
+			break;
+
+ case 423 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= OnlyTypeArguments this"); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocationWithTypeArguments(0,THIS_CALL);  
+			break;
+
+ case 424 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= super LPAREN..."); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocation(0,SUPER_CALL);  
+			break;
+
+ case 425 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= OnlyTypeArguments..."); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocationWithTypeArguments(0,SUPER_CALL);  
+			break;
+
+ case 426 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT super..."); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocation(1, SUPER_CALL);  
+			break;
+
+ case 427 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT..."); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocationWithTypeArguments(1, SUPER_CALL);  
+			break;
+
+ case 428 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT super LPAREN"); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocation(2, SUPER_CALL);  
+			break;
+
+ case 429 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT..."); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocationWithTypeArguments(2, SUPER_CALL);  
+			break;
+
+ case 430 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT this..."); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocation(1, THIS_CALL);  
+			break;
+
+ case 431 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Primary DOT..."); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocationWithTypeArguments(1, THIS_CALL);  
+			break;
+
+ case 432 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT this LPAREN"); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocation(2, THIS_CALL);  
+			break;
+
+ case 433 : if (DEBUG) { System.out.println("ExplicitConstructorInvocation ::= Name DOT..."); }  //$NON-NLS-1$
+		    consumeExplicitConstructorInvocationWithTypeArguments(2, THIS_CALL);  
+			break;
+
+ case 434 : if (DEBUG) { System.out.println("InterfaceDeclaration ::= InterfaceHeader InterfaceBody"); }  //$NON-NLS-1$
+		    consumeInterfaceDeclaration();  
+			break;
+
+ case 435 : if (DEBUG) { System.out.println("InterfaceHeader ::= InterfaceHeaderName..."); }  //$NON-NLS-1$
+		    consumeInterfaceHeader();  
+			break;
+
+ case 436 : if (DEBUG) { System.out.println("InterfaceHeaderName ::= InterfaceHeaderName1..."); }  //$NON-NLS-1$
+		    consumeTypeHeaderNameWithTypeParameters();  
+			break;
+
+ case 438 : if (DEBUG) { System.out.println("InterfaceHeaderName1 ::= Modifiersopt interface..."); }  //$NON-NLS-1$
+		    consumeInterfaceHeaderName1();  
+			break;
+
+ case 439 : if (DEBUG) { System.out.println("InterfaceHeaderExtends ::= extends InterfaceTypeList"); }  //$NON-NLS-1$
+		    consumeInterfaceHeaderExtends();  
+			break;
+
+ case 442 : if (DEBUG) { System.out.println("InterfaceMemberDeclarations ::=..."); }  //$NON-NLS-1$
+		    consumeInterfaceMemberDeclarations();  
+			break;
+
+ case 443 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= SEMICOLON"); }  //$NON-NLS-1$
+		    consumeEmptyTypeDeclaration();  
+			break;
+
+ case 445 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= DefaultMethodHeader..."); }  //$NON-NLS-1$
+		    consumeInterfaceMethodDeclaration(false);  
+			break;
+
+ case 446 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= MethodHeader MethodBody"); }  //$NON-NLS-1$
+		    consumeInterfaceMethodDeclaration(false);  
+			break;
+
+ case 447 : if (DEBUG) { System.out.println("InterfaceMemberDeclaration ::= DefaultMethodHeader..."); }  //$NON-NLS-1$
+		    consumeInterfaceMethodDeclaration(true);  
+			break;
+
+ case 448 : if (DEBUG) { System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader..."); }  //$NON-NLS-1$
+		    consumeInvalidConstructorDeclaration(true);  
+			break;
+
+ case 449 : if (DEBUG) { System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader..."); }  //$NON-NLS-1$
+		    consumeInvalidConstructorDeclaration(false);  
+			break;
+
+ case 460 : if (DEBUG) { System.out.println("PushLeftBrace ::="); }  //$NON-NLS-1$
+		    consumePushLeftBrace();  
+			break;
+
+ case 461 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace ,opt RBRACE"); }  //$NON-NLS-1$
+		    consumeEmptyArrayInitializer();  
+			break;
+
+ case 462 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace..."); }  //$NON-NLS-1$
+		    consumeArrayInitializer();  
+			break;
+
+ case 463 : if (DEBUG) { System.out.println("ArrayInitializer ::= LBRACE PushLeftBrace..."); }  //$NON-NLS-1$
+		    consumeArrayInitializer();  
+			break;
+
+ case 465 : if (DEBUG) { System.out.println("VariableInitializers ::= VariableInitializers COMMA..."); }  //$NON-NLS-1$
+		    consumeVariableInitializers();  
+			break;
+
+ case 466 : if (DEBUG) { System.out.println("Block ::= OpenBlock LBRACE BlockStatementsopt RBRACE"); }  //$NON-NLS-1$
+		    consumeBlock();  
+			break;
+
+ case 467 : if (DEBUG) { System.out.println("OpenBlock ::="); }  //$NON-NLS-1$
+		    consumeOpenBlock() ;  
+			break;
+
+ case 468 : if (DEBUG) { System.out.println("BlockStatements ::= BlockStatement"); }  //$NON-NLS-1$
+		    consumeBlockStatement() ;  
+			break;
+
+ case 469 : if (DEBUG) { System.out.println("BlockStatements ::= BlockStatements BlockStatement"); }  //$NON-NLS-1$
+		    consumeBlockStatements() ;  
+			break;
+
+ case 476 : if (DEBUG) { System.out.println("BlockStatement ::= InterfaceDeclaration"); }  //$NON-NLS-1$
+		    consumeInvalidInterfaceDeclaration();  
+			break;
+
+ case 477 : if (DEBUG) { System.out.println("BlockStatement ::= AnnotationTypeDeclaration"); }  //$NON-NLS-1$
+		    consumeInvalidAnnotationTypeDeclaration();  
+			break;
+
+ case 478 : if (DEBUG) { System.out.println("BlockStatement ::= EnumDeclaration"); }  //$NON-NLS-1$
+		    consumeInvalidEnumDeclaration();  
+			break;
+
+ case 479 : if (DEBUG) { System.out.println("LocalVariableDeclarationStatement ::=..."); }  //$NON-NLS-1$
+		    consumeLocalVariableDeclarationStatement();  
+			break;
+
+ case 480 : if (DEBUG) { System.out.println("LocalVariableDeclaration ::= Type PushModifiers..."); }  //$NON-NLS-1$
+		    consumeLocalVariableDeclaration();  
+			break;
+
+ case 481 : if (DEBUG) { System.out.println("LocalVariableDeclaration ::= Modifiers Type..."); }  //$NON-NLS-1$
+		    consumeLocalVariableDeclaration();  
+			break;
+
+ case 482 : if (DEBUG) { System.out.println("PushModifiers ::="); }  //$NON-NLS-1$
+		    consumePushModifiers();  
+			break;
+
+ case 483 : if (DEBUG) { System.out.println("PushModifiersForHeader ::="); }  //$NON-NLS-1$
+		    consumePushModifiersForHeader();  
+			break;
+
+ case 484 : if (DEBUG) { System.out.println("PushRealModifiers ::="); }  //$NON-NLS-1$
+		    consumePushRealModifiers();  
+			break;
+
+ case 511 : if (DEBUG) { System.out.println("EmptyStatement ::= SEMICOLON"); }  //$NON-NLS-1$
+		    consumeEmptyStatement();  
+			break;
+
+ case 512 : if (DEBUG) { System.out.println("LabeledStatement ::= Label COLON Statement"); }  //$NON-NLS-1$
+		    consumeStatementLabel() ;  
+			break;
+
+ case 513 : if (DEBUG) { System.out.println("LabeledStatementNoShortIf ::= Label COLON..."); }  //$NON-NLS-1$
+		    consumeStatementLabel() ;  
+			break;
+
+ case 514 : if (DEBUG) { System.out.println("Label ::= JavaIdentifier"); }  //$NON-NLS-1$
+		    consumeLabel() ;  
+			break;
+
+  case 515 : if (DEBUG) { System.out.println("ExpressionStatement ::= StatementExpression SEMICOLON"); }  //$NON-NLS-1$
+		    consumeExpressionStatement();  
+			break;
+
+ case 524 : if (DEBUG) { System.out.println("IfThenStatement ::= if LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
+		    consumeStatementIfNoElse();  
+			break;
+
+ case 525 : if (DEBUG) { System.out.println("IfThenElseStatement ::= if LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
+		    consumeStatementIfWithElse();  
+			break;
+
+ case 526 : if (DEBUG) { System.out.println("IfThenElseStatementNoShortIf ::= if LPAREN Expression..."); }  //$NON-NLS-1$
+		    consumeStatementIfWithElse();  
+			break;
+
+ case 527 : if (DEBUG) { System.out.println("SwitchStatement ::= switch LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
+		    consumeStatementSwitch() ;  
+			break;
+
+ case 528 : if (DEBUG) { System.out.println("SwitchBlock ::= LBRACE RBRACE"); }  //$NON-NLS-1$
+		    consumeEmptySwitchBlock() ;  
+			break;
+
+ case 531 : if (DEBUG) { System.out.println("SwitchBlock ::= LBRACE SwitchBlockStatements..."); }  //$NON-NLS-1$
+		    consumeSwitchBlock() ;  
+			break;
+
+ case 533 : if (DEBUG) { System.out.println("SwitchBlockStatements ::= SwitchBlockStatements..."); }  //$NON-NLS-1$
+		    consumeSwitchBlockStatements() ;  
+			break;
+
+ case 534 : if (DEBUG) { System.out.println("SwitchBlockStatement ::= SwitchLabels BlockStatements"); }  //$NON-NLS-1$
+		    consumeSwitchBlockStatement() ;  
+			break;
+
+ case 536 : if (DEBUG) { System.out.println("SwitchLabels ::= SwitchLabels SwitchLabel"); }  //$NON-NLS-1$
+		    consumeSwitchLabels() ;  
+			break;
+
+  case 537 : if (DEBUG) { System.out.println("SwitchLabel ::= case ConstantExpression COLON"); }  //$NON-NLS-1$
+		    consumeCaseLabel();  
+			break;
+
+  case 538 : if (DEBUG) { System.out.println("SwitchLabel ::= default COLON"); }  //$NON-NLS-1$
+		    consumeDefaultLabel();  
+			break;
+
+ case 539 : if (DEBUG) { System.out.println("WhileStatement ::= while LPAREN Expression RPAREN..."); }  //$NON-NLS-1$
+		    consumeStatementWhile() ;  
+			break;
+
+ case 540 : if (DEBUG) { System.out.println("WhileStatementNoShortIf ::= while LPAREN Expression..."); }  //$NON-NLS-1$
+		    consumeStatementWhile() ;  
+			break;
+
+ case 541 : if (DEBUG) { System.out.println("DoStatement ::= do Statement while LPAREN Expression..."); }  //$NON-NLS-1$
+		    consumeStatementDo() ;  
+			break;
+
+ case 542 : if (DEBUG) { System.out.println("ForStatement ::= for LPAREN ForInitopt SEMICOLON..."); }  //$NON-NLS-1$
+		    consumeStatementFor() ;  
+			break;
+
+ case 543 : if (DEBUG) { System.out.println("ForStatementNoShortIf ::= for LPAREN ForInitopt..."); }  //$NON-NLS-1$
+		    consumeStatementFor() ;  
+			break;
+
+ case 544 : if (DEBUG) { System.out.println("ForInit ::= StatementExpressionList"); }  //$NON-NLS-1$
+		    consumeForInit() ;  
+			break;
+
+ case 548 : if (DEBUG) { System.out.println("StatementExpressionList ::= StatementExpressionList..."); }  //$NON-NLS-1$
+		    consumeStatementExpressionList() ;  
+			break;
+
+ case 549 : if (DEBUG) { System.out.println("AssertStatement ::= assert Expression SEMICOLON"); }  //$NON-NLS-1$
+		    consumeSimpleAssertStatement() ;  
+			break;
+
+ case 550 : if (DEBUG) { System.out.println("AssertStatement ::= assert Expression COLON Expression"); }  //$NON-NLS-1$
+		    consumeAssertStatement() ;  
+			break;
+
+ case 551 : if (DEBUG) { System.out.println("BreakStatement ::= break SEMICOLON"); }  //$NON-NLS-1$
+		    consumeStatementBreak() ;  
+			break;
+
+ case 552 : if (DEBUG) { System.out.println("BreakStatement ::= break Identifier SEMICOLON"); }  //$NON-NLS-1$
+		    consumeStatementBreakWithLabel() ;  
+			break;
+
+ case 553 : if (DEBUG) { System.out.println("ContinueStatement ::= continue SEMICOLON"); }  //$NON-NLS-1$
+		    consumeStatementContinue() ;  
+			break;
+
+ case 554 : if (DEBUG) { System.out.println("ContinueStatement ::= continue Identifier SEMICOLON"); }  //$NON-NLS-1$
+		    consumeStatementContinueWithLabel() ;  
+			break;
+
+ case 555 : if (DEBUG) { System.out.println("ReturnStatement ::= return Expressionopt SEMICOLON"); }  //$NON-NLS-1$
+		    consumeStatementReturn() ;  
+			break;
+
+ case 556 : if (DEBUG) { System.out.println("ThrowStatement ::= throw Expression SEMICOLON"); }  //$NON-NLS-1$
+		    consumeStatementThrow();  
+			break;
+
+ case 557 : if (DEBUG) { System.out.println("SynchronizedStatement ::= OnlySynchronized LPAREN..."); }  //$NON-NLS-1$
+		    consumeStatementSynchronized();  
+			break;
+
+ case 558 : if (DEBUG) { System.out.println("OnlySynchronized ::= synchronized"); }  //$NON-NLS-1$
+		    consumeOnlySynchronized();  
+			break;
+
+ case 559 : if (DEBUG) { System.out.println("TryStatement ::= try TryBlock Catches"); }  //$NON-NLS-1$
+		    consumeStatementTry(false, false);  
+			break;
+
+ case 560 : if (DEBUG) { System.out.println("TryStatement ::= try TryBlock Catchesopt Finally"); }  //$NON-NLS-1$
+		    consumeStatementTry(true, false);  
+			break;
+
+ case 561 : if (DEBUG) { System.out.println("TryStatementWithResources ::= try ResourceSpecification"); }  //$NON-NLS-1$
+		    consumeStatementTry(false, true);  
+			break;
+
+ case 562 : if (DEBUG) { System.out.println("TryStatementWithResources ::= try ResourceSpecification"); }  //$NON-NLS-1$
+		    consumeStatementTry(true, true);  
+			break;
+
+ case 563 : if (DEBUG) { System.out.println("ResourceSpecification ::= LPAREN Resources ;opt RPAREN"); }  //$NON-NLS-1$
+		    consumeResourceSpecification();  
+			break;
+
+ case 564 : if (DEBUG) { System.out.println(";opt ::="); }  //$NON-NLS-1$
+		    consumeResourceOptionalTrailingSemiColon(false);  
+			break;
+
+ case 565 : if (DEBUG) { System.out.println(";opt ::= SEMICOLON"); }  //$NON-NLS-1$
+		    consumeResourceOptionalTrailingSemiColon(true);  
+			break;
+
+ case 566 : if (DEBUG) { System.out.println("Resources ::= Resource"); }  //$NON-NLS-1$
+		    consumeSingleResource();  
+			break;
+
+ case 567 : if (DEBUG) { System.out.println("Resources ::= Resources TrailingSemiColon Resource"); }  //$NON-NLS-1$
+		    consumeMultipleResources();  
+			break;
+
+ case 568 : if (DEBUG) { System.out.println("TrailingSemiColon ::= SEMICOLON"); }  //$NON-NLS-1$
+		    consumeResourceOptionalTrailingSemiColon(true);  
+			break;
+
+ case 569 : if (DEBUG) { System.out.println("Resource ::= Type PushModifiers VariableDeclaratorId..."); }  //$NON-NLS-1$
+		    consumeResourceAsLocalVariableDeclaration();  
+			break;
+
+ case 570 : if (DEBUG) { System.out.println("Resource ::= Modifiers Type PushRealModifiers..."); }  //$NON-NLS-1$
+		    consumeResourceAsLocalVariableDeclaration();  
+			break;
+
+ case 572 : if (DEBUG) { System.out.println("ExitTryBlock ::="); }  //$NON-NLS-1$
+		    consumeExitTryBlock();  
+			break;
+
+ case 574 : if (DEBUG) { System.out.println("Catches ::= Catches CatchClause"); }  //$NON-NLS-1$
+		    consumeCatches();  
+			break;
+
+ case 575 : if (DEBUG) { System.out.println("CatchClause ::= catch LPAREN CatchFormalParameter RPAREN"); }  //$NON-NLS-1$
+		    consumeStatementCatch() ;  
+			break;
+
+ case 577 : if (DEBUG) { System.out.println("PushLPAREN ::= LPAREN"); }  //$NON-NLS-1$
+		    consumeLeftParen();  
+			break;
+
+ case 578 : if (DEBUG) { System.out.println("PushRPAREN ::= RPAREN"); }  //$NON-NLS-1$
+		    consumeRightParen();  
+			break;
+
+ case 583 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= this"); }  //$NON-NLS-1$
+		    consumePrimaryNoNewArrayThis();  
+			break;
+
+ case 584 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PushLPAREN Expression_NotName..."); }  //$NON-NLS-1$
+		    consumePrimaryNoNewArray();  
+			break;
+
+ case 585 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PushLPAREN Name PushRPAREN"); }  //$NON-NLS-1$
+		    consumePrimaryNoNewArrayWithName();  
+			break;
+
+ case 588 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT this"); }  //$NON-NLS-1$
+		    consumePrimaryNoNewArrayNameThis();  
+			break;
+
+ case 589 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT super"); }  //$NON-NLS-1$
+		    consumePrimaryNoNewArrayNameSuper();  
+			break;
+
+ case 590 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name DOT class"); }  //$NON-NLS-1$
+		    consumePrimaryNoNewArrayName();  
+			break;
+
+ case 591 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= Name Dims DOT class"); }  //$NON-NLS-1$
+		    consumePrimaryNoNewArrayArrayType();  
+			break;
+
+ case 592 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PrimitiveType Dims DOT class"); }  //$NON-NLS-1$
+		    consumePrimaryNoNewArrayPrimitiveArrayType();  
+			break;
+
+ case 593 : if (DEBUG) { System.out.println("PrimaryNoNewArray ::= PrimitiveType DOT class"); }  //$NON-NLS-1$
+		    consumePrimaryNoNewArrayPrimitiveType();  
+			break;
+
+ case 599 : if (DEBUG) { System.out.println("ReferenceExpressionTypeArgumentsAndTrunk0 ::=..."); }  //$NON-NLS-1$
+		    consumeReferenceExpressionTypeArgumentsAndTrunk(false);  
+			break;
+
+ case 600 : if (DEBUG) { System.out.println("ReferenceExpressionTypeArgumentsAndTrunk0 ::=..."); }  //$NON-NLS-1$
+		    consumeReferenceExpressionTypeArgumentsAndTrunk(true);  
+			break;
+
+ case 601 : if (DEBUG) { System.out.println("ReferenceExpression ::= PrimitiveType Dims COLON_COLON"); }  //$NON-NLS-1$
+		    consumeReferenceExpressionTypeForm(true);  
+			break;
+
+ case 602 : if (DEBUG) { System.out.println("ReferenceExpression ::= Name Dimsopt COLON_COLON..."); }  //$NON-NLS-1$
+		    consumeReferenceExpressionTypeForm(false);  
+			break;
+
+ case 603 : if (DEBUG) { System.out.println("ReferenceExpression ::= Name BeginTypeArguments..."); }  //$NON-NLS-1$
+		    consumeReferenceExpressionGenericTypeForm();  
+			break;
+
+ case 604 : if (DEBUG) { System.out.println("ReferenceExpression ::= Primary COLON_COLON..."); }  //$NON-NLS-1$
+		    consumeReferenceExpressionPrimaryForm();  
+			break;
+
+ case 605 : if (DEBUG) { System.out.println("ReferenceExpression ::= super COLON_COLON..."); }  //$NON-NLS-1$
+		    consumeReferenceExpressionSuperForm();  
+			break;
+
+ case 606 : if (DEBUG) { System.out.println("NonWildTypeArgumentsopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyTypeArguments();  
+			break;
+
+ case 608 : if (DEBUG) { System.out.println("IdentifierOrNew ::= Identifier"); }  //$NON-NLS-1$
+		    consumeIdentifierOrNew(false);  
+			break;
+
+ case 609 : if (DEBUG) { System.out.println("IdentifierOrNew ::= new"); }  //$NON-NLS-1$
+		    consumeIdentifierOrNew(true);  
+			break;
+
+ case 610 : if (DEBUG) { System.out.println("LambdaExpression ::= LambdaParameters ARROW LambdaBody"); }  //$NON-NLS-1$
+		    consumeLambdaExpression();  
+			break;
+
+ case 611 : if (DEBUG) { System.out.println("NestedLambda ::="); }  //$NON-NLS-1$
+		    consumeNestedLambda();  
+			break;
+
+ case 612 : if (DEBUG) { System.out.println("LambdaParameters ::= Identifier NestedLambda"); }  //$NON-NLS-1$
+		    consumeTypeElidedLambdaParameter(false);  
+			break;
+
+ case 618 : if (DEBUG) { System.out.println("TypeElidedFormalParameterList ::=..."); }  //$NON-NLS-1$
+		    consumeFormalParameterList();  
+			break;
+
+ case 619 : if (DEBUG) { System.out.println("TypeElidedFormalParameter ::= Modifiersopt Identifier"); }  //$NON-NLS-1$
+		    consumeTypeElidedLambdaParameter(true);  
+			break;
+
+ case 622 : if (DEBUG) { System.out.println("ElidedLeftBraceAndReturn ::="); }  //$NON-NLS-1$
+		    consumeElidedLeftBraceAndReturn();  
+			break;
+
+ case 623 : if (DEBUG) { System.out.println("AllocationHeader ::= new ClassType LPAREN..."); }  //$NON-NLS-1$
+		    consumeAllocationHeader();  
+			break;
+
+ case 624 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= new..."); }  //$NON-NLS-1$
+		    consumeClassInstanceCreationExpressionWithTypeArguments();  
+			break;
+
+ case 625 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= new ClassType..."); }  //$NON-NLS-1$
+		    consumeClassInstanceCreationExpression();  
+			break;
+
+ case 626 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= Primary DOT new..."); }  //$NON-NLS-1$
+		    consumeClassInstanceCreationExpressionQualifiedWithTypeArguments() ;  
+			break;
+
+ case 627 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::= Primary DOT new..."); }  //$NON-NLS-1$
+		    consumeClassInstanceCreationExpressionQualified() ;  
+			break;
+
+ case 628 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::=..."); }  //$NON-NLS-1$
+		    consumeClassInstanceCreationExpressionQualified() ;  
+			break;
+
+ case 629 : if (DEBUG) { System.out.println("ClassInstanceCreationExpression ::=..."); }  //$NON-NLS-1$
+		    consumeClassInstanceCreationExpressionQualifiedWithTypeArguments() ;  
+			break;
+
+ case 630 : if (DEBUG) { System.out.println("EnterInstanceCreationArgumentList ::="); }  //$NON-NLS-1$
+		    consumeEnterInstanceCreationArgumentList();  
+			break;
+
+ case 631 : if (DEBUG) { System.out.println("ClassInstanceCreationExpressionName ::= Name DOT"); }  //$NON-NLS-1$
+		    consumeClassInstanceCreationExpressionName() ;  
+			break;
+
+ case 632 : if (DEBUG) { System.out.println("UnqualifiedClassBodyopt ::="); }  //$NON-NLS-1$
+		    consumeClassBodyopt();  
+			break;
+
+ case 634 : if (DEBUG) { System.out.println("UnqualifiedEnterAnonymousClassBody ::="); }  //$NON-NLS-1$
+		    consumeEnterAnonymousClassBody(false);  
+			break;
+
+ case 635 : if (DEBUG) { System.out.println("QualifiedClassBodyopt ::="); }  //$NON-NLS-1$
+		    consumeClassBodyopt();  
+			break;
+
+ case 637 : if (DEBUG) { System.out.println("QualifiedEnterAnonymousClassBody ::="); }  //$NON-NLS-1$
+		    consumeEnterAnonymousClassBody(true);  
+			break;
+
+ case 639 : if (DEBUG) { System.out.println("ArgumentList ::= ArgumentList COMMA Expression"); }  //$NON-NLS-1$
+		    consumeArgumentList();  
+			break;
+
+ case 640 : if (DEBUG) { System.out.println("ArrayCreationHeader ::= new PrimitiveType..."); }  //$NON-NLS-1$
+		    consumeArrayCreationHeader();  
+			break;
+
+ case 641 : if (DEBUG) { System.out.println("ArrayCreationHeader ::= new ClassOrInterfaceType..."); }  //$NON-NLS-1$
+		    consumeArrayCreationHeader();  
+			break;
+
+ case 642 : if (DEBUG) { System.out.println("ArrayCreationWithoutArrayInitializer ::= new..."); }  //$NON-NLS-1$
+		    consumeArrayCreationExpressionWithoutInitializer();  
+			break;
+
+ case 643 : if (DEBUG) { System.out.println("ArrayCreationWithArrayInitializer ::= new PrimitiveType"); }  //$NON-NLS-1$
+		    consumeArrayCreationExpressionWithInitializer();  
+			break;
+
+ case 644 : if (DEBUG) { System.out.println("ArrayCreationWithoutArrayInitializer ::= new..."); }  //$NON-NLS-1$
+		    consumeArrayCreationExpressionWithoutInitializer();  
+			break;
+
+ case 645 : if (DEBUG) { System.out.println("ArrayCreationWithArrayInitializer ::= new..."); }  //$NON-NLS-1$
+		    consumeArrayCreationExpressionWithInitializer();  
+			break;
+
+ case 647 : if (DEBUG) { System.out.println("DimWithOrWithOutExprs ::= DimWithOrWithOutExprs..."); }  //$NON-NLS-1$
+		    consumeDimWithOrWithOutExprs();  
+			break;
+
+  case 649 : if (DEBUG) { System.out.println("DimWithOrWithOutExpr ::= TypeAnnotationsopt LBRACKET..."); }  //$NON-NLS-1$
+		    consumeDimWithOrWithOutExpr();  
+			break;
+
+  case 650 : if (DEBUG) { System.out.println("Dims ::= DimsLoop"); }  //$NON-NLS-1$
+		    consumeDims();  
+			break;
+
+  case 653 : if (DEBUG) { System.out.println("OneDimLoop ::= LBRACKET RBRACKET"); }  //$NON-NLS-1$
+		    consumeOneDimLoop(false);  
+			break;
+
+  case 654 : if (DEBUG) { System.out.println("OneDimLoop ::= TypeAnnotations LBRACKET RBRACKET"); }  //$NON-NLS-1$
+		    consumeOneDimLoop(true);  
+			break;
+
+ case 655 : if (DEBUG) { System.out.println("FieldAccess ::= Primary DOT JavaIdentifier"); }  //$NON-NLS-1$
+		    consumeFieldAccess(false);  
+			break;
+
+ case 656 : if (DEBUG) { System.out.println("FieldAccess ::= super DOT JavaIdentifier"); }  //$NON-NLS-1$
+		    consumeFieldAccess(true);  
+			break;
+
+ case 657 : if (DEBUG) { System.out.println("MethodInvocation ::= NameOrAj LPAREN ArgumentListopt..."); }  //$NON-NLS-1$
+		    consumeMethodInvocationName();  
+			break;
+
+ case 658 : if (DEBUG) { System.out.println("MethodInvocation ::= Name DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
+		    consumeMethodInvocationNameWithTypeArguments();  
+			break;
+
+ case 659 : if (DEBUG) { System.out.println("MethodInvocation ::= Primary DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
+		    consumeMethodInvocationPrimaryWithTypeArguments();  
+			break;
+
+ case 660 : if (DEBUG) { System.out.println("MethodInvocation ::= Primary DOT JavaIdentifier LPAREN"); }  //$NON-NLS-1$
+		    consumeMethodInvocationPrimary();  
+			break;
+
+ case 661 : if (DEBUG) { System.out.println("MethodInvocation ::= super DOT OnlyTypeArguments..."); }  //$NON-NLS-1$
+		    consumeMethodInvocationSuperWithTypeArguments();  
+			break;
+
+ case 662 : if (DEBUG) { System.out.println("MethodInvocation ::= super DOT JavaIdentifier LPAREN..."); }  //$NON-NLS-1$
+		    consumeMethodInvocationSuper();  
+			break;
+
+ case 663 : if (DEBUG) { System.out.println("ArrayAccess ::= Name LBRACKET Expression RBRACKET"); }  //$NON-NLS-1$
+		    consumeArrayAccess(true);  
+			break;
+
+ case 664 : if (DEBUG) { System.out.println("ArrayAccess ::= AjName LBRACKET Expression RBRACKET"); }  //$NON-NLS-1$
+		    consumeArrayAccess(true);  
+			break;
+
+ case 665 : if (DEBUG) { System.out.println("ArrayAccess ::= PrimaryNoNewArray LBRACKET Expression..."); }  //$NON-NLS-1$
+		    consumeArrayAccess(false);  
+			break;
+
+ case 666 : if (DEBUG) { System.out.println("ArrayAccess ::= ArrayCreationWithArrayInitializer..."); }  //$NON-NLS-1$
+		    consumeArrayAccess(false);  
+			break;
+
+ case 668 : if (DEBUG) { System.out.println("PostfixExpression ::= NameOrAj"); }  //$NON-NLS-1$
+		    consumePostfixExpression();  
+			break;
+
+ case 671 : if (DEBUG) { System.out.println("PostIncrementExpression ::= PostfixExpression PLUS_PLUS"); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.PLUS,true);  
+			break;
+
+ case 672 : if (DEBUG) { System.out.println("PostDecrementExpression ::= PostfixExpression..."); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.MINUS,true);  
+			break;
+
+ case 673 : if (DEBUG) { System.out.println("PushPosition ::="); }  //$NON-NLS-1$
+		    consumePushPosition();  
+			break;
+
+ case 676 : if (DEBUG) { System.out.println("UnaryExpression ::= PLUS PushPosition UnaryExpression"); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.PLUS);  
+			break;
+
+ case 677 : if (DEBUG) { System.out.println("UnaryExpression ::= MINUS PushPosition UnaryExpression"); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.MINUS);  
+			break;
+
+ case 679 : if (DEBUG) { System.out.println("PreIncrementExpression ::= PLUS_PLUS PushPosition..."); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.PLUS,false);  
+			break;
+
+ case 680 : if (DEBUG) { System.out.println("PreDecrementExpression ::= MINUS_MINUS PushPosition..."); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.MINUS,false);  
+			break;
+
+ case 682 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus ::= TWIDDLE PushPosition..."); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.TWIDDLE);  
+			break;
+
+ case 683 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus ::= NOT PushPosition..."); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.NOT);  
+			break;
+
+ case 685 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN PrimitiveType Dimsopt..."); }  //$NON-NLS-1$
+		    consumeCastExpressionWithPrimitiveType();  
+			break;
+
+ case 686 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name..."); }  //$NON-NLS-1$
+		    consumeCastExpressionWithGenericsArray();  
+			break;
+
+ case 687 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name..."); }  //$NON-NLS-1$
+		    consumeCastExpressionWithQualifiedGenericsArray();  
+			break;
+
+ case 688 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name PushRPAREN..."); }  //$NON-NLS-1$
+		    consumeCastExpressionLL1();  
+			break;
+
+ case 689 : if (DEBUG) { System.out.println("CastExpression ::= BeginIntersectionCast PushLPAREN..."); }  //$NON-NLS-1$
+		    consumeCastExpressionLL1WithBounds();  
+			break;
+
+ case 690 : if (DEBUG) { System.out.println("CastExpression ::= PushLPAREN Name Dims..."); }  //$NON-NLS-1$
+		    consumeCastExpressionWithNameArray();  
+			break;
+
+ case 691 : if (DEBUG) { System.out.println("AdditionalBoundsListOpt ::="); }  //$NON-NLS-1$
+		    consumeZeroAdditionalBounds();  
+			break;
+
+ case 695 : if (DEBUG) { System.out.println("OnlyTypeArgumentsForCastExpression ::= OnlyTypeArguments"); }  //$NON-NLS-1$
+		    consumeOnlyTypeArgumentsForCastExpression();  
+			break;
+
+ case 696 : if (DEBUG) { System.out.println("InsideCastExpression ::="); }  //$NON-NLS-1$
+		    consumeInsideCastExpression();  
+			break;
+
+ case 697 : if (DEBUG) { System.out.println("InsideCastExpressionLL1 ::="); }  //$NON-NLS-1$
+		    consumeInsideCastExpressionLL1();  
+			break;
+
+ case 698 : if (DEBUG) { System.out.println("InsideCastExpressionLL1WithBounds ::="); }  //$NON-NLS-1$
+		    consumeInsideCastExpressionLL1WithBounds ();  
+			break;
+
+ case 699 : if (DEBUG) { System.out.println("InsideCastExpressionWithQualifiedGenerics ::="); }  //$NON-NLS-1$
+		    consumeInsideCastExpressionWithQualifiedGenerics();  
+			break;
+
+ case 701 : if (DEBUG) { System.out.println("MultiplicativeExpression ::= MultiplicativeExpression..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.MULTIPLY);  
+			break;
+
+ case 702 : if (DEBUG) { System.out.println("MultiplicativeExpression ::= MultiplicativeExpression..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.DIVIDE);  
+			break;
+
+ case 703 : if (DEBUG) { System.out.println("MultiplicativeExpression ::= MultiplicativeExpression..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.REMAINDER);  
+			break;
+
+ case 705 : if (DEBUG) { System.out.println("AdditiveExpression ::= AdditiveExpression PLUS..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.PLUS);  
+			break;
+
+ case 706 : if (DEBUG) { System.out.println("AdditiveExpression ::= AdditiveExpression MINUS..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.MINUS);  
+			break;
+
+ case 708 : if (DEBUG) { System.out.println("ShiftExpression ::= ShiftExpression LEFT_SHIFT..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.LEFT_SHIFT);  
+			break;
+
+ case 709 : if (DEBUG) { System.out.println("ShiftExpression ::= ShiftExpression RIGHT_SHIFT..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.RIGHT_SHIFT);  
+			break;
+
+ case 710 : if (DEBUG) { System.out.println("ShiftExpression ::= ShiftExpression UNSIGNED_RIGHT_SHIFT"); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.UNSIGNED_RIGHT_SHIFT);  
+			break;
+
+ case 712 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression LESS..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.LESS);  
+			break;
+
+ case 713 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression GREATER..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.GREATER);  
+			break;
+
+ case 714 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression LESS_EQUAL"); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.LESS_EQUAL);  
+			break;
+
+ case 715 : if (DEBUG) { System.out.println("RelationalExpression ::= RelationalExpression..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.GREATER_EQUAL);  
+			break;
+
+ case 717 : if (DEBUG) { System.out.println("InstanceofExpression ::= InstanceofExpression instanceof"); }  //$NON-NLS-1$
+		    consumeInstanceOfExpression();  
+			break;
+
+ case 719 : if (DEBUG) { System.out.println("EqualityExpression ::= EqualityExpression EQUAL_EQUAL..."); }  //$NON-NLS-1$
+		    consumeEqualityExpression(OperatorIds.EQUAL_EQUAL);  
+			break;
+
+ case 720 : if (DEBUG) { System.out.println("EqualityExpression ::= EqualityExpression NOT_EQUAL..."); }  //$NON-NLS-1$
+		    consumeEqualityExpression(OperatorIds.NOT_EQUAL);  
+			break;
+
+ case 722 : if (DEBUG) { System.out.println("AndExpression ::= AndExpression AND EqualityExpression"); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.AND);  
+			break;
+
+ case 724 : if (DEBUG) { System.out.println("ExclusiveOrExpression ::= ExclusiveOrExpression XOR..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.XOR);  
+			break;
+
+ case 726 : if (DEBUG) { System.out.println("InclusiveOrExpression ::= InclusiveOrExpression OR..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.OR);  
+			break;
+
+ case 728 : if (DEBUG) { System.out.println("ConditionalAndExpression ::= ConditionalAndExpression..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.AND_AND);  
+			break;
+
+ case 730 : if (DEBUG) { System.out.println("ConditionalOrExpression ::= ConditionalOrExpression..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.OR_OR);  
+			break;
+
+ case 732 : if (DEBUG) { System.out.println("ConditionalExpression ::= ConditionalOrExpression..."); }  //$NON-NLS-1$
+		    consumeConditionalExpression(OperatorIds.QUESTIONCOLON) ;  
+			break;
+
+ case 735 : if (DEBUG) { System.out.println("Assignment ::= PostfixExpression AssignmentOperator..."); }  //$NON-NLS-1$
+		    consumeAssignment();  
+			break;
+
+ case 737 : if (DEBUG) { System.out.println("Assignment ::= InvalidArrayInitializerAssignement"); }  //$NON-NLS-1$
+		    ignoreExpressionAssignment(); 
+			break;
+
+ case 738 : if (DEBUG) { System.out.println("AssignmentOperator ::= EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(EQUAL);  
+			break;
+
+ case 739 : if (DEBUG) { System.out.println("AssignmentOperator ::= MULTIPLY_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(MULTIPLY);  
+			break;
+
+ case 740 : if (DEBUG) { System.out.println("AssignmentOperator ::= DIVIDE_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(DIVIDE);  
+			break;
+
+ case 741 : if (DEBUG) { System.out.println("AssignmentOperator ::= REMAINDER_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(REMAINDER);  
+			break;
+
+ case 742 : if (DEBUG) { System.out.println("AssignmentOperator ::= PLUS_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(PLUS);  
+			break;
+
+ case 743 : if (DEBUG) { System.out.println("AssignmentOperator ::= MINUS_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(MINUS);  
+			break;
+
+ case 744 : if (DEBUG) { System.out.println("AssignmentOperator ::= LEFT_SHIFT_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(LEFT_SHIFT);  
+			break;
+
+ case 745 : if (DEBUG) { System.out.println("AssignmentOperator ::= RIGHT_SHIFT_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(RIGHT_SHIFT);  
+			break;
+
+ case 746 : if (DEBUG) { System.out.println("AssignmentOperator ::= UNSIGNED_RIGHT_SHIFT_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(UNSIGNED_RIGHT_SHIFT);  
+			break;
+
+ case 747 : if (DEBUG) { System.out.println("AssignmentOperator ::= AND_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(AND);  
+			break;
+
+ case 748 : if (DEBUG) { System.out.println("AssignmentOperator ::= XOR_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(XOR);  
+			break;
+
+ case 749 : if (DEBUG) { System.out.println("AssignmentOperator ::= OR_EQUAL"); }  //$NON-NLS-1$
+		    consumeAssignmentOperator(OR);  
+			break;
+
+ case 750 : if (DEBUG) { System.out.println("Expression ::= AssignmentExpression"); }  //$NON-NLS-1$
+		    consumeExpression();  
+			break;
+
+ case 753 : if (DEBUG) { System.out.println("Expressionopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyExpression();  
+			break;
+
+ case 758 : if (DEBUG) { System.out.println("ClassBodyDeclarationsopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyClassBodyDeclarationsopt();  
+			break;
+
+ case 759 : if (DEBUG) { System.out.println("ClassBodyDeclarationsopt ::= NestedType..."); }  //$NON-NLS-1$
+		    consumeClassBodyDeclarationsopt();  
+			break;
+
+  case 760 : if (DEBUG) { System.out.println("Modifiersopt ::="); }  //$NON-NLS-1$
+		    consumeDefaultModifiers();  
+			break;
+
+ case 761 : if (DEBUG) { System.out.println("Modifiersopt ::= Modifiers"); }  //$NON-NLS-1$
+		    consumeModifiers();  
+			break;
+
+ case 762 : if (DEBUG) { System.out.println("BlockStatementsopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyBlockStatementsopt();  
+			break;
+
+  case 764 : if (DEBUG) { System.out.println("Dimsopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyDimsopt();  
+			break;
+
+  case 766 : if (DEBUG) { System.out.println("ArgumentListopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyArgumentListopt();  
+			break;
+
+ case 770 : if (DEBUG) { System.out.println("FormalParameterListopt ::="); }  //$NON-NLS-1$
+		    consumeFormalParameterListopt();  
+			break;
+
+  case 774 : if (DEBUG) { System.out.println("InterfaceMemberDeclarationsopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyInterfaceMemberDeclarationsopt();  
+			break;
+
+  case 775 : if (DEBUG) { System.out.println("InterfaceMemberDeclarationsopt ::= NestedType..."); }  //$NON-NLS-1$
+		    consumeInterfaceMemberDeclarationsopt();  
+			break;
+
+ case 776 : if (DEBUG) { System.out.println("NestedType ::="); }  //$NON-NLS-1$
+		    consumeNestedType();  
+			break;
+
+  case 777 : if (DEBUG) { System.out.println("ForInitopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyForInitopt();  
+			break;
+
+  case 779 : if (DEBUG) { System.out.println("ForUpdateopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyForUpdateopt();  
+			break;
+
+  case 783 : if (DEBUG) { System.out.println("Catchesopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyCatchesopt();  
+			break;
+
+  case 785 : if (DEBUG) { System.out.println("EnumDeclaration ::= EnumHeader EnumBody"); }  //$NON-NLS-1$
+		    consumeEnumDeclaration();  
+			break;
+
+  case 786 : if (DEBUG) { System.out.println("EnumHeader ::= EnumHeaderName ClassHeaderImplementsopt"); }  //$NON-NLS-1$
+		    consumeEnumHeader();  
+			break;
+
+  case 787 : if (DEBUG) { System.out.println("EnumHeaderName ::= Modifiersopt enum JavaIdentifier"); }  //$NON-NLS-1$
+		    consumeEnumHeaderName();  
+			break;
+
+  case 788 : if (DEBUG) { System.out.println("EnumHeaderName ::= Modifiersopt enum JavaIdentifier..."); }  //$NON-NLS-1$
+		    consumeEnumHeaderNameWithTypeParameters();  
+			break;
+
+  case 789 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE EnumBodyDeclarationsopt RBRACE"); }  //$NON-NLS-1$
+		    consumeEnumBodyNoConstants();  
+			break;
+
+  case 790 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE COMMA EnumBodyDeclarationsopt..."); }  //$NON-NLS-1$
+		    consumeEnumBodyNoConstants();  
+			break;
+
+  case 791 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE EnumConstants COMMA..."); }  //$NON-NLS-1$
+		    consumeEnumBodyWithConstants();  
+			break;
+
+  case 792 : if (DEBUG) { System.out.println("EnumBody ::= LBRACE EnumConstants..."); }  //$NON-NLS-1$
+		    consumeEnumBodyWithConstants();  
+			break;
+
+ case 794 : if (DEBUG) { System.out.println("EnumConstants ::= EnumConstants COMMA EnumConstant"); }  //$NON-NLS-1$
+		    consumeEnumConstants();  
+			break;
+
+ case 795 : if (DEBUG) { System.out.println("EnumConstantHeaderName ::= Modifiersopt Identifier"); }  //$NON-NLS-1$
+		    consumeEnumConstantHeaderName();  
+			break;
+
+ case 796 : if (DEBUG) { System.out.println("EnumConstantHeader ::= EnumConstantHeaderName..."); }  //$NON-NLS-1$
+		    consumeEnumConstantHeader();  
+			break;
+
+ case 797 : if (DEBUG) { System.out.println("EnumConstant ::= EnumConstantHeader ForceNoDiet..."); }  //$NON-NLS-1$
+		    consumeEnumConstantWithClassBody();  
+			break;
+
+ case 798 : if (DEBUG) { System.out.println("EnumConstant ::= EnumConstantHeader"); }  //$NON-NLS-1$
+		    consumeEnumConstantNoClassBody();  
+			break;
+
+ case 799 : if (DEBUG) { System.out.println("Arguments ::= LPAREN ArgumentListopt RPAREN"); }  //$NON-NLS-1$
+		    consumeArguments();  
+			break;
+
+ case 800 : if (DEBUG) { System.out.println("Argumentsopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyArguments();  
+			break;
+
+ case 802 : if (DEBUG) { System.out.println("EnumDeclarations ::= SEMICOLON ClassBodyDeclarationsopt"); }  //$NON-NLS-1$
+		    consumeEnumDeclarations();  
+			break;
+
+ case 803 : if (DEBUG) { System.out.println("EnumBodyDeclarationsopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyEnumDeclarations();  
+			break;
+
+ case 805 : if (DEBUG) { System.out.println("EnhancedForStatement ::= EnhancedForStatementHeader..."); }  //$NON-NLS-1$
+		    consumeEnhancedForStatement();  
+			break;
+
+ case 806 : if (DEBUG) { System.out.println("EnhancedForStatementNoShortIf ::=..."); }  //$NON-NLS-1$
+		    consumeEnhancedForStatement();  
+			break;
+
+ case 807 : if (DEBUG) { System.out.println("EnhancedForStatementHeaderInit ::= for LPAREN Type..."); }  //$NON-NLS-1$
+		    consumeEnhancedForStatementHeaderInit(false);  
+			break;
+
+ case 808 : if (DEBUG) { System.out.println("EnhancedForStatementHeaderInit ::= for LPAREN Modifiers"); }  //$NON-NLS-1$
+		    consumeEnhancedForStatementHeaderInit(true);  
+			break;
+
+ case 809 : if (DEBUG) { System.out.println("EnhancedForStatementHeader ::=..."); }  //$NON-NLS-1$
+		    consumeEnhancedForStatementHeader();  
+			break;
+
+ case 810 : if (DEBUG) { System.out.println("SingleStaticImportDeclaration ::=..."); }  //$NON-NLS-1$
+		    consumeImportDeclaration();  
+			break;
+
+ case 811 : if (DEBUG) { System.out.println("SingleStaticImportDeclarationName ::= import static Name"); }  //$NON-NLS-1$
+		    consumeSingleStaticImportDeclarationName();  
+			break;
+
+ case 812 : if (DEBUG) { System.out.println("StaticImportOnDemandDeclaration ::=..."); }  //$NON-NLS-1$
+		    consumeImportDeclaration();  
+			break;
+
+ case 813 : if (DEBUG) { System.out.println("StaticImportOnDemandDeclarationName ::= import static..."); }  //$NON-NLS-1$
+		    consumeStaticImportOnDemandDeclarationName();  
+			break;
+
+ case 814 : if (DEBUG) { System.out.println("TypeArguments ::= LESS TypeArgumentList1"); }  //$NON-NLS-1$
+		    consumeTypeArguments();  
+			break;
+
+ case 815 : if (DEBUG) { System.out.println("OnlyTypeArguments ::= LESS TypeArgumentList1"); }  //$NON-NLS-1$
+		    consumeOnlyTypeArguments();  
+			break;
+
+ case 817 : if (DEBUG) { System.out.println("TypeArgumentList1 ::= TypeArgumentList COMMA..."); }  //$NON-NLS-1$
+		    consumeTypeArgumentList1();  
+			break;
+
+ case 819 : if (DEBUG) { System.out.println("TypeArgumentList ::= TypeArgumentList COMMA TypeArgument"); }  //$NON-NLS-1$
+		    consumeTypeArgumentList();  
+			break;
+
+ case 820 : if (DEBUG) { System.out.println("TypeArgument ::= ReferenceType"); }  //$NON-NLS-1$
+		    consumeTypeArgument();  
+			break;
+
+ case 824 : if (DEBUG) { System.out.println("ReferenceType1 ::= ReferenceType GREATER"); }  //$NON-NLS-1$
+		    consumeReferenceType1();  
+			break;
+
+ case 825 : if (DEBUG) { System.out.println("ReferenceType1 ::= ClassOrInterface LESS..."); }  //$NON-NLS-1$
+		    consumeTypeArgumentReferenceType1();  
+			break;
+
+ case 827 : if (DEBUG) { System.out.println("TypeArgumentList2 ::= TypeArgumentList COMMA..."); }  //$NON-NLS-1$
+		    consumeTypeArgumentList2();  
+			break;
+
+ case 830 : if (DEBUG) { System.out.println("ReferenceType2 ::= ReferenceType RIGHT_SHIFT"); }  //$NON-NLS-1$
+		    consumeReferenceType2();  
+			break;
+
+ case 831 : if (DEBUG) { System.out.println("ReferenceType2 ::= ClassOrInterface LESS..."); }  //$NON-NLS-1$
+		    consumeTypeArgumentReferenceType2();  
+			break;
+
+ case 833 : if (DEBUG) { System.out.println("TypeArgumentList3 ::= TypeArgumentList COMMA..."); }  //$NON-NLS-1$
+		    consumeTypeArgumentList3();  
+			break;
+
+ case 836 : if (DEBUG) { System.out.println("ReferenceType3 ::= ReferenceType UNSIGNED_RIGHT_SHIFT"); }  //$NON-NLS-1$
+		    consumeReferenceType3();  
+			break;
+
+ case 837 : if (DEBUG) { System.out.println("Wildcard ::= TypeAnnotationsopt QUESTION"); }  //$NON-NLS-1$
+		    consumeWildcard();  
+			break;
+
+ case 838 : if (DEBUG) { System.out.println("Wildcard ::= TypeAnnotationsopt QUESTION WildcardBounds"); }  //$NON-NLS-1$
+		    consumeWildcardWithBounds();  
+			break;
+
+ case 839 : if (DEBUG) { System.out.println("WildcardBounds ::= extends ReferenceType"); }  //$NON-NLS-1$
+		    consumeWildcardBoundsExtends();  
+			break;
+
+ case 840 : if (DEBUG) { System.out.println("WildcardBounds ::= super ReferenceType"); }  //$NON-NLS-1$
+		    consumeWildcardBoundsSuper();  
+			break;
+
+ case 841 : if (DEBUG) { System.out.println("Wildcard1 ::= TypeAnnotationsopt QUESTION GREATER"); }  //$NON-NLS-1$
+		    consumeWildcard1();  
+			break;
+
+ case 842 : if (DEBUG) { System.out.println("Wildcard1 ::= TypeAnnotationsopt QUESTION..."); }  //$NON-NLS-1$
+		    consumeWildcard1WithBounds();  
+			break;
+
+ case 843 : if (DEBUG) { System.out.println("WildcardBounds1 ::= extends ReferenceType1"); }  //$NON-NLS-1$
+		    consumeWildcardBounds1Extends();  
+			break;
+
+ case 844 : if (DEBUG) { System.out.println("WildcardBounds1 ::= super ReferenceType1"); }  //$NON-NLS-1$
+		    consumeWildcardBounds1Super();  
+			break;
+
+ case 845 : if (DEBUG) { System.out.println("Wildcard2 ::= TypeAnnotationsopt QUESTION RIGHT_SHIFT"); }  //$NON-NLS-1$
+		    consumeWildcard2();  
+			break;
+
+ case 846 : if (DEBUG) { System.out.println("Wildcard2 ::= TypeAnnotationsopt QUESTION..."); }  //$NON-NLS-1$
+		    consumeWildcard2WithBounds();  
+			break;
+
+ case 847 : if (DEBUG) { System.out.println("WildcardBounds2 ::= extends ReferenceType2"); }  //$NON-NLS-1$
+		    consumeWildcardBounds2Extends();  
+			break;
+
+ case 848 : if (DEBUG) { System.out.println("WildcardBounds2 ::= super ReferenceType2"); }  //$NON-NLS-1$
+		    consumeWildcardBounds2Super();  
+			break;
+
+ case 849 : if (DEBUG) { System.out.println("Wildcard3 ::= TypeAnnotationsopt QUESTION..."); }  //$NON-NLS-1$
+		    consumeWildcard3();  
+			break;
+
+ case 850 : if (DEBUG) { System.out.println("Wildcard3 ::= TypeAnnotationsopt QUESTION..."); }  //$NON-NLS-1$
+		    consumeWildcard3WithBounds();  
+			break;
+
+ case 851 : if (DEBUG) { System.out.println("WildcardBounds3 ::= extends ReferenceType3"); }  //$NON-NLS-1$
+		    consumeWildcardBounds3Extends();  
+			break;
+
+ case 852 : if (DEBUG) { System.out.println("WildcardBounds3 ::= super ReferenceType3"); }  //$NON-NLS-1$
+		    consumeWildcardBounds3Super();  
+			break;
+
+ case 853 : if (DEBUG) { System.out.println("TypeParameterHeader ::= TypeAnnotationsopt..."); }  //$NON-NLS-1$
+		    consumeTypeParameterHeader();  
+			break;
+
+ case 854 : if (DEBUG) { System.out.println("TypeParameters ::= LESS TypeParameterList1"); }  //$NON-NLS-1$
+		    consumeTypeParameters();  
+			break;
+
+ case 856 : if (DEBUG) { System.out.println("TypeParameterList ::= TypeParameterList COMMA..."); }  //$NON-NLS-1$
+		    consumeTypeParameterList();  
+			break;
+
+ case 858 : if (DEBUG) { System.out.println("TypeParameter ::= TypeParameterHeader extends..."); }  //$NON-NLS-1$
+		    consumeTypeParameterWithExtends();  
+			break;
+
+ case 859 : if (DEBUG) { System.out.println("TypeParameter ::= TypeParameterHeader extends..."); }  //$NON-NLS-1$
+		    consumeTypeParameterWithExtendsAndBounds();  
+			break;
+
+ case 861 : if (DEBUG) { System.out.println("AdditionalBoundList ::= AdditionalBoundList..."); }  //$NON-NLS-1$
+		    consumeAdditionalBoundList();  
+			break;
+
+ case 862 : if (DEBUG) { System.out.println("AdditionalBound ::= AND ReferenceType"); }  //$NON-NLS-1$
+		    consumeAdditionalBound();  
+			break;
+
+ case 864 : if (DEBUG) { System.out.println("TypeParameterList1 ::= TypeParameterList COMMA..."); }  //$NON-NLS-1$
+		    consumeTypeParameterList1();  
+			break;
+
+ case 865 : if (DEBUG) { System.out.println("TypeParameter1 ::= TypeParameterHeader GREATER"); }  //$NON-NLS-1$
+		    consumeTypeParameter1();  
+			break;
+
+ case 866 : if (DEBUG) { System.out.println("TypeParameter1 ::= TypeParameterHeader extends..."); }  //$NON-NLS-1$
+		    consumeTypeParameter1WithExtends();  
+			break;
+
+ case 867 : if (DEBUG) { System.out.println("TypeParameter1 ::= TypeParameterHeader extends..."); }  //$NON-NLS-1$
+		    consumeTypeParameter1WithExtendsAndBounds();  
+			break;
+
+ case 869 : if (DEBUG) { System.out.println("AdditionalBoundList1 ::= AdditionalBoundList..."); }  //$NON-NLS-1$
+		    consumeAdditionalBoundList1();  
+			break;
+
+ case 870 : if (DEBUG) { System.out.println("AdditionalBound1 ::= AND ReferenceType1"); }  //$NON-NLS-1$
+		    consumeAdditionalBound1();  
+			break;
+
+ case 876 : if (DEBUG) { System.out.println("UnaryExpression_NotName ::= PLUS PushPosition..."); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.PLUS);  
+			break;
+
+ case 877 : if (DEBUG) { System.out.println("UnaryExpression_NotName ::= MINUS PushPosition..."); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.MINUS);  
+			break;
+
+ case 880 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus_NotName ::= TWIDDLE..."); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.TWIDDLE);  
+			break;
+
+ case 881 : if (DEBUG) { System.out.println("UnaryExpressionNotPlusMinus_NotName ::= NOT PushPosition"); }  //$NON-NLS-1$
+		    consumeUnaryExpression(OperatorIds.NOT);  
+			break;
+
+ case 884 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.MULTIPLY);  
+			break;
+
+ case 885 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::= NameOrAj MULTIPLY"); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.MULTIPLY);  
+			break;
+
+ case 886 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.DIVIDE);  
+			break;
+
+ case 887 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::= NameOrAj DIVIDE..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.DIVIDE);  
+			break;
+
+ case 888 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.REMAINDER);  
+			break;
+
+ case 889 : if (DEBUG) { System.out.println("MultiplicativeExpression_NotName ::= NameOrAj REMAINDER"); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.REMAINDER);  
+			break;
+
+ case 891 : if (DEBUG) { System.out.println("AdditiveExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.PLUS);  
+			break;
+
+ case 892 : if (DEBUG) { System.out.println("AdditiveExpression_NotName ::= NameOrAj PLUS..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.PLUS);  
+			break;
+
+ case 893 : if (DEBUG) { System.out.println("AdditiveExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.MINUS);  
+			break;
+
+ case 894 : if (DEBUG) { System.out.println("AdditiveExpression_NotName ::= NameOrAj MINUS..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.MINUS);  
+			break;
+
+ case 896 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= ShiftExpression_NotName..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.LEFT_SHIFT);  
+			break;
+
+ case 897 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= NameOrAj LEFT_SHIFT..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.LEFT_SHIFT);  
+			break;
+
+ case 898 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= ShiftExpression_NotName..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.RIGHT_SHIFT);  
+			break;
+
+ case 899 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= NameOrAj RIGHT_SHIFT..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.RIGHT_SHIFT);  
+			break;
+
+ case 900 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= ShiftExpression_NotName..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.UNSIGNED_RIGHT_SHIFT);  
+			break;
+
+ case 901 : if (DEBUG) { System.out.println("ShiftExpression_NotName ::= NameOrAj..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.UNSIGNED_RIGHT_SHIFT);  
+			break;
+
+ case 903 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= ShiftExpression_NotName"); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.LESS);  
+			break;
+
+ case 904 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= Name LESS..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.LESS);  
+			break;
+
+ case 905 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= ShiftExpression_NotName"); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.GREATER);  
+			break;
+
+ case 906 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= NameOrAj GREATER..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.GREATER);  
+			break;
+
+ case 907 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.LESS_EQUAL);  
+			break;
+
+ case 908 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= NameOrAj LESS_EQUAL..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.LESS_EQUAL);  
+			break;
+
+ case 909 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.GREATER_EQUAL);  
+			break;
+
+ case 910 : if (DEBUG) { System.out.println("RelationalExpression_NotName ::= NameOrAj GREATER_EQUAL"); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.GREATER_EQUAL);  
+			break;
+
+ case 912 : if (DEBUG) { System.out.println("InstanceofExpression_NotName ::= NameOrAj instanceof..."); }  //$NON-NLS-1$
+		    consumeInstanceOfExpressionWithName();  
+			break;
+
+ case 913 : if (DEBUG) { System.out.println("InstanceofExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeInstanceOfExpression();  
+			break;
+
+ case 915 : if (DEBUG) { System.out.println("EqualityExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeEqualityExpression(OperatorIds.EQUAL_EQUAL);  
+			break;
+
+ case 916 : if (DEBUG) { System.out.println("EqualityExpression_NotName ::= NameOrAj EQUAL_EQUAL..."); }  //$NON-NLS-1$
+		    consumeEqualityExpressionWithName(OperatorIds.EQUAL_EQUAL);  
+			break;
+
+ case 917 : if (DEBUG) { System.out.println("EqualityExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeEqualityExpression(OperatorIds.NOT_EQUAL);  
+			break;
+
+ case 918 : if (DEBUG) { System.out.println("EqualityExpression_NotName ::= NameOrAj NOT_EQUAL..."); }  //$NON-NLS-1$
+		    consumeEqualityExpressionWithName(OperatorIds.NOT_EQUAL);  
+			break;
+
+ case 920 : if (DEBUG) { System.out.println("AndExpression_NotName ::= AndExpression_NotName AND..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.AND);  
+			break;
+
+ case 921 : if (DEBUG) { System.out.println("AndExpression_NotName ::= NameOrAj AND..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.AND);  
+			break;
+
+ case 923 : if (DEBUG) { System.out.println("ExclusiveOrExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.XOR);  
+			break;
+
+ case 924 : if (DEBUG) { System.out.println("ExclusiveOrExpression_NotName ::= NameOrAj XOR..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.XOR);  
+			break;
+
+ case 926 : if (DEBUG) { System.out.println("InclusiveOrExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.OR);  
+			break;
+
+ case 927 : if (DEBUG) { System.out.println("InclusiveOrExpression_NotName ::= NameOrAj OR..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.OR);  
+			break;
+
+ case 929 : if (DEBUG) { System.out.println("ConditionalAndExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.AND_AND);  
+			break;
+
+ case 930 : if (DEBUG) { System.out.println("ConditionalAndExpression_NotName ::= NameOrAj AND_AND..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.AND_AND);  
+			break;
+
+ case 932 : if (DEBUG) { System.out.println("ConditionalOrExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeBinaryExpression(OperatorIds.OR_OR);  
+			break;
+
+ case 933 : if (DEBUG) { System.out.println("ConditionalOrExpression_NotName ::= NameOrAj OR_OR..."); }  //$NON-NLS-1$
+		    consumeBinaryExpressionWithName(OperatorIds.OR_OR);  
+			break;
+
+ case 935 : if (DEBUG) { System.out.println("ConditionalExpression_NotName ::=..."); }  //$NON-NLS-1$
+		    consumeConditionalExpression(OperatorIds.QUESTIONCOLON) ;  
+			break;
+
+ case 936 : if (DEBUG) { System.out.println("ConditionalExpression_NotName ::= NameOrAj QUESTION..."); }  //$NON-NLS-1$
+		    consumeConditionalExpressionWithName(OperatorIds.QUESTIONCOLON) ;  
+			break;
+
+ case 940 : if (DEBUG) { System.out.println("AnnotationTypeDeclarationHeaderName ::= Modifiers AT..."); }  //$NON-NLS-1$
+		    consumeAnnotationTypeDeclarationHeaderName() ;  
+			break;
+
+ case 941 : if (DEBUG) { System.out.println("AnnotationTypeDeclarationHeaderName ::= Modifiers AT..."); }  //$NON-NLS-1$
+		    consumeAnnotationTypeDeclarationHeaderNameWithTypeParameters() ;  
+			break;
+
+ case 942 : if (DEBUG) { System.out.println("AnnotationTypeDeclarationHeaderName ::= AT..."); }  //$NON-NLS-1$
+		    consumeAnnotationTypeDeclarationHeaderNameWithTypeParameters() ;  
+			break;
+
+ case 943 : if (DEBUG) { System.out.println("AnnotationTypeDeclarationHeaderName ::= AT..."); }  //$NON-NLS-1$
+		    consumeAnnotationTypeDeclarationHeaderName() ;  
+			break;
+
+ case 944 : if (DEBUG) { System.out.println("AnnotationTypeDeclarationHeader ::=..."); }  //$NON-NLS-1$
+		    consumeAnnotationTypeDeclarationHeader() ;  
+			break;
+
+ case 945 : if (DEBUG) { System.out.println("AnnotationTypeDeclaration ::=..."); }  //$NON-NLS-1$
+		    consumeAnnotationTypeDeclaration() ;  
+			break;
+
+ case 947 : if (DEBUG) { System.out.println("AnnotationTypeMemberDeclarationsopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyAnnotationTypeMemberDeclarationsopt() ;  
+			break;
+
+ case 948 : if (DEBUG) { System.out.println("AnnotationTypeMemberDeclarationsopt ::= NestedType..."); }  //$NON-NLS-1$
+		    consumeAnnotationTypeMemberDeclarationsopt() ;  
+			break;
+
+ case 950 : if (DEBUG) { System.out.println("AnnotationTypeMemberDeclarations ::=..."); }  //$NON-NLS-1$
+		    consumeAnnotationTypeMemberDeclarations() ;  
+			break;
+
+ case 951 : if (DEBUG) { System.out.println("AnnotationMethodHeaderName ::= Modifiersopt..."); }  //$NON-NLS-1$
+		    consumeMethodHeaderNameWithTypeParameters(true);  
+			break;
+
+ case 952 : if (DEBUG) { System.out.println("AnnotationMethodHeaderName ::= Modifiersopt Type..."); }  //$NON-NLS-1$
+		    consumeMethodHeaderName(true);  
+			break;
+
+ case 953 : if (DEBUG) { System.out.println("AnnotationMethodHeaderDefaultValueopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyMethodHeaderDefaultValue() ;  
+			break;
+
+ case 954 : if (DEBUG) { System.out.println("AnnotationMethodHeaderDefaultValueopt ::= DefaultValue"); }  //$NON-NLS-1$
+		    consumeMethodHeaderDefaultValue();  
+			break;
+
+ case 955 : if (DEBUG) { System.out.println("AnnotationMethodHeader ::= AnnotationMethodHeaderName..."); }  //$NON-NLS-1$
+		    consumeMethodHeader();  
+			break;
+
+ case 956 : if (DEBUG) { System.out.println("AnnotationTypeMemberDeclaration ::=..."); }  //$NON-NLS-1$
+		    consumeAnnotationTypeMemberDeclaration() ;  
+			break;
+
+ case 964 : if (DEBUG) { System.out.println("AnnotationName ::= AT UnannotatableNameOrAj"); }  //$NON-NLS-1$
+		    consumeAnnotationName() ;  
+			break;
+
+ case 965 : if (DEBUG) { System.out.println("NormalAnnotation ::= AnnotationName LPAREN..."); }  //$NON-NLS-1$
+		    consumeNormalAnnotation(false) ;  
+			break;
+
+ case 966 : if (DEBUG) { System.out.println("MemberValuePairsopt ::="); }  //$NON-NLS-1$
+		    consumeEmptyMemberValuePairsopt() ;  
+			break;
+
+ case 969 : if (DEBUG) { System.out.println("MemberValuePairs ::= MemberValuePairs COMMA..."); }  //$NON-NLS-1$
+		    consumeMemberValuePairs() ;  
+			break;
+
+ case 970 : if (DEBUG) { System.out.println("MemberValuePair ::= SimpleNameOrAj EQUAL..."); }  //$NON-NLS-1$
+		    consumeMemberValuePair() ;  
+			break;
+
+ case 971 : if (DEBUG) { System.out.println("EnterMemberValue ::="); }  //$NON-NLS-1$
+		    consumeEnterMemberValue() ;  
+			break;
+
+ case 972 : if (DEBUG) { System.out.println("ExitMemberValue ::="); }  //$NON-NLS-1$
+		    consumeExitMemberValue() ;  
+			break;
+
+ case 974 : if (DEBUG) { System.out.println("MemberValue ::= NameOrAj"); }  //$NON-NLS-1$
+		    consumeMemberValueAsName() ;  
+			break;
+
+ case 977 : if (DEBUG) { System.out.println("MemberValueArrayInitializer ::=..."); }  //$NON-NLS-1$
+		    consumeMemberValueArrayInitializer() ;  
+			break;
+
+ case 978 : if (DEBUG) { System.out.println("MemberValueArrayInitializer ::=..."); }  //$NON-NLS-1$
+		    consumeMemberValueArrayInitializer() ;  
+			break;
+
+ case 979 : if (DEBUG) { System.out.println("MemberValueArrayInitializer ::=..."); }  //$NON-NLS-1$
+		    consumeEmptyMemberValueArrayInitializer() ;  
+			break;
+
+ case 980 : if (DEBUG) { System.out.println("MemberValueArrayInitializer ::=..."); }  //$NON-NLS-1$
+		    consumeEmptyMemberValueArrayInitializer() ;  
+			break;
+
+ case 981 : if (DEBUG) { System.out.println("EnterMemberValueArrayInitializer ::="); }  //$NON-NLS-1$
+		    consumeEnterMemberValueArrayInitializer() ;  
+			break;
+
+ case 983 : if (DEBUG) { System.out.println("MemberValues ::= MemberValues COMMA MemberValue"); }  //$NON-NLS-1$
+		    consumeMemberValues() ;  
+			break;
+
+ case 984 : if (DEBUG) { System.out.println("MarkerAnnotation ::= AnnotationName"); }  //$NON-NLS-1$
+		    consumeMarkerAnnotation(false) ;  
+			break;
+
+ case 985 : if (DEBUG) { System.out.println("SingleMemberAnnotationMemberValue ::= MemberValue"); }  //$NON-NLS-1$
+		    consumeSingleMemberAnnotationMemberValue() ;  
+			break;
+
+ case 986 : if (DEBUG) { System.out.println("SingleMemberAnnotation ::= AnnotationName LPAREN..."); }  //$NON-NLS-1$
+		    consumeSingleMemberAnnotation(false) ;  
+			break;
+
+ case 987 : if (DEBUG) { System.out.println("RecoveryMethodHeaderName ::= Modifiersopt TypeParameters"); }  //$NON-NLS-1$
+		    consumeRecoveryMethodHeaderNameWithTypeParameters();  
+			break;
+
+ case 988 : if (DEBUG) { System.out.println("RecoveryMethodHeaderName ::= Modifiersopt Type..."); }  //$NON-NLS-1$
+		    consumeRecoveryMethodHeaderName();  
+			break;
+
+ case 989 : if (DEBUG) { System.out.println("RecoveryMethodHeaderName ::= ModifiersWithDefault..."); }  //$NON-NLS-1$
+		    consumeRecoveryMethodHeaderNameWithTypeParameters();  
+			break;
+
+ case 990 : if (DEBUG) { System.out.println("RecoveryMethodHeaderName ::= ModifiersWithDefault Type"); }  //$NON-NLS-1$
+		    consumeRecoveryMethodHeaderName();  
+			break;
+
+ case 991 : if (DEBUG) { System.out.println("RecoveryMethodHeader ::= RecoveryMethodHeaderName..."); }  //$NON-NLS-1$
+		    consumeMethodHeader();  
+			break;
+
+ case 992 : if (DEBUG) { System.out.println("RecoveryMethodHeader ::= RecoveryMethodHeaderName..."); }  //$NON-NLS-1$
+		    consumeMethodHeader();  
+			break;
+
 	}
+}
 
 
 // AspectJ: new method
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.java
index 7a4d0ad..6cc5740 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.java
@@ -5,14 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *  
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -22,24 +14,22 @@
  about the parser such as the number of rules in the grammar, the starting state, etc...*/
 public interface ParserBasicInformation {
 
-    int 
+	int  ERROR_SYMBOL      = 125,
+      MAX_NAME_LENGTH   = 41,
+      NUM_STATES        = 1264,
 
-    ERROR_SYMBOL      = 125,
-    MAX_NAME_LENGTH   = 41,
-    NUM_STATES        = 1265,
-
-    NT_OFFSET         = 125,
-    SCOPE_UBOUND      = 366,
-    SCOPE_SIZE        = 367,
-    LA_STATE_OFFSET   = 19170,
-    MAX_LA            = 1,
-    NUM_RULES         = 986,
-    NUM_TERMINALS     = 125,
-    NUM_NON_TERMINALS = 420,
-    NUM_SYMBOLS       = 545,
-    START_STATE       = 1226,
-    EOFT_SYMBOL       = 70,
-    EOLT_SYMBOL       = 70,
-    ACCEPT_ACTION     = 19169,
-    ERROR_ACTION      = 19170;
+      NT_OFFSET         = 125,
+      SCOPE_UBOUND      = 365,
+      SCOPE_SIZE        = 366,
+      LA_STATE_OFFSET   = 18969,
+      MAX_LA            = 1,
+      NUM_RULES         = 992,
+      NUM_TERMINALS     = 125,
+      NUM_NON_TERMINALS = 423,
+      NUM_SYMBOLS       = 548,
+      START_STATE       = 1288,
+      EOFT_SYMBOL       = 70,
+      EOLT_SYMBOL       = 70,
+      ACCEPT_ACTION     = 18968,
+      ERROR_ACTION      = 18969;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.java
index fd2de67..31c0aaa 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.java
@@ -1,11 +1,10 @@
 /*******************************************************************************
- * 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
  * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
+ *Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.parser;
@@ -19,12 +18,14 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Block;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 
+@SuppressWarnings("rawtypes")
 public class RecoveredBlock extends RecoveredStatement implements TerminalTokens {
 
 	public Block blockDeclaration;
@@ -150,6 +151,10 @@
  * Record a statement declaration
  */
 public RecoveredElement add(Statement stmt, int bracketBalanceValue, boolean delegatedByParent) {
+	
+	if (stmt instanceof LambdaExpression) // lambdas are recovered up to the containing statement anyways.
+		return this;
+	
 	resetPendingModifiers();
 
 	/* do not consider a nested block starting passed the block end (if set)
@@ -283,6 +288,11 @@
 
 	// if block was not marked to be preserved or empty, then ignore it
 	if (!this.preserveContent || this.statementCount == 0) return null;
+	
+	/* If this block stands for the lambda body, trash the contents. Lambda expressions are recovered as part of the enclosing statement.
+	   We still have left in a block here to make sure that contained elements can be trapped and tossed out.
+	*/
+	if (this.blockDeclaration.lambdaBody) return null; 
 
 	Statement[] updatedStatements = new Statement[this.statementCount];
 	int updatedCount = 0;
@@ -328,7 +338,7 @@
 		Statement updatedStatement = this.statements[i].updatedStatement(depth, knownTypes);
 		if (updatedStatement != null){
 			updatedStatements[updatedCount++] = updatedStatement;
-
+			
 			if (updatedStatement instanceof LocalDeclaration) {
 				LocalDeclaration localDeclaration = (LocalDeclaration) updatedStatement;
 				if(localDeclaration.declarationSourceEnd > lastEnd) {
@@ -419,6 +429,11 @@
 
 	// if block was closed or empty, then ignore it
 	if (this.blockDeclaration.sourceEnd != 0 || this.statementCount == 0) return null;
+	
+	/* If this block stands for the lambda body, trash the contents. Lambda expressions are recovered as part of the enclosing statement.
+	   We still have left in a block here to make sure that contained elements can be trapped and tossed out.
+	*/
+	if (this.blockDeclaration.lambdaBody) return null; 
 
 	Statement[] updatedStatements = new Statement[this.statementCount];
 	int updatedCount = 0;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.java
index 48d9ea8..73f79f7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.java
@@ -4,17 +4,18 @@
  * 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.aspectj.org.eclipse.jdt.internal.compiler.parser;

 

 /**

  * Internal structure for parsing recovery

  */

-import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;

 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;

+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;

 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Block;

 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;

 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ImportReference;

diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredField.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredField.java
index 1233336..17a0ac7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredField.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredField.java
@@ -27,6 +27,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
 
+@SuppressWarnings("rawtypes")
 public class RecoveredField extends RecoveredElement {
 
 	public FieldDeclaration fieldDeclaration;
@@ -34,7 +35,7 @@
 
 	public RecoveredAnnotation[] annotations;
 	public int annotationCount;
-
+	
 	public int modifiers;
 	public int modifiersStart;
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.java
index 35779fa..ce119cf 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.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,11 +24,11 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
 
+@SuppressWarnings("rawtypes")
 public class RecoveredLocalVariable extends RecoveredStatement {
 
 	public RecoveredAnnotation[] annotations;
 	public int annotationCount;
-
 	public int modifiers;
 	public int modifiersStart;
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java
index f00489a..968cbe0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Bug 392671
@@ -44,6 +40,7 @@
  * Internal method structure for parsing recovery
  */
 
+@SuppressWarnings("rawtypes")
 public class RecoveredMethod extends RecoveredElement implements TerminalTokens {
 
 	public AbstractMethodDeclaration methodDeclaration;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.java
index 52570c4..7c2b91d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.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
@@ -19,17 +19,20 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
 
+@SuppressWarnings("rawtypes")
 public class RecoveredStatement extends RecoveredElement {
 
 	public Statement statement;
+	
 public RecoveredStatement(Statement statement, RecoveredElement parent, int bracketBalance){
 	super(parent, bracketBalance);
 	this.statement = statement;
 }
+
 /*
  * Answer the associated parsed structure
  */
-public ASTNode parseTree(){
+public ASTNode parseTree() {
 	return this.statement;
 }
 /*
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredType.java
index ae7bcfe..1a7bda6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredType.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -38,6 +34,7 @@
  * Internal type structure for parsing recovery
  */
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class RecoveredType extends RecoveredStatement implements TerminalTokens {
 	public static final int MAX_TYPE_DEPTH = 256;
 	
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.java
index fbbf600..7c9ba08 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.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
@@ -25,6 +25,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Initializer;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
 
+@SuppressWarnings("rawtypes")
 public class RecoveredUnit extends RecoveredElement {
 
 	public CompilationUnitDeclaration unitDeclaration;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.java
index cbe4601..52c1540 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java
index b6d13b5..19724ab 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java
@@ -41,6 +41,7 @@
 
 	private static long[][][] Tables;
 	private static long[][][] Tables7;
+	private static long[][][] Tables8;
 
 	public final static int MAX_OBVIOUS = 128;
 	public final static int[] OBVIOUS_IDENT_CHAR_NATURES = new int[MAX_OBVIOUS];
@@ -130,198 +131,111 @@
 		OBVIOUS_IDENT_CHAR_NATURES['"'] = C_SEPARATOR;
 		OBVIOUS_IDENT_CHAR_NATURES['\''] = C_SEPARATOR;
 	}
-
 static void initializeTable() {
-	Tables = new long[2][][];
-	Tables[START_INDEX] = new long[3][];
-	Tables[PART_INDEX] = new long[4][];
-	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode/start0.rsc"))); //$NON-NLS-1$
-		long[] readValues = new long[1024];
-		for (int i = 0; i < 1024; i++) {
-			readValues[i] = inputStream.readLong();
-		}
-		inputStream.close();
-		Tables[START_INDEX][0] = readValues;
-	} catch (FileNotFoundException e) {
-		e.printStackTrace();
-	} catch (IOException e) {
-		e.printStackTrace();
-	}
-	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode/start1.rsc"))); //$NON-NLS-1$
-		long[] readValues = new long[1024];
-		for (int i = 0; i < 1024; i++) {
-			readValues[i] = inputStream.readLong();
-		}
-		inputStream.close();
-		Tables[START_INDEX][1] = readValues;
-	} catch (FileNotFoundException e) {
-		e.printStackTrace();
-	} catch (IOException e) {
-		e.printStackTrace();
-	}
-	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode/start2.rsc"))); //$NON-NLS-1$
-		long[] readValues = new long[1024];
-		for (int i = 0; i < 1024; i++) {
-			readValues[i] = inputStream.readLong();
-		}
-		inputStream.close();
-		Tables[START_INDEX][2] = readValues;
-	} catch (FileNotFoundException e) {
-		e.printStackTrace();
-	} catch (IOException e) {
-		e.printStackTrace();
-	}
-	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode/part0.rsc"))); //$NON-NLS-1$
-		long[] readValues = new long[1024];
-		for (int i = 0; i < 1024; i++) {
-			readValues[i] = inputStream.readLong();
-		}
-		inputStream.close();
-		Tables[PART_INDEX][0] = readValues;
-	} catch (FileNotFoundException e) {
-		e.printStackTrace();
-	} catch (IOException e) {
-		e.printStackTrace();
-	}
-	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode/part1.rsc"))); //$NON-NLS-1$
-		long[] readValues = new long[1024];
-		for (int i = 0; i < 1024; i++) {
-			readValues[i] = inputStream.readLong();
-		}
-		inputStream.close();
-		Tables[PART_INDEX][1] = readValues;
-	} catch (FileNotFoundException e) {
-		e.printStackTrace();
-	} catch (IOException e) {
-		e.printStackTrace();
-	}
-	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode/part2.rsc"))); //$NON-NLS-1$
-		long[] readValues = new long[1024];
-		for (int i = 0; i < 1024; i++) {
-			readValues[i] = inputStream.readLong();
-		}
-		inputStream.close();
-		Tables[PART_INDEX][2] = readValues;
-	} catch (FileNotFoundException e) {
-		e.printStackTrace();
-	} catch (IOException e) {
-		e.printStackTrace();
-	}
-	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode/part14.rsc"))); //$NON-NLS-1$
-		long[] readValues = new long[1024];
-		for (int i = 0; i < 1024; i++) {
-			readValues[i] = inputStream.readLong();
-		}
-		inputStream.close();
-		Tables[PART_INDEX][3] = readValues;
-	} catch (FileNotFoundException e) {
-		e.printStackTrace();
-	} catch (IOException e) {
-		e.printStackTrace();
-	}
+	Tables = initializeTables("unicode"); //$NON-NLS-1$
 }
 static void initializeTable17() {
-	Tables7 = new long[2][][];
-	Tables7[START_INDEX] = new long[3][];
-	Tables7[PART_INDEX] = new long[4][];
+	Tables7 = initializeTables("unicode6"); //$NON-NLS-1$
+}
+static void initializeTable18() {
+	Tables8 = initializeTables("unicode6_2"); //$NON-NLS-1$
+}
+static long[][][] initializeTables(String unicode_path) {
+	long[][][] tempTable = new long[2][][];
+	tempTable[START_INDEX] = new long[3][];
+	tempTable[PART_INDEX] = new long[4][];
 	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode6/start0.rsc"))); //$NON-NLS-1$
+		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream(unicode_path + "/start0.rsc"))); //$NON-NLS-1$
 		long[] readValues = new long[1024];
 		for (int i = 0; i < 1024; i++) {
 			readValues[i] = inputStream.readLong();
 		}
 		inputStream.close();
-		Tables7[START_INDEX][0] = readValues;
+		tempTable[START_INDEX][0] = readValues;
 	} catch (FileNotFoundException e) {
 		e.printStackTrace();
 	} catch (IOException e) {
 		e.printStackTrace();
 	}
 	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode6/start1.rsc"))); //$NON-NLS-1$
+		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream(unicode_path + "/start1.rsc"))); //$NON-NLS-1$
 		long[] readValues = new long[1024];
 		for (int i = 0; i < 1024; i++) {
 			readValues[i] = inputStream.readLong();
 		}
 		inputStream.close();
-		Tables7[START_INDEX][1] = readValues;
+		tempTable[START_INDEX][1] = readValues;
 	} catch (FileNotFoundException e) {
 		e.printStackTrace();
 	} catch (IOException e) {
 		e.printStackTrace();
 	}
 	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode6/start2.rsc"))); //$NON-NLS-1$
+		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream(unicode_path + "/start2.rsc"))); //$NON-NLS-1$
 		long[] readValues = new long[1024];
 		for (int i = 0; i < 1024; i++) {
 			readValues[i] = inputStream.readLong();
 		}
 		inputStream.close();
-		Tables7[START_INDEX][2] = readValues;
+		tempTable[START_INDEX][2] = readValues;
 	} catch (FileNotFoundException e) {
 		e.printStackTrace();
 	} catch (IOException e) {
 		e.printStackTrace();
 	}
 	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode6/part0.rsc"))); //$NON-NLS-1$
+		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream(unicode_path + "/part0.rsc"))); //$NON-NLS-1$
 		long[] readValues = new long[1024];
 		for (int i = 0; i < 1024; i++) {
 			readValues[i] = inputStream.readLong();
 		}
 		inputStream.close();
-		Tables7[PART_INDEX][0] = readValues;
+		tempTable[PART_INDEX][0] = readValues;
 	} catch (FileNotFoundException e) {
 		e.printStackTrace();
 	} catch (IOException e) {
 		e.printStackTrace();
 	}
 	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode6/part1.rsc"))); //$NON-NLS-1$
+		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream(unicode_path + "/part1.rsc"))); //$NON-NLS-1$
 		long[] readValues = new long[1024];
 		for (int i = 0; i < 1024; i++) {
 			readValues[i] = inputStream.readLong();
 		}
 		inputStream.close();
-		Tables7[PART_INDEX][1] = readValues;
+		tempTable[PART_INDEX][1] = readValues;
 	} catch (FileNotFoundException e) {
 		e.printStackTrace();
 	} catch (IOException e) {
 		e.printStackTrace();
 	}
 	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode6/part2.rsc"))); //$NON-NLS-1$
+		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream(unicode_path + "/part2.rsc"))); //$NON-NLS-1$
 		long[] readValues = new long[1024];
 		for (int i = 0; i < 1024; i++) {
 			readValues[i] = inputStream.readLong();
 		}
 		inputStream.close();
-		Tables7[PART_INDEX][2] = readValues;
+		tempTable[PART_INDEX][2] = readValues;
 	} catch (FileNotFoundException e) {
 		e.printStackTrace();
 	} catch (IOException e) {
 		e.printStackTrace();
 	}
 	try {
-		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream("unicode6/part14.rsc"))); //$NON-NLS-1$
+		DataInputStream inputStream = new DataInputStream(new BufferedInputStream(ScannerHelper.class.getResourceAsStream(unicode_path + "/part14.rsc"))); //$NON-NLS-1$
 		long[] readValues = new long[1024];
 		for (int i = 0; i < 1024; i++) {
 			readValues[i] = inputStream.readLong();
 		}
 		inputStream.close();
-		Tables7[PART_INDEX][3] = readValues;
+		tempTable[PART_INDEX][3] = readValues;
 	} catch (FileNotFoundException e) {
 		e.printStackTrace();
 	} catch (IOException e) {
 		e.printStackTrace();
 	}
+	return tempTable;
 }
 private final static boolean isBitSet(long[] values, int i) {
 	try {
@@ -357,7 +271,7 @@
 			case 14 :
 				return isBitSet(Tables[PART_INDEX][3], codePoint & 0xFFFF);
 		}
-	} else {
+	} else if (complianceLevel <= ClassFileConstants.JDK1_7) {
 		// java 7 supports Unicode 6
 		if (Tables7 == null) {
 			initializeTable17();
@@ -372,6 +286,21 @@
 			case 14 :
 				return isBitSet(Tables7[PART_INDEX][3], codePoint & 0xFFFF);
 		}
+	} else {
+		// java 7 supports Unicode 6.2
+		if (Tables8 == null) {
+			initializeTable18();
+		}
+		switch((codePoint & 0x1F0000) >> 16) {
+			case 0 :
+				return isBitSet(Tables8[PART_INDEX][0], codePoint & 0xFFFF);
+			case 1 :
+				return isBitSet(Tables8[PART_INDEX][1], codePoint & 0xFFFF);
+			case 2 :
+				return isBitSet(Tables8[PART_INDEX][2], codePoint & 0xFFFF);
+			case 14 :
+				return isBitSet(Tables8[PART_INDEX][3], codePoint & 0xFFFF);
+		}
 	}
 	return false;
 }
@@ -406,7 +335,7 @@
 			case 2 :
 				return isBitSet(Tables[START_INDEX][2], codePoint & 0xFFFF);
 		}
-	} else {
+	} else if (complianceLevel <= ClassFileConstants.JDK1_7) {
 		// java 7 supports Unicode 6
 		if (Tables7 == null) {
 			initializeTable17();
@@ -419,6 +348,19 @@
 			case 2 :
 				return isBitSet(Tables7[START_INDEX][2], codePoint & 0xFFFF);
 		}
+	} else {
+		// java 7 supports Unicode 6
+		if (Tables8 == null) {
+			initializeTable18();
+		}
+		switch((codePoint & 0x1F0000) >> 16) {
+			case 0 :
+				return isBitSet(Tables8[START_INDEX][0], codePoint & 0xFFFF);
+			case 1 :
+				return isBitSet(Tables8[START_INDEX][1], codePoint & 0xFFFF);
+			case 2 :
+				return isBitSet(Tables8[START_INDEX][2], codePoint & 0xFFFF);
+		}
 	}
 	return false;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter.java
index f01d3e6..9edd632 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -42,7 +42,6 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeParameter;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.*;
-
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 import org.aspectj.org.eclipse.jdt.internal.core.*;
@@ -116,11 +115,17 @@
 		org.aspectj.org.eclipse.jdt.core.ICompilationUnit cuHandle = topLevelTypeInfo.getHandle().getCompilationUnit();
 		this.cu = (ICompilationUnit) cuHandle;
 
-		if (this.has1_5Compliance && ((CompilationUnitElementInfo) ((JavaElement) this.cu).getElementInfo()).annotationNumber > 10) { // experimental value
+		final CompilationUnitElementInfo compilationUnitElementInfo = (CompilationUnitElementInfo) ((JavaElement) this.cu).getElementInfo();
+		if (this.has1_5Compliance && 
+				(compilationUnitElementInfo.annotationNumber >= CompilationUnitElementInfo.ANNOTATION_THRESHOLD_FOR_DIET_PARSE ||
+				(compilationUnitElementInfo.hasFunctionalTypes && (this.flags & LOCAL_TYPE) != 0))) {
 			// If more than 10 annotations, diet parse as this is faster, but not if
-			// the client wants local and anonymous types to be converted (https://bugs.eclipse.org/bugs/show_bug.cgi?id=254738) 
+			// the client wants local and anonymous types to be converted (https://bugs.eclipse.org/bugs/show_bug.cgi?id=254738)
+			// Also see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=405843
 			if ((this.flags & LOCAL_TYPE) == 0) {
 				return new Parser(this.problemReporter, true).dietParse(this.cu, compilationResult);
+			} else {
+				return new Parser(this.problemReporter, true).parse(this.cu, compilationResult);
 			}
 		}
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TerminalTokens.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TerminalTokens.java
index 6ef0b47..2a090dc 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TerminalTokens.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TerminalTokens.java
@@ -4,16 +4,8 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -43,130 +35,130 @@
 		TokenNameCOMMENT_BLOCK = 1002,
 		TokenNameCOMMENT_JAVADOC = 1003;
 
-	int TokenNameIdentifier = 18,
-		      TokenNameabstract = 47,
-		      TokenNameassert = 78,
-		      TokenNameboolean = 112,
-		      TokenNamebreak = 79,
-		      TokenNamebyte = 113,
-		      TokenNamecase = 91,
-		      TokenNamecatch = 92,
-		      TokenNamechar = 114,
-		      TokenNameclass = 71,
-		      TokenNamecontinue = 80,
-		      TokenNameconst = 123,
-		      TokenNamedefault = 110,
-		      TokenNamedo = 81,
-		      TokenNamedouble = 115,
-		      TokenNameelse = 95,
-		      TokenNameenum = 82,
-		      TokenNameextends = 90,
-		      TokenNamefalse = 56,
-		      TokenNamefinal = 48,
-		      TokenNamefinally = 94,
-		      TokenNamefloat = 116,
-		      TokenNamefor = 83,
-		      TokenNamegoto = 124,
-		      TokenNameif = 84,
-		      TokenNameimplements = 111,
-		      TokenNameimport = 93,
-		      TokenNameinstanceof = 15,
-		      TokenNameint = 117,
-		      TokenNameinterface = 76,
-		      TokenNamelong = 118,
-		      TokenNamenative = 49,
-		      TokenNamenew = 42,
-		      TokenNamenull = 57,
-		      TokenNamepackage = 89,
-		      TokenNameprivate = 50,
-		      TokenNameprotected = 51,
-		      TokenNamepublic = 52,
-		      TokenNamereturn = 85,
-		      TokenNameshort = 119,
-		      TokenNamestatic = 45,
-		      TokenNamestrictfp = 53,
-		      TokenNamesuper = 43,
-		      TokenNameswitch = 86,
-		      TokenNamesynchronized = 46,
-		      TokenNamethis = 44,
-		      TokenNamethrow = 87,
-		      TokenNamethrows = 97,
-		      TokenNametransient = 54,
-		      TokenNametrue = 58,
-		      TokenNametry = 88,
-		      TokenNamevoid = 120,
-		      TokenNamevolatile = 55,
-		      TokenNamewhile = 77,
-		      TokenNameaspect = 26,
-		      TokenNamepointcut = 30,
-		      TokenNamearound = 34,
-		      TokenNamebefore = 31,
-		      TokenNameafter = 32,
-		      TokenNamedeclare = 33,
-		      TokenNameprivileged = 28,
-		      TokenNameIntegerLiteral = 59,
-		      TokenNameLongLiteral = 60,
-		      TokenNameFloatingPointLiteral = 61,
-		      TokenNameDoubleLiteral = 62,
-		      TokenNameCharacterLiteral = 63,
-		      TokenNameStringLiteral = 64,
-		      TokenNamePLUS_PLUS = 3,
-		      TokenNameMINUS_MINUS = 4,
-		      TokenNameEQUAL_EQUAL = 23,
-		      TokenNameLESS_EQUAL = 16,
-		      TokenNameGREATER_EQUAL = 17,
-		      TokenNameNOT_EQUAL = 20,
-		      TokenNameLEFT_SHIFT = 21,
-		      TokenNameRIGHT_SHIFT = 12,
-		      TokenNameUNSIGNED_RIGHT_SHIFT = 14,
-		      TokenNamePLUS_EQUAL = 98,
-		      TokenNameMINUS_EQUAL = 99,
-		      TokenNameMULTIPLY_EQUAL = 100,
-		      TokenNameDIVIDE_EQUAL = 101,
-		      TokenNameAND_EQUAL = 102,
-		      TokenNameOR_EQUAL = 103,
-		      TokenNameXOR_EQUAL = 104,
-		      TokenNameREMAINDER_EQUAL = 105,
-		      TokenNameLEFT_SHIFT_EQUAL = 106,
-		      TokenNameRIGHT_SHIFT_EQUAL = 107,
-		      TokenNameUNSIGNED_RIGHT_SHIFT_EQUAL = 108,
-		      TokenNameOR_OR = 38,
-		      TokenNameAND_AND = 37,
-		      TokenNamePLUS = 2,
-		      TokenNameMINUS = 5,
-		      TokenNameNOT = 69,
-		      TokenNameREMAINDER = 10,
-		      TokenNameXOR = 27,
-		      TokenNameAND = 22,
-		      TokenNameMULTIPLY = 7,
-		      TokenNameOR = 36,
-		      TokenNameTWIDDLE = 72,
-		      TokenNameDIVIDE = 11,
-		      TokenNameGREATER = 13,
-		      TokenNameLESS = 6,
-		      TokenNameLPAREN = 19,
-		      TokenNameRPAREN = 25,
-		      TokenNameLBRACE = 66,
-		      TokenNameRBRACE = 40,
-		      TokenNameLBRACKET = 8,
-		      TokenNameRBRACKET = 68,
-		      TokenNameSEMICOLON = 29,
-		      TokenNameQUESTION = 35,
-		      TokenNameCOLON = 65,
-		      TokenNameCOMMA = 39,
-		      TokenNameDOT = 1,
-		      TokenNameEQUAL = 73,
-		      TokenNameAT = 41,
-		      TokenNameELLIPSIS = 109,
-		      TokenNameARROW = 121,
-		      TokenNameCOLON_COLON = 9,
-		      TokenNameBeginLambda = 67,
-		      TokenNameBeginIntersectionCast = 74,
-		      TokenNameBeginTypeArguments = 96,
-		      TokenNameElidedSemicolonAndRightBrace = 75,
-		      TokenNameAT308 = 24,
-		      TokenNameAT308DOTDOTDOT = 122,
-		      TokenNameEOF = 70,
-		      TokenNameERROR = 125;
-
+	public final static int
+    TokenNameIdentifier = 18,
+    TokenNameabstract = 47,
+    TokenNameassert = 78,
+    TokenNameboolean = 112,
+    TokenNamebreak = 79,
+    TokenNamebyte = 113,
+    TokenNamecase = 91,
+    TokenNamecatch = 92,
+    TokenNamechar = 114,
+    TokenNameclass = 71,
+    TokenNamecontinue = 80,
+    TokenNameconst = 123,
+    TokenNamedefault = 97,
+    TokenNamedo = 81,
+    TokenNamedouble = 115,
+    TokenNameelse = 95,
+    TokenNameenum = 88,
+    TokenNameextends = 90,
+    TokenNamefalse = 56,
+    TokenNamefinal = 48,
+    TokenNamefinally = 94,
+    TokenNamefloat = 116,
+    TokenNamefor = 82,
+    TokenNamegoto = 124,
+    TokenNameif = 83,
+    TokenNameimplements = 111,
+    TokenNameimport = 93,
+    TokenNameinstanceof = 15,
+    TokenNameint = 117,
+    TokenNameinterface = 76,
+    TokenNamelong = 118,
+    TokenNamenative = 49,
+    TokenNamenew = 42,
+    TokenNamenull = 57,
+    TokenNamepackage = 89,
+    TokenNameprivate = 50,
+    TokenNameprotected = 51,
+    TokenNamepublic = 52,
+    TokenNamereturn = 84,
+    TokenNameshort = 119,
+    TokenNamestatic = 45,
+    TokenNamestrictfp = 53,
+    TokenNamesuper = 43,
+    TokenNameswitch = 85,
+    TokenNamesynchronized = 46,
+    TokenNamethis = 44,
+    TokenNamethrow = 86,
+    TokenNamethrows = 98,
+    TokenNametransient = 54,
+    TokenNametrue = 58,
+    TokenNametry = 87,
+    TokenNamevoid = 120,
+    TokenNamevolatile = 55,
+    TokenNamewhile = 77,
+    TokenNameaspect = 26,
+    TokenNamepointcut = 30,
+    TokenNamearound = 34,
+    TokenNamebefore = 31,
+    TokenNameafter = 32,
+    TokenNamedeclare = 33,
+    TokenNameprivileged = 29,
+    TokenNameIntegerLiteral = 59,
+    TokenNameLongLiteral = 60,
+    TokenNameFloatingPointLiteral = 61,
+    TokenNameDoubleLiteral = 62,
+    TokenNameCharacterLiteral = 63,
+    TokenNameStringLiteral = 64,
+    TokenNamePLUS_PLUS = 3,
+    TokenNameMINUS_MINUS = 4,
+    TokenNameEQUAL_EQUAL = 23,
+    TokenNameLESS_EQUAL = 16,
+    TokenNameGREATER_EQUAL = 17,
+    TokenNameNOT_EQUAL = 20,
+    TokenNameLEFT_SHIFT = 21,
+    TokenNameRIGHT_SHIFT = 12,
+    TokenNameUNSIGNED_RIGHT_SHIFT = 14,
+    TokenNamePLUS_EQUAL = 99,
+    TokenNameMINUS_EQUAL = 100,
+    TokenNameMULTIPLY_EQUAL = 101,
+    TokenNameDIVIDE_EQUAL = 102,
+    TokenNameAND_EQUAL = 103,
+    TokenNameOR_EQUAL = 104,
+    TokenNameXOR_EQUAL = 105,
+    TokenNameREMAINDER_EQUAL = 106,
+    TokenNameLEFT_SHIFT_EQUAL = 107,
+    TokenNameRIGHT_SHIFT_EQUAL = 108,
+    TokenNameUNSIGNED_RIGHT_SHIFT_EQUAL = 109,
+    TokenNameOR_OR = 38,
+    TokenNameAND_AND = 37,
+    TokenNamePLUS = 2,
+    TokenNameMINUS = 5,
+    TokenNameNOT = 69,
+    TokenNameREMAINDER = 10,
+    TokenNameXOR = 27,
+    TokenNameAND = 22,
+    TokenNameMULTIPLY = 7,
+    TokenNameOR = 36,
+    TokenNameTWIDDLE = 72,
+    TokenNameDIVIDE = 11,
+    TokenNameGREATER = 13,
+    TokenNameLESS = 6,
+    TokenNameLPAREN = 19,
+    TokenNameRPAREN = 25,
+    TokenNameLBRACE = 65,
+    TokenNameRBRACE = 40,
+    TokenNameLBRACKET = 8,
+    TokenNameRBRACKET = 68,
+    TokenNameSEMICOLON = 28,
+    TokenNameQUESTION = 35,
+    TokenNameCOLON = 66,
+    TokenNameCOMMA = 39,
+    TokenNameDOT = 1,
+    TokenNameEQUAL = 73,
+    TokenNameAT = 41,
+    TokenNameELLIPSIS = 110,
+    TokenNameARROW = 121,
+    TokenNameCOLON_COLON = 9,
+    TokenNameBeginLambda = 67,
+    TokenNameBeginIntersectionCast = 74,
+    TokenNameBeginTypeArguments = 96,
+    TokenNameElidedSemicolonAndRightBrace = 75,
+    TokenNameAT308 = 24,
+    TokenNameAT308DOTDOTDOT = 122,
+    TokenNameEOF = 70,
+    TokenNameERROR = 125;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass.java
index b17b6fe..b7b2b5b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTParserClass.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Palo Alto Research Center, Incorporated - AspectJ adaptation
@@ -27,6 +23,8 @@
  *									bug 393192 - Incomplete type hierarchy with > 10 annotations
  *        Andy Clement - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409250 - [1.8][compiler] Various loose ends in 308 code generation
+ *                          Bug 415821 - [1.8][compiler] CLASS_EXTENDS target type annotation missing for anonymous classes
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.parser;
 
@@ -164,7 +162,8 @@
  * to be the static dependencies on ParserBasicInformation and ITerminalSymbols.
  * Renamed from Parser to TheOriginalJDTParserClass
  */
-public class TheOriginalJDTParserClass implements ConflictedParser, ParserBasicInformation, TerminalTokens, OperatorIds, TypeIds {
+@SuppressWarnings({"rawtypes", "unchecked"})
+public class TheOriginalJDTParserClass extends CommitRollbackParser implements ConflictedParser, OperatorIds, TypeIds {
 	
 	protected static final int THIS_CALL = ExplicitConstructorCall.This;
 	protected static final int SUPER_CALL = ExplicitConstructorCall.Super;
@@ -234,6 +233,12 @@
 
 	private static final String UNEXPECTED_EOF = "Unexpected End Of File" ; //$NON-NLS-1$
 	public static boolean VERBOSE_RECOVERY = false;
+	
+	private static enum LocalTypeKind {
+		LOCAL,
+		METHOD_REFERENCE,
+		LAMBDA,
+	}
 
 	static {
 		try{
@@ -906,7 +911,7 @@
 	public CompilationUnitDeclaration compilationUnit; /*the result from parse()*/
 
 	protected RecoveredElement currentElement;
-	public int currentToken;
+	
 	protected boolean diet = false; //tells the scanner to jump over some parts of the code/expressions like method bodies
 	protected int dietInt = 0; // if > 0 force the none-diet-parsing mode (even if diet if requested) [field parsing with anonymous inner classes...]
 	protected int endPosition; //accurate only when used ! (the start position is pushed into intStack while the end the current one)
@@ -972,6 +977,7 @@
 	protected int lParenPos,rParenPos; //accurate only when used !
 	protected int modifiers;
 	protected int modifiersSourceStart;
+	protected int colonColonStart = -1;
 	protected int[] nestedMethod; //the ptr is nestedType
 
 	protected int nestedType, dimensions;
@@ -1002,8 +1008,7 @@
 protected int nextTypeStart;
 protected TypeDeclaration pendingRecoveredType;
 public RecoveryScanner recoveryScanner;
-//scanner token
-public Scanner scanner;
+
 protected int[] stack = new int[StackIncrement];
 protected int stateStackTop;
 protected int synchronizedBlockSourceStart;
@@ -1019,17 +1024,19 @@
 // used for recovery
 protected int lastJavadocEnd;
 public org.aspectj.org.eclipse.jdt.internal.compiler.ReadManager readManager;
-private boolean shouldDeferRecovery = false; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=291040
-private int valueLambdaNestDepth = -1;
-private int stateStackLengthStack[] = new int[0];
-private boolean parsingJava8Plus;
+protected int valueLambdaNestDepth = -1;
+protected /*private*/ int stateStackLengthStack[] = new int[0]; // AspectJ Extension: made protected
+protected boolean parsingJava8Plus;
 protected int unstackedAct = ERROR_ACTION;
 private boolean haltOnSyntaxError = false;
+private boolean tolerateDefaultClassMethods = false;
+private boolean processingLambdaParameterList = false;
+private boolean expectTypeAnnotation = false;
 
-protected TheOriginalJDTParserClass () {
+public TheOriginalJDTParserClass () { // AspectJ - new name
 	// Caveat Emptor: For inheritance purposes and then only in very special needs. Only minimal state is initialized !
 }
-public TheOriginalJDTParserClass(ProblemReporter problemReporter, boolean optimizeStringLiterals) {
+public TheOriginalJDTParserClass(ProblemReporter problemReporter, boolean optimizeStringLiterals) { // AspectJ - new name
 
 	this.problemReporter = problemReporter;
 	this.options = problemReporter.options;
@@ -1523,6 +1530,9 @@
 protected void consumeAdditionalBoundList1() {
 	concatGenericsLists();
 }
+protected boolean isIndirectlyInsideLambdaExpression() {
+	return false;
+}
 protected void consumeAllocationHeader() {
 	// ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
 
@@ -1547,7 +1557,8 @@
 		this.lastCheckPoint = anonymousType.bodyStart = this.scanner.currentPosition;
 		this.currentElement = this.currentElement.add(anonymousType, 0);
 		this.lastIgnoredToken = -1;
-		this.currentToken = 0; // opening brace already taken into account
+		if (!isIndirectlyInsideLambdaExpression())
+			this.currentToken = 0; // opening brace already taken into account
 		return;
 	}
 	this.lastCheckPoint = this.scanner.startPosition; // force to restart at this exact position
@@ -1561,7 +1572,7 @@
 	}
 }
 protected void consumeAnnotationName() {
-	if(this.currentElement != null) {
+	if(this.currentElement != null && !this.expectTypeAnnotation) {
 		int start = this.intStack[this.intPtr];
 		int end = (int) (this.identifierPositionStack[this.identifierPtr] & 0x00000000FFFFFFFFL);
 		annotationRecoveryCheckPoint(start, end);
@@ -1571,6 +1582,7 @@
 		}
 	}
 	this.recordStringLiterals = false;
+	this.expectTypeAnnotation = false;
 }
 protected void consumeAnnotationTypeDeclaration() {
 	int length;
@@ -2257,6 +2269,9 @@
 	}
 	pushOnAstStack(block);
 }
+protected void consumeBlockStatement() {
+	// for assist parsers.
+}
 protected void consumeBlockStatements() {
 	// BlockStatements ::= BlockStatements BlockStatement
 	concatNodeLists();
@@ -2299,20 +2314,16 @@
 	//CastExpression ::= '(' Name AdditionalBoundsList ')' UnaryExpressionNotPlusMinus
 	Expression cast;
 	Expression exp;
-	
-	int additionalBoundsLength = this.genericsLengthStack[this.genericsLengthPtr--];
-	TypeReference[] bounds = new TypeReference[additionalBoundsLength + 1];
-	this.genericsPtr -= additionalBoundsLength;
-	System.arraycopy(this.genericsStack, this.genericsPtr + 1, bounds, 1, additionalBoundsLength);
-
-	pushOnGenericsLengthStack(0); // handle type arguments
-	pushOnGenericsIdentifiersLengthStack(this.identifierLengthStack[this.identifierLengthPtr]);
-	bounds[0] = getTypeReference(0);
- 
+	int length;
+	exp = this.expressionStack[this.expressionPtr--];
+	this.expressionLengthPtr --;
+	TypeReference[] bounds = new TypeReference[length = this.expressionLengthStack[this.expressionLengthPtr]];
+	System.arraycopy(this.expressionStack, this.expressionPtr -= (length - 1), bounds, 0, length);
 	this.expressionStack[this.expressionPtr] =
 		cast = new CastExpression(
-			exp=this.expressionStack[this.expressionPtr] ,
+			exp,
 			createIntersectionCastTypeReference(bounds));
+	this.expressionLengthStack[this.expressionLengthPtr] = 1;
 	updateSourcePosition(cast);
 	cast.sourceEnd=exp.sourceEnd;
 }
@@ -2447,7 +2458,7 @@
 	int extendedDimensions = this.intStack[this.intPtr--]; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=348369
 	TypeReference type = (TypeReference) this.astStack[this.astPtr--];
 	if (extendedDimensions > 0) {
-		type = type.copyDims(type.dimensions() + extendedDimensions);
+		type = augmentTypeWithAdditionalDimensions(type, extendedDimensions, null, false);
 		type.sourceEnd = this.endPosition;
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=391092
 		if (type instanceof UnionTypeReference) {
@@ -2566,7 +2577,6 @@
 	// ClassBodyopt ::= $empty
 	pushOnAstStack(null);
 	this.endPosition = this.rParenPos;
-	this.shouldDeferRecovery = false;
 }
 protected void consumeClassDeclaration() {
 	// ClassDeclaration ::= ClassHeader ClassBody
@@ -2734,6 +2744,7 @@
 protected void consumeClassInstanceCreationExpression() {
 	// ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
 	classInstanceCreation(false);
+	consumeInvocationExpression();
 }
 protected void consumeClassInstanceCreationExpressionName() {
 	// ClassInstanceCreationExpressionName ::= Name '.'
@@ -2754,6 +2765,7 @@
 		this.expressionStack[this.expressionPtr] = qae;
 	}
 	qae.sourceStart = qae.enclosingInstance.sourceStart;
+	consumeInvocationExpression();
 }
 protected void consumeClassInstanceCreationExpressionQualifiedWithTypeArguments() {
 	// ClassInstanceCreationExpression ::= Primary '.' 'new' TypeArguments SimpleName '(' ArgumentListopt ')' ClassBodyopt
@@ -2808,7 +2820,6 @@
 			allocationExpression.sourceStart = this.intStack[this.intPtr--];
 			checkForDiamond(allocationExpression.type);
 		}
-		rejectIllegalLeadingTypeAnnotations(allocationExpression.type);
 	}
 	
 	QualifiedAllocationExpression qae =
@@ -2821,6 +2832,7 @@
 		this.expressionStack[this.expressionPtr] = qae;
 	}
 	qae.sourceStart = qae.enclosingInstance.sourceStart;
+	consumeInvocationExpression();
 }
 protected void consumeClassInstanceCreationExpressionWithTypeArguments() {
 	// ClassInstanceCreationExpression ::= 'new' TypeArguments ClassType '(' ArgumentListopt ')' ClassBodyopt
@@ -2875,8 +2887,8 @@
 			allocationExpression.sourceStart = this.intStack[this.intPtr--];
 			checkForDiamond(allocationExpression.type);
 		}
-		rejectIllegalLeadingTypeAnnotations(allocationExpression.type);
 	}
+	consumeInvocationExpression();
 }
 protected void consumeClassOrInterface() {
 	this.genericsIdentifiersLengthStack[this.genericsIdentifiersLengthPtr] += this.identifierLengthStack[this.identifierLengthPtr];
@@ -3388,6 +3400,7 @@
 	localDeclaration.bits |= ASTNode.IsForeachElementVariable;
 
 	int extraDims = this.intStack[this.intPtr--];
+	Annotation [][] annotationsOnExtendedDimensions = extraDims == 0 ? null : getAnnotationsOnDimensions(extraDims);
 	this.identifierPtr--;
 	this.identifierLengthPtr--;
 	// remove fake modifiers/modifiers start
@@ -3400,7 +3413,7 @@
 		this.intPtr-=2;
 	}
 
-	type = getTypeReference(this.intStack[this.intPtr--] + extraDims); // type dimension
+	type = getTypeReference(this.intStack[this.intPtr--]); // type dimension
 
 	// consume annotations
 	int length;
@@ -3413,6 +3426,9 @@
 			length);
 		localDeclaration.bits |= ASTNode.HasTypeAnnotations;
 	}
+	if (extraDims != 0) {
+		type = augmentTypeWithAdditionalDimensions(type, extraDims, annotationsOnExtendedDimensions, false);
+	}
 	if (hasModifiers) {
 		localDeclaration.declarationSourceStart = declarationSourceStart;
 		localDeclaration.modifiers = modifiersValue;
@@ -3431,13 +3447,13 @@
 	iteratorForStatement.sourceEnd = localDeclaration.declarationSourceEnd;
 }
 protected void consumeEnterAnonymousClassBody(boolean qualified) {
-	this.shouldDeferRecovery = false;
 	// EnterAnonymousClassBody ::= $empty
 	TypeReference typeReference = getTypeReference(0);
 
 	TypeDeclaration anonymousType = new TypeDeclaration(this.compilationUnit.compilationResult);
 	anonymousType.name = CharOperation.NO_CHAR;
 	anonymousType.bits |= (ASTNode.IsAnonymousType|ASTNode.IsLocalType);
+	anonymousType.bits |= (typeReference.bits & ASTNode.HasTypeAnnotations);
 	QualifiedAllocationExpression alloc = new QualifiedAllocationExpression(anonymousType);
 	markEnclosingMemberWithLocalType();
 	pushOnAstStack(anonymousType);
@@ -3478,7 +3494,8 @@
 		this.lastCheckPoint = anonymousType.bodyStart;
 		this.currentElement = this.currentElement.add(anonymousType, 0);
 		if (!(this.currentElement instanceof RecoveredAnnotation)) {
-			this.currentToken = 0; // opening brace already taken into account
+			if (!isIndirectlyInsideLambdaExpression())
+				this.currentToken = 0; // opening brace already taken into account
 		} else {
 			this.ignoreNextOpeningBrace = true;
 			this.currentElement.bracketBalance++;
@@ -3510,9 +3527,9 @@
 
 	char[] identifierName = this.identifierStack[this.identifierPtr];
 	long namePosition = this.identifierPositionStack[this.identifierPtr];
-	int extendedDimension = this.intStack[this.intPtr--];
+	int extendedDimensions = this.intStack[this.intPtr--];
 	// pop any annotations on extended dimensions now, so they don't pollute the base dimensions.
-	Annotation [][] annotationsOnExtendedDimensions = extendedDimension == 0 ? null : getAnnotationsOnDimensions(extendedDimension);
+	Annotation [][] annotationsOnExtendedDimensions = extendedDimensions == 0 ? null : getAnnotationsOnDimensions(extendedDimensions);
 	AbstractVariableDeclaration declaration;
 	// create the ast node
 	boolean isLocalDeclaration = this.nestedMethod[this.nestedType] != 0;
@@ -3530,7 +3547,6 @@
 	this.identifierLengthPtr--;
 	TypeReference type;
 	int variableIndex = this.variablesCounter[this.nestedType];
-	int typeDim = 0;
 	if (variableIndex == 0) {
 		// first variable of the declaration (FieldDeclaration or LocalDeclaration)
 		if (isLocalDeclaration) {
@@ -3545,16 +3561,15 @@
 					declaration.annotations = new Annotation[length],
 					0,
 					length);
-				declaration.bits |= ASTNode.HasTypeAnnotations;
 			}
-			type = getTypeReference(typeDim = this.intStack[this.intPtr--]); // type dimension
+			type = getTypeReference(this.intStack[this.intPtr--]); // type dimension
 			if (declaration.declarationSourceStart == -1) {
 				// this is true if there is no modifiers for the local variable declaration
 				declaration.declarationSourceStart = type.sourceStart;
 			}
 			pushOnAstStack(type);
 		} else {
-			type = getTypeReference(typeDim = this.intStack[this.intPtr--]); // type dimension
+			type = getTypeReference(this.intStack[this.intPtr--]); // type dimension
 			pushOnAstStack(type);
 			declaration.declarationSourceStart = this.intStack[this.intPtr--];
 			declaration.modifiers = this.intStack[this.intPtr--];
@@ -3567,7 +3582,6 @@
 					declaration.annotations = new Annotation[length],
 					0,
 					length);
-				declaration.bits |= ASTNode.HasTypeAnnotations;
 			}
 			// Store javadoc only on first declaration as it is the same for all ones
 			FieldDeclaration fieldDeclaration = (FieldDeclaration) declaration;
@@ -3576,7 +3590,6 @@
 		this.javadoc = null;
 	} else {
 		type = (TypeReference) this.astStack[this.astPtr - variableIndex];
-		typeDim = type.dimensions();
 		AbstractVariableDeclaration previousVariable =
 			(AbstractVariableDeclaration) this.astStack[this.astPtr];
 		declaration.declarationSourceStart = previousVariable.declarationSourceStart;
@@ -3585,23 +3598,12 @@
 		if (annotations != null) {
 			final int annotationsLength = annotations.length;
 			System.arraycopy(annotations, 0, declaration.annotations = new Annotation[annotationsLength], 0, annotationsLength);
-			declaration.bits |= ASTNode.HasTypeAnnotations;
 		}
 	}
 
-	if (extendedDimension == 0) {
-		declaration.type = type;
-		declaration.bits |= (type.bits & ASTNode.HasTypeAnnotations);
-	} else {
-		int dimension = typeDim + extendedDimension;
-		Annotation [][] annotationsOnAllDimensions = null;
-		Annotation[][] annotationsOnDimensions = type.getAnnotationsOnDimensions();
-		if (annotationsOnDimensions != null || annotationsOnExtendedDimensions != null) {
-			annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(typeDim, annotationsOnDimensions, extendedDimension, annotationsOnExtendedDimensions); 
-			declaration.bits |= (type.bits & ASTNode.HasTypeAnnotations);
-		}
-		declaration.type = copyDims(type, dimension, annotationsOnAllDimensions);
-	}
+	declaration.type = extendedDimensions == 0 ? type : augmentTypeWithAdditionalDimensions(type, extendedDimensions, annotationsOnExtendedDimensions, false);
+	declaration.bits |= (type.bits & ASTNode.HasTypeAnnotations);
+	
 	this.variablesCounter[this.nestedType]++;
 	pushOnAstStack(declaration);
 	// recovery
@@ -3627,27 +3629,6 @@
 		this.lastIgnoredToken = -1;
 	}
 }
-protected Annotation[][] getMergedAnnotationsOnDimensions(int dims, Annotation[][] annotationsOnDimensions,
-		int extendedDims, Annotation[][] annotationsOnExtendedDimensions) {
-
-	if (annotationsOnDimensions == null && annotationsOnExtendedDimensions == null)
-		return null;
-
-	Annotation [][] mergedAnnotations = new Annotation[dims + extendedDims][];
-	
-	if (annotationsOnDimensions != null) {
-		for (int i = 0; i < dims; i++) {
-			mergedAnnotations[i] = annotationsOnDimensions[i];
-		} 
-	}
-	if (annotationsOnExtendedDimensions != null) {
-		for (int i = dims, j = 0; i < dims + extendedDims; i++, j++) {
-			mergedAnnotations[i] = annotationsOnExtendedDimensions[j];
-		}
-	}
-
-	return mergedAnnotations;
-}
 protected void consumeEnumBodyNoConstants() {
 	// nothing to do
 	// The 0 on the astLengthStack has been pushed by EnumBodyDeclarationsopt
@@ -3715,7 +3696,8 @@
 	  	this.currentElement = this.currentElement.add(anonymousType, 0);
       	this.lastCheckPoint = anonymousType.bodyStart;
         this.lastIgnoredToken = -1;
-        this.currentToken = 0; // opening brace already taken into account
+        if (!isIndirectlyInsideLambdaExpression())
+        	this.currentToken = 0; // opening brace already taken into account
 	  } else {
 	  	  if(this.currentToken == TokenNameSEMICOLON) {
 		  	RecoveredType currentType = currentRecoveryType();
@@ -4297,19 +4279,13 @@
 	}
 	int firstDimensions = this.intStack[this.intPtr--];
 	TypeReference type = getTypeReference(firstDimensions);
-	final int typeDimensions = firstDimensions + extendedDimensions + (isVarArgs ? 1 : 0);
-
-	if (typeDimensions != firstDimensions) {
-		// jsr308 type annotations management
-		Annotation [][] annotationsOnFirstDimensions = firstDimensions == 0 ? null : type.getAnnotationsOnDimensions();
-		Annotation [][] annotationsOnAllDimensions = annotationsOnFirstDimensions;
-		if (annotationsOnExtendedDimensions != null) {
-			annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(firstDimensions, annotationsOnFirstDimensions, extendedDimensions, annotationsOnExtendedDimensions);
+	if (isVarArgs || extendedDimensions != 0) {
+		if (isVarArgs) {
+			type = augmentTypeWithAdditionalDimensions(type, 1, varArgsAnnotations != null ? new Annotation[][] { varArgsAnnotations } : null, true);	
+		} 
+		if (extendedDimensions != 0) {
+			type = augmentTypeWithAdditionalDimensions(type, extendedDimensions, annotationsOnExtendedDimensions, false);
 		}
-		if (varArgsAnnotations != null) {
-			annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(firstDimensions + extendedDimensions, annotationsOnAllDimensions, 1, new Annotation[][]{varArgsAnnotations});
-		}
-		type = copyDims(type, typeDimensions, annotationsOnAllDimensions);
 		type.sourceEnd = type.isParameterizedTypeReference() ? this.endStatementPosition : this.endPosition;
 	}
 	if (isVarArgs) {
@@ -4449,6 +4425,20 @@
 }
 protected void consumeInsideCastExpressionLL1WithBounds() {
 	// InsideCastExpressionLL1WithBounds ::= $empty
+	int additionalBoundsLength = this.genericsLengthStack[this.genericsLengthPtr--];
+	TypeReference[] bounds = new TypeReference[additionalBoundsLength + 1];
+	this.genericsPtr -= additionalBoundsLength;
+	System.arraycopy(this.genericsStack, this.genericsPtr + 1, bounds, 1, additionalBoundsLength);
+
+	pushOnGenericsLengthStack(0); // handle type arguments
+	pushOnGenericsIdentifiersLengthStack(this.identifierLengthStack[this.identifierLengthPtr]);
+	bounds[0] = getTypeReference(0);
+ 
+	for (int i = 0; i <= additionalBoundsLength; i++) {
+		pushOnExpressionStack(bounds[i]);
+		if (i > 0)
+			this.expressionLengthStack[--this.expressionLengthPtr]++;
+	}
 }
 protected void consumeInsideCastExpressionWithQualifiedGenerics() {
 	// InsideCastExpressionWithQualifiedGenerics ::= $empty
@@ -4763,21 +4753,35 @@
 	this.intStack :
 	*/
 
+	int explicitDeclarations = 0;
+	Statement[] statements = null;
 	if (!hasSemicolonBody) {
 		// pop the position of the {  (body of the method) pushed in block decl
 		this.intPtr--;
-		// retrieve end position of method declarator
-
+		this.intPtr--;
+		
+		explicitDeclarations = this.realBlockStack[this.realBlockPtr--];
+		
 		//statements
-		this.realBlockPtr--;
 		int length;
 		if ((length = this.astLengthStack[this.astLengthPtr--]) != 0) {
-			this.astPtr -= length;
+			if (this.options.ignoreMethodBodies) {
+				this.astPtr -= length;
+			} else {
+				System.arraycopy(
+					this.astStack,
+					(this.astPtr -= length) + 1,
+					statements = new Statement[length],
+					0,
+					length);
+			}
 		}
 	}
 
 	//watch for } that could be given as a unicode ! ( u007D is '}' )
 	MethodDeclaration md = (MethodDeclaration) this.astStack[this.astPtr];
+	md.statements = statements;
+	md.explicitDeclarations = explicitDeclarations;
 	md.bodyEnd = this.endPosition;
 	md.declarationSourceEnd = flushCommentsDefinedPriorTo(this.endStatementPosition);
 	
@@ -4911,7 +4915,7 @@
 	// MethodBody ::= NestedMethod '{' BlockStatementsopt '}'
 	this.nestedMethod[this.nestedType] --;
 }
-protected void consumeMethodDeclaration(boolean isNotAbstract) {
+protected void consumeMethodDeclaration(boolean isNotAbstract, boolean isDefaultMethod) {
 	// MethodDeclaration ::= MethodHeader MethodBody
 	// AbstractMethodDeclaration ::= MethodHeader ';'
 
@@ -4967,6 +4971,9 @@
 	// a trailing comment behind the end of the method
 	md.bodyEnd = this.endPosition;
 	md.declarationSourceEnd = flushCommentsDefinedPriorTo(this.endStatementPosition);
+	if (isDefaultMethod && !this.tolerateDefaultClassMethods) {
+		problemReporter().defaultModifierIllegallySpecified(md.bodyStart, this.endPosition);
+	}
 }
 protected void consumeMethodHeader() {
 	// MethodHeader ::= MethodHeaderName MethodHeaderParameters MethodHeaderExtendedDims ThrowsClauseopt
@@ -5032,21 +5039,14 @@
 	// MethodHeaderExtendedDims ::= Dimsopt
 	// now we update the returnType of the method
 	MethodDeclaration md = (MethodDeclaration) this.astStack[this.astPtr];
-	int extendedDims = this.intStack[this.intPtr--];
+	int extendedDimensions = this.intStack[this.intPtr--];
 	if(md.isAnnotationMethod()) {
-		((AnnotationMethodDeclaration)md).extendedDimensions = extendedDims;
+		((AnnotationMethodDeclaration)md).extendedDimensions = extendedDimensions;
 	}
-	if (extendedDims != 0) {
-		TypeReference returnType = md.returnType;
+	if (extendedDimensions != 0) {
 		md.sourceEnd = this.endPosition;
-		int dims = returnType.dimensions() + extendedDims;
-		Annotation [][] annotationsOnDimensions = returnType.getAnnotationsOnDimensions();
-		Annotation [][] annotationsOnExtendedDimensions = getAnnotationsOnDimensions(extendedDims);
-		Annotation [][] annotationsOnAllDimensions = null;
-		if (annotationsOnDimensions != null || annotationsOnExtendedDimensions != null) {
-			annotationsOnAllDimensions = getMergedAnnotationsOnDimensions(returnType.dimensions(), annotationsOnDimensions, extendedDims, annotationsOnExtendedDimensions);
-		}
-		md.returnType = copyDims(returnType, dims, annotationsOnAllDimensions);
+		md.returnType = augmentTypeWithAdditionalDimensions(md.returnType, extendedDimensions, getAnnotationsOnDimensions(extendedDimensions), false);
+		md.bits |= (md.returnType.bits & ASTNode.HasTypeAnnotations);
 		if (this.currentToken == TokenNameLBRACE){
 			md.bodyStart = this.endPosition + 1;
 		}
@@ -5077,6 +5077,7 @@
 	this.identifierLengthPtr--;
 	//type
 	md.returnType = getTypeReference(this.intStack[this.intPtr--]);
+	md.bits |= (md.returnType.bits & ASTNode.HasTypeAnnotations);
 	//modifiers
 	md.declarationSourceStart = this.intStack[this.intPtr--];
 	md.modifiers = this.intStack[this.intPtr--];
@@ -5137,7 +5138,8 @@
 	this.identifierLengthPtr--;
 	//type
 	TypeReference returnType = getTypeReference(this.intStack[this.intPtr--]);
-	rejectIllegalLeadingTypeAnnotations(returnType);
+	if (isAnnotationMethod)
+		rejectIllegalLeadingTypeAnnotations(returnType);
 	md.returnType = returnType;
 	md.bits |= (returnType.bits & ASTNode.HasTypeAnnotations);
 
@@ -5287,6 +5289,9 @@
 		this.lastCheckPoint = md.bodyStart;
 	}
 }
+protected void consumeInvocationExpression() {
+	// Trap all forms of invocation expressions. Note: Explicit constructor calls are not expressions. Top of expression stack has the MessageSend or AllocationExpression.
+}
 protected void consumeMethodInvocationName() {
 	// MethodInvocation ::= Name '(' ArgumentListopt ')'
 
@@ -5317,6 +5322,7 @@
 		problemReporter().misplacedTypeAnnotations(typeAnnotations[0], typeAnnotations[typeAnnotations.length - 1]);
 	}
 	pushOnExpressionStack(m);
+	consumeInvocationExpression();
 }
 protected void consumeMethodInvocationNameWithTypeArguments() {
 	// MethodInvocation ::= Name '.' TypeArguments 'Identifier' '(' ArgumentListopt ')'
@@ -5339,6 +5345,7 @@
 	m.receiver = getUnspecifiedReference();
 	m.sourceStart = m.receiver.sourceStart;
 	pushOnExpressionStack(m);
+	consumeInvocationExpression();
 }
 protected void consumeMethodInvocationPrimary() {
 	//optimize the push/pop
@@ -5353,6 +5360,7 @@
 	m.sourceStart = m.receiver.sourceStart;
 	m.sourceEnd = this.rParenPos;
 	this.expressionStack[this.expressionPtr] = m;
+	consumeInvocationExpression();
 }
 protected void consumeMethodInvocationPrimaryWithTypeArguments() {
 	//optimize the push/pop
@@ -5374,6 +5382,7 @@
 	m.sourceStart = m.receiver.sourceStart;
 	m.sourceEnd = this.rParenPos;
 	this.expressionStack[this.expressionPtr] = m;
+	consumeInvocationExpression();
 }
 protected void consumeMethodInvocationSuper() {
 	// MethodInvocation ::= 'super' '.' 'Identifier' '(' ArgumentListopt ')'
@@ -5386,6 +5395,7 @@
 	this.identifierLengthPtr--;
 	m.receiver = new SuperReference(m.sourceStart, this.endPosition);
 	pushOnExpressionStack(m);
+	consumeInvocationExpression();
 }
 protected void consumeMethodInvocationSuperWithTypeArguments() {
 	// MethodInvocation ::= 'super' '.' TypeArguments 'Identifier' '(' ArgumentListopt ')'
@@ -5405,6 +5415,7 @@
 
 	m.receiver = new SuperReference(m.sourceStart, this.endPosition);
 	pushOnExpressionStack(m);
+	consumeInvocationExpression();
 }
 protected void consumeModifiers() {
 	int savedModifiersSourceStart = this.modifiersSourceStart;
@@ -5434,6 +5445,7 @@
 		Annotation annotation = this.typeAnnotationStack[this.typeAnnotationPtr];
 		problemReporter().invalidUsageOfTypeAnnotations(annotation);
 	}
+	this.dimensions = this.intStack[this.intPtr--]; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=417660
 }
 protected void consumeOneMoreTypeAnnotation() {
 	// TypeAnnotations ::= TypeAnnotations TypeAnnotation
@@ -5692,7 +5704,7 @@
 	ClassLiteralAccess cla;
 	pushOnExpressionStack(
 		cla = new ClassLiteralAccess(this.intStack[this.intPtr--], getTypeReference(this.intStack[this.intPtr--])));
-	rejectIllegalTypeAnnotations(cla.type);
+	rejectIllegalTypeAnnotations(cla.type); // javac correctly rejects annotations on dimensions here.
 }
 protected void consumePrimaryNoNewArrayName() {
 	// PrimaryNoNewArray ::= Name '.' 'class'
@@ -5717,6 +5729,9 @@
 	}
 }
 private void rejectIllegalTypeAnnotations(TypeReference typeReference) {
+	rejectIllegalTypeAnnotations(typeReference, false);
+}
+private void rejectIllegalTypeAnnotations(TypeReference typeReference, boolean tolerateAnnotationsOnDimensions) {
 	// Reject misplaced annotations on type reference; Used when grammar is permissive enough to allow them in the first place.
 	Annotation [][]  annotations = typeReference.annotations;
 	Annotation[] misplacedAnnotations;
@@ -5726,16 +5741,24 @@
 			problemReporter().misplacedTypeAnnotations(misplacedAnnotations[0], misplacedAnnotations[misplacedAnnotations.length - 1]);
 		}
 	}
-	annotations = typeReference.getAnnotationsOnDimensions();
+	annotations = typeReference.getAnnotationsOnDimensions(true);
+	boolean tolerated = false;
 	for (int i = 0, length = annotations == null ? 0 : annotations.length; i < length; i++) {
 		misplacedAnnotations = annotations[i];
 		if (misplacedAnnotations != null) {
-			problemReporter().misplacedTypeAnnotations(misplacedAnnotations[0], misplacedAnnotations[misplacedAnnotations.length - 1]);
+			if (tolerateAnnotationsOnDimensions) {
+				problemReporter().toleratedMisplacedTypeAnnotations(misplacedAnnotations[0], misplacedAnnotations[misplacedAnnotations.length - 1]);
+				tolerated = true;
+			}
+			else 
+				problemReporter().misplacedTypeAnnotations(misplacedAnnotations[0], misplacedAnnotations[misplacedAnnotations.length - 1]);
 		}
 	}
-	typeReference.annotations = null;
-	typeReference.setAnnotationsOnDimensions(null);
-	typeReference.bits &= ~ASTNode.HasTypeAnnotations;
+	if (!tolerated) {
+		typeReference.annotations = null;
+		typeReference.setAnnotationsOnDimensions(null);
+		typeReference.bits &= ~ASTNode.HasTypeAnnotations;
+	}
 }
 protected void consumePrimaryNoNewArrayNameSuper() {
 	// PrimaryNoNewArray ::= Name '.' 'super'
@@ -5771,7 +5794,7 @@
 	ClassLiteralAccess cla;
 	pushOnExpressionStack(
 		cla = new ClassLiteralAccess(this.intStack[this.intPtr--], getTypeReference(this.intStack[this.intPtr--])));
-	rejectIllegalTypeAnnotations(cla.type);
+	rejectIllegalTypeAnnotations(cla.type, true /* tolerate annotations on dimensions for bug compatibility for now */);
 }
 protected void consumePrimaryNoNewArrayPrimitiveType() {
 	// PrimaryNoNewArray ::= PrimitiveType '.' 'class'
@@ -5983,19 +6006,24 @@
 	pushOnIntStack(0);  // extended dimensions ...
 	pushOnIntStack(0);  // signal explicit this
 }
-protected void consumeLambdaExpression() {
-	
-	// LambdaExpression ::= LambdaParameters '->' LambdaBody
 
-	this.astLengthPtr--; 	// pop length for LambdaBody (always 1)
-	Statement body = (Statement) this.astStack[this.astPtr--];
-	if (body instanceof Block) {
-		this.nestedType--; 	// matching NestedType in "LambdaBody ::= NestedType NestedMethod  '{' BlockStatementsopt '}'"
-		this.intPtr--; 		// position after '{' pushed during consumeNestedMethod()
-		if (this.options.ignoreMethodBodies) {
-			body = new Block(0);
-		}
-	}
+protected boolean isAssistParser() {
+	return false;
+}
+protected void consumeNestedLambda() {
+	// NestedLambda ::= $empty - we get here just after the type+parenthesis elided singleton parameter or just before the '(' of the parameter list. 
+	consumeNestedType();
+	this.nestedMethod[this.nestedType] ++;
+	LambdaExpression lambda = new LambdaExpression(this.compilationUnit.compilationResult, isAssistParser());
+	pushOnAstStack(lambda);
+	this.processingLambdaParameterList = true;	
+}
+
+protected void consumeLambdaHeader() {
+	// LambdaHeader ::= LambdaParameters '->'  Synthetic/fake production with a synthetic non-terminal. Body not seen yet.
+	
+	int arrowPosition = this.scanner.currentPosition - 1;
+	
 	Argument [] arguments = null;
 	int length = this.astLengthStack[this.astLengthPtr--];
 	this.astPtr -= length;
@@ -6009,24 +6037,74 @@
 			length);
 	}
 	for (int i = 0; i < length; i++) {
-		if (arguments[i].isReceiver()) {
-			problemReporter().illegalThis(arguments[i]);
+		final Argument argument = arguments[i];
+		if (argument.isReceiver()) {
+			problemReporter().illegalThis(argument);
 		}
+		if (argument.name.length == 1 && argument.name[0] == '_')
+			problemReporter().illegalUseOfUnderscoreAsAnIdentifier(argument.sourceStart, argument.sourceEnd, true); // true == lambdaParameter
 	}
-	LambdaExpression lexp = new LambdaExpression(this.compilationUnit.compilationResult, arguments, body);
-	this.intPtr--;  // ')' position, discard for now.
+	LambdaExpression lexp = (LambdaExpression) this.astStack[this.astPtr];
+	lexp.setArguments(arguments);
+	lexp.setArrowPosition(arrowPosition);
+	lexp.sourceEnd = this.intStack[this.intPtr--];   // ')' position or identifier position.
 	lexp.sourceStart = this.intStack[this.intPtr--]; // '(' position or identifier position.
-	lexp.sourceEnd = body.sourceEnd;
 	lexp.hasParentheses = (this.scanner.getSource()[lexp.sourceStart] == '(');
+	this.listLength -= arguments == null ? 0 : arguments.length;  // not necessary really.
+	this.processingLambdaParameterList = false;
+	if (this.currentElement != null) {
+		this.lastCheckPoint = arrowPosition + 1; // we don't want the typed formal parameters to be processed by recovery.
+	}
+}
+protected void consumeLambdaExpression() {
+	
+	// LambdaExpression ::= LambdaHeader LambdaBody
+
+	this.nestedType--;
+	
+	this.astLengthPtr--; 	// pop length for LambdaBody (always 1)
+	Statement body = (Statement) this.astStack[this.astPtr--];
+	if (body instanceof Block) {
+		if (this.options.ignoreMethodBodies) {
+			body = new Block(0);
+		}
+		((Block) body).lambdaBody = true; // for consistency's sakes.
+	}
+
+	LambdaExpression lexp = (LambdaExpression) this.astStack[this.astPtr--];
+	this.astLengthPtr--;
+	lexp.setBody(body);
+	lexp.sourceEnd = body.sourceEnd;
+	
 	if (body instanceof Expression) {
 		Expression expression = (Expression) body;
 		expression.statementEnd = body.sourceEnd;
 	}
-	pushOnExpressionStack(lexp);
 	if (!this.parsingJava8Plus) {
 		problemReporter().lambdaExpressionsNotBelow18(lexp);
 	}
-	this.listLength = 0; // reset this.listLength after having read all parameters
+	pushOnExpressionStack(lexp);
+	if (this.currentElement != null) {
+		this.lastCheckPoint = body.sourceEnd + 1;
+	}
+	this.referenceContext.compilationResult().hasFunctionalTypes = true;
+	markEnclosingMemberWithLocalOrFunctionalType(LocalTypeKind.LAMBDA);
+}
+
+protected Argument typeElidedArgument() {
+	this.identifierLengthPtr--;
+	char[] identifierName = this.identifierStack[this.identifierPtr];
+	long namePositions = this.identifierPositionStack[this.identifierPtr--];
+
+	Argument arg =
+		new Argument(
+			identifierName,
+			namePositions,
+			null, // elided type
+			ClassFileConstants.AccDefault,
+			true);
+	arg.declarationSourceStart = (int) (namePositions >>> 32);
+	return arg; 
 }
 
 protected void consumeTypeElidedLambdaParameter(boolean parenthesized) {
@@ -6044,31 +6122,18 @@
 		annotationLength = this.expressionLengthStack[this.expressionLengthPtr--];
 		this.expressionPtr -= annotationLength;
 	}
-	
-	this.identifierLengthPtr--;
-	char[] identifierName = this.identifierStack[this.identifierPtr];
-	long namePositions = this.identifierPositionStack[this.identifierPtr--];
 
-	Argument arg =
-		new Argument(
-			identifierName,
-			namePositions,
-			null, // elided type
-			ClassFileConstants.AccDefault,
-			true);
-	arg.declarationSourceStart = (int) (namePositions >>> 32);
+	Argument arg = typeElidedArgument();
 	if (modifier != ClassFileConstants.AccDefault || annotationLength != 0) {
 		problemReporter().illegalModifiersForElidedType(arg);
 		arg.declarationSourceStart = modifiersStart;
 	} 
-	pushOnAstStack(arg);
 	if (!parenthesized) { // in the absence of '(' and ')', record positions.
 		pushOnIntStack(arg.declarationSourceStart);
 		pushOnIntStack(arg.declarationSourceEnd);
 	}
-	/* if incomplete method header, this.listLength counter will not have been reset,
-		indicating that some arguments are available on the stack */
-	this.listLength++;
+	pushOnAstStack(arg);
+	this.listLength++;  // not relevant really.
 }
 protected void consumeElidedLeftBraceAndReturn() {
 	/* ElidedLeftBraceAndReturn ::= $empty
@@ -6110,12 +6175,17 @@
 	// NonWildTypeArgumentsopt ::= $empty
 	pushOnGenericsLengthStack(0); // signal absence of type arguments.
 }
+
+public ReferenceExpression newReferenceExpression() {
+	return new ReferenceExpression();
+}
+
 protected void consumeReferenceExpressionTypeForm(boolean isPrimitive) { // actually Name or Type form.
 	
 	// ReferenceExpression ::= PrimitiveType Dims '::' NonWildTypeArgumentsopt IdentifierOrNew
 	// ReferenceExpression ::= Name Dimsopt '::' NonWildTypeArgumentsopt IdentifierOrNew
 
-	ReferenceExpression referenceExpression;
+	ReferenceExpression referenceExpression = newReferenceExpression();
 	TypeReference [] typeArguments = null;
 	char [] selector;
 	int sourceEnd;
@@ -6146,20 +6216,16 @@
 			pushOnGenericsLengthStack(0);
 			pushOnGenericsIdentifiersLengthStack(this.identifierLengthStack[this.identifierLengthPtr]);
 		}
-		referenceExpression = new ReferenceExpression(this.compilationUnit.compilationResult, getTypeReference(dimension), typeArguments, selector, sourceEnd);
+		referenceExpression.initialize(this.compilationUnit.compilationResult, getTypeReference(dimension), typeArguments, selector, sourceEnd);
 	} else {
-		referenceExpression = new ReferenceExpression(this.compilationUnit.compilationResult, getUnspecifiedReference(), typeArguments, selector, sourceEnd);
+		referenceExpression.initialize(this.compilationUnit.compilationResult, getUnspecifiedReference(), typeArguments, selector, sourceEnd);
 	}
-	pushOnExpressionStack(referenceExpression);
-
-	if (!this.parsingJava8Plus) {
-		problemReporter().referenceExpressionsNotBelow18(referenceExpression);
-	}
+	consumeReferenceExpression(referenceExpression);
 }
 protected void consumeReferenceExpressionPrimaryForm() {
 	// ReferenceExpression ::= Primary '::' NonWildTypeArgumentsopt Identifier
 
-	ReferenceExpression referenceExpression;
+	ReferenceExpression referenceExpression = newReferenceExpression();
 	TypeReference [] typeArguments = null;
 	char [] selector;
 	int sourceEnd;
@@ -6177,16 +6243,13 @@
 	
 	Expression primary = this.expressionStack[this.expressionPtr--];
 	this.expressionLengthPtr--;
-	referenceExpression = new ReferenceExpression(this.compilationUnit.compilationResult, primary, typeArguments, selector, sourceEnd);
-	pushOnExpressionStack(referenceExpression);
-	if (!this.parsingJava8Plus) {
-		problemReporter().referenceExpressionsNotBelow18(referenceExpression);
-	}
+	referenceExpression.initialize(this.compilationUnit.compilationResult, primary, typeArguments, selector, sourceEnd);
+	consumeReferenceExpression(referenceExpression);
 }
 protected void consumeReferenceExpressionSuperForm() {
 	// ReferenceExpression ::= 'super' '::' NonWildTypeArgumentsopt Identifier
 
-	ReferenceExpression referenceExpression;
+	ReferenceExpression referenceExpression = newReferenceExpression();
 	TypeReference [] typeArguments = null;
 	char [] selector;
 	int sourceEnd;
@@ -6203,11 +6266,16 @@
 	}
 	
 	SuperReference superReference = new SuperReference(this.intStack[this.intPtr--], this.endPosition);
-	referenceExpression = new ReferenceExpression(this.compilationUnit.compilationResult, superReference, typeArguments, selector, sourceEnd);
+	referenceExpression.initialize(this.compilationUnit.compilationResult, superReference, typeArguments, selector, sourceEnd);
+	consumeReferenceExpression(referenceExpression);
+}
+protected void consumeReferenceExpression(ReferenceExpression referenceExpression) {
 	pushOnExpressionStack(referenceExpression);
 	if (!this.parsingJava8Plus) {
 		problemReporter().referenceExpressionsNotBelow18(referenceExpression);
 	}
+	this.referenceContext.compilationResult().hasFunctionalTypes = true;
+	markEnclosingMemberWithLocalOrFunctionalType(LocalTypeKind.METHOD_REFERENCE);
 }
 protected void consumeReferenceExpressionTypeArgumentsAndTrunk(boolean qualified) {
 	// ReferenceExpressionTypeArgumentsAndTrunk ::= OnlyTypeArguments Dimsopt ==> qualified == false
@@ -6219,7 +6287,7 @@
 
 	// ReferenceExpression ::= Name BeginTypeArguments ReferenceExpressionTypeArgumentsAndTrunk '::' NonWildTypeArgumentsopt IdentifierOrNew
 	
-	ReferenceExpression referenceExpression;
+	ReferenceExpression referenceExpression = newReferenceExpression();
 	TypeReference type;
 	TypeReference [] typeArguments = null;
 	char [] selector;
@@ -6250,15 +6318,12 @@
 	this.intPtr--; // pop '<' position
 	type.sourceEnd = typeSourceEnd;
 	
-	referenceExpression = new ReferenceExpression(this.compilationUnit.compilationResult, type, typeArguments, selector, sourceEnd);
+	referenceExpression.initialize(this.compilationUnit.compilationResult, type, typeArguments, selector, sourceEnd);
 
-	pushOnExpressionStack(referenceExpression);
-	if (!this.parsingJava8Plus) {
-		problemReporter().referenceExpressionsNotBelow18(referenceExpression);
-	}
+	consumeReferenceExpression(referenceExpression);
 }
 protected void consumeEnterInstanceCreationArgumentList() {
-	this.shouldDeferRecovery = true;
+	return;
 }
 protected void consumeSimpleAssertStatement() {
 	// AssertStatement ::= 'assert' Expression ';'
@@ -6838,6 +6903,15 @@
 //	}
 	//System.out.println(this.scanner.toStringAction(type));
 	switch (type) {
+		case TokenNameARROW:
+			consumeLambdaHeader();
+			break;
+		case TokenNameCOLON_COLON:
+			this.colonColonStart = this.scanner.currentPosition - 2;
+			break;
+		case TokenNameBeginLambda:
+			flushCommentsDefinedPriorTo(this.scanner.currentPosition);
+			break;
 		case TokenNameIdentifier :
 			pushIdentifier();
 			if (this.scanner.useAssertAsAnIndentifier  &&
@@ -7091,6 +7165,10 @@
 			this.lParenPos = this.scanner.startPosition;
 			break;
 		case TokenNameAT308:
+			this.expectTypeAnnotation = true;
+			pushOnIntStack(this.dimensions); // https://bugs.eclipse.org/bugs/show_bug.cgi?id=417660: Stack the dimensions, they get unstacked in consumeTypeAnnotation.
+			this.dimensions = 0;
+			//$FALL-THROUGH$
 		case TokenNameAT :
 			pushOnIntStack(this.scanner.startPosition);
 			break;
@@ -7635,12 +7713,8 @@
 	return m;
 }
 
-protected TypeReference copyDims(TypeReference typeRef, int dim) {
-	return typeRef.copyDims(dim);
-}
-
-protected TypeReference copyDims(TypeReference typeRef, int dim, Annotation[][]annotationsOnDimensions) {
-	return typeRef.copyDims(dim, annotationsOnDimensions);
+protected TypeReference augmentTypeWithAdditionalDimensions(TypeReference typeReference, int additionalDimensions, Annotation[][] additionalAnnotations, boolean isVarargs) {
+	return typeReference.augmentTypeWithAdditionalDimensions(additionalDimensions, additionalAnnotations, isVarargs);
 }
 
 protected FieldDeclaration createFieldDeclaration(char[] fieldDeclarationName, int sourceStart, int sourceEnd) {
@@ -8519,7 +8593,7 @@
 public void initialize() {
 	this.initialize(false);
 }
-public void initialize(boolean initializeNLS) {
+public void initialize(boolean parsingCompilationUnit) {
 	//positioning the parser for a new compilation unit
 	//avoiding stack reallocation and all that....
 	this.javadoc = null;
@@ -8540,7 +8614,7 @@
 	this.referenceContext = null;
 	this.endStatementPosition = 0;
 	this.valueLambdaNestDepth = -1;
-
+	
 	//remove objects from stack too, while the same parser/compiler couple is
 	//re-used between two compilations ....
 
@@ -8566,7 +8640,8 @@
 	this.recordStringLiterals = true;
 	final boolean checkNLS = this.options.getSeverity(CompilerOptions.NonExternalizedString) != ProblemSeverities.Ignore;
 	this.checkExternalizeStrings = checkNLS;
-	this.scanner.checkNonExternalizedStringLiterals = initializeNLS && checkNLS;
+	this.scanner.checkNonExternalizedStringLiterals = parsingCompilationUnit && checkNLS;
+	this.scanner.checkUninternedIdentityComparison = parsingCompilationUnit && this.options.complainOnUninternedIdentityComparison;
 	this.scanner.lastPosition = -1;
 
 	resetModifiers();
@@ -8655,6 +8730,9 @@
 }
 protected void markEnclosingMemberWithLocalType() {
 	if (this.currentElement != null) return; // this is already done in the recovery code
+	markEnclosingMemberWithLocalOrFunctionalType(LocalTypeKind.LOCAL);
+}
+protected void markEnclosingMemberWithLocalOrFunctionalType(LocalTypeKind context) {
 	for (int i = this.astPtr; i >= 0; i--) {
 		ASTNode node = this.astStack[i];
 		if (node instanceof AbstractMethodDeclaration
@@ -8662,14 +8740,33 @@
 				|| (node instanceof TypeDeclaration // mark type for now: all initializers will be marked when added to this type
 						// and enclosing type must not be closed (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=147485)
 						&& ((TypeDeclaration) node).declarationSourceEnd == 0)) {
-			node.bits |= ASTNode.HasLocalType;
+			switch (context) {
+				case METHOD_REFERENCE:
+					node.bits |= ASTNode.HasFunctionalInterfaceTypes;
+					break;
+				case LAMBDA:
+					node.bits |= ASTNode.HasFunctionalInterfaceTypes;
+					//$FALL-THROUGH$
+				case LOCAL:
+					node.bits |= ASTNode.HasLocalType;
+			}
 			return;
 		}
 	}
 	// default to reference context (case of parse method body)
 	if (this.referenceContext instanceof AbstractMethodDeclaration
 			|| this.referenceContext instanceof TypeDeclaration) {
-		((ASTNode)this.referenceContext).bits |= ASTNode.HasLocalType;
+		ASTNode node = (ASTNode)this.referenceContext;
+		switch (context) {
+			case METHOD_REFERENCE:
+				node.bits |= ASTNode.HasFunctionalInterfaceTypes;
+				break;
+			case LAMBDA:
+				node.bits |= ASTNode.HasFunctionalInterfaceTypes;
+				//$FALL-THROUGH$
+			case LOCAL:
+				node.bits |= ASTNode.HasLocalType;
+		}
 	}
 }
 
@@ -8876,41 +8973,14 @@
 	         
 	    Though this code looks complex, we should exit early in most situations.     
 	 */
-	int lastAction = this.unstackedAct;
-	if (lastAction == ERROR_ACTION) { // automaton is not running.
+	if (this.unstackedAct == ERROR_ACTION) { // automaton is not running.
 		return false;
 	}
-	int stackTop = this.stateStackTop;        // local copy of stack pointer
-	int stackTopState = this.stack[stackTop]; // single cell non write through "alternate stack" - the automaton's stack pointer either stays fixed during this manoeuvre or monotonically decreases.
-	int highWaterMark = stackTop;
-	
 	if (token != TokenNameAT) {
 		token = token == TokenNameLPAREN ? TokenNameBeginLambda : TokenNameBeginTypeArguments;
 	}
 	
-	// A rotated version of the automaton - cf. parse()'s for(;;)
-	for (;;) {  
-		if (lastAction > ERROR_ACTION) {  
-			lastAction -= ERROR_ACTION;    /* shift-reduce on loop entry from above, reduce on loop back */
-			do { /* reduce */
-				stackTop -= rhs[lastAction] - 1;
-				if (stackTop < highWaterMark) {
-					stackTopState = this.stack[highWaterMark = stackTop];
-				} // else stackTopState is upto date already.
-				lastAction = ntAction(stackTopState, lhs[lastAction]);
-			} while (lastAction <= NUM_RULES);
-		}
-		highWaterMark = ++stackTop;
-		stackTopState = lastAction; // "push"
-		lastAction = tAction(lastAction, token); // can be looked up from a precomputed cache.
-		if (lastAction <= NUM_RULES) {
-			stackTop --; 
-		    lastAction += ERROR_ACTION;
-			continue;
-		}
-		// Error => false, Shift, Shift/Reduce => true, Accept => impossible. 
-		return lastAction != ERROR_ACTION;
-	}
+	return automatonWillShift(token, this.unstackedAct);
 }
 /*main loop of the automat
 When a rule is reduced, the method consumeRule(int) is called with the number
@@ -8931,6 +9001,7 @@
 
 	this.hasReportedError = false;
 	int act = START_STATE;
+	this.unstackedAct = ERROR_ACTION;
 	this.stateStackTop = -1;
 	this.currentToken = getFirstToken();
 	
@@ -8945,10 +9016,8 @@
 				stackLength);
 		}
 		this.stack[this.stateStackTop] = act;
-
-		act = tAction(act, this.currentToken);
-		if (act == ERROR_ACTION || (this.restartRecovery && !this.shouldDeferRecovery)) {
-			this.shouldDeferRecovery = false;
+		this.unstackedAct = act = tAction(act, this.currentToken);
+		if (act == ERROR_ACTION || this.restartRecovery) {
 			if (DEBUG_AUTOMATON) {
 				if (this.restartRecovery) {
 					System.out.println("Restart      - "); //$NON-NLS-1$
@@ -8962,15 +9031,24 @@
 				this.hasError = true;
 			}
 			int previousToken = this.currentToken;
-			if (resumeOnSyntaxError()) {
-				if (act == ERROR_ACTION && previousToken != 0) this.lastErrorEndPosition = errorPos;
-				act = START_STATE;
-				this.stateStackTop = -1;
-				this.currentToken = getFirstToken();
-				continue ProcessTerminals;
+			switch (resumeOnSyntaxError()) {
+				case HALT:
+					act = ERROR_ACTION;
+					break ProcessTerminals;
+				case RESTART:
+					if (act == ERROR_ACTION && previousToken != 0) this.lastErrorEndPosition = errorPos;
+					act = START_STATE;
+					this.stateStackTop = -1;
+					this.currentToken = getFirstToken();
+					continue ProcessTerminals;
+				case RESUME:
+					if (act == ERROR_ACTION) {
+						act = this.stack[this.stateStackTop--];
+						continue ProcessTerminals;
+					} else {
+						// FALL THROUGH.	
+					}
 			}
-			act = ERROR_ACTION;
-			break ProcessTerminals;
 		}
 		if (act <= NUM_RULES) {
 			this.stateStackTop--;
@@ -8988,7 +9066,6 @@
 				this.recordStringLiterals = oldValue;
 			}
 			try {
-				this.unstackedAct = act;
 				this.currentToken = this.scanner.getNextToken();
 			} catch(InvalidInputException e){
 				if (!this.hasReportedError){
@@ -8999,13 +9076,11 @@
 				this.lastCheckPoint = this.scanner.currentPosition;
 				this.currentToken = 0;
 				this.restartRecovery = true;
-			} finally {
-				this.unstackedAct = ERROR_ACTION;
-			}
+			} 
 			if(this.statementRecoveryActivated) {
 				jumpOverType();
 			}
-			act -= ERROR_ACTION;
+			this.unstackedAct = act -= ERROR_ACTION;
 
 			if (DEBUG_AUTOMATON) {
 				System.out.print("Shift/Reduce - (" + name[terminal_index[this.currentToken]]+") ");  //$NON-NLS-1$  //$NON-NLS-2$
@@ -9021,7 +9096,6 @@
 					this.recordStringLiterals = oldValue;
 				}
 				try{
-					this.unstackedAct = act;
 					this.currentToken = this.scanner.getNextToken();
 				} catch(InvalidInputException e){
 					if (!this.hasReportedError){
@@ -9032,8 +9106,6 @@
 					this.lastCheckPoint = this.scanner.currentPosition;
 					this.currentToken = 0;
 					this.restartRecovery = true;
-				} finally {
-					this.unstackedAct = ERROR_ACTION;
 				}
 				if(this.statementRecoveryActivated) {
 					jumpOverType();
@@ -9054,8 +9126,9 @@
 			}
 
 			this.stateStackTop -= (rhs[act] - 1);
+			this.unstackedAct = ntAction(this.stack[this.stateStackTop], lhs[act]);
 			consumeRule(act);
-			act = ntAction(this.stack[this.stateStackTop], lhs[act]);
+			act = this.unstackedAct;
 
 			if (DEBUG_AUTOMATON) {
 				if (act <= NUM_RULES) {
@@ -9070,6 +9143,7 @@
 		}
 	}
 } finally {
+	this.unstackedAct = ERROR_ACTION;
 	this.scanner.setActiveParser(null);
 }
 
@@ -9085,6 +9159,12 @@
 	}
 
 	this.scanner.checkNonExternalizedStringLiterals = false;
+	
+	if (this.scanner.checkUninternedIdentityComparison) {
+		this.compilationUnit.validIdentityComparisonLines = this.scanner.getIdentityComparisonLines();
+		this.scanner.checkUninternedIdentityComparison = false;
+	}
+	
 	if (this.reportSyntaxErrorIsRequired && this.hasError && !this.statementRecoveryActivated) {
 		if(!this.options.performStatementsRecovery) {
 			reportSyntaxErrors(isDietParse, oldFirstToken);
@@ -9436,6 +9516,7 @@
 }
 public ASTNode[] parseClassBodyDeclarations(char[] source, int offset, int length, CompilationUnitDeclaration unit) {
 	boolean oldDiet = this.diet;
+	boolean oldTolerateDefaultClassMethods = this.tolerateDefaultClassMethods;
 	/* automaton initialization */
 	initialize();
 	goForClassBodyDeclarations();
@@ -9462,11 +9543,13 @@
 	/* run automaton */
 	try {
 		this.diet = true;
+		this.tolerateDefaultClassMethods = this.parsingJava8Plus;
 		parse();
 	} catch (AbortCompilation ex) {
 		this.lastAct = ERROR_ACTION;
 	} finally {
 		this.diet = oldDiet;
+		this.tolerateDefaultClassMethods = oldTolerateDefaultClassMethods;
 	}
 
 	ASTNode[] result = null;
@@ -9712,8 +9795,8 @@
 			stackLength);
 	}
 	this.identifierLengthStack[this.identifierLengthPtr] = 1;
-	if (this.parsingJava8Plus && identifier.length == 1 && identifier[0] == '_') {
-		problemReporter().illegalUseOfUnderscoreAsAnIdentifier((int) (position >>> 32), (int) position);
+	if (this.parsingJava8Plus && identifier.length == 1 && identifier[0] == '_' && !this.processingLambdaParameterList) {
+		problemReporter().illegalUseOfUnderscoreAsAnIdentifier((int) (position >>> 32), (int) position, false /* not a lambda parameter */);
 	}
 }
 protected void pushIdentifier() {
@@ -10241,8 +10324,10 @@
 	this.identifierPtr = -1;
 	this.identifierLengthPtr	= -1;
 	this.intPtr = -1;
+	
 	this.nestedMethod[this.nestedType = 0] = 0; // need to reset for further reuse
 	this.variablesCounter[this.nestedType] = 0;
+	
 	this.dimensions = 0 ;
 	this.realBlockStack[this.realBlockPtr = 0] = 0;
 	this.recoveredStaticInitializerStart = 0;
@@ -10261,7 +10346,7 @@
  * Move checkpoint location, reset internal stacks and
  * decide which grammar goal is activated.
  */
-protected boolean resumeAfterRecovery() {
+protected int resumeAfterRecovery() {
 	if(!this.methodRecoveryActivated && !this.statementRecoveryActivated) {
 
 		// reset internal stacks
@@ -10270,18 +10355,18 @@
 
 		/* attempt to move checkpoint location */
 		if (!moveRecoveryCheckpoint()) {
-			return false;
+			return HALT;
 		}
 
 		// only look for headers
 		if (this.referenceContext instanceof CompilationUnitDeclaration){
 			goForHeaders();
 			this.diet = true; // passed this point, will not consider method bodies
-			return true;
+			return RESTART;
 		}
 
 		// does not know how to restart
-		return false;
+		return HALT;
 	} else if(!this.statementRecoveryActivated) {
 
 		// reset internal stacks
@@ -10290,32 +10375,32 @@
 
 		/* attempt to move checkpoint location */
 		if (!moveRecoveryCheckpoint()) {
-			return false;
+			return HALT;
 		}
 
 		// only look for headers
 		goForHeaders();
-		return true;
+		return RESTART;
 	} else {
-		return false;
+		return HALT;
 	}
 }
-protected boolean resumeOnSyntaxError() {
+protected int resumeOnSyntaxError() {
 	if (this.haltOnSyntaxError)
-		return false;
+		return HALT;
 	/* request recovery initialization */
 	if (this.currentElement == null){
 		// Reset javadoc before restart parsing after recovery
 		this.javadoc = null;
 
 		// do not investigate deeper in statement recovery
-		if (this.statementRecoveryActivated) return false;
+		if (this.statementRecoveryActivated) return HALT;
 
 		// build some recovered elements
 		this.currentElement = buildInitialRecoveryState();
 	}
 	/* do not investigate deeper in recovery when no recovered element */
-	if (this.currentElement == null) return false;
+	if (this.currentElement == null) return HALT;
 
 	/* manual forced recovery restart - after headers */
 	if (this.restartRecovery){
@@ -10445,6 +10530,101 @@
 	exp.sourceEnd = this.intStack[this.intPtr--];
 	exp.sourceStart = this.intStack[this.intPtr--];
 }
+public void copyState(CommitRollbackParser from) {
+	
+	Parser parser = (Parser) from;
 
+	// Stack pointers.
+	
+	this.stateStackTop = parser.stateStackTop;
+	this.unstackedAct = parser.unstackedAct;
+	this.identifierPtr = parser.identifierPtr;
+	this.identifierLengthPtr = parser.identifierLengthPtr;
+	this.astPtr = parser.astPtr;
+	this.astLengthPtr = parser.astLengthPtr;
+	this.expressionPtr = parser.expressionPtr;
+	this.expressionLengthPtr = parser.expressionLengthPtr;
+	this.genericsPtr = parser.genericsPtr;
+	this.genericsLengthPtr = parser.genericsLengthPtr;
+	this.genericsIdentifiersLengthPtr = parser.genericsIdentifiersLengthPtr;
+	this.typeAnnotationPtr = parser.typeAnnotationPtr;
+	this.typeAnnotationLengthPtr = parser.typeAnnotationLengthPtr;
+	this.intPtr = parser.intPtr;
+	this.nestedType = parser.nestedType;
+	this.realBlockPtr = parser.realBlockPtr;
+	this.valueLambdaNestDepth = parser.valueLambdaNestDepth;
+	
+	// Stacks.
+	
+	int length;
+	System.arraycopy(parser.stack, 0, this.stack = new int [length = parser.stack.length], 0, length);
+	System.arraycopy(parser.identifierStack, 0, this.identifierStack = new char [length = parser.identifierStack.length][], 0, length);
+	System.arraycopy(parser.identifierLengthStack, 0, this.identifierLengthStack = new int [length = parser.identifierLengthStack.length], 0, length);
+	System.arraycopy(parser.identifierPositionStack, 0, this.identifierPositionStack = new long[length = parser.identifierPositionStack.length], 0, length);
+	System.arraycopy(parser.astStack, 0, this.astStack = new ASTNode [length = parser.astStack.length], 0, length);
+	System.arraycopy(parser.astLengthStack, 0, this.astLengthStack = new int [length = parser.astLengthStack.length], 0, length);
+	System.arraycopy(parser.expressionStack, 0, this.expressionStack = new Expression [length = parser.expressionStack.length], 0, length);
+	System.arraycopy(parser.expressionLengthStack, 0, this.expressionLengthStack = new int [length = parser.expressionLengthStack.length], 0, length);
+	System.arraycopy(parser.genericsStack, 0, this.genericsStack = new ASTNode [length = parser.genericsStack.length], 0, length);
+	System.arraycopy(parser.genericsLengthStack, 0, this.genericsLengthStack = new int [length = parser.genericsLengthStack.length], 0, length);
+	System.arraycopy(parser.genericsIdentifiersLengthStack, 0, this.genericsIdentifiersLengthStack = new int [length = parser.genericsIdentifiersLengthStack.length], 0, length);
+	System.arraycopy(parser.typeAnnotationStack, 0, this.typeAnnotationStack = new Annotation [length = parser.typeAnnotationStack.length], 0, length);
+	System.arraycopy(parser.typeAnnotationLengthStack, 0, this.typeAnnotationLengthStack = new int [length = parser.typeAnnotationLengthStack.length], 0, length);
+	System.arraycopy(parser.intStack, 0, this.intStack = new int [length = parser.intStack.length], 0, length);
+	System.arraycopy(parser.nestedMethod, 0, this.nestedMethod = new int [length = parser.nestedMethod.length], 0, length);
+	System.arraycopy(parser.realBlockStack, 0, this.realBlockStack = new int [length = parser.realBlockStack.length], 0, length);
+	System.arraycopy(parser.stateStackLengthStack, 0, this.stateStackLengthStack = new int [length = parser.stateStackLengthStack.length], 0, length);
+	System.arraycopy(parser.variablesCounter, 0, this.variablesCounter = new int [length = parser.variablesCounter.length], 0, length);
+	System.arraycopy(parser.stack, 0, this.stack = new int [length = parser.stack.length], 0, length);
+	System.arraycopy(parser.stack, 0, this.stack = new int [length = parser.stack.length], 0, length);
+	System.arraycopy(parser.stack, 0, this.stack = new int [length = parser.stack.length], 0, length);
+
+	// Loose variables.
+	
+	this.listLength = parser.listLength;
+	this.listTypeParameterLength = parser.listTypeParameterLength;
+	this.dimensions = parser.dimensions;
+	this.recoveredStaticInitializerStart = parser.recoveredStaticInitializerStart;
+
+	// Parser.resetStacks is not clearing the modifiers, but AssistParser.resumeAfterRecovery is - why ? (the former doesn't)
+	// this.modifiers = parser.modifiers;
+	// this.modifiersSourceStart = parser.modifiersSourceStart;
+}
+
+public int automatonState() {
+	return this.stack[this.stateStackTop];
+}
+public boolean automatonWillShift(int token, int lastAction) {
+	int stackTop = this.stateStackTop;        // local copy of stack pointer
+	int stackTopState = this.stack[stackTop]; // single cell non write through "alternate stack" - the automaton's stack pointer either stays fixed during this manoeuvre or monotonically decreases.
+	int highWaterMark = stackTop;
+	// A rotated version of the automaton - cf. parse()'s for(;;)
+	if (lastAction <= NUM_RULES) { // in recovery mode, we could take a detour to here, with a pending reduce action.
+		stackTop --;
+		lastAction += ERROR_ACTION;
+	}
+	for (;;) {  
+		if (lastAction > ERROR_ACTION) {  
+			lastAction -= ERROR_ACTION;    /* reduce or shift-reduce on loop entry from above, reduce on loop back */
+			do { /* reduce */
+				stackTop -= rhs[lastAction] - 1;
+				if (stackTop < highWaterMark) {
+					stackTopState = this.stack[highWaterMark = stackTop];
+				} // else stackTopState is upto date already.
+				lastAction = ntAction(stackTopState, lhs[lastAction]);
+			} while (lastAction <= NUM_RULES);
+		}
+		highWaterMark = ++stackTop;
+		stackTopState = lastAction; // "push"
+		lastAction = tAction(lastAction, token); // can be looked up from a precomputed cache.
+		if (lastAction <= NUM_RULES) {
+			stackTop --; 
+		    lastAction += ERROR_ACTION;
+			continue;
+		}
+		// Error => false, Shift, Shift/Reduce => true, Accept => impossible. 
+		return lastAction != ERROR_ACTION;
+	}
+}
 protected boolean shouldTryToRecover() { return true; } // AspectJ Extension - to be overridden
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass.java
index cfc4e48..6ba1e6a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TheOriginalJDTScannerClass.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -19,6 +15,7 @@
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.core.compiler.InvalidInputException;
 import org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
@@ -168,6 +165,12 @@
 	public static final int TAG_PREFIX_LENGTH= TAG_PREFIX.length;
 	public static final char TAG_POSTFIX= '$';
 	public static final int TAG_POSTFIX_LENGTH= 1;
+
+	// support for complaining on uninterned type comparisons.
+	public static final char[] IDENTITY_COMPARISON_TAG = "//$IDENTITY-COMPARISON$".toCharArray(); //$NON-NLS-1$
+	public boolean [] validIdentityComparisonLines;
+	public boolean checkUninternedIdentityComparison;
+
 	private NLSTag[] nlsTags = null;
 	protected int nlsTagsPtr;
 	public boolean checkNonExternalizedStringLiterals;
@@ -197,6 +200,7 @@
 	private VanguardScanner vanguardScanner;
 	private VanguardParser vanguardParser;
 	private ConflictedParser activeParser = null;
+	private boolean consumingEllipsisAnnotations = false;
 	
 	public static final int RoundBracket = 0;
 	public static final int SquareBracket = 1;
@@ -209,11 +213,11 @@
 	public static final int HIGH_SURROGATE_MAX_VALUE = 0xDBFF;
 	public static final int LOW_SURROGATE_MAX_VALUE = 0xDFFF;
 
-public TheOriginalJDTScannerClass() {
+public TheOriginalJDTScannerClass() { // Aspectj Extension: new name
 	this(false /*comment*/, false /*whitespace*/, false /*nls*/, ClassFileConstants.JDK1_3 /*sourceLevel*/, null/*taskTag*/, null/*taskPriorities*/, true /*taskCaseSensitive*/);
 }
 
-public TheOriginalJDTScannerClass(
+public TheOriginalJDTScannerClass( // Aspectj Extension: new name
 		boolean tokenizeComments,
 		boolean tokenizeWhiteSpace,
 		boolean checkNonExternalizedStringLiterals,
@@ -228,6 +232,7 @@
 	this.tokenizeWhiteSpace = tokenizeWhiteSpace;
 	this.sourceLevel = sourceLevel;
 	this.lookBack[0] = this.lookBack[1] = this.nextToken = TokenNameNotAToken;
+	this.consumingEllipsisAnnotations = false;
 	this.complianceLevel = complianceLevel;
 	this.checkNonExternalizedStringLiterals = checkNonExternalizedStringLiterals;
 	if (taskTags != null) {
@@ -261,7 +266,7 @@
 	}
 }
 
-public TheOriginalJDTScannerClass(
+public TheOriginalJDTScannerClass( // Aspectj Extension: new name
 		boolean tokenizeComments,
 		boolean tokenizeWhiteSpace,
 		boolean checkNonExternalizedStringLiterals,
@@ -1152,6 +1157,8 @@
 	}
 	if (token == TokenNameLPAREN || token == TokenNameLESS || token == TokenNameAT) {
 		token = disambiguatedToken(token);
+	} else if (token == TokenNameELLIPSIS) {
+		this.consumingEllipsisAnnotations = false;
 	}
 	this.lookBack[0] = this.lookBack[1];
 	this.lookBack[1] = token;
@@ -1631,7 +1638,7 @@
 								recordComment(TokenNameCOMMENT_LINE);
 								if (this.taskTags != null) checkTaskTag(this.startPosition, this.currentPosition);
 								if ((this.currentCharacter == '\r') || (this.currentCharacter == '\n')) {
-									if (this.checkNonExternalizedStringLiterals &&
+									if ((this.checkNonExternalizedStringLiterals || this.checkUninternedIdentityComparison) &&
 											this.lastPosition < this.currentPosition) {
 										parseTags();
 									}
@@ -1650,7 +1657,7 @@
 								this.currentPosition--;
 								recordComment(TokenNameCOMMENT_LINE);
 								if (this.taskTags != null) checkTaskTag(this.startPosition, this.currentPosition);
-								if (this.checkNonExternalizedStringLiterals &&
+								if ((this.checkNonExternalizedStringLiterals || this.checkUninternedIdentityComparison) &&
 										this.lastPosition < this.currentPosition) {
 									parseTags();
 								}
@@ -1893,6 +1900,11 @@
 	}
 	return null;
 }
+public boolean[] getIdentityComparisonLines() {
+	boolean [] retVal = this.validIdentityComparisonLines;
+	this.validIdentityComparisonLines = null;
+	return retVal;
+}
 public char[] getSource(){
 	return this.source;
 }
@@ -2092,7 +2104,7 @@
 								recordComment(TokenNameCOMMENT_LINE);
 								if (this.recordLineSeparator
 									&& ((this.currentCharacter == '\r') || (this.currentCharacter == '\n'))) {
-										if (this.checkNonExternalizedStringLiterals &&
+										if ((this.checkNonExternalizedStringLiterals || this.checkUninternedIdentityComparison) &&
 												this.lastPosition < this.currentPosition) {
 											parseTags();
 										}
@@ -2108,7 +2120,7 @@
 								 //an eof will then be generated
 								this.currentPosition--;
 								recordComment(TokenNameCOMMENT_LINE);
-								if (this.checkNonExternalizedStringLiterals &&
+								if ((this.checkNonExternalizedStringLiterals || this.checkUninternedIdentityComparison) &&
 										this.lastPosition < this.currentPosition) {
 									parseTags();
 								}
@@ -2553,8 +2565,9 @@
 	} else {
 		s = this.source;
 	}
-	int pos = CharOperation.indexOf(TAG_PREFIX, s, true, sourceStart, sourceEnd);
-	if (pos != -1) {
+	int pos;
+	if (this.checkNonExternalizedStringLiterals &&
+			(pos = CharOperation.indexOf(TAG_PREFIX, s, true, sourceStart, sourceEnd)) != -1) {
 		if (this.nlsTags == null) {
 			this.nlsTags = new NLSTag[10];
 			this.nlsTagsPtr = 0;
@@ -2580,6 +2593,17 @@
 			}
 			pos = CharOperation.indexOf(TAG_PREFIX, s, true, end, sourceEnd);
 		}
+	} 
+	
+	if (this.checkUninternedIdentityComparison &&
+			(pos = CharOperation.indexOf(IDENTITY_COMPARISON_TAG, s, true, sourceStart, sourceEnd)) != -1) {
+		if (this.validIdentityComparisonLines == null) {
+			this.validIdentityComparisonLines = new boolean[0];
+		}
+		int currentLine = currentLinePtr + 1;
+		int length = this.validIdentityComparisonLines.length;
+		System.arraycopy(this.validIdentityComparisonLines, 0, this.validIdentityComparisonLines = new boolean[currentLine + 1], 0, length);
+		this.validIdentityComparisonLines[currentLine] = true;
 	}
 }
 private int extractInt(char[] array, int start, int end) {
@@ -2734,6 +2758,7 @@
 	this.commentPtr = -1; // reset comment stack
 	this.foundTaskCount = 0;
 	this.lookBack[0] = this.lookBack[1] = this.nextToken = TokenNameNotAToken;
+	this.consumingEllipsisAnnotations = false;
 }
 
 protected final void scanEscapeCharacter() throws InvalidInputException {
@@ -4190,7 +4215,7 @@
 }
 
 // Vanguard Scanner - A Private utility helper class for the scanner.
-private static final class VanguardScanner extends Scanner { // AspectJ: adjusted inheritance to Scanner (and not TheOriginalJDTScanner)
+private static final class VanguardScanner extends Scanner {
 	
 	public VanguardScanner(long sourceLevel, long complianceLevel) {
 		super (false /*comment*/, false /*whitespace*/, false /*nls*/, sourceLevel, complianceLevel, null/*taskTag*/, null/*taskPriorities*/, false /*taskCaseSensitive*/);
@@ -4215,11 +4240,13 @@
 	static int IntersectionCastRule = 0;
 	static int ReferenceExpressionRule = 0;
 	static int VarargTypeAnnotationsRule  = 0;
+	static int BlockStatementoptRule = 0;
 	
 	static Goal LambdaParameterListGoal;
 	static Goal IntersectionCastGoal;
 	static Goal VarargTypeAnnotationGoal;
 	static Goal ReferenceExpressionGoal;
+	static Goal BlockStatementoptGoal;
 	
 	static {
 		
@@ -4235,12 +4262,17 @@
 			else 
 			if ("TypeAnnotations".equals(Parser.name[Parser.non_terminal_index[Parser.lhs[i]]])) //$NON-NLS-1$
 				VarargTypeAnnotationsRule = i;
+			else
+			if ("BlockStatementopt".equals(Parser.name[Parser.non_terminal_index[Parser.lhs[i]]])) //$NON-NLS-1$
+				BlockStatementoptRule = i;
+					
 		}
 		
 		LambdaParameterListGoal =  new Goal(TokenNameARROW, new int[] { TokenNameARROW }, LambdaParameterListRule);
 		IntersectionCastGoal =     new Goal(TokenNameLPAREN, followSetOfCast(), IntersectionCastRule);
 		VarargTypeAnnotationGoal = new Goal(TokenNameAT, new int[] { TokenNameELLIPSIS }, VarargTypeAnnotationsRule);
 		ReferenceExpressionGoal =  new Goal(TokenNameLESS, new int[] { TokenNameCOLON_COLON }, ReferenceExpressionRule);
+		BlockStatementoptGoal =    new Goal(TokenNameLBRACE, new int [0], BlockStatementoptRule);
 	}
 
 
@@ -4253,10 +4285,13 @@
 	boolean hasBeenReached(int act, int token) {
 		/*
 		System.out.println("[Goal = " + Parser.name[Parser.non_terminal_index[Parser.lhs[this.rule]]] + "]  " + "Saw: " + Parser.name[Parser.non_terminal_index[Parser.lhs[act]]] + "::" +  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				Parser.name[Parser.terminal_index[token]]);
+					Parser.name[Parser.terminal_index[token]]);
 		*/
 		if (act == this.rule) {
-			for (int i = 0, length = this.follow.length; i < length; i++)
+			final int length = this.follow.length;
+			if (length == 0)
+				return true;
+			for (int i = 0; i < length; i++)
 				if (this.follow[i] == token)
 					return true;
 		}
@@ -4306,7 +4341,7 @@
 				} else if (act > ERROR_ACTION) { /* shift-reduce */
 					this.unstackedAct = act;
 					try {
-						this.currentToken = this.scanner.getNextToken();
+					this.currentToken = this.scanner.getNextToken();
 					} finally {
 						this.unstackedAct = ERROR_ACTION;
 					}
@@ -4315,7 +4350,7 @@
 				    if (act < ACCEPT_ACTION) { /* shift */
 				    	this.unstackedAct = act;
 						try {
-							this.currentToken = this.scanner.getNextToken();
+				    	this.currentToken = this.scanner.getNextToken();
 						} finally {
 							this.unstackedAct = ERROR_ACTION;
 						}
@@ -4410,7 +4445,9 @@
 	}
 	return this.activeParser.atConflictScenario(TokenNameLESS);
 }
-protected final boolean maybeAtEllipsisAnnotation() { // Did the '@' we saw just now herald a type annotation on a ... ? Presumed to be at type annotation already.
+private final boolean maybeAtEllipsisAnnotationsStart() { // Did the '@' we saw just now herald a type annotation on a ... ? Presumed to be at type annotation already.
+	if (this.consumingEllipsisAnnotations)
+		return false;
 	switch (this.lookBack[1]) {
 		case TokenNamenew:
 		case TokenNameCOMMA:
@@ -4455,8 +4492,9 @@
 		}
 	} else if (token == TokenNameAT && atTypeAnnotation()) {
 		token = TokenNameAT308;
-		if (maybeAtEllipsisAnnotation()) {
+		if (maybeAtEllipsisAnnotationsStart()) {
 			if (parser.parse(Goal.VarargTypeAnnotationGoal) == VanguardParser.SUCCESS) {
+				this.consumingEllipsisAnnotations = true;
 				this.nextToken = TokenNameAT308;
 				return TokenNameAT308DOTDOTDOT;
 			}
@@ -4464,4 +4502,98 @@
 	}
 	return token;
 }
+
+protected boolean isAtAssistIdentifier() {
+	return false;
+}
+
+// Position the scanner at the next block statement and return the start token. We recognize empty statements.
+public int fastForward(Statement unused) {
+	
+	int token;
+
+	while (true) {
+		try {
+			token = getNextToken();
+		} catch (InvalidInputException e) {
+			return TokenNameEOF;
+		}
+		/* FOLLOW map of BlockStatement, since the non-terminal is recursive is a super set of its own FIRST set. 
+	   	   We use FOLLOW rather than FIRST since we want to recognize empty statements. i.e if (x > 10) {  x = 0 }
+		*/
+		switch(token) {
+			case TokenNameIdentifier:
+				if (isAtAssistIdentifier()) // do not fast forward past the assist identifier ! We don't handle collections as of now.
+					return token;
+				//$FALL-THROUGH$
+			case TokenNameabstract:
+			case TokenNameassert:
+			case TokenNameboolean:
+			case TokenNamebreak:
+			case TokenNamebyte:
+			case TokenNamecase:
+			case TokenNamechar:
+			case TokenNameclass:
+			case TokenNamecontinue:
+			case TokenNamedefault:
+			case TokenNamedo:
+			case TokenNamedouble:
+			case TokenNameenum:
+			case TokenNamefalse:
+			case TokenNamefinal:
+			case TokenNamefloat:
+			case TokenNamefor:
+			case TokenNameif:
+			case TokenNameint:
+			case TokenNameinterface:
+			case TokenNamelong:
+			case TokenNamenative:
+			case TokenNamenew:
+			case TokenNamenull:
+			case TokenNameprivate:
+			case TokenNameprotected:
+			case TokenNamepublic:
+			case TokenNamereturn:
+			case TokenNameshort:
+			case TokenNamestatic:
+			case TokenNamestrictfp:
+			case TokenNamesuper:
+			case TokenNameswitch:
+			case TokenNamesynchronized:
+			case TokenNamethis:
+			case TokenNamethrow:
+			case TokenNametransient:
+			case TokenNametrue:
+			case TokenNametry:
+			case TokenNamevoid:
+			case TokenNamevolatile:
+			case TokenNamewhile:
+			case TokenNameIntegerLiteral: // ??!
+			case TokenNameLongLiteral:
+			case TokenNameFloatingPointLiteral:
+			case TokenNameDoubleLiteral:
+			case TokenNameCharacterLiteral:
+			case TokenNameStringLiteral:
+			case TokenNamePLUS_PLUS:
+			case TokenNameMINUS_MINUS:
+			case TokenNameLESS:
+			case TokenNameLPAREN:
+			case TokenNameLBRACE:
+			case TokenNameAT:
+			case TokenNameBeginLambda:
+			case TokenNameAT308:
+				if(getVanguardParser().parse(Goal.BlockStatementoptGoal) == VanguardParser.SUCCESS)
+					return token;
+				break;
+			case TokenNameSEMICOLON:
+			case TokenNameEOF:
+				return token;
+			case TokenNameRBRACE: // simulate empty statement.
+				ungetToken(token);
+				return TokenNameSEMICOLON;
+			default:
+				break;
+		}
+	}
+}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TypeConverter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TypeConverter.java
index f3ecd90..e29fc96 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TypeConverter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/TypeConverter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2010 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
@@ -30,6 +30,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public abstract class TypeConverter {
 
 	int namePos;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.java
index 6065182..406b957 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream.java
index 33932bf..8af6838 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/diagnose/LexStream.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser1.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser1.rsc
index 78c3e84..35ff8d05 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser1.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser1.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser10.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser10.rsc
index 14b78eb..31091df 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser10.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser10.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser11.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser11.rsc
index 97d5957..9586c4a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser11.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser11.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser12.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser12.rsc
index cac4c9a..a2405da 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser12.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser12.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser13.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser13.rsc
index 06c37e8..c93b080 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser13.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser13.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser14.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser14.rsc
index e6c599f..c287cad 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser14.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser14.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser15.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser15.rsc
index 97dc846..cc8990c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser15.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser15.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser16.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser16.rsc
index 771a532..687bd27 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser16.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser16.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser17.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser17.rsc
index 2406c9d..b0fdf76 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser17.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser17.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser18.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser18.rsc
index 426a382..297858e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser18.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser18.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser19.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser19.rsc
index 1fa1c81..8caf5a7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser19.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser19.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser2.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser2.rsc
index 08bdedf..d34b764 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser2.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser2.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser20.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser20.rsc
index 82bb005..e5bb86a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser20.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser20.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser21.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser21.rsc
index c098ce3..724bd2b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser21.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser21.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser22.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser22.rsc
index 261140d..376547c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser22.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser22.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser23.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser23.rsc
index 0468fc8..ea0615b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser23.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser23.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser24.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser24.rsc
index f8d889f..0cc3d82 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser24.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser24.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser3.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser3.rsc
index 313bf81..dab1c01 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser3.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser3.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser4.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser4.rsc
index 35eff4f..c74948a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser4.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser4.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser5.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser5.rsc
index 4e426aa..7e6c951 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser5.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser5.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser6.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser6.rsc
index d04b33e..565a167 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser6.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser6.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser7.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser7.rsc
index bf8172a..c6fea9d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser7.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser7.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser8.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser8.rsc
index 54e6acb..49f5fa8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser8.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser8.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser9.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser9.rsc
index 395af82..9c7914f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser9.rsc
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/parser9.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/readableNames.props b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/readableNames.props
index bbb9b5e..b7506a6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/readableNames.props
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/readableNames.props
@@ -68,6 +68,8 @@
 BeforeAdviceHeaderName=AdviceHeaderName
 Block=Block
 BlockStatement=BlockStatement
+BlockStatementopt0=BlockStatementopt0
+BlockStatementopt=BlockStatementopt
 BlockStatements=BlockStatements
 BlockStatementsopt=BlockStatements
 BooleanLiteral=BooleanLiteral
@@ -270,6 +272,7 @@
 MultiplicativeExpression_NotName=Expression
 Name=Name
 NameOrAj=name
+NestedLambda=NestedLambda
 NestedMethod=NestedMethod
 NestedType=NestedType
 NonWildTypeArgumentsopt=NonWildTypeArgumentsopt
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part0.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part0.rsc
new file mode 100644
index 0000000..16afc3d
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part0.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part1.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part1.rsc
new file mode 100644
index 0000000..be67b30
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part1.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part14.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part14.rsc
new file mode 100644
index 0000000..c8241e8
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part14.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part2.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part2.rsc
new file mode 100644
index 0000000..f89f581
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/part2.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start0.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start0.rsc
new file mode 100644
index 0000000..dae941d
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start0.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start1.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start1.rsc
new file mode 100644
index 0000000..6076041
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start1.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start2.rsc b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start2.rsc
new file mode 100644
index 0000000..f89f581
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/parser/unicode6_2/start2.rsc
Binary files differ
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java
index 328e608..3b65a3d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.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,6 +21,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.HashtableOfInt;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings("rawtypes")
 public class DefaultProblemFactory implements IProblemFactory {
 
 	public HashtableOfInt messageTemplates;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.java
index bfebf90..4993cac 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.java
@@ -1,13 +1,9 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -122,7 +118,7 @@
 		return;
 
 	 boolean mandatory = (severity & (ProblemSeverities.Error | ProblemSeverities.Optional)) == ProblemSeverities.Error;
-	 if (this.policy.ignoreAllErrors()) { 
+	 if (severity < ProblemSeverities.InternalError && this.policy.ignoreAllErrors()) { 
 		 // Error is not to be exposed, but clients may need still notification as to whether there are silently-ignored-errors.
 		 if (mandatory)
 			 referenceContext.tagAsHavingIgnoredMandatoryErrors(problemId);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
index 6fb84c1..c0a2ae2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
@@ -1,17 +1,12 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Palo Alto Research Center, Incorporated - AspectJ adaptation
  *     Benjamin Muskalla - Contribution for bug 239066
  *     Stephan Herrmann  - Contributions for
  *	     						bug 236385 - [compiler] Warn for potential programming problem if an object is created but not used
@@ -38,11 +33,30 @@
  *								bug 402028 - [1.8][compiler] null analysis for reference expressions 
  *								bug 401796 - [1.8][compiler] don't treat default methods as overriding an independent inherited abstract method
  *								bug 404649 - [1.8][compiler] detect illegal reference to indirect or redundant super
+ *								bug 392384 - [1.8][compiler][null] Restore nullness info from type annotations in class files
+ *								Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+ *								Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+ *								Bug 415291 - [1.8][null] differentiate type incompatibilities due to null annotations
+ *								Bug 415850 - [1.8] Ensure RunJDTCoreTests can cope with null annotations enabled
+ *								Bug 414380 - [compiler][internal] QualifiedNameReference#indexOfFirstFieldBinding does not point to the first field
+ *								Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+ *								Bug 416307 - [1.8][compiler][null] subclass with type parameter substitution confuses null checking
+ *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *								Bug 424637 - [1.8][compiler][null] AIOOB in ReferenceExpression.resolveType with a method reference to Files::walk
+ *								Bug 428294 - [1.8][compiler] Type mismatch: cannot convert from List<Object> to Collection<Object[]>
+ *								Bug 428366 - [1.8] [compiler] The method valueAt(ObservableList<Object>, int) is ambiguous for the type Bindings
+ *								Bug 416190 - [1.8][null] detect incompatible overrides due to null type annotations
+ *								Bug 392245 - [1.8][compiler][null] Define whether / how @NonNullByDefault applies to TYPE_USE locations
  *      Jesper S Moller <jesper@selskabet.org> -  Contributions for
  *								bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
  *								bug 382721 - [1.8][compiler] Effectively final variables needs special treatment
  *								bug 384567 - [1.5][compiler] Compiler accepts illegal modifiers on package declaration
- *******************************************************************************/
+ *								bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
+ *								bug 412151 - [1.8][compiler] Check repeating annotation's collection type
+ *								bug 419209 - [1.8] Repeating container annotations should be rejected in the presence of annotation it contains
+ *								Bug 429384 - [1.8][null] implement conformance rules for null-annotated lower / upper type bounds
+ *								Bug 416182 - [1.8][compiler][null] Contradictory null annotations not rejected
+ ********************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.problem;
 
 import java.io.CharConversionException;
@@ -51,7 +65,6 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 import org.aspectj.org.eclipse.jdt.core.compiler.CategorizedProblem;
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.core.compiler.IProblem;
@@ -100,6 +113,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MessageSend;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NameReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NullLiteral;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;
@@ -127,8 +141,10 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.CaptureBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
@@ -156,11 +172,14 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.Scanner;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.TerminalTokens;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Messages;
+import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings("rawtypes")
 public class ProblemReporter extends ProblemHandler {
 
 	public ReferenceContext referenceContext;
 	private Scanner positionScanner;
+	private boolean underScoreIsLambdaParameter;
 	private final static byte
 	  // TYPE_ACCESS = 0x0,
 	  FIELD_ACCESS = 0x4,
@@ -360,6 +379,9 @@
 		case IProblem.NonNullMessageSendComparisonYieldsFalse:
 		case IProblem.RedundantNullCheckOnNonNullSpecdField:
 		case IProblem.NonNullSpecdFieldComparisonYieldsFalse:
+		case IProblem.RedundantNullCheckAgainstNonNullType:
+		case IProblem.RedundantNullCheckOnField:
+		case IProblem.FieldComparisonYieldsFalse:
 			return CompilerOptions.RedundantNullCheck;
 
 		case IProblem.RequiredNonNullButProvidedNull:
@@ -372,9 +394,11 @@
 		case IProblem.ConflictingNullAnnotations:
 		case IProblem.ConflictingInheritedNullAnnotations:
 		case IProblem.NullityMismatchingTypeAnnotation:
+		case IProblem.NullityMismatchingTypeAnnotationSuperHint:
+		case IProblem.NullityMismatchTypeArgument:
 		case IProblem.UninitializedNonNullField:
 		case IProblem.UninitializedNonNullFieldHintMissingDefault:
-		case IProblem.ReferenceExpressionParameterMismatchPromisedNullable:
+		case IProblem.ReferenceExpressionParameterNullityMismatch:
 		case IProblem.ReferenceExpressionReturnNullRedef:
 			return CompilerOptions.NullSpecViolation;
 
@@ -384,9 +408,11 @@
 		case IProblem.RequiredNonNullButProvidedPotentialNull:
 			return CompilerOptions.NullAnnotationInferenceConflict;
 		case IProblem.RequiredNonNullButProvidedUnknown:
-		case IProblem.NullityMismatchingTypeAnnotationUnchecked:
-		case IProblem.ReferenceExpressionParameterRequiredNonnullUnchecked:
+		case IProblem.NullityUncheckedTypeAnnotationDetail:
+		case IProblem.NullityUncheckedTypeAnnotationDetailSuperHint:
+		case IProblem.ReferenceExpressionParameterNullityUnchecked:
 		case IProblem.ReferenceExpressionReturnNullRedefUnchecked:
+		case IProblem.UnsafeNullnessCast:
 			return CompilerOptions.NullUncheckedConversion;
 		case IProblem.RedundantNullAnnotation:
 		case IProblem.RedundantNullDefaultAnnotation:
@@ -550,7 +576,7 @@
 			
 		case IProblem.UnusedTypeParameter:
 			return CompilerOptions.UnusedTypeParameter;
-	}
+}
 	return 0;
 }
 /**
@@ -866,7 +892,7 @@
 		location.sourceEnd);
 }
 public void annotationCircularity(TypeBinding sourceType, TypeBinding otherType, TypeReference reference) {
-	if (sourceType == otherType)
+	if (TypeBinding.equalsEquals(sourceType, otherType))
 		this.handle(
 			IProblem.AnnotationCircularitySelfReference,
 			new String[] {new String(sourceType.readableName())},
@@ -1108,7 +1134,7 @@
 			new String[] {new String(method.selector), typesAsString(method, true)},
 			ProblemSeverities.Error | ProblemSeverities.Abort | ProblemSeverities.Fatal,
 			location.sourceStart,
-			location.sourceEnd);
+			location.diagnosticsSourceEnd());
 }
 public void bytecodeExceeds64KLimit(TypeDeclaration location) {
 	this.handle(
@@ -1343,7 +1369,7 @@
 		NoArgument,
 		NoArgument,
 		target.sourceStart,
-		target.sourceEnd);
+		target.diagnosticsSourceEnd());
 }
 public void illFormedParameterizationOfFunctionalInterface(FunctionalExpression target) {
 	this.handle(
@@ -1351,15 +1377,15 @@
 		NoArgument,
 		NoArgument,
 		target.sourceStart,
-		target.sourceEnd);
+		target.diagnosticsSourceEnd());
 }
 public void lambdaSignatureMismatched(LambdaExpression target) {
 	this.handle(
 		IProblem.lambdaSignatureMismatched,
-		NoArgument,
-		NoArgument,
+		new String[] { new String(target.descriptor.readableName()) },
+		new String[] { new String(target.descriptor.shortReadableName()) },
 		target.sourceStart,
-		target.sourceEnd);
+		target.diagnosticsSourceEnd());
 }
 
 public void lambdaParameterTypeMismatched(Argument argument, TypeReference type, TypeBinding expectedParameterType) {
@@ -1380,7 +1406,7 @@
 			new String[] { selector, new String(sam.declaringClass.readableName())},
 			new String[] { selector, new String(sam.declaringClass.shortReadableName())},
 			lambda.sourceStart,
-			lambda.sourceEnd);
+			lambda.diagnosticsSourceEnd());
 }
 public void caseExpressionMustBeConstant(Expression expression) {
 	this.handle(
@@ -1527,6 +1553,14 @@
 				return ProblemSeverities.Ignore;
 			}
 			break;
+		// For compatibility with javac 8b111 for now.	
+		case IProblem.RepeatableAnnotationWithRepeatingContainerAnnotation:
+		case IProblem.ToleratedMisplacedTypeAnnotations:	
+			return ProblemSeverities.Warning;
+		case IProblem.IllegalUseOfUnderscoreAsAnIdentifier:
+			return this.underScoreIsLambdaParameter ? ProblemSeverities.Error : ProblemSeverities.Warning;
+		case IProblem.LambdaShapeComputationError:
+			return ProblemSeverities.InternalError;
 	}
 	int irritant = getIrritant(problemID);
 	if (irritant != 0) {
@@ -1586,6 +1620,13 @@
 		sourceStart, sourceEnd);
 }
 
+public void defaultModifierIllegallySpecified(int sourceStart, int sourceEnd) {
+	this.handle(
+		IProblem.IllegalDefaultModifierSpecification,
+		NoArgument, NoArgument,
+		sourceStart, sourceEnd);
+}
+
 public void deprecatedField(FieldBinding field, ASTNode location) {
 	int severity = computeSeverity(IProblem.UsingDeprecatedField);
 	if (severity == ProblemSeverities.Ignore) return;
@@ -1692,9 +1733,9 @@
 			node.sourceStart,
 			node.sourceEnd);
 }
-public void duplicateAnnotation(Annotation annotation) {
+public void duplicateAnnotation(Annotation annotation, long sourceLevel) {
 	this.handle(
-		IProblem.DuplicateAnnotation,
+		sourceLevel >= ClassFileConstants.JDK1_8 ? IProblem.DuplicateAnnotationNotMarkedRepeatable : IProblem.DuplicateAnnotation,
 		new String[] {new String(annotation.resolvedType.readableName())},
 		new String[] {new String(annotation.resolvedType.shortReadableName())},
 		annotation.sourceStart,
@@ -1768,7 +1809,7 @@
 }
 
 public void duplicateInheritedMethods(SourceTypeBinding type, MethodBinding inheritedMethod1, MethodBinding inheritedMethod2) {
-	if (inheritedMethod1.declaringClass != inheritedMethod2.declaringClass) {
+	if (TypeBinding.notEquals(inheritedMethod1.declaringClass, inheritedMethod2.declaringClass)) {
 		int problemID = (inheritedMethod1.isDefaultMethod() && inheritedMethod2.isDefaultMethod())
 				? IProblem.DuplicateInheritedDefaultMethods
 				: IProblem.DuplicateInheritedMethods;
@@ -1826,7 +1867,7 @@
 		nodeSourceStart(local, location),
 		nodeSourceEnd(local, location));
 }
-public void duplicateMethodInType(SourceTypeBinding type, AbstractMethodDeclaration methodDecl, boolean equalParameters, int severity) {
+public void duplicateMethodInType(AbstractMethodDeclaration methodDecl, boolean equalParameters, int severity) {
     MethodBinding method = methodDecl.binding;
     if (equalParameters) {
 		this.handle(
@@ -1843,23 +1884,16 @@
 			methodDecl.sourceStart,
 			methodDecl.sourceEnd);
     } else {
-        int length = method.parameters.length;
-        TypeBinding[] erasures = new TypeBinding[length];
-        for (int i = 0; i < length; i++)  {
-            erasures[i] = method.parameters[i].erasure();
-        }
 		this.handle(
 			IProblem.DuplicateMethodErasure,
 			new String[] {
 		        new String(methodDecl.selector),
 				new String(method.declaringClass.readableName()),
-				typesAsString(method, false),
-				typesAsString(method, erasures, false) } ,
+				typesAsString(method, false)},
 			new String[] {
 				new String(methodDecl.selector),
 				new String(method.declaringClass.shortReadableName()),
-				typesAsString(method, true),
-				typesAsString(method, erasures, true) },
+				typesAsString(method, true)},
 			severity,
 			methodDecl.sourceStart,
 			methodDecl.sourceEnd);
@@ -2082,6 +2116,14 @@
 		reference.sourceStart,
 		reference.sourceEnd);
 }
+public void errorNoSuperInInterface(ASTNode reference) {
+	this.handle(
+		IProblem.NoSuperInInterfaceContext,
+		NoArgument,
+		NoArgument,
+		reference.sourceStart,
+		reference.sourceEnd);
+}
 public void expressionShouldBeAVariable(Expression expression) {
 	this.handle(
 		IProblem.ExpressionShouldBeAVariable,
@@ -2111,7 +2153,7 @@
 			&& field.isStatic()
 			&& field.isPrivate()
 			&& field.isFinal()
-			&& TypeBinding.LONG == field.type) {
+			&& TypeBinding.equalsEquals(TypeBinding.LONG, field.type)) {
 		ReferenceBinding referenceBinding = field.declaringClass;
 		if (referenceBinding != null) {
 			if (referenceBinding.findSuperTypeOriginatingFrom(TypeIds.T_JavaIoSerializable, false /*Serializable is not a class*/) != null) {
@@ -2392,7 +2434,7 @@
 		end = reference.sourceEnd;
 	}
 
-	if (sourceType == superType)
+	if (TypeBinding.equalsEquals(sourceType, superType))
 		this.handle(
 			IProblem.HierarchyCircularitySelfReference,
 			new String[] {new String(sourceType.readableName()) },
@@ -2415,7 +2457,7 @@
 	start = reference.sourceStart;
 	end = reference.sourceEnd;
 
-	if (type == superType)
+	if (TypeBinding.equalsEquals(type, superType))
 		this.handle(
 			IProblem.HierarchyCircularitySelfReference,
 			new String[] {new String(type.readableName()) },
@@ -2945,7 +2987,7 @@
 			NoArgument,
 			NoArgument,
 			lexp.sourceStart,
-			lexp.sourceEnd);
+			lexp.diagnosticsSourceEnd());
 }
 public void illegalVisibilityModifierCombinationForField(ReferenceBinding type, FieldDeclaration fieldDecl) {
 	String[] arguments = new String[] {new String(fieldDecl.name)};
@@ -3050,7 +3092,7 @@
 	invalidType(importRef, (TypeBinding)expectedImport);
 }
 public void incompatibleExceptionInThrowsClause(SourceTypeBinding type, MethodBinding currentMethod, MethodBinding inheritedMethod, ReferenceBinding exceptionType) {
-	if (type == currentMethod.declaringClass) {
+	if (TypeBinding.equalsEquals(type, currentMethod.declaringClass)) {
 		int id;
 		if (currentMethod.declaringClass.isInterface()
 				&& !inheritedMethod.isPublic()){ // interface inheriting Object protected method
@@ -3644,6 +3686,21 @@
 				sourceStart,
 				sourceEnd);
 			return;
+		case ProblemReasons.ParameterizedMethodExpectedTypeProblem:
+			// FIXME(stephan): construct suitable message (https://bugs.eclipse.org/404675)
+			problemConstructor = (ProblemMethodBinding) targetConstructor;
+			shownConstructor = problemConstructor.closestMatch;
+			this.handle(
+				IProblem.TypeMismatch,
+				new String[] {
+				        String.valueOf(shownConstructor.returnType.readableName()),
+				        (problemConstructor.returnType != null ? String.valueOf(problemConstructor.returnType.readableName()) : "<unknown>")}, //$NON-NLS-1$
+				new String[] {
+				        String.valueOf(shownConstructor.returnType.shortReadableName()),
+				        (problemConstructor.returnType != null ? String.valueOf(problemConstructor.returnType.shortReadableName()) : "<unknown>")}, //$NON-NLS-1$
+				statement.sourceStart,
+				statement.sourceEnd);
+			return;
 		case ProblemReasons.NoError : // 0
 		default :
 			needImplementation(statement); // want to fail to see why we were here...
@@ -3979,6 +4036,13 @@
 					String parameterTypeNames = typesAsString(problemMethod.parameters, false);
 					String closestParameterTypeShortNames = typesAsString(shownMethod, true);
 					String parameterTypeShortNames = typesAsString(problemMethod.parameters, true);
+					if (closestParameterTypeNames.equals(parameterTypeNames)) {
+						// include null annotations, maybe they show the difference:
+						closestParameterTypeNames = typesAsString(shownMethod, false, true);
+						parameterTypeNames = typesAsString(problemMethod.parameters, false, true);
+						closestParameterTypeShortNames = typesAsString(shownMethod, true, true);
+						parameterTypeShortNames = typesAsString(problemMethod.parameters, true, true);
+					}
 					if (closestParameterTypeShortNames.equals(parameterTypeShortNames)) {
 						closestParameterTypeShortNames = closestParameterTypeNames;
 						parameterTypeShortNames = parameterTypeNames;
@@ -4148,6 +4212,27 @@
 				(int) (messageSend.nameSourcePosition >>> 32),
 				(int) messageSend.nameSourcePosition);
 			return;
+		case ProblemReasons.ParameterizedMethodExpectedTypeProblem:
+			// FIXME(stephan): construct suitable message (https://bugs.eclipse.org/404675)
+			problemMethod = (ProblemMethodBinding) method;
+			InferenceContext18 inferenceContext = problemMethod.inferenceContext;
+			if (inferenceContext != null && inferenceContext.outerContext != null) {
+				// problem relates to a nested inference context, let the outer handle it:
+				inferenceContext.outerContext.addProblemMethod(problemMethod);
+				return;
+			}
+			shownMethod = problemMethod.closestMatch;
+			this.handle(
+				IProblem.TypeMismatch,
+				new String[] {
+				        String.valueOf(shownMethod.returnType.readableName()),
+				        (problemMethod.returnType != null ? String.valueOf(problemMethod.returnType.readableName()) : "<unknown>")}, //$NON-NLS-1$
+				new String[] {
+				        String.valueOf(shownMethod.returnType.shortReadableName()),
+				        (problemMethod.returnType != null ? String.valueOf(problemMethod.returnType.shortReadableName()) : "<unknown>")}, //$NON-NLS-1$
+				messageSend.sourceStart,
+				messageSend.sourceEnd);
+			return;
 		case ProblemReasons.VarargsElementTypeNotVisible: // https://bugs.eclipse.org/bugs/show_bug.cgi?id=346042
 			problemMethod = (ProblemMethodBinding) method;
 			if (problemMethod.closestMatch != null) {
@@ -4171,6 +4256,30 @@
 				(int) (messageSend.nameSourcePosition >>> 32),
 				(int) messageSend.nameSourcePosition);
 			return;
+		case ProblemReasons.ApplicableMethodOverriddenByInapplicable:
+			problemMethod = (ProblemMethodBinding) method;
+			if (problemMethod.closestMatch != null) {
+			    shownMethod = problemMethod.closestMatch.original();
+		    }
+			this.handle(
+				IProblem.ApplicableMethodOverriddenByInapplicable,
+				new String[] {
+				        new String(shownMethod.selector),
+				        typesAsString(shownMethod, false),
+				        new String(shownMethod.declaringClass.readableName()),
+				},
+				new String[] {
+				        new String(shownMethod.selector),
+				        typesAsString(shownMethod, true),
+				        new String(shownMethod.declaringClass.shortReadableName()),
+				},
+				(int) (messageSend.nameSourcePosition >>> 32),
+				(int) messageSend.nameSourcePosition);
+			return;
+		case ProblemReasons.ContradictoryNullAnnotations:
+			problemMethod = (ProblemMethodBinding) method;
+			contradictoryNullAnnotationsInferred(problemMethod.closestMatch, (ASTNode)messageSend);
+			return;
 		case ProblemReasons.NoError : // 0
 		default :
 			needImplementation(messageSend); // want to fail to see why we were here...
@@ -4358,11 +4467,24 @@
 		if (isRecoveredName(arrayTypeReference.token)) return;
 		end = arrayTypeReference.originalSourceEnd;
 	}
+
+	int start = location.sourceStart;
+	if (location instanceof org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleTypeReference) {
+		org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleTypeReference ref =
+				(org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleTypeReference) location;
+		if (ref.annotations != null)
+			start = end - ref.token.length + 1;
+	} else if (location instanceof QualifiedTypeReference) {
+		QualifiedTypeReference ref = (QualifiedTypeReference) location;
+		if (ref.annotations != null)
+			start = (int) (ref.sourcePositions[0] & 0x00000000FFFFFFFFL ) - ref.tokens[0].length + 1;
+	}
+
 	this.handle(
 		id,
 		new String[] {new String(type.leafComponentType().readableName()) },
 		new String[] {new String(type.leafComponentType().shortReadableName())},
-		location.sourceStart,
+		start,
 		end);
 }
 public void invalidTypeForCollection(Expression expression) {
@@ -4498,7 +4620,14 @@
 			annotation.sourceStart,
 			annotation.sourceEnd);
 }
-
+public void toleratedMisplacedTypeAnnotations(Annotation first, Annotation last) {
+	this.handle(
+			IProblem.ToleratedMisplacedTypeAnnotations,
+			NoArgument,
+			NoArgument,
+			first.sourceStart,
+			last.sourceEnd);	
+}
 public void misplacedTypeAnnotations(Annotation first, Annotation last) {
 	this.handle(
 			IProblem.MisplacedTypeAnnotations,
@@ -5523,8 +5652,19 @@
 	Binding binding = null;
 	String[] arguments = null;
 	int start = 0, end = 0;
-
 	Expression location = expr;
+
+	if (expr.resolvedType != null) {
+		long tagBits = expr.resolvedType.tagBits & TagBits.AnnotationNullMASK;
+		if (tagBits == TagBits.AnnotationNonNull) {
+			problemId = IProblem.RedundantNullCheckAgainstNonNullType;
+			arguments = new String[] { String.valueOf(expr.resolvedType.nullAnnotatedReadableName(this.options, true)) };
+			start = nodeSourceStart(location);
+			end = nodeSourceEnd(location);
+			handle(problemId, arguments, arguments, start, end);
+			return true;
+		}
+	}
 	// unwrap uninteresting nodes:
 	while (true) {
 		if (expr instanceof Assignment)
@@ -5556,6 +5696,12 @@
 			char[][] nonNullName = this.options.nonNullAnnotationName;
 			arguments = new String[] { new String(field.name), 
 									   new String(nonNullName[nonNullName.length-1]) };
+		} else {
+			// signaling redundancy based on syntactic analysis:
+			problemId = checkForNull
+					? IProblem.FieldComparisonYieldsFalse
+					: IProblem.RedundantNullCheckOnField;
+			arguments = new String[] { String.valueOf(field.name)};
 		}
 		binding = field;
 		start = nodeSourceStart(binding, location);
@@ -5599,7 +5745,36 @@
 	this.handle(problemId, arguments, arguments, start, end);
 	return true;
 }
+public void nullAnnotationUnsupportedLocation(Annotation annotation) {
+	String[] arguments = new String[] {
+		String.valueOf(annotation.resolvedType.readableName())
+	};
+	String[] shortArguments = new String[] {
+		String.valueOf(annotation.resolvedType.shortReadableName())
+	};
+	handle(IProblem.NullAnnotationUnsupportedLocation,
+		arguments, shortArguments, annotation.sourceStart, annotation.sourceEnd);
+}
+public void nullAnnotationUnsupportedLocation(TypeReference type) {
+	int sourceEnd = type.sourceEnd;
+	if (type instanceof ParameterizedSingleTypeReference) {
+		ParameterizedSingleTypeReference typeReference = (ParameterizedSingleTypeReference) type;
+		TypeReference[] typeArguments = typeReference.typeArguments;
+		if (typeArguments[typeArguments.length - 1].sourceEnd > typeReference.sourceEnd) {
+			sourceEnd = retrieveClosingAngleBracketPosition(typeReference.sourceEnd);
+		} else {
+			sourceEnd = type.sourceEnd;
+		}
+	} else if (type instanceof ParameterizedQualifiedTypeReference) {
+		ParameterizedQualifiedTypeReference typeReference = (ParameterizedQualifiedTypeReference) type;
+		sourceEnd = retrieveClosingAngleBracketPosition(typeReference.sourceEnd);
+	} else {
+		sourceEnd = type.sourceEnd;
+	}
 
+	handle(IProblem.NullAnnotationUnsupportedLocationAtType,
+		NoArgument, NoArgument, type.sourceStart, sourceEnd);
+}
 public void localVariableNullInstanceof(LocalVariableBinding local, ASTNode location) {
 	int severity = computeSeverity(IProblem.NullLocalVariableInstanceofYieldsFalse);
 	if (severity == ProblemSeverities.Ignore) return;
@@ -5635,6 +5810,10 @@
 		potentialNullUnboxing(location, local.type);
 		return;
 	}
+	if ((local.type.tagBits & TagBits.AnnotationNullable) != 0 && location instanceof Expression) {
+		dereferencingNullableExpression((Expression) location);
+		return;
+	}
 	int severity = computeSeverity(IProblem.PotentialNullLocalVariableReference);
 	if (severity == ProblemSeverities.Ignore) return;
 	String[] arguments = new String[] {new String(local.name)};
@@ -5656,16 +5835,15 @@
 	String[] argumentsShort = new String[] { String.valueOf(boxType.shortReadableName()) };
 	this.handle(IProblem.NullUnboxing, arguments, argumentsShort, expression.sourceStart, expression.sourceEnd);
 }
-public void nullableFieldDereference(VariableBinding variable, long position) {
-	String[] arguments = new String[] {new String(variable.name)};
+public void nullableFieldDereference(FieldBinding variable, long position) {
 	char[][] nullableName = this.options.nullableAnnotationName;
-		arguments = new String[] {new String(variable.name), new String(nullableName[nullableName.length-1])};
+	String[] arguments = new String[] {new String(variable.name), new String(nullableName[nullableName.length-1])};
 	this.handle(
 		IProblem.NullableFieldReference,
 		arguments,
 		arguments,
 		(int)(position >>> 32),
-		(int)(position));
+		(int)position);
 }
 
 public void localVariableRedundantCheckOnNonNull(LocalVariableBinding local, ASTNode location) {
@@ -6008,7 +6186,26 @@
 			start,
 			end);
 }
-
+public void missingTypeInLambda(LambdaExpression lambda, MethodBinding method) {
+	int nameSourceStart = lambda.sourceStart();
+	int nameSourceEnd = lambda.diagnosticsSourceEnd();
+	List missingTypes = method.collectMissingTypes(null);
+	if (missingTypes == null) {
+		System.err.println("The lambda expression " + method + " is wrongly tagged as containing missing types"); //$NON-NLS-1$ //$NON-NLS-2$
+		return;
+	}
+	TypeBinding missingType = (TypeBinding) missingTypes.get(0);
+	this.handle(
+			IProblem.MissingTypeInLambda,
+			new String[] {
+			        new String(missingType.readableName()),
+			},
+			new String[] {
+			        new String(missingType.shortReadableName()),
+			},
+			nameSourceStart,
+			nameSourceEnd);
+}
 public void missingTypeInMethod(ASTNode astNode, MethodBinding method) {
 	int nameSourceStart, nameSourceEnd;
 	if (astNode instanceof MessageSend) {
@@ -6144,6 +6341,14 @@
 		boundReference.sourceStart,
 		boundReference.sourceEnd);
 }
+private int nodeSourceEnd(ASTNode node) {
+	if (node instanceof Reference) {
+		Binding field = ((Reference) node).lastFieldBinding();
+		if (field != null)
+			return nodeSourceEnd(field, node);
+	}
+	return node.sourceEnd;
+}
 private int nodeSourceEnd(Binding field, ASTNode node) {
 	return nodeSourceEnd(field, node, 0);
 }
@@ -6200,6 +6405,14 @@
 	}
 	return node.sourceEnd;
 }
+private int nodeSourceStart(ASTNode node) {
+	if (node instanceof Reference) {
+		Binding field = ((Reference) node).lastFieldBinding();
+		if (field != null)
+			return nodeSourceStart(field, node);
+	}
+	return node.sourceStart;
+}
 private int nodeSourceStart(Binding field, ASTNode node) {
 	return nodeSourceStart(field, node, 0);
 }
@@ -6558,13 +6771,13 @@
 }
 private String parameterBoundAsString(TypeVariableBinding typeVariable, boolean makeShort) {
     StringBuffer nameBuffer = new StringBuffer(10);
-    if (typeVariable.firstBound == typeVariable.superclass) {
+    if (TypeBinding.equalsEquals(typeVariable.firstBound, typeVariable.superclass)) {
         nameBuffer.append(makeShort ? typeVariable.superclass.shortReadableName() : typeVariable.superclass.readableName());
     }
     int length;
     if ((length = typeVariable.superInterfaces.length) > 0) {
 	    for (int i = 0; i < length; i++) {
-	        if (i > 0 || typeVariable.firstBound == typeVariable.superclass) nameBuffer.append(" & "); //$NON-NLS-1$
+	        if (i > 0 || TypeBinding.equalsEquals(typeVariable.firstBound, typeVariable.superclass)) nameBuffer.append(" & "); //$NON-NLS-1$
 	        nameBuffer.append(makeShort ? typeVariable.superInterfaces[i].shortReadableName() : typeVariable.superInterfaces[i].readableName());
 	    }
 	}
@@ -6978,6 +7191,82 @@
 		arrayRef.sourceStart,
 		arrayRef.sourceEnd);
 }
+public void repeatedAnnotationWithContainer(Annotation annotation, Annotation container) {
+	this.handle(
+		IProblem.RepeatedAnnotationWithContainerAnnotation,
+		new String[] {new String(annotation.resolvedType.readableName()), new String(container.resolvedType.readableName())},
+		new String[] {new String(annotation.resolvedType.shortReadableName()), new String(container.resolvedType.shortReadableName())},
+		annotation.sourceStart,
+		annotation.sourceEnd);
+}
+public void containerAnnotationTypeMustHaveValue(ASTNode markerNode, ReferenceBinding containerAnnotationType) {
+	this.handle(
+		IProblem.ContainerAnnotationTypeMustHaveValue,
+		new String[] {new String(containerAnnotationType.readableName())},
+		new String[] {new String(containerAnnotationType.shortReadableName())},
+		markerNode.sourceStart,
+		markerNode.sourceEnd);
+}
+public void containerAnnotationTypeHasWrongValueType(ASTNode markerNode, ReferenceBinding containerAnnotationType, ReferenceBinding annotationType, TypeBinding returnType) {
+	this.handle(
+		IProblem.ContainerAnnotationTypeHasWrongValueType,
+		new String[] {new String(containerAnnotationType.readableName()), new String(annotationType.readableName()), new String(returnType.readableName())},
+		new String[] {new String(containerAnnotationType.shortReadableName()), new String(annotationType.shortReadableName()), new String(returnType.shortReadableName())},
+		markerNode.sourceStart,
+		markerNode.sourceEnd);
+}
+public void containerAnnotationTypeHasNonDefaultMembers(ASTNode markerNode, ReferenceBinding containerAnnotationType, char[] selector) {
+	this.handle(
+		IProblem.ContainerAnnotationTypeHasNonDefaultMembers,
+		new String[] {new String(containerAnnotationType.readableName()), new String(selector)},
+		new String[] {new String(containerAnnotationType.shortReadableName()), new String(selector)},
+		markerNode.sourceStart,
+		markerNode.sourceEnd);
+}
+public void containerAnnotationTypeHasShorterRetention(ASTNode markerNode, ReferenceBinding annotationType, String annotationRetention, ReferenceBinding containerAnnotationType, String containerRetention) {
+	this.handle(
+		IProblem.ContainerAnnotationTypeHasShorterRetention,
+		new String[] {new String(annotationType.readableName()), annotationRetention, new String(containerAnnotationType.readableName()), containerRetention},
+		new String[] {new String(annotationType.shortReadableName()), annotationRetention, new String(containerAnnotationType.shortReadableName()), containerRetention},
+		markerNode.sourceStart,
+		markerNode.sourceEnd);
+}
+public void repeatableAnnotationTypeTargetMismatch(ASTNode markerNode, ReferenceBinding annotationType, ReferenceBinding containerAnnotationType, String unmetTargets) {
+	this.handle(
+		IProblem.RepeatableAnnotationTypeTargetMismatch,
+		new String[] {new String(annotationType.readableName()), new String(containerAnnotationType.readableName()), unmetTargets},
+		new String[] {new String(annotationType.shortReadableName()), new String(containerAnnotationType.shortReadableName()), unmetTargets},
+		markerNode.sourceStart,
+		markerNode.sourceEnd);
+}
+
+public void repeatableAnnotationTypeIsDocumented(ASTNode markerNode, ReferenceBinding annotationType, ReferenceBinding containerAnnotationType) {
+	this.handle(
+		IProblem.RepeatableAnnotationTypeIsDocumented,
+		new String[] {new String(annotationType.readableName()), new String(containerAnnotationType.readableName())},
+		new String[] {new String(annotationType.shortReadableName()), new String(containerAnnotationType.shortReadableName())},
+		markerNode.sourceStart,
+		markerNode.sourceEnd);
+}
+
+public void repeatableAnnotationTypeIsInherited(ASTNode markerNode, ReferenceBinding annotationType, ReferenceBinding containerAnnotationType) {
+	this.handle(
+		IProblem.RepeatableAnnotationTypeIsInherited,
+		new String[] {new String(annotationType.readableName()), new String(containerAnnotationType.readableName())},
+		new String[] {new String(annotationType.shortReadableName()), new String(containerAnnotationType.shortReadableName())},
+		markerNode.sourceStart,
+		markerNode.sourceEnd);
+}
+
+public void repeatableAnnotationWithRepeatingContainer(Annotation annotation, ReferenceBinding containerType) {
+	this.handle(
+		IProblem.RepeatableAnnotationWithRepeatingContainerAnnotation,
+		new String[] {new String(annotation.resolvedType.readableName()), new String(containerType.readableName())},
+		new String[] {new String(annotation.resolvedType.shortReadableName()), new String(containerType.shortReadableName())},
+		annotation.sourceStart,
+		annotation.sourceEnd);
+}
+
 public void reset() {
 	this.positionScanner = null;
 }
@@ -7174,12 +7463,19 @@
 		type.sourceEnd());
 }
 public void shouldReturn(TypeBinding returnType, ASTNode location) {
+	int sourceStart = location.sourceStart;
+	int sourceEnd = location.sourceEnd;
+	if (location instanceof LambdaExpression) {
+		LambdaExpression exp = (LambdaExpression) location;
+		sourceStart = exp.sourceStart;
+		sourceEnd = exp.diagnosticsSourceEnd();
+	}
 	this.handle(
 		methodHasMissingSwitchDefault() ? IProblem.ShouldReturnValueHintMissingDefault : IProblem.ShouldReturnValue,
 		new String[] { new String (returnType.readableName())},
 		new String[] { new String (returnType.shortReadableName())},
-		location.sourceStart,
-		location.sourceEnd);
+		sourceStart,
+		sourceEnd);
 }
 
 public void signalNoImplicitStringConversionForCharArrayExpression(Expression expression) {
@@ -7530,15 +7826,26 @@
 				expectingLocation.sourceEnd);
 			return;
 	}
+
 	char[] actualShortReadableName = actualType.shortReadableName();
 	char[] expectedShortReadableName = expectedType.shortReadableName();
+	char[] actualReadableName = actualType.readableName();
+	char[] expectedReadableName = expectedType.readableName();
 	if (CharOperation.equals(actualShortReadableName, expectedShortReadableName)) {
-		actualShortReadableName = actualType.readableName();
-		expectedShortReadableName = expectedType.readableName();
+		if (CharOperation.equals(actualReadableName, expectedReadableName)) {
+			// if full type names are equal, assume the incompatibility is due to mismatching null annotations:
+			actualReadableName = actualType.nullAnnotatedReadableName(this.options, false);
+			expectedReadableName = expectedType.nullAnnotatedReadableName(this.options, false);
+			actualShortReadableName = actualType.nullAnnotatedReadableName(this.options, true);
+			expectedShortReadableName = expectedType.nullAnnotatedReadableName(this.options, true);
+		} else {
+			actualShortReadableName = actualReadableName;
+			expectedShortReadableName = expectedReadableName;
+		}
 	}
 	this.handle(
-		IProblem.TypeMismatch,
-		new String[] {new String(actualType.readableName()), new String(expectedType.readableName())},
+		expectingLocation instanceof ReturnStatement ? IProblem.ReturnTypeMismatch : IProblem.TypeMismatch,
+		new String[] {new String(actualReadableName), new String(expectedReadableName)},
 		new String[] {new String(actualShortReadableName), new String(expectedShortReadableName)},
 		location.sourceStart,
 		location.sourceEnd);
@@ -7565,6 +7872,12 @@
 	return typesAsString(methodBinding, methodBinding.parameters, makeShort);
 }
 private String typesAsString(MethodBinding methodBinding, TypeBinding[] parameters, boolean makeShort) {
+	return typesAsString(methodBinding, parameters, makeShort, false);
+}
+private String typesAsString(MethodBinding methodBinding, boolean makeShort, boolean showNullAnnotations) {
+	return typesAsString(methodBinding, methodBinding.parameters, makeShort, showNullAnnotations);
+}
+private String typesAsString(MethodBinding methodBinding, TypeBinding[] parameters, boolean makeShort, boolean showNullAnnotations) {
 	if (methodBinding.isPolymorphic()) {
 		// get the original polymorphicMethod method
 		TypeBinding[] types = methodBinding.original().parameters;
@@ -7578,7 +7891,10 @@
 			if (isVarargType) {
 				type = ((ArrayBinding)type).elementsType();
 			}
-			buffer.append(new String(makeShort ? type.shortReadableName() : type.readableName()));
+			if (showNullAnnotations)
+				buffer.append(new String(type.nullAnnotatedReadableName(this.options, makeShort)));
+			else
+				buffer.append(new String(makeShort ? type.shortReadableName() : type.readableName()));
 			if (isVarargType) {
 				buffer.append("..."); //$NON-NLS-1$
 			}
@@ -7595,7 +7911,10 @@
 		if (isVarargType) {
 			type = ((ArrayBinding)type).elementsType();
 		}
-		buffer.append(new String(makeShort ? type.shortReadableName() : type.readableName()));
+		if (showNullAnnotations)
+			buffer.append(new String(type.nullAnnotatedReadableName(this.options, makeShort)));
+		else
+			buffer.append(new String(makeShort ? type.shortReadableName() : type.readableName()));
 		if (isVarargType) {
 			buffer.append("..."); //$NON-NLS-1$
 		}
@@ -7603,13 +7922,19 @@
 	return buffer.toString();
 }
 private String typesAsString(TypeBinding[] types, boolean makeShort) {
+	return typesAsString(types, makeShort, false);
+}
+private String typesAsString(TypeBinding[] types, boolean makeShort, boolean showNullAnnotations) {
 	StringBuffer buffer = new StringBuffer(10);
 	for (int i = 0, length = types.length; i < length; i++) {
 		if (i != 0) {
 			buffer.append(", "); //$NON-NLS-1$
 		}
 		TypeBinding type = types[i];
-		buffer.append(new String(makeShort ? type.shortReadableName() : type.readableName()));
+		if (showNullAnnotations)
+			buffer.append(new String(type.nullAnnotatedReadableName(this.options, makeShort)));
+		else
+			buffer.append(new String(makeShort ? type.shortReadableName() : type.readableName()));
 	}
 	return buffer.toString();
 }
@@ -7770,6 +8095,8 @@
 		compilationResult);
 }
 public void unnecessaryCast(CastExpression castExpression) {
+	if (castExpression.expression instanceof FunctionalExpression)
+		return;
 	int severity = computeSeverity(IProblem.UnnecessaryCast);
 	if (severity == ProblemSeverities.Ignore) return;
 	TypeBinding castedExpressionType = castExpression.expression.resolvedType;
@@ -7946,6 +8273,22 @@
 		castExpression.sourceStart,
 		castExpression.sourceEnd);
 }
+public void unsafeNullnessCast(CastExpression castExpression, Scope scope) {
+	TypeBinding castedExpressionType = castExpression.expression.resolvedType;
+	TypeBinding castExpressionResolvedType = castExpression.resolvedType;
+	this.handle(
+		IProblem.UnsafeNullnessCast,
+		new String[]{
+			new String(castedExpressionType.nullAnnotatedReadableName(this.options, false)),
+			new String(castExpressionResolvedType.nullAnnotatedReadableName(this.options, false))
+		},
+		new String[]{
+			new String(castedExpressionType.nullAnnotatedReadableName(this.options, true)),
+			new String(castExpressionResolvedType.nullAnnotatedReadableName(this.options, true))
+		},
+		castExpression.sourceStart,
+		castExpression.sourceEnd);
+}
 public void unsafeGenericArrayForVarargs(TypeBinding leafComponentType, ASTNode location) {
 	int severity = computeSeverity(IProblem.UnsafeGenericArrayForVarargs);
 	if (severity == ProblemSeverities.Ignore) return;
@@ -8063,7 +8406,7 @@
 	if (severity == ProblemSeverities.Ignore) return;
 	int start = type.sourceStart();
 	int end = type.sourceEnd();
-	if (currentMethod.declaringClass == type) {
+	if (TypeBinding.equalsEquals(currentMethod.declaringClass, type)) {
 		ASTNode location = ((MethodDeclaration) currentMethod.sourceMethod()).returnType;
 		start = location.sourceStart();
 		end = location.sourceEnd();
@@ -8250,7 +8593,7 @@
 	if (CharOperation.equals(TypeConstants.SERIALVERSIONUID, field.name)
 			&& field.isStatic()
 			&& field.isFinal()
-			&& TypeBinding.LONG == field.type) {
+			&& TypeBinding.equalsEquals(TypeBinding.LONG, field.type)) {
 		ReferenceBinding referenceBinding = field.declaringClass;
 		if (referenceBinding != null) {
 			if (referenceBinding.findSuperTypeOriginatingFrom(TypeIds.T_JavaIoSerializable, false /*Serializable is not a class*/) != null) {
@@ -8434,13 +8777,18 @@
 		sourceStart,
 		sourceEnd);
 }
-public void illegalUseOfUnderscoreAsAnIdentifier(int sourceStart, int sourceEnd) {
-	this.handle(
-		IProblem.IllegalUseOfUnderscoreAsAnIdentifier,
-		NoArgument,
-		NoArgument,
-		sourceStart,
-		sourceEnd);
+public void illegalUseOfUnderscoreAsAnIdentifier(int sourceStart, int sourceEnd, boolean lambdaParameter) {
+	this.underScoreIsLambdaParameter = lambdaParameter;
+	try {
+		this.handle(
+			IProblem.IllegalUseOfUnderscoreAsAnIdentifier,
+			NoArgument,
+			NoArgument,
+			sourceStart,
+			sourceEnd);
+	} finally {
+		this.underScoreIsLambdaParameter = false;	
+	}
 }
 public void varargsArgumentNeedCast(MethodBinding method, TypeBinding argumentType, InvocationSite location) {
 	int severity = this.options.getSeverity(CompilerOptions.VarargsArgumentNeedCast);
@@ -8506,8 +8854,8 @@
 		        typesAsString(method2, true),
 		        new String(method2.declaringClass.shortReadableName())
 		},
-		method1.declaringClass == type ? method1.sourceStart() : type.sourceStart(),
-		method1.declaringClass == type ? method1.sourceEnd() : type.sourceEnd());
+		TypeBinding.equalsEquals(method1.declaringClass, type) ? method1.sourceStart() : type.sourceStart(),
+		TypeBinding.equalsEquals(method1.declaringClass, type) ? method1.sourceEnd() : type.sourceEnd());
 }
 public void safeVarargsOnFixedArityMethod(MethodBinding method) {
 	String [] arguments = new String[] { new String(method.isConstructor() ? method.declaringClass.shortReadableName() : method.selector)}; 
@@ -8688,6 +9036,14 @@
 			typeArguments[0].sourceStart, 
 			typeArguments[typeArguments.length - 1].sourceEnd);
 }
+public void rawConstructorReferenceNotWithExplicitTypeArguments(TypeReference[] typeArguments) {
+	this.handle(
+			IProblem.IllegalTypeArgumentsInRawConstructorReference,
+			NoArgument,
+			NoArgument,
+			typeArguments[0].sourceStart, 
+			typeArguments[typeArguments.length - 1].sourceEnd);
+}
 public void diamondNotWithAnoymousClasses(TypeReference type) {
 	this.handle(
 			IProblem.CannotUseDiamondWithAnonymousClasses,
@@ -8706,6 +9062,7 @@
 			blockEnd);
 }
 // End AspectJ Extension
+
 public void redundantSpecificationOfTypeArguments(ASTNode location, TypeBinding[] argumentTypes) {
 	int severity = computeSeverity(IProblem.RedundantSpecificationOfTypeArguments);
 	if (severity != ProblemSeverities.Ignore) {
@@ -8773,9 +9130,15 @@
 
 public void nullityMismatch(Expression expression, TypeBinding providedType, TypeBinding requiredType, int nullStatus, char[][] annotationName) {
 	if ((nullStatus & FlowInfo.NULL) != 0) {
-		nullityMismatchIsNull(expression, requiredType, annotationName);
+		nullityMismatchIsNull(expression, requiredType);
 		return;
 	}
+	if (expression instanceof MessageSend) {
+		if ((((MessageSend) expression).binding.tagBits & TagBits.AnnotationNullable) != 0) {
+			nullityMismatchSpecdNullable(expression, requiredType, this.options.nonNullAnnotationName);
+			return;
+		}
+	}
 	if ((nullStatus & FlowInfo.POTENTIALLY_NULL) != 0) {
 		VariableBinding var = expression.localVariableBinding();
 		if (var == null && expression instanceof Reference) {
@@ -8788,16 +9151,27 @@
 		nullityMismatchPotentiallyNull(expression, requiredType, annotationName);
 		return;
 	}
-	nullityMismatchIsUnknown(expression, providedType, requiredType, annotationName);
+	if (this.options.sourceLevel < ClassFileConstants.JDK1_8)
+		nullityMismatchIsUnknown(expression, providedType, requiredType, annotationName);
+	else
+		nullityMismatchingTypeAnnotation(expression, providedType, requiredType, NullAnnotationMatching.NULL_ANNOTATIONS_UNCHECKED);
 }
-public void nullityMismatchIsNull(Expression expression, TypeBinding requiredType, char[][] annotationName) {
+public void nullityMismatchIsNull(Expression expression, TypeBinding requiredType) {
+	if (requiredType instanceof CaptureBinding) {
+		CaptureBinding capture = (CaptureBinding) requiredType;
+		if (capture.wildcard != null)
+			requiredType = capture.wildcard;
+	}
 	int problemId = IProblem.RequiredNonNullButProvidedNull;
-	String[] arguments = new String[] {
-			annotatedTypeName(requiredType, annotationName)
-	};
-	String[] argumentsShort = new String[] {
-			shortAnnotatedTypeName(requiredType, annotationName)
-	};
+	String[] arguments;
+	String[] argumentsShort;
+	if (this.options.sourceLevel < ClassFileConstants.JDK1_8) {
+		arguments      = new String[] { annotatedTypeName(requiredType, this.options.nonNullAnnotationName) };
+		argumentsShort = new String[] { shortAnnotatedTypeName(requiredType, this.options.nonNullAnnotationName) };
+	} else {
+		arguments      = new String[] { new String(requiredType.nullAnnotatedReadableName(this.options, false)) };
+		argumentsShort = new String[] { new String(requiredType.nullAnnotatedReadableName(this.options, true)) };
+	}
 	this.handle(problemId, arguments, argumentsShort, expression.sourceStart, expression.sourceEnd);
 }
 public void nullityMismatchSpecdNullable(Expression expression, TypeBinding requiredType, char[][] annotationName) {
@@ -8917,15 +9291,8 @@
 		sourceStart,
 		methodDecl.returnType.sourceEnd);
 }
-public void parameterLackingNullableAnnotation(ReferenceExpression location, MethodBinding descriptorMethod, int idx,
-				char[][] providedAnnotationName, char/*@Nullable*/[][] requiredAnnotationName, TypeBinding requiredType) {
-	StringBuffer requiredPrefix = new StringBuffer(); 
-	StringBuffer requiredShortPrefix = new StringBuffer(); 
-	if (requiredAnnotationName != null) {
-		requiredPrefix.append('@').append(CharOperation.toString(requiredAnnotationName)).append(' ');
-		requiredShortPrefix.append('@').append(requiredAnnotationName[requiredAnnotationName.length-1]).append(' ');
-	}
-	TypeBinding provided = descriptorMethod.parameters[idx];
+public void referenceExpressionArgumentNullityMismatch(ReferenceExpression location, TypeBinding requiredType, TypeBinding providedType,
+		MethodBinding descriptorMethod, int idx, NullAnnotationMatching status) {
 	StringBuffer methodSignature = new StringBuffer();
 	methodSignature
 		.append(descriptorMethod.declaringClass.readableName())
@@ -8937,42 +9304,18 @@
 		.append('.')
 		.append(descriptorMethod.shortReadableName());
 	this.handle(
-			IProblem.ReferenceExpressionParameterMismatchPromisedNullable, 
+			status.isUnchecked() ? IProblem.ReferenceExpressionParameterNullityUnchecked : IProblem.ReferenceExpressionParameterNullityMismatch,
 			new String[] { String.valueOf(idx+1), 
-							requiredPrefix.toString(), String.valueOf(requiredType.readableName()),
-							CharOperation.toString(providedAnnotationName), String.valueOf(provided.readableName()),
+							String.valueOf(requiredType.nullAnnotatedReadableName(this.options, false)),
+							String.valueOf(providedType.nullAnnotatedReadableName(this.options, false)),
 							methodSignature.toString() },
 			new String[] { String.valueOf(idx+1), 
-							requiredShortPrefix.toString(), String.valueOf(requiredType.shortReadableName()),
-							String.valueOf(providedAnnotationName[providedAnnotationName.length-1]), String.valueOf(provided.shortReadableName()),
+							String.valueOf(requiredType.nullAnnotatedReadableName(this.options, true)),
+							String.valueOf(providedType.nullAnnotatedReadableName(this.options, true)),
 							shortSignature.toString() },
 			location.sourceStart,
 			location.sourceEnd);
 }
-public void parameterRequiresNonnull(ReferenceExpression location, MethodBinding descriptorMethod, int idx,
-				char[][] nonNullAnnotationName, TypeBinding requiredType) {
-	StringBuffer methodSignature = new StringBuffer();
-	methodSignature
-		.append(descriptorMethod.declaringClass.readableName())
-		.append('.')
-		.append(descriptorMethod.readableName());
-
-	StringBuffer shortSignature = new StringBuffer();
-	shortSignature
-		.append(descriptorMethod.declaringClass.shortReadableName())
-		.append('.')
-		.append(descriptorMethod.shortReadableName());
-	this.handle(
-		IProblem.ReferenceExpressionParameterRequiredNonnullUnchecked, 
-		new String[] { String.valueOf(idx+1),
-					methodSignature.toString(),
-					CharOperation.toString(nonNullAnnotationName), String.valueOf(requiredType.readableName()) },
-		new String[] { String.valueOf(idx+1),
-					shortSignature.toString(),
-					String.valueOf(nonNullAnnotationName[nonNullAnnotationName.length-1]), String.valueOf(requiredType.shortReadableName()) },
-		location.sourceStart,
-		location.sourceEnd);
-}
 public void illegalReturnRedefinition(ASTNode location, MethodBinding descriptorMethod,
 			char[][] nonNullAnnotationName, 
 			char/*@Nullable*/[][] providedAnnotationName, TypeBinding providedType) {
@@ -9038,19 +9381,27 @@
 		location.sourceEnd);
 }
 
-public void cannotImplementIncompatibleNullness(MethodBinding currentMethod, MethodBinding inheritedMethod) {
+public void cannotImplementIncompatibleNullness(MethodBinding currentMethod, MethodBinding inheritedMethod, boolean showReturn) {
 	int sourceStart = 0, sourceEnd = 0;
 	if (this.referenceContext instanceof TypeDeclaration) {
 		sourceStart = ((TypeDeclaration) this.referenceContext).sourceStart;
 		sourceEnd =   ((TypeDeclaration) this.referenceContext).sourceEnd;
 	}
 	String[] problemArguments = {
-			new String(currentMethod.readableName()),
+			showReturn 
+				? new String(currentMethod.returnType.nullAnnotatedReadableName(this.options, false))+' '
+				: "", //$NON-NLS-1$
+			new String(currentMethod.selector),
+			typesAsString(currentMethod, false, true),
 			new String(currentMethod.declaringClass.readableName()),
 			new String(inheritedMethod.declaringClass.readableName())
 		};
 	String[] messageArguments = {
-			new String(currentMethod.shortReadableName()),
+			showReturn 
+				? new String(currentMethod.returnType.nullAnnotatedReadableName(this.options, true))+' '
+				: "", //$NON-NLS-1$
+			new String(currentMethod.selector),
+			typesAsString(currentMethod, true, true),
 			new String(currentMethod.declaringClass.shortReadableName()),
 			new String(inheritedMethod.declaringClass.shortReadableName())
 		};
@@ -9105,7 +9456,19 @@
 	this.handle(problemId, args, shortArgs, start, end);
 }
 
+public void nonNullDefaultDetailNotEvaluated(ASTNode location) {
+	this.handle(IProblem.NonNullDefaultDetailIsNotEvaluated, NoArgument, NoArgument, ProblemSeverities.Warning, location.sourceStart, location.sourceEnd);
+}
+
 public void contradictoryNullAnnotations(Annotation annotation) {
+	contradictoryNullAnnotations(annotation.sourceStart, annotation.sourceEnd);
+}
+
+public void contradictoryNullAnnotations(Annotation[] annotations) {
+	contradictoryNullAnnotations(annotations[0].sourceStart, annotations[annotations.length-1].sourceEnd);
+}
+
+public void contradictoryNullAnnotations(int sourceStart, int sourceEnd) {
 	// when this error is triggered we can safely assume that both annotations have been configured
 	char[][] nonNullAnnotationName = this.options.nonNullAnnotationName;
 	char[][] nullableAnnotationName = this.options.nullableAnnotationName;
@@ -9117,7 +9480,45 @@
 			new String(nonNullAnnotationName[nonNullAnnotationName.length-1]),
 			new String(nullableAnnotationName[nullableAnnotationName.length-1])
 		};
-	this.handle(IProblem.ContradictoryNullAnnotations, arguments, shortArguments, annotation.sourceStart, annotation.sourceEnd);
+	this.handle(IProblem.ContradictoryNullAnnotations, arguments, shortArguments, sourceStart, sourceEnd);
+}
+
+public void contradictoryNullAnnotationsInferred(MethodBinding inferredMethod, ASTNode location) {
+	contradictoryNullAnnotationsInferred(inferredMethod, location.sourceStart, location.sourceEnd);
+}
+public void contradictoryNullAnnotationsInferred(MethodBinding inferredMethod, InvocationSite location) {
+	contradictoryNullAnnotationsInferred(inferredMethod, location.sourceStart(), location.sourceEnd());
+}
+public void contradictoryNullAnnotationsInferred(MethodBinding inferredMethod, int sourceStart, int sourceEnd) {
+	// when this error is triggered we can safely assume that both annotations have been configured
+	char[][] nonNullAnnotationName = this.options.nonNullAnnotationName;
+	char[][] nullableAnnotationName = this.options.nullableAnnotationName;
+	String[] arguments = {
+		new String(CharOperation.concatWith(nonNullAnnotationName, '.')),
+		new String(CharOperation.concatWith(nullableAnnotationName, '.')),
+		new String(inferredMethod.returnType.nullAnnotatedReadableName(this.options, false)),
+		new String(inferredMethod.selector),
+		typesAsString(inferredMethod, false, true)
+	};
+	String[] shortArguments = {
+			new String(nonNullAnnotationName[nonNullAnnotationName.length-1]),
+			new String(nullableAnnotationName[nullableAnnotationName.length-1]),
+			new String(inferredMethod.returnType.nullAnnotatedReadableName(this.options, true)),
+			new String(inferredMethod.selector),
+			typesAsString(inferredMethod, true, true)
+		};
+	this.handle(IProblem.ContradictoryNullAnnotationsInferred, arguments, shortArguments, sourceStart, sourceEnd);
+}
+
+public void contradictoryNullAnnotationsOnBounds(Annotation annotation, long previousTagBit) {
+	char[][] annotationName = previousTagBit == TagBits.AnnotationNonNull ? this.options.nonNullAnnotationName : this.options.nullableAnnotationName;
+	String[] arguments = {
+		new String(CharOperation.concatWith(annotationName, '.')),
+	};
+	String[] shortArguments = {
+		new String(annotationName[annotationName.length-1]),
+	};
+	this.handle(IProblem.ContradictoryNullAnnotationsOnBound, arguments, shortArguments, annotation.sourceStart, annotation.sourceEnd);
 }
 
 // conflict default <-> inherited
@@ -9158,37 +9559,49 @@
 	this.handle(IProblem.ConflictingInheritedNullAnnotations, arguments, shortArguments, location.sourceStart, location.sourceEnd);
 }
 
-public void illegalAnnotationForBaseType(TypeReference type, Annotation[] annotations, char[] annotationName, long nullAnnotationTagBit)
+public void illegalAnnotationForBaseType(TypeReference type, Annotation[] annotations, long nullAnnotationTagBit)
 {
 	int typeId = (nullAnnotationTagBit == TagBits.AnnotationNullable) 
 			? TypeIds.T_ConfiguredAnnotationNullable : TypeIds.T_ConfiguredAnnotationNonNull;
-	String[] args = new String[] { new String(annotationName), new String(type.getLastToken()) };
+	char[][] annotationNames = (nullAnnotationTagBit == TagBits.AnnotationNonNull)
+			? this.options.nonNullAnnotationName
+			: this.options.nullableAnnotationName;
+	String[] args = new String[] { new String(annotationNames[annotationNames.length-1]), new String(type.getLastToken()) };
 	Annotation annotation = findAnnotation(annotations, typeId);
 	int start = annotation != null ? annotation.sourceStart : type.sourceStart;
+	int end = annotation != null ? annotation.sourceEnd : type.sourceEnd;
 	this.handle(IProblem.IllegalAnnotationForBaseType,
 			args,
 			args,
 			start,
-			type.sourceEnd);
+			end);
+}
+
+public void illegalAnnotationForBaseType(Annotation annotation, TypeBinding type)
+{
+	String[] args = new String[] {
+		new String(annotation.resolvedType.shortReadableName()),
+		new String(type.readableName())
+	};
+	this.handle(IProblem.IllegalAnnotationForBaseType,
+			args,
+			args,
+			annotation.sourceStart,
+			annotation.sourceEnd);
 }
 
 private String annotatedTypeName(TypeBinding type, char[][] annotationName) {
+	if ((type.tagBits & TagBits.AnnotationNullMASK) != 0)
+		return String.valueOf(type.nullAnnotatedReadableName(this.options, false));
 	int dims = 0;
-	if (type instanceof ArrayBinding && ((ArrayBinding)type).nullTagBitsPerDimension != null) {
-		dims = type.dimensions();
-		type = type.leafComponentType();
-	}
 	char[] typeName = type.readableName();
 	char[] annotationDisplayName = CharOperation.concatWith(annotationName, '.');
 	return internalAnnotatedTypeName(annotationDisplayName, typeName, dims);
 }
 private String shortAnnotatedTypeName(TypeBinding type, char[][] annotationName) {
+	if ((type.tagBits & TagBits.AnnotationNullMASK) != 0)
+		return String.valueOf(type.nullAnnotatedReadableName(this.options, true));
 	int dims = 0;
-	if (type instanceof ArrayBinding && ((ArrayBinding)type).nullTagBitsPerDimension != null) {
-		// if type has annotations on dimensions show the annotation on the outer most dimension:
-		dims = type.dimensions();
-		type = type.leafComponentType();
-	}
 	char[] typeName = type.shortReadableName();
 	char[] annotationDisplayName = annotationName[annotationName.length-1];
 	return internalAnnotatedTypeName(annotationDisplayName, typeName, dims);
@@ -9283,33 +9696,76 @@
 	this.handle(IProblem.ArrayReferencePotentialNullReference, NoArgument, NoArgument, arrayReference.sourceStart, arrayReference.sourceEnd);
 	
 }
-public void nullityMismatchingTypeAnnotation(Expression expression, TypeBinding providedType, TypeBinding requiredType, 
-		boolean uncheckedConversion, LookupEnvironment env) 
+public void nullityMismatchingTypeAnnotation(Expression expression, TypeBinding providedType, TypeBinding requiredType, NullAnnotationMatching status) 
 {
-	String[] arguments = new String[] {
-		String.valueOf(requiredType.nullAnnotatedReadableName(env, false)),
-		String.valueOf(providedType.nullAnnotatedReadableName(env, false))
+	if (providedType.id == TypeIds.T_null) {
+		nullityMismatchIsNull(expression, requiredType);
+		return;
+	}
+	String[] arguments ;
+	String[] shortArguments;
+		
+	int problemId = 0;
+	if (status.superTypeHint != null) {
+		problemId = (status.isUnchecked()
+			? IProblem.NullityUncheckedTypeAnnotationDetailSuperHint
+			: IProblem.NullityMismatchingTypeAnnotationSuperHint);
+		arguments      = new String[] { null, null, status.superTypeHintName(this.options, false) };
+		shortArguments = new String[] { null, null, status.superTypeHintName(this.options, true) };
+	} else {
+		problemId = (status.isUnchecked()
+			? IProblem.NullityUncheckedTypeAnnotationDetail
+			: IProblem.NullityMismatchingTypeAnnotation);
+		arguments      = new String[2];
+		shortArguments = new String[2];
+	}
+	arguments[0] = String.valueOf(requiredType.nullAnnotatedReadableName(this.options, false));
+	arguments[1] = String.valueOf(providedType.nullAnnotatedReadableName(this.options, false));
+	shortArguments[0] = String.valueOf(requiredType.nullAnnotatedReadableName(this.options, true));
+	shortArguments[1] = String.valueOf(providedType.nullAnnotatedReadableName(this.options, true));
+	this.handle(problemId, arguments, shortArguments, expression.sourceStart, expression.sourceEnd);
+}
+
+public void nullityMismatchTypeArgument(TypeBinding typeVariable, TypeBinding typeArgument, ASTNode location) {
+	long tagBits = typeVariable.tagBits & TagBits.AnnotationNullMASK;
+	char[][] annotationName = tagBits == TagBits.AnnotationNonNull ? this.options.nonNullAnnotationName : this.options.nullableAnnotationName;
+	String[] arguments = {
+		String.valueOf(typeVariable.readableName()),
+		String.valueOf(CharOperation.concatWith(annotationName, '.')),
+		String.valueOf(typeArgument.nullAnnotatedReadableName(this.options, false))
 	};
-	String[] shortArguments = new String[] {
-		String.valueOf(requiredType.nullAnnotatedReadableName(env, true)),
-		String.valueOf(providedType.nullAnnotatedReadableName(env, true))
+	String[] shortArguments = {
+		String.valueOf(typeVariable.shortReadableName()),
+		String.valueOf(annotationName[annotationName.length-1]),
+		String.valueOf(typeArgument.nullAnnotatedReadableName(this.options, true))
 	};
 	this.handle(
-			uncheckedConversion ? IProblem.NullityMismatchingTypeAnnotationUnchecked : IProblem.NullityMismatchingTypeAnnotation,
-			arguments, shortArguments, expression.sourceStart, expression.sourceEnd);
+			IProblem.NullityMismatchTypeArgument, 
+			arguments, 
+			shortArguments, 
+			location.sourceStart, 
+			location.sourceEnd);
 }
-public void dereferencingNullableExpression(Expression expression, LookupEnvironment env) {
+
+public void dereferencingNullableExpression(Expression expression) {
 	if (expression instanceof MessageSend) {
 		MessageSend send = (MessageSend) expression;
 		messageSendPotentialNullReference(send.binding, send);
 		return;
 	}
-	char[][] nullableName = env.getNullableAnnotationName();
+	char[][] nullableName = this.options.nullableAnnotationName;
 	char[] nullableShort = nullableName[nullableName.length-1];
 	String[] arguments = { String.valueOf(nullableShort) };
 	// TODO(stephan): more sophisticated handling for various kinds of expressions
-	this.handle(IProblem.DereferencingNullableExpression, arguments, arguments, expression.sourceStart, expression.sourceEnd);
-	
+	int start = nodeSourceStart(expression);
+	int end = nodeSourceEnd(expression);
+	this.handle(IProblem.DereferencingNullableExpression, arguments, arguments, start, end);
+}
+public void dereferencingNullableExpression(long positions, LookupEnvironment env) {
+	char[][] nullableName = env.getNullableAnnotationName();
+	char[] nullableShort = nullableName[nullableName.length-1];
+	String[] arguments = { String.valueOf(nullableShort) };
+	this.handle(IProblem.DereferencingNullableExpression, arguments, arguments, (int)(positions>>>32), (int)(positions&0xFFFF));
 }
 public void onlyReferenceTypesInIntersectionCast(TypeReference typeReference) {
 	this.handle(
@@ -9352,7 +9808,7 @@
 			NoArgument,
 			NoArgument,
 			functionalExpression.sourceStart,
-			functionalExpression.sourceEnd);
+			functionalExpression.diagnosticsSourceEnd());
 }
 public void lambdaRedeclaresArgument(Argument argument) {
 	String[] arguments = new String[] {new String(argument.name)};
@@ -9379,7 +9835,7 @@
 		new String[] { new String(referenceBinding.readableName()) },
 		new String[] { new String(referenceBinding.shortReadableName()) },
 		expression.sourceStart,
-		expression.sourceEnd);
+		expression.diagnosticsSourceEnd());
 }
 
 public void methodReferenceSwingsBothWays(ReferenceExpression expression, MethodBinding instanceMethod, MethodBinding nonInstanceMethod) {
@@ -9590,4 +10046,72 @@
 			location.sourceStart(),
 			location.sourceEnd());
 }
+public void disallowedTargetForContainerAnnotation(Annotation annotation, TypeBinding containerAnnotationType) {
+	this.handle(
+		IProblem.DisallowedTargetForContainerAnnotationType,
+		new String[] {new String(annotation.resolvedType.readableName()), new String(containerAnnotationType.readableName())},
+		new String[] {new String(annotation.resolvedType.shortReadableName()), new String(containerAnnotationType.shortReadableName())},
+		annotation.sourceStart,
+		annotation.sourceEnd);
+}
+public void genericInferenceError(String message, InvocationSite invocationSite) {
+	genericInferenceProblem(message, invocationSite, ProblemSeverities.Error);
+}
+public void genericInferenceProblem(String message, InvocationSite invocationSite, int severity) {
+	String[] args = new String[]{message};
+	int start = 0, end = 0;
+	if (invocationSite != null) {
+		start = invocationSite.sourceStart();
+		end = invocationSite.sourceEnd();
+	}
+	this.handle(IProblem.GenericInferenceError, args, args, severity|ProblemSeverities.InternalError, start, end);	
+}
+public void uninternedIdentityComparison(EqualExpression expr, TypeBinding lhs, TypeBinding rhs, CompilationUnitDeclaration unit) {
+	
+	char [] lhsName = lhs.sourceName();
+	char [] rhsName = rhs.sourceName();
+	
+	if (CharOperation.equals(lhsName, "VoidTypeBinding".toCharArray())  //$NON-NLS-1$
+			|| CharOperation.equals(lhsName, "NullTypeBinding".toCharArray())  //$NON-NLS-1$
+			|| CharOperation.equals(lhsName, "ProblemReferenceBinding".toCharArray())) //$NON-NLS-1$
+		return;
+	
+	if (CharOperation.equals(rhsName, "VoidTypeBinding".toCharArray())  //$NON-NLS-1$
+			|| CharOperation.equals(rhsName, "NullTypeBinding".toCharArray())  //$NON-NLS-1$
+			|| CharOperation.equals(rhsName, "ProblemReferenceBinding".toCharArray())) //$NON-NLS-1$
+		return;
+	
+	boolean[] validIdentityComparisonLines = unit.validIdentityComparisonLines;
+	if (validIdentityComparisonLines != null) {
+		int problemStartPosition = expr.left.sourceStart;
+		int[] lineEnds;
+		int lineNumber = problemStartPosition >= 0
+				? Util.getLineNumber(problemStartPosition, lineEnds = unit.compilationResult().getLineSeparatorPositions(), 0, lineEnds.length-1)
+						: 0;
+		if (lineNumber <= validIdentityComparisonLines.length && validIdentityComparisonLines[lineNumber - 1])
+			return;
+	}
+	
+	this.handle(
+			IProblem.UninternedIdentityComparison,
+			new String[] {
+					new String(lhs.readableName()),
+					new String(rhs.readableName())
+			},
+			new String[] {
+					new String(lhs.shortReadableName()),
+					new String(rhs.shortReadableName())
+			},
+			expr.sourceStart,
+			expr.sourceEnd);
+}
+
+public void lambdaShapeComputationError(LambdaExpression expression) {
+	this.handle(
+			IProblem.LambdaShapeComputationError,
+			NoArgument,
+			NoArgument,
+			expression.sourceStart,
+			expression.diagnosticsSourceEnd());
+}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemSeverities.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemSeverities.java
index 5697c51..705a156 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemSeverities.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/ProblemSeverities.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,7 +12,6 @@
 
 public interface ProblemSeverities {
 
-	final int Ignore = 256; // during handling only
 	final int Warning = 0; // during handling only
 
 	final int Error = 1; // when bit is set: problem is error, if not it is a warning
@@ -24,4 +23,6 @@
 	final int Optional = 32; // when bit is set: problem was configurable
 	final int SecondaryError = 64;
 	final int Fatal = 128; // when bit is set: problem was either a mandatory error, or an optional+treatOptionalErrorAsFatal
+	final int Ignore = 256; // during handling only
+	final int InternalError = 512;  // always exposed, even when silent error handling policy is in effect.
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/messages.properties b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/messages.properties
index d10aeb3..8dc1e3e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/messages.properties
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/problem/messages.properties
@@ -1,14 +1,10 @@
 ###############################################################################
-# Copyright (c) 2000, 2013 IBM Corporation and others.
+# Copyright (c) 2000, 2014 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
 #
-# This is an implementation of an early-draft specification developed under the Java
-# Community Process (JCP) and is made available for testing and evaluation purposes
-# only. The code is not compatible with any specification of the JCP.
-#
 #
 # Contributors:
 #     IBM Corporation - initial API and implementation
@@ -32,9 +28,21 @@
 #							bug 402028 - [1.8][compiler] null analysis for reference expressions
 #							bug 401796 - [1.8][compiler] don't treat default methods as overriding an independent inherited abstract method
 #							bug 404649 - [1.8][compiler] detect illegal reference to indirect or redundant super
+#							Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
+#							Bug 415043 - [1.8][null] Follow-up re null type annotations after bug 392099
+#							Bug 392238 - [1.8][compiler][null] Detect semantically invalid null type annotations
+#							Bug 416307 - [1.8][compiler][null] subclass with type parameter substitution confuses null checking
+#							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+#							Bug 424637 - [1.8][compiler][null] AIOOB in ReferenceExpression.resolveType with a method reference to Files::walk
+#							Bug 418743 - [1.8][null] contradictory annotations on invocation of generic method not reported
+#							Bug 416190 - [1.8][null] detect incompatible overrides due to null type annotations
+#							Bug 392245 - [1.8][compiler][null] Define whether / how @NonNullByDefault applies to TYPE_USE locations
 #		Jesper S Moller <jesper@selskabet.org> - Contributions for
 #							bug 382701 - [1.8][compiler] Implement semantic analysis of Lambda expressions & Reference expression
 #							bug 384567 - [1.5][compiler] Compiler accepts illegal modifiers on package declaration
+#							Bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
+#							Bug 412151 - [1.8][compiler] Check repeating annotation's collection type
+#							Bug 419209 - [1.8] Repeating container annotations should be rejected in the presence of annotation it contains
 ###############################################################################
 0 = {0}
 1 = super cannot be used in java.lang.Object
@@ -49,19 +57,19 @@
 16 = Incompatible conditional operand types {0} and {1}
 17 = Type mismatch: cannot convert from {0} to {1}
 18 = The static member type {0}.{1} should be accessed directly
-
+19 = Type mismatch: cannot convert from {0} to {1}
 20 = No enclosing instance of type {0} is accessible to invoke the super constructor. Must define a constructor and explicitly qualify its super constructor invocation with an instance of {0} (e.g. x.super() where x is an instance of {0}).
 21 = No enclosing instance of type {0} is accessible. Must qualify the allocation with an enclosing instance of type {0} (e.g. x.new A() where x is an instance of {0}).
 22 = No enclosing instance of the type {0} is accessible in scope
 23 = Illegal enclosing instance specification for type {0}
 24 = Cannot define static initializer in inner type {0}
-25 = Cannot refer to the non-final variable {0} in a different method inside an inner class
-26 = The member interface {0} can only be defined inside a top-level class or interface
+25 = Cannot refer to the non-final local variable {0} defined in an enclosing scope
+26 = The member interface {0} can only be defined inside a top-level class or interface or in a static context
 27 = Cannot use an expression of the type {0} as a valid enclosing instance
 28 = No enclosing instance of type {0} is available due to some intermediate constructor invocation
 29 = An anonymous class cannot subclass the final class {0}
-30 = The member annotation {0} can only be defined inside a top-level class or interface
-31 = The member enum {0} can only be defined inside a top-level class or interface
+30 = The member annotation {0} can only be defined inside a top-level class or interface or in a static context
+31 = The member enum {0} can only be defined inside a top-level class or interface or in a static context
 32 = The member enum {0} must be defined inside a static member type
 33 = The type {0} is hiding the type {1}
 
@@ -108,8 +116,8 @@
 94 = The parameter {0} is hiding another local variable defined in an enclosing scope
 95 = The parameter {0} is hiding a field from type {1}
 96 = The serializable class {0} does not declare a static final serialVersionUID field of type long
-97 = Lambda expression's parameter {0} cannot redeclare another local variable defined in an enclosing scope. 
-98 = Lambda expression's local variable {0} cannot redeclare another local variable defined in an enclosing scope. 
+97 = Lambda expression''s parameter {0} cannot redeclare another local variable defined in an enclosing scope. 
+98 = Lambda expression''s local variable {0} cannot redeclare another local variable defined in an enclosing scope. 
 99 = The type {0} from the descriptor computed for the target context is not visible here.  
 100 = The method {1}({2}) is undefined for the type {0}
 101 = The method {1}({2}) from the type {0} is not visible
@@ -139,7 +147,7 @@
 125 = Incompatible parameter list for array constructor. Expected (int), but found ({1})
 126 = Constructed array {0} cannot be assigned to {1} as required in the interface descriptor  
 127 = The type {0} does not define {1}({2}) that is applicable here
-128 = The type of {0}({1}) from the type {2} is {3}, this is incompatible with the descriptor's return type: {4}
+128 = The type of {0}({1}) from the type {2} is {3}, this is incompatible with the descriptor''s return type: {4}
 129 = The constructor {0}({1}) refers to the missing type {2}
 130 = The constructor {0}({1}) is undefined
 131 = The constructor {0}({1}) is not visible
@@ -231,6 +239,7 @@
 223 = The left-hand side of an assignment must be a variable
 224 = Missing semicolon
 225 = Invalid parenthesized expression
+226 = super reference is illegal in interface context
 
 230 = Syntax error on token "{0}", {1} expected before this token
 231 = Syntax error on token "{0}", {1} expected after this token
@@ -266,6 +275,7 @@
 267 = Binary literals can only be used with source level 1.7 or greater
 268 = Underscores have to be located within digits
 269 = Underscores can only be used with source level 1.7 or greater
+271 = This lambda expression refers to the missing type {0}
 
 280 = Discouraged access: {0}
 
@@ -416,6 +426,7 @@
 441 = 'enum' should not be used as an identifier, since it is a reserved keyword from source level 1.5 on
 442 = Enum constants cannot be surrounded by parenthesis
 443 = '_' should not be used as an identifier, since it is a reserved keyword from source level 1.8 on
+444 = The uninterned types {0} and {1} should not be compared using ==/!= operators.
 
 450 = {0}{1}
 
@@ -499,7 +510,7 @@
 524 = The type {0} is not generic; it cannot be parameterized with arguments <{1}>
 525 = Incorrect number of arguments for type {0}; it cannot be parameterized with arguments <{1}>
 526 = Bound mismatch: The type {0} is not a valid substitute for the bounded parameter <{2} extends {3}> of the type {1}
-527 = Method {0}({2}) has the same erasure {0}({3}) as another method in type {1}
+527 = Erasure of method {0}({2}) is the same as another method in type {1}
 528 = Illegal forward reference to type parameter {0}
 529 = The type {0} is not an interface; it cannot be specified as a bounded parameter
 530 = Type safety: The constructor {0}({1}) belongs to the raw type {0}. References to generic type {2} should be parameterized
@@ -582,7 +593,7 @@
 605 = Invalid type {0} for the annotation attribute {2}.{1}; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof
 606 = Cycle detected: the annotation type {0} cannot contain attributes of the annotation type itself
 607 = Cycle detected: a cycle exists between annotation attributes of {0} and {1}
-608 = Duplicate annotation @{0}
+608 = Duplicate annotation @{0}. Repeated annotations are allowed only at source level 1.8 or above
 609 = The annotation @{0} must define the attribute {1}
 610 = Duplicate attribute {0} in annotation @{1}
 611 = The attribute {0} is undefined for the annotation type {1}
@@ -612,12 +623,12 @@
 635 = Unnecessary @SuppressWarnings("{0}")
 636 = The method {0}({1}) of type {2} should be tagged with @Override since it actually overrides a superinterface method
 637 = Syntax error, type annotations are available only when source level is at least 1.8
-638 = Explicit ''this'' parameter is allowed only in instance methods of non-anonymous classes and inner class constructors
+638 = Explicit 'this' parameter is allowed only in instance methods of non-anonymous classes and inner class constructors
 639 = Syntax error, type annotations are illegal here
 640 = Type annotations are not allowed on type names used to access static members
 641 = Type annotation is illegal for a method that returns void
-642 = Only the first formal parameter may be declared explicitly as ''this''
-643 = Explicit declaration of ''this'' parameter is allowed only at source level 1.8 or above
+642 = Only the first formal parameter may be declared explicitly as 'this'
+643 = Explicit declaration of 'this' parameter is allowed only at source level 1.8 or above
 644 = Default methods are allowed only at source level 1.8 or above
 645 = Lambda expressions are allowed only at source level 1.8 or above
 646 = Method references are allowed only at source level 1.8 or above
@@ -626,13 +637,13 @@
 649 = Annotation types that do not specify explicit target element types cannot be applied here
 650 = The declared type of the explicit ''this'' parameter is expected to be {0}
 651 = The explicit ''this'' parameter is expected to be qualified with {0}
-652 = The explicit ''this'' parameter for a method cannot have a qualifying name
+652 = The explicit 'this' parameter for a method cannot have a qualifying name
 653 = The target type of this expression must be a functional interface
 654 = The variable argument type {0} of the lambda expression must be the last parameter
 655 = The target type of this expression is not a well formed parameterized type due to bound(s) mismatch
-656 = Lambda expression's signature does not match the signature of the functional interface method
-657 = Lambda expression's parameter {0} is expected to be of type {1}
-658 = Incompatible type specified for lambda expression's parameter {0}
+656 = Lambda expression''s signature does not match the signature of the functional interface method {0}
+657 = Lambda expression''s parameter {0} is expected to be of type {1}
+658 = Incompatible type specified for lambda expression''s parameter {0}
 659 = Illegal lambda expression: Method {0} of type {1} is generic 
 ### MORE GENERICS
 660 = Unused type arguments for the non generic constructor {0}({1}) of type {2}; it should not be parameterized with arguments <{3}>
@@ -640,9 +651,10 @@
 
 ### MORE TYPE RELATED
 662 = Illegal attempt to create arrays of union types
-663 = Variable {0} is required to be final or effectively final
-664 = Invalid '@FunctionalInterface' annotation; {0} is not a functional interface
-665 = The constructed object of type {0} is incompatible with the descriptor's return type: {1}
+663 = Local variable {0} defined in an enclosing scope must be final or effectively final
+664 = Invalid ''@FunctionalInterface'' annotation; {0} is not a functional interface
+665 = The constructed object of type {0} is incompatible with the descriptor''s return type: {1}
+666 = Syntax error, type annotations are illegal here
 
 ### NULL ANALYSIS FOR OTHER EXPRESSIONS
 670 = Null comparison always yields false: this expression cannot be null
@@ -691,14 +703,15 @@
 
 ### VARARGS
 800 = Extended dimensions are illegal for a variable argument
-801 = The argument of type {0} should explicitly be cast to {1} for the invocation of the varargs method {2}({3}) from type {4}. It could alternatively be cast to {5} for a varargs invocation
-802 = The argument of type {0} should explicitly be cast to {1} for the invocation of the varargs constructor {2}({3}). It could alternatively be cast to {4} for a varargs invocation
+801 = Type {0} of the last argument to method {2}({3}) doesn''t exactly match the vararg parameter type. Cast to {1} to confirm the non-varargs invocation, or pass individual arguments of type {5} for a varargs invocation.
+802 = Type {0} of the last argument to constructor {2}({3}) doesn''t exactly match the vararg parameter type. Cast to {1} to confirm the non-varargs invocation, or pass individual arguments of type {4} for a varargs invocation.
 803 = Varargs methods should only override or be overridden by other varargs methods unlike {2}.{0}({1}) and {4}.{0}({3})
 804 = @SafeVarargs annotation cannot be applied to fixed arity method {0}
 805 = @SafeVarargs annotation cannot be applied to non-final instance method {0}
 806 = Type safety: Potential heap pollution via varargs parameter {0}
 807 = The method {0}({1}) of type {2} is not applicable as the formal varargs element type {3} is not accessible here
 808 = The constructor {0}({1}) of type {2} is not applicable as the formal varargs element type {3} is not accessible here
+809 = The method {0}({1}) of type {2} cannot be invoked as it is overridden by an inapplicable method
 
 ### GENERIC JAVADOC
 850 = Bound mismatch: The generic method {0}({1}) of type {2} is not applicable for the arguments ({3}). The inferred type {4} is not a valid substitute for the bounded parameter <{5} extends {6}>
@@ -743,22 +756,34 @@
 895 = The target type of this expression is not a functional interface: more than one of the intersecting interfaces are functional
 896 = Static methods are allowed in interfaces only at source level 1.8 or above
 
+897 = Duplicate annotation of non-repeatable type @{0}. Only annotation types marked @Repeatable can be used multiple times at one target.
+898 = The annotation @{0} cannot be repeated at this location since its container annotation type @{1} is disallowed at this location
+899 = The repeatable annotation @{0} may not be repeated where its container annotation type @{1} is also used directly
+902 = The value method in the container annotation type @{0} must be of type {1}[] but is {2}
+903 = The container annotation type @{0} must declare a member value()
+904 = The container annotation type @{0} must declare a default value for the annotation attribute ''{1}''
+905 = Retention ''{1}'' of @{0} is longer than the retention of its container annotation type @{2}, which is ''{3}''
+906 = The container annotation type @{1} is allowed at targets where the repeatable annotation type @{0} is not: {2}
+907 = The repeatable annotation type @{0} is marked @Documented, but its container annotation type @{1} is not
+908 = The repeatable annotation type @{0} is marked @Inherited, but its container annotation type @{1} is not
+909 = The repeatable annotation @{0} may not be present where its container annotation type @{1} is repeated
+
 ### NULL ANNOTATIONS
 910 = Null type mismatch: required ''{0}'' but the provided value is null
 911 = Null type mismatch: required ''{0}'' but the provided value is inferred as @{1}
-912 = Null type safety: The expression of type {0} needs unchecked conversion to conform to ''{1}''
+912 = Null type safety: The expression of type ''{0}'' needs unchecked conversion to conform to ''{1}''
 913 = A default nullness annotation has not been specified for the package {0}
 914 = The return type is incompatible with the @{1} return from {0}
 915 = Illegal redefinition of parameter {0}, inherited method from {1} declares this parameter as @{2}
 916 = Illegal redefinition of parameter {0}, inherited method from {1} does not constrain this parameter
-917 = Missing non-null annotation: inherited method from {0} declares this parameter as @{1}
-918 = Missing nullable annotation: inherited method from {0} declares this parameter as @{1}
+917 = Missing non-null annotation: inherited method from {0} specifies this parameter as @{1}
+918 = Missing nullable annotation: inherited method from {0} specifies this parameter as @{1}
 919 = Potential null pointer access: The method {0} may return null
 920 = Redundant null check: The method {0} cannot return null
-921 = The method {0} from {1} cannot implement the corresponding method from {2} due to incompatible nullness constraints
+921 = The method {0}{1}({2}) from {3} cannot implement the corresponding method from {4} due to incompatible nullness constraints
 922 = The nullness annotation is redundant with a default that applies to this location
 923 = The nullness annotation @{0} is not applicable for the primitive type {1}
-924 = Potential null pointer access: The field {0} is declared as @{1}
+924 = Potential null pointer access: The field {0} is specified as @{1}
 925 = Nullness default is redundant with the global default
 926 = Nullness default is redundant with a default specified for the enclosing package {0}
 927 = Nullness default is redundant with a default specified for the enclosing type {0}
@@ -771,23 +796,36 @@
 934 = The @{0} field {1} may not have been initialized
 935 = The @{0} field {1} may not have been initialized. Note that a problem regarding missing ''default:'' on ''switch'' has been suppressed, which is perhaps related to this problem
 936 = Null comparison always yields false: The method {0} cannot return null
-937 = Redundant null check: The field {0} is declared as @{1}
-938 = Null comparison always yields false: The field {0} is declared as @{1}
+937 = Redundant null check: The field {0} is specified as @{1}
+938 = Null comparison always yields false: The field {0} is specified as @{1}
 939 = The default ''@{0}'' conflicts with the inherited ''@{1}'' annotation in the overridden method from {2} 
 940 = Conflict between inherited null annotations ''@{0}'' declared in {1} versus ''@{2}'' declared in {3} 
+941 = Redundant null check: The field {0} cannot be null at this location (ignoring concurrency)
+942 = Null comparison always yields false: The field {0} cannot be null at this location (ignoring concurrency)
 
 951 = Potential null pointer access: array element may be null
 952 = Potential null pointer access: this expression has a ''@{0}'' type
 953 = Null type mismatch (type annotations): required ''{0}'' but this expression has type ''{1}''
-954 = Null type mismatch (type annotations): the expression of type ''{1}'' needs unchecked conversion to conform to ''{0}''
-955 = Null type mismatch at parameter {0}: required ''{1}{2}'' but provided ''@{3} {4}'' via method descriptor {5}
-956 = Null type safety: parameter {0} provided via method descriptor {1} needs unchecked conversion to conform to ''@{2} {3}''
-957 = Null type mismatch at method return type: Method descriptor {0} promises ''@{1} {2}'' but referenced method provides ''{3}{4}''
-958 = Null type safety at method return type: Method descriptor {0} promises ''@{1} {2}'' but referenced method provides ''{3}{4}''
+954 = Null type mismatch (type annotations): required ''{0}'' but this expression has type ''{1}'', corresponding supertype is ''{2}''
+955 = Null type safety (type annotations): The expression of type ''{1}'' needs unchecked conversion to conform to ''{0}''
+956 = Null type safety (type annotations): The expression of type ''{1}'' needs unchecked conversion to conform to ''{0}'', corresponding supertype is ''{2}''
+957 = Null type mismatch at parameter {0}: required ''{1}'' but provided ''{2}'' via method descriptor {3}
+958 = Null type safety: parameter {0} provided via method descriptor {3} needs unchecked conversion to conform to ''{1}''
+959 = Null type mismatch at method return type: Method descriptor {0} promises ''@{1} {2}'' but referenced method provides ''{3}{4}''
+960 = Null type safety at method return type: Method descriptor {0} promises ''@{1} {2}'' but referenced method provides ''{3}{4}''
+961 = Redundant null check: comparing ''{0}'' against null
+962 = The nullness annotation ''{0}'' is not applicable at this location
+963 = Nullness annotations are not applicable at this location 
+964 = Null constraint mismatch: The type ''{2}'' is not a valid substitute for the type parameter ''{0}'' which is constrained as ''@{1}''
+965 = This nullness annotation conflicts with a ''@{0}'' annotation which is effective on the same type parameter 
+966 = Contradictory null annotations: method was inferred as ''{2} {3}({4})'', but only one of ''@{0}'' and ''@{1}'' can be effective at any location
+967 = Null type safety: Unchecked cast from {0} to {1}
+968 = Arguments controling the details of the nullness default are not yet evaluated by the analysis.
 
 # Java 8
 1001 = Syntax error, modifiers and annotations are not allowed for the lambda parameter {0} as its type is elided
 1002 = Syntax error, modifiers are not allowed here
+1003 = Explicit type arguments cannot be specified in raw constructor reference expression
 
 # Default methods:
 # variant of 359: 
@@ -799,6 +837,10 @@
 1055 = Illegal reference to super method {0} from type {1}, cannot bypass the more specific override from type {2}
 1056 = Illegal combination of modifiers for the interface method {0}; only one of abstract, default, or static permitted
 1057 = strictfp is not permitted for abstract interface method {0}
+1058 = Default methods are allowed only in interfaces with source level 1.8 or greater.
+
+1100 = Problem detected during type inference: {0}
+1101 = (Recovered) Internal inconsistency detected during lambda shape analysis
 
 ### ELABORATIONS
 ## Access restrictions
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter.java
index 61877a7..27f1b0f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/GenericXMLWriter.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
@@ -18,6 +18,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class GenericXMLWriter extends PrintWriter {
 	/* constants */
 	private static final String XML_VERSION= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; //$NON-NLS-1$
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfType.java
index 6f3c706..e4d5b09 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/HashtableOfType.java
@@ -60,6 +60,31 @@
 	}
 	return null;
 }
+// Returns old value.
+public ReferenceBinding getput(char[] key, ReferenceBinding value) {
+	ReferenceBinding retVal = null;
+	int length = this.keyTable.length,
+		index = CharOperation.hashCode(key) % length;
+	int keyLength = key.length;
+	char[] currentKey;
+	while ((currentKey = this.keyTable[index]) != null) {
+		if (currentKey.length == keyLength && CharOperation.equals(currentKey, key)) {
+			retVal = this.valueTable[index];
+			this.valueTable[index] = value;
+			return retVal;
+		}
+		if (++index == length) {
+			index = 0;
+		}
+	}
+	this.keyTable[index] = key;
+	this.valueTable[index] = value;
+
+	// assumes the threshold is never equal to the size of the table
+	if (++this.elementSize > this.threshold)
+		rehash();
+	return retVal;
+}
 public ReferenceBinding put(char[] key, ReferenceBinding value) {
 	int length = this.keyTable.length,
 		index = CharOperation.hashCode(key) % length;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/ManifestAnalyzer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/ManifestAnalyzer.java
index 2ee5dd7..fba0e07 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/ManifestAnalyzer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/ManifestAnalyzer.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,6 +15,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ManifestAnalyzer {
 	private static final int
 		START = 0,
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages.java
index e773b2b..2ef06fb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Messages.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
@@ -21,6 +21,7 @@
 import java.util.Map;
 import java.util.Properties;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public final class Messages {
 	private static class MessagesProperties extends Properties {
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting.java
index 32e01bb..7f540cb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Sorting.java
@@ -5,17 +5,18 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *		Stephan Herrmann - Initial API and implementation
  **********************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.compiler.util;
 
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceVariable;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 
 /**
@@ -72,7 +73,7 @@
 			// search superclass within input:
 			int j = 0;
 			for(j=0; j<input.length; j++)
-				if (input[j] == superclass)
+				if (TypeBinding.equalsEquals(input[j], superclass))
 					break;
 			if (j < input.length)
 				// depth first traversal:
@@ -107,4 +108,14 @@
 				copy[idx++] = methods[i];
 		return copy;
 	}
+
+	/** Sort inference variables by rank. */
+	public static void sortInferenceVariables(InferenceVariable[] variables) {
+		Arrays.sort(variables, new Comparator<InferenceVariable>() {
+			@Override
+			public int compare(InferenceVariable iv1, InferenceVariable iv2) {
+				return iv1.rank - iv2.rank;
+			}
+		});		
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util.java
index f7f8331..7e9aeb9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/compiler/util/Util.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
@@ -44,6 +44,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.WildcardBinding;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class Util implements SuffixConstants {
 
 	/**
@@ -860,7 +861,7 @@
 			int suffixIndex = suffixLength - i - 1;
 			if (c != SUFFIX_aj[suffixIndex] && c != SUFFIX_AJ[suffixIndex]) return false;
 		}
-		return true;		
+		return true;
 	}
 	// End AspectJ Extension
 
@@ -1571,4 +1572,20 @@
 				return scanTypeSignature(string, start);
 		}
 	}
+
+	public static boolean effectivelyEqual(Object [] one, Object [] two) {
+		if (one == two)
+			return true;
+		int oneLength = one == null ? 0 : one.length;
+		int twoLength = two == null ? 0 : two.length;
+		if (oneLength != twoLength)
+			return false;
+		if (oneLength == 0)
+			return true;
+		for (int i = 0; i < one.length; i++) {
+			if (one[i] != two[i])
+				return false;
+		}
+		return true;
+	}
 }
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ASTHolderCUInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ASTHolderCUInfo.java
index 94a7309..9a6aff2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ASTHolderCUInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ASTHolderCUInfo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2007 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 @@
 
 import org.aspectj.org.eclipse.jdt.core.dom.CompilationUnit;
 
+@SuppressWarnings("rawtypes")
 public class ASTHolderCUInfo extends CompilationUnitElementInfo {
 	int astLevel;
 	boolean resolveBindings;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BatchInitializationMonitor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BatchInitializationMonitor.java
index 80159ca..cec0b4c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BatchInitializationMonitor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BatchInitializationMonitor.java
@@ -2,7 +2,7 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 
 /*******************************************************************************
- * 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
@@ -11,6 +11,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
+@SuppressWarnings("rawtypes")
 public class BatchInitializationMonitor implements IProgressMonitor {
 
 	public ThreadLocal initializeAfterLoadMonitor = new ThreadLocal();
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryMember.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryMember.java
index be6da07..bee0e39 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryMember.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryMember.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
@@ -27,6 +27,7 @@
 /**
  * Common functionality for Binary member handles.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public abstract class BinaryMember extends NamedMember {
 		
 /*
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod.java
index c8c5eee..c6c0fa6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryMethod.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -576,6 +572,12 @@
 public boolean isMainMethod() throws JavaModelException {
 	return this.isMainMethod(this);
 }
+/*
+ * @see IMethod#isLambdaMethod()
+ */
+public boolean isLambdaMethod() {
+	return false;
+}
 /* (non-Javadoc)
  * @see org.aspectj.org.eclipse.jdt.core.IMethod#isResolved()
  */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryType.java
index 2ce5659..fb02b69 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BinaryType.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
@@ -40,6 +40,7 @@
  * @see IType
  */
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class BinaryType extends BinaryMember implements IType, SuffixConstants {
 
 	private static final IField[] NO_FIELDS = new IField[0];
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Buffer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Buffer.java
index 664f010..5a2b25f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Buffer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Buffer.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
@@ -29,6 +29,7 @@
 /**
  * @see IBuffer
  */
+@SuppressWarnings({ "unchecked", "rawtypes" })
 public class Buffer implements IBuffer {
 	protected IFile file;
 	protected int flags;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BufferCache.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BufferCache.java
index 4d9fa19..06c978d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BufferCache.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BufferCache.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
@@ -18,6 +18,7 @@
 /**
  * An LRU cache of <code>IBuffers</code>.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class BufferCache extends OverflowingLRUCache {
 
 	private ThreadLocal buffersToClose = new ThreadLocal();
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BufferManager.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BufferManager.java
index 6c24095..f2bb239 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BufferManager.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/BufferManager.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
@@ -22,6 +22,7 @@
  * The buffer manager manages the set of open buffers.
  * It implements an LRU cache of buffers.
  */
+@SuppressWarnings("rawtypes")
 public class BufferManager {
 
 	protected static BufferManager DEFAULT_BUFFER_MANAGER;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClassFile.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClassFile.java
index 8187f83..c4fdba4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClassFile.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClassFile.java
@@ -39,6 +39,7 @@
  * @see IClassFile
  */
 
+@SuppressWarnings({"rawtypes"})
 public class ClassFile extends Openable implements IClassFile, SuffixConstants {
 
 	protected String name;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo.java
index bdfe3a3..5a64b0b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClassFileInfo.java
@@ -29,6 +29,7 @@
  * Element info for <code>ClassFile</code> handles.
  */
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 /* package */ class ClassFileInfo extends OpenableElementInfo implements SuffixConstants {
 	/**
 	 * The children of the <code>BinaryType</code> corresponding to our
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClasspathChange.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClasspathChange.java
index f81cf42..38d3deb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClasspathChange.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClasspathChange.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
@@ -34,6 +34,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.search.indexing.IndexManager;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ClasspathChange {
 	public static final int NO_DELTA = 0x00;
 	public static final int HAS_DELTA = 0x01;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry.java
index d411f8e..c37cb2d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ClasspathEntry.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
@@ -8,6 +8,7 @@
  * Contributors:
  *     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
+ *     Thirumala Reddy Mutchukota <thirumala@google.com> - Avoid optional library classpath entries validation - https://bugs.eclipse.org/bugs/show_bug.cgi?id=412882
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core;
 
@@ -67,6 +68,7 @@
 /**
  * @see IClasspathEntry
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class ClasspathEntry implements IClasspathEntry {
 	
 	public static class AssertionFailedException extends RuntimeException {
@@ -1324,7 +1326,7 @@
 	}
 
 	/*
-	 * Backward compatibility: only accessible and non-accessible files are suported.
+	 * Backward compatibility: only accessible and non-accessible files are supported.
 	 */
 	public static IAccessRule[] getAccessRules(IPath[] accessibleFiles, IPath[] nonAccessibleFiles) {
 		int accessibleFilesLength = accessibleFiles == null ? 0 : accessibleFiles.length;
@@ -2026,10 +2028,7 @@
 						containerInfo = Messages.bind(Messages.classpath_containerInfo, new String[] {entryContainer.getDescription()});
 					}
 				}
-				IJavaModelStatus status = validateLibraryEntry(path, project, containerInfo, checkSourceAttachment ? entry.getSourceAttachmentPath() : null, entryPathMsg);
-				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=171136, ignore class path errors from optional entries
-				if (status.getCode() == IJavaModelStatusConstants.INVALID_CLASSPATH && ((ClasspathEntry) entry).isOptional())
-					status = JavaModelStatus.VERIFIED_OK;
+				IJavaModelStatus status = validateLibraryEntry(path, project, containerInfo, checkSourceAttachment ? entry.getSourceAttachmentPath() : null, entryPathMsg, ((ClasspathEntry) entry).isOptional());
 				if (!status.isOK())
 					return status;
 				break;
@@ -2108,8 +2107,13 @@
 	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=232816, Now we have the facility to include a container
 	// name in diagnostics. If the parameter ``container'' is not null, it is used to point to the library
 	// more fully.
-	private static IJavaModelStatus validateLibraryEntry(IPath path, IJavaProject project, String container, IPath sourceAttachment, String entryPathMsg) {
+	private static IJavaModelStatus validateLibraryEntry(IPath path, IJavaProject project, String container, IPath sourceAttachment, String entryPathMsg, boolean isOptionalLibrary) {
 		if (path.isAbsolute() && !path.isEmpty()) {
+			boolean validateJdkLevelCompatibility = !JavaCore.IGNORE.equals(project.getOption(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL, true));
+			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=412882, avoid validating optional entries
+			if (!validateJdkLevelCompatibility && isOptionalLibrary) {
+				return JavaModelStatus.VERIFIED_OK;
+			}
 			Object target = JavaModel.getTarget(path, true);
 			if (target == null) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=248661
 				IPath workspaceLocation = workspaceRoot.getLocation(); 
@@ -2117,7 +2121,7 @@
 					target = JavaModel.getTarget(path.makeRelativeTo(workspaceLocation).makeAbsolute(), true);
 				}
 			}
-			if (target != null && !JavaCore.IGNORE.equals(project.getOption(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL, true))) {
+			if (target != null && validateJdkLevelCompatibility) {
 				long projectTargetJDK = CompilerOptions.versionToJdkLevel(project.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true));
 				long libraryJDK = Util.getJdkLevel(target);
 				if (libraryJDK != 0 && libraryJDK > projectTargetJDK) {
@@ -2143,6 +2147,9 @@
 					}
 				}
 			}
+			if (isOptionalLibrary) {
+				return JavaModelStatus.VERIFIED_OK;
+			}
 			if (target instanceof IResource){
 				IResource resolvedResource = (IResource) target;
 				switch(resolvedResource.getType()){
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit.java
index ff0472c..71f812d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnit.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -30,10 +30,8 @@
 import org.aspectj.org.eclipse.jdt.internal.core.util.MementoTokenizer;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Messages;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
-
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
-
 import org.eclipse.text.edits.MalformedTreeException;
 import org.eclipse.text.edits.TextEdit;
 import org.eclipse.text.edits.UndoEdit;
@@ -41,6 +39,7 @@
 /**
  * @see ICompilationUnit
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class CompilationUnit extends Openable implements ICompilationUnit, org.aspectj.org.eclipse.jdt.internal.compiler.env.ICompilationUnit, SuffixConstants {
 	/**
 	 * Internal synonym for deprecated constant AST.JSL2
@@ -205,6 +204,7 @@
 		}
 	} finally {
 	    if (compilationUnitDeclaration != null) {
+	    	unitInfo.hasFunctionalTypes = compilationUnitDeclaration.hasFunctionalTypes();
 	        compilationUnitDeclaration.cleanUp();
 	    }
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitElementInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitElementInfo.java
index d04d1e7..3749694 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitElementInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitElementInfo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,11 @@
 import org.aspectj.org.eclipse.jdt.core.SourceRange;
 
 public class CompilationUnitElementInfo extends OpenableElementInfo {
+	
+	/**
+	 * Count that will be used by SourceTypeConverter to decide whether or not to diet parse.
+	 */
+	public static int ANNOTATION_THRESHOLD_FOR_DIET_PARSE = 10;
 
 	/**
 	 * The length of this compilation unit's source code <code>String</code>
@@ -31,6 +36,8 @@
 	 */
 	public int annotationNumber = 0;
 
+	public boolean hasFunctionalTypes = false;
+
 /**
  * Returns the length of the source string.
  */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder.java
index be5646e..004354c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder.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
@@ -34,6 +34,7 @@
  * Responsible for resolving types inside a compilation unit being reconciled,
  * reporting the discovered problems to a given IProblemRequestor.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class CompilationUnitProblemFinder extends Compiler {
 
 	/**
@@ -132,7 +133,8 @@
 		compilerOptions.performMethodsFullRecovery = statementsRecovery;
 		compilerOptions.performStatementsRecovery = statementsRecovery;
 		compilerOptions.parseLiteralExpressionsAsConstants = !creatingAST; /*parse literal expressions as constants only if not creating a DOM AST*/
-		compilerOptions.storeAnnotations = creatingAST; /*store annotations in the bindings if creating a DOM AST*/
+		if (creatingAST)
+			compilerOptions.storeAnnotations = true; /* store annotations in the bindings if creating a DOM AST */
 		return compilerOptions;
 	}
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.java
index 9cbefa5..592fdcc 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.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
@@ -50,6 +50,7 @@
 /**
  * A requestor for the fuzzy parser, used to compute the children of an ICompilationUnit.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class CompilationUnitStructureRequestor extends ReferenceInfoAdapter implements ISourceElementRequestor {
 	
 	/**
@@ -446,6 +447,9 @@
 	if (methodInfo.node != null && methodInfo.node.arguments != null) {
 		info.arguments = acceptMethodParameters(methodInfo.node.arguments, handle, methodInfo);
 	}
+	if (methodInfo.typeAnnotated) {
+		this.unitInfo.annotationNumber = CompilationUnitElementInfo.ANNOTATION_THRESHOLD_FOR_DIET_PARSE;
+	}
 	return info;
 }
 private LocalVariable[] acceptMethodParameters(Argument[] arguments, JavaElement methodHandle, MethodInfo methodInfo) {
@@ -551,6 +555,9 @@
 		}
 		
 	}
+	if (typeInfo.typeAnnotated) {
+		this.unitInfo.annotationNumber = CompilationUnitElementInfo.ANNOTATION_THRESHOLD_FOR_DIET_PARSE;
+	}
 	return info;
 }
 protected void acceptTypeParameter(TypeParameterInfo typeParameterInfo, JavaElementInfo parentInfo) {
@@ -635,7 +642,7 @@
 	if (initializationStart != -1) {
 		int flags = info.flags;
 		Object typeInfo;
-		if (Flags.isStatic(flags) && Flags.isFinal(flags)
+		if (Flags.isFinal(flags)
 				|| ((typeInfo = this.infoStack.peek()) instanceof TypeInfo
 					 && (Flags.isInterface(((TypeInfo)typeInfo).modifiers)))) {
 			int length = declarationEnd - initializationStart;
@@ -646,6 +653,9 @@
 			}
 		}
 	}
+	if (fieldInfo.typeAnnotated) {
+		this.unitInfo.annotationNumber = CompilationUnitElementInfo.ANNOTATION_THRESHOLD_FOR_DIET_PARSE;
+	}
 }
 /**
  * @see ISourceElementRequestor
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CopyElementsOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CopyElementsOperation.java
index b4bd3ff..12224c1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CopyElementsOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CopyElementsOperation.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
@@ -59,6 +59,7 @@
  * </ul>
  *
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class CopyElementsOperation extends MultiOperation implements SuffixConstants {
 
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CopyResourceElementsOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CopyResourceElementsOperation.java
index ebfff8d..c8a1862 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CopyResourceElementsOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CopyResourceElementsOperation.java
@@ -59,6 +59,7 @@
  * </ul>
  *
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class CopyResourceElementsOperation extends MultiOperation implements SuffixConstants {
 	/**
 	 * The list of new resources created during this operation.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateFieldOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateFieldOperation.java
index 9a9e11e..c447060 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateFieldOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateFieldOperation.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
@@ -35,6 +35,7 @@
  *      performed.
  * </ul>
  */
+@SuppressWarnings("rawtypes")
 public class CreateFieldOperation extends CreateTypeMemberOperation {
 /**
  * When executed, this operation will create a field with the given name
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateImportOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateImportOperation.java
index 460504c..4c3a21a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateImportOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateImportOperation.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
@@ -52,6 +52,7 @@
  *      compilation unit. For example: <code>"java.io.File"</code> or <code>"java.awt.*"</code>
  * </ul>
  */
+@SuppressWarnings("rawtypes")
 public class CreateImportOperation extends CreateElementInCUOperation {
 
 	/*
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateMethodOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateMethodOperation.java
index 97b8ca1..f744df1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateMethodOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateMethodOperation.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
@@ -37,6 +37,7 @@
  *      performed.
  * </ul>
  */
+@SuppressWarnings("rawtypes")
 public class CreateMethodOperation extends CreateTypeMemberOperation {
 
 	protected String[] parameterTypes;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageFragmentOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageFragmentOperation.java
index 457d506..619679a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageFragmentOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreatePackageFragmentOperation.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
@@ -48,6 +48,7 @@
  *  <li>Package fragment's name is taken by a simple (non-folder) resource
  * </ul>
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class CreatePackageFragmentOperation extends JavaModelOperation {
 	/**
 	 * The fully qualified, dot-delimited, package name.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeMemberOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeMemberOperation.java
index 6d569d3..ef7f457 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeMemberOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/CreateTypeMemberOperation.java
@@ -37,6 +37,7 @@
  * Implements functionality common to
  * operations that create type members.
  */
+@SuppressWarnings("rawtypes")
 public abstract class CreateTypeMemberOperation extends CreateElementInCUOperation {
 	/**
 	 * The source code for the new member.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeleteElementsOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeleteElementsOperation.java
index e829416..384881e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeleteElementsOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeleteElementsOperation.java
@@ -41,6 +41,7 @@
  * a package, etc (which have an actual resource), a DeleteResourcesOperation
  * should be used.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class DeleteElementsOperation extends MultiOperation {
 	/**
 	 * The elements this operation processes grouped by compilation unit
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation.java
index 2aad2b8..bcf2df7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation.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
@@ -18,6 +18,7 @@
 import org.eclipse.core.runtime.IPath;
 import org.aspectj.org.eclipse.jdt.core.*;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class DeletePackageFragmentRootOperation extends JavaModelOperation {
 
 	int updateResourceFlags;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState.java
index e4ce398..13b4c9e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessingState.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
@@ -29,6 +29,7 @@
 /**
  * Keep the global states used during Java element delta processing.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class DeltaProcessingState implements IResourceChangeListener {
 
 	/*
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor.java
index c7e05bb..0f88b8d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/DeltaProcessor.java
@@ -62,6 +62,7 @@
  * 		resolved classpath, cycles))</li>
  * </ul>
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class DeltaProcessor {
 
 	static class OutputsInfo {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ExternalFolderChange.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ExternalFolderChange.java
index 2ffe03c..599e99f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ExternalFolderChange.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ExternalFolderChange.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
@@ -20,6 +20,7 @@
 import org.aspectj.org.eclipse.jdt.core.IClasspathEntry;
 import org.aspectj.org.eclipse.jdt.core.JavaModelException;
 
+@SuppressWarnings("rawtypes")
 public class ExternalFolderChange {
 
 	private JavaProject project;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager.java
index 3dc9d0f..12f1547 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ExternalFoldersManager.java
@@ -8,6 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - inconsistent initialization of classpath container backed by external class folder, see https://bugs.eclipse.org/320618
+ *     Thirumala Reddy Mutchukota <thirumala@google.com> - Contribution to bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=411423
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core;
 
@@ -43,6 +44,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.util.Messages;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class ExternalFoldersManager {
 	private static final String EXTERNAL_PROJECT_NAME = ".org.aspectj.org.eclipse.jdt.core.external.folders"; //$NON-NLS-1$
 	private static final String LINKED_FOLDER_NAME = ".link"; //$NON-NLS-1$
@@ -102,11 +104,15 @@
 		String firstSegment = externalPath.segment(0);
 		if (firstSegment != null && ResourcesPlugin.getWorkspace().getRoot().getProject(firstSegment).exists())
 			return false;
+		JavaModelManager manager = JavaModelManager.getJavaModelManager();
+		if (manager.isExternalFile(externalPath))
+			return false;
 		File externalFolder = externalPath.toFile();
-		if (externalFolder.isFile())
+		if (externalFolder.isFile()
+			|| (externalPath.getFileExtension() != null/*likely a .jar, .zip, .rar or other file*/ && !externalFolder.exists())) {
+			manager.addExternalFile(externalPath);
 			return false;
-		if (externalPath.getFileExtension() != null/*likely a .jar, .zip, .rar or other file*/ && !externalFolder.exists())
-			return false;
+		}
 		return true;
 	}
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/InternalNamingConventions.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/InternalNamingConventions.java
index c1050df..eaba668 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/InternalNamingConventions.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/InternalNamingConventions.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
@@ -23,6 +23,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.TerminalTokens;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleSetOfCharArray;
 
+@SuppressWarnings("rawtypes")
 public class InternalNamingConventions {
 	private static final char[] DEFAULT_NAME = "name".toCharArray(); //$NON-NLS-1$
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragment.java
index 4719927..77db06a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragment.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -32,6 +32,7 @@
  *
  * @see org.aspectj.org.eclipse.jdt.core.IPackageFragment
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 class JarPackageFragment extends PackageFragment {
 /**
  * Constructs a package fragment that is contained within a jar or a zip.
@@ -196,6 +197,9 @@
 		return storedNonJavaResources();
 	}
 }
+protected boolean internalIsValidPackageName() {
+	return true;
+}
 /**
  * Jars and jar entries are all read only
  */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java
index 25b3423..a74d8b9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -22,6 +22,7 @@
 import org.eclipse.core.runtime.IStatus;
 import org.aspectj.org.eclipse.jdt.core.*;
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.aspectj.org.eclipse.jdt.internal.core.util.HashtableOfArrayToObject;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
@@ -35,11 +36,17 @@
  * @see org.aspectj.org.eclipse.jdt.core.IPackageFragmentRoot
  * @see org.aspectj.org.eclipse.jdt.internal.core.JarPackageFragmentRootInfo
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JarPackageFragmentRoot extends PackageFragmentRoot {
 
 	private final static ArrayList EMPTY_LIST = new ArrayList();
 
 	/**
+	 * Compiler compliance level that was used to produce the jar.
+	 */
+	protected final String complianceLevel;
+
+	/**
 	 * The path to the jar file
 	 * (a workspace relative path if the jar is internal,
 	 * or an OS path if the jar is external)
@@ -54,6 +61,9 @@
 	protected JarPackageFragmentRoot(IPath externalJarPath, JavaProject project) {
 		super(null, project);
 		this.jarPath = externalJarPath;
+		Object file = JavaModel.getTarget(getPath(), true);
+		long level = Util.getJdkLevel(file);
+		this.complianceLevel = CompilerOptions.versionFromJdkLevel(level);
 	}
 	/**
 	 * Constructs a package fragment root which is the root of the Java package directory hierarchy
@@ -62,6 +72,9 @@
 	protected JarPackageFragmentRoot(IResource resource, JavaProject project) {
 		super(resource, project);
 		this.jarPath = resource.getFullPath();
+		Object file = JavaModel.getTarget(getPath(), true);
+		long level = Util.getJdkLevel(file);
+		this.complianceLevel = CompilerOptions.versionFromJdkLevel(level);
 	}
 
 	/**
@@ -74,9 +87,6 @@
 		IJavaElement[] children;
 		ZipFile jar = null;
 		try {
-			IJavaProject project = getJavaProject();
-			String sourceLevel = project.getOption(JavaCore.COMPILER_SOURCE, true);
-			String compliance = project.getOption(JavaCore.COMPILER_COMPLIANCE, true);
 			jar = getJar();
 
 			// always create the default package
@@ -84,7 +94,7 @@
 
 			for (Enumeration e= jar.entries(); e.hasMoreElements();) {
 				ZipEntry member= (ZipEntry) e.nextElement();
-				initRawPackageInfo(rawPackageInfo, member.getName(), member.isDirectory(), sourceLevel, compliance);
+				initRawPackageInfo(rawPackageInfo, member.getName(), member.isDirectory());
 			}
 
 			// loop through all of referenced packages, creating package fragments if necessary
@@ -211,7 +221,7 @@
 	public int hashCode() {
 		return this.jarPath.hashCode();
 	}
-	private void initRawPackageInfo(HashtableOfArrayToObject rawPackageInfo, String entryName, boolean isDirectory, String sourceLevel, String compliance) {
+	private void initRawPackageInfo(HashtableOfArrayToObject rawPackageInfo, String entryName, boolean isDirectory) {
 		int lastSeparator = isDirectory ? entryName.length()-1 : entryName.lastIndexOf('/');
 		String[] pkgName = Util.splitOn('/', entryName, 0, lastSeparator);
 		String[] existing = null;
@@ -224,7 +234,9 @@
 		}
 		JavaModelManager manager = JavaModelManager.getJavaModelManager();
 		for (int i = existingLength; i < length; i++) {
-			if (Util.isValidFolderNameForPackage(pkgName[i], sourceLevel, compliance)) {
+			// sourceLevel must be null because we know nothing about it based on a jar file
+			// complianceLevel can be retrieved from a jar file
+			if (Util.isValidFolderNameForPackage(pkgName[i], null, this.complianceLevel)) {
 				System.arraycopy(existing, 0, existing = new String[i+1], 0, i);
 				existing[i] = manager.intern(pkgName[i]);
 				rawPackageInfo.put(existing, new ArrayList[] { EMPTY_LIST, EMPTY_LIST });
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.java
index 3a5bb10..a415db3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.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
@@ -22,6 +22,7 @@
  * Initially done in JavaCore.initializeDefaultPreferences which was deprecated
  * with new eclipse preferences mechanism.
  */
+@SuppressWarnings({ "unchecked", "rawtypes" })
 public class JavaCorePreferenceInitializer extends AbstractPreferenceInitializer {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElement.java
index 4ccb5b6..35d5d17 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -42,6 +42,7 @@
  *
  * @see IJavaElement
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class JavaElement extends PlatformObject implements IJavaElement {
 //	private static final QualifiedName PROJECT_JAVADOC= new QualifiedName(JavaCore.PLUGIN_ID, "project_javadoc_location"); //$NON-NLS-1$
 
@@ -68,6 +69,10 @@
 	public static final char JEM_LOCALVARIABLE = '@';
 	public static final char JEM_TYPE_PARAMETER = ']';
 	public static final char JEM_ANNOTATION = '}';
+	public static final char JEM_LAMBDA_EXPRESSION = ')';
+	public static final char JEM_LAMBDA_METHOD = '&';
+	public static final char JEM_STRING = '"';
+	
 
 	/**
 	 * This element's parent, or <code>null</code> if this
@@ -148,6 +153,9 @@
 				case JEM_LOCALVARIABLE:
 				case JEM_TYPE_PARAMETER:
 				case JEM_ANNOTATION:
+				case JEM_LAMBDA_EXPRESSION:
+				case JEM_LAMBDA_METHOD:
+				case JEM_STRING:
 					buffer.append(JEM_ESCAPE);
 			}
 			buffer.append(character);
@@ -718,9 +726,9 @@
 		if (arrayLength < toBeFoundLength)
 			return -1;
 		loop: for (int i = start, max = arrayLength - toBeFoundLength + 1; i < max; i++) {
-			if (array[i] == toBeFound[0]) {
+			if (isSameCharacter(array[i], toBeFound[0])) {
 				for (int j = 1; j < toBeFoundLength; j++) {
-					if (array[i + j] != toBeFound[j])
+					if (!isSameCharacter(array[i + j], toBeFound[j]))
 						continue loop;
 				}
 				return i;
@@ -728,6 +736,13 @@
 		}
 		return -1;
 	}
+	boolean isSameCharacter(byte b1, byte b2) {
+		if (b1 == b2 || Character.toUpperCase((char) b1) == Character.toUpperCase((char) b2)) {
+			return true;
+		}
+		return false;
+	}
+	
 	/*
 	 * We don't use getContentEncoding() on the URL connection, because it might leave open streams behind.
 	 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=117890
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDelta.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDelta.java
index 6e40972..760b76c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDelta.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDelta.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
@@ -20,6 +20,7 @@
 /**
  * @see IJavaElementDelta
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaElementDelta extends SimpleDelta implements IJavaElementDelta {
 	/**
 	 * @see #getAffectedChildren()
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder.java
index 25a8188..c1e3cd7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder.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
@@ -36,6 +36,7 @@
  * createDeltas() is called, it creates a delta over the cached
  * contents and the new contents.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class JavaElementDeltaBuilder {
 	/**
 	 * The java element handle
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementRequestor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementRequestor.java
index 5fb834b..c676778 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementRequestor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaElementRequestor.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
@@ -22,6 +22,7 @@
  * @see IJavaElementRequestor
  */
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class JavaElementRequestor implements IJavaElementRequestor {
 	/**
 	 * True if this requestor no longer wants to receive
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModel.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModel.java
index 83e9e4f..b4684da 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModel.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModel.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
@@ -38,6 +38,7 @@
  *
  * @see IJavaModel
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaModel extends Openable implements IJavaModel {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelCache.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelCache.java
index d6bf885..e4f758a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelCache.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelCache.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
@@ -20,6 +20,7 @@
 /**
  * The cache of java elements to their respective info.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaModelCache {
 	public static boolean VERBOSE = false;
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager.java
index dac8b2a..6a0fc6d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelManager.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Theodora Yeung (tyeung@bea.com) - ensure that JarPackageFragmentRoot make it into cache
@@ -16,6 +12,7 @@
  *                                                           (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=102422)
  *     Stephan Herrmann - Contribution for Bug 346010 - [model] strange initialization dependency in OptionTests
  *     Terry Parker <tparker@google.com> - DeltaProcessor misses state changes in archive files, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=357425
+ *     Thirumala Reddy Mutchukota <thirumala@google.com> - Contribution to bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=411423
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core;
 
@@ -88,10 +85,12 @@
  * The single instance of <code>JavaModelManager</code> is available from
  * the static method <code>JavaModelManager.getJavaModelManager()</code>.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class JavaModelManager implements ISaveParticipant, IContentTypeChangeListener {
 
 	private static final String NON_CHAINING_JARS_CACHE = "nonChainingJarsCache"; //$NON-NLS-1$
 	private static final String INVALID_ARCHIVES_CACHE = "invalidArchivesCache";  //$NON-NLS-1$
+	private static final String EXTERNAL_FILES_CACHE = "externalFilesCache";  //$NON-NLS-1$
 
 	/**
 	 * Define a zip cache object.
@@ -1449,6 +1448,11 @@
 	 */
 	private Set invalidArchives;
 
+	/*
+	 * List of IPath of files that are known to be external to the workspace
+	 */
+	private Set externalFiles;
+
 	/**
 	 * Update the classpath variable cache
 	 */
@@ -1583,6 +1587,7 @@
 			this.indexManager = new IndexManager();
 			this.nonChainingJars = loadClasspathListCache(NON_CHAINING_JARS_CACHE);
 			this.invalidArchives = loadClasspathListCache(INVALID_ARCHIVES_CACHE);
+			this.externalFiles = loadClasspathListCache(EXTERNAL_FILES_CACHE);
 			String includeContainerReferencedLib = System.getProperty(RESOLVE_REFERENCED_LIBRARIES_FOR_CONTAINERS);
 			this.resolveReferencedLibrariesForContainers = TRUE.equalsIgnoreCase(includeContainerReferencedLib);
 		}
@@ -1611,6 +1616,16 @@
 		}
 	}
 
+	public void addExternalFile(IPath path) {
+		// unlikely to be null
+		if (this.externalFiles == null) {
+			this.externalFiles = Collections.synchronizedSet(new HashSet());
+		}
+		if(this.externalFiles != null) {
+			this.externalFiles.add(path);
+		}
+	}
+
 	/**
 	 * Starts caching ZipFiles.
 	 * Ignores if there are already clients.
@@ -3101,6 +3116,10 @@
 		}
 	}
 
+	public boolean isExternalFile(IPath path) {
+		return this.externalFiles != null && this.externalFiles.contains(path);
+	}
+
 	public void setClasspathBeingResolved(IJavaProject project, boolean classpathIsResolved) {
 	    if (classpathIsResolved) {
 	        getClasspathBeingResolved().add(project);
@@ -3169,7 +3188,9 @@
 			return getNonChainingJarsCache();
 		else if (cacheName == INVALID_ARCHIVES_CACHE)
 			return this.invalidArchives;
-		else 
+		else if (cacheName == EXTERNAL_FILES_CACHE)
+			return this.externalFiles;
+		else
 			return null;
 	}
 	
@@ -3911,6 +3932,8 @@
 			this.nonChainingJars.clear();
 		if (this.invalidArchives != null) 
 			this.invalidArchives.clear();
+		if (this.externalFiles != null)
+			this.externalFiles.clear();
 	}
 
 	/*
@@ -4256,9 +4279,10 @@
 
 		switch(context.getKind()) {
 			case ISaveContext.FULL_SAVE : {
-				// save non-chaining jar and invalid jar caches on full save
+				// save non-chaining jar, invalid jar and external file caches on full save
 				saveClasspathListCache(NON_CHAINING_JARS_CACHE);
 				saveClasspathListCache(INVALID_ARCHIVES_CACHE);
+				saveClasspathListCache(EXTERNAL_FILES_CACHE);
 	
 				// will need delta since this save (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=38658)
 				context.needDelta();
@@ -4578,20 +4602,21 @@
 		Iterator packages = secondaryTypes.values().iterator();
 		while (packages.hasNext()) {
 			HashMap types = (HashMap) packages.next();
+			HashMap tempTypes = new HashMap(types.size());
 			Iterator names = types.entrySet().iterator();
 			while (names.hasNext()) {
 				Map.Entry entry = (Map.Entry) names.next();
 				String typeName = (String) entry.getKey();
 				String path = (String) entry.getValue();
+				names.remove();
 				if (org.aspectj.org.eclipse.jdt.internal.core.util.Util.isJavaLikeFileName(path)) {
 					IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(path));
 					ICompilationUnit unit = JavaModelManager.createCompilationUnitFrom(file, null);
 					IType type = unit.getType(typeName);
-					types.put(typeName, type); // replace stored path with type itself
-				} else {
-					names.remove();
+					tempTypes.put(typeName, type);
 				}
 			}
+			types.putAll(tempTypes);
 		}
 
 		// Store result in per project info cache if still null or there's still an indexing cache (may have been set by another thread...)
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation.java
index ffda71a..916ba91 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaModelOperation.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
@@ -26,6 +26,7 @@
 /**
  * Defines behavior common to all Java Model operations
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class JavaModelOperation implements IWorkspaceRunnable, IProgressMonitor {
 	protected interface IPostAction {
 		/*
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaProject.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaProject.java
index 742d3b2..d2a57dd 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaProject.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaProject.java
@@ -105,6 +105,7 @@
  *
  * @see IJavaProject
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class JavaProject
 	extends Openable
 	implements IJavaProject, IProjectNature, SuffixConstants {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java
index b232916..de4c05e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavaProjectElementInfo.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
@@ -32,6 +32,7 @@
  * that are internal to the project, use <code>JavaProject#getChildren()</code>.
  */
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 /* package */
 class JavaProjectElementInfo extends OpenableElementInfo {
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavadocConstants.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavadocConstants.java
index 37b017f..c6d1ba4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavadocConstants.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavadocConstants.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
@@ -39,4 +39,6 @@
 	char[] SEPARATOR_START = "<!-- =".toCharArray(); //$NON-NLS-1$
 	char[] START_OF_CLASS_DATA = "<!-- ======== START OF CLASS DATA ======== -->".toCharArray(); //$NON-NLS-1$
 	int START_OF_CLASS_DATA_LENGTH = JavadocConstants.START_OF_CLASS_DATA.length;
+	String P = "<P>"; //$NON-NLS-1$
+	String DIV_CLASS_BLOCK = "<DIV CLASS=\"BLOCK\">"; //$NON-NLS-1$
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavadocContents.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavadocContents.java
index 52f8aa8..fca7109 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavadocContents.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/JavadocContents.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2012 IBM Corporation and others.
+ * Copyright (c) 2009, 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
@@ -479,13 +479,22 @@
 			return;
 		}
 		/*
-		 * Check out to cut off the hierarchy see 119844
-		 * We remove what the contents between the start of class data and the first <P>
+		 * Cut off the type hierarchy, see bug 119844.
+		 * We remove the contents between the start of class data and where
+		 * we guess the actual class comment starts.
 		 */
 		int start = indexOfStartOfClassData + JavadocConstants.START_OF_CLASS_DATA_LENGTH;
-		int indexOfFirstParagraph = CharOperation.indexOf("<P>".toCharArray(), this.content, false, start); //$NON-NLS-1$
-		if (indexOfFirstParagraph != -1 && indexOfFirstParagraph < indexOfNextSummary) {
-			start = indexOfFirstParagraph;
+		int indexOfFirstParagraph = CharOperation.indexOf(JavadocConstants.P.toCharArray(), this.content, false, start, indexOfNextSummary);
+		int indexOfFirstDiv = CharOperation.indexOf(JavadocConstants.DIV_CLASS_BLOCK.toCharArray(), this.content, false, start, indexOfNextSummary);
+		int afterHierarchy = indexOfNextSummary;
+		if (indexOfFirstParagraph != -1 && indexOfFirstParagraph < afterHierarchy) {
+			afterHierarchy = indexOfFirstParagraph;
+		}
+		if (indexOfFirstDiv != -1 && indexOfFirstDiv < afterHierarchy) {
+			afterHierarchy = indexOfFirstDiv;
+		}
+		if (afterHierarchy != indexOfNextSummary) {
+			start = afterHierarchy;
 		}
 		
 		this.typeDocRange = new int[]{start, indexOfNextSummary};
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator.java
index 79bb935..43951a6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LRUCacheEnumerator.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
@@ -22,6 +22,7 @@
  *	elements returned from the enumerator could have been closed
  *	by the cache.
  */
+@SuppressWarnings("rawtypes")
 public class LRUCacheEnumerator implements Enumeration {
 	/**
 	 *	Current element;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LambdaExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LambdaExpression.java
new file mode 100644
index 0000000..18d9b57
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LambdaExpression.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2014 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.aspectj.org.eclipse.jdt.internal.core;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.aspectj.org.eclipse.jdt.core.IJavaElement;
+import org.aspectj.org.eclipse.jdt.core.ILocalVariable;
+import org.aspectj.org.eclipse.jdt.core.IMethod;
+import org.aspectj.org.eclipse.jdt.core.JavaModelException;
+import org.aspectj.org.eclipse.jdt.core.Signature;
+import org.aspectj.org.eclipse.jdt.core.WorkingCopyOwner;
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
+import org.aspectj.org.eclipse.jdt.internal.core.util.MementoTokenizer;
+import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
+
+public class LambdaExpression extends SourceType {
+
+	SourceTypeElementInfo elementInfo;
+	LambdaMethod lambdaMethod;
+	
+	// These fields could be materialized from elementInfo, but for ease of use stashed here 
+	protected int sourceStart;
+	protected int sourceEnd;
+	protected int arrowPosition;
+	protected String interphase;
+	
+	
+	// Construction from AST node
+	public LambdaExpression(JavaElement parent, org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression lambdaExpression) {
+		super(parent, new String("Lambda(") + new String(lambdaExpression.resolvedType.sourceName()) + ')'); //$NON-NLS-1$
+		this.sourceStart = lambdaExpression.sourceStart;
+		this.sourceEnd = lambdaExpression.sourceEnd;
+		this.arrowPosition = lambdaExpression.arrowPosition;
+		this.interphase = new String(CharOperation.replaceOnCopy(lambdaExpression.resolvedType.genericTypeSignature(), '/', '.'));
+		this.elementInfo = makeTypeElementInfo(this, this.interphase, this.sourceStart, this.sourceEnd, this.arrowPosition); 
+		this.lambdaMethod = LambdaMethod.make(this, lambdaExpression);
+		this.elementInfo.children = new IJavaElement[] { this.lambdaMethod };
+	}
+	
+	// Construction from memento
+	public LambdaExpression(JavaElement parent, String name, String interphase, int sourceStart, int sourceEnd, int arrowPosition) {
+		super(parent, name);
+		this.sourceStart = sourceStart;
+		this.sourceEnd = sourceEnd;
+		this.arrowPosition = arrowPosition;
+		this.interphase = interphase;
+		this.elementInfo = makeTypeElementInfo(this, interphase, this.sourceStart = sourceStart, sourceEnd, arrowPosition);
+		// Method is in the process of being fabricated, will be attached shortly.
+	}
+	
+	// Construction from subtypes.
+	public LambdaExpression(JavaElement parent, String name, String interphase, int sourceStart, int sourceEnd, int arrowPosition, LambdaMethod lambdaMethod) {
+		super(parent, name);
+		this.sourceStart = sourceStart;
+		this.sourceEnd = sourceEnd;
+		this.arrowPosition = arrowPosition;
+		this.interphase = interphase;
+		this.elementInfo = makeTypeElementInfo(this, interphase, this.sourceStart = sourceStart, sourceEnd, arrowPosition);
+		this.elementInfo.children = new IJavaElement[] { this.lambdaMethod = lambdaMethod };
+	}
+	
+	// Lambda expression is not backed by model, fabricate element information structure and stash it.
+	static private SourceTypeElementInfo makeTypeElementInfo (LambdaExpression handle, String interphase, int sourceStart, int sourceEnd, int arrowPosition) {
+		
+		SourceTypeElementInfo elementInfo = new SourceTypeElementInfo();
+		
+		elementInfo.setFlags(0);
+		elementInfo.setHandle(handle);
+		elementInfo.setSourceRangeStart(sourceStart);
+		elementInfo.setSourceRangeEnd(sourceEnd);
+		
+		elementInfo.setNameSourceStart(sourceStart);
+		elementInfo.setNameSourceEnd(arrowPosition);
+		elementInfo.setSuperclassName(null);
+		elementInfo.addCategories(handle, null);
+		
+		JavaModelManager manager = JavaModelManager.getJavaModelManager();
+		char[][] superinterfaces = new char [][] { manager.intern(Signature.toString(interphase).toCharArray()) }; // drops marker interfaces - to fix.
+		elementInfo.setSuperInterfaceNames(superinterfaces);
+		return elementInfo;
+	}
+	
+	protected void closing(Object info) throws JavaModelException {
+		// nothing to do, not backed by model ATM.
+	}
+	
+	public boolean equals(Object o) {
+		if (this == o)
+			return true;
+		/* I see cases where equal lambdas are dismissed as unequal on account of working copy owner.
+		   This results in spurious failures. See JavaSearchBugs8Tests.testBug400905_0021()
+		   For now exclude the working copy owner and compare
+		*/
+		if (o instanceof LambdaExpression) {
+			LambdaExpression that = (LambdaExpression) o;
+			if (this.sourceStart != that.sourceStart)
+				return false;
+			CompilationUnit thisCU = (CompilationUnit) this.getCompilationUnit();
+			CompilationUnit thatCU = (CompilationUnit) that.getCompilationUnit();
+			return thisCU.getElementName().equals(thatCU.getElementName()) && thisCU.parent.equals(thatCU.parent);
+		}
+		return false;
+	}
+	
+	public int hashCode() {
+		return Util.combineHashCodes(super.hashCode(), this.sourceStart);
+	}
+	
+	public Object getElementInfo(IProgressMonitor monitor) throws JavaModelException {
+		return this.elementInfo;
+	}
+
+	protected char getHandleMementoDelimiter() {
+		return JavaElement.JEM_LAMBDA_EXPRESSION;
+	}
+	
+	/*
+	 * @see JavaElement#getHandleMemento(StringBuffer)
+	 */
+	protected void getHandleMemento(StringBuffer buff) {
+		getHandleMemento(buff, true);
+	}
+	
+	protected void getHandleMemento(StringBuffer buff, boolean memoizeParent) {
+		if (memoizeParent) 
+			((JavaElement)getParent()).getHandleMemento(buff);
+		buff.append(getHandleMementoDelimiter());
+		escapeMementoName(buff, this.name);
+		buff.append(JEM_STRING);
+		escapeMementoName(buff, this.interphase);
+		buff.append(JEM_COUNT);
+		buff.append(this.sourceStart);
+		buff.append(JEM_COUNT);
+		buff.append(this.sourceEnd);
+		buff.append(JEM_COUNT);
+		buff.append(this.arrowPosition);
+	}
+	
+	public IJavaElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner workingCopyOwner) {
+
+		if (token.charAt(0) != JEM_LAMBDA_METHOD)
+			return null;
+		
+		// ----
+		if (!memento.hasMoreTokens()) return this;
+		String selector = memento.nextToken();
+		if (!memento.hasMoreTokens() || memento.nextToken().charAt(0) != JEM_COUNT) return this;
+		if (!memento.hasMoreTokens()) return this;
+		int length = Integer.parseInt(memento.nextToken());
+		String [] parameterTypes = new String[length];
+		String [] parameterNames = new String[length];
+		for (int i = 0; i < length; i++) {
+			if (!memento.hasMoreTokens() || memento.nextToken().charAt(0) != JEM_STRING) return this;
+			parameterTypes[i] = memento.nextToken();
+			if (!memento.hasMoreTokens() || memento.nextToken().charAt(0) != JEM_STRING) return this;
+			parameterNames[i] = memento.nextToken();
+		}
+		if (!memento.hasMoreTokens() || memento.nextToken().charAt(0) != JEM_STRING) return this;
+		String returnType = memento.nextToken();
+		if (!memento.hasMoreTokens() || memento.nextToken().charAt(0) != JEM_STRING) return this;
+		String key = memento.nextToken();
+		this.lambdaMethod = LambdaMethod.make(this, selector, key, this.sourceStart, this.sourceEnd, this.arrowPosition, parameterTypes, parameterNames, returnType);
+		ILocalVariable [] parameters = new ILocalVariable[length];
+		for (int i = 0; i < length; i++) {
+			parameters[i] = (ILocalVariable) this.lambdaMethod.getHandleFromMemento(memento, workingCopyOwner);
+		}
+		this.lambdaMethod.elementInfo.arguments  = parameters;
+		this.elementInfo.children = new IJavaElement[] { this.lambdaMethod };
+		return this.lambdaMethod;
+	}
+
+	public IJavaElement[] getChildren() throws JavaModelException {
+		return new IJavaElement[] { this.lambdaMethod };
+	}
+
+	public boolean isLocal() {
+		return true;
+	}
+	
+	public JavaElement resolved(Binding binding) {
+		ResolvedLambdaExpression resolvedHandle = new ResolvedLambdaExpression(this.parent, this, new String(binding.computeUniqueKey()));
+		return resolvedHandle;
+	}
+
+	public IMethod getMethod() {
+		return this.lambdaMethod;
+	}
+	
+	@Override
+	public IJavaElement getPrimaryElement(boolean checkOwner) {
+		if (checkOwner) {
+			CompilationUnit cu = (CompilationUnit)getAncestor(COMPILATION_UNIT);
+			if (cu == null || cu.isPrimary()) return this;
+		}
+		IJavaElement primaryParent = this.parent.getPrimaryElement(false);
+		if (primaryParent instanceof JavaElement) {
+			JavaElement ancestor = (JavaElement) primaryParent;
+			StringBuffer buffer = new StringBuffer(32);
+			getHandleMemento(buffer, false);
+			this.lambdaMethod.getHandleMemento(buffer, false);
+			String memento = buffer.toString();
+			return ancestor.getHandleFromMemento(new MementoTokenizer(memento), DefaultWorkingCopyOwner.PRIMARY).getParent();
+		}
+		return this;
+	}
+
+	public String[] getSuperInterfaceTypeSignatures() throws JavaModelException {
+		return new String[] { this.interphase };
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LambdaMethod.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LambdaMethod.java
new file mode 100644
index 0000000..c8d0016
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LambdaMethod.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2014 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.aspectj.org.eclipse.jdt.internal.core;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.aspectj.org.eclipse.jdt.core.ILocalVariable;
+import org.aspectj.org.eclipse.jdt.core.IMethod;
+import org.aspectj.org.eclipse.jdt.core.JavaModelException;
+import org.aspectj.org.eclipse.jdt.core.Signature;
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Argument;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
+
+public class LambdaMethod extends SourceMethod {
+
+	private int sourceStart; // cached for ease of use in hashcode/equals.
+	private String [] parameterNameStrings;
+	private String returnTypeString;
+	SourceMethodElementInfo elementInfo;
+	private String key;
+	
+	public LambdaMethod(JavaElement parent, String name, String key, int sourceStart, String [] parameterTypes, String [] parameterNames, String returnType, SourceMethodElementInfo elementInfo) {
+		super(parent, name, parameterTypes);
+		this.sourceStart = sourceStart;
+		this.parameterNameStrings = parameterNames;
+		this.returnTypeString = returnType;
+		this.elementInfo = elementInfo;
+		this.key = key;
+	}
+	
+	public static LambdaMethod make(JavaElement parent, org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression lambdaExpression) {
+		int length;
+		JavaModelManager manager = JavaModelManager.getJavaModelManager();
+		String [] parameterTypes = new String[length = lambdaExpression.descriptor.parameters.length];
+		for (int i = 0; i < length; i++)
+			parameterTypes[i] = getTypeSignature(manager, lambdaExpression.descriptor.parameters[i]);
+		String [] parameterNames = new String[length];
+		for (int i = 0; i < length; i++)
+			parameterNames[i] = manager.intern(new String(lambdaExpression.arguments[i].name));
+		String returnType = getTypeSignature(manager, lambdaExpression.descriptor.returnType);
+		String selector = manager.intern(new String(lambdaExpression.descriptor.selector));
+		String key = new String(lambdaExpression.descriptor.computeUniqueKey());
+		LambdaMethod lambdaMethod = make(parent, selector, key, lambdaExpression.sourceStart, lambdaExpression.sourceEnd, lambdaExpression.arrowPosition, parameterTypes, parameterNames, returnType);
+		ILocalVariable [] parameters = new ILocalVariable[length = lambdaExpression.arguments.length];
+		for (int i = 0; i < length; i++) {
+			Argument argument = lambdaExpression.arguments[i];
+			String signature = manager.intern(new String(lambdaExpression.descriptor.parameters[i].signature()));
+			parameters[i] = new LocalVariable(
+					lambdaMethod,
+					new String(argument.name),
+					argument.declarationSourceStart,
+					argument.declarationSourceEnd,
+					argument.sourceStart,
+					argument.sourceEnd,
+					signature,
+					null, // we are not hooking up argument.annotations ATM,
+					argument.modifiers,
+					true);
+		}
+		lambdaMethod.elementInfo.arguments = parameters;
+		return lambdaMethod;
+	}
+	
+	public static LambdaMethod make(JavaElement parent, String selector, String key, int sourceStart, int sourceEnd, int arrowPosition, String [] parameterTypes, String [] parameterNames, String returnType) {
+		SourceMethodInfo info = new SourceMethodInfo();
+		info.setSourceRangeStart(sourceStart);
+		info.setSourceRangeEnd(sourceEnd);
+		info.setFlags(0);
+		info.setNameSourceStart(sourceStart);
+		info.setNameSourceEnd(arrowPosition);
+		JavaModelManager manager = JavaModelManager.getJavaModelManager();
+		int length;
+		char[][] argumentNames = new char[length = parameterNames.length][];
+		for (int i = 0; i < length; i++)
+			argumentNames[i] = manager.intern(parameterNames[i].toCharArray());
+		info.setArgumentNames(argumentNames);
+		info.setReturnType(manager.intern(Signature.toCharArray(returnType.toCharArray())));
+		info.setExceptionTypeNames(CharOperation.NO_CHAR_CHAR);
+		info.arguments = null; // will be updated shortly, parent has to come into existence first.
+		return new LambdaMethod(parent, selector, key, sourceStart, parameterTypes, parameterNames, returnType, info);
+	}
+
+	public static String getTypeSignature(JavaModelManager manager, TypeBinding type) {
+		char[] signature = type.genericTypeSignature();
+		signature = CharOperation.replaceOnCopy(signature, '/', '.');
+		return manager.intern(new String(signature));
+	}
+
+	/**
+	 * @see IMethod
+	 */
+	public String getReturnType() throws JavaModelException {
+		return this.returnTypeString;
+	}
+	/**
+	 * @see IMethod
+	 */
+	public String getSignature() throws JavaModelException {
+		return Signature.createMethodSignature(this.parameterTypes, this.returnTypeString);
+	}
+	/**
+	 * @see IMethod#isLambdaMethod()
+	 */
+	public boolean isLambdaMethod() {
+		return true;
+	}
+	
+	protected void closing(Object info) {
+		// nothing to do.
+	}
+	
+	public boolean equals(Object o) {
+		if (!(o instanceof LambdaMethod)) return false;
+		LambdaMethod that = (LambdaMethod) o;
+		return super.equals(o) && this.sourceStart == that.sourceStart;
+	}
+
+	public Object getElementInfo(IProgressMonitor monitor) throws JavaModelException {
+		return this.elementInfo;
+	}
+	
+	public void getHandleMemento(StringBuffer buff, boolean memoizeParent) {
+		if (memoizeParent)
+			((JavaElement) getParent()).getHandleMemento(buff);
+		char delimiter = getHandleMementoDelimiter();
+		buff.append(delimiter);
+		escapeMementoName(buff, getElementName());
+		buff.append(JEM_COUNT);
+		buff.append(this.parameterTypes.length);
+		for (int i = 0, length = this.parameterTypes.length; i < length; i++) {
+			buff.append(JEM_STRING);
+			escapeMementoName(buff, this.parameterTypes[i]);
+			buff.append(JEM_STRING);
+			escapeMementoName(buff, this.parameterNameStrings[i]);
+		}
+		buff.append(JEM_STRING);
+		escapeMementoName(buff, this.returnTypeString);
+		buff.append(JEM_STRING);
+		escapeMementoName(buff, this.key);
+		ILocalVariable[] arguments = this.elementInfo.arguments;
+		for (int i = 0, length = arguments.length; i < length; i++) {
+			LocalVariable local = (LocalVariable) arguments[i];
+			local.getHandleMemento(buff, false);
+		}
+	}
+	public void getHandleMemento(StringBuffer buff) {
+		getHandleMemento(buff, true);
+	}
+	
+	protected char getHandleMementoDelimiter() {
+		return JavaElement.JEM_LAMBDA_METHOD;
+	}
+	
+	public String getKey() {
+		return this.key;
+	}
+	
+	public int hashCode() {
+	   return Util.combineHashCodes(super.hashCode(), this.sourceStart);
+	}
+	
+	public boolean isResolved() {
+		return true;  // we maintain enough information so as not to need another layer of abstraction.
+	}
+	
+	public JavaElement resolved(Binding binding) {
+		return this;
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable.java
index a56d1cc..13b59e2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/LocalVariable.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
@@ -44,6 +44,7 @@
 	public IAnnotation[] annotations;
 	private int flags;
 	private boolean isParameter;
+	public IAnnotation[][] annotationsOnDimensions;
 
 	public LocalVariable(
 			JavaElement parent,
@@ -68,6 +69,30 @@
 		this.flags = flags;
 		this.isParameter = isParameter;
 	}
+	public LocalVariable(
+			JavaElement parent,
+			String name,
+			int declarationSourceStart,
+			int declarationSourceEnd,
+			int nameStart,
+			int nameEnd,
+			String typeSignature,
+			org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[] astAnnotations,
+			int flags,
+			boolean isParameter,
+		org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation[][] astAnnotationsOnDimensions) {
+		
+		this(parent, name, declarationSourceStart, declarationSourceEnd, nameStart,
+				nameEnd, typeSignature, astAnnotations, flags, isParameter);
+
+		int noOfDimensions = astAnnotationsOnDimensions == null ? 0 : astAnnotationsOnDimensions.length;
+		if (noOfDimensions > 0) {
+			this.annotationsOnDimensions = new IAnnotation[noOfDimensions][];
+			for (int i = 0; i < noOfDimensions; ++i) {
+				this.annotationsOnDimensions[i] = getAnnotations(astAnnotationsOnDimensions[i]);
+			}
+		}
+	}
 
 	protected void closing(Object info) {
 		// a local variable has no info
@@ -239,7 +264,12 @@
 	 * @see JavaElement#getHandleMemento(StringBuffer)
 	 */
 	protected void getHandleMemento(StringBuffer buff) {
-		((JavaElement)getParent()).getHandleMemento(buff);
+		getHandleMemento(buff, true);
+	}
+	
+	protected void getHandleMemento(StringBuffer buff, boolean memoizeParent) {
+		if (memoizeParent) 
+			((JavaElement)getParent()).getHandleMemento(buff);
 		buff.append(getHandleMementoDelimiter());
 		buff.append(this.name);
 		buff.append(JEM_COUNT);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Member.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Member.java
index c78bee5..7000dc1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Member.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Member.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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 @@
  * @see IMember
  */
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class Member extends SourceRefElement implements IMember {
 
 protected Member(JavaElement parent) {
@@ -171,6 +172,26 @@
 	switch (token.charAt(0)) {
 		case JEM_COUNT:
 			return getHandleUpdatingCountFromMemento(memento, workingCopyOwner);
+		case JEM_LAMBDA_EXPRESSION:
+			if (!memento.hasMoreTokens()) return this;
+			String name = memento.nextToken();
+			if (!memento.hasMoreTokens() || memento.nextToken() != MementoTokenizer.STRING)
+				return this;
+			if (!memento.hasMoreTokens()) return this;
+			String interphase = memento.nextToken();
+			if (!memento.hasMoreTokens() || memento.nextToken() != MementoTokenizer.COUNT) 
+				return this;
+			int sourceStart = Integer.parseInt(memento.nextToken());
+			if (!memento.hasMoreTokens() || memento.nextToken() != MementoTokenizer.COUNT) 
+				return this;
+			int sourceEnd = Integer.parseInt(memento.nextToken());
+			if (!memento.hasMoreTokens() || memento.nextToken() != MementoTokenizer.COUNT) 
+				return this;
+			int arrowPosition = Integer.parseInt(memento.nextToken());
+			LambdaExpression expression = new LambdaExpression(this, name, interphase, sourceStart, sourceEnd, arrowPosition);
+			if (!memento.hasMoreTokens() || (token = memento.nextToken()) != MementoTokenizer.LAMBDA_METHOD) 
+				return expression;
+			return expression.getHandleFromMemento(token, memento, workingCopyOwner);
 		case JEM_TYPE:
 			String typeName;
 			if (memento.hasMoreTokens()) {
@@ -355,7 +376,10 @@
 protected boolean isMainMethod(IMethod method) throws JavaModelException {
 	if ("main".equals(method.getElementName()) && Signature.SIG_VOID.equals(method.getReturnType())) { //$NON-NLS-1$
 		int flags= method.getFlags();
-		if (Flags.isStatic(flags) && Flags.isPublic(flags)) {
+		IType declaringType = null;
+		if (Flags.isStatic(flags) &&
+				(Flags.isPublic(flags) || 
+						((declaringType = getDeclaringType()) != null && declaringType.isInterface()))) {
 			String[] paramTypes= method.getParameterTypes();
 			if (paramTypes.length == 1) {
 				String typeSignature=  Signature.toString(paramTypes[0]);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ModelUpdater.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ModelUpdater.java
index 6ed52e2..924cc56 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ModelUpdater.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ModelUpdater.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
@@ -20,6 +20,7 @@
  * This class is used by <code>JavaModelManager</code> to update the JavaModel
  * based on some <code>IJavaElementDelta</code>s.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ModelUpdater {
 
 	HashSet projectsToUpdate = new HashSet();
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/MultiOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/MultiOperation.java
index 5fe5dfa..0b4029a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/MultiOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/MultiOperation.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
@@ -25,6 +25,7 @@
  * <code>JavaModelStatus</code>. Otherwise, a simple <code>JavaModelStatus</code>
  * is thrown.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class MultiOperation extends JavaModelOperation {
 	/**
 	 * Table specifying insertion positions for elements being
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/NameLookup.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/NameLookup.java
index 892fe0c..c3028ec 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/NameLookup.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/NameLookup.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
@@ -56,6 +56,7 @@
  * in real time through an <code>IJavaElementRequestor</code>.
  *
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class NameLookup implements SuffixConstants {
 	public static class Answer {
 		public IType type;
@@ -702,6 +703,25 @@
 				}
 			}
 		}
+		if (type != null) {
+			ICompilationUnit unit = type.getCompilationUnit();
+			if (unit != null && unit.isWorkingCopy()) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=421902
+				IType[] types = null;
+				try {
+					types = unit.getTypes();
+				} catch (JavaModelException e) {
+					return null;
+				}
+				boolean typeFound = false;
+				for (int i = 0, typesLength = types == null ? 0 : types.length; i < typesLength; i++) {
+					if (types[i].getElementName().equals(typeName)) {
+						typeFound = true;
+						break;
+					}
+				}
+				if (!typeFound) type = null;
+			}
+		}
 		return type == null ? null : new Answer(type, null);
 	}
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Openable.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Openable.java
index 459b396..8e616b1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Openable.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Openable.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
@@ -31,6 +31,7 @@
  * @see IJavaElement
  * @see IOpenable
  */
+@SuppressWarnings({"rawtypes"})
 public abstract class Openable extends JavaElement implements IOpenable, IBufferChangedListener {
 
 protected Openable(JavaElement parent) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache.java
index 46a51db..6113025 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/OverflowingLRUCache.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
@@ -48,6 +48,7 @@
  *
  *	@see LRUCache
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public abstract class OverflowingLRUCache extends LRUCache {
 	/**
 	 * Indicates if the cache has been over filled and by how much.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragment.java
index 28d8392..32c7bf7 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragment.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -44,6 +44,7 @@
 /**
  * @see IPackageFragment
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class PackageFragment extends Openable implements IPackageFragment, SuffixConstants {
 	/**
 	 * Constant empty list of class files
@@ -56,9 +57,12 @@
 
 	public String[] names;
 
+	private boolean isValidPackageName;
+
 protected PackageFragment(PackageFragmentRoot root, String[] names) {
 	super(root);
 	this.names = names;
+	this.isValidPackageName = internalIsValidPackageName();
 }
 /**
  * @see Openable
@@ -383,14 +387,11 @@
 	}
 	return false;
 }
-/**
- * @see IPackageFragment#isDefaultPackage()
- */
-public boolean isDefaultPackage() {
-	return this.names.length == 0;
-}
-private boolean isValidPackageName() {
-	JavaProject javaProject = (JavaProject) getJavaProject();
+protected boolean internalIsValidPackageName() {
+	// if package fragment refers to folder in another IProject, then
+	// resource().getProject() is different than getJavaProject().getProject()
+	// use the other java project's options to verify the name
+	IJavaProject javaProject = JavaCore.create(resource().getProject());
 	String sourceLevel = javaProject.getOption(JavaCore.COMPILER_SOURCE, true);
 	String complianceLevel = javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
 	for (int i = 0, length = this.names.length; i < length; i++) {
@@ -400,6 +401,15 @@
 	return true;
 }
 /**
+ * @see IPackageFragment#isDefaultPackage()
+ */
+public boolean isDefaultPackage() {
+	return this.names.length == 0;
+}
+protected final boolean isValidPackageName() {
+	return this.isValidPackageName;
+}
+/**
  * @see ISourceManipulation#move(IJavaElement, IJavaElement, String, boolean, IProgressMonitor)
  */
 public void move(IJavaElement container, IJavaElement sibling, String rename, boolean force, IProgressMonitor monitor) throws JavaModelException {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRoot.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRoot.java
index c151e74..9666626 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRoot.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRoot.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,7 @@
 /**
  * @see IPackageFragmentRoot
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class PackageFragmentRoot extends Openable implements IPackageFragmentRoot {
 
 	/**
@@ -220,14 +221,18 @@
 		vChildren.add(pkg);
 	}
 	try {
-		JavaProject javaProject = (JavaProject)getJavaProject();
-		JavaModelManager manager = JavaModelManager.getJavaModelManager();
 		IResource[] members = folder.members();
 		boolean hasIncluded = isIncluded;
 		int length = members.length;
-		if (length >0) {
-			String sourceLevel = javaProject.getOption(JavaCore.COMPILER_SOURCE, true);
-			String complianceLevel = javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
+		if (length > 0) {
+			// if package fragment root refers to folder in another IProject, then
+			// folder.getProject() is different than getJavaProject().getProject()
+			// use the other java project's options to verify the name
+			IJavaProject otherJavaProject = JavaCore.create(folder.getProject());
+			String sourceLevel = otherJavaProject.getOption(JavaCore.COMPILER_SOURCE, true);
+			String complianceLevel = otherJavaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
+			JavaProject javaProject = (JavaProject) getJavaProject();
+			JavaModelManager manager = JavaModelManager.getJavaModelManager();
 			for (int i = 0; i < length; i++) {
 				IResource member = members[i];
 				String memberName = member.getName();
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.java
index a1fb4cc..a9bb811 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -60,14 +60,18 @@
 static Object[] computeFolderNonJavaResources(IPackageFragmentRoot root, IContainer folder, char[][] inclusionPatterns, char[][] exclusionPatterns) throws JavaModelException {
 	IResource[] nonJavaResources = new IResource[5];
 	int nonJavaResourcesCounter = 0;
-	JavaProject project = (JavaProject) root.getJavaProject();
 	try {
-		IClasspathEntry[] classpath = project.getResolvedClasspath();
 		IResource[] members = folder.members();
 		int length = members.length;
 		if (length > 0) {
-			String sourceLevel = project.getOption(JavaCore.COMPILER_SOURCE, true);
-			String complianceLevel = project.getOption(JavaCore.COMPILER_COMPLIANCE, true);
+			// if package fragment root refers to folder in another IProject, then
+			// folder.getProject() is different than root.getJavaProject().getProject()
+			// use the other java project's options to verify the name
+			IJavaProject otherJavaProject = JavaCore.create(folder.getProject());
+			String sourceLevel = otherJavaProject.getOption(JavaCore.COMPILER_SOURCE, true);
+			String complianceLevel = otherJavaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
+			JavaProject javaProject = (JavaProject) root.getJavaProject();
+			IClasspathEntry[] classpath = javaProject.getResolvedClasspath();
 			nextResource: for (int i = 0; i < length; i++) {
 				IResource member = members[i];
 				switch (member.getType()) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange.java
index f46c40f..86ae6c0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ProjectReferenceChange.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
@@ -27,6 +27,7 @@
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ProjectReferenceChange {
 
 	private JavaProject project;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation.java
index ed5b9b6..836569c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation.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
@@ -42,6 +42,7 @@
  * <li>notifies compilation participants of the reconcile allowing them to participate in this operation and report problems</li>
  * </ul>
  */
+@SuppressWarnings({"rawtypes"})
 public class ReconcileWorkingCopyOperation extends JavaModelOperation {
 	public static boolean PERF = false;
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Region.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Region.java
index cffd972..385ba5c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Region.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/Region.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
@@ -20,6 +20,7 @@
  * @see IRegion
  */
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class Region implements IRegion {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ResolvedLambdaExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ResolvedLambdaExpression.java
new file mode 100644
index 0000000..b721876
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/ResolvedLambdaExpression.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2014 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.aspectj.org.eclipse.jdt.internal.core;
+
+import org.aspectj.org.eclipse.jdt.core.JavaModelException;
+
+public class ResolvedLambdaExpression extends LambdaExpression {
+
+	private String uniqueKey;
+	LambdaExpression unresolved;
+
+	public ResolvedLambdaExpression(JavaElement parent, LambdaExpression unresolved, String uniqueKey) {
+		super(parent, unresolved.name, unresolved.interphase, unresolved.sourceStart, unresolved.sourceEnd, unresolved.arrowPosition, unresolved.lambdaMethod);
+		this.uniqueKey = uniqueKey;
+		this.unresolved = unresolved;
+	}
+
+	public String getFullyQualifiedParameterizedName() throws JavaModelException {
+		return getFullyQualifiedParameterizedName(getFullyQualifiedName('.'), this.uniqueKey);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.aspectj.org.eclipse.jdt.internal.core.SourceType#getKey()
+	 */
+	public String getKey() {
+		return this.uniqueKey;
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		return this.unresolved.equals(o);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.aspectj.org.eclipse.jdt.internal.core.SourceType#isResolved()
+	 */
+	public boolean isResolved() {
+		return true;
+	}
+
+	/**
+	 * @private Debugging purposes
+	 */
+	protected void toStringInfo(int tab, StringBuffer buffer, Object info, boolean showResolvedInfo) {
+		super.toStringInfo(tab, buffer, info, showResolvedInfo);
+		if (showResolvedInfo) {
+			buffer.append(" {key="); //$NON-NLS-1$
+			buffer.append(this.getKey());
+			buffer.append("}"); //$NON-NLS-1$
+		}
+	}
+
+	public JavaElement unresolved() {
+		return this.unresolved;
+	}
+}
\ No newline at end of file
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SelectionRequestor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SelectionRequestor.java
index 828287c..c390bc4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SelectionRequestor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SelectionRequestor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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 @@
 package org.aspectj.org.eclipse.jdt.internal.core;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
 
 import org.aspectj.org.eclipse.jdt.core.Flags;
 import org.aspectj.org.eclipse.jdt.core.ICompilationUnit;
@@ -27,12 +29,14 @@
 import org.aspectj.org.eclipse.jdt.internal.codeassist.ISelectionRequestor;
 import org.aspectj.org.eclipse.jdt.internal.codeassist.SelectionEngine;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
@@ -46,6 +50,7 @@
  * Implementation of <code>ISelectionRequestor</code> to assist with
  * code resolve in a compilation unit. Translates names to elements.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SelectionRequestor implements ISelectionRequestor {
 	/*
 	 * The name lookup facility used to resolve packages
@@ -439,9 +444,16 @@
 		}
 	}
 }
-public void acceptLocalVariable(LocalVariableBinding binding) {
+public void acceptLocalVariable(LocalVariableBinding binding, org.aspectj.org.eclipse.jdt.internal.compiler.env.ICompilationUnit unit) {
 	LocalDeclaration local = binding.declaration;
-	IJavaElement parent = findLocalElement(local.sourceStart); // findLocalElement() cannot find local variable
+	IJavaElement parent = null;
+	if (binding.declaringScope.isLambdaSubscope() && unit instanceof ICompilationUnit) {
+		HashSet existingElements = new HashSet();
+		HashMap knownScopes = new HashMap();
+		parent = this.handleFactory.createElement(binding.declaringScope, local.sourceStart, (ICompilationUnit) unit, existingElements, knownScopes);
+	} else {		
+		parent = findLocalElement(local.sourceStart, binding.declaringScope.methodScope()); // findLocalElement() cannot find local variable
+	}
 	LocalVariable localVar = null;
 	if(parent != null) {
 		localVar = new LocalVariable(
@@ -451,7 +463,7 @@
 				local.declarationSourceEnd,
 				local.sourceStart,
 				local.sourceEnd,
-				Util.typeSignature(local.type),
+				local.type == null ? Signature.createTypeSignature(binding.type.readableName(), true) : Util.typeSignature(local.type),
 				local.annotations,
 				local.modifiers,
 				local.getKind() == AbstractVariableDeclaration.PARAMETER);
@@ -843,6 +855,21 @@
 	}
 	return res;
 }
+/*
+ * findLocalElement() cannot find lambdas.
+ */
+protected IJavaElement findLocalElement(int pos, MethodScope scope) {
+	if (scope != null && scope.isLambdaScope()) {
+		IJavaElement parent = findLocalElement(pos, scope.enclosingMethodScope());
+		LambdaExpression expression = (LambdaExpression) scope.originalReferenceContext();
+		if (expression != null && expression.resolvedType != null && expression.resolvedType.isValidBinding()) {
+			org.aspectj.org.eclipse.jdt.internal.core.LambdaExpression lambdaElement = new org.aspectj.org.eclipse.jdt.internal.core.LambdaExpression((JavaElement) parent, expression);
+			return lambdaElement.getMethod();
+		}
+		return parent;
+	}
+	return findLocalElement(pos);
+}
 
 /**
  * This method returns an IMethod element from the given method and declaring type bindings. However,
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SetVariablesOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SetVariablesOperation.java
index 77bf947..f04bfc4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SetVariablesOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SetVariablesOperation.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
@@ -23,6 +23,7 @@
 import org.aspectj.org.eclipse.jdt.core.JavaModelException;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SetVariablesOperation extends ChangeClasspathOperation {
 
 	String[] variableNames;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation.java
index ed63cc5..32a3319 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SortElementsOperation.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
@@ -51,6 +51,7 @@
  *
  * @since 2.1
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SortElementsOperation extends JavaModelOperation {
 	public static final String CONTAINS_MALFORMED_NODES = "malformed"; //$NON-NLS-1$
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper.java
index 4d3fa3b..eea1e2b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceMapper.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
@@ -73,6 +73,7 @@
  *
  * @see org.aspectj.org.eclipse.jdt.internal.core.JarPackageFragment
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class SourceMapper
 	extends ReferenceInfoAdapter
 	implements ISourceElementRequestor, SuffixConstants {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceMethod.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceMethod.java
index ac3e785..8dc32cd 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceMethod.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceMethod.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -222,6 +222,12 @@
 public boolean isMainMethod() throws JavaModelException {
 	return this.isMainMethod(this);
 }
+/**
+ * @see IMethod#isLambdaMethod()
+ */
+public boolean isLambdaMethod() {
+	return false;
+}
 /* (non-Javadoc)
  * @see org.aspectj.org.eclipse.jdt.core.IMethod#isResolved()
  */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceType.java
index a42809b..d38c279 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceType.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
@@ -34,6 +34,7 @@
  * @see IType
  */
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class SourceType extends NamedMember implements IType {
 
 /*
@@ -335,6 +336,7 @@
 			params.toArray(parameters);
 			JavaElement method = (JavaElement)getMethod(selector, parameters);
 			switch (token.charAt(0)) {
+				case JEM_LAMBDA_EXPRESSION:
 				case JEM_TYPE:
 				case JEM_TYPE_PARAMETER:
 				case JEM_LOCALVARIABLE:
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceTypeElementInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceTypeElementInfo.java
index 265be62..b69b684 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceTypeElementInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/SourceTypeElementInfo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -22,6 +22,7 @@
 /**
  * Element info for an IType element that originated from source.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SourceTypeElementInfo extends AnnotatableInfo implements ISourceType {
 
 	protected static final ISourceImport[] NO_IMPORTS = new ISourceImport[0];
@@ -34,7 +35,7 @@
 	
 	/**
 	 * The name of the superclass for this type. This name
-	 * is fully qualified for binary types and is NOT
+	 * is fully qualified for binary types and is NOT always
 	 * fully qualified for source types.
 	 */
 	protected char[] superclassName;
@@ -42,7 +43,7 @@
 	/**
 	 * The names of the interfaces this type implements or
 	 * extends. These names are fully qualified in the case
-	 * of a binary type, and are NOT fully qualified in the
+	 * of a binary type, and are NOT always fully qualified in the
 	 * case of a source type
 	 */
 	protected char[][] superInterfaceNames;
@@ -299,13 +300,13 @@
 	this.handle = handle;
 }
 /**
- * Sets the (unqualified) name of this type's superclass
+ * Sets the (unresolved) name of this type's superclass
  */
 protected void setSuperclassName(char[] superclassName) {
 	this.superclassName = superclassName;
 }
 /**
- * Sets the (unqualified) names of the interfaces this type implements or extends
+ * Sets the (unresolved) names of the interfaces this type implements or extends
  */
 protected void setSuperInterfaceNames(char[][] superInterfaceNames) {
 	this.superInterfaceNames = superInterfaceNames;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/UserLibrary.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/UserLibrary.java
index 0b7477b..b442aff 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/UserLibrary.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/UserLibrary.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
@@ -37,6 +37,7 @@
 /**
  * Internal model element to represent a user library and code to serialize / deserialize.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class UserLibrary {
 
 	private static final String VERSION_ONE = "1"; //$NON-NLS-1$
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryManager.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryManager.java
index bf07bbe..d40655e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryManager.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/UserLibraryManager.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
@@ -31,6 +31,7 @@
 /**
  *
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class UserLibraryManager {
 
 	public final static String CP_USERLIBRARY_PREFERENCES_PREFIX = JavaCore.PLUGIN_ID+".userLibrary."; //$NON-NLS-1$
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder.java
index 41f6ae8..da4ff3b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder.java
@@ -37,6 +37,7 @@
  * Provides the building and compilation mechanism
  * in common with the batch and incremental builders.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public abstract class AbstractImageBuilder implements ICompilerRequestor, ICompilationUnitLocator {
 
 protected JavaBuilder javaBuilder;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder.java
index 46aafe7..2b6672a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/BatchImageBuilder.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
@@ -22,6 +22,7 @@
 
 import java.util.*;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class BatchImageBuilder extends AbstractImageBuilder {
 
 	IncrementalImageBuilder incrementalBuilder; // if annotations or secondary types have to be processed after the compile loop
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar.java
index 0a2b5a6..59f7a4a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/ClasspathJar.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
@@ -27,6 +27,7 @@
 import java.util.*;
 import java.util.zip.*;
 
+@SuppressWarnings("rawtypes")
 public class ClasspathJar extends ClasspathLocation {
 
 static class PackageCacheEntry {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/IncrementalImageBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/IncrementalImageBuilder.java
index 36f1223..df1150e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/IncrementalImageBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/IncrementalImageBuilder.java
@@ -31,6 +31,7 @@
 /**
  * The incremental image builder
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class IncrementalImageBuilder extends AbstractImageBuilder {
 
 protected ArrayList sourceFiles;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/JavaBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/JavaBuilder.java
index c2dac5b..9ec21f9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/JavaBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/JavaBuilder.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
@@ -23,6 +23,7 @@
 import java.io.*;
 import java.util.*;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaBuilder extends IncrementalProjectBuilder {
 
 IProject currentProject;
@@ -157,7 +158,7 @@
 	if (this.currentProject == null || !this.currentProject.isAccessible()) return new IProject[0];
 
 	if (DEBUG)
-		System.out.println("\nStarting build of " + this.currentProject.getName() //$NON-NLS-1$
+		System.out.println("\nJavaBuilder: Starting build of " + this.currentProject.getName() //$NON-NLS-1$
 			+ " @ " + new Date(System.currentTimeMillis())); //$NON-NLS-1$
 	this.notifier = createBuildNotifier(monitor, currentProject); // AspectJ Extension - use factory, was 'new BuildNotifier(monitor,currentProject)'
 	this.notifier.begin();
@@ -169,39 +170,39 @@
 		if (isWorthBuilding()) {
 			if (kind == FULL_BUILD) {
 				if (DEBUG)
-					System.out.println("Performing full build as requested by user"); //$NON-NLS-1$
+					System.out.println("JavaBuilder: Performing full build as requested"); //$NON-NLS-1$
 				buildAll();
 			} else {
 				if ((this.lastState = getLastState(this.currentProject)) == null) {
 					if (DEBUG)
-						System.out.println("Performing full build since last saved state was not found"); //$NON-NLS-1$
+						System.out.println("JavaBuilder: Performing full build since last saved state was not found"); //$NON-NLS-1$
 					buildAll();
 				} else if (hasClasspathChanged()) {
 					// if the output location changes, do not delete the binary files from old location
 					// the user may be trying something
 					if (DEBUG)
-						System.out.println("Performing full build since classpath has changed"); //$NON-NLS-1$
+						System.out.println("JavaBuilder: Performing full build since classpath has changed"); //$NON-NLS-1$
 					buildAll();
 				} else if (this.nameEnvironment.sourceLocations.length > 0) {
 					// if there is no source to compile & no classpath changes then we are done
 					SimpleLookupTable deltas = findDeltas();
 					if (deltas == null) {
 						if (DEBUG)
-							System.out.println("Performing full build since deltas are missing after incremental request"); //$NON-NLS-1$
+							System.out.println("JavaBuilder: Performing full build since deltas are missing after incremental request"); //$NON-NLS-1$
 						buildAll();
 					} else if (deltas.elementSize > 0) {
 						buildDeltas(deltas);
 					} else if (DEBUG) {
-						System.out.println("Nothing to build since deltas were empty"); //$NON-NLS-1$
+						System.out.println("JavaBuilder: Nothing to build since deltas were empty"); //$NON-NLS-1$
 					}
 				} else {
 					if (hasStructuralDelta()) { // double check that a jar file didn't get replaced in a binary project
 						if (DEBUG)
-							System.out.println("Performing full build since there are structural deltas"); //$NON-NLS-1$
+							System.out.println("JavaBuilder: Performing full build since there are structural deltas"); //$NON-NLS-1$
 						buildAll();
 					} else {
 						if (DEBUG)
-							System.out.println("Nothing to build since there are no source folders and no deltas"); //$NON-NLS-1$
+							System.out.println("JavaBuilder: Nothing to build since there are no source folders and no deltas"); //$NON-NLS-1$
 						this.lastState.tagAsNoopBuild();
 					}
 				}
@@ -239,8 +240,8 @@
 	}
 	IProject[] requiredProjects = getRequiredProjects(true);
 	if (DEBUG)
-		System.out.println("Finished build of " + this.currentProject.getName() //$NON-NLS-1$
-			+ " @ " + new Date(System.currentTimeMillis())); //$NON-NLS-1$
+		System.out.println("JavaBuilder: Finished build of " + this.currentProject.getName() //$NON-NLS-1$
+			+ " @ " + new Date(System.currentTimeMillis()) + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
 	return requiredProjects;
 }
 
@@ -254,7 +255,7 @@
 	this.notifier.checkCancel();
 	this.notifier.subTask(Messages.bind(Messages.build_preparingBuild, this.currentProject.getName()));
 	if (DEBUG && this.lastState != null)
-		System.out.println("Clearing last state : " + this.lastState); //$NON-NLS-1$
+		System.out.println("JavaBuilder: Clearing last state : " + this.lastState); //$NON-NLS-1$
 	clearLastState();
 	BatchImageBuilder imageBuilder = getBatchImageBuilder(this, true); // AspectJ Extension - use factory, was 'new BatchImageBuilder(this,true)'
 	imageBuilder.build();
@@ -271,14 +272,14 @@
 	this.notifier.checkCancel();
 	this.notifier.subTask(Messages.bind(Messages.build_preparingBuild, this.currentProject.getName()));
 	if (DEBUG && this.lastState != null)
-		System.out.println("Clearing last state : " + this.lastState); //$NON-NLS-1$
+		System.out.println("JavaBuilder: Clearing last state : " + this.lastState); //$NON-NLS-1$
 	clearLastState(); // clear the previously built state so if the build fails, a full build will occur next time
 	IncrementalImageBuilder imageBuilder = getIncrementalImageBuilder(); // AspectJ Extension - use factory, was 'new IncrementalImageBuilder(this)'
 	if (imageBuilder.build(deltas)) {
 		recordNewState(imageBuilder.newState);
 	} else {
 		if (DEBUG)
-			System.out.println("Performing full build since incremental build failed"); //$NON-NLS-1$
+			System.out.println("JavaBuilder: Performing full build since incremental build failed"); //$NON-NLS-1$
 		buildAll();
 	}
 }
@@ -293,7 +294,7 @@
 	if (this.currentProject == null || !this.currentProject.isAccessible()) return;
 
 	if (DEBUG)
-		System.out.println("\nCleaning " + this.currentProject.getName() //$NON-NLS-1$
+		System.out.println("\nJavaBuilder: Cleaning " + this.currentProject.getName() //$NON-NLS-1$
 			+ " @ " + new Date(System.currentTimeMillis())); //$NON-NLS-1$
 	this.notifier = new BuildNotifier(monitor, this.currentProject);
 	this.notifier.begin();
@@ -302,7 +303,7 @@
 
 		initializeBuilder(CLEAN_BUILD, true);
 		if (DEBUG)
-			System.out.println("Clearing last state as part of clean : " + this.lastState); //$NON-NLS-1$
+			System.out.println("JavaBuilder: Clearing last state as part of clean : " + this.lastState); //$NON-NLS-1$
 		clearLastState();
 		removeProblemsAndTasksFor(this.currentProject);
 		new BatchImageBuilder(this, false).cleanOutputFolders(false);
@@ -314,7 +315,7 @@
 		cleanup();
 	}
 	if (DEBUG)
-		System.out.println("Finished cleaning " + this.currentProject.getName() //$NON-NLS-1$
+		System.out.println("JavaBuilder: Finished cleaning " + this.currentProject.getName() //$NON-NLS-1$
 			+ " @ " + new Date(System.currentTimeMillis())); //$NON-NLS-1$
 }
 
@@ -383,12 +384,12 @@
 	if (delta != null) {
 		if (delta.getKind() != IResourceDelta.NO_CHANGE) {
 			if (DEBUG)
-				System.out.println("Found source delta for: " + this.currentProject.getName()); //$NON-NLS-1$
+				System.out.println("JavaBuilder: Found source delta for: " + this.currentProject.getName()); //$NON-NLS-1$
 			deltas.put(this.currentProject, delta);
 		}
 	} else {
 		if (DEBUG)
-			System.out.println("Missing delta for: " + this.currentProject.getName()); //$NON-NLS-1$
+			System.out.println("JavaBuilder: Missing delta for: " + this.currentProject.getName()); //$NON-NLS-1$
 		this.notifier.subTask(""); //$NON-NLS-1$
 		return null;
 	}
@@ -418,12 +419,12 @@
 			if (delta != null) {
 				if (delta.getKind() != IResourceDelta.NO_CHANGE) {
 					if (DEBUG)
-						System.out.println("Found binary delta for: " + p.getName()); //$NON-NLS-1$
+						System.out.println("JavaBuilder: Found binary delta for: " + p.getName()); //$NON-NLS-1$
 					deltas.put(p, delta);
 				}
 			} else {
 				if (DEBUG)
-					System.out.println("Missing delta for: " + p.getName());	 //$NON-NLS-1$
+					System.out.println("JavaBuilder: Missing delta for: " + p.getName());	 //$NON-NLS-1$
 				this.notifier.subTask(""); //$NON-NLS-1$
 				return null;
 			}
@@ -511,7 +512,7 @@
 		} catch (CoreException ignore) { // skip it
 		}
 		if (DEBUG) {
-			System.out.println("New location: " + newSourceLocations[n] + "\n!= old location: " + oldSourceLocations[o]); //$NON-NLS-1$ //$NON-NLS-2$
+			System.out.println("JavaBuilder: New location: " + newSourceLocations[n] + "\n!= old location: " + oldSourceLocations[o]); //$NON-NLS-1$ //$NON-NLS-2$
 			printLocations(newSourceLocations, oldSourceLocations);
 		}
 		return true;
@@ -525,7 +526,7 @@
 		} catch (CoreException ignore) { // skip it
 		}
 		if (DEBUG) {
-			System.out.println("Added non-empty source folder"); //$NON-NLS-1$
+			System.out.println("JavaBuilder: Added non-empty source folder"); //$NON-NLS-1$
 			printLocations(newSourceLocations, oldSourceLocations);
 		}
 		return true;
@@ -536,7 +537,7 @@
 			continue;
 		}
 		if (DEBUG) {
-			System.out.println("Removed non-empty source folder"); //$NON-NLS-1$
+			System.out.println("JavaBuilder: Removed non-empty source folder"); //$NON-NLS-1$
 			printLocations(newSourceLocations, oldSourceLocations);
 		}
 		return true;
@@ -549,14 +550,14 @@
 	for (n = o = 0; n < newLength && o < oldLength; n++, o++) {
 		if (newBinaryLocations[n].equals(oldBinaryLocations[o])) continue;
 		if (DEBUG) {
-			System.out.println("New location: " + newBinaryLocations[n] + "\n!= old location: " + oldBinaryLocations[o]); //$NON-NLS-1$ //$NON-NLS-2$
+			System.out.println("JavaBuilder: New location: " + newBinaryLocations[n] + "\n!= old location: " + oldBinaryLocations[o]); //$NON-NLS-1$ //$NON-NLS-2$
 			printLocations(newBinaryLocations, oldBinaryLocations);
 		}
 		return true;
 	}
 	if (n < newLength || o < oldLength) {
 		if (DEBUG) {
-			System.out.println("Number of binary folders/jar files has changed:"); //$NON-NLS-1$
+			System.out.println("JavaBuilder: Number of binary folders/jar files has changed:"); //$NON-NLS-1$
 			printLocations(newBinaryLocations, oldBinaryLocations);
 		}
 		return true;
@@ -665,7 +666,7 @@
 	// Abort build only if there are classpath errors
 	if (isClasspathBroken(this.javaProject.getRawClasspath(), this.currentProject)) {
 		if (DEBUG)
-			System.out.println("Aborted build because project has classpath errors (incomplete or involved in cycle)"); //$NON-NLS-1$
+			System.out.println("JavaBuilder: Aborted build because project has classpath errors (incomplete or involved in cycle)"); //$NON-NLS-1$
 
 		removeProblemsAndTasksFor(this.currentProject); // remove all compilation problems
 
@@ -695,18 +696,18 @@
 			JavaProject prereq = (JavaProject) JavaCore.create(p);
 			if (prereq.hasCycleMarker() && JavaCore.WARNING.equals(this.javaProject.getOption(JavaCore.CORE_CIRCULAR_CLASSPATH, true))) {
 				if (DEBUG)
-					System.out.println("Continued to build even though prereq project " + p.getName() //$NON-NLS-1$
+					System.out.println("JavaBuilder: Continued to build even though prereq project " + p.getName() //$NON-NLS-1$
 						+ " was not built since its part of a cycle"); //$NON-NLS-1$
 				continue;
 			}
 			if (!hasJavaBuilder(p)) {
 				if (DEBUG)
-					System.out.println("Continued to build even though prereq project " + p.getName() //$NON-NLS-1$
+					System.out.println("JavaBuilder: Continued to build even though prereq project " + p.getName() //$NON-NLS-1$
 						+ " is not built by JavaBuilder"); //$NON-NLS-1$
 				continue;
 			}
 			if (DEBUG)
-				System.out.println("Aborted build because prereq project " + p.getName() //$NON-NLS-1$
+				System.out.println("JavaBuilder: Aborted build because prereq project " + p.getName() //$NON-NLS-1$
 					+ " was not built"); //$NON-NLS-1$
 
 			removeProblemsAndTasksFor(this.currentProject); // make this the only problem for this project
@@ -743,7 +744,7 @@
 			IProject project = this.workspaceRoot.getProject(participantPath.segment(0));
 			if (hasBeenBuilt(project)) {
 				if (DEBUG)
-					System.out.println("Requesting another build iteration since cycle participant " + project.getName() //$NON-NLS-1$
+					System.out.println("JavaBuilder: Requesting another build iteration since cycle participant " + project.getName() //$NON-NLS-1$
 						+ " has not yet seen some structural changes"); //$NON-NLS-1$
 				needRebuild();
 				return;
@@ -753,10 +754,10 @@
 }
 
 private void printLocations(ClasspathLocation[] newLocations, ClasspathLocation[] oldLocations) {
-	System.out.println("New locations:"); //$NON-NLS-1$
+	System.out.println("JavaBuilder: New locations:"); //$NON-NLS-1$
 	for (int i = 0, length = newLocations.length; i < length; i++)
 		System.out.println("    " + newLocations[i].debugPathString()); //$NON-NLS-1$
-	System.out.println("Old locations:"); //$NON-NLS-1$
+	System.out.println("JavaBuilder: Old locations:"); //$NON-NLS-1$
 	for (int i = 0, length = oldLocations.length; i < length; i++)
 		System.out.println("    " + oldLocations[i].debugPathString()); //$NON-NLS-1$
 }
@@ -770,7 +771,7 @@
 	}
 
 	if (DEBUG)
-		System.out.println("Recording new state : " + state); //$NON-NLS-1$
+		System.out.println("JavaBuilder: Recording new state : " + state); //$NON-NLS-1$
 	// state.dump();
 	JavaModelManager.getJavaModelManager().setLastBuiltState(this.currentProject, state);
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/NameEnvironment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/NameEnvironment.java
index d58b27a..2cacf38 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/NameEnvironment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/NameEnvironment.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
@@ -30,6 +30,7 @@
 import java.io.*;
 import java.util.*;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class NameEnvironment implements INameEnvironment, SuffixConstants {
 
 boolean isIncrementalBuild;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/ReferenceCollection.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/ReferenceCollection.java
index d594971..82af1bc 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/ReferenceCollection.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/ReferenceCollection.java
@@ -14,8 +14,6 @@
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
 
-//import java.util.*;
-
 // AspectJ Extension increased member visibilities for AspectJ
 public class ReferenceCollection {
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/State.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/State.java
index 2097eff..b8910cb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/State.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/builder/State.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
@@ -23,6 +23,7 @@
 import java.io.*;
 import java.util.*;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class State {
 // NOTE: this state cannot contain types that are not defined in this project
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java
index 4e6c058..11d6fc3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -41,6 +37,7 @@
  *
  * @since 2.0
  */
+@SuppressWarnings("rawtypes")
 public class NaiveASTFlattener extends ASTVisitor {
 	/**
 	 * Internal synonym for {@link AST#JLS2}. Use to alleviate
@@ -62,7 +59,7 @@
 	 * Internal synonym for {@link AST#JLS4}. Use to alleviate
 	 * deprecation warnings.
 	 * @deprecated
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static final int JLS4 = AST.JLS4;
 
@@ -134,7 +131,7 @@
 	 * Internal synonym for {@link MethodDeclaration#thrownExceptions()}. Use to alleviate
 	 * deprecation warnings.
 	 * @deprecated
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	private static List thrownExceptions(MethodDeclaration node) {
 		return node.thrownExceptions();
@@ -370,9 +367,18 @@
 	 * @see ASTVisitor#visit(ArrayType)
 	 */
 	public boolean visit(ArrayType node) {
-		node.getComponentType().accept(this);
-		visitTypeAnnotations(node);
-		this.buffer.append("[]");//$NON-NLS-1$
+		if (node.getAST().apiLevel() < AST.JLS8) {
+			visitComponentType(node);
+			this.buffer.append("[]");//$NON-NLS-1$
+		} else {
+			node.getElementType().accept(this);
+			List dimensions = node.dimensions();
+			int size = dimensions.size();
+			for (int i = 0; i < size; i++) {
+				Dimension aDimension = (Dimension) dimensions.get(i);
+				aDimension.accept(this);
+			}
+		}
 		return false;
 	}
 
@@ -601,7 +607,7 @@
 	/*
 	 * @see ASTVisitor#visit(CreationReference)
 	 * 
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean visit(CreationReference node) {
 		node.getType().accept(this);
@@ -610,6 +616,15 @@
 		return false;
 	}
 
+	public boolean visit(Dimension node) {
+		List annotations = node.annotations();
+		if (annotations.size() > 0)
+			this.buffer.append(' ');
+		visitAnnotationsList(annotations);
+		this.buffer.append("[]"); //$NON-NLS-1$
+		return false;
+	}
+
 	/*
 	 * @see ASTVisitor#visit(DoStatement)
 	 */
@@ -724,7 +739,7 @@
 	/*
 	 * @see ASTVisitor#visit(ExpressionMethodReference)
 	 * 
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean visit(ExpressionMethodReference node) {
 		node.getExpression().accept(this);
@@ -743,13 +758,6 @@
 		return false;
 	}
 
-	public boolean visit(ExtraDimension node) {
-		this.buffer.append(" ");//$NON-NLS-1$
-		visitAnnotationsList(node.annotations());
-		this.buffer.append("[]"); //$NON-NLS-1$
-		return false;
-	}
-
 	/*
 	 * @see ASTVisitor#visit(FieldAccess)
 	 */
@@ -1041,7 +1049,7 @@
 		node.getName().accept(this);
 		this.buffer.append("(");//$NON-NLS-1$
 		if (node.getAST().apiLevel() >= AST.JLS8) {
-			AnnotatableType receiverType = node.getReceiverType();
+			Type receiverType = node.getReceiverType();
 			if (receiverType != null) {
 				receiverType.accept(this);
 				this.buffer.append(' ');
@@ -1068,7 +1076,7 @@
 		if (node.getAST().apiLevel() >= AST.JLS8) {
 			List dimensions = node.extraDimensions();
 			for (int i = 0; i < size; i++) {
-				visit((ExtraDimension) dimensions.get(i));
+				visit((Dimension) dimensions.get(i));
 			}
 		} else {
 			for (int i = 0; i < size; i++) {
@@ -1192,6 +1200,18 @@
 	}
 
 	/*
+	 * @see ASTVisitor#visit(NameQualifiedType)
+	 * @since 3.10
+	 */
+	public boolean visit(NameQualifiedType node) {
+		node.getQualifier().accept(this);
+		this.buffer.append('.');
+		visitTypeAnnotations(node);
+		node.getName().accept(this);
+		return false;
+	}
+
+	/*
 	 * @see ASTVisitor#visit(NormalAnnotation)
 	 * @since 3.1
 	 */
@@ -1248,18 +1268,6 @@
 	}
 
 	/*
-	 * @see ASTVisitor#visit(PackageQualifiedType)
-	 * @since 3.9 BETA_JAVA8
-	 */
-	public boolean visit(PackageQualifiedType node) {
-		node.getQualifier().accept(this);
-		this.buffer.append('.');
-		visitTypeAnnotations(node);
-		node.getName().accept(this);
-		return false;
-	}
-
-	/*
 	 * @see ASTVisitor#visit(ParameterizedType)
 	 * @since 3.1
 	 */
@@ -1362,17 +1370,8 @@
 	 * @see ASTVisitor#visit(SimpleType)
 	 */
 	public boolean visit(SimpleType node) {
-		Name name = node.getName();
-		if (name.isQualifiedName()) {
-			QualifiedName qualifiedName = (QualifiedName) name;
-			qualifiedName.getQualifier().accept(this);
-			this.buffer.append(".");//$NON-NLS-1$
-			visitTypeAnnotations(node);
-			qualifiedName.getName().accept(this);
-		} else {
-			visitTypeAnnotations(node);
-			node.getName().accept(this);			
-		}
+		visitTypeAnnotations(node);
+		node.getName().accept(this);
 		return false;
 	}
 
@@ -1419,7 +1418,7 @@
 		if (node.getAST().apiLevel() >= AST.JLS8) {
 			List dimensions = node.extraDimensions();
 			for (int i = 0; i < size; i++) {
-				visit((ExtraDimension) dimensions.get(i));
+				visit((Dimension) dimensions.get(i));
 			}
 		} else {
 			for (int i = 0; i < size; i++) {
@@ -1526,7 +1525,7 @@
 	/*
 	 * @see ASTVisitor#visit(SuperMethodReference)
 	 * 
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean visit(SuperMethodReference node) {
 		if (node.getQualifier() != null) {
@@ -1798,7 +1797,7 @@
 	/*
 	 * @see ASTVisitor#visit(TypeMethodReference)
 	 * 
-	 * @since 3.9 BETA_JAVA8
+	 * @since 3.10
 	 */
 	public boolean visit(TypeMethodReference node) {
 		node.getType().accept(this);
@@ -1813,7 +1812,7 @@
 	 */
 	public boolean visit(TypeParameter node) {
 		if (node.getAST().apiLevel() >= AST.JLS8) {
-			visitAnnotationsList(node.annotations());
+			printModifiers(node.modifiers());
 		}
 		node.getName().accept(this);
 		if (!node.typeBounds().isEmpty()) {
@@ -1875,7 +1874,7 @@
 		if (node.getAST().apiLevel() >= AST.JLS8) {
 			List dimensions = node.extraDimensions();
 			for (int i = 0; i < size; i++) {
-				visit((ExtraDimension) dimensions.get(i));
+				visit((Dimension) dimensions.get(i));
 			}
 		} else {
 			for (int i = 0; i < size; i++) {
@@ -1944,4 +1943,11 @@
 		return false;
 	}
 
+	/**
+	 * @deprecated
+	 */
+	private void visitComponentType(ArrayType node) {
+		node.getComponentType().accept(this);
+	}
+
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/SourceRangeVerifier.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/SourceRangeVerifier.java
index ee4f89b..5d8a631 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/SourceRangeVerifier.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/SourceRangeVerifier.java
@@ -18,6 +18,7 @@
 import org.aspectj.org.eclipse.jdt.core.dom.ArrayCreation;

 import org.aspectj.org.eclipse.jdt.core.dom.StructuralPropertyDescriptor;

 

+@SuppressWarnings("rawtypes")

 public class SourceRangeVerifier extends ASTVisitor {

 

 	public static boolean DEBUG = false;

diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
index e81ca91..92e7a67 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -62,6 +58,7 @@
  * - This visitor analyzes the changes or annotations and generates text edits
  * (text manipulation API) that describe the required code changes.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public final class ASTRewriteAnalyzer extends ASTVisitor {
 	// AspectJ Extension start - might not be needed anymore - AJDT may override it with its variant...
 	// We use a factory to build the AST rewrite analyzer, so we can plugin in alternatives...
@@ -80,7 +77,7 @@
 			//throw new ExceptionInInitializerError(ex.getMessage());
 		}
 	}
-
+	
 	public interface IASTRewriteAnalyzerFactory {
 		public ASTVisitor getASTRewriteAnalyzer(char[] content2,
 				LineInformation lineInfo2, String lineDelim, TextEdit result,
@@ -99,6 +96,10 @@
 	}
 
 	// AspectJ Extension end
+
+	/** @deprecated using deprecated code */
+	private static final ChildPropertyDescriptor INTERNAL_ARRAY_COMPONENT_TYPE_PROPERTY = ArrayType.COMPONENT_TYPE_PROPERTY;
+
 	/** @deprecated using deprecated code */
 	private static final SimplePropertyDescriptor INTERNAL_FIELD_MODIFIERS_PROPERTY = FieldDeclaration.MODIFIERS_PROPERTY;
 
@@ -1298,7 +1299,7 @@
 	}
 
 	protected int rewriteExtraDimensionsInfo(ASTNode node, int pos, ChildListPropertyDescriptor property) {
-		return rewriteNodeList(node, property, pos, " ", " "); //$NON-NLS-1$ //$NON-NLS-2$
+		return rewriteNodeList(node, property, pos, " ", ""); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 
 	private int rewriteExtraDimensions(ASTNode parent, StructuralPropertyDescriptor property, int pos) {
@@ -1550,9 +1551,8 @@
 		boolean isAllInsert= isAllOfKind(children, RewriteEvent.INSERTED);
 		boolean isAllRemove= isAllOfKind(children, RewriteEvent.REMOVED);
 		String keyword= Util.EMPTY_STRING;
-		boolean isAnnotationsProperty = property == SingleVariableDeclaration.VARARGS_ANNOTATIONS_PROPERTY 
-				|| node instanceof AnnotatableType && property == ((AnnotatableType) node).getAnnotationsProperty();
-		if (isAnnotationsProperty) {
+		boolean isVarargsAnnotationsProperty = property == SingleVariableDeclaration.VARARGS_ANNOTATIONS_PROPERTY;
+		if (isVarargsAnnotationsProperty) {
 			keyword= " "; //$NON-NLS-1$
 		} else if (isAllInsert || isAllRemove) {
 			// update pos
@@ -1563,8 +1563,11 @@
 			}
 		}
 
+		boolean isAnnotationsProperty = isVarargsAnnotationsProperty 
+				|| node instanceof AnnotatableType && property == ((AnnotatableType) node).getAnnotationsProperty();
 		Prefix formatterPrefix;
-		if (property == SingleVariableDeclaration.MODIFIERS2_PROPERTY || isAnnotationsProperty)
+		if (property == SingleVariableDeclaration.MODIFIERS2_PROPERTY || 
+				property == TypeParameter.MODIFIERS_PROPERTY || isAnnotationsProperty)
 			formatterPrefix= this.formatter.PARAM_ANNOTATION_SEPARATION;
 		else
 			formatterPrefix= this.formatter.ANNOTATION_SEPARATION;
@@ -1580,7 +1583,7 @@
 				doTextRemove(endPos, nextPos - endPos, getEditGroup(lastChild));
 				return nextPos;
 			} else if ((isAllInsert || (nextPos == endPos && lastUnchanged)) // see bug 165654
-					&& !isAnnotationsProperty) {
+					&& !isVarargsAnnotationsProperty) {
 				String separator;
 				if (lastChild.getNewValue() instanceof Annotation) {
 					separator= formatterPrefix.getPrefix(getIndent(pos));
@@ -1945,11 +1948,68 @@
 		return offset;
 	}
 
-	public boolean visit(ExtraDimension node) {
+	private ASTNode getPreviousNode(ASTNode node) {
+		ArrayType arrayType = (ArrayType) node.getParent();
+		ASTNode prev = arrayType.getElementType();
+		List l = (List) node.getParent().getStructuralProperty(node.getLocationInParent());
+		int size = l.size();
+		int i = 0;
+		for (; i < size; i++) {
+			ASTNode currNode = (ASTNode) l.get(i);
+			if (node == currNode) break;
+			prev = currNode;
+		}
+		return i < size ? prev : null;
+	}
+	
+	private int getPreviousTokenEndOffset(ASTNode node, int token) {
+		int offset = -1;
+		ASTNode prev = getPreviousNode(node);
+		if (prev != null) {
+			offset = prev.getStartPosition() + prev.getLength();
+			try {
+				offset = getScanner().getPreviousTokenEndOffset(token, offset);
+			} catch (CoreException e1) {
+				e1.printStackTrace();
+			}
+		}
+		return offset;
+	}
+	
+	public boolean visit(Dimension node) {
 		if (!hasChildrenChanges(node)) {
 			return doVisitUnchangedChildren(node);
 		}
-		rewriteNodeList(node, ExtraDimension.ANNOTATIONS_PROPERTY, node.getStartPosition(), Util.EMPTY_STRING, " "); //$NON-NLS-1$
+		
+		boolean keywordSpace = true;
+		ASTNode parent = node.getParent();
+		if (parent.getNodeType() == ASTNode.ARRAY_TYPE) {
+			List oldAnnotations = (List) getOriginalValue(node, Dimension.ANNOTATIONS_PROPERTY);
+			List newAnnotations = (List) getNewValue(node, Dimension.ANNOTATIONS_PROPERTY);
+			int oldAnnotationSize = oldAnnotations.size();
+			int newAnnotationSize = newAnnotations.size();
+			if (oldAnnotationSize > 0 && newAnnotationSize == 0) { /* removed all annotations */
+				int delStart = getPreviousTokenEndOffset(node, TerminalTokens.TokenNameAT);
+				int delEnd = ((ASTNode) oldAnnotations.get(0)).getStartPosition();
+				if (delStart >= 0 && delEnd > delStart) {
+					doTextRemove(delStart, delEnd - delStart, null); /* remove spaces before the annotation */
+				}
+
+				ASTNode currNode = (ASTNode) oldAnnotations.get(oldAnnotationSize - 1);
+				delStart = currNode.getStartPosition() + currNode.getLength();
+				try {
+					delEnd = getScanner().getNextStartOffset(delStart, false);
+					doTextRemove(delStart, delEnd - delStart, null); /* remove spaces after the annotation */
+				} catch (CoreException e) {
+					e.printStackTrace();
+				}
+			} else if (oldAnnotationSize == 0 && newAnnotationSize > 0) { /* inserting first annotation */
+				if (ScannerHelper.isWhitespace(this.content[node.getStartPosition() - 1])) {
+					keywordSpace = false; /* space exists already */
+				}
+			}
+		}
+		rewriteNodeList(node, Dimension.ANNOTATIONS_PROPERTY, node.getStartPosition(), keywordSpace ? String.valueOf(' ') : Util.EMPTY_STRING, String.valueOf(' '), String.valueOf(' '));
 		return false;
 	}
 
@@ -2090,10 +2150,13 @@
 		ArrayType arrayType= (ArrayType) getOriginalValue(node, ArrayCreation.TYPE_PROPERTY);
 		ArrayType replacingType= arrayType;
 		int nOldBrackets= getDimensions(arrayType); // number of total brackets
+		boolean astLevelGTE8 = node.getAST().apiLevel() >= AST.JLS8;
+		boolean typeReplaced = false;
 
 		TextEditGroup editGroup= null;
 		RewriteEvent typeEvent= getEvent(node, ArrayCreation.TYPE_PROPERTY);
 		if (typeEvent != null && typeEvent.getChangeKind() == RewriteEvent.REPLACED) { // changed arraytype can have different dimension or type name
+			typeReplaced = true;
 			replacingType= (ArrayType) typeEvent.getNewValue();
 			editGroup= getEditGroup(typeEvent);
 			Type newType= replacingType.getElementType();
@@ -2112,16 +2175,17 @@
 			RewriteEvent dimEvent= getEvent(node, ArrayCreation.DIMENSIONS_PROPERTY);
 			boolean hasDimensionChanges= (dimEvent != null && dimEvent.getChangeKind() != RewriteEvent.UNCHANGED);
 			RewriteEvent[] events= hasDimensionChanges ? dimEvent.getChildren() : null;
-			ArrayType currentLevel= (ArrayType) replacingType.getElementType().getParent();
+			ArrayType currentLevel = astLevelGTE8 ? null : (ArrayType) replacingType.getElementType().getParent();
+			int replacingTypeDimensions = replacingType.getDimensions();
 			int i=0, dimSize= (events == null) ? 0 : events.length;
 			Type elementType= arrayType.getElementType();
 			int offset= elementType.getStartPosition() + elementType.getLength();
-			while(currentLevel != null) {
-				if (node.getAST().apiLevel() >= AST.JLS8) {
-					rewriteTypeAnnotations(currentLevel, ArrayType.ANNOTATIONS_PROPERTY, offset);
-				}
+			editGroup = null;
+			while(currentLevel != null || astLevelGTE8) {
 				if (i < dimSize) {
-					 offset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLBRACKET, offset);
+					if (astLevelGTE8)
+						rewriteAnnotationsOnDimension(arrayType, replacingType, i, offset, typeReplaced, editGroup);
+					offset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLBRACKET, offset);
 					if (hasDimensionChanges) {
 						RewriteEvent event= events[i];
 						int changeKind= event.getChangeKind();
@@ -2155,13 +2219,20 @@
 						offset= retrieveRightBracketEndPosition(offset, 1, true);
 					}
 				} else if (i < nOldBrackets) {
+					if (astLevelGTE8)
+						rewriteAnnotationsOnDimension(arrayType, replacingType, i, offset, typeReplaced, editGroup);
 					offset= retrieveRightBracketEndPosition(offset, 1, false);
 				} else {
+					insertAnnotationsOnDimension(replacingType, i, offset, editGroup, astLevelGTE8);
 					doTextInsert(offset, "[]", editGroup); //$NON-NLS-1$
 				}
 				i++;
-				if (currentLevel == replacingType) break;
-				currentLevel= (ArrayType) currentLevel.getParent();
+				if (astLevelGTE8) {
+					if (i == replacingTypeDimensions) break;
+				} else {
+					if (currentLevel == replacingType) break;
+					currentLevel= (ArrayType) currentLevel.getParent();
+				}
 			}
 			if (i < nOldBrackets) {
 				int endPos= retrieveRightBracketEndPosition(offset, nOldBrackets - i, false);
@@ -2181,6 +2252,48 @@
 		return false;
 	}
 
+	private void insertAnnotationsOnDimension(ArrayType replacingType, int index, int pos, TextEditGroup editGroup,
+			boolean astLevelGTE8) {
+		if (astLevelGTE8) {
+			Dimension dim = (Dimension) replacingType.dimensions().get(index);
+			List annotations = dim.annotations();
+			if (annotations != null) {
+				int size = annotations.size();
+				if (size > 0) {
+					doTextInsert(pos, " ", editGroup); //$NON-NLS-1$
+					for (int j = 0; j < size; j++) {
+						Annotation annotation = (Annotation) annotations.get(j);
+						doTextInsert(pos, annotation.toString() + " ", editGroup); //$NON-NLS-1$
+					}
+				}
+			}
+		}
+	}
+
+	private void rewriteAnnotationsOnDimension(ArrayType oldArrayType, ArrayType replacingType, int index, int pos, boolean typeReplaced, TextEditGroup editGroup) throws CoreException {
+		if (typeReplaced) {
+			List dimensions = oldArrayType.dimensions();
+			Dimension oldDim = index < dimensions.size() ? (Dimension) dimensions.get(index) : null;
+			if (oldDim != null) {
+				List oldAnnotations = oldDim.annotations();
+				int size = oldAnnotations.size();
+				if (size > 0) {
+					ASTNode prev = getPreviousNode(oldDim);
+					Annotation annotation = (Annotation) oldAnnotations.get(0);
+					int start = prev != null ? prev.getStartPosition() + prev.getLength() : annotation.getStartPosition();
+					annotation = (Annotation) oldAnnotations.get(size - 1);
+					int end = annotation.getStartPosition() + annotation.getLength();
+					end = getScanner().getTokenEndOffset(TerminalTokens.TokenNameLBRACKET, end) - 1;
+					doTextRemove(start, end - start, editGroup);
+				}
+			}
+			insertAnnotationsOnDimension(replacingType, index, pos, editGroup, true);
+		} else {
+			Dimension dim = (Dimension) replacingType.dimensions().get(index);
+			rewriteNodeList(dim, Dimension.ANNOTATIONS_PROPERTY, pos, String.valueOf(' '), String.valueOf(' '), String.valueOf(' '));
+		}
+	}
+
 	/**
 	 * This method is used to retrieve the position of the right bracket.
 	 * @return int the dimension found, -1 if none
@@ -2210,19 +2323,25 @@
 	}
 
 	private Type getElementType(ArrayType parent) {
-		Type t = (Type) getOriginalValue(parent, ArrayType.COMPONENT_TYPE_PROPERTY);
+		if (parent.getAST().apiLevel() >= AST.JLS8) {
+			return (Type) getOriginalValue(parent, ArrayType.ELEMENT_TYPE_PROPERTY);
+		}
+		Type t = (Type) getOriginalValue(parent, INTERNAL_ARRAY_COMPONENT_TYPE_PROPERTY);
 		while (t.isArrayType()) {
-			t = (Type) getOriginalValue(t, ArrayType.COMPONENT_TYPE_PROPERTY);
+			t = (Type) getOriginalValue(t, INTERNAL_ARRAY_COMPONENT_TYPE_PROPERTY);
 		}
 		return t;
 	}
 
 	private int getDimensions(ArrayType parent) {
-		Type t = (Type) getOriginalValue(parent, ArrayType.COMPONENT_TYPE_PROPERTY);
+		if (parent.getAST().apiLevel() >= AST.JLS8) {
+			return ((List) getOriginalValue(parent, ArrayType.DIMENSIONS_PROPERTY)).size();
+		}
+		Type t = (Type) getOriginalValue(parent, INTERNAL_ARRAY_COMPONENT_TYPE_PROPERTY);
 		int dimensions = 1; // always include this array type
 		while (t.isArrayType()) {
 			dimensions++;
-			t = (Type) getOriginalValue(t, ArrayType.COMPONENT_TYPE_PROPERTY);
+			t = (Type) getOriginalValue(t, INTERNAL_ARRAY_COMPONENT_TYPE_PROPERTY);
 		}
 		return dimensions;
 	}
@@ -2240,7 +2359,9 @@
 		return false;
 	}
 
-
+	private int rewriteArrayTypeDimensions(ArrayType node, int pos) {
+		return rewriteNodeList(node, ArrayType.DIMENSIONS_PROPERTY, pos, Util.EMPTY_STRING, ""); //$NON-NLS-1$
+	}
 
 	/* (non-Javadoc)
 	 * @see org.aspectj.org.eclipse.jdt.core.dom.ASTVisitor#visit(ArrayType)
@@ -2249,9 +2370,11 @@
 		if (!hasChildrenChanges(node)) {
 			return doVisitUnchangedChildren(node);
 		}
-		int pos = rewriteRequiredNode(node, ArrayType.COMPONENT_TYPE_PROPERTY);
-		if (node.getAST().apiLevel() >= AST.JLS8) {
-			rewriteTypeAnnotations(node, ArrayType.ANNOTATIONS_PROPERTY, pos);
+		if (node.getAST().apiLevel() < AST.JLS8) {
+			rewriteRequiredNode(node, INTERNAL_ARRAY_COMPONENT_TYPE_PROPERTY);
+		} else {
+			int pos = rewriteRequiredNode(node, ArrayType.ELEMENT_TYPE_PROPERTY);
+			rewriteArrayTypeDimensions(node, pos);
 		}
 		return false;
 	}
@@ -2726,15 +2849,43 @@
 			return doVisitUnchangedChildren(node);
 		}
 
-		int pos= rewriteRequiredNode(node, InfixExpression.LEFT_OPERAND_PROPERTY);
+		Expression right= node.getRightOperand();
+		int pos;
+		
+		RewriteEvent leftEvent= getEvent(node, InfixExpression.LEFT_OPERAND_PROPERTY);
+		boolean removeLeft = leftEvent != null && leftEvent.getChangeKind() == RewriteEvent.REMOVED;
+		RewriteEvent rightEvent= getEvent(node, InfixExpression.RIGHT_OPERAND_PROPERTY);
+		boolean removeRight = rightEvent != null && rightEvent.getChangeKind() == RewriteEvent.REMOVED;
+		
+		if (removeLeft) {
+			Expression left= node.getLeftOperand();
+			int leftStart= getExtendedOffset(left);
+			pos= getExtendedOffset(right);
+			TextEditGroup editGroup= getEditGroup(leftEvent);
+			doTextRemoveAndVisit(leftStart, pos - leftStart, left, editGroup);
+		} else {
+			pos = rewriteRequiredNode(node, InfixExpression.LEFT_OPERAND_PROPERTY);
+		}
 
 		boolean needsNewOperation= isChanged(node, InfixExpression.OPERATOR_PROPERTY);
 		String operation= getNewValue(node, InfixExpression.OPERATOR_PROPERTY).toString();
-		if (needsNewOperation) {
+		if (needsNewOperation && !removeLeft && !removeRight) {
 			replaceOperation(pos, operation, getEditGroup(node, InfixExpression.OPERATOR_PROPERTY));
 		}
 
-		pos= rewriteRequiredNode(node, InfixExpression.RIGHT_OPERAND_PROPERTY);
+		if (removeRight) {
+			int end;
+			if (removeLeft && node.extendedOperands().size() > 0) {
+				end= getExtendedOffset((Expression) node.extendedOperands().get(0));
+			} else {
+				end= getExtendedEnd(right);
+			}
+			TextEditGroup editGroup= getEditGroup(rightEvent);
+			doTextRemoveAndVisit(pos, end - pos, right, editGroup);
+			pos= end;
+		} else {
+			pos= rewriteRequiredNode(node, InfixExpression.RIGHT_OPERAND_PROPERTY);
+		}
 
 		RewriteEvent event= getEvent(node, InfixExpression.EXTENDED_OPERANDS_PROPERTY);
 		String prefixString= ' ' + operation + ' ';
@@ -4023,20 +4174,20 @@
 		return false;
 	}
 	/* (non-Javadoc)
-	 * @see org.aspectj.org.eclipse.jdt.core.dom.ASTVisitor#visit(org.aspectj.org.eclipse.jdt.core.dom.PackageQualifiedType)
+	 * @see org.aspectj.org.eclipse.jdt.core.dom.ASTVisitor#visit(org.aspectj.org.eclipse.jdt.core.dom.NameQualifiedType)
 	 */
-	public boolean visit(PackageQualifiedType node) {
+	public boolean visit(NameQualifiedType node) {
 		if (!hasChildrenChanges(node)) {
 			return doVisitUnchangedChildren(node);
 		}
-		int pos = rewriteRequiredNode(node, PackageQualifiedType.QUALIFIER_PROPERTY);
+		int pos = rewriteRequiredNode(node, NameQualifiedType.QUALIFIER_PROPERTY);
 		try {
 			pos = getScanner().getTokenEndOffset(TerminalTokens.TokenNameDOT, pos);
-			rewriteTypeAnnotations(node, PackageQualifiedType.ANNOTATIONS_PROPERTY, pos);
+			rewriteTypeAnnotations(node, NameQualifiedType.ANNOTATIONS_PROPERTY, pos);
 		} catch (CoreException e) {
 			handleException(e);
 		}
-		rewriteRequiredNode(node, PackageQualifiedType.NAME_PROPERTY);
+		rewriteRequiredNode(node, NameQualifiedType.NAME_PROPERTY);
 		return false;
 	}
 	/* (non-Javadoc)
@@ -4126,7 +4277,7 @@
 		}
 		int pos;
 		if (node.getAST().apiLevel() >= AST.JLS8) {
-			pos = rewriteTypeAnnotations(node, TypeParameter.ANNOTATIONS_PROPERTY, node.getStartPosition());
+			pos = rewriteModifiers2(node, TypeParameter.MODIFIERS_PROPERTY, node.getStartPosition());
 		}
 		pos= rewriteRequiredNode(node, TypeParameter.NAME_PROPERTY);
 		rewriteNodeList(node, TypeParameter.TYPE_BOUNDS_PROPERTY, pos, " extends ", " & "); //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java
index 77c6cc2..3ad297f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -19,9 +15,13 @@
 import org.aspectj.org.eclipse.jdt.core.dom.*;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings("rawtypes")
 public class ASTRewriteFlattener extends ASTVisitor {
 
 	/** @deprecated using deprecated code */
+	private static final ChildPropertyDescriptor INTERNAL_ARRAY_COMPONENT_TYPE_PROPERTY = ArrayType.COMPONENT_TYPE_PROPERTY;
+
+	/** @deprecated using deprecated code */
 	private static final SimplePropertyDescriptor INTERNAL_FIELD_MODIFIERS_PROPERTY = FieldDeclaration.MODIFIERS_PROPERTY;
 
 	/** @deprecated using deprecated code */
@@ -236,35 +236,36 @@
 		ArrayType arrayType= (ArrayType) getChildNode(node, ArrayCreation.TYPE_PROPERTY);
 
 		// get the element type and count dimensions
-		Type elementType= (Type) getChildNode(arrayType, ArrayType.COMPONENT_TYPE_PROPERTY);
-		int dimensions= 1; // always include this array type
-		while (elementType.isArrayType()) {
-			dimensions++;
-			elementType = (Type) getChildNode(elementType, ArrayType.COMPONENT_TYPE_PROPERTY);
+		Type elementType;
+		int dimensions;
+		boolean astLevelGTE8 = node.getAST().apiLevel() >= AST.JLS8;
+		if (astLevelGTE8) {
+			elementType = (Type) getChildNode(arrayType, ArrayType.ELEMENT_TYPE_PROPERTY);
+			dimensions = getChildList(arrayType, ArrayType.DIMENSIONS_PROPERTY).size();
+		} else {
+			elementType = (Type) getChildNode(arrayType, INTERNAL_ARRAY_COMPONENT_TYPE_PROPERTY);
+			dimensions = 1; // always include this array type
+			while (elementType.isArrayType()) {
+				dimensions++;
+				elementType = (Type) getChildNode(elementType, INTERNAL_ARRAY_COMPONENT_TYPE_PROPERTY);
+			}
 		}
 
 		elementType.accept(this);
 
 		// add "<annotations> [ <dimension> ]" for each dimension expression
-		Type type= arrayType;
 		List list= getChildList(node, ArrayCreation.DIMENSIONS_PROPERTY);
-		for (int i= 0; i < list.size(); i++) {
-			if (node.getAST().apiLevel() >= AST.JLS8 && type instanceof ArrayType) {
-				visitList(type, ArrayType.ANNOTATIONS_PROPERTY, String.valueOf(' '), Util.EMPTY_STRING, String.valueOf(' '));
-				type = (Type) getChildNode(type, ArrayType.COMPONENT_TYPE_PROPERTY);
-			}
+		int size = list.size();
+		for (int i= 0; i < size; i++) {
+			internalVisitDimensionAnnotations(arrayType, i, astLevelGTE8);
 			this.result.append('[');
 			((ASTNode) list.get(i)).accept(this);
 			this.result.append(']');
-			dimensions--;
 		}
 
 		// add "<annotations> []" for each extra array dimension
-		for (int i= 0; i < dimensions; i++) {
-			if (node.getAST().apiLevel() >= AST.JLS8 && type instanceof ArrayType) {
-				visitList(type, ArrayType.ANNOTATIONS_PROPERTY, String.valueOf(' '), Util.EMPTY_STRING, String.valueOf(' '));
-				type = (Type) getChildNode(type, ArrayType.COMPONENT_TYPE_PROPERTY);
-			}
+		for (int i= list.size(); i < dimensions; i++) {
+			internalVisitDimensionAnnotations(arrayType, i, astLevelGTE8);
 			this.result.append("[]"); //$NON-NLS-1$
 		}
 
@@ -275,6 +276,13 @@
 		return false;
 	}
 
+	private void internalVisitDimensionAnnotations(ArrayType arrayType, int index, boolean astLevelGTE8) {
+		if (astLevelGTE8) {
+			Dimension dimension = (Dimension) arrayType.dimensions().get(index);
+			visitList(dimension, Dimension.ANNOTATIONS_PROPERTY, String.valueOf(' '), Util.EMPTY_STRING, String.valueOf(' '));
+		}
+	}
+
 	/*
 	 * @see ASTVisitor#visit(ArrayInitializer)
 	 */
@@ -289,11 +297,13 @@
 	 * @see ASTVisitor#visit(ArrayType)
 	 */
 	public boolean visit(ArrayType node) {
-		getChildNode(node, ArrayType.COMPONENT_TYPE_PROPERTY).accept(this);
-		if (node.getAST().apiLevel() >= AST.JLS8) {
-			visitList(node, ArrayType.ANNOTATIONS_PROPERTY, String.valueOf(' '), Util.EMPTY_STRING, String.valueOf(' '));
+		if (node.getAST().apiLevel() < AST.JLS8) {
+			getChildNode(node, INTERNAL_ARRAY_COMPONENT_TYPE_PROPERTY).accept(this);
+			this.result.append("[]"); //$NON-NLS-1$
+		} else {
+			getChildNode(node, ArrayType.ELEMENT_TYPE_PROPERTY).accept(this);
+			visitList(node, ArrayType.DIMENSIONS_PROPERTY, Util.EMPTY_STRING, Util.EMPTY_STRING, Util.EMPTY_STRING);
 		}
-		this.result.append("[]"); //$NON-NLS-1$
 		return false;
 	}
 
@@ -481,6 +491,12 @@
 		return false;
 	}
 
+	public boolean visit(Dimension node) {
+		visitList(node, Dimension.ANNOTATIONS_PROPERTY, String.valueOf(' '), String.valueOf(' '), String.valueOf(' '));
+		this.result.append("[]"); //$NON-NLS-1$
+		return false;
+	}
+
 	/*
 	 * @see ASTVisitor#visit(DoStatement)
 	 */
@@ -510,12 +526,6 @@
 		return false;
 	}
 
-	public boolean visit(ExtraDimension node) {
-		visitList(node, ExtraDimension.ANNOTATIONS_PROPERTY, String.valueOf(' '), String.valueOf(' '), String.valueOf(' '));
-		this.result.append("[]"); //$NON-NLS-1$
-		return false;
-	}
-
 	/*
 	 * @see ASTVisitor#visit(FieldAccess)
 	 */
@@ -1430,16 +1440,16 @@
 	}
 
 	/*
-	 * @see ASTVisitor#visit(PackageQualifiedType)
-	 * @since 3.9 BETA_JAVA8
+	 * @see ASTVisitor#visit(NameQualifiedType)
+	 * @since 3.10
 	 */
-	public boolean visit(PackageQualifiedType node) {
-		getChildNode(node, PackageQualifiedType.QUALIFIER_PROPERTY).accept(this);
+	public boolean visit(NameQualifiedType node) {
+		getChildNode(node, NameQualifiedType.QUALIFIER_PROPERTY).accept(this);
 		this.result.append('.');
 		if (node.getAST().apiLevel() >= AST.JLS8) {
-			visitList(node, PackageQualifiedType.ANNOTATIONS_PROPERTY, String.valueOf(' '), Util.EMPTY_STRING, String.valueOf(' '));
+			visitList(node, NameQualifiedType.ANNOTATIONS_PROPERTY, String.valueOf(' '), Util.EMPTY_STRING, String.valueOf(' '));
 		}
-		getChildNode(node, PackageQualifiedType.NAME_PROPERTY).accept(this);
+		getChildNode(node, NameQualifiedType.NAME_PROPERTY).accept(this);
 		return false;
 	}
 
@@ -1512,7 +1522,7 @@
 	 */
 	public boolean visit(TypeParameter node) {
 		if (node.getAST().apiLevel() >= AST.JLS8) {
-			visitList(node, TypeParameter.ANNOTATIONS_PROPERTY, String.valueOf(' '), Util.EMPTY_STRING, String.valueOf(' '));
+			visitList(node, TypeParameter.MODIFIERS_PROPERTY, String.valueOf(' '), Util.EMPTY_STRING, String.valueOf(' '));
 		}
 		getChildNode(node, TypeParameter.NAME_PROPERTY).accept(this);
 		visitList(node, TypeParameter.TYPE_BOUNDS_PROPERTY, " & ", " extends ", Util.EMPTY_STRING); //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter.java
index 590f898..88ffa3e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFormatter.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -42,7 +38,8 @@
 import org.eclipse.text.edits.ReplaceEdit;
 import org.eclipse.text.edits.TextEdit;
 
-/* package */ final class ASTRewriteFormatter {
+@SuppressWarnings({"rawtypes", "unchecked"})
+public final class ASTRewriteFormatter {
 
 	public static class NodeMarker extends Position {
 		public Object data;
@@ -285,7 +282,8 @@
 				case ASTNode.PRIMITIVE_TYPE:
 				case ASTNode.QUALIFIED_TYPE:
 				case ASTNode.SIMPLE_TYPE:
-					suffix= " x;"; //$NON-NLS-1$
+					prefix= "void m(final "; //$NON-NLS-1$
+					suffix= " x);"; //$NON-NLS-1$
 					code= CodeFormatter.K_CLASS_BODY_DECLARATIONS;
 					break;
 				case ASTNode.WILDCARD_TYPE:
@@ -297,10 +295,14 @@
 					code= CodeFormatter.K_COMPILATION_UNIT;
 					break;
 				case ASTNode.VARIABLE_DECLARATION_EXPRESSION:
-				case ASTNode.SINGLE_VARIABLE_DECLARATION:
 					suffix= ";"; //$NON-NLS-1$
 					code= CodeFormatter.K_STATEMENTS;
 					break;
+				case ASTNode.SINGLE_VARIABLE_DECLARATION:
+					prefix= "void m("; //$NON-NLS-1$
+					suffix= ");"; //$NON-NLS-1$
+					code= CodeFormatter.K_CLASS_BODY_DECLARATIONS;
+					break;
 				case ASTNode.VARIABLE_DECLARATION_FRAGMENT:
 					prefix= "A "; //$NON-NLS-1$
 					suffix= ";"; //$NON-NLS-1$
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.java
index 0ac2195..fcdf40a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ImportRewriteAnalyzer.java
@@ -47,6 +47,7 @@
 import org.eclipse.text.edits.InsertEdit;
 import org.eclipse.text.edits.MultiTextEdit;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public final class ImportRewriteAnalyzer {
 
 	private final ICompilationUnit compilationUnit;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineCommentEndOffsets.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineCommentEndOffsets.java
index 9d0301e..ae76e87 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineCommentEndOffsets.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/LineCommentEndOffsets.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
@@ -18,6 +18,7 @@
 import org.aspectj.org.eclipse.jdt.core.formatter.IndentManipulation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;
 
+@SuppressWarnings("rawtypes")
 public class LineCommentEndOffsets {
 
 	private int[] offsets;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ListRewriteEvent.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ListRewriteEvent.java
index b199a17..b230900 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ListRewriteEvent.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/ListRewriteEvent.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
@@ -18,6 +18,7 @@
 /**
  *
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ListRewriteEvent extends RewriteEvent {
 
 	public final static int NEW= 1;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.java
index fdf1f41..7bc9f22 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/NodeInfoStore.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
@@ -30,6 +30,7 @@
 /**
  *
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public final class NodeInfoStore {
 	private AST ast;
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore.java
index 37fcac0..d1e1c0c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/RewriteEventStore.java
@@ -26,6 +26,7 @@
  * Stores all rewrite events, descriptions of events and knows which nodes
  * are copy or move sources or tracked.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public final class RewriteEventStore {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/SourceModifier.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/SourceModifier.java
index 9538e19..d1addd0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/SourceModifier.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/dom/rewrite/SourceModifier.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
@@ -18,6 +18,7 @@
 import org.eclipse.text.edits.ReplaceEdit;
 
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class SourceModifier implements ISourceModifier {
 
 	private final String destinationIndent;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.java
index 50105bf..508caa9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.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
@@ -33,6 +33,7 @@
 /**
  * A wrapper around the infrastructure evaluation context.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class EvaluationContextWrapper implements IEvaluationContext {
 	protected EvaluationContext context;
 	protected JavaProject project;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/ChangeCollector.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/ChangeCollector.java
index 1378f83..5865675 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/ChangeCollector.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/ChangeCollector.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
@@ -25,6 +25,7 @@
 /*
  * Collects changes (reported through fine-grained deltas) that can affect a type hierarchy.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class ChangeCollector {
 
 	/*
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBinaryType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBinaryType.java
index 6a3790d..eb5d260 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBinaryType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBinaryType.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
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *         bug 407191 - [1.8] Binary access support for type annotations
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core.hierarchy;
 
@@ -19,6 +21,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryMethod;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryNestedType;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryType;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation;
 import org.aspectj.org.eclipse.jdt.internal.core.search.indexing.IIndexConstants;
 
 public class HierarchyBinaryType implements IBinaryType {
@@ -51,6 +54,12 @@
 public IBinaryAnnotation[] getAnnotations() {
 	return null;
 }
+/**
+ * @see org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryType
+ */
+public IBinaryTypeAnnotation[] getTypeAnnotations() {
+	return null;
+}
 public char[] getEnclosingMethod() {
 	return null;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.java
index 134816f..bfe3da0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.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
@@ -30,6 +30,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.util.ResourceCompilationUnit;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class HierarchyBuilder {
 	/**
 	 * The hierarchy being built.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java
index 52a2dfb..b811123 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -42,6 +42,8 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
 import org.aspectj.org.eclipse.jdt.internal.compiler.IProblemFactory;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.*;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.AccessRestriction;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryType;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
@@ -61,6 +63,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.util.ASTNodeFinder;
 import org.aspectj.org.eclipse.jdt.internal.core.util.HandleFactory;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class HierarchyResolver implements ITypeRequestor {
 
 	private ReferenceBinding focusType;
@@ -147,7 +150,7 @@
 	CompilationUnitDeclaration unit =
 		SourceTypeConverter.buildCompilationUnit(
 			new ISourceType[] {sourceType}, // ignore secondary types, to improve laziness
-			SourceTypeConverter.MEMBER_TYPE, // need member types
+			SourceTypeConverter.MEMBER_TYPE | (this.lookupEnvironment.globalOptions.sourceLevel >= ClassFileConstants.JDK1_8 ? SourceTypeConverter.METHOD : 0), // need member types
 			// no need for field initialization
 			this.lookupEnvironment.problemReporter,
 			result);
@@ -209,7 +212,7 @@
 			}
 		}
 		for (int t = this.typeIndex; t >= 0; t--) {
-			if (this.typeBindings[t] == superBinding) {
+			if (TypeBinding.equalsEquals(this.typeBindings[t], superBinding)) {
 				return this.builder.getHandle(this.typeModels[t], superBinding);
 			}
 		}
@@ -288,7 +291,7 @@
 			if (CharOperation.equals(simpleName, interfaceBinding.sourceName)) {
 				bindingIndex++;
 				for (int t = this.typeIndex; t >= 0; t--) {
-					if (this.typeBindings[t] == interfaceBinding) {
+					if (TypeBinding.equalsEquals(this.typeBindings[t], interfaceBinding)) {
 						IType handle = this.builder.getHandle(this.typeModels[t], interfaceBinding);
 						if (handle != null) {
 							superinterfaces[index++] = handle;
@@ -320,7 +323,7 @@
 				QualifiedAllocationExpression allocationExpression = localTypeBinding.scope.referenceContext.allocation;
 				TypeReference type;
 				if (allocationExpression != null && (type = allocationExpression.type) != null && type.resolvedType != null) {
-					localTypeBinding.superclass = (ReferenceBinding) type.resolvedType;
+					localTypeBinding.setSuperClass((ReferenceBinding) type.resolvedType);
 					continue;
 				}
 			}
@@ -335,7 +338,7 @@
 				if (superclass instanceof ReferenceBinding) {
 					// ensure we are not creating a cycle (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=215681 )
 					if (!(subTypeOfType((ReferenceBinding) superclass, typeBinding))) {
-						((SourceTypeBinding) typeBinding).superclass = (ReferenceBinding) superclass;
+						((SourceTypeBinding) typeBinding).setSuperClass((ReferenceBinding) superclass);
 					}
 				}
 
@@ -359,7 +362,7 @@
 					}
 					if (index < length)
 						System.arraycopy(interfaceBindings, 0, interfaceBindings = new ReferenceBinding[index], 0 , index);
-					((SourceTypeBinding) typeBinding).superInterfaces = interfaceBindings;
+					((SourceTypeBinding) typeBinding).setSuperInterfaces(interfaceBindings);
 				}
 			}
 		} else if (typeBinding instanceof BinaryTypeBinding) {
@@ -402,41 +405,51 @@
 	} else {
 		if (typeBinding == null) return;
 
-		TypeDeclaration typeDeclaration = ((SourceTypeBinding)typeBinding).scope.referenceType();
+		if (typeBinding instanceof SourceTypeBinding) {
+			TypeDeclaration typeDeclaration = ((SourceTypeBinding)typeBinding).scope.referenceType();
 
-		// simple super class name
-		char[] superclassName = null;
-		TypeReference superclass;
-		if ((typeDeclaration.bits & ASTNode.IsAnonymousType) != 0) {
-			superclass = typeDeclaration.allocation.type;
-		} else {
-			superclass = typeDeclaration.superclass;
-		}
-		if (superclass != null) {
-			char[][] typeName = superclass.getTypeName();
-			superclassName = typeName == null ? null : typeName[typeName.length-1];
-		}
-
-		// simple super interface names
-		char[][] superInterfaceNames = null;
-		TypeReference[] superInterfaces = typeDeclaration.superInterfaces;
-		if (superInterfaces != null) {
-			int length = superInterfaces.length;
-			superInterfaceNames = new char[length][];
-			for (int i = 0; i < length; i++) {
-				TypeReference superInterface = superInterfaces[i];
-				char[][] typeName = superInterface.getTypeName();
-				superInterfaceNames[i] = typeName[typeName.length-1];
+			// simple super class name
+			char[] superclassName = null;
+			TypeReference superclass;
+			if ((typeDeclaration.bits & ASTNode.IsAnonymousType) != 0) {
+				superclass = typeDeclaration.allocation.type;
+			} else {
+				superclass = typeDeclaration.superclass;
 			}
-		}
+			if (superclass != null) {
+				char[][] typeName = superclass.getTypeName();
+				superclassName = typeName == null ? null : typeName[typeName.length-1];
+			}
 
-		HierarchyType hierarchyType = new HierarchyType(
-			type,
-			typeDeclaration.name,
-			typeDeclaration.binding.modifiers,
-			superclassName,
-			superInterfaceNames);
-		remember(hierarchyType, typeDeclaration.binding);
+			// simple super interface names
+			char[][] superInterfaceNames = null;
+			TypeReference[] superInterfaces = typeDeclaration.superInterfaces;
+			if (superInterfaces != null) {
+				int length = superInterfaces.length;
+				superInterfaceNames = new char[length][];
+				for (int i = 0; i < length; i++) {
+					TypeReference superInterface = superInterfaces[i];
+					char[][] typeName = superInterface.getTypeName();
+					superInterfaceNames[i] = typeName[typeName.length-1];
+				}
+			}
+
+			HierarchyType hierarchyType = new HierarchyType(
+					type,
+					typeDeclaration.name,
+					typeDeclaration.binding.modifiers,
+					superclassName,
+					superInterfaceNames);
+			remember(hierarchyType, typeDeclaration.binding);
+		} else {
+			HierarchyType hierarchyType = new HierarchyType(
+					type,
+					typeBinding.sourceName(),
+					typeBinding.modifiers,
+					typeBinding.superclass().sourceName(),
+					new char [][] { typeBinding.superInterfaces()[0].sourceName() });
+			remember(hierarchyType, typeBinding);
+		}
 	}
 
 }
@@ -451,10 +464,14 @@
 			rememberWithMemberTypes(type, cu.getType(new String(type.name)));
 		}
 	}
-	if (includeLocalTypes && parsedUnit.localTypes != null) {
-		HandleFactory factory = new HandleFactory();
-		HashSet existingElements = new HashSet(parsedUnit.localTypeCount);
-		HashMap knownScopes = new HashMap(parsedUnit.localTypeCount);
+	if (!includeLocalTypes || (parsedUnit.localTypes == null && parsedUnit.functionalExpressions == null))
+		return;
+	
+	HandleFactory factory = new HandleFactory();
+	HashSet existingElements = new HashSet(parsedUnit.localTypeCount + parsedUnit.functionalExpressionsCount);
+	HashMap knownScopes = new HashMap(parsedUnit.localTypeCount + parsedUnit.functionalExpressionsCount);
+	
+	if (parsedUnit.localTypes != null) {
 		for (int i = 0; i < parsedUnit.localTypeCount; i++) {
 			LocalTypeBinding localType = parsedUnit.localTypes[i];
 			ClassScope classScope = localType.scope;
@@ -463,6 +480,17 @@
 			rememberWithMemberTypes(typeDecl, typeHandle);
 		}
 	}
+	if (parsedUnit.functionalExpressions != null) {
+		for (int i = 0; i < parsedUnit.functionalExpressionsCount; i++) {
+			if (parsedUnit.functionalExpressions[i] instanceof LambdaExpression) {
+				final LambdaExpression expression = (LambdaExpression) parsedUnit.functionalExpressions[i];
+				if (expression.resolvedType != null && expression.resolvedType.isValidBinding()) {
+					IType typeHandle = (IType)factory.createLambdaTypeElement(expression, cu, existingElements, knownScopes);
+					remember(typeHandle, expression.getTypeBinding());
+				}
+			}
+		}
+	}
 }
 private void rememberWithMemberTypes(TypeDeclaration typeDecl, IType typeHandle) {
 	remember(typeHandle, typeDecl.binding);
@@ -586,10 +614,12 @@
 			reportHierarchy(this.builder.getType(), null, binaryTypeBinding);
 		} else {
 			org.aspectj.org.eclipse.jdt.core.ICompilationUnit cu = ((SourceTypeElementInfo)suppliedType).getHandle().getCompilationUnit();
-			HashSet localTypes = new HashSet();
-			localTypes.add(cu.getPath().toString());
-			this.superTypesOnly = true;
-			resolve(new Openable[] {(Openable)cu}, localTypes, null);
+			if (cu != null) {
+				HashSet localTypes = new HashSet();
+				localTypes.add(cu.getPath().toString());
+				this.superTypesOnly = true;
+				resolve(new Openable[] {(Openable)cu}, localTypes, null);
+			}
 		}
 	} catch (AbortCompilation e) { // ignore this exception for now since it typically means we cannot find java.lang.Object
 	} finally {
@@ -632,6 +662,7 @@
 
 		// build type bindings
 		Parser parser = new Parser(this.lookupEnvironment.problemReporter, true);
+		final boolean isJava8 = this.options.sourceLevel >= ClassFileConstants.JDK1_8;
 		for (int i = 0; i < openablesLength; i++) {
 			Openable openable = openables[i];
 			if (openable instanceof org.aspectj.org.eclipse.jdt.core.ICompilationUnit) {
@@ -643,7 +674,7 @@
 					containsLocalType = true;
 				} else {
 					IPath path = cu.getPath();
-					containsLocalType = localTypes.contains(path.toString());
+					containsLocalType = cu.isWorkingCopy() ? true /* presume conservatively */ : localTypes.contains(path.toString());
 				}
 
 				// build parsed unit
@@ -665,7 +696,7 @@
 						// types/cu exist since cu is opened
 					}
 					int flags = !containsLocalType
-						? SourceTypeConverter.MEMBER_TYPE
+						? SourceTypeConverter.MEMBER_TYPE | (isJava8 ? SourceTypeConverter.METHOD : 0)
 						: SourceTypeConverter.FIELD_AND_METHOD | SourceTypeConverter.MEMBER_TYPE | SourceTypeConverter.LOCAL_TYPE;
 					parsedUnit =
 						SourceTypeConverter.buildCompilationUnit(
@@ -682,7 +713,6 @@
 					// create parsed unit from file
 					IFile file = (IFile) cu.getResource();
 					ICompilationUnit sourceUnit = this.builder.createCompilationUnitFromPath(openable, file);
-
 					CompilationResult unitResult = new CompilationResult(sourceUnit, i, openablesLength, this.options.maxProblemsPerUnit);
 					parsedUnit = parser.dietParse(sourceUnit, unitResult);
 				}
@@ -867,7 +897,7 @@
 }
 private boolean subTypeOfType(ReferenceBinding subType, ReferenceBinding typeBinding) {
 	if (typeBinding == null || subType == null) return false;
-	if (subType == typeBinding) return true;
+	if (TypeBinding.equalsEquals(subType, typeBinding)) return true;
 	ReferenceBinding superclass = subType.superclass();
 	if (superclass != null) superclass = (ReferenceBinding) superclass.erasure();
 //	if (superclass != null && superclass.id == TypeIds.T_JavaLangObject && subType.isHierarchyInconsistent()) return false;
@@ -891,3 +921,4 @@
 	}
 }
 }
+
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java
index 65f107d..c5d3a70 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.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
@@ -39,6 +39,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.util.HandleFactory;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class IndexBasedHierarchyBuilder extends HierarchyBuilder implements SuffixConstants {
 	public static final int MAXTICKS = 800; // heuristic so that there still progress for deep hierachies
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.java
index f438f1e..19abf66 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.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
@@ -30,6 +30,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.Openable;
 import org.aspectj.org.eclipse.jdt.internal.core.SearchableEnvironment;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class RegionBasedHierarchyBuilder extends HierarchyBuilder {
 
 	public RegionBasedHierarchyBuilder(TypeHierarchy hierarchy)
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.java
index f5afba0..99e64ac 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.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,6 +21,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.Region;
 import org.aspectj.org.eclipse.jdt.internal.core.TypeVector;
 
+@SuppressWarnings({"rawtypes"})
 public class RegionBasedTypeHierarchy extends TypeHierarchy {
 	/**
 	 * The region of types for which to build the hierarchy
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java
index d4e5544..3fca6ac 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java
@@ -36,6 +36,7 @@
 /**
  * @see ITypeHierarchy
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class TypeHierarchy implements ITypeHierarchy, IElementChangedListener {
 
 	public static boolean DEBUG = false;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex.java
index daea4f6..a17f074 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/index/DiskIndex.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -46,7 +46,7 @@
 private int streamEnd; // used when writing data from the streamBuffer to the file
 char separator = Index.DEFAULT_SEPARATOR;
 
-public static final String SIGNATURE= "INDEX VERSION 1.126"; //$NON-NLS-1$
+public static final String SIGNATURE= "INDEX VERSION 1.127"; //$NON-NLS-1$
 private static final char[] SIGNATURE_CHARS = SIGNATURE.toCharArray();
 public static boolean DEBUG = false;
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/AbstractDOMBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/AbstractDOMBuilder.java
index 0d2505d..d2772e5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/AbstractDOMBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/AbstractDOMBuilder.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
@@ -22,6 +22,7 @@
  * powerful, fine-grained DOM/AST API found in the
  * org.aspectj.org.eclipse.jdt.core.dom package.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class AbstractDOMBuilder extends ReferenceInfoAdapter implements ILineStartFinder {
 	/**
 	 * Set to true when an error is encounterd while
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMBuilder.java
index 3be2d27..46eee8f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMBuilder.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
@@ -32,6 +32,7 @@
  * powerful, fine-grained DOM/AST API found in the
  * org.aspectj.org.eclipse.jdt.core.dom package.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class DOMBuilder extends AbstractDOMBuilder implements IDocumentElementRequestor {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMField.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMField.java
index 064e9d9..a669745 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMField.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMField.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
@@ -28,6 +28,7 @@
  * powerful, fine-grained DOM/AST API found in the
  * org.aspectj.org.eclipse.jdt.core.dom package.
  */
+@SuppressWarnings("rawtypes")
 class DOMField extends DOMMember implements IDOMField {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMNode.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMNode.java
index 37e5274..e144dd1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMNode.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMNode.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
@@ -52,6 +52,7 @@
  * powerful, fine-grained DOM/AST API found in the
  * org.aspectj.org.eclipse.jdt.core.dom package.
  */
+@SuppressWarnings("rawtypes")
 public abstract class DOMNode implements IDOMNode {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMType.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMType.java
index 9e98c00..be6eb3b 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMType.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/DOMType.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
@@ -31,6 +31,7 @@
  * powerful, fine-grained DOM/AST API found in the
  * org.aspectj.org.eclipse.jdt.core.dom package.
  */
+@SuppressWarnings("rawtypes")
 // TODO (jerome) - add implementation support for 1.5 features
 /* package */ class DOMType extends DOMMember implements IDOMType {
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/SiblingEnumeration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/SiblingEnumeration.java
index 9b6ab92..c5093ab 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/SiblingEnumeration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/SiblingEnumeration.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
@@ -23,6 +23,7 @@
  * powerful, fine-grained DOM/AST API found in the
  * org.aspectj.org.eclipse.jdt.core.dom package.
  */
+@SuppressWarnings("rawtypes")
 /* package */ class SiblingEnumeration implements Enumeration {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/SimpleDOMBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/SimpleDOMBuilder.java
index 9a79483..a865c2c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/SimpleDOMBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/jdom/SimpleDOMBuilder.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
@@ -30,6 +30,7 @@
  * powerful, fine-grained DOM/AST API found in the
  * org.aspectj.org.eclipse.jdt.core.dom package.
  */
+@SuppressWarnings({"rawtypes"})
 public class SimpleDOMBuilder extends AbstractDOMBuilder implements ISourceElementRequestor {
 
 /**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine.java
index 4be1c28..67e5878 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/BasicSearchEngine.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
@@ -39,6 +39,7 @@
  * for detailed comment), now uses basic engine functionalities.
  * Note that search basic engine does not implement deprecated functionalities...
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class BasicSearchEngine {
 
 	/*
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/HierarchyScope.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/HierarchyScope.java
index a44f536..4b2b4f6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/HierarchyScope.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/HierarchyScope.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
@@ -27,6 +27,7 @@
 /**
  * Scope limited to the subtype and supertype hierarchy of a given type.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class HierarchyScope extends AbstractSearchScope implements SuffixConstants {
 
 	public IType focusType;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/IndexSelector.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/IndexSelector.java
index 791eedc..a3dae40 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/IndexSelector.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/IndexSelector.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
@@ -36,7 +36,14 @@
  * Selects the indexes that correspond to projects in a given search scope
  * and that are dependent on a given focus element.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class IndexSelector {
+	
+	//TODO: Bug 386113: "Search references" and "Type hierarchy" show inconsistent results with "External Plug-in Libraries" project
+	public static final int PROJECT_CAN_SEE_FOCUS= 0;
+	public static final int PROJECT_SOURCE_CAN_NOT_SEE_FOCUS= 1;
+	public static final int PROJECT_CAN_NOT_SEE_FOCUS= 2;
+	
 	IJavaSearchScope searchScope;
 	SearchPattern pattern;
 	IndexLocation[] indexLocations; // cache of the keys for looking index up
@@ -53,44 +60,52 @@
  * a JarPackageFragmentRot) either because the focus is part of the project or the jar, or because it is
  * accessible throught the project's classpath
  */
-public static boolean canSeeFocus(SearchPattern pattern, IPath projectOrJarPath) {
+public static int canSeeFocus(SearchPattern pattern, IPath projectOrJarPath) {
 	try {
 		IJavaModel model = JavaModelManager.getJavaModelManager().getJavaModel();
 		IJavaProject project = getJavaProject(projectOrJarPath, model);
 		IJavaElement[] focuses = getFocusedElementsAndTypes(pattern, project, null);
-		if (focuses.length == 0) return false;
+		if (focuses.length == 0) return PROJECT_CAN_NOT_SEE_FOCUS;
 		if (project != null) {
 			return canSeeFocus(focuses, (JavaProject) project, null);
 		}
 
 		// projectOrJarPath is a jar
 		// it can see the focus only if it is on the classpath of a project that can see the focus
+		int result = PROJECT_CAN_NOT_SEE_FOCUS;
 		IJavaProject[] allProjects = model.getJavaProjects();
 		for (int i = 0, length = allProjects.length; i < length; i++) {
 			JavaProject otherProject = (JavaProject) allProjects[i];
 			IClasspathEntry entry = otherProject.getClasspathEntryFor(projectOrJarPath);
 			if (entry != null && entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
-				if (canSeeFocus(focuses, otherProject, null)) {
-					return true;
-				}
+				int canSeeFocus = canSeeFocus(focuses, otherProject, null);
+				if (canSeeFocus == PROJECT_CAN_SEE_FOCUS)
+					return PROJECT_CAN_SEE_FOCUS;
+				if (canSeeFocus == PROJECT_SOURCE_CAN_NOT_SEE_FOCUS)
+					result = PROJECT_SOURCE_CAN_NOT_SEE_FOCUS;
 			}
 		}
-		return false;
+		return result;
 	} catch (JavaModelException e) {
-		return false;
+		return PROJECT_CAN_NOT_SEE_FOCUS;
 	}
 }
-private static boolean canSeeFocus(IJavaElement[] focuses, JavaProject javaProject, char[][][] focusQualifiedNames) {
+private static int canSeeFocus(IJavaElement[] focuses, JavaProject javaProject, char[][][] focusQualifiedNames) {
+	int result = PROJECT_CAN_NOT_SEE_FOCUS;
 	int length = focuses.length;
 	for (int i=0; i<length; i++) {
-		if (canSeeFocus(focuses[i], javaProject, focusQualifiedNames)) return true;
+		int canSeeFocus = canSeeFocus(focuses[i], javaProject, focusQualifiedNames);
+		if (canSeeFocus == PROJECT_CAN_SEE_FOCUS)
+			return PROJECT_CAN_SEE_FOCUS;
+		if (canSeeFocus == PROJECT_SOURCE_CAN_NOT_SEE_FOCUS)
+			result = PROJECT_SOURCE_CAN_NOT_SEE_FOCUS;
 	}
-	return false;
+	return result;
 }
-private static boolean canSeeFocus(IJavaElement focus, JavaProject javaProject, char[][][] focusQualifiedNames) {
+private static int canSeeFocus(IJavaElement focus, JavaProject javaProject, char[][][] focusQualifiedNames) {
 	try {
-		if (focus == null) return false;
-		if (focus.equals(javaProject)) return true;
+		if (focus == null) return PROJECT_CAN_NOT_SEE_FOCUS;
+		if (focus.equals(javaProject)) return PROJECT_CAN_SEE_FOCUS;
 
 		if (focus instanceof JarPackageFragmentRoot) {
 			// focus is part of a jar
@@ -99,9 +114,9 @@
 			for (int i = 0, length = entries.length; i < length; i++) {
 				IClasspathEntry entry = entries[i];
 				if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY && entry.getPath().equals(focusPath))
-					return true;
+					return PROJECT_CAN_SEE_FOCUS;
 			}
-			return false;
+			return PROJECT_CAN_NOT_SEE_FOCUS;
 		}
 		// look for dependent projects
 		IPath focusPath = ((JavaProject) focus).getProject().getFullPath();
@@ -118,18 +133,18 @@
 							if (values[j] == null) continue;
 							ReferenceCollection references = (ReferenceCollection) values[j];
 							if (references.includes(focusQualifiedNames, null, null)) {
-								return true;
+								return PROJECT_CAN_SEE_FOCUS;
 							}
 						}
-						return false;
+						return PROJECT_SOURCE_CAN_NOT_SEE_FOCUS;
 					}
 				}
-				return true;
+				return PROJECT_CAN_SEE_FOCUS;
 			}
 		}
-		return false;
+		return PROJECT_CAN_NOT_SEE_FOCUS;
 	} catch (JavaModelException e) {
-		return false;
+		return PROJECT_CAN_NOT_SEE_FOCUS;
 	}
 }
 
@@ -217,8 +232,11 @@
 				JavaProject project = (JavaProject) getJavaProject(path, model);
 				if (project != null) {
 					visitedProjects.add(project);
-					if (canSeeFocus(focuses, project, focusQualifiedNames)) {
+					int canSeeFocus = canSeeFocus(focuses, project, focusQualifiedNames);
+					if (canSeeFocus == PROJECT_CAN_SEE_FOCUS) {
 						locations.add(manager.computeIndexLocation(path));
+					}
+					if (canSeeFocus != PROJECT_CAN_NOT_SEE_FOCUS) {
 						projectsCanSeeFocus[projectIndex++] = project;
 					}
 				} else {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.java
index df31836..5d7f7d6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.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
@@ -27,9 +27,11 @@
  * index queries. It also can map a document path to an actual document (note that documents could live outside
  * the workspace or no exist yet, and thus aren't just resources).
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaSearchParticipant extends SearchParticipant {
 
 	private ThreadLocal indexSelector = new ThreadLocal();
+	private SourceIndexer sourceIndexer;
 
 	/* (non-Javadoc)
 	 * @see org.aspectj.org.eclipse.jdt.core.search.SearchParticipant#beginSearching()
@@ -70,13 +72,38 @@
 
 		String documentPath = document.getPath();
 		if (org.aspectj.org.eclipse.jdt.internal.core.util.Util.isJavaLikeFileName(documentPath)) {
-			new SourceIndexer(document).indexDocument();
+			this.sourceIndexer = new SourceIndexer(document);
+			this.sourceIndexer.indexDocument();
 		} else if (org.aspectj.org.eclipse.jdt.internal.compiler.util.Util.isClassFileName(documentPath)) {
 			new BinaryIndexer(document).indexDocument();
 		}
 	}
 
 	/* (non-Javadoc)
+	 * @see org.aspectj.org.eclipse.jdt.core.search.SearchParticipant#indexResolvedDocument(SearchDocument, IPath)
+	 */
+	@Override
+	public void indexResolvedDocument(SearchDocument document, IPath indexPath) {
+		String documentPath = document.getPath();
+		if (org.aspectj.org.eclipse.jdt.internal.core.util.Util.isJavaLikeFileName(documentPath)) {
+			if (this.sourceIndexer != null)
+				this.sourceIndexer.indexResolvedDocument();
+			this.sourceIndexer = null;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.aspectj.org.eclipse.jdt.core.search.SearchParticipant#resolveDocument(SearchDocument document)
+	 */
+	public void resolveDocument(SearchDocument document) {
+		String documentPath = document.getPath();
+		if (org.aspectj.org.eclipse.jdt.internal.core.util.Util.isJavaLikeFileName(documentPath)) {
+			if (this.sourceIndexer != null)
+				this.sourceIndexer.resolveDocument();
+		}
+	}
+	
+	/* (non-Javadoc)
 	 * @see SearchParticipant#locateMatches(SearchDocument[], SearchPattern, IJavaSearchScope, SearchRequestor, IProgressMonitor)
 	 */
 	public void locateMatches(SearchDocument[] indexMatches, SearchPattern pattern,
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchScope.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchScope.java
index bb7153c..6f7b529 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchScope.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaSearchScope.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
@@ -44,6 +44,7 @@
 /**
  * A Java-specific scope for searching relative to one or more java elements.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaSearchScope extends AbstractJavaSearchScope {
 
 	private ArrayList elements;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.java
index 20fe380..7098803 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.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
@@ -38,6 +38,7 @@
  * The scope can be configured to not search binaries. By default, binaries
  * are included.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaWorkspaceScope extends AbstractJavaSearchScope {
 
 	private IPath[] enclosingPaths = null;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/PathCollector.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/PathCollector.java
index 40e45a1..409ea1e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/PathCollector.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/PathCollector.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,7 @@
 /**
  * Collects the resource paths reported by a client to this search requestor.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class PathCollector extends IndexQueryRequestor {
 
 	/* a set of resource paths */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.java
index 5e97b8b..ca74eeb 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -194,4 +194,7 @@
 		addNameReference(CharOperation.lastSegment(typeName, '.'));
 	}
 	public abstract void indexDocument();
+	public void indexResolvedDocument() {
+		// subtypes should implement where it makes sense.
+	}
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.java
index 15abdf5..fa42075 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.java
@@ -38,6 +38,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.search.JavaSearchDocument;
 import org.aspectj.org.eclipse.jdt.internal.core.search.processing.JobManager;
 
+@SuppressWarnings("rawtypes")
 class AddJarFileToIndex extends IndexRequest {
 
 	private static final char JAR_SEPARATOR = IJavaSearchScope.JAR_FILE_ENTRY_SEPARATOR.charAt(0);
@@ -234,7 +235,12 @@
 						this.manager.indexDocument(entryDocument, participant, index, indexPath);
 					}
 				}
-				this.manager.saveIndex(index);
+				if(this.forceIndexUpdate) {
+					this.manager.savePreBuiltIndex(index);
+				}
+				else {
+					this.manager.saveIndex(index);
+				}
 				if (JobManager.VERBOSE)
 					org.aspectj.org.eclipse.jdt.internal.core.util.Util.verbose("-> done indexing of " //$NON-NLS-1$
 						+ zip.getName() + " (" //$NON-NLS-1$
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/DefaultJavaIndexer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/DefaultJavaIndexer.java
index f44c203..4fd0630 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/DefaultJavaIndexer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/DefaultJavaIndexer.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
@@ -27,6 +27,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.index.IndexLocation;
 import org.aspectj.org.eclipse.jdt.internal.core.search.JavaSearchDocument;
 
+@SuppressWarnings("rawtypes")
 public class DefaultJavaIndexer {
 	private static final char JAR_SEPARATOR = IJavaSearchScope.JAR_FILE_ENTRY_SEPARATOR.charAt(0);
 	
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.java
index 5847669..2321104 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.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
@@ -34,6 +34,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.search.processing.JobManager;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class IndexAllProject extends IndexRequest {
 	IProject project;
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager.java
index 2fe7640..3fa1e78 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/IndexManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -38,6 +38,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.util.Messages;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class IndexManager extends JobManager implements IIndexConstants {
 
 	// key = containerPath, value = indexLocation path
@@ -309,9 +310,14 @@
 				// supposed to be in reuse state but error in the index file, so reindex.
 				if (VERBOSE)
 					Util.verbose("-> cannot reuse given index: "+indexLocation+" path: "+containerPathString); //$NON-NLS-1$ //$NON-NLS-2$
-				this.indexLocations.put(containerPath, null);
-				indexLocation = computeIndexLocation(containerPath);
-				rebuildIndex(indexLocation, containerPath);
+				if(!IS_MANAGING_PRODUCT_INDEXES_PROPERTY) {
+					this.indexLocations.put(containerPath, null);
+					indexLocation = computeIndexLocation(containerPath);
+					rebuildIndex(indexLocation, containerPath);
+				}
+				else {
+					rebuildIndex(indexLocation, containerPath, true);
+				}
 				return null;
 			}
 		}
@@ -500,6 +506,20 @@
 		searchDocument.setIndex(null);
 	}
 }
+public void indexResolvedDocument(SearchDocument searchDocument, SearchParticipant searchParticipant, Index index, IPath indexLocation) {
+	searchParticipant.resolveDocument(searchDocument);
+	ReadWriteMonitor monitor = index.monitor;
+	if (monitor == null) 
+		return; // index got deleted since acquired
+	try {
+		monitor.enterWrite(); // ask permission to write
+		searchDocument.setIndex(index);
+		searchParticipant.indexResolvedDocument(searchDocument, indexLocation);	
+	} finally {
+		searchDocument.setIndex(null);
+		monitor.exitWrite();
+	}
+}
 /**
  * Trigger addition of the entire content of a project
  * Note: the actual operation is performed in background
@@ -540,9 +560,16 @@
 public void indexLibrary(IPath path, IProject requestingProject, URL indexURL, final boolean updateIndex) {
 	// requestingProject is no longer used to cancel jobs but leave it here just in case
 	IndexLocation indexFile = null;
+	boolean forceIndexUpdate = false;
 	if(indexURL != null) {
 		if(IS_MANAGING_PRODUCT_INDEXES_PROPERTY) {
 			indexFile = computeIndexLocation(path, indexURL);
+			if(!updateIndex && !indexFile.exists()) {
+				forceIndexUpdate = true;
+			}
+			else {
+				forceIndexUpdate = updateIndex;
+			}
 		}
 		else {
 			indexFile = IndexLocation.createIndexLocation(indexURL);
@@ -550,7 +577,6 @@
 	}
 	if (JavaCore.getPlugin() == null) return;
 	IndexRequest request = null;
-	boolean forceIndexUpdate = IS_MANAGING_PRODUCT_INDEXES_PROPERTY && updateIndex;
 	Object target = JavaModel.getTarget(path, true);
 	if (target instanceof IFile) {
 		request = new AddJarFileToIndex((IFile) target, indexFile, this, forceIndexUpdate);
@@ -641,6 +667,9 @@
 	return null;
 }
 private void rebuildIndex(IndexLocation indexLocation, IPath containerPath) {
+	rebuildIndex(indexLocation, containerPath, false);
+}
+private void rebuildIndex(IndexLocation indexLocation, IPath containerPath, final boolean updateIndex) {
 	Object target = JavaModel.getTarget(containerPath, true);
 	if (target == null) return;
 
@@ -656,9 +685,9 @@
 	} else if (target instanceof IFolder) {
 		request = new IndexBinaryFolder((IFolder) target, this);
 	} else if (target instanceof IFile) {
-		request = new AddJarFileToIndex((IFile) target, null, this);
+		request = new AddJarFileToIndex((IFile) target, null, this, updateIndex);
 	} else if (target instanceof File) {
-		request = new AddJarFileToIndex(containerPath, null, this);
+		request = new AddJarFileToIndex(containerPath, null, this, updateIndex);
 	}
 	if (request != null)
 		request(request);
@@ -851,6 +880,23 @@
 		return false;
 	}
 }
+/**
+ * {@link #saveIndex(Index)} will only update the state if there are no other jobs running against the same
+ * underlying resource for this index.  Pre-built indexes must be in a {@link #REUSE_STATE} state even if
+ * there is another job to run against it as the subsequent job will find the index and not save it in the
+ * right state.
+ * Refer to https://bugs.eclipse.org/bugs/show_bug.cgi?id=405932
+ */
+public void savePreBuiltIndex(Index index) throws IOException {
+	if (index.hasChanged()) {
+		if (VERBOSE)
+			Util.verbose("-> saving pre-build index " + index.getIndexLocation()); //$NON-NLS-1$
+		index.save();
+	}
+	synchronized (this) {
+		updateIndexState(index.getIndexLocation(), REUSE_STATE);
+	}
+}
 public void saveIndex(Index index) throws IOException {
 	// must have permission to write from the write monitor
 	if (index.hasChanged()) {
@@ -932,13 +978,16 @@
 			if (index == null) return true;
 			ReadWriteMonitor monitor = index.monitor;
 			if (monitor == null) return true; // index got deleted since acquired
-
+			final Path indexPath = new Path(indexLocation.getCanonicalFilePath());
 			try {
 				monitor.enterWrite(); // ask permission to write
-				indexDocument(searchDocument, searchParticipant, index, new Path(indexLocation.getCanonicalFilePath()));
+				indexDocument(searchDocument, searchParticipant, index, indexPath);
 			} finally {
 				monitor.exitWrite(); // free write lock
 			}
+			if (searchDocument.shouldIndexResolvedDocument()) {
+				indexResolvedDocument(searchDocument, searchParticipant, index, indexPath);
+			}
 			return true;
 		}
 		public String toString() {
@@ -971,6 +1020,7 @@
 			if (savedSignature.equals(new String(names[0]))) {
 				for (int i = 1, l = names.length-1 ; i < l ; i+=2) {
 					IndexLocation indexPath = IndexLocation.createIndexLocation(new URL(new String(names[i])));
+					if (indexPath == null) continue;
 					this.indexLocations.put(new Path(new String(names[i+1])), indexPath );
 					this.indexStates.put(indexPath, REUSE_STATE);
 				}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexer.java
index 62061bd..82b2488 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/indexing/SourceIndexer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,12 +14,43 @@
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
+import org.aspectj.org.eclipse.jdt.core.IType;
 import org.aspectj.org.eclipse.jdt.core.JavaCore;
+import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.core.search.SearchDocument;
+import org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.aspectj.org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ISourceElementRequestor;
 import org.aspectj.org.eclipse.jdt.internal.compiler.SourceElementParser;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FunctionalExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.AccessRestriction;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryType;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.INameEnvironment;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.ISourceType;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.aspectj.org.eclipse.jdt.internal.compiler.impl.ITypeRequestor;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.PackageBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.parser.Parser;
+import org.aspectj.org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
+import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SuffixConstants;
+import org.aspectj.org.eclipse.jdt.internal.core.DefaultWorkingCopyOwner;
+import org.aspectj.org.eclipse.jdt.internal.core.JavaModel;
 import org.aspectj.org.eclipse.jdt.internal.core.JavaModelManager;
+import org.aspectj.org.eclipse.jdt.internal.core.JavaProject;
+import org.aspectj.org.eclipse.jdt.internal.core.SourceTypeElementInfo;
 import org.aspectj.org.eclipse.jdt.internal.core.jdom.CompilationUnit;
+import org.aspectj.org.eclipse.jdt.internal.core.search.matching.JavaSearchNameEnvironment;
+import org.aspectj.org.eclipse.jdt.internal.core.search.matching.MethodPattern;
 import org.aspectj.org.eclipse.jdt.internal.core.search.processing.JobManager;
 
 /**
@@ -29,28 +60,37 @@
  * - Interfaces;<br>
  * - Methods;<br>
  * - Fields;<br>
+ * - Lambda expressions;<br>
  * References to:<br>
  * - Methods (with number of arguments); <br>
  * - Fields;<br>
  * - Types;<br>
  * - Constructors.
  */
-public class SourceIndexer extends AbstractIndexer implements SuffixConstants {
+public class SourceIndexer extends AbstractIndexer implements ITypeRequestor, SuffixConstants {
 
+	private LookupEnvironment lookupEnvironment;
+	private CompilerOptions options;
+	public ISourceElementRequestor requestor;
+	private Parser basicParser;
+	private CompilationUnit compilationUnit;
+	private CompilationUnitDeclaration cud;
+	private static final boolean DEBUG = false;
+	
 	public SourceIndexer(SearchDocument document) {
 		super(document);
+		this.requestor = new SourceIndexerRequestor(this);
 	}
 	public void indexDocument() {
 		// Create a new Parser
-		SourceIndexerRequestor requestor = new SourceIndexerRequestor(this);
 		String documentPath = this.document.getPath();
 		SourceElementParser parser = this.document.getParser();
 		if (parser == null) {
 			IPath path = new Path(documentPath);
 			IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(path.segment(0));
-			parser = JavaModelManager.getJavaModelManager().indexManager.getSourceElementParser(JavaCore.create(project), requestor);
+			parser = JavaModelManager.getJavaModelManager().indexManager.getSourceElementParser(JavaCore.create(project), this.requestor);
 		} else {
-			parser.setRequestor(requestor);
+			parser.setRequestor(this.requestor);
 		}
 
 		// Launch the parser
@@ -63,9 +103,146 @@
 			// ignore
 		}
 		if (source == null || name == null) return; // could not retrieve document info (e.g. resource was discarded)
-		CompilationUnit compilationUnit = new CompilationUnit(source, name);
+		this.compilationUnit = new CompilationUnit(source, name);
 		try {
-			parser.parseCompilationUnit(compilationUnit, true/*full parse*/, null/*no progress*/);
+			if (parser.parseCompilationUnit(this.compilationUnit, true, null).hasFunctionalTypes())
+				this.document.requireIndexingResolvedDocument();
+		} catch (Exception e) {
+			if (JobManager.VERBOSE) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	public void accept(IBinaryType binaryType, PackageBinding packageBinding, AccessRestriction accessRestriction) {
+		this.lookupEnvironment.createBinaryTypeFrom(binaryType, packageBinding, accessRestriction);
+	}
+
+	public void accept(ICompilationUnit unit, AccessRestriction accessRestriction) {
+		CompilationResult unitResult = new CompilationResult(unit, 1, 1, this.options.maxProblemsPerUnit);
+		CompilationUnitDeclaration parsedUnit = this.basicParser.dietParse(unit, unitResult);
+		this.lookupEnvironment.buildTypeBindings(parsedUnit, accessRestriction);
+		this.lookupEnvironment.completeTypeBindings(parsedUnit, true);
+	}
+
+	public void accept(ISourceType[] sourceTypes, PackageBinding packageBinding, AccessRestriction accessRestriction) {
+		ISourceType sourceType = sourceTypes[0];
+		while (sourceType.getEnclosingType() != null)
+			sourceType = sourceType.getEnclosingType();
+		SourceTypeElementInfo elementInfo = (SourceTypeElementInfo) sourceType;
+		IType type = elementInfo.getHandle();
+		ICompilationUnit sourceUnit = (ICompilationUnit) type.getCompilationUnit();
+		accept(sourceUnit, accessRestriction);		
+	}
+	
+	public void resolveDocument() {
+		try {
+			IPath path = new Path(this.document.getPath());
+			IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(path.segment(0));
+			JavaModel model = JavaModelManager.getJavaModelManager().getJavaModel();
+			JavaProject javaProject = (JavaProject) model.getJavaProject(project);
+
+			this.options = new CompilerOptions(javaProject.getOptions(true));
+			ProblemReporter problemReporter =
+					new ProblemReporter(
+							DefaultErrorHandlingPolicies.proceedWithAllProblems(),
+							this.options,
+							new DefaultProblemFactory());
+
+			// Re-parse using normal parser, IndexingParser swallows several nodes, see comment above class.
+			this.basicParser = new Parser(problemReporter, false);
+			this.basicParser.reportOnlyOneSyntaxError = true;
+			this.basicParser.scanner.taskTags = null;
+			this.cud = this.basicParser.parse(this.compilationUnit, new CompilationResult(this.compilationUnit, 0, 0, this.options.maxProblemsPerUnit));
+
+			// Use a non model name environment to avoid locks, monitors and such.
+			INameEnvironment nameEnvironment = new JavaSearchNameEnvironment(javaProject, JavaModelManager.getJavaModelManager().getWorkingCopies(DefaultWorkingCopyOwner.PRIMARY, true/*add primary WCs*/));
+			this.lookupEnvironment = new LookupEnvironment(this, this.options, problemReporter, nameEnvironment);
+			reduceParseTree(this.cud);
+			this.lookupEnvironment.buildTypeBindings(this.cud, null);
+			this.lookupEnvironment.completeTypeBindings();
+			this.cud.scope.faultInTypes();
+			this.cud.resolve();
+		} catch (Exception e) {
+			if (JobManager.VERBOSE) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	/**
+	 * Called prior to the unit being resolved. Reduce the parse tree where possible.
+	 */
+	private void reduceParseTree(CompilationUnitDeclaration unit) {
+		// remove statements from methods that have no functional interface types.
+		TypeDeclaration[] types = unit.types;
+		for (int i = 0, l = types == null ? 0 : types.length; i < l; i++)
+			purgeMethodStatements(types[i]);
+	}
+
+	private void purgeMethodStatements(TypeDeclaration type) {
+		AbstractMethodDeclaration[] methods = type.methods;
+		for (int j = 0, length = methods == null ? 0 : methods.length; j < length; j++) {
+			AbstractMethodDeclaration method = methods[j];
+			if (method != null && (method.bits & ASTNode.HasFunctionalInterfaceTypes) == 0) {
+				method.statements = null;
+				method.javadoc = null;
+			}
+		}
+
+		TypeDeclaration[] memberTypes = type.memberTypes;
+		if (memberTypes != null)
+			for (int i = 0, l = memberTypes.length; i < l; i++)
+				purgeMethodStatements(memberTypes[i]);
+	}
+
+	public void indexResolvedDocument() {
+		try {
+			if (DEBUG) System.out.println(new String(this.cud.compilationResult.fileName) + ':');
+			for (int i = 0, length = this.cud.functionalExpressionsCount; i < length; i++) {
+				FunctionalExpression expression = this.cud.functionalExpressions[i];
+				if (expression instanceof LambdaExpression) {
+					LambdaExpression lambdaExpression = (LambdaExpression) expression;
+					if (lambdaExpression.binding != null && lambdaExpression.binding.isValidBinding()) {
+						final char[] superinterface = lambdaExpression.resolvedType.sourceName();
+						if (DEBUG) {
+							System.out.println('\t' + new String(superinterface) + '.' + 
+									new String(lambdaExpression.descriptor.selector) + "-> {}"); //$NON-NLS-1$
+						}
+						SourceIndexer.this.addIndexEntry(IIndexConstants.METHOD_DECL, MethodPattern.createIndexKey(lambdaExpression.descriptor.selector, lambdaExpression.descriptor.parameters.length));
+					
+						addClassDeclaration(0,  // most entries are blank, that is fine, since lambda type/method cannot be searched.
+								CharOperation.NO_CHAR, // package name
+								ONE_ZERO,
+								ONE_ZERO_CHAR, // enclosing types.
+								CharOperation.NO_CHAR, // super class
+								new char[][] { superinterface },
+								CharOperation.NO_CHAR_CHAR,
+								true); // not primary.
+
+					} else {
+						if (DEBUG) System.out.println("\tnull/bad binding in lambda"); //$NON-NLS-1$
+					}
+				} else {
+					ReferenceExpression referenceExpression = (ReferenceExpression) expression;
+					if (referenceExpression.isArrayConstructorReference())
+						continue;
+					MethodBinding binding = referenceExpression.getMethodBinding();
+					if (binding != null && binding.isValidBinding()) {
+						if (DEBUG) {
+							System.out.println('\t' + new String(referenceExpression.resolvedType.sourceName()) + "::"  //$NON-NLS-1$
+									+ new String(referenceExpression.descriptor.selector) + " == " + new String(binding.declaringClass.sourceName()) + '.' + //$NON-NLS-1$
+									new String(binding.selector));
+						}
+						if (referenceExpression.isMethodReference())
+							SourceIndexer.this.addMethodReference(binding.selector, binding.parameters.length);
+						else
+							SourceIndexer.this.addConstructorReference(binding.declaringClass.sourceName(), binding.parameters.length);
+					} else {
+						if (DEBUG) System.out.println("\tnull/bad binding in reference expression"); //$NON-NLS-1$
+					}
+				}
+			}
 		} catch (Exception e) {
 			if (JobManager.VERBOSE) {
 				e.printStackTrace();
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndLocator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndLocator.java
index 632aa37..3a803c5 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndLocator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/AndLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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,12 +19,14 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ImportReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MemberValuePair;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MessageSend;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Reference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeParameter;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
@@ -108,6 +110,17 @@
 	}
 	return level;
 }
+public int match(LambdaExpression node, MatchingNodeSet nodeSet) {
+	int level = IMPOSSIBLE_MATCH;
+	for (int i = 0, length = this.patternLocators.length; i < length; i++) {
+		int newLevel = this.patternLocators[i].match(node, nodeSet);
+		if (newLevel > level) {
+			if (newLevel == ACCURATE_MATCH) return ACCURATE_MATCH;
+			level = newLevel;
+		}
+	}
+	return level;
+}
 public int match(LocalDeclaration node, MatchingNodeSet nodeSet) {
 	int level = IMPOSSIBLE_MATCH;
 	for (int i = 0, length = this.patternLocators.length; i < length; i++) {
@@ -163,6 +176,17 @@
 	}
 	return level;
 }
+public int match(ReferenceExpression node, MatchingNodeSet nodeSet) {
+	int level = IMPOSSIBLE_MATCH;
+	for (int i = 0, length = this.patternLocators.length; i < length; i++) {
+		int newLevel = this.patternLocators[i].match(node, nodeSet);
+		if (newLevel > level) {
+			if (newLevel == ACCURATE_MATCH) return ACCURATE_MATCH;
+			level = newLevel;
+		}
+	}
+	return level;
+}
 public int match(TypeDeclaration node, MatchingNodeSet nodeSet) {
 	int level = IMPOSSIBLE_MATCH;
 	for (int i = 0, length = this.patternLocators.length; i < length; i++) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClasspathSourceDirectory.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClasspathSourceDirectory.java
index 2b3efa9..2910626 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClasspathSourceDirectory.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ClasspathSourceDirectory.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
@@ -29,6 +29,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.util.ResourceCompilationUnit;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings("rawtypes")
 public class ClasspathSourceDirectory extends ClasspathLocation {
 
 	IContainer sourceFolder;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.java
index caa7f61..2cab935 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -88,6 +88,11 @@
 	}
 	return IMPOSSIBLE_MATCH;
 }
+public int match(ReferenceExpression node, MatchingNodeSet nodeSet) {
+	if (!this.pattern.findReferences || node.isMethodReference()) return IMPOSSIBLE_MATCH;
+	return nodeSet.addMatch(node, this.pattern.mustResolve ? POSSIBLE_MATCH : ACCURATE_MATCH);
+}
+
 //public int match(Reference node, MatchingNodeSet nodeSet) - SKIP IT
 public int match(TypeDeclaration node, MatchingNodeSet nodeSet) {
 	if (!this.pattern.findReferences) return IMPOSSIBLE_MATCH;
@@ -303,6 +308,9 @@
 		if (node instanceof JavadocMessageSend) {
 			return resolveLevel(((JavadocMessageSend)node).binding);
 		}
+		if (node instanceof ReferenceExpression) {
+			return resolveLevel(((ReferenceExpression)node).getMethodBinding());
+		}
 	}
 	if (node instanceof ConstructorDeclaration)
 		return resolveLevel((ConstructorDeclaration) node, true);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.java
index 7b37617..5c01c5a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.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
@@ -40,6 +40,7 @@
 /*
  * A name environment based on the classpath of a Java project.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaSearchNameEnvironment implements INameEnvironment, SuffixConstants {
 
 	ClasspathLocation[] locations;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
index fa72cca..1e32278 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
@@ -1,16 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *								Bug 377883 - NPE on open Call Hierarchy
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core.search.matching;
 
@@ -83,6 +81,7 @@
 import org.aspectj.org.eclipse.jdt.internal.core.util.HandleFactory;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class MatchLocator implements ITypeRequestor {
 
 public static final int MAX_AT_ONCE;
@@ -222,7 +221,7 @@
 	for (int i=0, length = copies.length; i<length; i++) {
 		org.aspectj.org.eclipse.jdt.core.ICompilationUnit workingCopy = copies[i];
 		IPath projectOrJar = MatchLocator.getProjectOrJar(workingCopy).getPath();
-		if (pattern.focus == null || IndexSelector.canSeeFocus(pattern, projectOrJar)) {
+		if (pattern.focus == null || IndexSelector.canSeeFocus(pattern, projectOrJar) != IndexSelector.PROJECT_CAN_NOT_SEE_FOCUS) {
 			result.put(
 				workingCopy.getPath().toString(),
 				new WorkingCopyDocument(workingCopy, participant)
@@ -448,6 +447,15 @@
 	return this.allSuperTypeNames;
 }
 /**
+ * Creates an IMethod from the given lambda declaration and type.
+ */
+protected IJavaElement createHandle(LambdaExpression lambdaExpression, IJavaElement parent) {
+	org.aspectj.org.eclipse.jdt.internal.core.LambdaExpression lambdaElement = new org.aspectj.org.eclipse.jdt.internal.core.LambdaExpression((JavaElement) parent, lambdaExpression);
+	IMethod lambdaMethodElement = lambdaElement.getMethod();
+	this.methodHandles.add(lambdaMethodElement);
+	return lambdaMethodElement;
+}
+/**
  * Creates an IMethod from the given method declaration and type.
  */
 protected IJavaElement createHandle(AbstractMethodDeclaration method, IJavaElement parent) {
@@ -597,22 +605,11 @@
  * Create an handle for a local variable declaration (may be a local variable or type parameter).
  */
 protected IJavaElement createHandle(AbstractVariableDeclaration variableDeclaration, IJavaElement parent) {
+	boolean isParameter = true;
 	switch (variableDeclaration.getKind()) {
 		case AbstractVariableDeclaration.LOCAL_VARIABLE:
-			if (variableDeclaration.type.resolvedType != null) {
-				return new LocalVariable((JavaElement)parent,
-					new String(variableDeclaration.name),
-					variableDeclaration.declarationSourceStart,
-					variableDeclaration.declarationSourceEnd,
-					variableDeclaration.sourceStart,
-					variableDeclaration.sourceEnd,
-					new String(variableDeclaration.type.resolvedType.signature()),
-					variableDeclaration.annotations,
-					variableDeclaration.modifiers,
-					false
-				);
-			}
-			break;
+			isParameter = false;
+			//$FALL-THROUGH$
 		case AbstractVariableDeclaration.PARAMETER:
 			if (variableDeclaration.type.resolvedType != null) {
 				return new LocalVariable((JavaElement)parent,
@@ -624,7 +621,8 @@
 					new String(variableDeclaration.type.resolvedType.signature()),
 					variableDeclaration.annotations,
 					variableDeclaration.modifiers,
-					true
+					isParameter,
+					variableDeclaration.type.getAnnotationsOnDimensions()
 				);
 			}
 			break;
@@ -649,6 +647,19 @@
 				return annotations[i];
 			}
 		}
+		if (parent instanceof LocalVariable) {
+			LocalVariable localVariable = (LocalVariable) parent;
+			IAnnotation[][] annotationsOnDimensions = localVariable.annotationsOnDimensions;
+			int noOfDimensions = annotationsOnDimensions == null ? 0 : annotationsOnDimensions.length;
+			for (int i = 0; i < noOfDimensions; ++i) {
+				IAnnotation[] dimAnnotations = annotationsOnDimensions[i];
+				int noOfAnnotations = dimAnnotations.length;
+				for (int j = 0; j < noOfAnnotations; ++j) {
+					if (dimAnnotations[j].getElementName().equals(name))
+						return dimAnnotations[j];
+				}
+			}
+		}
 	}
 	catch (JavaModelException jme) {
 		// skip
@@ -914,7 +925,7 @@
     // special handling for methods of anonymous/local types. Since these cannot be looked up in the environment the usual way ...
     if (methodPattern.focus instanceof SourceMethod) {
     	char[] typeName = PatternLocator.qualifiedPattern(methodPattern.declaringSimpleName, methodPattern.declaringQualification);
-    	if (CharOperation.indexOf(IIndexConstants.ONE_STAR, typeName, true) >= 0) { // See org.aspectj.org.eclipse.jdt.core.search.SearchPattern.enclosingTypeNames(IType)
+    	if (typeName != null && CharOperation.indexOf(IIndexConstants.ONE_STAR, typeName, true) >= 0) { // See org.aspectj.org.eclipse.jdt.core.search.SearchPattern.enclosingTypeNames(IType)
     		IType type = methodPattern.declaringType;
     		IType enclosingType = type.getDeclaringType();
     		while (enclosingType != null) {
@@ -1030,8 +1041,10 @@
 public void initialize(JavaProject project, int possibleMatchSize) throws JavaModelException {
 	// clean up name environment only if there are several possible match as it is reused
 	// when only one possible match (bug 58581)
-	if (this.nameEnvironment != null && possibleMatchSize != 1)
+	if (this.nameEnvironment != null && possibleMatchSize != 1) {
 		this.nameEnvironment.cleanup();
+		this.unitScope = null; // don't leak a reference to the cleaned-up name environment
+	}
 
 	SearchableEnvironment searchableEnvironment = project.newSearchableNameEnvironment(this.workingCopies);
 
@@ -1332,6 +1345,7 @@
 			this.progressMonitor.done();
 		if (this.nameEnvironment != null)
 			this.nameEnvironment.cleanup();
+		this.unitScope = null;
 		manager.flushZipFiles(this);
 		this.bindings = null;
 	}
@@ -2185,6 +2199,54 @@
 	SearchMatch match = newDeclarationMatch(binaryMember, binaryMemberBinding, accuracy, range.getOffset(), range.getLength(), getParticipant(), resource);
 	report(match);
 }
+
+protected void reportMatching(LambdaExpression lambdaExpression,  IJavaElement parent, int accuracy, MatchingNodeSet nodeSet, boolean typeInHierarchy) throws CoreException {
+	IJavaElement enclosingElement = null;
+	// Report the lambda declaration itself.
+	if (accuracy > -1) {
+		enclosingElement = createHandle(lambdaExpression, parent);
+		if (enclosingElement != null) { // skip if unable to find method
+			// compute source positions of the selector
+			int nameSourceStart = lambdaExpression.sourceStart;
+			if (encloses(enclosingElement)) {
+				SearchMatch match = null;
+				int length = lambdaExpression.arrowPosition() + 1 - nameSourceStart;
+				match = this.patternLocator.newDeclarationMatch(lambdaExpression, enclosingElement, null, accuracy, length, this);
+				if (match != null) {
+					report(match);
+				}
+			}
+		}
+	}
+	if (enclosingElement == null) {
+		enclosingElement = createHandle(lambdaExpression, parent);
+	}
+	// Traverse the lambda declaration to report matches inside, these matches if any should see the present lambda as the parent model element.
+	ASTNode[] nodes = typeInHierarchy ? nodeSet.matchingNodes(lambdaExpression.sourceStart, lambdaExpression.sourceEnd) : null;
+	boolean report = (this.matchContainer & PatternLocator.METHOD_CONTAINER) != 0 && encloses(enclosingElement);
+	MemberDeclarationVisitor declarationVisitor = new MemberDeclarationVisitor(enclosingElement, report ? nodes : null, nodeSet, this, typeInHierarchy);
+	
+	if (lambdaExpression.arguments != null) {
+		int argumentsLength = lambdaExpression.arguments.length;
+		for (int i = 0; i < argumentsLength; i++)
+			lambdaExpression.arguments[i].traverse(declarationVisitor, (BlockScope) null);
+	}
+
+	if (lambdaExpression.body != null) {
+		lambdaExpression.body.traverse(declarationVisitor, (BlockScope) null);
+	}
+	
+	// Report all nodes and remove them
+	if (nodes != null) {
+		int length = nodes.length;
+		for (int i = 0; i < length; i++) {
+			Integer level = (Integer) nodeSet.matchingNodes.removeKey(nodes[i]);
+			if (report && level != null) {
+				this.patternLocator.matchReportReference(nodes[i], enclosingElement, declarationVisitor.getLocalElement(i), declarationVisitor.getOtherElements(i), lambdaExpression.binding, level.intValue(), this);
+			}
+		}
+	}
+}
 /**
  * Visit the given method declaration and report the nodes that match exactly the
  * search pattern (i.e. the ones in the matching nodes set)
@@ -2233,7 +2295,7 @@
 		// and in local variables declaration
 		ASTNode[] nodes = typeInHierarchy ? nodeSet.matchingNodes(method.declarationSourceStart, method.declarationSourceEnd) : null;
 		boolean report = (this.matchContainer & PatternLocator.METHOD_CONTAINER) != 0 && encloses(enclosingElement);
-		MemberDeclarationVisitor declarationVisitor = new MemberDeclarationVisitor(enclosingElement, report ? nodes : null, nodeSet, this);
+		MemberDeclarationVisitor declarationVisitor = new MemberDeclarationVisitor(enclosingElement, report ? nodes : null, nodeSet, this, typeInHierarchy);
 		try {
 			method.traverse(declarationVisitor, (ClassScope) null);
 		} catch (WrappedCoreException e) {
@@ -2283,7 +2345,7 @@
 				if (encloses(enclosingElement)) {
 					if (this.pattern.mustResolve) {
 						// Visit only if the pattern must resolve
-						MemberDeclarationVisitor declarationVisitor = new MemberDeclarationVisitor(enclosingElement, nodes, nodeSet, this);
+						MemberDeclarationVisitor declarationVisitor = new MemberDeclarationVisitor(enclosingElement, nodes, nodeSet, this, typeInHierarchy);
 						method.traverse(declarationVisitor, (ClassScope) null);
 						int length = nodes.length;
 						for (int i = 0; i < length; i++) {
@@ -2316,6 +2378,8 @@
  * @param otherElements TODO
  */
 protected void reportMatching(Annotation[] annotations, IJavaElement enclosingElement, IJavaElement[] otherElements, Binding elementBinding, MatchingNodeSet nodeSet, boolean matchedContainer, boolean enclosesElement) throws CoreException {
+	if (annotations == null)
+		return;
 	for (int i=0, al=annotations.length; i<al; i++) {
 		Annotation annotationType = annotations[i];
 		IJavaElement localAnnotation = null;
@@ -2539,7 +2603,7 @@
 		int fieldEnd = field.endPart2Position == 0 ? field.declarationSourceEnd : field.endPart2Position;
 		ASTNode[] nodes = typeInHierarchy ? nodeSet.matchingNodes(field.sourceStart, fieldEnd) : null;
 		boolean report = (this.matchContainer & PatternLocator.FIELD_CONTAINER) != 0 && encloses(enclosingElement);
-		MemberDeclarationVisitor declarationVisitor = new MemberDeclarationVisitor(enclosingElement, report ? nodes : null, nodeSet, this);
+		MemberDeclarationVisitor declarationVisitor = new MemberDeclarationVisitor(enclosingElement, report ? nodes : null, nodeSet, this, typeInHierarchy);
 		try {
 			field.traverse(declarationVisitor, (MethodScope) null);
 		} catch (WrappedCoreException e) {
@@ -2615,7 +2679,7 @@
 					enclosingElement = createHandle(field, type, parent);
 				}
 				if (encloses(enclosingElement)) {
-					MemberDeclarationVisitor declarationVisitor = new MemberDeclarationVisitor(enclosingElement, nodes, nodeSet, this);
+					MemberDeclarationVisitor declarationVisitor = new MemberDeclarationVisitor(enclosingElement, nodes, nodeSet, this, typeInHierarchy);
 					field.traverse(declarationVisitor, (MethodScope) null);
 					int length = nodes.length;
 					for (int i = 0; i < length; i++) {
@@ -2711,7 +2775,9 @@
 		if (superClass != null) {
 			reportMatchingSuper(superClass, enclosingElement, type.binding, nodeSet, matchedClassContainer);
 			for (int i = 0, length = superClass.annotations == null ? 0 : superClass.annotations.length; i < length; i++) {
-				reportMatching(superClass.annotations[i], enclosingElement, null, type.binding, nodeSet, matchedClassContainer, enclosesElement);	
+				Annotation[] annotations = superClass.annotations[i];
+				if (annotations == null) continue;
+				reportMatching(annotations, enclosingElement, null, type.binding, nodeSet, matchedClassContainer, enclosesElement);	
 			}
 		}
 		TypeReference[] superInterfaces = type.superInterfaces;
@@ -2719,9 +2785,11 @@
 			for (int i = 0, l = superInterfaces.length; i < l; i++) {
 				reportMatchingSuper(superInterfaces[i], enclosingElement, type.binding, nodeSet, matchedClassContainer);
 				TypeReference typeReference  = type.superInterfaces[i];
-				if (typeReference != null &&  typeReference.annotations != null) {
-					for (int j = 0, length = typeReference.annotations.length; j < length; j++) {
-						reportMatching(typeReference.annotations[j], enclosingElement, null, type.binding, nodeSet, matchedClassContainer, enclosesElement);	
+				Annotation[][] annotations = typeReference != null ? typeReference.annotations : null;
+				if (annotations != null) {
+					for (int j = 0, length = annotations.length; j < length; j++) {
+						if (annotations[j] == null) continue;
+						reportMatching(annotations[j], enclosingElement, null, type.binding, nodeSet, matchedClassContainer, enclosesElement);	
 					}
 				}			
 			}
@@ -2856,6 +2924,9 @@
 			if (typeParameter.bounds != null) {
 				for (int j=0, b=typeParameter.bounds.length; j<b; j++) {
 					TypeReference typeParameterBound = typeParameter.bounds[j];
+					if (typeParameterBound.annotations != null) {
+						reportMatching(typeParameterBound.annotations, enclosingElement, binding,nodeSet, matchedClassContainer);
+					}
 					level = (Integer) nodeSet.matchingNodes.removeKey(typeParameterBound);
 					if (level != null) {
 						IJavaElement localElement = createHandle(typeParameter, enclosingElement);
@@ -2867,6 +2938,9 @@
 	                    	int length = paramSTR.typeArguments.length;
 	                    	for (int k=0; k<length; k++) {
 								TypeReference typeArgument = paramSTR.typeArguments[k];
+								if (typeArgument.annotations != null) {
+									reportMatching(typeArgument.annotations, enclosingElement, binding,nodeSet, matchedClassContainer);
+								}
 								level = (Integer) nodeSet.matchingNodes.removeKey(typeArgument);
 								if (level != null) {
 									IJavaElement localElement = createHandle(typeParameter, enclosingElement);
@@ -2875,6 +2949,9 @@
 								if (typeArgument instanceof Wildcard) {
 		                            TypeReference wildcardBound = ((Wildcard) typeArgument).bound;
 		                            if (wildcardBound != null) {
+		            					if (wildcardBound.annotations != null) {
+		            						reportMatching(wildcardBound.annotations, enclosingElement, binding,nodeSet, matchedClassContainer);
+		            					}
 										level = (Integer) nodeSet.matchingNodes.removeKey(wildcardBound);
 										if (level != null) {
 											IJavaElement localElement = createHandle(typeParameter, enclosingElement);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java
index f0a1d05..da8ab13 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -224,7 +220,9 @@
 	super.consumeCastExpressionLL1WithBounds();
 	if ((this.patternFineGrain & IJavaSearchConstants.CAST_TYPE_REFERENCE) != 0) {
 		CastExpression castExpression = (CastExpression) this.expressionStack[this.expressionPtr];
-		this.patternLocator.match(castExpression.type, this.nodeSet);
+		TypeReference[] typeReferences = ((IntersectionCastTypeReference) castExpression.type).typeReferences;
+		for (int i = 0, length = typeReferences.length; i < length; i++)
+			this.patternLocator.match(typeReferences[i], this.nodeSet);
 	}
 }
 protected void consumeCastExpressionWithGenericsArray() {
@@ -359,6 +357,12 @@
 	this.patternLocator.setFlavors(PatternLocator.NO_FLAVOR);
 }
 
+@Override
+protected void consumeLambdaExpression() {
+	super.consumeLambdaExpression();
+	this.patternLocator.match((LambdaExpression) this.expressionStack[this.expressionPtr], this.nodeSet);
+}
+
 protected void consumeLocalVariableDeclaration() {
 	super.consumeLocalVariableDeclaration();
 	this.patternLocator.match((LocalDeclaration) this.astStack[this.astPtr], this.nodeSet);
@@ -515,6 +519,26 @@
 	this.intPtr--;
 }
 
+@Override
+protected void consumeReferenceExpression(ReferenceExpression referenceExpression) {
+	super.consumeReferenceExpression(referenceExpression);
+	if (this.patternFineGrain == 0) {
+		this.patternLocator.match(referenceExpression, this.nodeSet);
+	} else if (referenceExpression.lhs.isThis()) {
+		if ((this.patternFineGrain & IJavaSearchConstants.THIS_REFERENCE) != 0) {
+			this.patternLocator.match(referenceExpression, this.nodeSet);
+		}
+	} else if (referenceExpression.lhs.isSuper()) {
+		if ((this.patternFineGrain & IJavaSearchConstants.SUPER_REFERENCE) != 0) {
+			this.patternLocator.match(referenceExpression, this.nodeSet);
+		}
+	} else if (referenceExpression.lhs instanceof QualifiedNameReference || referenceExpression.lhs instanceof QualifiedTypeReference) {
+		if ((this.patternFineGrain & IJavaSearchConstants.QUALIFIED_REFERENCE) != 0) {
+			this.patternLocator.match(referenceExpression, this.nodeSet);
+		} 
+	}
+}
+
 protected void consumeSingleMemberAnnotation(boolean isTypeAnnotation) {
 	super.consumeSingleMemberAnnotation(isTypeAnnotation);
 	if (this.patternFineGrain == 0 || (this.patternFineGrain & IJavaSearchConstants.ANNOTATION_TYPE_REFERENCE) != 0) {
@@ -637,6 +661,11 @@
 	}
 }
 
+protected void consumeTypeElidedLambdaParameter(boolean parenthesized) {
+	super.consumeTypeElidedLambdaParameter(parenthesized);
+	this.patternLocator.match((LocalDeclaration) this.astStack[this.astPtr], this.nodeSet);
+}
+
 protected void consumeTypeParameter1WithExtends() {
 	super.consumeTypeParameter1WithExtends();
 	if ((this.patternFineGrain & IJavaSearchConstants.TYPE_VARIABLE_BOUND_TYPE_REFERENCE) != 0) {
@@ -743,16 +772,8 @@
 	}
 }
 
-protected TypeReference copyDims(TypeReference typeRef, int dim) {
-	TypeReference result = super.copyDims(typeRef, dim);
-	 if (this.nodeSet.removePossibleMatch(typeRef) != null)
-		this.nodeSet.addPossibleMatch(result);
-	 else if (this.nodeSet.removeTrustedMatch(typeRef) != null)
-		this.nodeSet.addTrustedMatch(result, true);
-	return result;
-}
-protected TypeReference copyDims(TypeReference typeRef, int dim, Annotation [][] annotationsOnDimensions) {
-	TypeReference result = super.copyDims(typeRef, dim, annotationsOnDimensions);
+protected TypeReference augmentTypeWithAdditionalDimensions(TypeReference typeRef, int additionalDimensions, Annotation [][] additionalAnnotations, boolean isVarargs) {
+	TypeReference result = super.augmentTypeWithAdditionalDimensions(typeRef, additionalDimensions, additionalAnnotations, isVarargs);
 	 if (this.nodeSet.removePossibleMatch(typeRef) != null)
 		this.nodeSet.addPossibleMatch(result);
 	 else if (this.nodeSet.removeTrustedMatch(typeRef) != null)
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet.java
index 560ade4..7c96c69 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet.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
@@ -23,6 +23,7 @@
 /**
  * A set of matches and possible matches, which need to be resolved.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class MatchingNodeSet {
 
 /**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MemberDeclarationVisitor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MemberDeclarationVisitor.java
index 0ad6ba2..ee43cd8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MemberDeclarationVisitor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MemberDeclarationVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -48,9 +48,11 @@
 	IJavaElement[][] allOtherElements;
 	int ptr = -1;
 	int[] ptrs;
+	private boolean typeInHierarchy;
 
-public MemberDeclarationVisitor(IJavaElement element, ASTNode[] nodes, MatchingNodeSet set, MatchLocator locator) {
+public MemberDeclarationVisitor(IJavaElement element, ASTNode[] nodes, MatchingNodeSet set, MatchLocator locator, boolean typeInHierarchy) {
 	this.enclosingElement = element;
+	this.typeInHierarchy = typeInHierarchy;
 	this.nodeSet = set;
 	this.locator = locator;
 	if (nodes == null) {
@@ -203,6 +205,18 @@
     this.localDeclaration = argument;
     return true;
 }
+public boolean visit(LambdaExpression lambdaExpression, BlockScope scope) {
+	Integer level = (Integer) this.nodeSet.matchingNodes.removeKey(lambdaExpression);
+	try {
+		if (lambdaExpression.resolvedType != null && lambdaExpression.resolvedType.isValidBinding())
+			this.locator.reportMatching(lambdaExpression, this.enclosingElement, level != null ? level.intValue() : -1, this.nodeSet, this.typeInHierarchy);
+		else 
+			return true;
+	} catch (CoreException e) {
+		throw new WrappedCoreException(e);
+	}
+	return false; // Don't visit the children as they get traversed under control of reportMatching.
+}
 public boolean visit(LocalDeclaration declaration, BlockScope scope) {
     this.localDeclaration = declaration;
     return true;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java
index eee418f..7d0ea0c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleSet;
 import org.aspectj.org.eclipse.jdt.internal.core.search.BasicSearchEngine;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class MethodLocator extends PatternLocator {
 
 protected MethodPattern pattern;
@@ -92,7 +93,7 @@
 		TypeBinding[] parameters = method.parameters;
 		if (argumentTypes.length == parameters.length) {
 			for (int j=0,l=parameters.length; j<l; j++) {
-				if (parameters[j].erasure() != argumentTypes[j].erasure()) {
+				if (TypeBinding.notEquals(parameters[j].erasure(), argumentTypes[j].erasure())) {
 					continue methodsLoop;
 				}
 			}
@@ -167,6 +168,15 @@
 	}
 	return nodeSet.addMatch(node, declarationsLevel);
 }
+
+public int match(LambdaExpression node, MatchingNodeSet nodeSet) {
+	if (!this.pattern.findDeclarations) return IMPOSSIBLE_MATCH;
+	if (this.pattern.parameterSimpleNames != null && this.pattern.parameterSimpleNames.length != node.arguments().length) return IMPOSSIBLE_MATCH;
+
+	nodeSet.mustResolve = true;
+	return nodeSet.addMatch(node, POSSIBLE_MATCH);
+}
+
 //public int match(ConstructorDeclaration node, MatchingNodeSet nodeSet) - SKIP IT
 //public int match(Expression node, MatchingNodeSet nodeSet) - SKIP IT
 //public int match(FieldDeclaration node, MatchingNodeSet nodeSet) - SKIP IT
@@ -229,7 +239,14 @@
 
 	return nodeSet.addMatch(node, this.pattern.mustResolve ? POSSIBLE_MATCH : ACCURATE_MATCH);
 }
-//public int match(Reference node, MatchingNodeSet nodeSet) - SKIP IT
+
+public int match(ReferenceExpression node, MatchingNodeSet nodeSet) {
+	if (!this.pattern.findReferences) return IMPOSSIBLE_MATCH;
+	if (!matchesName(this.pattern.selector, node.selector)) return IMPOSSIBLE_MATCH;
+	nodeSet.mustResolve = true;
+	return nodeSet.addMatch(node, this.pattern.mustResolve ? POSSIBLE_MATCH : ACCURATE_MATCH);
+}
+
 public int match(Annotation node, MatchingNodeSet nodeSet) {
 	if (!this.pattern.findReferences) return IMPOSSIBLE_MATCH;
 	MemberValuePair[] pairs = node.memberValuePairs();
@@ -265,6 +282,7 @@
 		super.matchLevelAndReportImportRef(importRef, binding, locator);
 	}
 }
+
 protected int matchMethod(MethodBinding method, boolean skipImpossibleArg) {
 	if (!matchesName(this.pattern.selector, method.selector)) return IMPOSSIBLE_MATCH;
 
@@ -647,11 +665,17 @@
 			MemberValuePair memberValuePair = (MemberValuePair) possibleMatchingNode;
 			return resolveLevel(memberValuePair.binding);
 		}
+		if (possibleMatchingNode instanceof ReferenceExpression) {
+			return resolveLevel((ReferenceExpression)possibleMatchingNode);
+		}
 	}
 	if (this.pattern.findDeclarations) {
 		if (possibleMatchingNode instanceof MethodDeclaration) {
 			return resolveLevel(((MethodDeclaration) possibleMatchingNode).binding);
 		}
+		if (possibleMatchingNode instanceof LambdaExpression) {
+			return resolveLevel(((LambdaExpression) possibleMatchingNode).descriptor);
+		}
 	}
 	return IMPOSSIBLE_MATCH;
 }
@@ -734,6 +758,24 @@
 	return (methodLevel & MATCH_LEVEL_MASK) > (declaringLevel & MATCH_LEVEL_MASK) ? declaringLevel : methodLevel; // return the weaker match
 }
 
+protected int resolveLevel(ReferenceExpression referenceExpression) {
+	MethodBinding method = referenceExpression.getMethodBinding();
+	if (method == null || !method.isValidBinding())
+		return INACCURATE_MATCH;
+
+	int methodLevel = matchMethod(method, false);
+	if (methodLevel == IMPOSSIBLE_MATCH) {
+		if (method != method.original()) methodLevel = matchMethod(method.original(), false);
+		if (methodLevel == IMPOSSIBLE_MATCH) return IMPOSSIBLE_MATCH;
+		method = method.original();
+	}
+
+	// receiver type
+	if (this.pattern.declaringSimpleName == null && this.pattern.declaringQualification == null) return methodLevel; // since any declaring class will do
+	int declaringLevel = resolveLevelForType(this.pattern.declaringSimpleName, this.pattern.declaringQualification, method.declaringClass);
+	return (methodLevel & MATCH_LEVEL_MASK) > (declaringLevel & MATCH_LEVEL_MASK) ? declaringLevel : methodLevel; // return the weaker match
+}
+
 /**
  * Returns whether the given reference type binding matches or is a subtype of a type
  * that matches the given qualified pattern.
@@ -810,7 +852,7 @@
 				if (argumentTypes.length == parameters.length) {
 					boolean found = true;
 					for (int k=0,l=parameters.length; k<l; k++) {
-						if (parameters[k].erasure() != argumentTypes[k].erasure()) {
+						if (TypeBinding.notEquals(parameters[k].erasure(), argumentTypes[k].erasure())) {
 							found = false;
 							break;
 						}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrLocator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrLocator.java
index b15d221..f955176 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrLocator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/OrLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -20,12 +20,14 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ImportReference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MemberValuePair;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MessageSend;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Reference;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReferenceExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeParameter;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
@@ -107,6 +109,17 @@
 	}
 	return level;
 }
+public int match(LambdaExpression node, MatchingNodeSet nodeSet) {
+	int level = IMPOSSIBLE_MATCH;
+	for (int i = 0, length = this.patternLocators.length; i < length; i++) {
+		int newLevel = this.patternLocators[i].match(node, nodeSet);
+		if (newLevel > level) {
+			if (newLevel == ACCURATE_MATCH) return ACCURATE_MATCH;
+			level = newLevel;
+		}
+	}
+	return level;
+}
 public int match(LocalDeclaration node, MatchingNodeSet nodeSet) {
 	int level = IMPOSSIBLE_MATCH;
 	for (int i = 0, length = this.patternLocators.length; i < length; i++) {
@@ -162,6 +175,17 @@
 	}
 	return level;
 }
+public int match(ReferenceExpression node, MatchingNodeSet nodeSet) {
+	int level = IMPOSSIBLE_MATCH;
+	for (int i = 0, length = this.patternLocators.length; i < length; i++) {
+		int newLevel = this.patternLocators[i].match(node, nodeSet);
+		if (newLevel > level) {
+			if (newLevel == ACCURATE_MATCH) return ACCURATE_MATCH;
+			level = newLevel;
+		}
+	}
+	return level;
+}
 public int match(TypeDeclaration node, MatchingNodeSet nodeSet) {
 	int level = IMPOSSIBLE_MATCH;
 	for (int i = 0, length = this.patternLocators.length; i < length; i++) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java
index 9cb67e6..02995d4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -201,6 +201,10 @@
 	// each subtype should override if needed
 	return IMPOSSIBLE_MATCH;
 }
+public int match(LambdaExpression node, MatchingNodeSet nodeSet) {
+	// each subtype should override if needed
+	return IMPOSSIBLE_MATCH;
+}
 public int match(LocalDeclaration node, MatchingNodeSet nodeSet) {
 	// each subtype should override if needed
 	return IMPOSSIBLE_MATCH;
@@ -221,6 +225,10 @@
 	// each subtype should override if needed
 	return IMPOSSIBLE_MATCH;
 }
+public int match(ReferenceExpression node, MatchingNodeSet nodeSet) {
+	// each subtype should override if needed
+	return IMPOSSIBLE_MATCH;
+}
 public int match(TypeDeclaration node, MatchingNodeSet nodeSet) {
 	// each subtype should override if needed
 	return IMPOSSIBLE_MATCH;
@@ -481,7 +489,7 @@
 			int length = argumentsBindings.length;
 			if (length == typeVariables.length) {
 				for (int i=0; i<length; i++) {
-					if (argumentsBindings[i] != typeVariables[i]) {
+					if (TypeBinding.notEquals(argumentsBindings[i], typeVariables[i])) {
 						needUpdate = true;
 						break;
 					}
@@ -612,7 +620,7 @@
 					if (argumentBinding.isWildcard()) { // argument is a wildcard
 						WildcardBinding wildcardBinding = (WildcardBinding) argumentBinding;
 						// It's ok if wildcards are identical
-						if (wildcardBinding.boundKind == patternWildcardKind && wildcardBinding.bound == patternBinding) {
+						if (wildcardBinding.boundKind == patternWildcardKind && TypeBinding.equalsEquals(wildcardBinding.bound, patternBinding)) {
 							continue;
 						}
 						// Look for wildcard compatibility
@@ -640,7 +648,7 @@
 					if (argumentBinding.isWildcard()) { // argument is a wildcard
 						WildcardBinding wildcardBinding = (WildcardBinding) argumentBinding;
 						// It's ok if wildcards are identical
-						if (wildcardBinding.boundKind == patternWildcardKind && wildcardBinding.bound == patternBinding) {
+						if (wildcardBinding.boundKind == patternWildcardKind && TypeBinding.equalsEquals(wildcardBinding.bound, patternBinding)) {
 							continue;
 						}
 						// Look for wildcard compatibility
@@ -686,7 +694,7 @@
 								matchRule &= ~SearchPattern.R_FULL_MATCH;
 								continue;
 						}
-					} else if (argumentBinding == patternBinding)
+					} else if (TypeBinding.equalsEquals(argumentBinding, patternBinding))
 						// valid only when arg is equals to pattern
 						continue;
 					break;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.java
index f1c657a..d7c794e 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -29,6 +29,13 @@
 //public int match(ConstructorDeclaration node, MatchingNodeSet nodeSet) - SKIP IT
 //public int match(Expression node, MatchingNodeSet nodeSet) - SKIP IT
 //public int match(FieldDeclaration node, MatchingNodeSet nodeSet) - SKIP IT
+
+public int match(LambdaExpression node, MatchingNodeSet nodeSet) {
+	if (this.pattern.superRefKind != SuperTypeReferencePattern.ONLY_SUPER_INTERFACES)
+		return IMPOSSIBLE_MATCH;
+	nodeSet.mustResolve = true;
+	return nodeSet.addMatch(node, POSSIBLE_MATCH);
+}
 //public int match(MethodDeclaration node, MatchingNodeSet nodeSet) - SKIP IT
 //public int match(MessageSend node, MatchingNodeSet nodeSet) - SKIP IT
 //public int match(Reference node, MatchingNodeSet nodeSet) - SKIP IT
@@ -75,10 +82,16 @@
 	return IJavaElement.TYPE;
 }
 public int resolveLevel(ASTNode node) {
-	if (!(node instanceof TypeReference)) return IMPOSSIBLE_MATCH;
+	TypeBinding typeBinding = null;
+	if (node instanceof LambdaExpression) {
+		LambdaExpression lambda = (LambdaExpression) node;
+		typeBinding = lambda.resolvedType;
+	} else {
+		if (!(node instanceof TypeReference)) return IMPOSSIBLE_MATCH;
+		TypeReference typeRef = (TypeReference) node;
+		typeBinding = typeRef.resolvedType;
+	}
 
-	TypeReference typeRef = (TypeReference) node;
-	TypeBinding typeBinding = typeRef.resolvedType;
 	if (typeBinding instanceof ArrayBinding)
 		typeBinding = ((ArrayBinding) typeBinding).leafComponentType;
 	if (typeBinding instanceof ProblemReferenceBinding)
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferenceLocator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferenceLocator.java
index 61fd152..94ff57c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferenceLocator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/search/matching/TypeReferenceLocator.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
@@ -27,6 +27,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SimpleSet;
 import org.aspectj.org.eclipse.jdt.internal.core.JavaElement;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class TypeReferenceLocator extends PatternLocator {
 
 protected TypeReferencePattern pattern;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser.java
index 0c042d7..622cc1f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2013 IBM Corporation and others.
+ * Copyright (c) 2005, 2014 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 425183 - [1.8][inference] make CaptureBinding18 safe
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core.util;
 
@@ -29,8 +31,9 @@
 		static final int FLAGS = 6;
 		static final int WILDCARD = 7;
 		static final int CAPTURE = 8;
-		static final int BASE_TYPE = 9;
-		static final int END = 10;
+		static final int CAPTURE18 = 9;
+		static final int BASE_TYPE = 10;
+		static final int END = 11;
 
 		static final int START = -1;
 
@@ -61,6 +64,12 @@
 				&& this.source[this.index] == '!';
 		}
 
+		boolean isAtCapture18Start() {
+			return
+				this.index < this.source.length
+				&& this.source[this.index] == '^';
+		}
+
 		boolean isAtFieldOrMethodStart() {
 			return
 				this.index < this.source.length
@@ -305,6 +314,10 @@
 						this.index++;
 						this.token = CAPTURE;
 						return this.token;
+					case '^':
+						this.index++;
+						this.token = CAPTURE18;
+						return this.token;
 				}
 				this.index++;
 			}
@@ -377,6 +390,12 @@
 			this.start = this.index;
 		}
 
+		void skipCapture18Delim() {
+			if (this.index < this.source.length && this.source[this.index] == '#')
+				this.index++;
+			this.start = this.index;
+		}
+
 		public String toString() {
 			StringBuffer buffer = new StringBuffer();
 			switch (this.token) {
@@ -410,6 +429,9 @@
 				case CAPTURE:
 					buffer.append("CAPTURE: "); //$NON-NLS-1$
 					break;
+				case CAPTURE18:
+					buffer.append("CAPTURE18: "); //$NON-NLS-1$
+					break;
 				case BASE_TYPE:
 					buffer.append("BASE TYPE: "); //$NON-NLS-1$
 					break;
@@ -473,6 +495,10 @@
 		// default is to do nothing
 	}
 
+	public void consumeCapture18ID(int id, int position) {
+		// default is to do nothing		
+	}
+
 	public void consumeException() {
 		// default is to do nothing
 	}
@@ -673,6 +699,11 @@
 			this.hasTypeName = false;
 			return;
 		}
+		if (this.scanner.isAtCapture18Start()) {
+			parseCapture18();
+			this.hasTypeName = false;
+			return;
+		}
 		switch(this.scanner.nextToken()) {
 			case Scanner.PACKAGE:
 				this.keyStart = 0;
@@ -835,6 +866,26 @@
 		this.scanner.skipTypeEnd();
 	}
 
+	private void parseCapture18() {
+		// syntax: ^{int#int}
+		if (this.scanner.nextToken() != Scanner.CAPTURE18) return;
+
+		this.scanner.skipRankStart(); // {
+		this.scanner.skipRank();
+		char[] source = this.scanner.getTokenSource();
+		int position = Integer.parseInt(new String(source));
+
+		this.scanner.skipCapture18Delim(); // #
+		this.scanner.skipRank();
+		source = this.scanner.getTokenSource();
+		int id = Integer.parseInt(new String(source));
+		this.scanner.skipRankEnd(); // }
+		
+		consumeCapture18ID(id, position);
+		
+		this.scanner.skipTypeEnd();
+	}
+
 	private void parseCaptureWildcard() {
 		/*
 		 * The call parser.parse() might have a side-effect on the current token type
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver.java
index 687677e..c29afaa 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/BindingKeyResolver.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2011 IBM Corporation and others.
+ * Copyright (c) 2005, 2014 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 425183 - [1.8][inference] make CaptureBinding18 safe
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core.util;
 
@@ -32,6 +34,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.CaptureBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.CaptureBinding18;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
@@ -50,6 +53,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.WildcardBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.HashtableOfObject;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class BindingKeyResolver extends BindingKeyParser {
 	Compiler compiler;
 	Binding compilerBinding;
@@ -137,10 +141,18 @@
 		}
 	}
 
+	public void consumeCapture18ID(int id, int position) {
+		consumeAnyCapture(id, position);
+	}
+
 	public void consumeCapture(final int position) {
+		consumeAnyCapture(-1, position);
+	}
+	public void consumeAnyCapture(final int capture18id, final int position) {
 		CompilationUnitDeclaration outerParsedUnit = this.outerMostParsedUnit == null ? this.parsedUnit : this.outerMostParsedUnit;
 		if (outerParsedUnit == null) return;
-		final Binding wildcardBinding = ((BindingKeyResolver) this.types.get(0)).compilerBinding;
+		final Binding wildcardBinding = this.types.size() > 0  // 0 may happen for CaptureBinding18
+				? ((BindingKeyResolver) this.types.get(0)).compilerBinding : null;
 		class CaptureFinder extends ASTVisitor {
 			CaptureBinding capture;
 			boolean checkType(TypeBinding binding) {
@@ -173,6 +185,10 @@
 						if (binding.isCapture()) {
 							CaptureBinding captureBinding = (CaptureBinding) binding;
 							if (captureBinding.position == position && captureBinding.wildcard == wildcardBinding) {
+								if (captureBinding instanceof CaptureBinding18) {
+									if (((CaptureBinding18)captureBinding).captureID != capture18id)
+										return false;
+								}
 								this.capture = captureBinding;
 								return true;
 							}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileReader.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileReader.java
index 4f88fca..9adca3c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileReader.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ClassFileReader.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CodeAttribute.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CodeAttribute.java
index 477d1bd..405184d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CodeAttribute.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CodeAttribute.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CodeSnippetParsingUtil.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CodeSnippetParsingUtil.java
index dc2ba5a..0c051b0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CodeSnippetParsingUtil.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CodeSnippetParsingUtil.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -33,6 +29,7 @@
 /**
  * Utility class to parse different code snippets
  */
+@SuppressWarnings("rawtypes")
 public class CodeSnippetParsingUtil {
 
 	public RecordedParsingInformation recordedParsingInformation;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java
index cd2f4a3..c0bc2a8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java
@@ -203,8 +203,8 @@
 	/* (non-Javadoc)
 	 * @see org.aspectj.org.eclipse.jdt.internal.compiler.parser.Parser#initialize()
 	 */
-	public void initialize(boolean initializeNLS) {
-		super.initialize(initializeNLS);
+	public void initialize(boolean parsingCompilationUnit) {
+		super.initialize(parsingCompilationUnit);
 		this.commentPtr = -1;
 	}
 	/* (non-Javadoc)
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Disassembler.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Disassembler.java
index ebae9d5..3a52b22 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Disassembler.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Disassembler.java
@@ -5,14 +5,12 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *       Jesper Steen Moeller - Contributions for:
+ *                          Bug 406973 - [compiler] Parse MethodParameters attribute
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core.util;
 
@@ -95,6 +93,12 @@
 				case IModifierConstants.ACC_ENUM :
 					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_ENUM, "enum", firstModifier); //$NON-NLS-1$
 					break;
+				case IModifierConstants.ACC_SYNTHETIC :
+					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_SYNTHETIC, "synthetic", firstModifier); //$NON-NLS-1$
+					break;
+				case IModifierConstants.ACC_MANDATED :
+					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_MANDATED, "mandated", firstModifier); //$NON-NLS-1$
+					break;
 			}
 		}
 		if (!firstModifier) {
@@ -156,6 +160,14 @@
 		});
 	}
 
+	private final void decodeModifiersForMethodParameters(StringBuffer buffer, int accessFlags) {
+		decodeModifiers(buffer, accessFlags, false, true, new int[] {
+				IModifierConstants.ACC_FINAL,
+				IModifierConstants.ACC_MANDATED,
+				IModifierConstants.ACC_SYNTHETIC,
+		});
+	}
+
 	private final void decodeModifiersForType(StringBuffer buffer, int accessFlags) {
 		decodeModifiers(buffer, accessFlags, new int[] {
 				IModifierConstants.ACC_PUBLIC,
@@ -577,9 +589,25 @@
 			}));
 	}
 
+	private void disassemble(IMethodParametersAttribute methodParametersAttribute, StringBuffer buffer, String lineSeparator, int tabNumber, int mode) {
+		tabNumber += 2;
+		writeNewLine(buffer, lineSeparator, tabNumber);
+		buffer.append(Messages.disassembler_methodparametersheader);
+		for (int i = 0, length = methodParametersAttribute.getMethodParameterLength(); i < length; ++i) {
+			writeNewLine(buffer, lineSeparator, tabNumber + 1);
+			short accessFlags = methodParametersAttribute.getAccessFlags(i);
+			decodeModifiersForMethodParameters(buffer, accessFlags);
+			char [] parameterName = methodParametersAttribute.getParameterName(i);
+			if (parameterName == null)
+				parameterName = Messages.disassembler_anonymousparametername.toCharArray();
+			buffer.append(parameterName);
+		}
+	}
+
 	private void disassembleEnumConstructor(IClassFileReader classFileReader, char[] className, IMethodInfo methodInfo, StringBuffer buffer, String lineSeparator, int tabNumber, int mode) {
 		writeNewLine(buffer, lineSeparator, tabNumber);
 		final ICodeAttribute codeAttribute = methodInfo.getCodeAttribute();
+		IMethodParametersAttribute methodParametersAttribute = (IMethodParametersAttribute) Util.getAttribute(methodInfo, IAttributeNamesConstants.METHOD_PARAMETERS);
 		char[] methodDescriptor = methodInfo.getDescriptor();
 		final IClassFileAttribute runtimeVisibleAnnotationsAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.RUNTIME_VISIBLE_ANNOTATIONS);
 		final IClassFileAttribute runtimeInvisibleAnnotationsAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.RUNTIME_INVISIBLE_ANNOTATIONS);
@@ -596,7 +624,7 @@
 		decodeModifiersForMethod(buffer, accessFlags & IModifierConstants.ACC_PRIVATE);
 		CharOperation.replace(methodDescriptor, '/', '.');
 		final boolean isVarArgs = (accessFlags & IModifierConstants.ACC_VARARGS) != 0;
-		final char[] signature = Signature.toCharArray(methodDescriptor, returnClassName(className, '.', COMPACT), getParameterNames(methodDescriptor, codeAttribute, accessFlags) , !checkMode(mode, COMPACT), false, isVarArgs);
+		final char[] signature = Signature.toCharArray(methodDescriptor, returnClassName(className, '.', COMPACT), getParameterNames(methodDescriptor, codeAttribute, methodParametersAttribute, accessFlags) , !checkMode(mode, COMPACT), false, isVarArgs);
 		int index = CharOperation.indexOf(',', signature);
 		index = CharOperation.indexOf(',', signature, index + 1);
 		buffer.append(signature, 0, CharOperation.indexOf('(', signature) + 1);
@@ -669,6 +697,7 @@
 		final IClassFileAttribute runtimeInvisibleTypeAnnotationsAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS);
 		final IClassFileAttribute runtimeVisibleParameterAnnotationsAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS);
 		final IClassFileAttribute runtimeInvisibleParameterAnnotationsAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS);
+		final IClassFileAttribute methodParametersAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.METHOD_PARAMETERS);
 		final IClassFileAttribute annotationDefaultAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.ANNOTATION_DEFAULT);
 		if (checkMode(mode, SYSTEM | DETAILED)) {
 			buffer.append(Messages.bind(Messages.classfileformat_methoddescriptor,
@@ -715,7 +744,7 @@
 		char[] methodHeader = null;
 		char[][] parameterNames = null;
 		if (!methodInfo.isClinit()) {
-			parameterNames = getParameterNames(methodDescriptor, codeAttribute, accessFlags);
+			parameterNames = getParameterNames(methodDescriptor, codeAttribute, (IMethodParametersAttribute)methodParametersAttribute, accessFlags);
 		}
 		if (methodInfo.isConstructor()) {
 			if (checkMode(mode, WORKING_COPY) && signatureAttribute != null) {
@@ -875,6 +904,11 @@
 				disassemble(codeAttribute, parameterNames, methodDescriptor, (accessFlags & IModifierConstants.ACC_STATIC) != 0, buffer, lineSeparator, tabNumber, mode);
 			}
 		}
+		if (checkMode(mode, SYSTEM | DETAILED)) {
+			if (methodParametersAttribute != null) {
+				disassemble((IMethodParametersAttribute)methodParametersAttribute, buffer, lineSeparator, tabNumber, mode);
+			}
+		}
 		if (checkMode(mode, SYSTEM)) {
 			IClassFileAttribute[] attributes = methodInfo.getAttributes();
 			int length = attributes.length;
@@ -891,6 +925,7 @@
 							&& attribute != runtimeVisibleTypeAnnotationsAttribute
 							&& attribute != runtimeInvisibleParameterAnnotationsAttribute
 							&& attribute != runtimeVisibleParameterAnnotationsAttribute
+							&& attribute != methodParametersAttribute
 							&& !CharOperation.equals(attribute.getAttributeName(), IAttributeNamesConstants.DEPRECATED)
 							&& !CharOperation.equals(attribute.getAttributeName(), IAttributeNamesConstants.SYNTHETIC)) {
 						disassemble(attribute, buffer, lineSeparator, tabNumber, mode);
@@ -2402,28 +2437,37 @@
 		return null;
 	}
 
-	private char[][] getParameterNames(char[] methodDescriptor, ICodeAttribute codeAttribute, int accessFlags) {
+	private char[][] getParameterNames(char[] methodDescriptor, ICodeAttribute codeAttribute, IMethodParametersAttribute parametersAttribute, int accessFlags) {
 		int paramCount = Signature.getParameterCount(methodDescriptor);
 		char[][] parameterNames = new char[paramCount][];
 		// check if the code attribute has debug info for this method
-		if (codeAttribute != null) {
-			ILocalVariableAttribute localVariableAttribute = codeAttribute.getLocalVariableAttribute();
-			if (localVariableAttribute != null) {
-				ILocalVariableTableEntry[] entries = localVariableAttribute.getLocalVariableTable();
-				final int startingIndex = (accessFlags & IModifierConstants.ACC_STATIC) != 0 ? 0 : 1;
-				for (int i = 0; i < paramCount; i++) {
-					ILocalVariableTableEntry searchedEntry = getEntryFor(getLocalIndex(startingIndex, i, methodDescriptor), entries);
-					if (searchedEntry != null) {
-						parameterNames[i] = searchedEntry.getName();
-					} else {
+		if (parametersAttribute != null) {
+			int parameterCount = parametersAttribute.getMethodParameterLength();
+			for (int i = 0; i < paramCount; i++) {
+				if (i < parameterCount && parametersAttribute.getParameterName(i) != null) {
+					parameterNames[i] = parametersAttribute.getParameterName(i);
+				} else {
+					parameterNames[i] = Messages.disassembler_anonymousparametername.toCharArray();
+				}
+			}
+		} else if (codeAttribute != null) {
+				ILocalVariableAttribute localVariableAttribute = codeAttribute.getLocalVariableAttribute();
+				if (localVariableAttribute != null) {
+					ILocalVariableTableEntry[] entries = localVariableAttribute.getLocalVariableTable();
+					final int startingIndex = (accessFlags & IModifierConstants.ACC_STATIC) != 0 ? 0 : 1;
+					for (int i = 0; i < paramCount; i++) {
+						ILocalVariableTableEntry searchedEntry = getEntryFor(getLocalIndex(startingIndex, i, methodDescriptor), entries);
+						if (searchedEntry != null) {
+							parameterNames[i] = searchedEntry.getName();
+						} else {
+							parameterNames[i] = CharOperation.concat(Messages.disassembler_parametername.toCharArray(), Integer.toString(i).toCharArray());
+						}
+					}
+				} else {
+					for (int i = 0; i < paramCount; i++) {
 						parameterNames[i] = CharOperation.concat(Messages.disassembler_parametername.toCharArray(), Integer.toString(i).toCharArray());
 					}
 				}
-			} else {
-				for (int i = 0; i < paramCount; i++) {
-					parameterNames[i] = CharOperation.concat(Messages.disassembler_parametername.toCharArray(), Integer.toString(i).toCharArray());
-				}
-			}
 		} else {
 			for (int i = 0; i < paramCount; i++) {
 				parameterNames[i] = CharOperation.concat(Messages.disassembler_parametername.toCharArray(), Integer.toString(i).toCharArray());
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ExtendedAnnotation.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ExtendedAnnotation.java
index e60b192..3f3d99c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ExtendedAnnotation.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ExtendedAnnotation.java
@@ -5,14 +5,12 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409236 - [1.8][compiler] Type annotations on intersection cast types dropped by code generator
+ *                          Bug 409250 - [1.8][compiler] Various loose ends in 308 code generation
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core.util;
 
@@ -52,12 +50,13 @@
    } element_value_pairs[num_element_value_pairs];
 */
 /**
- * @since 3.9 BETA_JAVA8
+ * @since 3.10
  */
 public class ExtendedAnnotation extends ClassFileStruct implements IExtendedAnnotation {
 
 	private static final IAnnotationComponent[] NO_ENTRIES = new IAnnotationComponent[0];
 	private final static int[][] NO_TYPEPATH = new int[0][0];
+	private final static ILocalVariableReferenceInfo[] NO_LOCAL_VARIABLE_TABLE_ENTRIES = new ILocalVariableReferenceInfo[0];
 
 	private int targetType;
 	private int annotationTypeIndex;
@@ -73,7 +72,7 @@
 	private int typeParameterBoundIndex;
 	private int parameterIndex;
 	private int exceptionTableIndex;
-	private ILocalVariableReferenceInfo[] localVariableTable;
+	private ILocalVariableReferenceInfo[] localVariableTable = NO_LOCAL_VARIABLE_TABLE_ENTRIES;
 	
 	/**
 	 * Constructor for ExtendedAnnotation, builds an annotation from the supplied bytestream.
@@ -209,7 +208,10 @@
 
 			case IExtendedAnnotationConstants.CAST :
 				this.offset = u2At(classFileBytes, this.readOffset, localOffset);
-				this.readOffset += 3; // skipping the 3rd byte which will be 0 for CAST
+				this.readOffset += 2; 
+				// read type_argument_index
+				this.annotationTypeIndex = u1At(classFileBytes, this.readOffset, localOffset);
+				this.readOffset++;
 				break;
 
 			case IExtendedAnnotationConstants.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT :
@@ -267,7 +269,7 @@
 	}
 
 	public int getLocalVariableRefenceInfoLength() {
-		return this.localVariableTable != null ? this.localVariableTable.length : 0;
+		return this.localVariableTable.length;
 	}
 
 	public ILocalVariableReferenceInfo[] getLocalVariableTable() {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/FieldInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/FieldInfo.java
index cd35b44..ea27db9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/FieldInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/FieldInfo.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/HandleFactory.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/HandleFactory.java
index 163c3dc..fd06503 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/HandleFactory.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/HandleFactory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -33,6 +33,7 @@
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.core.search.IJavaSearchScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.*;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ClassScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
@@ -43,6 +44,7 @@
 /**
  * Creates java element handles.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class HandleFactory {
 
 	/**
@@ -159,9 +161,15 @@
 		return createElement(scope, scope.referenceContext.sourceStart, unit, existingElements, knownScopes);
 	}
 	/**
+	 * Returns a handle denoting the lambda type identified by its scope.
+	 */
+	public IJavaElement createLambdaTypeElement(LambdaExpression expression, ICompilationUnit unit, HashSet existingElements, HashMap knownScopes) {
+		return createElement(expression.scope, expression.sourceStart(), unit, existingElements, knownScopes).getParent();
+	}
+	/**
 	 * Create handle by adding child to parent obtained by recursing into parent scopes.
 	 */
-	private IJavaElement createElement(Scope scope, int elementPosition, ICompilationUnit unit, HashSet existingElements, HashMap knownScopes) {
+	public IJavaElement createElement(Scope scope, int elementPosition, ICompilationUnit unit, HashSet existingElements, HashMap knownScopes) {
 		IJavaElement newElement = (IJavaElement)knownScopes.get(scope);
 		if (newElement != null) return newElement;
 
@@ -198,6 +206,16 @@
 				}
 				break;
 			case Scope.METHOD_SCOPE :
+				if (scope.isLambdaScope()) {
+					parentElement = createElement(scope.parent, elementPosition, unit, existingElements, knownScopes);
+					LambdaExpression expression = (LambdaExpression) scope.originalReferenceContext();
+					if (expression.resolvedType != null && expression.resolvedType.isValidBinding()) { // chain in lambda element only if resolved properly.
+						newElement = new org.aspectj.org.eclipse.jdt.internal.core.LambdaExpression((JavaElement) parentElement, expression).getMethod();
+						knownScopes.put(scope, newElement);
+						return newElement;
+					}
+					return parentElement;
+				}
 				IType parentType = (IType) createElement(scope.parent, elementPosition, unit, existingElements, knownScopes);
 				MethodScope methodScope = (MethodScope) scope;
 				if (methodScope.isInsideInitializer()) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ICacheEnumeration.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ICacheEnumeration.java
index 5ceb60c..7514552 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ICacheEnumeration.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/ICacheEnumeration.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
@@ -28,6 +28,7 @@
  *
  * @see LRUCache
  */
+@SuppressWarnings("rawtypes")
 public interface ICacheEnumeration extends Enumeration {
 	/**
 	 * Returns the value of the previously accessed key in the enumeration.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/JavaElementFinder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/JavaElementFinder.java
index 1ca15dd..f6883e2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/JavaElementFinder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/JavaElementFinder.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
@@ -27,6 +27,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.util.SuffixConstants;
 import org.aspectj.org.eclipse.jdt.internal.core.*;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class JavaElementFinder extends BindingKeyParser {
 
 	private JavaProject project;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/KeyToSignature.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/KeyToSignature.java
index fb354dc..307ae17 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/KeyToSignature.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/KeyToSignature.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2011 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
+ *	   Stephan Herrmann - Contribution for
+ *								Bug 425183 - [1.8][inference] make CaptureBinding18 safe
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core.util;
 
@@ -20,6 +22,7 @@
 /*
  * Converts a binding key into a signature
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class KeyToSignature extends BindingKeyParser {
 
 	public static final int SIGNATURE = 0;
@@ -61,6 +64,12 @@
 		this.signature.append(((KeyToSignature) this.arguments.get(0)).signature);
 	}
 
+	@Override
+	public void consumeCapture18ID(int id, int position) {
+		// see https://bugs.eclipse.org/429264
+		this.signature.append("!*"); // pretend a 'capture-of ?' //$NON-NLS-1$
+	}
+
 	public void consumeLocalType(char[] uniqueKey) {
 		this.signature = new StringBuffer();
 		// remove trailing semi-colon as it is added later in comsumeType()
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache.java
index eb825f0..0f6e13c 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/LRUCache.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
@@ -29,6 +29,7 @@
  *
  * @see org.aspectj.org.eclipse.jdt.internal.core.util.ILRUCacheable
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class LRUCache implements Cloneable {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableReferenceInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableReferenceInfo.java
index b55c396..b7af138 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableReferenceInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/LocalVariableReferenceInfo.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MementoTokenizer.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MementoTokenizer.java
index 6a7cca9..e9d16a4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MementoTokenizer.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MementoTokenizer.java
@@ -28,6 +28,9 @@
 	public static final String LOCALVARIABLE = Character.toString(JavaElement.JEM_LOCALVARIABLE);
 	public static final String TYPE_PARAMETER = Character.toString(JavaElement.JEM_TYPE_PARAMETER);
 	public static final String ANNOTATION = Character.toString(JavaElement.JEM_ANNOTATION);
+	public static final String LAMBDA_EXPRESSION = Character.toString(JavaElement.JEM_LAMBDA_EXPRESSION);
+	public static final String LAMBDA_METHOD = Character.toString(JavaElement.JEM_LAMBDA_METHOD);
+	public static final String STRING = Character.toString(JavaElement.JEM_STRING);
 
 	private final char[] memento;
 	private final int length;
@@ -75,6 +78,12 @@
 				return PACKAGEDECLARATION;
 			case JavaElement.JEM_IMPORTDECLARATION:
 				return IMPORTDECLARATION;
+			case JavaElement.JEM_LAMBDA_EXPRESSION:
+				return LAMBDA_EXPRESSION;
+			case JavaElement.JEM_LAMBDA_METHOD:
+				return LAMBDA_METHOD;
+			case JavaElement.JEM_STRING:
+				return STRING;
 			case JavaElement.JEM_LOCALVARIABLE:
 				return LOCALVARIABLE;
 			case JavaElement.JEM_TYPE_PARAMETER:
@@ -102,6 +111,9 @@
 				case JavaElement.JEM_PACKAGEDECLARATION:
 				case JavaElement.JEM_IMPORTDECLARATION:
 				case JavaElement.JEM_LOCALVARIABLE:
+				case JavaElement.JEM_LAMBDA_EXPRESSION:
+				case JavaElement.JEM_LAMBDA_METHOD:	
+				case JavaElement.JEM_STRING:
 				case JavaElement.JEM_TYPE_PARAMETER:
 				case JavaElement.JEM_ANNOTATION:
 					break loop;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Messages.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Messages.java
index a101613..8d61b77 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Messages.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Messages.java
@@ -5,14 +5,12 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *     Jesper Steen Moeller - Contribution for
+ *                          Bug 406973 - [compiler] Parse MethodParameters attribute
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core.util;
 
@@ -246,6 +244,7 @@
 	public static String disassembler_opentypedeclaration;
 	public static String disassembler_closetypedeclaration;
 	public static String disassembler_parametername;
+	public static String disassembler_anonymousparametername;
 	public static String disassembler_localvariablename;
 	public static String disassembler_endofmethodheader;
 	public static String disassembler_begincommentline;
@@ -255,6 +254,7 @@
 	public static String disassembler_enclosingmethodheader;
 	public static String disassembler_exceptiontableheader;
 	public static String disassembler_linenumberattributeheader;
+	public static String disassembler_methodparametersheader;
 	public static String disassembler_localvariabletableattributeheader;
 	public static String disassembler_localvariabletypetableattributeheader;
 	public static String disassembler_arraydimensions;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MethodInfo.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MethodInfo.java
index dd8e897..ccff4fd 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MethodInfo.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MethodInfo.java
@@ -5,14 +5,12 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *        Jesper Steen Moeller - Contribution for
+ *                          Bug 406973 - [compiler] Parse MethodParameters attribute
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.core.util;
 
@@ -124,6 +122,8 @@
 				this.attributes[attributesIndex++] = new RuntimeVisibleTypeAnnotationsAttribute(classFileBytes, constantPool, offset + readOffset);
 			} else if (equals(attributeName, IAttributeNamesConstants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS)) {
 				this.attributes[attributesIndex++] = new RuntimeInvisibleTypeAnnotationsAttribute(classFileBytes, constantPool, offset + readOffset);
+			} else if (equals(attributeName, IAttributeNamesConstants.METHOD_PARAMETERS)) {
+				this.attributes[attributesIndex++] = new MethodParametersAttribute(classFileBytes, constantPool, offset + readOffset);
 			} else {
 				this.attributes[attributesIndex++] = new ClassFileAttribute(classFileBytes, constantPool, offset + readOffset);
 			}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MethodParametersAttribute.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MethodParametersAttribute.java
new file mode 100644
index 0000000..7ed1c94
--- /dev/null
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/MethodParametersAttribute.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Jesper Steen Moeller and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Jesper Steen Moeller - initial API and implementation
+ *******************************************************************************/
+
+package org.aspectj.org.eclipse.jdt.internal.core.util;
+
+import org.aspectj.org.eclipse.jdt.core.util.ClassFormatException;
+import org.aspectj.org.eclipse.jdt.core.util.IConstantPool;
+import org.aspectj.org.eclipse.jdt.core.util.IConstantPoolConstant;
+import org.aspectj.org.eclipse.jdt.core.util.IConstantPoolEntry;
+import org.aspectj.org.eclipse.jdt.core.util.IMethodParametersAttribute;
+
+/**
+ * @since 3.10
+ */
+public class MethodParametersAttribute extends ClassFileAttribute implements IMethodParametersAttribute {
+
+	private static final char[][] NO_NAMES = new char[0][];
+	private static final short[] NO_ACCES_FLAGS = new short[0];
+	
+	private final int numberOfEntries;
+	private final char[][] names;
+	private final short[] accessFlags;
+	
+
+	MethodParametersAttribute(byte[] classFileBytes, IConstantPool constantPool, int offset) throws ClassFormatException {
+		super(classFileBytes, constantPool, offset);
+		
+		final int length = u1At(classFileBytes, 6, offset);
+		this.numberOfEntries = length;
+		if (length != 0) {
+			int readOffset = offset + 7;
+			this.names = new char[length][];
+			this.accessFlags = new short[length];
+			for (int i = 0; i < length; i++) {
+				int nameIndex = u2At(classFileBytes, 0, readOffset);
+				int mask = u2At(classFileBytes, 2, readOffset);
+				readOffset += 4;
+				if (nameIndex != 0) {
+					IConstantPoolEntry constantPoolEntry = constantPool.decodeEntry(nameIndex);
+					if (constantPoolEntry.getKind() != IConstantPoolConstant.CONSTANT_Utf8) {
+						throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY);
+					}
+					this.names[i] = constantPoolEntry.getUtf8Value();
+				} else {
+					this.names[i] = null;
+				}
+				this.accessFlags[i] = (short) (mask & 0xFFFF);
+			}
+		} else {
+			this.names = NO_NAMES;
+			this.accessFlags = NO_ACCES_FLAGS;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.aspectj.org.eclipse.jdt.core.util.IMethodParametersAttribute#getMethodParameterLength()
+	 */
+	public int getMethodParameterLength() {
+		return this.numberOfEntries;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.aspectj.org.eclipse.jdt.core.util.IMethodParametersAttribute#getParameterName(int)
+	 */
+	public char[] getParameterName(int i) {
+		return this.names[i];
+	}
+
+	/* (non-Javadoc)
+	 * @see org.aspectj.org.eclipse.jdt.core.util.IMethodParametersAttribute#getAccessFlags(int)
+	 */
+	public short getAccessFlags(int i) {
+		return this.accessFlags[i];
+	}
+}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/PublicScanner.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/PublicScanner.java
index 49d8f4e..5195bdc 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/PublicScanner.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/PublicScanner.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleTypeAnnotationsAttribute.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleTypeAnnotationsAttribute.java
index 9791a84..869c6b0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleTypeAnnotationsAttribute.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeInvisibleTypeAnnotationsAttribute.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleTypeAnnotationsAttribute.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleTypeAnnotationsAttribute.java
index 6fcab3e..31b78d8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleTypeAnnotationsAttribute.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/RuntimeVisibleTypeAnnotationsAttribute.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Util.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Util.java
index 5dbae2e..4a78602 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Util.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/Util.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
@@ -74,6 +74,7 @@
 /**
  * Provides convenient utility methods to other types in this package.
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class Util {
 
 	public interface Comparable {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet.java
index 05ac044..66cbfb0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSet.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2009 IBM Corporation and others.
+ * Copyright (c) 2004, 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 @@
 /**
  * A hashset whose values can be garbage collected.
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public class WeakHashSet {
 
 	public static class HashableWeakReference extends WeakReference {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray.java
index 898a761..511b3e4 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/WeakHashSetOfCharArray.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2009 IBM Corporation and others.
+ * Copyright (c) 2004, 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,6 +17,7 @@
 /**
  * A hashset of char[] whose values can be garbage collected.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class WeakHashSetOfCharArray {
 
 	public static class HashableWeakReference extends WeakReference {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/messages.properties b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/messages.properties
index 30fad38..383ff0f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/messages.properties
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/core/util/messages.properties
@@ -5,14 +5,12 @@
 # which accompanies this distribution, and is available at
 # http://www.eclipse.org/legal/epl-v10.html
 #
-# This is an implementation of an early-draft specification developed under the Java
-# Community Process (JCP) and is made available for testing and evaluation purposes
-# only. The code is not compatible with any specification of the JCP.
-#
 # Contributors:
 #     IBM Corporation - initial API and implementation
 #        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
 #                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+#        Jesper Steen Moeller - Contribution for
+#                          Bug 406973 - [compiler] Parse MethodParameters attribute
 ###############################################################################
 
 ### JavaModel messages.
@@ -270,6 +268,7 @@
 disassembler_opentypedeclaration =\ '{'
 disassembler_closetypedeclaration = }
 disassembler_parametername = arg
+disassembler_anonymousparametername = <anonymous>
 disassembler_localvariablename = local_{0}
 disassembler_endofmethodheader = ;
 disassembler_begincommentline = //\ 
@@ -279,6 +278,7 @@
 disassembler_enclosingmethodheader = Enclosing Method:
 disassembler_exceptiontableheader = Exception Table:
 disassembler_linenumberattributeheader = Line numbers:
+disassembler_methodparametersheader = Method Parameters:
 disassembler_localvariabletableattributeheader = Local variable table:
 disassembler_localvariabletypetableattributeheader = Local variable type table:
 disassembler_arraydimensions = []
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetAllocationExpression.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetAllocationExpression.java
index 2c843ee..1892bd1 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetAllocationExpression.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetAllocationExpression.java
@@ -1,25 +1,30 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *        Andy Clement - Contributions for
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
  *                          Bug 383624 - [1.8][compiler] Revive code generation support for type annotations (from Olivier's work)
+ *                          Bug 409245 - [1.8][compiler] Type annotations dropped when call is routed through a synthetic bridge method
+ *                          Bug 409250 - [1.8][compiler] Various loose ends in 308 code generation
+ *        Stephan Herrmann - Contribution for
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec) 
+ *							Bug 424415 - [1.8][compiler] Eventual resolution of ReferenceExpression is not seen to be happening.
+ *							Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.eval;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.INVOCATION_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AllocationExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CastExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.InnerInferenceHelper;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
@@ -83,7 +88,7 @@
 				this);
 		}
 		// invoke constructor
-		codeStream.invoke(Opcodes.OPC_invokespecial, codegenBinding, null /* default declaringClass */);
+		codeStream.invoke(Opcodes.OPC_invokespecial, codegenBinding, null /* default declaringClass */, this.typeArguments);
 	} else {
 		// private emulation using reflect
 		codeStream.generateEmulationForConstructor(currentScope, codegenBinding);
@@ -91,7 +96,7 @@
 		if (this.arguments != null) {
 			int argsLength = this.arguments.length;
 			codeStream.generateInlinedValue(argsLength);
-			codeStream.newArray(null, currentScope.createArrayType(currentScope.getType(TypeConstants.JAVA_LANG_OBJECT, 3), 1));
+			codeStream.newArray(currentScope.createArrayType(currentScope.getType(TypeConstants.JAVA_LANG_OBJECT, 3), 1));
 			codeStream.dup();
 			for (int i = 0; i < argsLength; i++) {
 				codeStream.generateInlinedValue(i);
@@ -107,7 +112,7 @@
 			}
 		} else {
 			codeStream.generateInlinedValue(0);
-			codeStream.newArray(null, currentScope.createArrayType(currentScope.getType(TypeConstants.JAVA_LANG_OBJECT, 3), 1));
+			codeStream.newArray(currentScope.createArrayType(currentScope.getType(TypeConstants.JAVA_LANG_OBJECT, 3), 1));
 		}
 		codeStream.invokeJavaLangReflectConstructorNewInstance();
 		codeStream.checkcast(allocatedType);
@@ -181,7 +186,6 @@
 	// buffering the arguments' types
 	boolean argsContainCast = false;
 	TypeBinding[] argumentTypes = Binding.NO_PARAMETERS;
-	boolean polyExpressionSeen = false;
 	if (this.arguments != null) {
 		boolean argHasError = false;
 		int length = this.arguments.length;
@@ -197,8 +201,10 @@
 			if ((argumentType = argumentTypes[i] = argument.resolveType(scope)) == null) {
 				argHasError = true;
 			}
-			if (argumentType != null && argumentType.kind() == Binding.POLY_TYPE)
-				polyExpressionSeen = true;
+			if (argumentType != null && argumentType.kind() == Binding.POLY_TYPE) {
+				if (this.innerInferenceHelper == null)
+					this.innerInferenceHelper = new InnerInferenceHelper();
+			}
 		}
 		if (argHasError) {
 			return this.resolvedType;
@@ -212,7 +218,7 @@
 		return this.resolvedType;
 	}
 	if (isDiamond) {
-		TypeBinding [] inferredTypes = inferElidedTypes(((ParameterizedTypeBinding) this.resolvedType).genericType(), null, argumentTypes, scope);
+		TypeBinding [] inferredTypes = inferElidedTypes((ParameterizedTypeBinding) this.resolvedType, null, argumentTypes, scope);
 		if (inferredTypes == null) {
 			scope.problemReporter().cannotInferElidedTypes(this);
 			return this.resolvedType = null;
@@ -221,9 +227,7 @@
  	}
 	
 	ReferenceBinding allocatedType = (ReferenceBinding) this.resolvedType;
-	this.binding = scope.getConstructor(allocatedType, argumentTypes, this);
-	if (polyExpressionSeen && polyExpressionsHaveErrors(scope, this.binding, this.arguments, argumentTypes))
-		return null;
+	this.binding = findConstructorBinding(scope, this, allocatedType, argumentTypes);
 
 	if (!this.binding.isValidBinding()) {	
 		if (this.binding instanceof ProblemMethodBinding
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetClassFile.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetClassFile.java
index f4960a7..94b9b96 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetClassFile.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetClassFile.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *        Andy Clement - Contributions for
@@ -193,30 +189,28 @@
 	CategorizedProblem[] problemsCopy = new CategorizedProblem[problemsLength = problems.length];
 	System.arraycopy(problems, 0, problemsCopy, 0, problemsLength);
 	AbstractMethodDeclaration[] methodDecls = typeDeclaration.methods;
+	boolean abstractMethodsOnly = false;
 	if (methodDecls != null) {
 		if (typeBinding.isInterface()) {
-			// we cannot create problem methods for an interface. So we have to generate a clinit
-			// which should contain all the problem
+			if (typeBinding.scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_8)
+				abstractMethodsOnly = true;
+			// We generate a clinit which contains all the problems, since we may not be able to generate problem methods (< 1.8) and problem constructors (all levels).
 			classFile.addProblemClinit(problemsCopy);
-			for (int i = 0, length = methodDecls.length; i < length; i++) {
-				AbstractMethodDeclaration methodDecl = methodDecls[i];
-				MethodBinding method = methodDecl.binding;
-				if (method == null || method.isConstructor()) continue;
+		}
+		for (int i = 0, length = methodDecls.length; i < length; i++) {
+			AbstractMethodDeclaration methodDecl = methodDecls[i];
+			MethodBinding method = methodDecl.binding;
+			if (method == null) continue;
+			if (abstractMethodsOnly) {
 				method.modifiers = ClassFileConstants.AccPublic | ClassFileConstants.AccAbstract;
-				classFile.addAbstractMethod(methodDecl, method);
 			}
-		} else {
-			for (int i = 0, length = methodDecls.length; i < length; i++) {
-				AbstractMethodDeclaration methodDecl = methodDecls[i];
-				MethodBinding method = methodDecl.binding;
-				if (method == null) continue;
-				if (method.isConstructor()) {
-					classFile.addProblemConstructor(methodDecl, method, problemsCopy);
-				} else if (method.isAbstract()) {
-					classFile.addAbstractMethod(methodDecl, method);
-				} else {
-					classFile.addProblemMethod(methodDecl, method, problemsCopy);
-				}
+			if (method.isConstructor()) {
+				if (typeBinding.isInterface()) continue;
+				classFile.addProblemConstructor(methodDecl, method, problemsCopy);
+			} else if (method.isAbstract()) {
+				classFile.addAbstractMethod(methodDecl, method);
+			} else {
+				classFile.addProblemMethod(methodDecl, method, problemsCopy);
 			}
 		}
 		// add abstract methods
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEvaluator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEvaluator.java
index 7c6fb0e..efeabff 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEvaluator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetEvaluator.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
@@ -29,6 +29,7 @@
  * A code snippet evaluator compiles and returns class file for a code snippet.
  * Or it reports problems against the code snippet.
  */
+@SuppressWarnings({ "rawtypes" })
 public class CodeSnippetEvaluator extends Evaluator implements EvaluationConstants {
 	/**
 	 * Whether the code snippet support classes should be found in the provided name environment
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetFieldReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetFieldReference.java
index afba825..26aabe3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetFieldReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetFieldReference.java
@@ -199,7 +199,7 @@
 		// current stack is:
 		// field receiver value
 		if (valueRequired) {
-			if ((codegenBinding.type == TypeBinding.LONG) || (codegenBinding.type == TypeBinding.DOUBLE)) {
+			if ((TypeBinding.equalsEquals(codegenBinding.type, TypeBinding.LONG)) || (TypeBinding.equalsEquals(codegenBinding.type, TypeBinding.DOUBLE))) {
 				codeStream.dup2_x2();
 			} else {
 				codeStream.dup_x2();
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetMessageSend.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetMessageSend.java
index e2c48d3..2d16899 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetMessageSend.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetMessageSend.java
@@ -1,23 +1,29 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *        Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *                          Bug 409245 - [1.8][compiler] Type annotations dropped when call is routed through a synthetic bridge method
+ *                          Bug 409250 - [1.8][compiler] Various loose ends in 308 code generation
+ *        Stephan Herrmann - Contribution for
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
+ *							Bug 424415 - [1.8][compiler] Eventual resolution of ReferenceExpression is not seen to be happening.
+ *							Bug 427438 - [1.8][compiler] NPE at org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression.generateCode(ConditionalExpression.java:280)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.eval;
 
+import static org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExpressionContext.INVOCATION_CONTEXT;
+
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CastExpression;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.InnerInferenceHelper;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MessageSend;
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NameReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
@@ -82,14 +88,14 @@
 		// actual message invocation
 		TypeBinding constantPoolDeclaringClass = CodeStream.getConstantPoolDeclaringClass(currentScope, codegenBinding, this.actualReceiverType, this.receiver.isImplicitThis());
 		if (isStatic) {
-			codeStream.invoke(Opcodes.OPC_invokestatic, codegenBinding, constantPoolDeclaringClass);
+			codeStream.invoke(Opcodes.OPC_invokestatic, codegenBinding, constantPoolDeclaringClass, this.typeArguments);
 		} else if( (this.receiver.isSuper()) || codegenBinding.isPrivate()){
-			codeStream.invoke(Opcodes.OPC_invokespecial, codegenBinding, constantPoolDeclaringClass);
+			codeStream.invoke(Opcodes.OPC_invokespecial, codegenBinding, constantPoolDeclaringClass, this.typeArguments);
 		} else {
 			if (constantPoolDeclaringClass.isInterface()) { // interface or annotation type
-				codeStream.invoke(Opcodes.OPC_invokeinterface, codegenBinding, constantPoolDeclaringClass);
+				codeStream.invoke(Opcodes.OPC_invokeinterface, codegenBinding, constantPoolDeclaringClass, this.typeArguments);
 			} else {
-				codeStream.invoke(Opcodes.OPC_invokevirtual, codegenBinding, constantPoolDeclaringClass);
+				codeStream.invoke(Opcodes.OPC_invokevirtual, codegenBinding, constantPoolDeclaringClass, this.typeArguments);
 			}
 		}
 	} else {
@@ -115,7 +121,7 @@
 		if (this.arguments != null) {
 			int argsLength = this.arguments.length;
 			codeStream.generateInlinedValue(argsLength);
-			codeStream.newArray(null, currentScope.createArrayType(currentScope.getType(TypeConstants.JAVA_LANG_OBJECT, 3), 1));
+			codeStream.newArray(currentScope.createArrayType(currentScope.getType(TypeConstants.JAVA_LANG_OBJECT, 3), 1));
 			codeStream.dup();
 			for (int i = 0; i < argsLength; i++) {
 				codeStream.generateInlinedValue(i);
@@ -131,7 +137,7 @@
 			}
 		} else {
 			codeStream.generateInlinedValue(0);
-			codeStream.newArray(null, currentScope.createArrayType(currentScope.getType(TypeConstants.JAVA_LANG_OBJECT, 3), 1));
+			codeStream.newArray(currentScope.createArrayType(currentScope.getType(TypeConstants.JAVA_LANG_OBJECT, 3), 1));
 		}
 		codeStream.invokeJavaLangReflectMethodInvoke();
 
@@ -179,7 +185,7 @@
 		    // extra cast needed if method return type was type variable
 		    if (codegenBinding.returnType.isTypeVariable()) {
 		        TypeVariableBinding variableReturnType = (TypeVariableBinding) codegenBinding.returnType;
-		        if (variableReturnType.firstBound != this.binding.returnType) { // no need for extra cast if same as first bound anyway
+		        if (TypeBinding.notEquals(variableReturnType.firstBound, this.binding.returnType)) { // no need for extra cast if same as first bound anyway
 				    this.valueCast = this.binding.returnType;
 		        }
 		    }
@@ -199,7 +205,7 @@
 	this.actualReceiverType = this.receiver.resolveType(scope);
 	if (receiverCast && this.actualReceiverType != null) {
 		 // due to change of declaring class with receiver type, only identity cast should be notified
-		if (((CastExpression)this.receiver).expression.resolvedType == this.actualReceiverType) {
+		if (TypeBinding.equalsEquals(((CastExpression)this.receiver).expression.resolvedType, this.actualReceiverType)) {
 			scope.problemReporter().unnecessaryCast((CastExpression)this.receiver);
 		}
 	}
@@ -219,7 +225,6 @@
 	}
 	// will check for null after args are resolved
 	TypeBinding[] argumentTypes = Binding.NO_PARAMETERS;
-	boolean polyExpressionSeen = false;
 	if (this.arguments != null) {
 		boolean argHasError = false; // typeChecks all arguments
 		int length = this.arguments.length;
@@ -234,13 +239,15 @@
 			argument.setExpressionContext(INVOCATION_CONTEXT);
 			if ((argumentType = argumentTypes[i] = this.arguments[i].resolveType(scope)) == null)
 				argHasError = true;
-			if (argumentType != null && argumentType.kind() == Binding.POLY_TYPE)
-				polyExpressionSeen = true;
+			if (argumentType != null && argumentType.kind() == Binding.POLY_TYPE) {
+				if (this.innerInferenceHelper == null)
+					this.innerInferenceHelper = new InnerInferenceHelper();
+			}
 		}
 		if (argHasError) {
 			if(this.actualReceiverType instanceof ReferenceBinding) {
 				// record any selector match, for clients who may still need hint about possible method match
-				this.binding = scope.findMethod((ReferenceBinding)this.actualReceiverType, this.selector, new TypeBinding[]{}, this);
+				this.binding = scope.findMethod((ReferenceBinding)this.actualReceiverType, this.selector, new TypeBinding[]{}, this, false);
 			}
 			return null;
 		}
@@ -254,14 +261,8 @@
 		return null;
 	}
 
-	this.binding =
-		this.receiver.isImplicitThis()
-			? scope.getImplicitMethod(this.selector, argumentTypes, this)
-			: scope.getMethod(this.actualReceiverType, this.selector, argumentTypes, this);
-	
-	if (polyExpressionSeen && polyExpressionsHaveErrors(scope, this.binding, this.arguments, argumentTypes))
-		return null;
-	
+	findMethodBinding(scope, argumentTypes);
+		
 	if (!this.binding.isValidBinding()) {
 		if (this.binding instanceof ProblemMethodBinding
 			&& ((ProblemMethodBinding) this.binding).problemId() == ProblemReasons.NotVisible) {
@@ -320,7 +321,7 @@
 			TypeBinding oldReceiverType = this.actualReceiverType;
 			this.actualReceiverType = this.actualReceiverType.getErasureCompatibleType(this.binding.declaringClass);
 			this.receiver.computeConversion(scope, this.actualReceiverType, this.actualReceiverType);
-			if (this.actualReceiverType != oldReceiverType && this.receiver.postConversionType(scope) != this.actualReceiverType) { // record need for explicit cast at codegen since receiver could not handle it
+			if (TypeBinding.notEquals(this.actualReceiverType, oldReceiverType) && TypeBinding.notEquals(this.receiver.postConversionType(scope), this.actualReceiverType)) { // record need for explicit cast at codegen since receiver could not handle it
 				this.bits |= NeedReceiverGenericCast;
 			}			
 		}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetParser.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetParser.java
index 6d0c7ef..aa2d600 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetParser.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetParser.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -111,7 +107,6 @@
 				length);
 		}
 		alloc.type = getTypeReference(0);
-		rejectIllegalLeadingTypeAnnotations(alloc.type);
 
 		length = this.genericsLengthStack[this.genericsLengthPtr--];
 		this.genericsPtr -= length;
@@ -267,11 +262,11 @@
  * The CSToCuMapper could not be used, since it could have interfered with
  * the syntax recovery specific to code snippets.
  */
-protected void consumeMethodDeclaration(boolean isNotAbstract) {
+protected void consumeMethodDeclaration(boolean isNotAbstract, boolean isDefaultMethod) {
 	// MethodDeclaration ::= MethodHeader MethodBody
 	// AbstractMethodDeclaration ::= MethodHeader ';'
 
-	super.consumeMethodDeclaration(isNotAbstract);
+	super.consumeMethodDeclaration(isNotAbstract, isDefaultMethod);
 
 	// now we know that we have a method declaration at the top of the ast stack
 	MethodDeclaration methodDecl = (MethodDeclaration) this.astStack[this.astPtr];
@@ -318,7 +313,7 @@
 			}
 			int dimCount = CharOperation.occurencesOf('[', this.evaluationContext.localVariableTypeNames[i]);
 			if (dimCount > 0) {
-				typeReference = copyDims(typeReference, dimCount);
+				typeReference = augmentTypeWithAdditionalDimensions(typeReference, dimCount, null, false);
 			}
 			NameReference init = new SingleNameReference(
 									CharOperation.concat(LOCAL_VAR_PREFIX, this.evaluationContext.localVariableNames[i]), position);
@@ -592,7 +587,7 @@
 			}
 			consumeMethodBody();
 			if (!this.diet) {
-				consumeMethodDeclaration(true);
+				consumeMethodDeclaration(true, false);
 				if (fieldsCount > 0) {
 					consumeClassBodyDeclarations();
 				}
@@ -791,9 +786,9 @@
  * A syntax error was detected. If a method is being parsed, records the number of errors and
  * attempts to restart from the last statement by going for an expression.
  */
-protected boolean resumeOnSyntaxError() {
+protected int resumeOnSyntaxError() {
 	if (this.diet || this.hasRecoveredOnExpression) { // no reentering inside expression recovery
-		return false;
+		return HALT;
 	}
 
 	// record previous error, in case more accurate than potential one in expression recovery
@@ -822,6 +817,6 @@
 	this.hasRecoveredOnExpression = true;
 	this.hasReportedError = false;
 	this.hasError = false;
-	return true;
+	return RESTART;
 }
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.java
index c94eb7a..4ca6fc0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.java
@@ -5,10 +5,6 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann <stephan@cs.tu-berlin.de> - Contribution for bug 185682 - Increment/decrement operators mark local variables as read
@@ -64,7 +60,7 @@
 	TypeBinding declaringClass = fieldBinding.original().declaringClass;
 	// check for forward references
 	if ((this.indexOfFirstFieldBinding == 1 || declaringClass.isEnum())
-			&& methodScope.enclosingSourceType() == declaringClass
+			&& TypeBinding.equalsEquals(methodScope.enclosingSourceType(), declaringClass)
 			&& methodScope.lastVisibleFieldID >= 0
 			&& fieldBinding.id >= methodScope.lastVisibleFieldID
 			&& (!fieldBinding.isStatic() || methodScope.isStatic)) {
@@ -100,7 +96,7 @@
 			}
 		} else {
 			boolean isFirst = lastFieldBinding == this.binding
-											&& (this.indexOfFirstFieldBinding == 1 || lastFieldBinding.declaringClass == currentScope.enclosingReceiverType())
+											&& (this.indexOfFirstFieldBinding == 1 || TypeBinding.equalsEquals(lastFieldBinding.declaringClass, currentScope.enclosingReceiverType()))
 											&& this.otherBindings == null; // could be dup: next.next.next
 			TypeBinding requiredGenericCast = getGenericCast(this.otherBindings == null ? 0 : this.otherBindings.length);
 			if (valueRequired
@@ -256,7 +252,7 @@
 		}		
 	}
 	codeStream.generateEmulationForField(lastFieldBinding);
-	if ((lastFieldBinding.type == TypeBinding.LONG) || (lastFieldBinding.type == TypeBinding.DOUBLE)) {
+	if ((TypeBinding.equalsEquals(lastFieldBinding.type, TypeBinding.LONG)) || (TypeBinding.equalsEquals(lastFieldBinding.type, TypeBinding.DOUBLE))) {
 		codeStream.dup_x2();
 		codeStream.pop();
 		if (lastFieldBinding.isStatic()) {
@@ -405,7 +401,7 @@
 						if (lastFieldBinding == initialFieldBinding) {
 							if (lastFieldBinding.isStatic()){
 								// if no valueRequired, still need possible side-effects of <clinit> invocation, if field belongs to different class
-								if (initialFieldBinding.declaringClass != this.actualReceiverType.erasure()) {
+								if (TypeBinding.notEquals(initialFieldBinding.declaringClass, this.actualReceiverType.erasure())) {
 									if (lastFieldBinding.canBeSeenBy(lastReceiverType, this, currentScope)) {
 										MethodBinding accessor = this.syntheticReadAccessors == null ? null : this.syntheticReadAccessors[i];
 										if (accessor == null) {
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetReturnStatement.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetReturnStatement.java
index 907ff71..cf4a0b8 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetReturnStatement.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetReturnStatement.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
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.eval;
 
@@ -19,9 +21,11 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowInfo;
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 
 /**
@@ -92,6 +96,9 @@
 public TypeBinding[] genericTypeArguments() {
 	return null;
 }
+public InferenceContext18 freshInferenceContext(Scope scope) {
+	return null;
+}
 public boolean isSuperAccess() {
 	return false;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetScope.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetScope.java
index 1de0d20..a28b3c0 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetScope.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetScope.java
@@ -9,6 +9,8 @@
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller <jesper@selskabet.org> - Contributions for
  *								bug 378674 - "The method can be declared as static" is wrong
+ *     Stephan Herrmann - Contribution for
+ *								Bug 424167 - [1.8] Fully integrate type inference with overload resolution     
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.eval;
 
@@ -71,14 +73,14 @@
 	if (fieldBinding.isPublic()) return true;
 
 	ReferenceBinding invocationType = (ReferenceBinding) receiverType;
-	if (invocationType == fieldBinding.declaringClass) return true;
+	if (TypeBinding.equalsEquals(invocationType, fieldBinding.declaringClass)) return true;
 
 	if (fieldBinding.isProtected()) {
 		// answer true if the invocationType is the declaringClass or they are in the same package
 		// OR the invocationType is a subclass of the declaringClass
 		//    AND the receiverType is the invocationType or its subclass
 		//    OR the field is a static field accessed directly through a type
-		if (invocationType == fieldBinding.declaringClass) return true;
+		if (TypeBinding.equalsEquals(invocationType, fieldBinding.declaringClass)) return true;
 		if (invocationType.fPackage == fieldBinding.declaringClass.fPackage) return true;
 		if (fieldBinding.declaringClass.isSuperclassOf(invocationType)) {
 			if (invocationSite.isSuperAccess()) return true;
@@ -96,9 +98,9 @@
 	if (fieldBinding.isPrivate()) {
 		// answer true if the receiverType is the declaringClass
 		// AND the invocationType and the declaringClass have a common enclosingType
-		if (receiverType != fieldBinding.declaringClass) return false;
+		if (TypeBinding.notEquals(receiverType, fieldBinding.declaringClass)) return false;
 
-		if (invocationType != fieldBinding.declaringClass) {
+		if (TypeBinding.notEquals(invocationType, fieldBinding.declaringClass)) {
 			ReferenceBinding outerInvocationType = invocationType;
 			ReferenceBinding temp = outerInvocationType.enclosingType();
 			while (temp != null) {
@@ -112,7 +114,7 @@
 				outerDeclaringClass = temp;
 				temp = temp.enclosingType();
 			}
-			if (outerInvocationType != outerDeclaringClass) return false;
+			if (TypeBinding.notEquals(outerInvocationType, outerDeclaringClass)) return false;
 		}
 		return true;
 	}
@@ -128,9 +130,9 @@
 	TypeBinding originalDeclaringClass = fieldBinding.declaringClass .original();
 	do {
 		if (type.isCapture()) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=285002
-			if (originalDeclaringClass == type.erasure().original()) return true;	
+			if (TypeBinding.equalsEquals(originalDeclaringClass, type.erasure().original())) return true;	
 		} else {
-			if (originalDeclaringClass == type.original()) return true;
+			if (TypeBinding.equalsEquals(originalDeclaringClass, type.original())) return true;
 		}
 		if (declaringPackage != type.fPackage) return false;
 	} while ((type = type.superclass()) != null);
@@ -146,14 +148,14 @@
 	if (methodBinding.isPublic()) return true;
 
 	ReferenceBinding invocationType = (ReferenceBinding) receiverType;
-	if (invocationType == methodBinding.declaringClass) return true;
+	if (TypeBinding.equalsEquals(invocationType, methodBinding.declaringClass)) return true;
 
 	if (methodBinding.isProtected()) {
 		// answer true if the invocationType is the declaringClass or they are in the same package
 		// OR the invocationType is a subclass of the declaringClass
 		//    AND the receiverType is the invocationType or its subclass
 		//    OR the method is a static method accessed directly through a type
-		if (invocationType == methodBinding.declaringClass) return true;
+		if (TypeBinding.equalsEquals(invocationType, methodBinding.declaringClass)) return true;
 		if (invocationType.fPackage == methodBinding.declaringClass.fPackage) return true;
 		if (methodBinding.declaringClass.isSuperclassOf(invocationType)) {
 			if (invocationSite.isSuperAccess()) return true;
@@ -171,9 +173,9 @@
 	if (methodBinding.isPrivate()) {
 		// answer true if the receiverType is the declaringClass
 		// AND the invocationType and the declaringClass have a common enclosingType
-		if (receiverType != methodBinding.declaringClass) return false;
+		if (TypeBinding.notEquals(receiverType, methodBinding.declaringClass)) return false;
 
-		if (invocationType != methodBinding.declaringClass) {
+		if (TypeBinding.notEquals(invocationType, methodBinding.declaringClass)) {
 			ReferenceBinding outerInvocationType = invocationType;
 			ReferenceBinding temp = outerInvocationType.enclosingType();
 			while (temp != null) {
@@ -187,7 +189,7 @@
 				outerDeclaringClass = temp;
 				temp = temp.enclosingType();
 			}
-			if (outerInvocationType != outerDeclaringClass) return false;
+			if (TypeBinding.notEquals(outerInvocationType, outerDeclaringClass)) return false;
 		}
 		return true;
 	}
@@ -203,9 +205,9 @@
 	TypeBinding originalDeclaringClass = methodBinding.declaringClass .original();
 	do {
 		if (type.isCapture()) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=285002
-			if (originalDeclaringClass == type.erasure().original()) return true;
+			if (TypeBinding.equalsEquals(originalDeclaringClass, type.erasure().original())) return true;
 		} else {
-			if (originalDeclaringClass == type.original()) return true;
+			if (TypeBinding.equalsEquals(originalDeclaringClass, type.original())) return true;
 		}
 		if (declaringPackage != type.fPackage) return false;
 	} while ((type = type.superclass()) != null);
@@ -221,7 +223,7 @@
 public final boolean canBeSeenByForCodeSnippet(ReferenceBinding referenceBinding, ReferenceBinding receiverType) {
 	if (referenceBinding.isPublic()) return true;
 
-	if (receiverType == referenceBinding) return true;
+	if (TypeBinding.equalsEquals(receiverType, referenceBinding)) return true;
 
 	if (referenceBinding.isProtected()) {
 		// answer true if the receiver (or its enclosing type) is the superclass
@@ -247,7 +249,7 @@
 			outerDeclaringClass = temp;
 			temp = temp.enclosingType();
 		}
-		return outerInvocationType == outerDeclaringClass;
+		return TypeBinding.equalsEquals(outerInvocationType, outerDeclaringClass);
 	}
 
 	// isDefault()
@@ -369,8 +371,8 @@
 	return null;
 }
 // Internal use only
-public MethodBinding findMethod(ReferenceBinding receiverType, char[] selector, TypeBinding[] argumentTypes, InvocationSite invocationSite) {
-	MethodBinding methodBinding = super.findMethod(receiverType, selector, argumentTypes, invocationSite);
+public MethodBinding findMethod(ReferenceBinding receiverType, char[] selector, TypeBinding[] argumentTypes, InvocationSite invocationSite, boolean inStaticContext) {
+	MethodBinding methodBinding = super.findMethod(receiverType, selector, argumentTypes, invocationSite, inStaticContext);
 	if (methodBinding != null && methodBinding.isValidBinding())
 		if (!canBeSeenByForCodeSnippet(methodBinding, receiverType, invocationSite, this))
 			return new ProblemMethodBinding(methodBinding, selector, argumentTypes, ProblemReasons.NotVisible);
@@ -390,11 +392,11 @@
 	}
 
 	// answers closest approximation, may not check argumentTypes or visibility
-	methodBinding = findMethod(object, selector, argumentTypes, invocationSite);
+	methodBinding = findMethod(object, selector, argumentTypes, invocationSite, false);
 	if (methodBinding == null)
 		return new ProblemMethodBinding(selector, argumentTypes, ProblemReasons.NotFound);
 	if (methodBinding.isValidBinding()) {
-	    MethodBinding compatibleMethod = computeCompatibleMethod(methodBinding, argumentTypes, invocationSite);
+	    MethodBinding compatibleMethod = computeCompatibleMethod(methodBinding, argumentTypes, invocationSite, Scope.FULL_INFERENCE);
 	    if (compatibleMethod == null)
 			return new ProblemMethodBinding(methodBinding, selector, argumentTypes, ProblemReasons.NotFound);
 	    methodBinding = compatibleMethod;
@@ -540,7 +542,7 @@
 	MethodBinding[] compatible = new MethodBinding[methods.length];
 	int compatibleIndex = 0;
 	for (int i = 0, length = methods.length; i < length; i++) {
-	    MethodBinding compatibleMethod = computeCompatibleMethod(methods[i], argumentTypes, invocationSite);
+	    MethodBinding compatibleMethod = computeCompatibleMethod(methods[i], argumentTypes, invocationSite, Scope.APPLICABILITY);
 		if (compatibleMethod != null)
 			compatible[compatibleIndex++] = compatibleMethod;
 	}
@@ -556,7 +558,8 @@
 		}
 	}
 	if (visibleIndex == 1) {
-		return visible[0];
+		// 1.8: Give inference a chance to perform outstanding tasks (18.5.2):
+		return inferInvocationType(invocationSite, visible[0], argumentTypes);
 	}
 	if (visibleIndex == 0) {
 		return new ProblemMethodBinding(compatible[0], TypeConstants.INIT, compatible[0].parameters, ProblemReasons.NotVisible);
@@ -600,7 +603,7 @@
 	// retrieve an exact visible match (if possible)
 	MethodBinding methodBinding = findExactMethod(receiverType, selector, argumentTypes, invocationSite);
 	if (methodBinding == null)
-		methodBinding = findMethod(receiverType, selector, argumentTypes, invocationSite);
+		methodBinding = findMethod(receiverType, selector, argumentTypes, invocationSite, false);
 	if (methodBinding != null) { // skip it if we did not find anything
 		if (methodBinding.isValidBinding())
 		    if (!canBeSeenByForCodeSnippet(methodBinding, receiverType, invocationSite, this))
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.java
index 3f8bad2..6ece92a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.java
@@ -4,10 +4,6 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -174,7 +170,7 @@
 				}
 				assignment.expression.generateCode(currentScope, codeStream, true);
 				if (valueRequired) {
-					if ((codegenField.type == TypeBinding.LONG) || (codegenField.type == TypeBinding.DOUBLE)) {
+					if ((TypeBinding.equalsEquals(codegenField.type, TypeBinding.LONG)) || (TypeBinding.equalsEquals(codegenField.type, TypeBinding.DOUBLE))) {
 						codeStream.dup2_x2();
 					} else {
 						codeStream.dup_x2();
@@ -203,7 +199,7 @@
 					if (valueRequired) {
 						codeStream.generateImplicitConversion(assignment.implicitConversion); // implicit conversion
 					} else {
-						if ((localBinding.type == TypeBinding.LONG) || (localBinding.type == TypeBinding.DOUBLE)) {
+						if ((TypeBinding.equalsEquals(localBinding.type, TypeBinding.LONG)) || (TypeBinding.equalsEquals(localBinding.type, TypeBinding.DOUBLE))) {
 							codeStream.pop2();
 						} else {
 							codeStream.pop();
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton.java
index da2a181..120bf1d 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton.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
@@ -8,6 +8,8 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Stephan Herrmann - Contribution for bug 186342 - [compiler][null] Using annotations for null checking
+ *     Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
+ *         Bug 407191 - [1.8] Binary access support for type annotations
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.eval;
 
@@ -20,6 +22,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryMethod;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryNestedType;
 import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryType;
+import org.aspectj.org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation;
 import org.aspectj.org.eclipse.jdt.internal.core.util.Util;
 
 /**
@@ -68,6 +71,9 @@
 		public int getAnnotatedParametersCount() {
 			return 0;
 		}
+		public IBinaryTypeAnnotation[] getTypeAnnotations() {
+			return null; 
+		}
 		public char[] getSelector() {
 			return this.selector;
 		}
@@ -112,6 +118,9 @@
 public IBinaryAnnotation[] getAnnotations() {
 	return null;
 }
+public IBinaryTypeAnnotation[] getTypeAnnotations() {
+	return null; 
+}
 public char[] getEnclosingMethod() {
 	return null;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSuperReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSuperReference.java
index e9f0082..0499e17 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSuperReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetSuperReference.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
@@ -7,13 +7,17 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Stephan Herrmann - Contribution for
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.eval;
 
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SuperReference;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 
 /**
@@ -39,6 +43,9 @@
 	scope.problemReporter().cannotUseSuperInCodeSnippet(this.sourceStart, this.sourceEnd);
 	return null;
 }
+public InferenceContext18 freshInferenceContext(Scope scope) {
+	return null;
+}
 public boolean isSuperAccess(){
 	return false;
 }
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetThisReference.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetThisReference.java
index f4ce075..a05bdbc 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetThisReference.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/CodeSnippetThisReference.java
@@ -4,15 +4,13 @@
  * 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
- * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Contributions for
  *								Bug 378674 - "The method can be declared as static" is wrong
+ *     Stephan Herrmann - Contribution for
+ *							Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.eval;
 
@@ -22,9 +20,11 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 
 /**
@@ -81,6 +81,10 @@
 		return null;
 	}
 	
+	public InferenceContext18 freshInferenceContext(Scope scope) {
+		return null;
+	}
+
 	public boolean isSuperAccess(){
 		return false;
 	}
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext.java
index 130a482..759f166 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/EvaluationContext.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
@@ -39,6 +39,7 @@
 /**
  * @see org.aspectj.org.eclipse.jdt.core.eval.IEvaluationContext
  */
+@SuppressWarnings("rawtypes")
 public class EvaluationContext implements EvaluationConstants, SuffixConstants {
 	/**
 	 * Global counters so that several evaluation context can deploy on the same runtime.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator.java
index 3c579c7..5cc6315 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/Evaluator.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
@@ -32,6 +32,7 @@
  * If the compilation unit has problems, reports the problems using the
  * requestor.
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class Evaluator {
 	EvaluationContext context;
 	INameEnvironment environment;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/VariablesEvaluator.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/VariablesEvaluator.java
index 36c1e74..47a18d9 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/VariablesEvaluator.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/eval/VariablesEvaluator.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
@@ -26,6 +26,7 @@
  * A variables evaluator compiles the global variables of an evaluation context and returns
  * the corresponding class files. Or it reports problems against these variables.
  */
+@SuppressWarnings({"rawtypes"})
 public class VariablesEvaluator extends Evaluator implements EvaluationConstants {
 /**
  * Creates a new global variables evaluator.
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/BinaryExpressionFragmentBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/BinaryExpressionFragmentBuilder.java
index 7175979..5e3c2b2 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/BinaryExpressionFragmentBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/BinaryExpressionFragmentBuilder.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
@@ -60,6 +60,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ClassScope;
 import org.aspectj.org.eclipse.jdt.internal.compiler.parser.TerminalTokens;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 class BinaryExpressionFragmentBuilder
 	extends ASTVisitor {
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/CascadingMethodInvocationFragmentBuilder.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/CascadingMethodInvocationFragmentBuilder.java
index bc87635..b06eda6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/CascadingMethodInvocationFragmentBuilder.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/CascadingMethodInvocationFragmentBuilder.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
@@ -17,6 +17,7 @@
 import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MessageSend;
 import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 
+@SuppressWarnings({"rawtypes", "unchecked"})
 class CascadingMethodInvocationFragmentBuilder
 	extends ASTVisitor {
 
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.java
index b9a190c..eb84a7a 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2013 IBM Corporation and others.
+ * Copyright (c) 2002, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Brock Janiczak - Contribution for bug 150741
@@ -150,6 +146,7 @@
       </codeFormatter>
    </extension>
 */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class CodeFormatterVisitor extends ASTVisitor {
 
 	public static class MultiFieldDeclaration extends FieldDeclaration {
@@ -702,25 +699,25 @@
 		int extraDimensions = getDimensions();
 		if (extraDimensions != 0) {
 			int anchor = typeReference != null ? (typeReference.dimensions() - extraDimensions) : 0;
-			formatDimensions(typeReference, anchor, extraDimensions, true);
+			formatDimensions(typeReference, anchor, extraDimensions);
 		}
 	}
 
-	private void formatLeadingDimensions(TypeReference typeReference, boolean spaceBeforeAnnotation) {
+	private void formatLeadingDimensions(TypeReference typeReference) {
 		int leadingDimensions = Math.min(getDimensions(), typeReference != null ? typeReference.dimensions() : 0);
-		if (leadingDimensions != 0) formatDimensions(typeReference, 0, leadingDimensions, spaceBeforeAnnotation);
+		if (leadingDimensions != 0) formatDimensions(typeReference, 0, leadingDimensions);
 	}
 
-	private void formatDimensions(TypeReference typeReference, int anchor, int count, boolean spaceBeforeAnnotation) {
+	private void formatDimensions(TypeReference typeReference, int anchor, int count) {
 		if (count != 0) {
 			if (this.preferences.insert_space_before_opening_bracket_in_array_type_reference) {
 				this.scribe.space();
 			}
-			Annotation[][] annotationsOnDimensions = typeReference != null ? typeReference.getAnnotationsOnDimensions() : null;
+			Annotation[][] annotationsOnDimensions = typeReference != null ? typeReference.getAnnotationsOnDimensions(true) : null;
 			for (int i = 0; i < count; i++) {
 				int dimensionIndex = anchor + i;
 				if (annotationsOnDimensions != null && annotationsOnDimensions.length > dimensionIndex) {
-					boolean hadAnnotations = formatInlineAnnotations(annotationsOnDimensions[dimensionIndex], spaceBeforeAnnotation && i == 0);
+					boolean hadAnnotations = formatInlineAnnotations(annotationsOnDimensions[dimensionIndex], true);
 					if (hadAnnotations && this.preferences.insert_space_before_opening_bracket_in_array_type_reference) this.scribe.space();
 				}
 				this.scribe.printNextToken(TerminalTokens.TokenNameLBRACKET);
@@ -2410,7 +2407,7 @@
 		return 0;
 	}
 
-		private void skipPastTypeAnnotations() {  // we get here having seen @
+	private void skipPastTypeAnnotations() {  // we get here having seen @
 		int balance = 0;
 		int currentTokenStartPosition = this.localScanner.currentPosition;
 		try {
@@ -2460,6 +2457,42 @@
 		return false;
 	}
 
+	private boolean hasNonAnnotationModifiers() {
+		this.localScanner.resetTo(this.scribe.scanner.currentPosition, this.scribe.scannerEndPosition - 1);
+		try {
+			int token;
+			while ((token = this.localScanner.getNextToken()) != TerminalTokens.TokenNameEOF) {
+				switch(token) {
+					case TerminalTokens.TokenNamedefault :
+					case TerminalTokens.TokenNamepublic :
+					case TerminalTokens.TokenNameprotected :
+					case TerminalTokens.TokenNameprivate :
+					case TerminalTokens.TokenNamestatic :
+					case TerminalTokens.TokenNameabstract :
+					case TerminalTokens.TokenNamefinal :
+					case TerminalTokens.TokenNamenative :
+					case TerminalTokens.TokenNamesynchronized :
+					case TerminalTokens.TokenNametransient :
+					case TerminalTokens.TokenNamevolatile :
+					case TerminalTokens.TokenNamestrictfp :
+						return true;
+					case TerminalTokens.TokenNameAT :
+						skipPastTypeAnnotations();
+						break;
+					case TerminalTokens.TokenNameCOMMENT_BLOCK :
+					case TerminalTokens.TokenNameCOMMENT_JAVADOC :
+					case TerminalTokens.TokenNameCOMMENT_LINE :
+						break;
+					default:
+						return false;
+				}
+			}
+		} catch(InvalidInputException e) {
+			// ignore
+		}
+		return false;
+	}
+	
 	private boolean isNextToken(int tokenName) {
 		this.localScanner.resetTo(this.scribe.scanner.currentPosition, this.scribe.scannerEndPosition - 1);
 		try {
@@ -2741,7 +2774,7 @@
 
 		if (argument.modifiers != NO_MODIFIERS || argument.annotations != null) {
 	        this.scribe.printComment();
-			this.scribe.printModifiers(argument.annotations, this, ICodeFormatterConstants.ANNOTATION_ON_PARAMETER);
+			this.scribe.printModifiers(argument.annotations, this, ICodeFormatterConstants.ANNOTATION_ON_PARAMETER, !hasNonAnnotationModifiers());
 			this.scribe.space();
 		}
 
@@ -2763,7 +2796,7 @@
 		}
 
 		if (argument.isVarArgs()) {
-			Annotation [][] annotationsOnDimensions = argumentType.getAnnotationsOnDimensions();
+			Annotation [][] annotationsOnDimensions = argumentType.getAnnotationsOnDimensions(true);
 			if (annotationsOnDimensions != null) {
 				Annotation [] varargAnnotations = annotationsOnDimensions[annotationsOnDimensions.length - 1];
 				if (varargAnnotations != null) {
@@ -2815,7 +2848,7 @@
 			int dimensionsLength = dimensions.length;
 			for (int i = 0; i < dimensionsLength; i++) {
 				if (arrayAllocationExpression.annotationsOnDimensions != null) {
-					formatInlineAnnotations(arrayAllocationExpression.annotationsOnDimensions[i], i == 0);
+					formatInlineAnnotations(arrayAllocationExpression.annotationsOnDimensions[i], true);
 				}
 				if (this.preferences.insert_space_before_opening_bracket_in_array_allocation_expression) {
 					this.scribe.space();
@@ -3005,7 +3038,7 @@
 			manageOpeningParenthesizedExpression(arrayQualifiedTypeReference, numberOfParens);
 		}
 		formatQualifiedTypeReference(arrayQualifiedTypeReference);
-		formatLeadingDimensions(arrayQualifiedTypeReference, true);
+		formatLeadingDimensions(arrayQualifiedTypeReference);
 		if (numberOfParens > 0) {
 			manageClosingParenthesizedExpression(arrayQualifiedTypeReference, numberOfParens);
 		}
@@ -3075,7 +3108,7 @@
 
 		int dimensions = getDimensions();
 		if (dimensions != 0) {
-			formatDimensions(arrayTypeReference, 0, dimensions, true);
+			formatDimensions(arrayTypeReference, 0, dimensions);
 		}
 		if (numberOfParens > 0) {
 			manageClosingParenthesizedExpression(arrayTypeReference, numberOfParens);
@@ -3100,7 +3133,7 @@
 		this.scribe.printNextToken(SINGLETYPEREFERENCE_EXPECTEDTOKENS);
 		int dimensions = getDimensions();
 		if (dimensions != 0) {
-			formatDimensions(arrayTypeReference, 0, dimensions, true);
+			formatDimensions(arrayTypeReference, 0, dimensions);
 		}
 		if (numberOfParens > 0) {
 			manageClosingParenthesizedExpression(arrayTypeReference, numberOfParens);
@@ -4372,7 +4405,7 @@
 			// Format arguments
 			formatMethodArguments(
 				null,
-				lambdaExpression.arguments,
+				lambdaExpression.arguments(),
 				lambdaExpression.getScope(),
 				this.preferences.insert_space_before_opening_paren_in_method_declaration,
 				this.preferences.insert_space_between_empty_parens_in_method_declaration,
@@ -4388,10 +4421,11 @@
 		if (this.preferences.insert_space_before_lambda_arrow) this.scribe.space();
 		this.scribe.printNextToken(TerminalTokens.TokenNameARROW);
 		if (this.preferences.insert_space_after_lambda_arrow) this.scribe.space();
-		if (lambdaExpression.body instanceof Block) {
-			formatBlock((Block) lambdaExpression.body, scope, this.preferences.brace_position_for_lambda_body, this.preferences.insert_space_before_opening_brace_in_block);
+		final Statement body = lambdaExpression.body();
+		if (body instanceof Block) {
+			formatBlock((Block) body, scope, this.preferences.brace_position_for_lambda_body, this.preferences.insert_space_before_opening_brace_in_block);
 		} else {
-			lambdaExpression.body.traverse(this, scope);
+			body.traverse(this, scope);
 		}
 
 		if (numberOfParens > 0) {
@@ -4785,7 +4819,7 @@
 				this.scribe.printNextToken(TerminalTokens.TokenNameDOT);
 			}
 		}
-		formatLeadingDimensions(parameterizedQualifiedTypeReference, true);
+		formatLeadingDimensions(parameterizedQualifiedTypeReference);
 		if (numberOfParens > 0) {
 			manageClosingParenthesizedExpression(parameterizedQualifiedTypeReference, numberOfParens);
 		}
@@ -4833,7 +4867,7 @@
 				this.scribe.printNextToken(TerminalTokens.TokenNameDOT);
 			}
 		}
-		formatLeadingDimensions(parameterizedQualifiedTypeReference, true);
+		formatLeadingDimensions(parameterizedQualifiedTypeReference);
 		if (numberOfParens > 0) {
 			manageClosingParenthesizedExpression(parameterizedQualifiedTypeReference, numberOfParens);
 		}
@@ -4873,7 +4907,7 @@
 			this.scribe.printNextToken(TerminalTokens.TokenNameLESS, this.preferences.insert_space_before_opening_angle_bracket_in_parameterized_type_reference);
 			this.scribe.printNextToken(CLOSING_GENERICS_EXPECTEDTOKENS);
 		}
-		formatLeadingDimensions(parameterizedSingleTypeReference, true);
+		formatLeadingDimensions(parameterizedSingleTypeReference);
 		if (numberOfParens > 0) {
 			manageClosingParenthesizedExpression(parameterizedSingleTypeReference, numberOfParens);
 		}
@@ -4914,7 +4948,7 @@
 			this.scribe.printNextToken(CLOSING_GENERICS_EXPECTEDTOKENS);
 		}
 
-		formatLeadingDimensions(parameterizedSingleTypeReference, true);
+		formatLeadingDimensions(parameterizedSingleTypeReference);
 		if (numberOfParens > 0) {
 			manageClosingParenthesizedExpression(parameterizedSingleTypeReference, numberOfParens);
 		}
@@ -5147,7 +5181,7 @@
 			if (i != 0) this.scribe.printNextToken(TerminalTokens.TokenNameDOT, false);
 			if (qualifiedTypeReference.annotations != null) {
 				formatInlineAnnotations(qualifiedTypeReference.annotations[i], false);
-				this.scribe.printNextToken(TerminalTokens.TokenNameIdentifier, true);
+				this.scribe.printNextToken(TerminalTokens.TokenNameIdentifier, false);
 			} else {
 				this.scribe.printNextToken(TerminalTokens.TokenNameIdentifier, false);
 			}
@@ -5290,9 +5324,12 @@
 				if (i != 0) this.scribe.space();
 				annotations[i].traverse(this, (BlockScope)null);
 			}
-			if (length > 0 && !this.isNextTokenPunctuation()) {
+			if (length > 0 && (!this.isNextTokenPunctuation() || this.isNextToken(TerminalTokens.TokenNameLBRACKET))) {
 				this.scribe.space();
 			}
+			if (this.scribe.formatter.preferences.insert_new_line_after_type_annotation) {
+				this.scribe.printNewLine();
+			}
 			return true;
 		}
 		return false;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
index 3bf2909..2605167 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
@@ -34,6 +34,7 @@
 import org.eclipse.jface.text.Region;
 import org.eclipse.text.edits.TextEdit;
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class DefaultCodeFormatter extends CodeFormatter {
 
 	/**
@@ -285,6 +286,7 @@
 			optionsMap.put(CompilerOptions.OPTION_LocalVariableAttribute, CompilerOptions.DO_NOT_GENERATE);
 			optionsMap.put(CompilerOptions.OPTION_LineNumberAttribute, CompilerOptions.DO_NOT_GENERATE);
 			optionsMap.put(CompilerOptions.OPTION_SourceFileAttribute, CompilerOptions.DO_NOT_GENERATE);
+			optionsMap.put(CompilerOptions.OPTION_MethodParametersAttribute, CompilerOptions.DO_NOT_GENERATE);
 			optionsMap.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);
 			optionsMap.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.DISABLED);
 			optionsMap.put(CompilerOptions.OPTION_ReportMethodWithConstructorName, CompilerOptions.IGNORE);
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.java
index a998e96..b7e6117 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.java
@@ -1,14 +1,10 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  *
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Brock Janiczak - Contribution for bug 150741
@@ -30,6 +26,7 @@
  * @since 3.0
  */
 
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class DefaultCodeFormatterOptions {
 	public static final int TAB = 1;
 	public static final int SPACE = 2;
@@ -146,6 +143,7 @@
 	public int indentation_size;
 
 	public boolean insert_new_line_after_annotation_on_type;
+	public boolean insert_new_line_after_type_annotation;
 	public boolean insert_new_line_after_annotation_on_field;
 	public boolean insert_new_line_after_annotation_on_method;
 	public boolean insert_new_line_after_annotation_on_package;
@@ -447,6 +445,7 @@
 		options.put(DefaultCodeFormatterConstants.FORMATTER_INDENT_SWITCHSTATEMENTS_COMPARE_TO_SWITCH, this.indent_switchstatements_compare_to_switch ? DefaultCodeFormatterConstants.TRUE : DefaultCodeFormatterConstants.FALSE);
 		options.put(DefaultCodeFormatterConstants.FORMATTER_INDENTATION_SIZE, Integer.toString(this.indentation_size));
 		options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_NEW_LINE_AFTER_ANNOTATION_ON_TYPE, this.insert_new_line_after_annotation_on_type ? JavaCore.INSERT : JavaCore.DO_NOT_INSERT);
+		options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_NEW_LINE_AFTER_TYPE_ANNOTATION, this.insert_new_line_after_type_annotation ? JavaCore.INSERT : JavaCore.DO_NOT_INSERT);
 		options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_NEW_LINE_AFTER_ANNOTATION_ON_FIELD, this.insert_new_line_after_annotation_on_field ? JavaCore.INSERT : JavaCore.DO_NOT_INSERT);
 		options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_NEW_LINE_AFTER_ANNOTATION_ON_METHOD, this.insert_new_line_after_annotation_on_method ? JavaCore.INSERT : JavaCore.DO_NOT_INSERT);
 		options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_NEW_LINE_AFTER_ANNOTATION_ON_PACKAGE, this.insert_new_line_after_annotation_on_package ? JavaCore.INSERT : JavaCore.DO_NOT_INSERT);
@@ -1144,6 +1143,10 @@
 				this.blank_lines_at_beginning_of_method_body = 0;
 			}
 		}
+		final Object insertNewLineAfterTypeAnnotationOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_INSERT_NEW_LINE_AFTER_TYPE_ANNOTATION);
+		if (insertNewLineAfterTypeAnnotationOption != null) {
+			this.insert_new_line_after_type_annotation = JavaCore.INSERT.equals(insertNewLineAfterTypeAnnotationOption);
+		}
 		setDeprecatedOptions(settings);
 		final Object commentFormatJavadocCommentOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_COMMENT_FORMAT_JAVADOC_COMMENT);
 		if (commentFormatJavadocCommentOption != null) {
@@ -2278,6 +2281,7 @@
 		this.indent_switchstatements_compare_to_switch = true;
 		this.indentation_size = 4;
 		this.insert_new_line_after_annotation_on_type = true;
+		this.insert_new_line_after_type_annotation = false;
 		this.insert_new_line_after_annotation_on_field = true;
 		this.insert_new_line_after_annotation_on_method = true;
 		this.insert_new_line_after_annotation_on_package = true;
@@ -2568,6 +2572,7 @@
 		this.indent_switchstatements_compare_to_switch = false;
 		this.indentation_size = 4;
 		this.insert_new_line_after_annotation_on_type = true;
+		this.insert_new_line_after_type_annotation = false;
 		this.insert_new_line_after_annotation_on_field = true;
 		this.insert_new_line_after_annotation_on_method = true;
 		this.insert_new_line_after_annotation_on_package = true;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe.java
index 9e24997..d9444f6 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/Scribe.java
@@ -1,19 +1,16 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
  * 
- * This is an implementation of an early-draft specification developed under the Java
- * Community Process (JCP) and is made available for testing and evaluation purposes
- * only. The code is not compatible with any specification of the JCP.
- * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Ray V. (voidstar@gmail.com) - Contribution for bug 282988
  *     Jesper S Moller - Contribution for bug 402892
  *                       Contribution for bug 402818
+ *     Robin Stocker - Bug 49619 - [formatting] comment formatter leaves whitespace in comments
  *******************************************************************************/
 package org.aspectj.org.eclipse.jdt.internal.formatter;
 
@@ -59,6 +56,7 @@
  * This class is responsible for dumping formatted source
  * @since 2.1
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class Scribe implements IJavaDocTagConstants {
 
 	private static final int INITIAL_SIZE = 100;
@@ -2334,6 +2332,7 @@
 		try {
 			int read= reader.read(buf);
 			convertedSnippet = new String(buf, 0, read);
+			reader.close();
 		} catch (IOException e) {
 			// should not happen
 			CommentFormatterUtil.log(e);
@@ -2368,6 +2367,7 @@
 						this.codeSnippetBuffer.append(buf, 0, l);
 				} while (l > 0);
 				formattedSnippet = this.codeSnippetBuffer.toString();
+				javaReader.close();
 			} catch (IOException e) {
 				// should not happen
 				CommentFormatterUtil.log(e);
@@ -3718,8 +3718,10 @@
 						if (linesGap > 0) {
 							this.javadocGapLinesBuffer.setLength(0);
 							if (lineCount > 0) {
-								// TODO https://bugs.eclipse.org/bugs/show_bug.cgi?id=49619
-								this.javadocGapLinesBuffer.append( ' ');
+								// only add trailing space if one was there before (bug 49619)
+								if (this.scanner.source[start] == ' ') {
+									this.javadocGapLinesBuffer.append(' ');
+								}
 							}
 							for (int i = 0; i < linesGap ; i++) {
 								if (clearBlankLines && lineCount >= newLines) {
@@ -3727,9 +3729,9 @@
 									// so remove any remaining blanks and leave
 									if (textEndPosition >= start) {
 										if (output == null) {
-											addReplaceEdit(start, textEndPosition, this.javadocGapLinesBuffer.toString());
+											addReplaceEdit(start, textEndPosition, " "); //$NON-NLS-1$
 										} else {
-											output.append(this.javadocGapLinesBuffer);
+											output.append(' ');
 										}
 									}
 									return;
@@ -3780,8 +3782,10 @@
 				// Insert new lines as not enough was encountered while scanning the whitespaces
 				this.javadocGapLinesBuffer.setLength(0);
 				if (lineCount > 0) {
-					// TODO https://bugs.eclipse.org/bugs/show_bug.cgi?id=49619
-					this.javadocGapLinesBuffer.append( ' ');
+					// only add trailing space if one was there before (bug 49619)
+					if (this.scanner.source[start] == ' ') {
+						this.javadocGapLinesBuffer.append(' ');
+					}
 				}
 				for (int i = lineCount; i < newLines-1; i++) {
 					printJavadocNewLine(this.javadocGapLinesBuffer);
@@ -3811,8 +3815,10 @@
 					this.javadocGapLinesBuffer.setLength(0);
 					if (this.scanner.linePtr > linePtr) {
 						if (lineCount > 0) {
-							// TODO https://bugs.eclipse.org/bugs/show_bug.cgi?id=49619
-							this.javadocGapLinesBuffer.append(' ');
+							// only add trailing space if one was there before (bug 49619)
+							if (this.scanner.source[start] == ' ') {
+								this.javadocGapLinesBuffer.append(' ');
+							}
 						}
 						this.javadocGapLinesBuffer.append(this.lineSeparator);
 						this.column = 1;
@@ -4530,11 +4536,11 @@
 		}
     }
 
-	public void printModifiers(Annotation[] annotations, ASTVisitor visitor) {
-		printModifiers(annotations, visitor, ICodeFormatterConstants.ANNOTATION_UNSPECIFIED);
+	public void printModifiers(Annotation[] annotations, ASTVisitor visitor, int annotationSourceKind) {
+		printModifiers(annotations, visitor, annotationSourceKind, false);
 	}
 
-	public void printModifiers(Annotation[] annotations, ASTVisitor visitor, int annotationSourceKind) {
+	public void printModifiers(Annotation[] annotations, ASTVisitor visitor, int annotationSourceKind, boolean firstIsTypeAnnotation) {
 		try {
 			int annotationsLength = annotations != null ? annotations.length : 0;
 			int annotationsIndex = 0;
@@ -4542,6 +4548,7 @@
 			int currentTokenStartPosition = this.scanner.currentPosition;
 			boolean hasComment = false;
 			boolean hasModifiers = false;
+			boolean treatNextAsTypeAnnotation = firstIsTypeAnnotation;
 			while ((this.currentToken = this.scanner.getNextToken()) != TerminalTokens.TokenNameEOF) {
 				int foundTaskCount = this.scanner.foundTaskCount;
 				int tokenStartPosition = this.scanner.getCurrentTokenStartPosition();
@@ -4560,6 +4567,7 @@
 					case TerminalTokens.TokenNamevolatile :
 					case TerminalTokens.TokenNamestrictfp :
 						hasModifiers = true;
+						treatNextAsTypeAnnotation = true;
 						print(this.scanner.currentPosition - this.scanner.startPosition, !isFirstModifier);
 						isFirstModifier = false;
 						currentTokenStartPosition = this.scanner.currentPosition;
@@ -4583,34 +4591,34 @@
 							boolean shouldAddNewLine = false;
 							switch (annotationSourceKind) {
 								case ICodeFormatterConstants.ANNOTATION_ON_TYPE :
-									if (this.formatter.preferences.insert_new_line_after_annotation_on_type) {
-										shouldAddNewLine = true;
-									}
+									shouldAddNewLine = treatNextAsTypeAnnotation
+											? this.formatter.preferences.insert_new_line_after_type_annotation
+											: this.formatter.preferences.insert_new_line_after_annotation_on_type;
 									break;
 								case ICodeFormatterConstants.ANNOTATION_ON_FIELD :
-									if (this.formatter.preferences.insert_new_line_after_annotation_on_field) {
-										shouldAddNewLine = true;
-									}
+									shouldAddNewLine = treatNextAsTypeAnnotation
+											? this.formatter.preferences.insert_new_line_after_type_annotation
+											: this.formatter.preferences.insert_new_line_after_annotation_on_field;
 									break;
 								case ICodeFormatterConstants.ANNOTATION_ON_METHOD :
-									if (this.formatter.preferences.insert_new_line_after_annotation_on_method) {
-										shouldAddNewLine = true;
-									}
+									shouldAddNewLine = treatNextAsTypeAnnotation
+											? this.formatter.preferences.insert_new_line_after_type_annotation
+											: this.formatter.preferences.insert_new_line_after_annotation_on_method;
 									break;
 								case ICodeFormatterConstants.ANNOTATION_ON_PACKAGE :
-									if (this.formatter.preferences.insert_new_line_after_annotation_on_package) {
-										shouldAddNewLine = true;
-									}
+									shouldAddNewLine = treatNextAsTypeAnnotation
+											? this.formatter.preferences.insert_new_line_after_type_annotation
+											: this.formatter.preferences.insert_new_line_after_annotation_on_package;
 									break;
 								case ICodeFormatterConstants.ANNOTATION_ON_PARAMETER :
-									if (this.formatter.preferences.insert_new_line_after_annotation_on_parameter) {
-										shouldAddNewLine = true;
-									}
+									shouldAddNewLine = treatNextAsTypeAnnotation
+											? this.formatter.preferences.insert_new_line_after_type_annotation
+											: this.formatter.preferences.insert_new_line_after_annotation_on_parameter;
 									break;
 								case ICodeFormatterConstants.ANNOTATION_ON_LOCAL_VARIABLE :
-									if (this.formatter.preferences.insert_new_line_after_annotation_on_local_variable) {
-										shouldAddNewLine = true;
-									}
+									shouldAddNewLine = treatNextAsTypeAnnotation
+											? this.formatter.preferences.insert_new_line_after_type_annotation
+											: this.formatter.preferences.insert_new_line_after_annotation_on_local_variable;
 									break;
 								default:
 									// do nothing when no annotation formatting option specified
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil.java
index ba79771..95d796f 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/CommentFormatterUtil.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
@@ -30,6 +30,7 @@
  *
  * @since 3.1
  */
+@SuppressWarnings("rawtypes")
 public class CommentFormatterUtil {
 
 	/**
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/HTMLEntity2JavaReader.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/HTMLEntity2JavaReader.java
index 0d1382c..820e580 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/HTMLEntity2JavaReader.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/HTMLEntity2JavaReader.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
@@ -25,6 +25,7 @@
  *
  * @since 3.0
  */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class HTMLEntity2JavaReader extends SubstitutionTextReader {
 
 	/** The hard-coded entity map. */
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/Java2HTMLEntityReader.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/Java2HTMLEntityReader.java
index 63473bb..72aed81 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/Java2HTMLEntityReader.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/comment/Java2HTMLEntityReader.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
@@ -25,6 +25,7 @@
  *
  * @since 3.0
  */
+@SuppressWarnings({"rawtypes", "unchecked"})
 public class Java2HTMLEntityReader extends SubstitutionTextReader {
 
 	private static final int BEGIN_LINE = 0x01;
diff --git a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/old/CodeFormatter.java b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/old/CodeFormatter.java
index c5d3bc2..56e81f3 100644
--- a/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/old/CodeFormatter.java
+++ b/org.aspectj.ajde/source/org/aspectj/org/eclipse/jdt/internal/formatter/old/CodeFormatter.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
@@ -26,6 +26,7 @@
  * It will return the formatted string.</ul>
  * @deprecated
 */
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class CodeFormatter implements TerminalTokens, org.aspectj.org.eclipse.jdt.core.ICodeFormatter {
 
 	private Map options;
diff --git a/org.aspectj.ajde/source/org/aspectj/tools/ant/taskdefs/AjcTask.java b/org.aspectj.ajde/source/org/aspectj/tools/ant/taskdefs/AjcTask.java
index 0433a7e..043830c 100644
--- a/org.aspectj.ajde/source/org/aspectj/tools/ant/taskdefs/AjcTask.java
+++ b/org.aspectj.ajde/source/org/aspectj/tools/ant/taskdefs/AjcTask.java
@@ -253,9 +253,9 @@
 
 	public static final String COMMAND_EDITOR_NAME = AjcTask.class.getName() + ".COMMAND_EDITOR";
 
-	static final String[] TARGET_INPUTS = new String[] { "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7" };
-	static final String[] SOURCE_INPUTS = new String[] { "1.3", "1.4", "1.5", "1.6", "1.7" };
-	static final String[] COMPLIANCE_INPUTS = new String[] { "-1.3", "-1.4", "-1.5", "-1.6", "-1.7" };
+	static final String[] TARGET_INPUTS = new String[] { "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8" };
+	static final String[] SOURCE_INPUTS = new String[] { "1.3", "1.4", "1.5", "1.6", "1.7", "1.8" };
+	static final String[] COMPLIANCE_INPUTS = new String[] { "-1.3", "-1.4", "-1.5", "-1.6", "-1.7", "-1.8" };
 
 	private static final ICommandEditor COMMAND_EDITOR;
 
diff --git a/org.aspectj.runtime/classes/org/aspectj/internal/lang/reflect/StringToType.class b/org.aspectj.runtime/classes/org/aspectj/internal/lang/reflect/StringToType.class
index 3cd6352..2f078bd 100644
--- a/org.aspectj.runtime/classes/org/aspectj/internal/lang/reflect/StringToType.class
+++ b/org.aspectj.runtime/classes/org/aspectj/internal/lang/reflect/StringToType.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/META-INF/MANIFEST.MF b/org.aspectj.weaver/classes/META-INF/MANIFEST.MF
index 983f3f0..5ba5d81 100644
--- a/org.aspectj.weaver/classes/META-INF/MANIFEST.MF
+++ b/org.aspectj.weaver/classes/META-INF/MANIFEST.MF
@@ -1,10 +1,10 @@
 Manifest-Version: 1.0
 Name: org/aspectj/weaver/
 Specification-Title: AspectJ Weaver Classes
-Specification-Version: 1.8.0.M1
+Specification-Version: 1.8.0.RC3
 Specification-Vendor: aspectj.org
 Implementation-Title: org.aspectj.weaver
-Implementation-Version: 1.8.0.M1
+Implementation-Version: 1.8.0.RC3
 Implementation-Vendor: aspectj.org
 Premain-Class: org.aspectj.weaver.loadtime.Agent
 Can-Redefine-Classes: true
diff --git a/org.aspectj.weaver/classes/aj/org/objectweb/asm/ByteVector.class b/org.aspectj.weaver/classes/aj/org/objectweb/asm/ByteVector.class
index 736c52c..dc19879 100644
--- a/org.aspectj.weaver/classes/aj/org/objectweb/asm/ByteVector.class
+++ b/org.aspectj.weaver/classes/aj/org/objectweb/asm/ByteVector.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/aj/org/objectweb/asm/ClassReader.class b/org.aspectj.weaver/classes/aj/org/objectweb/asm/ClassReader.class
index 4ad8850..5116584 100644
--- a/org.aspectj.weaver/classes/aj/org/objectweb/asm/ClassReader.class
+++ b/org.aspectj.weaver/classes/aj/org/objectweb/asm/ClassReader.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/aj/org/objectweb/asm/ClassWriter.class b/org.aspectj.weaver/classes/aj/org/objectweb/asm/ClassWriter.class
index cb45dc6..44f8be6 100644
--- a/org.aspectj.weaver/classes/aj/org/objectweb/asm/ClassWriter.class
+++ b/org.aspectj.weaver/classes/aj/org/objectweb/asm/ClassWriter.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/aj/org/objectweb/asm/Frame.class b/org.aspectj.weaver/classes/aj/org/objectweb/asm/Frame.class
index e3ec79f..c7811d7 100644
--- a/org.aspectj.weaver/classes/aj/org/objectweb/asm/Frame.class
+++ b/org.aspectj.weaver/classes/aj/org/objectweb/asm/Frame.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/aj/org/objectweb/asm/MethodVisitor.class b/org.aspectj.weaver/classes/aj/org/objectweb/asm/MethodVisitor.class
index 0913a45..4318ff0 100644
--- a/org.aspectj.weaver/classes/aj/org/objectweb/asm/MethodVisitor.class
+++ b/org.aspectj.weaver/classes/aj/org/objectweb/asm/MethodVisitor.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/aj/org/objectweb/asm/MethodWriter.class b/org.aspectj.weaver/classes/aj/org/objectweb/asm/MethodWriter.class
index 6321ea6..d997456 100644
--- a/org.aspectj.weaver/classes/aj/org/objectweb/asm/MethodWriter.class
+++ b/org.aspectj.weaver/classes/aj/org/objectweb/asm/MethodWriter.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/aj/org/objectweb/asm/Type.class b/org.aspectj.weaver/classes/aj/org/objectweb/asm/Type.class
index 78963c8..20c4413 100644
--- a/org.aspectj.weaver/classes/aj/org/objectweb/asm/Type.class
+++ b/org.aspectj.weaver/classes/aj/org/objectweb/asm/Type.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/aj/org/objectweb/asm/TypeReference.class b/org.aspectj.weaver/classes/aj/org/objectweb/asm/TypeReference.class
index 20c3784..a2a857f 100644
--- a/org.aspectj.weaver/classes/aj/org/objectweb/asm/TypeReference.class
+++ b/org.aspectj.weaver/classes/aj/org/objectweb/asm/TypeReference.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/asm/internal/ProgramElement.class b/org.aspectj.weaver/classes/org/aspectj/asm/internal/ProgramElement.class
index 7d59362..08a5f39 100644
--- a/org.aspectj.weaver/classes/org/aspectj/asm/internal/ProgramElement.class
+++ b/org.aspectj.weaver/classes/org/aspectj/asm/internal/ProgramElement.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/bridge/IMessage$Kind$1.class b/org.aspectj.weaver/classes/org/aspectj/bridge/IMessage$Kind$1.class
index 9f6ac64..b987c5f 100644
--- a/org.aspectj.weaver/classes/org/aspectj/bridge/IMessage$Kind$1.class
+++ b/org.aspectj.weaver/classes/org/aspectj/bridge/IMessage$Kind$1.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/bridge/IMessage$Kind.class b/org.aspectj.weaver/classes/org/aspectj/bridge/IMessage$Kind.class
index b6de72e..ade252f 100644
--- a/org.aspectj.weaver/classes/org/aspectj/bridge/IMessage$Kind.class
+++ b/org.aspectj.weaver/classes/org/aspectj/bridge/IMessage$Kind.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/bridge/IMessageHandler.class b/org.aspectj.weaver/classes/org/aspectj/bridge/IMessageHandler.class
index 60ef7c9..9f91613 100644
--- a/org.aspectj.weaver/classes/org/aspectj/bridge/IMessageHandler.class
+++ b/org.aspectj.weaver/classes/org/aspectj/bridge/IMessageHandler.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/bridge/MessageUtil.class b/org.aspectj.weaver/classes/org/aspectj/bridge/MessageUtil.class
index 67970ff..e57e4de 100644
--- a/org.aspectj.weaver/classes/org/aspectj/bridge/MessageUtil.class
+++ b/org.aspectj.weaver/classes/org/aspectj/bridge/MessageUtil.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/bridge/Version.class b/org.aspectj.weaver/classes/org/aspectj/bridge/Version.class
index d07f070..b74c165 100644
--- a/org.aspectj.weaver/classes/org/aspectj/bridge/Version.class
+++ b/org.aspectj.weaver/classes/org/aspectj/bridge/Version.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/util/FileUtil.class b/org.aspectj.weaver/classes/org/aspectj/util/FileUtil.class
index 922afdb..92914c8 100644
--- a/org.aspectj.weaver/classes/org/aspectj/util/FileUtil.class
+++ b/org.aspectj.weaver/classes/org/aspectj/util/FileUtil.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$MaybeFuzzyBoolean.class b/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$MaybeFuzzyBoolean.class
index 5a8f8cb..7a5483f 100644
--- a/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$MaybeFuzzyBoolean.class
+++ b/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$MaybeFuzzyBoolean.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$NeverFuzzyBoolean.class b/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$NeverFuzzyBoolean.class
index dd4065f..22f336b 100644
--- a/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$NeverFuzzyBoolean.class
+++ b/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$NeverFuzzyBoolean.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$NoFuzzyBoolean.class b/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$NoFuzzyBoolean.class
index db6c764..4e84e72 100644
--- a/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$NoFuzzyBoolean.class
+++ b/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$NoFuzzyBoolean.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$YesFuzzyBoolean.class b/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$YesFuzzyBoolean.class
index 853b672..966dfad 100644
--- a/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$YesFuzzyBoolean.class
+++ b/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean$YesFuzzyBoolean.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean.class b/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean.class
index c68b1dd..d1532dc 100644
--- a/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean.class
+++ b/org.aspectj.weaver/classes/org/aspectj/util/FuzzyBoolean.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/util/LangUtil$ProcessController.class b/org.aspectj.weaver/classes/org/aspectj/util/LangUtil$ProcessController.class
index 12c642f..08a0669 100644
--- a/org.aspectj.weaver/classes/org/aspectj/util/LangUtil$ProcessController.class
+++ b/org.aspectj.weaver/classes/org/aspectj/util/LangUtil$ProcessController.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/Checker.class b/org.aspectj.weaver/classes/org/aspectj/weaver/Checker.class
index d442a24..63a50bf 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/Checker.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/Checker.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/Dump.class b/org.aspectj.weaver/classes/org/aspectj/weaver/Dump.class
index bf76910..909470f 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/Dump.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/Dump.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators$1.class b/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators$1.class
index 209980f..9f6b6ee 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators$1.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators$1.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators$4.class b/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators$4.class
index d8b0a7a..31b0b69 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators$4.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators$4.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators.class b/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators.class
index 4c939ff..fde6f38 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/Iterators.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/Lint$Kind.class b/org.aspectj.weaver/classes/org/aspectj/weaver/Lint$Kind.class
index 847f31f..c7aa961 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/Lint$Kind.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/Lint$Kind.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/Lint.class b/org.aspectj.weaver/classes/org/aspectj/weaver/Lint.class
index e851558..0bd21dc 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/Lint.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/Lint.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/MissingResolvedTypeWithKnownSignature.class b/org.aspectj.weaver/classes/org/aspectj/weaver/MissingResolvedTypeWithKnownSignature.class
index 1c8e2e2..d74b9b6 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/MissingResolvedTypeWithKnownSignature.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/MissingResolvedTypeWithKnownSignature.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/ReferenceType.class b/org.aspectj.weaver/classes/org/aspectj/weaver/ReferenceType.class
index 1e43e73..9fa8242 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/ReferenceType.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/ReferenceType.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/ResolvedType.class b/org.aspectj.weaver/classes/org/aspectj/weaver/ResolvedType.class
index eccb5c2..f7b1413 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/ResolvedType.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/ResolvedType.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/SourceContextImpl.class b/org.aspectj.weaver/classes/org/aspectj/weaver/SourceContextImpl.class
index d058de6..0217a41 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/SourceContextImpl.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/SourceContextImpl.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/UnresolvedType$TypeKind.class b/org.aspectj.weaver/classes/org/aspectj/weaver/UnresolvedType$TypeKind.class
index 86cc25d..84d4f20 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/UnresolvedType$TypeKind.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/UnresolvedType$TypeKind.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/UnresolvedType.class b/org.aspectj.weaver/classes/org/aspectj/weaver/UnresolvedType.class
index 64b00ae..e941391 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/UnresolvedType.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/UnresolvedType.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/World$AspectPrecedenceCalculator$PrecedenceCacheKey.class b/org.aspectj.weaver/classes/org/aspectj/weaver/World$AspectPrecedenceCalculator$PrecedenceCacheKey.class
index d24554c..df53a83 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/World$AspectPrecedenceCalculator$PrecedenceCacheKey.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/World$AspectPrecedenceCalculator$PrecedenceCacheKey.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/World$AspectPrecedenceCalculator.class b/org.aspectj.weaver/classes/org/aspectj/weaver/World$AspectPrecedenceCalculator.class
index 3420ea4..6f85ef9 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/World$AspectPrecedenceCalculator.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/World$AspectPrecedenceCalculator.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/World$TimeCollector.class b/org.aspectj.weaver/classes/org/aspectj/weaver/World$TimeCollector.class
index f58040d..5dd042f 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/World$TimeCollector.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/World$TimeCollector.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/World$TypeMap.class b/org.aspectj.weaver/classes/org/aspectj/weaver/World$TypeMap.class
index 660cdcd..b8c3327 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/World$TypeMap.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/World$TypeMap.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/World.class b/org.aspectj.weaver/classes/org/aspectj/weaver/World.class
index e78832e..16a81b2 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/World.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/World.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/AtAjAttributes.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/AtAjAttributes.class
index 18ff42a..b1e9c84 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/AtAjAttributes.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/AtAjAttributes.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelClassWeaver.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelClassWeaver.class
index 6889274..8e68e00 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelClassWeaver.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelClassWeaver.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelShadow.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelShadow.class
index 2add3cd..cb2ad099 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelShadow.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelShadow.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$1.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$1.class
index 8c8be17..62b747a 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$1.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$1.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$1AdviceLocation.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$1AdviceLocation.class
index f2c53b6..db5aa5d 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$1AdviceLocation.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$1AdviceLocation.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$2.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$2.class
index a5781b7..7558118 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$2.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$2.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$3.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$3.class
index c8bf4be..1aa807a 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$3.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$3.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$4$1.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$4$1.class
index 4c4f2bc..a987fce 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$4$1.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$4$1.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$4.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$4.class
index 100d2c9..3470ffc 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$4.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver$4.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver.class
index 0414892..ebcfff7 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/BcelWeaver.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/LazyClassGen.class b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/LazyClassGen.class
index 07ae545..ee8cb95 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/LazyClassGen.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/bcel/LazyClassGen.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.class b/org.aspectj.weaver/classes/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.class
index fd188a8..417626d 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/loadtime/WeavingURLClassLoader.class b/org.aspectj.weaver/classes/org/aspectj/weaver/loadtime/WeavingURLClassLoader.class
index 2589e91..7fda19a 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/loadtime/WeavingURLClassLoader.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/loadtime/WeavingURLClassLoader.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/AndPointcut.class b/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/AndPointcut.class
index 96a5af8..106f8e6 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/AndPointcut.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/AndPointcut.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/KindedPointcut.class b/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/KindedPointcut.class
index ad6943b..029d5bc 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/KindedPointcut.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/KindedPointcut.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/OrPointcut.class b/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/OrPointcut.class
index 5d589d2..23e391b 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/OrPointcut.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/OrPointcut.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/PerThisOrTargetPointcutVisitor.class b/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/PerThisOrTargetPointcutVisitor.class
index 99e0213..946d729 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/PerThisOrTargetPointcutVisitor.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/PerThisOrTargetPointcutVisitor.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/WithinPointcut.class b/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/WithinPointcut.class
index 2591bea..0eff8cb 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/WithinPointcut.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/patterns/WithinPointcut.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser.class
index 803bf7e..f15c686 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/StandardPointcutParser.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/StandardPointcutParser.class
index 66f12b1..c4007d7 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/StandardPointcutParser.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/StandardPointcutParser.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor$WeavingClassFileProvider.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor$WeavingClassFileProvider.class
index 45dc0c9..a41e97a 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor$WeavingClassFileProvider.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor$WeavingClassFileProvider.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor.class
index 2669d57..27f69f4 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/AsynchronousFileCacheBacking.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/AsynchronousFileCacheBacking.class
index 39e9d3f..f6151b4 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/AsynchronousFileCacheBacking.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/AsynchronousFileCacheBacking.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/DefaultFileCacheBacking.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/DefaultFileCacheBacking.class
index 57046b8..7505081 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/DefaultFileCacheBacking.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/DefaultFileCacheBacking.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/FlatFileCacheBacking.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/FlatFileCacheBacking.class
index 1bd4e79..7074797 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/FlatFileCacheBacking.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/FlatFileCacheBacking.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/ZippedFileCacheBacking.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/ZippedFileCacheBacking.class
index c412dd2..5229516 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/ZippedFileCacheBacking.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/cache/ZippedFileCacheBacking.class
Binary files differ
diff --git a/org.aspectj.weaver/source/org/aspectj/bridge/Version.java b/org.aspectj.weaver/source/org/aspectj/bridge/Version.java
index 0b8de7b..07e122c 100644
--- a/org.aspectj.weaver/source/org/aspectj/bridge/Version.java
+++ b/org.aspectj.weaver/source/org/aspectj/bridge/Version.java
@@ -30,14 +30,14 @@
     public static final long NOTIME = 0L;
     
     /** set by build script */
-    public static final String text = "1.8.0.M1";
+    public static final String text = "1.8.0.RC3";
     // VersionUptodate.java scans for "static final String text = "
     
     /** 
       * Time text set by build script using SIMPLE_DATE_FORMAT.
       * (if DEVELOPMENT version, invalid)
       */
-    public static final String time_text = "Friday Oct 18, 2013 at 18:56:27 GMT";
+    public static final String time_text = "Thursday Apr 10, 2014 at 00:02:53 GMT";
 
     /** 
       * time in seconds-since-... format, used by programmatic clients.
diff --git a/org.aspectj.weaver/source/org/aspectj/util/FuzzyBoolean.java b/org.aspectj.weaver/source/org/aspectj/util/FuzzyBoolean.java
index f47de92..807d980 100644
--- a/org.aspectj.weaver/source/org/aspectj/util/FuzzyBoolean.java
+++ b/org.aspectj.weaver/source/org/aspectj/util/FuzzyBoolean.java
@@ -34,7 +34,6 @@
             return true;
         }
 
-
         public boolean maybeFalse() {
             return false;
         }
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/Checker.java b/org.aspectj.weaver/source/org/aspectj/weaver/Checker.java
index 384c5d6..4a765a9 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/Checker.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/Checker.java
@@ -222,6 +222,22 @@
 			return shadow.toString();
 		} else if (key.equalsIgnoreCase("joinpoint.kind")) {
 			return shadow.getKind().getName();
+		} else if (key.equalsIgnoreCase("joinpoint.enclosingclass")) {
+			return shadow.getEnclosingType().getName();
+		} else if (key.equalsIgnoreCase("joinpoint.enclosingmember.name")) {
+			Member member = shadow.getEnclosingCodeSignature();
+			if (member==null) {
+				return "";
+			} else {
+				return member.getName();
+			}
+		} else if (key.equalsIgnoreCase("joinpoint.enclosingmember")) {
+			Member member = shadow.getEnclosingCodeSignature();
+			if (member==null) {
+				return "";
+			} else {
+				return member.toString();
+			}
 		} else if (key.equalsIgnoreCase("joinpoint.signature")) {
 			return shadow.getSignature().toString();
 		} else if (key.equalsIgnoreCase("joinpoint.signature.declaringtype")) {
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/Lint.java b/org.aspectj.weaver/source/org/aspectj/weaver/Lint.java
index d68ce41..36d6475 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/Lint.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/Lint.java
@@ -166,6 +166,18 @@
 			kind.setKind(messageKind);
 		}
 	}
+	
+	public void setFromMap(Map<String,String> lintOptionsMap) {
+		for (String key: lintOptionsMap.keySet()) {
+			String value = lintOptionsMap.get(key);
+			Kind kind = kinds.get(key);
+			if (kind == null) {
+				MessageUtil.error(world.getMessageHandler(), WeaverMessages.format(WeaverMessages.XLINT_KEY_ERROR, key));
+			} else {
+				kind.setKind(getMessageKind(value));
+			}
+		}
+	}
 
 	public void setFromProperties(File file) {
 		if (trace.isTraceEnabled()) {
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/ReferenceType.java b/org.aspectj.weaver/source/org/aspectj/weaver/ReferenceType.java
index 420c73e..d97497f 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/ReferenceType.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/ReferenceType.java
@@ -24,27 +24,35 @@
 import org.aspectj.weaver.patterns.PerClause;
 
 /**
- * A reference type represents some 'real' type, not a primitive, not an array - but a real type, for example java.util.List. Each
- * ReferenceType has a delegate that is the underlying artifact - either an eclipse artifact or a bcel artifact. If the type
- * represents a raw type (i.e. there is a generic form) then the genericType field is set to point to the generic type. If it is for
- * a parameterized type then the generic type is also set to point to the generic form.
+ * A reference type represents some 'real' type, not a primitive, not an array -
+ * but a real type, for example java.util.List. Each ReferenceType has a
+ * delegate that is the underlying artifact - either an eclipse artifact or a
+ * bcel artifact. If the type represents a raw type (i.e. there is a generic
+ * form) then the genericType field is set to point to the generic type. If it
+ * is for a parameterized type then the generic type is also set to point to the
+ * generic form.
  */
 public class ReferenceType extends ResolvedType {
 
 	public static final ReferenceType[] EMPTY_ARRAY = new ReferenceType[0];
 
 	/**
-	 * For generic types, this list holds references to all the derived raw and parameterized versions. We need this so that if the
-	 * generic delegate is swapped during incremental compilation, the delegate of the derivatives is swapped also.
+	 * For generic types, this list holds references to all the derived raw and
+	 * parameterized versions. We need this so that if the generic delegate is
+	 * swapped during incremental compilation, the delegate of the derivatives
+	 * is swapped also.
 	 */
 	private final List<WeakReference<ReferenceType>> derivativeTypes = new ArrayList<WeakReference<ReferenceType>>();
 
 	/**
-	 * For parameterized types (or the raw type) - this field points to the actual reference type from which they are derived.
+	 * For parameterized types (or the raw type) - this field points to the
+	 * actual reference type from which they are derived.
 	 */
 	ReferenceType genericType = null;
-	
-	ReferenceType rawType = null; // generic types have a pointer back to their raw variant (prevents GC of the raw from the typemap!)
+
+	ReferenceType rawType = null; // generic types have a pointer back to their
+									// raw variant (prevents GC of the raw from
+									// the typemap!)
 
 	ReferenceTypeDelegate delegate = null;
 	int startPos = 0;
@@ -54,18 +62,23 @@
 	ResolvedMember[] parameterizedMethods = null;
 	ResolvedMember[] parameterizedFields = null;
 	ResolvedMember[] parameterizedPointcuts = null;
-	WeakReference<ResolvedType[]> parameterizedInterfaces = new WeakReference<ResolvedType[]>(null);
+	WeakReference<ResolvedType[]> parameterizedInterfaces = new WeakReference<ResolvedType[]>(
+			null);
 	Collection<Declare> parameterizedDeclares = null;
 	// Collection parameterizedTypeMungers = null;
 
-	// During matching it can be necessary to temporary mark types as annotated. For example
-	// a declare @type may trigger a separate declare parents to match, and so the annotation
-	// is temporarily held against the referencetype, the annotation will be properly
+	// During matching it can be necessary to temporary mark types as annotated.
+	// For example
+	// a declare @type may trigger a separate declare parents to match, and so
+	// the annotation
+	// is temporarily held against the referencetype, the annotation will be
+	// properly
 	// added to the class during weaving.
 	private ResolvedType[] annotationTypes = null;
 	private AnnotationAJ[] annotations = null;
 
-	// Similarly these are temporary replacements and additions for the superclass and
+	// Similarly these are temporary replacements and additions for the
+	// superclass and
 	// superinterfaces
 	private ResolvedType newSuperclass;
 	private ResolvedType[] newInterfaces;
@@ -87,8 +100,10 @@
 	/**
 	 * Constructor used when creating a parameterized type.
 	 */
-	public ReferenceType(ResolvedType theGenericType, ResolvedType[] theParameters, World aWorld) {
-		super(makeParameterizedSignature(theGenericType, theParameters), theGenericType.signatureErasure, aWorld);
+	public ReferenceType(ResolvedType theGenericType,
+			ResolvedType[] theParameters, World aWorld) {
+		super(makeParameterizedSignature(theGenericType, theParameters),
+				theGenericType.signatureErasure, aWorld);
 		ReferenceType genericReferenceType = (ReferenceType) theGenericType;
 		this.typeParameters = theParameters;
 		this.genericType = genericReferenceType;
@@ -98,40 +113,43 @@
 	}
 
 	synchronized void addDependentType(ReferenceType dependent) {
-//		checkDuplicates(dependent);
+		// checkDuplicates(dependent);
 		synchronized (derivativeTypes) {
-			this.derivativeTypes.add(new WeakReference<ReferenceType>(dependent));
+			this.derivativeTypes
+					.add(new WeakReference<ReferenceType>(dependent));
 		}
 	}
-			
+
 	public void checkDuplicates(ReferenceType newRt) {
 		synchronized (derivativeTypes) {
-			  List<WeakReference<ReferenceType>> forRemoval = new ArrayList<WeakReference<ReferenceType>>();
-			  for (WeakReference<ReferenceType> derivativeTypeReference: derivativeTypes) {
-				  ReferenceType derivativeType = derivativeTypeReference.get();
-				  if (derivativeType==null) {
-					  forRemoval.add(derivativeTypeReference);
-				  } else {
-					  if (derivativeType.getTypekind()!=newRt.getTypekind()) {
-						  continue; // cannot be this one
-					  }
-					  if (equal2(newRt.getTypeParameters(),derivativeType.getTypeParameters())) {
-						  if (TypeMap.useExpendableMap) {
-							  throw new IllegalStateException();
-						  }
-					  }
-				  }
-			  }
-			  derivativeTypes.removeAll(forRemoval);
+			List<WeakReference<ReferenceType>> forRemoval = new ArrayList<WeakReference<ReferenceType>>();
+			for (WeakReference<ReferenceType> derivativeTypeReference : derivativeTypes) {
+				ReferenceType derivativeType = derivativeTypeReference.get();
+				if (derivativeType == null) {
+					forRemoval.add(derivativeTypeReference);
+				} else {
+					if (derivativeType.getTypekind() != newRt.getTypekind()) {
+						continue; // cannot be this one
+					}
+					if (equal2(newRt.getTypeParameters(),
+							derivativeType.getTypeParameters())) {
+						if (TypeMap.useExpendableMap) {
+							throw new IllegalStateException();
+						}
+					}
+				}
+			}
+			derivativeTypes.removeAll(forRemoval);
 		}
 	}
-	
-	private boolean equal2(UnresolvedType[] typeParameters, UnresolvedType[] resolvedParameters) {
-		if (typeParameters.length!=resolvedParameters.length)  {
+
+	private boolean equal2(UnresolvedType[] typeParameters,
+			UnresolvedType[] resolvedParameters) {
+		if (typeParameters.length != resolvedParameters.length) {
 			return false;
 		}
 		int len = typeParameters.length;
-		for (int p=0;p<len;p++) {
+		for (int p = 0; p < len; p++) {
 			if (!typeParameters[p].equals(resolvedParameters[p])) {
 				return false;
 			}
@@ -153,7 +171,7 @@
 	public ReferenceType(UnresolvedType genericType, World world) {
 		super(genericType.getSignature(), world);
 		typeKind = TypeKind.GENERIC;
-		this.typeVariables=genericType.typeVariables;
+		this.typeVariables = genericType.typeVariables;
 	}
 
 	@Override
@@ -168,7 +186,8 @@
 
 	@Override
 	public boolean isGenericType() {
-		return !isParameterizedType() && !isRawType() && getDelegate().isGeneric();
+		return !isParameterizedType() && !isRawType()
+				&& getDelegate().isGeneric();
 	}
 
 	public String getGenericSignature() {
@@ -184,10 +203,11 @@
 	@Override
 	public void addAnnotation(AnnotationAJ annotationX) {
 		if (annotations == null) {
-			annotations = new AnnotationAJ[]{annotationX};
+			annotations = new AnnotationAJ[] { annotationX };
 		} else {
 			AnnotationAJ[] newAnnotations = new AnnotationAJ[annotations.length + 1];
-			System.arraycopy(annotations, 0, newAnnotations, 1, annotations.length);
+			System.arraycopy(annotations, 0, newAnnotations, 1,
+					annotations.length);
 			newAnnotations[0] = annotationX;
 			annotations = newAnnotations;
 		}
@@ -215,7 +235,8 @@
 			annotationTypes[0] = ofType;
 		} else {
 			ResolvedType[] newAnnotationTypes = new ResolvedType[annotationTypes.length + 1];
-			System.arraycopy(annotationTypes, 0, newAnnotationTypes, 1, annotationTypes.length);
+			System.arraycopy(annotationTypes, 0, newAnnotationTypes, 1,
+					annotationTypes.length);
 			newAnnotationTypes[0] = ofType;
 			annotationTypes = newAnnotationTypes;
 		}
@@ -224,16 +245,21 @@
 	@Override
 	public ResolvedType[] getAnnotationTypes() {
 		if (getDelegate() == null) {
-			throw new BCException("Unexpected null delegate for type " + this.getName());
+			throw new BCException("Unexpected null delegate for type "
+					+ this.getName());
 		}
 		if (annotationTypes == null) {
 			// there are no extras:
 			return getDelegate().getAnnotationTypes();
 		} else {
-			ResolvedType[] delegateAnnotationTypes = getDelegate().getAnnotationTypes();
-			ResolvedType[] result = new ResolvedType[annotationTypes.length + delegateAnnotationTypes.length];
-			System.arraycopy(delegateAnnotationTypes, 0, result, 0, delegateAnnotationTypes.length);
-			System.arraycopy(annotationTypes, 0, result, delegateAnnotationTypes.length, annotationTypes.length);
+			ResolvedType[] delegateAnnotationTypes = getDelegate()
+					.getAnnotationTypes();
+			ResolvedType[] result = new ResolvedType[annotationTypes.length
+					+ delegateAnnotationTypes.length];
+			System.arraycopy(delegateAnnotationTypes, 0, result, 0,
+					delegateAnnotationTypes.length);
+			System.arraycopy(annotationTypes, 0, result,
+					delegateAnnotationTypes.length, annotationTypes.length);
 			return result;
 		}
 	}
@@ -331,7 +357,8 @@
 		}
 
 		if (this.isParameterizedType() && other.isRawType()) {
-			return ((ReferenceType) this.getRawType()).isCoerceableFrom(other.getGenericType());
+			return ((ReferenceType) this.getRawType()).isCoerceableFrom(other
+					.getGenericType());
 		}
 
 		if (this.isRawType() && other.isParameterizedType()) {
@@ -364,28 +391,33 @@
 		}
 		ResolvedType myRawType = getRawType();
 		ResolvedType theirRawType = other.getRawType();
-		if (myRawType == theirRawType || myRawType.isCoerceableFrom(theirRawType)) {
+		if (myRawType == theirRawType
+				|| myRawType.isCoerceableFrom(theirRawType)) {
 			if (getTypeParameters().length == other.getTypeParameters().length) {
 				// there's a chance it can be done
 				ResolvedType[] myTypeParameters = getResolvedTypeParameters();
-				ResolvedType[] theirTypeParameters = other.getResolvedTypeParameters();
+				ResolvedType[] theirTypeParameters = other
+						.getResolvedTypeParameters();
 				for (int i = 0; i < myTypeParameters.length; i++) {
 					if (myTypeParameters[i] != theirTypeParameters[i]) {
 						// thin ice now... but List<String> may still be
 						// coerceable from e.g. List<T>
 						if (myTypeParameters[i].isGenericWildcard()) {
 							BoundedReferenceType wildcard = (BoundedReferenceType) myTypeParameters[i];
-							if (!wildcard.canBeCoercedTo(theirTypeParameters[i])) {
+							if (!wildcard
+									.canBeCoercedTo(theirTypeParameters[i])) {
 								return false;
 							}
-						} else if (myTypeParameters[i].isTypeVariableReference()) {
+						} else if (myTypeParameters[i]
+								.isTypeVariableReference()) {
 							TypeVariableReferenceType tvrt = (TypeVariableReferenceType) myTypeParameters[i];
 							TypeVariable tv = tvrt.getTypeVariable();
 							tv.resolve(world);
 							if (!tv.canBeBoundTo(theirTypeParameters[i])) {
 								return false;
 							}
-						} else if (theirTypeParameters[i].isTypeVariableReference()) {
+						} else if (theirTypeParameters[i]
+								.isTypeVariableReference()) {
 							TypeVariableReferenceType tvrt = (TypeVariableReferenceType) theirTypeParameters[i];
 							TypeVariable tv = tvrt.getTypeVariable();
 							tv.resolve(world);
@@ -431,7 +463,8 @@
 			if (!world.isInJava5Mode()) {
 				return false;
 			}
-			if (ResolvedType.validBoxing.contains(this.getSignature() + other.getSignature())) {
+			if (ResolvedType.validBoxing.contains(this.getSignature()
+					+ other.getSignature())) {
 				return true;
 			}
 		}
@@ -443,7 +476,8 @@
 			return true;
 		}
 
-		if (!isTypeVariableReference() && other.getSignature().equals("Ljava/lang/Object;")) {
+		if (!isTypeVariableReference()
+				&& other.getSignature().equals("Ljava/lang/Object;")) {
 			return false;
 		}
 
@@ -476,28 +510,38 @@
 					return true;
 				}
 				// we have to match by parameters one at a time
-				ResolvedType[] theirParameters = other.getResolvedTypeParameters();
+				ResolvedType[] theirParameters = other
+						.getResolvedTypeParameters();
 				boolean parametersAssignable = true;
 				if (myParameters.length == theirParameters.length) {
-					for (int i = 0; i < myParameters.length && parametersAssignable; i++) {
+					for (int i = 0; i < myParameters.length
+							&& parametersAssignable; i++) {
 						if (myParameters[i] == theirParameters[i]) {
 							continue;
 						}
 						// dont do this: pr253109
-						// if (myParameters[i].isAssignableFrom(theirParameters[i], allowMissing)) {
+						// if
+						// (myParameters[i].isAssignableFrom(theirParameters[i],
+						// allowMissing)) {
 						// continue;
 						// }
 						ResolvedType mp = myParameters[i];
 						ResolvedType tp = theirParameters[i];
-						if (mp.isParameterizedType() && tp.isParameterizedType()) {
+						if (mp.isParameterizedType()
+								&& tp.isParameterizedType()) {
 							if (mp.getGenericType().equals(tp.getGenericType())) {
 								UnresolvedType[] mtps = mp.getTypeParameters();
 								UnresolvedType[] ttps = tp.getTypeParameters();
 								for (int ii = 0; ii < mtps.length; ii++) {
-									if (mtps[ii].isTypeVariableReference() && ttps[ii].isTypeVariableReference()) {
-										TypeVariable mtv = ((TypeVariableReferenceType) mtps[ii]).getTypeVariable();
-										boolean b = mtv.canBeBoundTo((ResolvedType) ttps[ii]);
-										if (!b) {// TODO incomplete testing here I think
+									if (mtps[ii].isTypeVariableReference()
+											&& ttps[ii]
+													.isTypeVariableReference()) {
+										TypeVariable mtv = ((TypeVariableReferenceType) mtps[ii])
+												.getTypeVariable();
+										boolean b = mtv
+												.canBeBoundTo((ResolvedType) ttps[ii]);
+										if (!b) {// TODO incomplete testing here
+													// I think
 											parametersAssignable = false;
 											break;
 										}
@@ -512,9 +556,13 @@
 								break;
 							}
 						}
-						if (myParameters[i].isTypeVariableReference() && theirParameters[i].isTypeVariableReference()) {
-							TypeVariable myTV = ((TypeVariableReferenceType) myParameters[i]).getTypeVariable();
-							// TypeVariable theirTV = ((TypeVariableReferenceType) theirParameters[i]).getTypeVariable();
+						if (myParameters[i].isTypeVariableReference()
+								&& theirParameters[i].isTypeVariableReference()) {
+							TypeVariable myTV = ((TypeVariableReferenceType) myParameters[i])
+									.getTypeVariable();
+							// TypeVariable theirTV =
+							// ((TypeVariableReferenceType)
+							// theirParameters[i]).getTypeVariable();
 							boolean b = myTV.canBeBoundTo(theirParameters[i]);
 							if (!b) {// TODO incomplete testing here I think
 								parametersAssignable = false;
@@ -545,21 +593,27 @@
 
 		// eg this=T other=Ljava/lang/Object;
 		if (isTypeVariableReference() && !other.isTypeVariableReference()) {
-			TypeVariable aVar = ((TypeVariableReference) this).getTypeVariable();
+			TypeVariable aVar = ((TypeVariableReference) this)
+					.getTypeVariable();
 			return aVar.resolve(world).canBeBoundTo(other);
 		}
 
 		if (other.isTypeVariableReference()) {
 			TypeVariableReferenceType otherType = (TypeVariableReferenceType) other;
 			if (this instanceof TypeVariableReference) {
-				return ((TypeVariableReference) this).getTypeVariable().resolve(world)
-						.canBeBoundTo(otherType.getTypeVariable().getFirstBound().resolve(world));// pr171952
+				return ((TypeVariableReference) this)
+						.getTypeVariable()
+						.resolve(world)
+						.canBeBoundTo(
+								otherType.getTypeVariable().getFirstBound()
+										.resolve(world));// pr171952
 				// return
 				// ((TypeVariableReference)this).getTypeVariable()==otherType
 				// .getTypeVariable();
 			} else {
 				// FIXME asc should this say canBeBoundTo??
-				return this.isAssignableFrom(otherType.getTypeVariable().getFirstBound().resolve(world));
+				return this.isAssignableFrom(otherType.getTypeVariable()
+						.getFirstBound().resolve(world));
 			}
 		}
 
@@ -624,7 +678,8 @@
 			ResolvedMember[] delegateFields = getDelegate().getDeclaredFields();
 			parameterizedFields = new ResolvedMember[delegateFields.length];
 			for (int i = 0; i < delegateFields.length; i++) {
-				parameterizedFields[i] = delegateFields[i].parameterizedWith(getTypesForMemberParameterization(), this,
+				parameterizedFields[i] = delegateFields[i].parameterizedWith(
+						getTypesForMemberParameterization(), this,
 						isParameterizedType());
 			}
 			return parameterizedFields;
@@ -634,8 +689,9 @@
 	}
 
 	/**
-	 * Find out from the generic signature the true signature of any interfaces I implement. If I am parameterized, these may then
-	 * need to be parameterized before returning.
+	 * Find out from the generic signature the true signature of any interfaces
+	 * I implement. If I am parameterized, these may then need to be
+	 * parameterized before returning.
 	 */
 	@Override
 	public ResolvedType[] getDeclaredInterfaces() {
@@ -643,7 +699,8 @@
 		if (interfaces != null) {
 			return interfaces;
 		}
-		ResolvedType[] delegateInterfaces = getDelegate().getDeclaredInterfaces();
+		ResolvedType[] delegateInterfaces = getDelegate()
+				.getDeclaredInterfaces();
 		if (isRawType()) {
 			if (newInterfaces != null) {// debug 375777
 				throw new IllegalStateException(
@@ -652,17 +709,23 @@
 			}
 			ResolvedType[] newInterfacesFromGenericType = genericType.newInterfaces;
 			if (newInterfacesFromGenericType != null) {
-				ResolvedType[] extraInterfaces = new ResolvedType[delegateInterfaces.length + newInterfacesFromGenericType.length];
-				System.arraycopy(delegateInterfaces, 0, extraInterfaces, 0, delegateInterfaces.length);
-				System.arraycopy(newInterfacesFromGenericType, 0, extraInterfaces, delegateInterfaces.length,
+				ResolvedType[] extraInterfaces = new ResolvedType[delegateInterfaces.length
+						+ newInterfacesFromGenericType.length];
+				System.arraycopy(delegateInterfaces, 0, extraInterfaces, 0,
+						delegateInterfaces.length);
+				System.arraycopy(newInterfacesFromGenericType, 0,
+						extraInterfaces, delegateInterfaces.length,
 						newInterfacesFromGenericType.length);
 				delegateInterfaces = extraInterfaces;
 			}
 		} else if (newInterfaces != null) {
 			// OPTIMIZE does this part of the method trigger often?
-			ResolvedType[] extraInterfaces = new ResolvedType[delegateInterfaces.length + newInterfaces.length];
-			System.arraycopy(delegateInterfaces, 0, extraInterfaces, 0, delegateInterfaces.length);
-			System.arraycopy(newInterfaces, 0, extraInterfaces, delegateInterfaces.length, newInterfaces.length);
+			ResolvedType[] extraInterfaces = new ResolvedType[delegateInterfaces.length
+					+ newInterfaces.length];
+			System.arraycopy(delegateInterfaces, 0, extraInterfaces, 0,
+					delegateInterfaces.length);
+			System.arraycopy(newInterfaces, 0, extraInterfaces,
+					delegateInterfaces.length, newInterfaces.length);
 
 			delegateInterfaces = extraInterfaces;
 		}
@@ -676,12 +739,14 @@
 				// needs more or less than this type does. (pr124803/pr125080)
 
 				if (delegateInterfaces[i].isParameterizedType()) {
-					interfaces[i] = delegateInterfaces[i].parameterize(getMemberParameterizationMap()).resolve(world);
+					interfaces[i] = delegateInterfaces[i].parameterize(
+							getMemberParameterizationMap()).resolve(world);
 				} else {
 					interfaces[i] = delegateInterfaces[i];
 				}
 			}
-			parameterizedInterfaces = new WeakReference<ResolvedType[]>(interfaces);
+			parameterizedInterfaces = new WeakReference<ResolvedType[]>(
+					interfaces);
 			return interfaces;
 		} else if (isRawType()) {
 			UnresolvedType[] paramTypes = getTypesForMemberParameterization();
@@ -691,32 +756,41 @@
 				if (interfaces[i].isGenericType()) {
 					// a generic supertype of a raw type is replaced by its raw
 					// equivalent
-					interfaces[i] = interfaces[i].getRawType().resolve(getWorld());
+					interfaces[i] = interfaces[i].getRawType().resolve(
+							getWorld());
 				} else if (interfaces[i].isParameterizedType()) {
 					// a parameterized supertype collapses any type vars to
 					// their upper bounds
-					UnresolvedType[] toUseForParameterization = determineThoseTypesToUse(interfaces[i], paramTypes);
-					interfaces[i] = interfaces[i].parameterizedWith(toUseForParameterization);
+					UnresolvedType[] toUseForParameterization = determineThoseTypesToUse(
+							interfaces[i], paramTypes);
+					interfaces[i] = interfaces[i]
+							.parameterizedWith(toUseForParameterization);
 				}
 			}
-			parameterizedInterfaces = new WeakReference<ResolvedType[]>(interfaces);
+			parameterizedInterfaces = new WeakReference<ResolvedType[]>(
+					interfaces);
 			return interfaces;
 		}
 		if (getDelegate().isCacheable()) {
-			parameterizedInterfaces = new WeakReference<ResolvedType[]>(delegateInterfaces);
+			parameterizedInterfaces = new WeakReference<ResolvedType[]>(
+					delegateInterfaces);
 		}
 		return delegateInterfaces;
 	}
 
 	/**
-	 * It is possible this type has multiple type variables but the interface we are about to parameterize only uses a subset - this
-	 * method determines the subset to use by looking at the type variable names used. For example: <code>
+	 * It is possible this type has multiple type variables but the interface we
+	 * are about to parameterize only uses a subset - this method determines the
+	 * subset to use by looking at the type variable names used. For example:
+	 * <code>
 	 * class Foo<T extends String,E extends Number> implements SuperInterface<T> {}
 	 * </code> where <code>
 	 * interface SuperInterface<Z> {}
-	 * </code> In that example, a use of the 'Foo' raw type should know that it implements the SuperInterface<String>.
+	 * </code> In that example, a use of the 'Foo' raw type should know that it
+	 * implements the SuperInterface<String>.
 	 */
-	private UnresolvedType[] determineThoseTypesToUse(ResolvedType parameterizedInterface, UnresolvedType[] paramTypes) {
+	private UnresolvedType[] determineThoseTypesToUse(
+			ResolvedType parameterizedInterface, UnresolvedType[] paramTypes) {
 		// What are the type parameters for the supertype?
 		UnresolvedType[] tParms = parameterizedInterface.getTypeParameters();
 		UnresolvedType[] retVal = new UnresolvedType[tParms.length];
@@ -751,8 +825,9 @@
 	}
 
 	/**
-	 * Returns the position within the set of type variables for this type for the specified type variable name. Returns -1 if there
-	 * is no type variable with the specified name.
+	 * Returns the position within the set of type variables for this type for
+	 * the specified type variable name. Returns -1 if there is no type variable
+	 * with the specified name.
 	 */
 	private int getRank(String tvname) {
 		TypeVariable[] thisTypesTVars = getGenericType().getTypeVariables();
@@ -771,11 +846,13 @@
 			return parameterizedMethods;
 		}
 		if (isParameterizedType() || isRawType()) {
-			ResolvedMember[] delegateMethods = getDelegate().getDeclaredMethods();
+			ResolvedMember[] delegateMethods = getDelegate()
+					.getDeclaredMethods();
 			UnresolvedType[] parameters = getTypesForMemberParameterization();
 			parameterizedMethods = new ResolvedMember[delegateMethods.length];
 			for (int i = 0; i < delegateMethods.length; i++) {
-				parameterizedMethods[i] = delegateMethods[i].parameterizedWith(parameters, this, isParameterizedType());
+				parameterizedMethods[i] = delegateMethods[i].parameterizedWith(
+						parameters, this, isParameterizedType());
 			}
 			return parameterizedMethods;
 		} else {
@@ -789,11 +866,13 @@
 			return parameterizedPointcuts;
 		}
 		if (isParameterizedType()) {
-			ResolvedMember[] delegatePointcuts = getDelegate().getDeclaredPointcuts();
+			ResolvedMember[] delegatePointcuts = getDelegate()
+					.getDeclaredPointcuts();
 			parameterizedPointcuts = new ResolvedMember[delegatePointcuts.length];
 			for (int i = 0; i < delegatePointcuts.length; i++) {
-				parameterizedPointcuts[i] = delegatePointcuts[i].parameterizedWith(getTypesForMemberParameterization(), this,
-						isParameterizedType());
+				parameterizedPointcuts[i] = delegatePointcuts[i]
+						.parameterizedWith(getTypesForMemberParameterization(),
+								this, isParameterizedType());
 			}
 			return parameterizedPointcuts;
 		} else {
@@ -830,9 +909,11 @@
 	@Override
 	public PerClause getPerClause() {
 		PerClause pclause = getDelegate().getPerClause();
-		if (pclause != null && isParameterizedType()) { // could cache the result here...
+		if (pclause != null && isParameterizedType()) { // could cache the
+														// result here...
 			Map<String, UnresolvedType> parameterizationMap = getAjMemberParameterizationMap();
-			pclause = (PerClause) pclause.parameterizeWith(parameterizationMap, world);
+			pclause = (PerClause) pclause.parameterizeWith(parameterizationMap,
+					world);
 		}
 		return pclause;
 	}
@@ -848,7 +929,8 @@
 			parameterizedDeclares = new ArrayList<Declare>();
 			Map<String, UnresolvedType> parameterizationMap = getAjMemberParameterizationMap();
 			for (Declare declareStatement : genericDeclares) {
-				parameterizedDeclares.add(declareStatement.parameterizeWith(parameterizationMap, world));
+				parameterizedDeclares.add(declareStatement.parameterizeWith(
+						parameterizationMap, world));
 			}
 			declares = parameterizedDeclares;
 		} else {
@@ -875,7 +957,8 @@
 		return getDelegate().getModifiers();
 	}
 
-	WeakReference<ResolvedType> superclassReference = new WeakReference<ResolvedType>(null);
+	WeakReference<ResolvedType> superclassReference = new WeakReference<ResolvedType>(
+			null);
 
 	@Override
 	public ResolvedType getSuperclass() {
@@ -884,8 +967,10 @@
 		// return ret;
 		// }
 		if (newSuperclass != null) {
-			if (this.isParameterizedType() && newSuperclass.isParameterizedType()) {
-				return newSuperclass.parameterize(getMemberParameterizationMap()).resolve(getWorld());
+			if (this.isParameterizedType()
+					&& newSuperclass.isParameterizedType()) {
+				return newSuperclass.parameterize(
+						getMemberParameterizationMap()).resolve(getWorld());
 			}
 			if (getDelegate().isCacheable()) {
 				superclassReference = new WeakReference<ResolvedType>(ret);
@@ -899,7 +984,8 @@
 			world.setTypeVariableLookupScope(null);
 		}
 		if (this.isParameterizedType() && ret.isParameterizedType()) {
-			ret = ret.parameterize(getMemberParameterizationMap()).resolve(getWorld());
+			ret = ret.parameterize(getMemberParameterizationMap()).resolve(
+					getWorld());
 		}
 		if (getDelegate().isCacheable()) {
 			superclassReference = new WeakReference<ResolvedType>(ret);
@@ -914,16 +1000,18 @@
 	public void setDelegate(ReferenceTypeDelegate delegate) {
 		// Don't copy from BcelObjectType to EclipseSourceType - the context may
 		// be tidied (result null'd) after previous weaving
-		if (this.delegate != null && this.delegate.copySourceContext()
+		if (this.delegate != null
+				&& this.delegate.copySourceContext()
 				&& this.delegate.getSourceContext() != SourceContextImpl.UNKNOWN_SOURCE_CONTEXT) {
-			((AbstractReferenceTypeDelegate) delegate).setSourceContext(this.delegate.getSourceContext());
+			((AbstractReferenceTypeDelegate) delegate)
+					.setSourceContext(this.delegate.getSourceContext());
 		}
 		this.delegate = delegate;
 		synchronized (derivativeTypes) {
 			List<WeakReference<ReferenceType>> forRemoval = new ArrayList<WeakReference<ReferenceType>>();
 			for (WeakReference<ReferenceType> derivativeRef : derivativeTypes) {
 				ReferenceType derivative = derivativeRef.get();
-				if (derivative!=null) {
+				if (derivative != null) {
 					derivative.setDelegate(delegate);
 				} else {
 					forRemoval.add(derivativeRef);
@@ -997,8 +1085,9 @@
 			genericType.rawType = this;
 		}
 		if (this.isRawType() && rt.isRawType()) {
-			new RuntimeException("PR341926 diagnostics: Incorrect setup for a generic type, raw type should not point to raw: "
-					+ this.getName()).printStackTrace();
+			new RuntimeException(
+					"PR341926 diagnostics: Incorrect setup for a generic type, raw type should not point to raw: "
+							+ this.getName()).printStackTrace();
 		}
 	}
 
@@ -1017,13 +1106,15 @@
 	}
 
 	/**
-	 * a parameterized signature starts with a "P" in place of the "L", see the comment on signatures in UnresolvedType.
+	 * a parameterized signature starts with a "P" in place of the "L", see the
+	 * comment on signatures in UnresolvedType.
 	 * 
 	 * @param aGenericType
 	 * @param someParameters
 	 * @return
 	 */
-	private static String makeParameterizedSignature(ResolvedType aGenericType, ResolvedType[] someParameters) {
+	private static String makeParameterizedSignature(ResolvedType aGenericType,
+			ResolvedType[] someParameters) {
 		String rawSignature = aGenericType.getErasureSignature();
 		StringBuffer ret = new StringBuffer();
 		ret.append(PARAMETERIZED_TYPE_IDENTIFIER);
@@ -1036,19 +1127,24 @@
 		return ret.toString();
 	}
 
-	private static String makeDeclaredSignature(ResolvedType aGenericType, UnresolvedType[] someParameters) {
+	private static String makeDeclaredSignature(ResolvedType aGenericType,
+			UnresolvedType[] someParameters) {
 		StringBuffer ret = new StringBuffer();
 		String rawSig = aGenericType.getErasureSignature();
 		ret.append(rawSig.substring(0, rawSig.length() - 1));
 		ret.append("<");
 		for (int i = 0; i < someParameters.length; i++) {
 			if (someParameters[i] instanceof ReferenceType) {
-				ret.append(((ReferenceType)someParameters[i]).getSignatureForAttribute());
+				ret.append(((ReferenceType) someParameters[i])
+						.getSignatureForAttribute());
 			} else if (someParameters[i] instanceof Primitive) {
-				ret.append(((Primitive)someParameters[i]).getSignatureForAttribute());
+				ret.append(((Primitive) someParameters[i])
+						.getSignatureForAttribute());
 			} else {
-				throw new IllegalStateException("DebugFor325731: expected a ReferenceType or Primitive but was " + someParameters[i]
-						+ " of type " + someParameters[i].getClass().getName());
+				throw new IllegalStateException(
+						"DebugFor325731: expected a ReferenceType or Primitive but was "
+								+ someParameters[i] + " of type "
+								+ someParameters[i].getClass().getName());
 			}
 		}
 		ret.append(">;");
@@ -1093,7 +1189,8 @@
 					}
 				}
 				ResolvedType[] newNewInterfaces = new ResolvedType[newInterfaces.length + 1];
-				System.arraycopy(newInterfaces, 0, newNewInterfaces, 1, newInterfaces.length);
+				System.arraycopy(newInterfaces, 0, newNewInterfaces, 1,
+						newInterfaces.length);
 				newNewInterfaces[0] = newParent;
 				newInterfaces = newNewInterfaces;
 			}
@@ -1101,7 +1198,7 @@
 				synchronized (derivativeTypes) {
 					for (WeakReference<ReferenceType> derivativeTypeRef : derivativeTypes) {
 						ReferenceType derivativeType = derivativeTypeRef.get();
-						if (derivativeType!=null) {
+						if (derivativeType != null) {
 							derivativeType.parameterizedInterfaces.clear();
 						}
 					}
@@ -1111,40 +1208,45 @@
 		}
 	}
 
-	private boolean equal(UnresolvedType[] typeParameters, ResolvedType[] resolvedParameters) {
-		if (typeParameters.length!=resolvedParameters.length)  {
+	private boolean equal(UnresolvedType[] typeParameters,
+			ResolvedType[] resolvedParameters) {
+		if (typeParameters.length != resolvedParameters.length) {
 			return false;
 		}
 		int len = typeParameters.length;
-		for (int p=0;p<len;p++) {
+		for (int p = 0; p < len; p++) {
 			if (!typeParameters[p].equals(resolvedParameters[p])) {
 				return false;
 			}
 		}
 		return true;
 	}
-	
+
 	/**
-	 * Look for a derivative type with the specified type parameters.  This can avoid creating an
-	 * unnecessary new (duplicate) with the same information in it.  This method also cleans up
-	 * any reference entries that have been null'd by a GC.
+	 * Look for a derivative type with the specified type parameters. This can
+	 * avoid creating an unnecessary new (duplicate) with the same information
+	 * in it. This method also cleans up any reference entries that have been
+	 * null'd by a GC.
 	 * 
-	 * @param typeParameters the type parameters to use when searching for the derivative type.
+	 * @param typeParameters
+	 *            the type parameters to use when searching for the derivative
+	 *            type.
 	 * @return an existing derivative type or null if there isn't one
 	 */
 	public ReferenceType findDerivativeType(ResolvedType[] typeParameters) {
 		synchronized (derivativeTypes) {
 			List<WeakReference<ReferenceType>> forRemoval = new ArrayList<WeakReference<ReferenceType>>();
-			for (WeakReference<ReferenceType> derivativeTypeRef: derivativeTypes) {
+			for (WeakReference<ReferenceType> derivativeTypeRef : derivativeTypes) {
 				ReferenceType derivativeType = derivativeTypeRef.get();
-				if (derivativeType==null) {
+				if (derivativeType == null) {
 					forRemoval.add(derivativeTypeRef);
 				} else {
 					if (derivativeType.isRawType()) {
 						continue;
 					}
-					if (equal(derivativeType.typeParameters,typeParameters)) {
-						return derivativeType; // this escape route wont remove the empty refs
+					if (equal(derivativeType.typeParameters, typeParameters)) {
+						return derivativeType; // this escape route wont remove
+												// the empty refs
 					}
 				}
 			}
@@ -1154,7 +1256,7 @@
 	}
 
 	public boolean hasNewInterfaces() {
-		return newInterfaces!=null;
+		return newInterfaces != null;
 	}
 
 }
\ No newline at end of file
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/UnresolvedType.java b/org.aspectj.weaver/source/org/aspectj/weaver/UnresolvedType.java
index 14d00e5..b5d085c 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/UnresolvedType.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/UnresolvedType.java
@@ -259,7 +259,6 @@
 	}
 
 	public static UnresolvedType forGenericType(String name, TypeVariable[] tvbs, String genericSig) {
-		// TODO asc generics needs a declared sig
 		String sig = nameToSignature(name);
 		UnresolvedType ret = UnresolvedType.forSignature(sig);
 		ret.typeKind = TypeKind.GENERIC;
@@ -921,8 +920,9 @@
 	public String getPackageName() {
 		if (packageName == null) {
 			String name = getName();
-			if (name.indexOf("<") != -1) {
-				name = name.substring(0, name.indexOf("<"));
+			int angly = name.indexOf('<');
+			if (angly != -1) {
+				name = name.substring(0, angly);
 			}
 			int index = name.lastIndexOf('.');
 			if (index == -1) {
@@ -934,8 +934,6 @@
 		return packageName;
 	}
 
-	// TODO these move to a TypeUtils class
-
 	public static void writeArray(UnresolvedType[] types, CompressingDataOutputStream stream) throws IOException {
 		int len = types.length;
 		stream.writeShort(len);
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/World.java b/org.aspectj.weaver/source/org/aspectj/weaver/World.java
index 043d94e..83dac2d 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/World.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/World.java
@@ -1046,8 +1046,6 @@
 		private int collectedTypes = 0;
 		private final ReferenceQueue<ResolvedType> rq = new ReferenceQueue<ResolvedType>();
 
-		// private static Trace trace = TraceFactory.getTraceFactory().getTrace(World.TypeMap.class);
-
 		TypeMap(World w) {
 			// Demotion activated when switched on and loadtime weaving or in AJDT
 			demotionSystemActive = w.isDemotionActive() && (w.isLoadtimeWeaving() || w.couldIncrementalCompileFollow());
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/bcel/BcelWeaver.java b/org.aspectj.weaver/source/org/aspectj/weaver/bcel/BcelWeaver.java
index 5481e60..815becd 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/bcel/BcelWeaver.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/bcel/BcelWeaver.java
@@ -162,8 +162,7 @@
 			String fixedName = aspectName;
 			int hasDot = fixedName.lastIndexOf('.');
 			while (hasDot > 0) {
-				// System.out.println("BcelWeaver.addLibraryAspect " +
-				// fixedName);
+				// System.out.println("BcelWeaver.addLibraryAspect " + fixedName);
 				char[] fixedNameChars = fixedName.toCharArray();
 				fixedNameChars[hasDot] = '$';
 				fixedName = new String(fixedNameChars);
@@ -179,7 +178,6 @@
 
 		// System.out.println("type: " + type + " for " + aspectName);
 		if (type.isAspect()) {
-
 			// Bug 119657 ensure we use the unwoven aspect
 			WeaverStateInfo wsi = type.getWeaverState();
 			if (wsi != null && wsi.isReweavable()) {
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java b/org.aspectj.weaver/source/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java
index 2aa6307..21a1821 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java
@@ -53,7 +53,7 @@
 
 	private boolean initialized;
 
-	private List m_dumpTypePattern = new ArrayList();
+	private List<TypePattern> m_dumpTypePattern = new ArrayList<TypePattern>();
 	private boolean m_dumpBefore = false;
 	private boolean dumpDirPerClassloader = false;
 
@@ -931,8 +931,8 @@
 		// TODO AV - optimize for className.startWith only
 		ResolvedType classInfo = weaver.getWorld().resolve(UnresolvedType.forName(className), true);
 		// dump
-		for (Iterator iterator = m_dumpTypePattern.iterator(); iterator.hasNext();) {
-			TypePattern typePattern = (TypePattern) iterator.next();
+		for (Iterator<TypePattern> iterator = m_dumpTypePattern.iterator(); iterator.hasNext();) {
+			TypePattern typePattern = iterator.next();
 			if (typePattern.matchesStatically(classInfo)) {
 				// dump match
 				return true;
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/patterns/AndPointcut.java b/org.aspectj.weaver/source/org/aspectj/weaver/patterns/AndPointcut.java
index c9e56d6..20fc747 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/patterns/AndPointcut.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/patterns/AndPointcut.java
@@ -21,6 +21,7 @@
 import org.aspectj.weaver.IntMap;
 import org.aspectj.weaver.ResolvedType;
 import org.aspectj.weaver.Shadow;
+import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.VersionedDataInputStream;
 import org.aspectj.weaver.World;
 import org.aspectj.weaver.ast.Test;
@@ -44,7 +45,11 @@
 	}
 
 	public FuzzyBoolean fastMatch(FastMatchInfo type) {
-		return left.fastMatch(type).and(right.fastMatch(type));
+		FuzzyBoolean leftMatch = left.fastMatch(type);
+		if (leftMatch.alwaysFalse()) {
+			return leftMatch;
+		}
+		return leftMatch.and(right.fastMatch(type));
 	}
 
 	protected FuzzyBoolean matchInternal(Shadow shadow) {
@@ -104,7 +109,8 @@
 		return ret;
 	}
 
-	public Pointcut parameterizeWith(Map typeVariableMap, World w) {
+	@Override
+	public Pointcut parameterizeWith(Map<String,UnresolvedType> typeVariableMap, World w) {
 		AndPointcut ret = new AndPointcut(left.parameterizeWith(typeVariableMap, w), right.parameterizeWith(typeVariableMap, w));
 		ret.copyLocationFrom(this);
 		ret.m_ignoreUnboundBindingForNames = m_ignoreUnboundBindingForNames;
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/patterns/KindedPointcut.java b/org.aspectj.weaver/source/org/aspectj/weaver/patterns/KindedPointcut.java
index 3ccd9b2..892f01b 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/patterns/KindedPointcut.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/patterns/KindedPointcut.java
@@ -60,11 +60,6 @@
 		return signature;
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.aspectj.weaver.patterns.Pointcut#couldMatchKinds()
-	 */
 	@Override
 	public int couldMatchKinds() {
 		return matchKinds;
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/patterns/OrPointcut.java b/org.aspectj.weaver/source/org/aspectj/weaver/patterns/OrPointcut.java
index d1426e6..dde02f7 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/patterns/OrPointcut.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/patterns/OrPointcut.java
@@ -24,6 +24,8 @@
 import org.aspectj.weaver.VersionedDataInputStream;
 import org.aspectj.weaver.World;
 import org.aspectj.weaver.ast.Test;
+import org.aspectj.weaver.UnresolvedType;
+
 
 public class OrPointcut extends Pointcut {
 	Pointcut left, right;
@@ -43,7 +45,11 @@
 	}
 
 	public FuzzyBoolean fastMatch(FastMatchInfo type) {
-		return left.fastMatch(type).or(right.fastMatch(type));
+		FuzzyBoolean leftMatch = left.fastMatch(type);
+		if (leftMatch.alwaysTrue()) {
+			return leftMatch;
+		}
+		return leftMatch.or(right.fastMatch(type));
 	}
 
 	protected FuzzyBoolean matchInternal(Shadow shadow) {
@@ -112,7 +118,8 @@
 		return ret;
 	}
 
-	public Pointcut parameterizeWith(Map typeVariableMap, World w) {
+	@Override
+	public Pointcut parameterizeWith(Map<String,UnresolvedType> typeVariableMap, World w) {
 		Pointcut ret = new OrPointcut(left.parameterizeWith(typeVariableMap, w), right.parameterizeWith(typeVariableMap, w));
 		ret.copyLocationFrom(this);
 		return ret;
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/patterns/WithinPointcut.java b/org.aspectj.weaver/source/org/aspectj/weaver/patterns/WithinPointcut.java
index cc0f40a..e5461b6 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/patterns/WithinPointcut.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/patterns/WithinPointcut.java
@@ -25,6 +25,7 @@
 import org.aspectj.weaver.Shadow;
 import org.aspectj.weaver.VersionedDataInputStream;
 import org.aspectj.weaver.WeaverMessages;
+import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.World;
 import org.aspectj.weaver.ast.Literal;
 import org.aspectj.weaver.ast.Test;
@@ -55,7 +56,8 @@
 		return Shadow.ALL_SHADOW_KINDS_BITS;
 	}
 
-	public Pointcut parameterizeWith(Map typeVariableMap, World w) {
+	@Override
+	public Pointcut parameterizeWith(Map<String,UnresolvedType> typeVariableMap, World w) {
 		WithinPointcut ret = new WithinPointcut(this.typePattern.parameterizeWith(typeVariableMap, w));
 		ret.copyLocationFrom(this);
 		return ret;
@@ -65,7 +67,10 @@
 		if (typePattern.annotationPattern instanceof AnyAnnotationTypePattern) {
 			return isWithinType(info.getType());
 		}
-		return FuzzyBoolean.MAYBE;
+        return FuzzyBoolean.MAYBE;
+        // Possible alternative implementation that fast matches even annotation patterns: '@Foo *'
+//		typePattern.resolve(info.world);
+//		return isWithinType(info.getType());
 	}
 
 	protected FuzzyBoolean matchInternal(Shadow shadow) {
diff --git a/org.eclipse.ajdt.releng/build.properties b/org.eclipse.ajdt.releng/build.properties
index 93a307f..7a287d8 100644
--- a/org.eclipse.ajdt.releng/build.properties
+++ b/org.eclipse.ajdt.releng/build.properties
@@ -33,9 +33,10 @@
 # 1.8.0.20130729224100 - 1.8.0.M1
 # 1.8.0.20130801095600 
 # 1.8.0.20131018120000
+# 1.8.0.20140409170000 - RC3
 # when updating AspectJ to the next version, also make sure to uodate
 # the MANIFEST.MF bundle-version and all package versions
-ajde.version=1.8.0.20131018120000
+ajde.version=1.8.0.20140409170000
 
 builder=.