diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/ASTBasedDeclarationImpl.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/ASTBasedDeclarationImpl.java
index a478285..56f8a07 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/ASTBasedDeclarationImpl.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/ASTBasedDeclarationImpl.java
@@ -22,7 +22,7 @@
 import org.eclipse.jdt.core.dom.BodyDeclaration;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.IExtendedModifier;
-import org.eclipse.jdt.core.dom.IResolvedAnnotation;
+import org.eclipse.jdt.core.dom.IAnnotationBinding;
 import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
 import org.eclipse.jdt.core.dom.VariableDeclaration;
 import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
@@ -111,19 +111,19 @@
 	
 	public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
     {
-		final IResolvedAnnotation[] instances = getAnnotationInstancesFromAST();
+		final IAnnotationBinding[] instances = getAnnotationInstancesFromAST();
 		return _getAnnotation(annotationClass, instances);
     }
 
     public Collection<AnnotationMirror> getAnnotationMirrors()
     {
-		final IResolvedAnnotation[] instances = getAnnotationInstancesFromAST();
+		final IAnnotationBinding[] instances = getAnnotationInstancesFromAST();
 		return _getAnnotationMirrors(instances);		
     }
 	
-	private IResolvedAnnotation[] getAnnotationInstancesFromAST()
+	private IAnnotationBinding[] getAnnotationInstancesFromAST()
 	{	
-		IResolvedAnnotation[] instances = null;
+		IAnnotationBinding[] instances = null;
 		List extendsMods = null;
 		switch( _astNode.getNodeType() )
 		{
@@ -156,13 +156,13 @@
 				if( extMod.isAnnotation() )
 					count ++;
 			}
-			instances = new IResolvedAnnotation[count];
+			instances = new IAnnotationBinding[count];
 			int index = 0;
 			for( Object obj : extendsMods ){
 				final IExtendedModifier extMod = (IExtendedModifier)obj;
 				if( extMod.isAnnotation() )
 					instances[index ++] = 
-						((org.eclipse.jdt.core.dom.Annotation)extMod).resolveAnnotation();
+						((org.eclipse.jdt.core.dom.Annotation)extMod).resolveAnnotationBinding();
 			}
 		}
 		return instances;
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/AnnotationMirrorImpl.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/AnnotationMirrorImpl.java
index e66b46f..cf1b9aa 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/AnnotationMirrorImpl.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/AnnotationMirrorImpl.java
@@ -25,8 +25,8 @@
 import org.eclipse.jdt.core.dom.Annotation;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.IMethodBinding;
-import org.eclipse.jdt.core.dom.IResolvedAnnotation;
-import org.eclipse.jdt.core.dom.IResolvedMemberValuePair;
+import org.eclipse.jdt.core.dom.IAnnotationBinding;
+import org.eclipse.jdt.core.dom.IMemberValuePairBinding;
 import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.IVariableBinding;
 import org.eclipse.jdt.core.dom.MemberValuePair;
@@ -46,13 +46,13 @@
 public class AnnotationMirrorImpl implements AnnotationMirror, EclipseMirrorImpl
 {
     /**The ast node that correspond to the annotation.*/
-    private final IResolvedAnnotation _domAnnotation;
+    private final IAnnotationBinding _domAnnotation;
     private final BaseProcessorEnv _env;
     /** the declaration that is annotated by this annotation or the annotation element declaration
      *  if this is (part of) a default value*/
     private final EclipseDeclarationImpl _annotated;
     
-    public AnnotationMirrorImpl(IResolvedAnnotation annotationAstNode, EclipseDeclarationImpl decl, BaseProcessorEnv env)
+    public AnnotationMirrorImpl(IAnnotationBinding annotationAstNode, EclipseDeclarationImpl decl, BaseProcessorEnv env)
     {
 		_domAnnotation = annotationAstNode;
         _env = env;
@@ -80,14 +80,14 @@
 
     public Map<AnnotationTypeElementDeclaration, AnnotationValue> getElementValues()
     {
-		final IResolvedMemberValuePair[] pairs = _domAnnotation.getDeclaredMemberValuePairs();
+		final IMemberValuePairBinding[] pairs = _domAnnotation.getDeclaredMemberValuePairs();
 		if (pairs.length == 0) {
 			return Collections.emptyMap();
 		}
 		
 		final Map<AnnotationTypeElementDeclaration, AnnotationValue> result =
 			new LinkedHashMap<AnnotationTypeElementDeclaration, AnnotationValue>(pairs.length * 4 / 3 + 1 );
-		for( IResolvedMemberValuePair pair : pairs ){
+		for( IMemberValuePairBinding pair : pairs ){
 			 final String name = pair.getName();
              if( name == null ) continue;
              IMethodBinding elementMethod = pair.getMethodBinding();            
@@ -142,8 +142,8 @@
     public ITypeBinding[] getMemberValueTypeBinding(String membername)
     {
         if( membername == null ) return null;
-		final IResolvedMemberValuePair[] declaredPairs = _domAnnotation.getDeclaredMemberValuePairs();
-		for( IResolvedMemberValuePair pair : declaredPairs ){			
+		final IMemberValuePairBinding[] declaredPairs = _domAnnotation.getDeclaredMemberValuePairs();
+		for( IMemberValuePairBinding pair : declaredPairs ){			
 			if( membername.equals(pair.getName()) ){
 				final Object value = pair.getValue();
 				return getValueTypeBinding(value, pair.getMethodBinding().getReturnType());
@@ -191,8 +191,8 @@
     public Object getValue(final String memberName)
     {
 		if( memberName == null ) return null;
-		final IResolvedMemberValuePair[] declaredPairs = _domAnnotation.getDeclaredMemberValuePairs();
-		for( IResolvedMemberValuePair pair : declaredPairs ){			
+		final IMemberValuePairBinding[] declaredPairs = _domAnnotation.getDeclaredMemberValuePairs();
+		for( IMemberValuePairBinding pair : declaredPairs ){			
 			if( memberName.equals(pair.getName()) ){
 				return pair.getValue();				
 			}
@@ -221,7 +221,7 @@
         return null;
     }
     
-    public IResolvedAnnotation getResolvedAnnotaion(){return _domAnnotation; }
+    public IAnnotationBinding getResolvedAnnotaion(){return _domAnnotation; }
 
     
 
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/BinaryParameterDeclarationImpl.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/BinaryParameterDeclarationImpl.java
index f499f60..8fd6120 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/BinaryParameterDeclarationImpl.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/BinaryParameterDeclarationImpl.java
@@ -28,7 +28,7 @@
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.IBinding;
 import org.eclipse.jdt.core.dom.IMethodBinding;
-import org.eclipse.jdt.core.dom.IResolvedAnnotation;
+import org.eclipse.jdt.core.dom.IAnnotationBinding;
 import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.SimpleName;
 import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
@@ -101,14 +101,14 @@
     public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
     {
 		final IMethodBinding methodBinding = _executable.getDeclarationBinding();
-		final IResolvedAnnotation[] paramAnnos = methodBinding.getParameterAnnotations(_paramIndex); 
+		final IAnnotationBinding[] paramAnnos = methodBinding.getParameterAnnotations(_paramIndex); 
         return _getAnnotation(annotationClass, paramAnnos);
     }
 
     public Collection<AnnotationMirror> getAnnotationMirrors()
     {
 		final IMethodBinding methodBinding = _executable.getDeclarationBinding();
-		final IResolvedAnnotation[] paramAnnos = methodBinding.getParameterAnnotations(_paramIndex); 
+		final IAnnotationBinding[] paramAnnos = methodBinding.getParameterAnnotations(_paramIndex); 
         return _getAnnotationMirrors(paramAnnos);
     }    
     
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/EclipseDeclarationImpl.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/EclipseDeclarationImpl.java
index ab72d1c..e687857 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/EclipseDeclarationImpl.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/EclipseDeclarationImpl.java
@@ -30,7 +30,7 @@
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.EnumConstantDeclaration;
 import org.eclipse.jdt.core.dom.FieldDeclaration;
-import org.eclipse.jdt.core.dom.IResolvedAnnotation;
+import org.eclipse.jdt.core.dom.IAnnotationBinding;
 import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.Javadoc;
 import org.eclipse.jdt.core.dom.MethodDeclaration;
@@ -58,7 +58,7 @@
     }        
 
     <A extends Annotation> A _getAnnotation(Class<A> annotationClass,
-                                            IResolvedAnnotation[] annoInstances)
+                                            IAnnotationBinding[] annoInstances)
     {
     	if( annoInstances == null || annoInstances.length == 0 || annotationClass == null ) 
     		return null;
@@ -68,7 +68,7 @@
         annoTypeName = annoTypeName.replace('$', '.');
 		final int len = annoInstances == null ? 0 : annoInstances.length;
         if( len == 0 ) return null;
-        for( IResolvedAnnotation annoInstance :  annoInstances){
+        for( IAnnotationBinding annoInstance :  annoInstances){
             final ITypeBinding binding = annoInstance.getAnnotationType();            
             if( binding != null && binding.isAnnotation() ){
                 final String curTypeName = binding.getQualifiedName();
@@ -84,12 +84,12 @@
         return null; 
     }
 
-    Collection<AnnotationMirror> _getAnnotationMirrors(IResolvedAnnotation[] annoInstances)
+    Collection<AnnotationMirror> _getAnnotationMirrors(IAnnotationBinding[] annoInstances)
     {
 		final int len = annoInstances == null ? 0 : annoInstances.length;
         if( len == 0 ) return Collections.emptyList();
         final List<AnnotationMirror> result = new ArrayList<AnnotationMirror>(len);
-        for(IResolvedAnnotation annoInstance : annoInstances){
+        for(IAnnotationBinding annoInstance : annoInstances){
             final AnnotationMirrorImpl annoMirror =
                         (AnnotationMirrorImpl)Factory.createAnnotationMirror(annoInstance, this, _env);
             result.add(annoMirror);
@@ -103,7 +103,7 @@
 		final List<AnnotationMirror> result = new ArrayList<AnnotationMirror>(annoInstances.size());
 		for( org.eclipse.jdt.core.dom.Annotation annoInstance : annoInstances){
 			final AnnotationMirrorImpl annoMirror =
-				(AnnotationMirrorImpl)Factory.createAnnotationMirror(annoInstance.resolveAnnotation(), this, _env);
+				(AnnotationMirrorImpl)Factory.createAnnotationMirror(annoInstance.resolveAnnotationBinding(), this, _env);
 			result.add(annoMirror);
 		}
 		return result;
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/MemberDeclarationImpl.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/MemberDeclarationImpl.java
index 32b5c19..47d7d17 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/MemberDeclarationImpl.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/declaration/MemberDeclarationImpl.java
@@ -38,20 +38,20 @@
     
     public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
     {
-		final IResolvedAnnotation[] instances = getAnnotationInstances();
+		final IAnnotationBinding[] instances = getAnnotationInstances();
 		return _getAnnotation(annotationClass, instances);
     }
 
     public Collection<AnnotationMirror> getAnnotationMirrors()
     {
-		final IResolvedAnnotation[] instances = getAnnotationInstances();
+		final IAnnotationBinding[] instances = getAnnotationInstances();
 		return _getAnnotationMirrors(instances);		
     }
 	
-	private IResolvedAnnotation[] getAnnotationInstances()
+	private IAnnotationBinding[] getAnnotationInstances()
 	{
 		final IBinding binding = getDeclarationBinding();
-		final IResolvedAnnotation[] instances;
+		final IAnnotationBinding[] instances;
 		switch( binding.getKind() )
 		{
 		case IBinding.TYPE:
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/AnnotationInvocationHandler.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/AnnotationInvocationHandler.java
index 606afaa..a05cecb 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/AnnotationInvocationHandler.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/AnnotationInvocationHandler.java
@@ -26,7 +26,7 @@
 import org.eclipse.jdt.apt.core.internal.declaration.AnnotationMirrorImpl;
 import org.eclipse.jdt.apt.core.internal.util.Factory;
 import org.eclipse.jdt.core.dom.IMethodBinding;
-import org.eclipse.jdt.core.dom.IResolvedAnnotation;
+import org.eclipse.jdt.core.dom.IAnnotationBinding;
 import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.IVariableBinding;
 
@@ -195,11 +195,11 @@
 	    else if( domValue instanceof ITypeBinding )
 			throw new IllegalStateException("sourceValue is a type binding."); //$NON-NLS-1$
 		
-	    else if( domValue instanceof IResolvedAnnotation )
+	    else if( domValue instanceof IAnnotationBinding )
 		{
 			final AnnotationMirrorImpl annoMirror = 
 				(AnnotationMirrorImpl)Factory.createAnnotationMirror(
-					(IResolvedAnnotation)domValue, 
+					(IAnnotationBinding)domValue, 
 					_instance.getAnnotatedDeclaration(), 
 					_instance.getEnvironment());
 	        final AnnotationInvocationHandler handler = new AnnotationInvocationHandler(annoMirror, expectedType);
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/Factory.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/Factory.java
index e7f18f8..710a0c5 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/Factory.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/Factory.java
@@ -55,7 +55,7 @@
 import org.eclipse.jdt.apt.core.internal.type.WildcardTypeImpl;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration;
-import org.eclipse.jdt.core.dom.IResolvedAnnotation;
+import org.eclipse.jdt.core.dom.IAnnotationBinding;
 import org.eclipse.jdt.core.dom.IBinding;
 import org.eclipse.jdt.core.dom.IMethodBinding;
 import org.eclipse.jdt.core.dom.ITypeBinding;
@@ -221,7 +221,7 @@
      * @param env
      * @return a newly created {@link AnnotationMirror} object
      */
-    public static AnnotationMirror createAnnotationMirror(final IResolvedAnnotation annotation,
+    public static AnnotationMirror createAnnotationMirror(final IAnnotationBinding annotation,
                                                           final EclipseDeclarationImpl annotated,
                                                           final BaseProcessorEnv env)
     {
@@ -366,7 +366,7 @@
 				Object o = convertDOMValueToMirrorValue( elements[i], name, parent, decl, env, leaf );				
 				if( o == null ) 
 					return null; 
-				assert( !( o instanceof IResolvedAnnotation ) ) : 
+				assert( !( o instanceof IAnnotationBinding ) ) : 
 					"Unexpected return value from convertDomValueToMirrorValue! o.getClass().getName() = " //$NON-NLS-1$
 					+ o.getClass().getName(); 
 				
@@ -380,9 +380,9 @@
         else if( domValue instanceof ITypeBinding )
 			returnValue = Factory.createTypeMirror((ITypeBinding)domValue, env);
 		
-        else if( domValue instanceof IResolvedAnnotation )
+        else if( domValue instanceof IAnnotationBinding )
 		{
-			returnValue = Factory.createAnnotationMirror((IResolvedAnnotation)domValue, decl, env);
+			returnValue = Factory.createAnnotationMirror((IAnnotationBinding)domValue, decl, env);
 		}
         else	        
 			// should never reach this point
diff --git a/org.eclipse.jdt.apt.tests/src/org/eclipse/jdt/apt/tests/ReadAnnotationTests2.java b/org.eclipse.jdt.apt.tests/src/org/eclipse/jdt/apt/tests/ReadAnnotationTests2.java
index 6436864..7030d7e 100644
--- a/org.eclipse.jdt.apt.tests/src/org/eclipse/jdt/apt/tests/ReadAnnotationTests2.java
+++ b/org.eclipse.jdt.apt.tests/src/org/eclipse/jdt/apt/tests/ReadAnnotationTests2.java
@@ -21,7 +21,7 @@
 import org.eclipse.jdt.core.dom.ASTRequestor;
 import org.eclipse.jdt.core.dom.IBinding;
 import org.eclipse.jdt.core.dom.IMethodBinding;
-import org.eclipse.jdt.core.dom.IResolvedAnnotation;
+import org.eclipse.jdt.core.dom.IAnnotationBinding;
 import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.IVariableBinding;
 import org.eclipse.jdt.core.tests.builder.Tests;
@@ -307,7 +307,7 @@
 		}
 	}
 	
-	private void assertAnnotation(final String[] expected, IResolvedAnnotation[] annotations)
+	private void assertAnnotation(final String[] expected, IAnnotationBinding[] annotations)
 	{
 		final int expectedLen = expected.length;		
 		TestCase.assertEquals("annotation number mismatch", expected.length, annotations.length); //$NON-NLS-1$
@@ -317,7 +317,7 @@
 			expectedSet.add(expected[i]);
 			
 		int counter = 0;
-		for( IResolvedAnnotation mirror : annotations ){
+		for( IAnnotationBinding mirror : annotations ){
 			if( counter >= expectedLen )
 				TestCase.assertEquals("", mirror.toString()); //$NON-NLS-1$
 			else{
diff --git a/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java b/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java
index 61fa790..dfc7c1d 100644
--- a/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java
+++ b/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java
@@ -368,7 +368,7 @@
 						ITypeBinding typeBinding = typeDecl.resolveBinding();
 						if (typeBinding == null) continue;
 						typeBinding = typeBinding.getAnnotations()[0].getAnnotationType();
-						IResolvedAnnotation targetValue = typeBinding.getAnnotations()[0];
+						IAnnotationBinding targetValue = typeBinding.getAnnotations()[0];
 						IMethodBinding method = targetValue.getDeclaredMemberValuePairs()[0].getMethodBinding();
 						if (!"value".equals(method.getName()))
 							problems.add(new ParticipantProblem("method " + method.getName() + " not found", file.getName()));
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java
index 0f85d4d..60d04a6 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java
@@ -6276,7 +6276,7 @@
 		ClassInstanceCreation classInstanceCreation = (ClassInstanceCreation) expression;
 		IMethodBinding binding = classInstanceCreation.resolveConstructorBinding();
 		assertNotNull("Should not be null", binding);
-		IResolvedAnnotation[] annotations = binding.getAnnotations();
+		IAnnotationBinding[] annotations = binding.getAnnotations();
 		assertNotNull("Should not be null", annotations);
 		assertEquals("Should be empty", 0, annotations.length);
 	}
@@ -6308,8 +6308,8 @@
 		assertEquals("Wrong size", 2, modifiers.size());
 		assertTrue("Wrong type", modifiers.get(0) instanceof NormalAnnotation);
 		NormalAnnotation normalAnnotation = (NormalAnnotation) modifiers.get(0);
-		IResolvedAnnotation resolvedAnnotation = normalAnnotation.resolveAnnotation();
-		IResolvedMemberValuePair[] pairs = resolvedAnnotation.getDeclaredMemberValuePairs();
+		IAnnotationBinding annotationBinding = normalAnnotation.resolveAnnotationBinding();
+		IMemberValuePairBinding[] pairs = annotationBinding.getDeclaredMemberValuePairs();
 		assertEquals("Wrong size", 1, pairs.length);
 		assertNotNull("Should not be null", pairs[0].getValue());
 	}
diff --git a/org.eclipse.jdt.core/buildnotes_jdt-core.html b/org.eclipse.jdt.core/buildnotes_jdt-core.html
index 87361e7..e23ce9e 100644
--- a/org.eclipse.jdt.core/buildnotes_jdt-core.html
+++ b/org.eclipse.jdt.core/buildnotes_jdt-core.html
@@ -70,7 +70,9 @@
 </ul>
 
 <h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=108539">108539</a>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123470">123470</a>
+AST: new type IResolvedAnnotation
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=108539">108539</a>
 Error popup at breakpoint in tomcat project
 <br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99006">99006</a>
 Incorrect warning when a non-varargs method overrides a varargs method.
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
index 6093674..7d2446f 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
@@ -2025,7 +2025,7 @@
 		markerAnnotation.setSourceRange(start, end - start + 1);
 		if (this.resolveBindings) {
 			recordNodes(markerAnnotation, annotation);
-			markerAnnotation.resolveAnnotation();
+			markerAnnotation.resolveAnnotationBinding();
 		}
 		return markerAnnotation;
 	}
@@ -2088,7 +2088,7 @@
 		normalAnnotation.setSourceRange(start, end - start + 1);
 		if (this.resolveBindings) {
 			recordNodes(normalAnnotation, annotation);
-			normalAnnotation.resolveAnnotation();
+			normalAnnotation.resolveAnnotationBinding();
 		}
 		return normalAnnotation;
 	}
@@ -2328,7 +2328,7 @@
 		singleMemberAnnotation.setSourceRange(start, end - start + 1);
 		if (this.resolveBindings) {
 			recordNodes(singleMemberAnnotation, annotation);
-			singleMemberAnnotation.resolveAnnotation();
+			singleMemberAnnotation.resolveAnnotationBinding();
 		}
 		return singleMemberAnnotation;
 	}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Annotation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Annotation.java
index 0dd8c13..eadd659 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Annotation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Annotation.java
@@ -175,7 +175,7 @@
 	 * @return the resolved annotation, or <code>null</code> if the annotation cannot be resolved
 	 * @since 3.2
 	 */	
-	public IResolvedAnnotation resolveAnnotation() {
+	public IAnnotationBinding resolveAnnotationBinding() {
 	    return this.ast.getBindingResolver().resolveAnnotation(this);
 	}
 }
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationBinding.java
new file mode 100644
index 0000000..65c0228
--- /dev/null
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationBinding.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2005 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    tyeung@bea.com - initial API and implementation
+ *    IBM Corporation - implemented methods from IBinding
+ *    IBM Corporation - renamed from ResolvedAnnotation to AnnotationBinding
+ *******************************************************************************/
+package org.eclipse.jdt.core.dom;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair;
+import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.eclipse.jdt.internal.compiler.util.*;
+
+/**
+ * Internal class
+ */
+class AnnotationBinding implements IAnnotationBinding {
+	static final AnnotationBinding[] NoAnnotations = new AnnotationBinding[0];
+	private org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding internalAnnotation;
+	private BindingResolver bindingResolver;
+
+	AnnotationBinding(org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding annotation, BindingResolver resolver) {
+		if (annotation == null)
+			throw new IllegalStateException();
+		internalAnnotation = annotation;
+		bindingResolver = resolver;
+	}
+	
+	public IAnnotationBinding[] getAnnotations() {
+		return NoAnnotations;
+	}
+
+	public ITypeBinding getAnnotationType() {
+		ITypeBinding binding = this.bindingResolver.getTypeBinding(this.internalAnnotation.getAnnotationType());
+		if (binding == null || !binding.isAnnotation())
+			return null;
+		return binding;
+	}
+	
+	public IMemberValuePairBinding[] getDeclaredMemberValuePairs() {
+		ElementValuePair[] internalPairs = this.internalAnnotation.getElementValuePairs();
+		int length = internalPairs.length;
+		IMemberValuePairBinding[] pairs = length == 0 ? MemberValuePairBinding.NoPair : new MemberValuePairBinding[length];
+		for (int i = 0; i < length; i++)
+			pairs[i] = this.bindingResolver.getMemberValuePairBinding(internalPairs[i]);
+		return pairs;
+	}
+
+	public IMemberValuePairBinding[] getAllMemberValuePairs() {
+		IMemberValuePairBinding[] pairs = getDeclaredMemberValuePairs();
+		ReferenceBinding typeBinding = this.internalAnnotation.getAnnotationType();
+		if (typeBinding == null) return pairs;
+		MethodBinding[] methods = typeBinding.methods();
+		int methodLength = methods == null ? 0 : methods.length;
+		if (methodLength == 0) return pairs;
+
+		int declaredLength = pairs.length;
+		if (declaredLength == methodLength)
+			return pairs;
+
+		HashtableOfObject table = new HashtableOfObject(declaredLength);
+		for (int i = 0; i < declaredLength; i++)
+			table.put(((MemberValuePairBinding) pairs[i]).internalName(), pairs[i]);
+
+		// handle case of more methods than declared members
+		IMemberValuePairBinding[] allPairs = new  IMemberValuePairBinding[methodLength];
+		for (int i = 0; i < methodLength; i++) {
+			Object pair = table.get(methods[i].selector);
+			allPairs[i] = pair == null ? new DefaultValuePairBinding(methods[i], this.bindingResolver) : (IMemberValuePairBinding) pair;
+		}
+		return allPairs;
+	}
+	
+	public IJavaElement getJavaElement() {
+		ITypeBinding annotationType = getAnnotationType();
+		if (annotationType == null)
+			return null;
+		return annotationType.getJavaElement();
+	}
+
+	public String getKey() {
+		// TODO when implementing, update spec in IBinding
+		return null;
+	}
+
+	public int getKind() {
+		return IBinding.ANNOTATION;
+	}
+
+	public int getModifiers() {
+		return -1;
+	}
+
+	public String getName() {
+		ITypeBinding annotationType = getAnnotationType();
+		if (annotationType == null)
+			return new String(this.internalAnnotation.getAnnotationType().sourceName());
+		else
+			return annotationType.getName();
+	}
+	
+	public boolean isDeprecated() {
+		return false;
+	}
+	
+	public boolean isEqualTo(IBinding binding) {
+		if (this == binding)
+			return true;
+		if (binding.getKind() != IBinding.ANNOTATION)
+			return false;
+		IAnnotationBinding other = (IAnnotationBinding) binding;
+		if (!getAnnotationType().isEqualTo(other.getAnnotationType()))
+			return false;
+		IMemberValuePairBinding[] memberValuePairs = getDeclaredMemberValuePairs();
+		IMemberValuePairBinding[] otherMemberValuePairs = other.getDeclaredMemberValuePairs();
+		if (memberValuePairs.length != otherMemberValuePairs.length)
+			return false;
+		for (int i = 0, length = memberValuePairs.length; i < length; i++) {
+			if (!memberValuePairs[i].isEqualTo(otherMemberValuePairs[i]))
+				return false;
+		}
+		return true;
+	}
+	
+	public boolean isSynthetic() {
+		return false;
+	}
+
+	public String toString() {
+		ITypeBinding type = getAnnotationType();
+		final StringBuffer buffer = new StringBuffer();
+		buffer.append('@');
+		if (type != null)
+			buffer.append(type.getName());
+		buffer.append('(');
+		IMemberValuePairBinding[] pairs = getDeclaredMemberValuePairs();
+		for (int i = 0, len = pairs.length; i < len; i++) {
+			if (i != 0)
+				buffer.append(", "); //$NON-NLS-1$
+			buffer.append(pairs[i].toString());
+		}
+		buffer.append(')');
+		return buffer.toString();
+	}
+	
+}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingResolver.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingResolver.java
index 3041f88..426a625 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingResolver.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingResolver.java
@@ -11,9 +11,9 @@
 
 package org.eclipse.jdt.core.dom;
 
-import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
 import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope;
+import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair;
 import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
 
 /**
@@ -105,7 +105,7 @@
 	 * @return the corresponding node where the bindings is declared, 
 	 *    or <code>null</code> if none
 	 */
-	ASTNode findDeclaringNode(IResolvedAnnotation instance) {
+	ASTNode findDeclaringNode(IAnnotationBinding instance) {
 		return null;
 	}
 
@@ -137,6 +137,20 @@
 	IMethodBinding getMethodBinding(org.eclipse.jdt.internal.compiler.lookup.MethodBinding methodBinding) {
 		return null;
 	}
+	
+	/**
+	 * Returns the new member value pair binding corresponding to the given old value pair binding.
+	 * <p>
+	 * The default implementation of this method returns <code>null</code>.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param valuePair the old value pair binding
+	 * @return the new member value pair binding
+	 */
+	IMemberValuePairBinding getMemberValuePairBinding(ElementValuePair valuePair) {
+		return null;
+	}
 
 	/**
 	 * Returns the new package binding corresponding to the given old package binding.
@@ -190,7 +204,7 @@
 	 * @param instance the old annotation 
 	 * @return the new DOM annotation
 	 */
-	IResolvedAnnotation getAnnotationInstance(AnnotationBinding instance) {
+	IAnnotationBinding getAnnotationInstance(org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding instance) {
 		return null;
 	}
 
@@ -818,7 +832,7 @@
 	/**
 	 * Resolves the given annotation instance and returns the DOM representation for it.
 	 * <p>
-	 * The implementation of {@link Annotation#resolveAnnotation()}
+	 * The implementation of {@link Annotation#resolveAnnotationBinding()}
 	 * forwards to this method. 
 	 * </p>
 	 * <p>
@@ -830,7 +844,7 @@
 	 * @return the DOM annotation representation for the given ast node, or 
 	 *    <code>null</code> if none is available
 	 */
-	IResolvedAnnotation resolveAnnotation(Annotation annotation) {
+	IAnnotationBinding resolveAnnotation(Annotation annotation) {
 		return null;
 	}
 
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java
index b7b11b1..5c69677 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java
@@ -298,6 +298,8 @@
      * <li>enum constant - an <code>EnumConstantDeclaration</code></li>
      * <li>type variable - a <code>TypeParameter</code></li>
      * <li>capture binding - none</li>
+     * <li>annotation binding - an <code>Annotation</code></li>
+     * <li>member value pair binding - an <code>MemberValuePair</code></li>
 	 * </ul>
      * For parameterized or raw type bindings, the declaring node is
      * that of the corresponding generic type. And for parameterized or raw
@@ -324,24 +326,6 @@
 	
 	/**
 	 * Finds the corresponding AST node in the given compilation unit from 
-	 * which the given resolved annotation originated. Returns <code>null</code>
-	 * if the resolved annotation does not correspond to any node in this compilation unit.
-	 *
-	 * This method always returns <code>null</code> when the resolved annotation
-	 * comes from a different AST.
-	 * 
-	 * @param resolvedAnnotation the resolved annotation
-	 * @return the corresponding node where the given resolved annotation is declared,
-	 * or <code>null</code> if the resolved annotation does not correspond to a node in this
-	 * compilation unit or if bindings were not requested when this AST was built
-	 * @since 3.2
-	 */
-	public ASTNode findDeclaringNode(IResolvedAnnotation resolvedAnnotation) {
-		return this.ast.getBindingResolver().findDeclaringNode(resolvedAnnotation);
-	}
-
-	/**
-	 * Finds the corresponding AST node in the given compilation unit from 
 	 * which the binding with the given key originated. Returns
 	 * <code>null</code> if the corresponding node cannot be determined.
 	 * This method always returns <code>null</code> if bindings were not requested
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
index 7880a6c..9f22de6 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
@@ -43,11 +43,11 @@
 import org.eclipse.jdt.internal.compiler.ast.ThisReference;
 import org.eclipse.jdt.internal.compiler.ast.TypeReference;
 import org.eclipse.jdt.internal.compiler.impl.Constant;
-import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
 import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
 import org.eclipse.jdt.internal.compiler.lookup.Binding;
 import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
 import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope;
+import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair;
 import org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
 import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
 import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
@@ -178,7 +178,7 @@
 		return (ASTNode) this.bindingsToAstNodes.get(binding);
 	}
 
-	synchronized ASTNode findDeclaringNode(IResolvedAnnotation instance) {
+	synchronized ASTNode findDeclaringNode(IAnnotationBinding instance) {
 		if (instance == null)
 			return null;
 		return (ASTNode) this.bindingsToAstNodes.get(instance);
@@ -250,6 +250,18 @@
 		}
 		return null;
 	}
+	
+	synchronized IMemberValuePairBinding getMemberValuePairBinding(ElementValuePair valuePair) {
+		if (valuePair == null) return null;
+		IMemberValuePairBinding binding = 
+			(IMemberValuePairBinding) this.bindingTables.compilerBindingsToASTBindings.get(valuePair);
+		if (binding != null)
+			return binding;
+		binding = new MemberValuePairBinding(valuePair, this);
+		this.bindingTables.compilerBindingsToASTBindings.put(valuePair, binding);
+		return binding;
+	}
+
 	/*
 	 * Method declared on BindingResolver.
 	 */
@@ -355,13 +367,13 @@
 		return null;
 	}
 	
-	synchronized IResolvedAnnotation getAnnotationInstance(AnnotationBinding internalInstance) {
+	synchronized IAnnotationBinding getAnnotationInstance(org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding internalInstance) {
 		if (internalInstance == null) return null;
-		IResolvedAnnotation domInstance = 
-			(IResolvedAnnotation) this.bindingTables.compilerBindingsToASTBindings.get(internalInstance);
+		IAnnotationBinding domInstance = 
+			(IAnnotationBinding) this.bindingTables.compilerBindingsToASTBindings.get(internalInstance);
 		if (domInstance != null)
 			return domInstance;
-		domInstance = new ResolvedAnnotation(internalInstance, this);
+		domInstance = new AnnotationBinding(internalInstance, this);
 		this.bindingTables.compilerBindingsToASTBindings.put(internalInstance, domInstance);
 		return domInstance;
 	}
@@ -1550,13 +1562,13 @@
 		return null;
 	}
 
-	synchronized IResolvedAnnotation resolveAnnotation(final Annotation domASTNode) {
+	synchronized IAnnotationBinding resolveAnnotation(final Annotation domASTNode) {
 		Object oldNode = this.newAstToOldAst.get(domASTNode);
 		if (oldNode instanceof org.eclipse.jdt.internal.compiler.ast.Annotation) {
 			org.eclipse.jdt.internal.compiler.ast.Annotation internalAstNode = 
 				(org.eclipse.jdt.internal.compiler.ast.Annotation) oldNode;
 			
-			IResolvedAnnotation domAnnotation = this.getAnnotationInstance(internalAstNode.getCompilerAnnotation());
+			IAnnotationBinding domAnnotation = this.getAnnotationInstance(internalAstNode.getCompilerAnnotation());
 			if (domAnnotation == null)
 				return null;
 			this.bindingsToAstNodes.put(domAnnotation, domASTNode);			
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultValuePairBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultValuePairBinding.java
new file mode 100644
index 0000000..07efa1f
--- /dev/null
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultValuePairBinding.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2005 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    tyeung@bea.com - initial API and implementation
+ *    IBM Corporation - implemented methods from IBinding
+ *    IBM Corporation - renamed from ResolvedDefaultValuePair to DefaultValuePairBinding
+ *******************************************************************************/
+package org.eclipse.jdt.core.dom;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.dom.BindingResolver;
+import org.eclipse.jdt.core.dom.IMethodBinding;
+import org.eclipse.jdt.core.dom.IMemberValuePairBinding;
+
+/**
+ * Member value pair which compose of default values.
+ */
+class DefaultValuePairBinding implements IMemberValuePairBinding {
+
+	private org.eclipse.jdt.internal.compiler.lookup.MethodBinding method;
+	private Object domValue;
+	private BindingResolver bindingResolver;
+
+	static void appendValue(Object value, StringBuffer buffer) {
+		if (value instanceof Object[]) {
+			Object[] values = (Object[]) value;
+			buffer.append('{');
+			for (int i = 0, l = values.length; i < l; i++) {
+				if (i != 0)
+					buffer.append(", "); //$NON-NLS-1$
+				appendValue(values[i], buffer);
+			}
+			buffer.append('}');
+		} else if (value instanceof ITypeBinding) {
+			buffer.append(((ITypeBinding) value).getName());
+			buffer.append(".class"); //$NON-NLS-1$
+		} else {
+			buffer.append(value);
+		}
+	}
+	
+	DefaultValuePairBinding(org.eclipse.jdt.internal.compiler.lookup.MethodBinding binding, BindingResolver resolver) {
+		this.method = binding;
+		this.domValue = MemberValuePairBinding.buildDOMValue(binding.getDefaultValue(), resolver);
+		this.bindingResolver = resolver;
+	}
+	
+	public IAnnotationBinding[] getAnnotations() {
+		return AnnotationBinding.NoAnnotations;
+	}
+
+	public IJavaElement getJavaElement() {
+		return null;
+	}
+	
+	public String getKey() {
+		// TODO when implementing, update spec in IBinding
+		return null;
+	}
+
+	public int getKind() {
+		return IBinding.MEMBER_VALUE_PAIR;
+	}
+
+	public IMethodBinding getMethodBinding() {
+		return this.bindingResolver.getMethodBinding(this.method);
+	}
+	
+	public int getModifiers() {
+		return -1;
+	}
+
+	public String getName() {
+		return new String(this.method.selector);
+	}
+	
+	public Object getValue() {
+		return this.domValue;
+	}
+	
+	public boolean isDefault() {
+		return true;
+	}
+	
+	public boolean isDeprecated() {
+		return false;
+	}
+	
+	public boolean isEqualTo(IBinding binding) {
+		if (this == binding)
+			return true;
+		if (binding.getKind() != IBinding.MEMBER_VALUE_PAIR)
+			return false;
+		IMemberValuePairBinding other = (IMemberValuePairBinding) binding;
+		if (!getMethodBinding().isEqualTo(other.getMethodBinding()))
+			return false;
+		Object value = getValue();
+		if (value == null)
+			return other.getValue() == null;
+		return value.equals(other.getValue());
+	}
+
+	public boolean isSynthetic() {
+		return false;
+	}
+
+	public String toString() {
+		StringBuffer buffer = new StringBuffer();
+		toString(buffer);
+		return buffer.toString();
+	}
+	
+	public void toString(StringBuffer buffer) {
+		buffer.append(getName());
+		buffer.append(" = "); //$NON-NLS-1$		
+		appendValue(getValue(), buffer);
+	}
+}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IAnnotationBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IAnnotationBinding.java
new file mode 100644
index 0000000..ec25eba
--- /dev/null
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IAnnotationBinding.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2005 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    tyeung@bea.com - initial API and implementation
+ *    IBM Corporation - changed interface to extend IBinding
+ *    IBM Corporation - renamed from IResolvedAnnotation to IAnnotationBinding
+ *******************************************************************************/
+package org.eclipse.jdt.core.dom;
+
+/**
+ * Represents an resolved annotation. Resolved annotation are computed along with other
+ * bindings; they correspond to {@link Annotation} nodes.
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * 
+ * @since 3.2
+ */
+public interface IAnnotationBinding extends IBinding {
+
+	/**
+	 * Returns the complete list of member value pairs for this annotation, including
+	 * ones explicitly listed in the annotation as well as entries for 
+	 * annotation type members with default values that are implied.
+	 * 
+	 * @return a possibly empty list of resolved member value pairs
+	 */
+	IMemberValuePairBinding[] getAllMemberValuePairs();
+	
+	/**
+	 * Returns the type of the annotation. The resulting type binding will always
+	 * return <code>true</code>	to <code>ITypeBinding.isAnnotation()</code>.
+	 * 
+	 * @return the type of the annotation
+	 */
+	ITypeBinding getAnnotationType();
+	
+	/**
+	 * Returns the list of declared member value pairs for this annotation.
+	 * Returns an empty list for a <code>MarkerAnnotation</code>, a one element
+	 * list for a <code>SingleMemberAnnotation</code>, and one entry for each
+	 * of the explicitly listed values in a <code>NormalAnnotation</code>.
+	 * <p>
+	 * Note that the list only includes entries for annotation type members that are
+	 * explicitly mentioned in the annotation. The list does not include any 
+	 * annotation type members with default values that are merely implied.
+	 * Use {@link #getAllMemberValuePairs()} to get those as well.
+	 * </p>
+	 * 
+	 * @return a possibly empty list of resolved member value pairs
+	 */
+	IMemberValuePairBinding[] getDeclaredMemberValuePairs();
+	
+	/**
+	 * Returns the name of the annotation type.
+	 * 
+	 * @return the name of the annotation type
+	 */
+	public String getName();
+	
+}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IBinding.java
index 6b04678..c9e82c1 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IBinding.java
@@ -68,6 +68,26 @@
 	public static final int METHOD = 4;
 
 	/**
+	 * Kind constant (value 5) indicating an annotation binding.
+	 * Bindings of this kind can be safely cast to <code>IAnnotationBinding</code>.
+	 * 
+	 * @see #getKind()
+	 * @see IAnnotationBinding
+	 * @since 3.2
+	 */
+	public static final int ANNOTATION = 5;
+
+	/**
+	 * Kind constant (value 6) indicating a member value pair binding.
+	 * Bindings of this kind can be safely cast to <code>IMemberValuePairBinding</code>.
+	 * 
+	 * @see #getKind()
+	 * @see IMemberValuePairBinding
+	 * @since 3.2
+	 */
+	public static final int MEMBER_VALUE_PAIR = 6;
+
+	/**
 	 * Return the resolved annotations associated with this binding.
 	 * <ul>
 	 * <li>Package bindings - these are annotations on a package declaration.
@@ -80,22 +100,31 @@
 	 * parameterized.</li>
 	 * <li>Variable bindings - these are annotations on a field, enum constant,
 	 * or formal parameter declaration.</li>
+	 * <li>Annotation bindings - an empty array is always returned</li>
+	 * <li>Member value pair bindings - an empty array is always returned<li>
 	 * </ul>
 	 * 
 	 * @return the list of resolved annotations, or the empty list if there are no
 	 * annotations associated with the object
 	 * @since 3.2
 	 */
-	public IResolvedAnnotation[] getAnnotations();
+	public IAnnotationBinding[] getAnnotations();
 
 	/**
-	 * Returns the kind of bindings this is.
-	 * 
-	 * @return one of the kind constants:
-	 * 	<code>PACKAGE</code>,
+	 * Returns the kind of bindings this is. That is one of the kind constants:
+	 * <code>PACKAGE</code>,
 	 * 	<code>TYPE</code>,
 	 * 	<code>VARIABLE</code>,
-	 * 	or <code>METHOD</code>.
+	 * 	<code>METHOD</code>,
+	 * 	<code>ANNOTATION</code>,
+	 * or <code>MEMBER_VALUE_PAIR</code>.
+	 * <p>
+	 * Note that additional kinds might be added in the
+	 * future, so clients should not assume this list is exhaustive and 
+	 * should program defensively, e.g. by having a reasonable default
+	 * in a switch statement.
+	 * </p>
+	 * @return one of the kind constants
 	 */
 	public int getKind();
 	
@@ -166,8 +195,9 @@
 	 * <li>the "length" field of an array type</li>
 	 * <li>the default constructor of a source class</li>
 	 * <li>the constructor of an anonymous class</li>
+	 * <li>member value pairs</li>
 	 * </ul>
-	 * For all other kind of type, method, variable, and package bindings,
+	 * For all other kind of type, method, variable, annotation and package bindings,
 	 * this method returns non-<code>null</code>.
 	 * </p>
 	 * 
@@ -231,6 +261,9 @@
 	 * type</li>
 	 * </ul>
 	 * </p>
+	 * <p>Note that the key for annotation bindings and member value pair bindings is
+	 * not yet implemented. This returns <code>null</code> for these 2 kinds of bindings.
+	 * </p>
 	 * 
 	 * @return the key for this binding
 	 */
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IResolvedMemberValuePair.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IMemberValuePairBinding.java
similarity index 84%
rename from org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IResolvedMemberValuePair.java
rename to org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IMemberValuePairBinding.java
index 2096e0b..aedaf01 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IResolvedMemberValuePair.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IMemberValuePairBinding.java
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *    tyeung@bea.com - initial API and implementation
+ *    IBM Corporation - changed interface to extend IBinding
+ *    IBM Corporation - renamed from IResolvedMemberValuePair to IMemberValuePairBinding
  *******************************************************************************/
 package org.eclipse.jdt.core.dom;
 
@@ -14,10 +16,13 @@
  * Represents a resolved instance of an annotation's member value pair.
  * Resolved annotation are computed along with other bindings; these objects
  * correspond to {@link MemberValuePair} nodes.
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
  * 
  * @since 3.2
  */
-public interface IResolvedMemberValuePair {
+public interface IMemberValuePairBinding extends IBinding {
 /**
  * Returns the name of the annotation type member.
  * 
@@ -39,7 +44,7 @@
  * <li>java.lang.Class - the <code>ITypeBinding</code> for the class object</li>
  * <li>java.lang.String - the string value itself</li>
  * <li>enum type - the <code>IVariableBinding</code> for the enum constant</li>
- * <li>annotation type - an <code>IResolvedAnnotation</code></li>
+ * <li>annotation type - an <code>IAnnotationBinding</code></li>
  * <li>array type - an <code>Object[]</code> whose elements are as per above
  * (the language only allows single dimensional arrays in annotations)</li>
  * </ul>
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IMethodBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IMethodBinding.java
index 85a8b7c..76cf967 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IMethodBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IMethodBinding.java
@@ -93,13 +93,13 @@
 	 * is not the binding for an annotation type member.
 	 * <p>
 	 * Resolved values are represented as follows (same as for
-	 * {@link IResolvedMemberValuePair#getValue()}):
+	 * {@link IMemberValuePairBinding#getValue()}):
 	 * <ul>
 	 * <li>Primitive type - the equivalent boxed object</li>
 	 * <li>java.lang.Class - the <code>ITypeBinding</code> for the class object</li>
 	 * <li>java.lang.String - the string value itself</li>
 	 * <li>enum type - the <code>IVariableBinding</code> for the enum constant</li>
-	 * <li>annotation type - an <code>IResolvedAnnotation</code></li>
+	 * <li>annotation type - an <code>IAnnotationBinding</code></li>
 	 * <li>array type - an <code>Object[]</code> whose elements are as per above
 	 * (the language only allows single dimensional arrays in annotations)</li>
 	 * </ul>
@@ -122,7 +122,7 @@
 	 * not a valid index
 	 * @since 3.2
 	 */
-	public IResolvedAnnotation[] getParameterAnnotations(int paramIndex);
+	public IAnnotationBinding[] getParameterAnnotations(int paramIndex);
 
 	/**
 	 * Returns a list of type bindings representing the formal parameter types,
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IResolvedAnnotation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IResolvedAnnotation.java
deleted file mode 100644
index 3eadc38..0000000
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IResolvedAnnotation.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    tyeung@bea.com - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.core.dom;
-
-/**
- * Represents an resolved annotation. Resolved annotation are computed along with other
- * bindings; they correspond to {@link Annotation} nodes.
- * 
- * @since 3.2
- */
-public interface IResolvedAnnotation {
-/**
- * Returns the type of the annotation. The resulting type binding will always
- * return <code>true</code>	to <code>ITypeBinding.isAnnotation()</code>.
- * 
- * @return the type of the annotation
- */
-ITypeBinding getAnnotationType();
-
-/**
- * Returns the list of declared member value pairs for this annotation.
- * Returns an empty list for a <code>MarkerAnnotation</code>, a one element
- * list for a <code>SingleMemberAnnotation</code>, and one entry for each
- * of the explicitly listed values in a <code>NormalAnnotation</code>.
- * <p>
- * Note that the list only includes entries for annotation type members that are
- * explicitly mentioned in the annotation. The list does not include any 
- * annotation type members with default values that are merely implied.
- * Use {@link #getAllMemberValuePairs()} to get those as well.
- * </p>
- * 
- * @return a possibly empty list of resolved member value pairs
- */
-IResolvedMemberValuePair[] getDeclaredMemberValuePairs();
-
-/**
- * Returns the complete list of member value pairs for this annotation, including
- * ones explicitly listed in the annotation as well as entries for 
- * annotation type members with default values that are implied.
- * 
- * @return a possibly empty list of resolved member value pairs
- */
-IResolvedMemberValuePair[] getAllMemberValuePairs();
-}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberValuePairBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberValuePairBinding.java
new file mode 100644
index 0000000..b68f4eb
--- /dev/null
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberValuePairBinding.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2005 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    tyeung@bea.com - initial API and implementation
+ *    IBM Corporation - implemented methods from IBinding
+ *    IBM Corporation - renamed from ResolvedMemberValuePair to MemberValuePairBinding
+ *******************************************************************************/
+package org.eclipse.jdt.core.dom;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.internal.compiler.impl.Constant;
+import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair;
+import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
+
+/**
+ * Internal class.
+ */
+class MemberValuePairBinding implements IMemberValuePairBinding {
+	static final MemberValuePairBinding[] NoPair = new MemberValuePairBinding[0];
+	private static final Object NoValue = new Object();
+	private static final Object[] EmptyArray = new Object[0];
+
+	private ElementValuePair internalPair;
+	private Object value = null;
+	private BindingResolver bindingResolver;
+
+	static Object buildDOMValue(final Object internalObject, BindingResolver resolver) {
+		if (internalObject == null)
+			return null;
+	
+		if (internalObject instanceof Constant) {
+			Constant constant = (Constant) internalObject;
+			switch (constant.typeID()) {
+				case TypeIds.T_boolean:
+					return Boolean.valueOf(constant.booleanValue());
+				case TypeIds.T_byte:
+					return new Byte(constant.byteValue());
+				case TypeIds.T_char:
+					return new Character(constant.charValue());
+				case TypeIds.T_double:
+					return new Double(constant.doubleValue());
+				case TypeIds.T_float:
+					return new Float(constant.floatValue());
+				case TypeIds.T_int:
+					return new Integer(constant.intValue());
+				case TypeIds.T_long:
+					return new Long(constant.longValue());
+				case TypeIds.T_short:
+					return new Short(constant.shortValue());
+				case TypeIds.T_JavaLangString:
+					return constant.stringValue();
+			}
+		} else if (internalObject instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding) {
+			return resolver.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBinding) internalObject);
+		} else if (internalObject instanceof org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding) {
+			return resolver.getAnnotationInstance((org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding) internalObject);
+		} else if (internalObject instanceof org.eclipse.jdt.internal.compiler.lookup.FieldBinding) {
+			return resolver.getVariableBinding((org.eclipse.jdt.internal.compiler.lookup.FieldBinding) internalObject);
+		} else if (internalObject instanceof Object[]) {
+			Object[] elements = (Object[]) internalObject;
+			int length = elements.length;
+			Object[] values = length == 0 ? EmptyArray : new Object[length];
+			for (int i = 0; i < length; i++)
+				values[i] = buildDOMValue(elements[i], resolver);
+			return values;
+		}
+		throw new IllegalStateException(internalObject.toString()); // should never get here
+	}
+	
+	MemberValuePairBinding(ElementValuePair pair, BindingResolver resolver) {
+		this.internalPair = pair;
+		this.bindingResolver = resolver;
+	}
+	
+	public IAnnotationBinding[] getAnnotations() {
+		return AnnotationBinding.NoAnnotations;
+	}
+
+	public IJavaElement getJavaElement() {
+		return null;
+	}
+		
+	public String getKey() {
+		// TODO when implementing, update spec in IBinding
+		return null;
+	}
+
+	public int getKind() {
+		return IBinding.MEMBER_VALUE_PAIR;
+	}
+
+	public IMethodBinding getMethodBinding() {
+		return this.bindingResolver.getMethodBinding(this.internalPair.getMethodBinding());
+	}
+	
+	public int getModifiers() {
+		return -1;
+	}
+
+	public String getName() {
+		if (this.internalPair == null)
+			return null;
+		final char[] membername = this.internalPair.getName();
+		return membername == null ? null : new String(membername);
+	}
+	
+	public Object getValue() {
+		if (value == null)
+			init();
+		return value == NoValue ? null : this.value;
+	}
+	
+	private void init() {
+		this.value = buildDOMValue(this.internalPair.getValue(), this.bindingResolver);
+		if (this.value == null)
+			this.value = NoValue;
+	}
+	
+	char[] internalName() {
+		return this.internalPair == null ? null : this.internalPair.getName();
+	}
+	
+	public boolean isDefault() {
+		return false;
+	}
+	
+	public boolean isDeprecated() {
+		return false;
+	}
+
+	public boolean isEqualTo(IBinding binding) {
+		if (this == binding)
+			return true;
+		if (binding.getKind() != IBinding.MEMBER_VALUE_PAIR)
+			return false;
+		IMemberValuePairBinding other = (IMemberValuePairBinding) binding;
+		if (!getMethodBinding().isEqualTo(other.getMethodBinding()))
+			return false;
+		if (this.value == null)
+			return other.getValue() == null;
+		return this.value.equals(other.getValue());
+	}
+
+	public boolean isSynthetic() {
+		return false;
+	}
+
+	public String toString() {
+		StringBuffer buffer = new StringBuffer();
+		toString(buffer);
+		return buffer.toString();
+	}
+	
+	public void toString(StringBuffer buffer) {
+		buffer.append(getName());
+		buffer.append(" = "); //$NON-NLS-1$		
+		DefaultValuePairBinding.appendValue(getValue(), buffer);
+	}
+}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodBinding.java
index 6ca9875..ce75a1a 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodBinding.java
@@ -20,7 +20,6 @@
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.compiler.CharOperation;
-import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
 import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
 import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
 import org.eclipse.jdt.internal.compiler.lookup.MethodVerifier;
@@ -102,12 +101,12 @@
 		return name;
 	}
 
-	public IResolvedAnnotation[] getAnnotations() { 
-		AnnotationBinding[] annotations = this.binding.getAnnotations();
+	public IAnnotationBinding[] getAnnotations() { 
+		org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] annotations = this.binding.getAnnotations();
 		int length;
 		if (annotations == null || (length = annotations.length) == 0)
-			return ResolvedAnnotation.NoAnnotations;
-		IResolvedAnnotation[] domInstances = new ResolvedAnnotation[length];
+			return AnnotationBinding.NoAnnotations;
+		IAnnotationBinding[] domInstances = new AnnotationBinding[length];
 		for (int i = 0; i < length; i++)
 			domInstances[i] = this.resolver.getAnnotationInstance(annotations[i]);
 		return domInstances; 
@@ -123,12 +122,12 @@
 		return declaringClass;
 	}
 
-	public IResolvedAnnotation[] getParameterAnnotations(int index) {
-		AnnotationBinding[] annotations = this.binding.getParameterAnnotations(index);
+	public IAnnotationBinding[] getParameterAnnotations(int index) {
+		org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] annotations = this.binding.getParameterAnnotations(index);
 		int length;
 		if (annotations == null || (length = annotations.length) == 0)
-			return ResolvedAnnotation.NoAnnotations;
-		IResolvedAnnotation[] domInstances =new ResolvedAnnotation[length];
+			return AnnotationBinding.NoAnnotations;
+		IAnnotationBinding[] domInstances =new AnnotationBinding[length];
 		for (int i = 0; i < length; i++)
 			domInstances[i] = this.resolver.getAnnotationInstance(annotations[i]);
 		return domInstances; 
@@ -166,7 +165,7 @@
 
 	public Object getDefaultValue() {
 		if (isAnnotationMember())
-			return ResolvedMemberValuePair.buildDOMValue(this.binding.getDefaultValue(), this.resolver);
+			return MemberValuePairBinding.buildDOMValue(this.binding.getDefaultValue(), this.resolver);
 		return null;
 	}
 
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PackageBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PackageBinding.java
index 9472a37..5b557dd 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PackageBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PackageBinding.java
@@ -25,7 +25,6 @@
 import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
 import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;
 import org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding;
-import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
 import org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
 import org.eclipse.jdt.internal.core.NameLookup;
 import org.eclipse.jdt.internal.core.SearchableEnvironment;
@@ -49,18 +48,18 @@
 		this.resolver = resolver;
 	}
 
-	public IResolvedAnnotation[] getAnnotations() {
+	public IAnnotationBinding[] getAnnotations() {
 		try {
 			INameEnvironment nameEnvironment = this.binding.environment.nameEnvironment; 
 			if (!(nameEnvironment instanceof SearchableEnvironment))
-				return ResolvedAnnotation.NoAnnotations;
+				return AnnotationBinding.NoAnnotations;
 			NameLookup nameLookup = ((SearchableEnvironment) nameEnvironment).nameLookup;
 			if (nameLookup == null)
-				return ResolvedAnnotation.NoAnnotations;
+				return AnnotationBinding.NoAnnotations;
 			final String pkgName = getName();
 			IPackageFragment[] pkgs = nameLookup.findPackageFragments(pkgName, false/*exact match*/);
 			if (pkgs == null)
-				return ResolvedAnnotation.NoAnnotations;
+				return AnnotationBinding.NoAnnotations;
 
 			for (int i = 0, len = pkgs.length; i < len; i++) {
 				int fragType = pkgs[i].getKind();
@@ -80,14 +79,14 @@
 							if (pkgDecl != null) {
 								List annos = pkgDecl.annotations();
 								if (annos == null || annos.isEmpty())
-									return ResolvedAnnotation.NoAnnotations; 
-								IResolvedAnnotation[] result = new IResolvedAnnotation[annos.size()];
+									return AnnotationBinding.NoAnnotations; 
+								IAnnotationBinding[] result = new IAnnotationBinding[annos.size()];
 								int index=0;
 		 						for (Iterator it = annos.iterator(); it.hasNext(); index++) {
-									result[index] = ((Annotation) it.next()).resolveAnnotation();
+									result[index] = ((Annotation) it.next()).resolveAnnotationBinding();
 									// not resolving bindings
 									if (result[index] == null)
-										return ResolvedAnnotation.NoAnnotations;							
+										return AnnotationBinding.NoAnnotations;							
 								}
 								return result;
 							}
@@ -99,25 +98,25 @@
 						if (answer != null && answer.isBinaryType()) {
 							IBinaryType type = answer.getBinaryType();
 							IBinaryAnnotation[] binaryAnnotations = type.getAnnotations();
-							AnnotationBinding[] binaryInstances =
+							org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] binaryInstances =
 								BinaryTypeBinding.createAnnotations(binaryAnnotations, this.binding.environment);
-							AnnotationBinding[] allInstances =
-								AnnotationBinding.addStandardAnnotations(binaryInstances, type.getTagBits(), this.binding.environment);
+							org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] allInstances =
+								org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding.addStandardAnnotations(binaryInstances, type.getTagBits(), this.binding.environment);
 							int total = allInstances.length;
-							IResolvedAnnotation[] domInstances = new ResolvedAnnotation[total];
+							IAnnotationBinding[] domInstances = new AnnotationBinding[total];
 							for (int a = 0; a < total; a++) {
 								domInstances[a] = this.resolver.getAnnotationInstance(allInstances[a]);
 								if (domInstances[a] == null) // not resolving binding
-									return ResolvedAnnotation.NoAnnotations; 
+									return AnnotationBinding.NoAnnotations; 
 							}
 							return domInstances;
 						}
 				}	
 			}		
 		} catch(JavaModelException e) {
-			return ResolvedAnnotation.NoAnnotations;
+			return AnnotationBinding.NoAnnotations;
 		}		
-		return ResolvedAnnotation.NoAnnotations;
+		return AnnotationBinding.NoAnnotations;
 	}
 
 	/*
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ResolvedAnnotation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ResolvedAnnotation.java
deleted file mode 100644
index c15bd61..0000000
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ResolvedAnnotation.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    tyeung@bea.com - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.core.dom;
-
-import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
-import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair;
-import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
-import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
-import org.eclipse.jdt.internal.compiler.util.*;
-
-/**
- * Internal class
- */
-class ResolvedAnnotation implements IResolvedAnnotation {
-	static final ResolvedAnnotation[] NoAnnotations = new ResolvedAnnotation[0];
-	private AnnotationBinding internalAnnotation;
-	private BindingResolver bindingResolver;
-
-	ResolvedAnnotation(AnnotationBinding annotation, BindingResolver resolver) {
-		if (annotation == null)
-			throw new IllegalStateException();
-		internalAnnotation = annotation;
-		bindingResolver = resolver;
-	}
-
-	public ITypeBinding getAnnotationType() {
-		ITypeBinding binding = this.bindingResolver.getTypeBinding(this.internalAnnotation.getAnnotationType());
-		if (binding == null || !binding.isAnnotation())
-			return null;
-		return binding;
-	}
-
-	public IResolvedMemberValuePair[] getDeclaredMemberValuePairs() {
-		ElementValuePair[] internalPairs = this.internalAnnotation.getElementValuePairs();
-		int length = internalPairs.length;
-		IResolvedMemberValuePair[] pairs = length == 0 ? ResolvedMemberValuePair.NoPair : new ResolvedMemberValuePair[length];
-		for (int i = 0; i < length; i++)
-			pairs[i] = new ResolvedMemberValuePair(internalPairs[i], this.bindingResolver);
-		return pairs;
-	}
-
-	public IResolvedMemberValuePair[] getAllMemberValuePairs() {
-		IResolvedMemberValuePair[] pairs = getDeclaredMemberValuePairs();
-		ReferenceBinding typeBinding = this.internalAnnotation.getAnnotationType();
-		if (typeBinding == null) return pairs;
-		MethodBinding[] methods = typeBinding.methods();
-		int methodLength = methods == null ? 0 : methods.length;
-		if (methodLength == 0) return pairs;
-
-		int declaredLength = pairs.length;
-		if (declaredLength == methodLength)
-			return pairs;
-
-		HashtableOfObject table = new HashtableOfObject(declaredLength);
-		for (int i = 0; i < declaredLength; i++)
-			table.put(((ResolvedMemberValuePair) pairs[i]).internalName(), pairs[i]);
-
-		// handle case of more methods than declared members
-		IResolvedMemberValuePair[] allPairs = new  IResolvedMemberValuePair[methodLength];
-		for (int i = 0; i < methodLength; i++) {
-			Object pair = table.get(methods[i].selector);
-			allPairs[i] = pair == null ? new ResolvedDefaultValuePair(methods[i], this.bindingResolver) : (IResolvedMemberValuePair) pair;
-		}
-		return allPairs;
-	}
-
-	public String toString() {
-		ITypeBinding type = getAnnotationType();
-		final StringBuffer buffer = new StringBuffer();
-		buffer.append('@');
-		if (type != null)
-			buffer.append(type.getName());
-		buffer.append('(');
-		IResolvedMemberValuePair[] pairs = getDeclaredMemberValuePairs();
-		for (int i = 0, len = pairs.length; i < len; i++) {
-			if (i != 0)
-				buffer.append(", "); //$NON-NLS-1$
-			buffer.append(pairs[i].toString());
-		}
-		buffer.append(')');
-		return buffer.toString();
-	}
-}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ResolvedDefaultValuePair.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ResolvedDefaultValuePair.java
deleted file mode 100644
index 8b8b20d..0000000
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ResolvedDefaultValuePair.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    tyeung@bea.com - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.core.dom;
-
-import org.eclipse.jdt.core.dom.BindingResolver;
-import org.eclipse.jdt.core.dom.IMethodBinding;
-import org.eclipse.jdt.core.dom.IResolvedMemberValuePair;
-
-/**
- * Member value pair which compose of default values.
- */
-class ResolvedDefaultValuePair implements IResolvedMemberValuePair {
-
-	private org.eclipse.jdt.internal.compiler.lookup.MethodBinding method;
-	private Object domValue;
-	private BindingResolver bindingResolver;
-
-static void appendValue(Object value, StringBuffer buffer) {
-	if (value instanceof Object[]) {
-		Object[] values = (Object[]) value;
-		buffer.append('{');
-		for (int i = 0, l = values.length; i < l; i++) {
-			if (i != 0)
-				buffer.append(", "); //$NON-NLS-1$
-			appendValue(values[i], buffer);
-		}
-		buffer.append('}');
-	} else if (value instanceof ITypeBinding) {
-		buffer.append(((ITypeBinding) value).getName());
-		buffer.append(".class"); //$NON-NLS-1$
-	} else {
-		buffer.append(value);
-	}
-}
-
-ResolvedDefaultValuePair(org.eclipse.jdt.internal.compiler.lookup.MethodBinding binding, BindingResolver resolver) {
-	this.method = binding;
-	this.domValue = ResolvedMemberValuePair.buildDOMValue(binding.getDefaultValue(), resolver);
-	this.bindingResolver = resolver;
-}
-
-public String getName() {
-	return new String(this.method.selector);
-}
-
-public IMethodBinding getMethodBinding() {
-	return this.bindingResolver.getMethodBinding(this.method);
-}
-
-public Object getValue() {
-	return this.domValue;
-}
-
-public boolean isDefault() {
-	return true;
-}
-
-public String toString() {
-	StringBuffer buffer = new StringBuffer();
-	toString(buffer);
-	return buffer.toString();
-}
-
-public void toString(StringBuffer buffer) {
-	buffer.append(getName());
-	buffer.append(" = "); //$NON-NLS-1$		
-	appendValue(getValue(), buffer);
-}
-}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ResolvedMemberValuePair.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ResolvedMemberValuePair.java
deleted file mode 100644
index 6a31261..0000000
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ResolvedMemberValuePair.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    tyeung@bea.com - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.core.dom;
-
-import org.eclipse.jdt.internal.compiler.impl.Constant;
-import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
-import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair;
-import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
-
-/**
- * Internal class.
- */
-class ResolvedMemberValuePair implements IResolvedMemberValuePair {
-	static final ResolvedMemberValuePair[] NoPair = new ResolvedMemberValuePair[0];
-	private static final Object NoValue = new Object();
-	private static final Object[] EmptyArray = new Object[0];
-
-	private ElementValuePair internalPair;
-	private Object value = null;
-	private BindingResolver bindingResolver;
-
-static Object buildDOMValue(final Object internalObject, BindingResolver resolver) {
-	if (internalObject == null)
-		return null;
-
-	if (internalObject instanceof Constant) {
-		Constant constant = (Constant) internalObject;
-		switch (constant.typeID()) {
-			case TypeIds.T_boolean:
-				return Boolean.valueOf(constant.booleanValue());
-			case TypeIds.T_byte:
-				return new Byte(constant.byteValue());
-			case TypeIds.T_char:
-				return new Character(constant.charValue());
-			case TypeIds.T_double:
-				return new Double(constant.doubleValue());
-			case TypeIds.T_float:
-				return new Float(constant.floatValue());
-			case TypeIds.T_int:
-				return new Integer(constant.intValue());
-			case TypeIds.T_long:
-				return new Long(constant.longValue());
-			case TypeIds.T_short:
-				return new Short(constant.shortValue());
-			case TypeIds.T_JavaLangString:
-				return constant.stringValue();
-		}
-	} else if (internalObject instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding) {
-		return resolver.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBinding) internalObject);
-	} else if (internalObject instanceof AnnotationBinding) {
-		return resolver.getAnnotationInstance((AnnotationBinding) internalObject);
-	} else if (internalObject instanceof org.eclipse.jdt.internal.compiler.lookup.FieldBinding) {
-		return resolver.getVariableBinding((org.eclipse.jdt.internal.compiler.lookup.FieldBinding) internalObject);
-	} else if (internalObject instanceof Object[]) {
-		Object[] elements = (Object[]) internalObject;
-		int length = elements.length;
-		Object[] values = length == 0 ? EmptyArray : new Object[length];
-		for (int i = 0; i < length; i++)
-			values[i] = buildDOMValue(elements[i], resolver);
-		return values;
-	}
-	throw new IllegalStateException(internalObject.toString()); // should never get here
-}
-
-ResolvedMemberValuePair(ElementValuePair pair, BindingResolver resolver) {
-	this.internalPair = pair;
-	this.bindingResolver = resolver;
-}
-
-public IMethodBinding getMethodBinding() {
-	return this.bindingResolver.getMethodBinding(this.internalPair.getMethodBinding());
-}
-
-public String getName() {
-	if (this.internalPair == null)
-		return null;
-	final char[] membername = this.internalPair.getName();
-	return membername == null ? null : new String(membername);
-}
-
-public Object getValue() {
-	if (value == null)
-		init();
-	return value == NoValue ? null : this.value;
-}
-
-private void init() {
-	this.value = buildDOMValue(this.internalPair.getValue(), this.bindingResolver);
-	if (this.value == null)
-		this.value = NoValue;
-}
-
-char[] internalName() {
-	return this.internalPair == null ? null : this.internalPair.getName();
-}
-
-public boolean isDefault() {
-	return false;
-}
-
-public String toString() {
-	StringBuffer buffer = new StringBuffer();
-	toString(buffer);
-	return buffer.toString();
-}
-
-public void toString(StringBuffer buffer) {
-	buffer.append(getName());
-	buffer.append(" = "); //$NON-NLS-1$		
-	ResolvedDefaultValuePair.appendValue(getValue(), buffer);
-}
-}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
index 0632815..de11418 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
@@ -32,7 +32,6 @@
 import org.eclipse.jdt.internal.compiler.ast.Wildcard;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.eclipse.jdt.internal.compiler.env.IDependent;
-import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
 import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
 import org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding;
 import org.eclipse.jdt.internal.compiler.lookup.Binding;
@@ -75,15 +74,15 @@
 		this.resolver = resolver;
 	}
 
-	public IResolvedAnnotation[] getAnnotations() { 
-		IResolvedAnnotation[] domInstances = ResolvedAnnotation.NoAnnotations;
+	public IAnnotationBinding[] getAnnotations() { 
+		IAnnotationBinding[] domInstances = AnnotationBinding.NoAnnotations;
 		if (this.binding.isAnnotationType() || this.binding.isClass() || this.binding.isEnum() || this.binding.isInterface()) {
 			org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding refType = 
 				(org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding) this.binding;
-			AnnotationBinding[] internalAnnotations = refType.getAnnotations();
+			org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] internalAnnotations = refType.getAnnotations();
 			int length = internalAnnotations == null ? 0 : internalAnnotations.length;
 			if (length > 0) {
-				domInstances = new ResolvedAnnotation[length];
+				domInstances = new AnnotationBinding[length];
 				for (int i = 0; i < length; i++)
 					domInstances[i] = this.resolver.getAnnotationInstance(internalAnnotations[i]);
 			}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableBinding.java
index decf1a5..23e74d3 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableBinding.java
@@ -16,7 +16,6 @@
 import org.eclipse.jdt.core.util.IModifierConstants;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.eclipse.jdt.internal.compiler.impl.Constant;
-import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
 import org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
 import org.eclipse.jdt.internal.compiler.lookup.TagBits;
 import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
@@ -43,12 +42,12 @@
 		this.binding = binding;
 	}
 
-	public IResolvedAnnotation[] getAnnotations() { 
-		AnnotationBinding[] internalAnnotations = this.binding.getAnnotations();
+	public IAnnotationBinding[] getAnnotations() { 
+		org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding[] internalAnnotations = this.binding.getAnnotations();
 		// the variable is not an enum constant nor a field nor an argument.
 		int length = internalAnnotations == null ? 0 : internalAnnotations.length;
-		IResolvedAnnotation[] domInstances =
-			length == 0 ? ResolvedAnnotation.NoAnnotations : new ResolvedAnnotation[length];
+		IAnnotationBinding[] domInstances =
+			length == 0 ? AnnotationBinding.NoAnnotations : new AnnotationBinding[length];
 		for (int i = 0; i < length; i++)
 			domInstances[i] = this.resolver.getAnnotationInstance(internalAnnotations[i]);
 		return domInstances;                                                                  
