[325364] Annotation Properties view should resolve annotation classes from project classpath
diff --git a/bundles/org.eclipse.jst.ws.annotations.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.annotations.core/META-INF/MANIFEST.MF
index 1ed17f9..4cba698 100644
--- a/bundles/org.eclipse.jst.ws.annotations.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.jst.ws.annotations.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jst.ws.annotations.core;singleton:=true
-Bundle-Version: 1.0.0.qualifier
+Bundle-Version: 1.1.0.qualifier
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-Vendor: %pluginProvider
@@ -18,6 +18,7 @@
 Export-Package: org.eclipse.jst.ws.annotations.core,
  org.eclipse.jst.ws.annotations.core.initialization,
  org.eclipse.jst.ws.annotations.core.processor,
- org.eclipse.jst.ws.annotations.core.utils
+ org.eclipse.jst.ws.annotations.core.utils,
+ org.eclipse.jst.ws.internal.annotations.core.utils;x-friends:="org.eclipse.jst.ws.jaxws.ui"
 Bundle-Activator: org.eclipse.jst.ws.annotations.core.AnnotationsCorePlugin
 Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationDefinition.java b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationDefinition.java
index 9b2818f..6f714ba 100644
--- a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationDefinition.java
+++ b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationDefinition.java
@@ -19,6 +19,11 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.jdt.core.IAnnotation;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IMemberValuePair;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer;
 
 /**
@@ -46,8 +51,8 @@
     private static final String RESTRICTED_TO_INTERFACE_ONLY = "INTERFACE_ONLY";
     private static final String RESTRICTED_TO_ENUM_ONLY = "ENUM_ONLY";
 
-	private static final String ELEM_TARGET_FILTER = "targetFilter"; //$NON-NLS-1$
-	private static final String ATT_TARGET = "target"; //$NON-NLS-1$
+    private static final String ELEM_TARGET_FILTER = "targetFilter"; //$NON-NLS-1$
+    private static final String ATT_TARGET = "target"; //$NON-NLS-1$
 
     private IConfigurationElement configurationElement;
     private String category;
@@ -61,6 +66,11 @@
     private boolean classOnly;
     private boolean enumOnly;
 
+    private IType annotationType;
+    private List<ElementType> annotationTypeTargets;
+    private IJavaProject javaProject;
+    private Boolean deprecated;
+
     /**
      * Constructs an <code>AnnotationDefinition</code> using information from the
      * <code>org.eclipse.jst.ws.annotations.core.annotationDefinition</code> extension point and category name.
@@ -133,16 +143,17 @@
      * <code>annotation<annotation> element in the <code>org.eclipse.jst.ws.annotations.core.annotationDefinition</code>
      * extension point.
      *
-     * @return the annotation class
+     * @return the annotation class or null if not found.
+     * @deprecated As of 1.1 replaced by {@link #getAnnotationType()}
      */
     @SuppressWarnings("unchecked")
+    @Deprecated
     public Class<? extends java.lang.annotation.Annotation> getAnnotationClass() {
         if (annotationClass == null) {
             try {
                 Class<?> aClass = Class.forName(annotationClassName);
                 if (aClass.isAnnotation()) {
-                    annotationClass = (Class<java.lang.annotation.Annotation>)Class.forName(
-                            annotationClassName);
+                    annotationClass = (Class<java.lang.annotation.Annotation>) Class.forName(annotationClassName);
                 }
             } catch(ClassNotFoundException cnfe) {
                 AnnotationsCorePlugin.log(cnfe);
@@ -152,6 +163,33 @@
     }
 
     /**
+     * Returns the annotation type as specified by the <code>class</code> attribute of the
+     * <code>annotation<annotation> element in the <code>org.eclipse.jst.ws.annotations.core.annotationDefinition</code>
+     * extension point.
+     * 
+     * @return the <code>org.eclipse.jdt.core.IType</code> which represents an annotation type or null if the java project
+     * has not been set, if the type cannot be found or if the type does not represent an annotation type.
+     * 
+     * @see #setJavaProject(IJavaProject)
+     * @since 1.1
+     */
+    public IType getAnnotationType() {
+        if (annotationType == null) {
+            try {
+                if (javaProject != null) {
+                    IType type = javaProject.findType(annotationClassName);
+                    if (type != null && type.isAnnotation()) {
+                        annotationType = type;
+                    }
+                }
+            } catch (JavaModelException jme) {
+                AnnotationsCorePlugin.log(jme.getStatus());
+            }
+        }
+        return annotationType;
+    }
+
+    /**
      * Returns a list of {@link ElementType} that specify the Java elements to which the annotation
      * can be applied.
      * <p>
@@ -162,28 +200,80 @@
      * the annotation.
      * </p>
      * @return a list of element types.
+     * @deprecated as of 1.1 replaced by {@link #getAnnotationTypeTargets()}
      */
+    @Deprecated
     public List<ElementType> getTargets() {
         if (targets == null) {
-        	targets = new LinkedList<ElementType>();
+            targets = new LinkedList<ElementType>();
 
             Class<? extends java.lang.annotation.Annotation> annotation = getAnnotationClass();
             if (annotation != null) {
-            	Target target = annotation.getAnnotation(Target.class);
-            	if (target != null) {
-            	    targets.addAll(Arrays.asList(target.value()));
+                Target target = annotation.getAnnotation(Target.class);
+                if (target != null) {
+                    targets.addAll(Arrays.asList(target.value()));
 
                     List<ElementType> filteredTargets = getFilteredTargets(configurationElement);
                     if (targets.containsAll(filteredTargets) && filteredTargets.size() < targets.size()) {
                         targets.removeAll(filteredTargets);
                     }
-            	}
+                }
             }
         }
         return targets;
     }
 
     /**
+     * Returns a list of {@link ElementType} that specify the Java elements to which the annotation can be applied.
+     * <p>
+     * The element types are retrieved from the annotations
+     * {@link java.lang.annotation.Target} meta-annotation type. This list can
+     * be filtered using the <code>targetFilter</code> element on the
+     * <code>org.eclipse.jst.ws.annotations.core.annotationDefinition</code>
+     * extension point when defining the annotation.
+     * </p>
+     * @return a list of element types or null if the java project has not been set or if the annotation type cannot be
+     * found.
+     * @see #setJavaProject(IJavaProject)
+     * @since 1.1
+     */
+    public List<ElementType> getAnnotationTypeTargets() {
+        if (annotationTypeTargets == null) {
+            annotationTypeTargets = new LinkedList<ElementType>();
+            try {
+                IType type = getAnnotationType();
+                if (type != null) {
+                    IAnnotation target = type.getAnnotation(Target.class.getCanonicalName());
+                    if (!target.exists()) {
+                        target = type.getAnnotation(Target.class.getSimpleName());
+                    }
+                    if (target.exists()) {
+                        IMemberValuePair[] memberValuePairs = target.getMemberValuePairs();
+                        for (IMemberValuePair memberValuePair : memberValuePairs) {
+                            Object value = memberValuePair.getValue();
+                            if (value.getClass().isArray() && value.getClass().getComponentType().equals(String.class)) {
+                                String[] objs = (String[]) value;
+                                for (String obj : objs) {
+                                    annotationTypeTargets.add(ElementType.valueOf(obj.substring(obj.lastIndexOf('.') + 1)));
+                                }
+                            } else {
+                                annotationTypeTargets.add(ElementType.valueOf(value.toString().substring(value.toString().lastIndexOf('.') + 1)));
+                            }
+                        }
+                    }
+                    List<ElementType> filteredTargets = getFilteredTargets(configurationElement);
+                    if (annotationTypeTargets.containsAll(filteredTargets) && filteredTargets.size() < annotationTypeTargets.size()) {
+                        annotationTypeTargets.removeAll(filteredTargets);
+                    }
+                }
+            } catch (JavaModelException jme) {
+                AnnotationsCorePlugin.log(jme.getStatus());
+            }
+        }
+        return annotationTypeTargets;
+    }
+
+    /**
      * Returns the annotations attribute initializer as specified in the
      * <code>org.eclipse.jst.ws.annotations.core.annotationInitializer</code> extension point or null if no
      * initializer can be found.
@@ -196,8 +286,7 @@
                 IConfigurationElement configurationElement =
                     AnnotationsManager.getAnnotationInitializerCache().get(getAnnotationClassName());
                 if (configurationElement != null) {
-                    annotationInitializer = (IAnnotationAttributeInitializer)configurationElement
-                        .createExecutableExtension(ATT_CLASS);
+                    annotationInitializer = (IAnnotationAttributeInitializer) configurationElement.createExecutableExtension(ATT_CLASS);
                 }
             } catch (CoreException ce) {
                 AnnotationsCorePlugin.log(ce.getStatus());
@@ -206,17 +295,50 @@
         return annotationInitializer;
     }
 
-	  private List<ElementType> getFilteredTargets(IConfigurationElement configurationElement) {
-		  List<ElementType> targets = new ArrayList<ElementType>(7);
-		  try {
-			  IConfigurationElement[] deprecatedTargets = configurationElement.getChildren(ELEM_TARGET_FILTER);
-			  for (IConfigurationElement deprecatedTargetElement : deprecatedTargets) {
-				  String target = AnnotationsManager.getAttributeValue(deprecatedTargetElement, ATT_TARGET);
-				  targets.add(ElementType.valueOf(target));
-			  }
-		  } catch (IllegalArgumentException iae) {
-			  AnnotationsCorePlugin.log(iae);
-		  }
-		  return targets;
-	  }
+    private List<ElementType> getFilteredTargets(IConfigurationElement configurationElement) {
+        List<ElementType> targets = new ArrayList<ElementType>(7);
+        try {
+            IConfigurationElement[] deprecatedTargets = configurationElement.getChildren(ELEM_TARGET_FILTER);
+            for (IConfigurationElement deprecatedTargetElement : deprecatedTargets) {
+                String target = AnnotationsManager.getAttributeValue(deprecatedTargetElement, ATT_TARGET);
+                targets.add(ElementType.valueOf(target));
+            }
+        } catch (IllegalArgumentException iae) {
+            AnnotationsCorePlugin.log(iae);
+        }
+        return targets;
+    }
+
+    boolean isDeprecated() {
+        if (deprecated == null) {
+            IType type = getAnnotationType();
+            if (type != null) {
+                IAnnotation annotation = type.getAnnotation(Deprecated.class.getCanonicalName());
+                if (!annotation.exists()) {
+                    annotation = type.getAnnotation(Deprecated.class.getSimpleName());
+                }
+                deprecated = annotation.exists();
+            } else {
+                deprecated = false;
+            }
+        }
+        return deprecated;
+    }
+
+    /**
+     * Sets the <code>org.eclipse.jdt.core.IJavaProject</code> which is used to find the
+     * annotation type.
+     * 
+     * @see {@link #getAnnotationType()}
+     * @see {@link #getAnnotationTypeTargets()}
+     * @since 1.1
+     */
+    public void setJavaProject(IJavaProject javaProject) {
+        if (this.javaProject == null || !this.javaProject.equals(javaProject)) {
+            this.javaProject = javaProject;
+            this.annotationType = null;
+            this.annotationTypeTargets = null;
+            this.deprecated = null;
+        }
+    }
 }
diff --git a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationsCore.java b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationsCore.java
index ec82089..26fcaad 100644
--- a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationsCore.java
+++ b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationsCore.java
@@ -12,6 +12,8 @@
 
 import java.util.List;
 
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ArrayInitializer;
 import org.eclipse.jdt.core.dom.BooleanLiteral;
@@ -174,8 +176,10 @@
      * @param value an object representing the <code>enum</code> value.
      * @return a new member value pair with the given name and value.
      */
-    public static MemberValuePair createEnumMemberValuePair(AST ast, String className, String name,
-            Object value) {
+    public static MemberValuePair createEnumMemberValuePair(AST ast, String className, String name, Object value) {
+        if (value instanceof IField) {
+            return AnnotationsCore.createMemberValuePair(ast, name, createEnumLiteral(ast, className, (IField) value));
+        }
         return AnnotationsCore.createMemberValuePair(ast, name, createEnumLiteral(ast, className, value));
     }
 
@@ -241,7 +245,7 @@
      *
      * @param ast the {@link AST} that will be used to create the qualified name.
      * @param className the fully qualified name of the enclosing class.
-     * @param value sn object representing the <code>enum</code> value.
+     * @param value an object representing the <code>enum</code> value.
      * @return a new qualified name.
      */
     public static QualifiedName createEnumLiteral(AST ast, String className, Object value) {
@@ -267,6 +271,41 @@
     }
 
     /**
+     * Creates a new {@link QualifiedName} to represent an <code>enum</code> literal value.
+     *
+     * @param ast the {@link AST} that will be used to create the qualified name.
+     * @param className the fully qualified name of the enclosing class.
+     * @param value a {@link org.eclipse.jdt.core.IField} where <code>isEnumConstant()</code> is <code>true</code>.
+     * @return a new qualified name.
+     * @throws JavaModelException
+     * @since 1.1
+     */
+    public static QualifiedName createEnumLiteral(AST ast, String className, IField enumConstant) {
+        QualifiedName enumName = null;
+        SimpleName enumClassName = ast.newSimpleName(enumConstant.getDeclaringType().getElementName());
+        SimpleName enumLiteral = ast.newSimpleName(enumConstant.getElementName());
+        try {
+            if (enumConstant.getDeclaringType().isMember()) {
+                Name enumEnclosingClassName = null;
+                String enclosingClassName = enumConstant.getDeclaringType().getDeclaringType().getFullyQualifiedName();
+                if (enclosingClassName.equals(className)) {
+                    enumEnclosingClassName = ast.newSimpleName(enumConstant.getDeclaringType().getDeclaringType().getElementName());
+                } else {
+                    enumEnclosingClassName = ast.newName(enclosingClassName);
+                }
+                QualifiedName qualifiedName = ast.newQualifiedName(enumEnclosingClassName, enumClassName);
+                enumName = ast.newQualifiedName(qualifiedName, enumLiteral);
+            } else {
+                Name qualifiedName = ast.newName(enumConstant.getDeclaringType().getFullyQualifiedName());
+                enumName = ast.newQualifiedName(qualifiedName, enumLiteral);
+            }
+        } catch (JavaModelException jme) {
+            AnnotationsCorePlugin.log(jme.getStatus());
+        }
+        return enumName;
+    }
+
+    /**
      * Creates a new {@link TypeLiteral}.
      *
      * @param ast the {@link AST} that will be used to create the {@link TypeLiteral}.
diff --git a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationsManager.java b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationsManager.java
index ba93d16..da1eda5 100644
--- a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationsManager.java
+++ b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/AnnotationsManager.java
@@ -68,9 +68,6 @@
     private static final String ATT_NAME = "name"; //$NON-NLS-1$
     private static final String ATT_CATEGORY = "category"; //$NON-NLS-1$
 
-    //	private static final String ELEM_TARGET_FILTER = "targetFilter"; //$NON-NLS-1$
-    //	private static final String ATT_TARGET = "target"; //$NON-NLS-1$
-
     private AnnotationsManager() {
     }
 
@@ -102,6 +99,39 @@
     }
 
     /**
+     * Returns a list of all the contributed annotations that target the given {@link org.eclipse.jdt.core.IJavaElement}.
+     *
+     * @param element one of
+     * <li>org.eclipse.jdt.core.IPackageDeclaration</li>
+     * <li>org.eclipse.jdt.core.IType</li>
+     * <li>org.eclipse.jdt.core.IField</li>
+     * <li>org.eclipse.jdt.core.IMethod</li>
+     * <li>org.eclipse.jdt.core.ILocalVariable</li>
+     *
+     * @return a list of types which represent annotation types.
+     * @since 1.1
+     */
+    public static List<IType> getAnnotationTypes(IJavaElement javaElement) {
+        List<IType> annotations = new ArrayList<IType>();
+
+        try {
+            List<AnnotationDefinition> annotationDefinitions = getAllAnnotationsForElement(javaElement);
+
+            filterAnnotationsList(javaElement, annotationDefinitions);
+
+            for (AnnotationDefinition annotationDefinition : annotationDefinitions) {
+                IType type = annotationDefinition.getAnnotationType();
+                if (type != null) {
+                    annotations.add(type);
+                }
+            }
+        } catch (JavaModelException jme) {
+            AnnotationsCorePlugin.log(jme.getStatus());
+        }
+        return annotations;
+    }
+
+    /**
      * Returns a list of all the contributed {@link java.lang.annotation.Annotation} that target the given java element type.
      *
      * @param element one of
@@ -112,7 +142,9 @@
      * <li>org.eclipse.jdt.core.ILocalVariable</li>
      *
      * @return a list of annotations.
+     * @deprecated As of 1.1 replaced by {@link #getAnnotationTypes(IJavaElement)}}
      */
+    @Deprecated
     public static List<Class<? extends Annotation>> getAnnotations(IJavaElement javaElement) {
         List<Class<? extends Annotation>> annotations = new ArrayList<Class<? extends Annotation>>();
 
@@ -131,17 +163,15 @@
     }
 
     private static synchronized Map<String, AnnotationDefinition> getAnnotationToClassNameDefinitionMap() {
-
         if (annotationClassNameToDefinitionMap == null) {
             List<AnnotationDefinition> annotationDefinitions = getAnnotations();
 
             annotationClassNameToDefinitionMap = new HashMap<String, AnnotationDefinition>();
 
             for (AnnotationDefinition annotationDefinition : annotationDefinitions) {
-            	if (annotationDefinition.getAnnotationClass() != null) {
-                    annotationClassNameToDefinitionMap.put(annotationDefinition.getAnnotationClass()
-                            .getCanonicalName(), annotationDefinition);
-            	}
+                if (annotationDefinition.getAnnotationClassName() != null) {
+                    annotationClassNameToDefinitionMap.put(annotationDefinition.getAnnotationClassName(), annotationDefinition);
+                }
             }
         }
         return annotationClassNameToDefinitionMap;
@@ -195,6 +225,18 @@
     }
 
     /**
+     * Returns the {@link AnnotationDefinition} for the given {@link org.eclipse.jdt.core.IType}
+     * or null if no annotation definition can be found.
+     *
+     * @param annotationType an <code>org.eclipse.jdt.core.IType</code> which represents an annotation type.
+     * @return the annotation definition for the <code>org.eclipse.jdt.core.IType</code>.
+     * @since 1.1
+     */
+    public static AnnotationDefinition getAnnotationDefinitionForType(IType annotationType) {
+        return getAnnotationToClassNameDefinitionMap().get(annotationType.getFullyQualifiedName());
+    }
+
+    /**
      * Returns the {@link IAnnotationAttributeInitializer} for the given {@link org.eclipse.jdt.core.dom.Name}
      * or null if none can be found.
      * @param name a {@link SimpleName} or {@link QualifiedName} for the annotation to search for.
@@ -254,7 +296,6 @@
         if (annotationCategoryCache != null) {
             return annotationCategoryCache;
         }
-
         annotationCategoryCache = new HashMap<String, String>();
 
         IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(
@@ -274,7 +315,6 @@
         if (annotationInitializerCache != null) {
             return annotationInitializerCache;
         }
-
         annotationInitializerCache = new HashMap<String, IConfigurationElement>();
 
         IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(
@@ -326,41 +366,39 @@
         return ""; //$NON-NLS-1$
     }
 
-    private static List<AnnotationDefinition> getAllAnnotationsForElement(IJavaElement javaElement)
-    throws JavaModelException {
-
+    private static List<AnnotationDefinition> getAllAnnotationsForElement(IJavaElement javaElement) throws JavaModelException {
         if (javaElement instanceof IPackageDeclaration) {
-            return getAnnotationsForElementType(ElementType.PACKAGE);
+            return getAnnotationsForElementType(javaElement, ElementType.PACKAGE);
         }
 
         if (javaElement instanceof IType) {
             IType type = (IType) javaElement;
             if (type.isAnnotation()) {
-                return getAnnotationsForElementType(ElementType.ANNOTATION_TYPE);
+                return getAnnotationsForElementType(javaElement, ElementType.ANNOTATION_TYPE);
             }
-            return getAnnotationsForElementType(ElementType.TYPE);
+            return getAnnotationsForElementType(javaElement, ElementType.TYPE);
         }
 
         if (javaElement instanceof IField) {
-            return getAnnotationsForElementType(ElementType.FIELD);
+            return getAnnotationsForElementType(javaElement, ElementType.FIELD);
         }
 
         if (javaElement instanceof IMethod) {
-            return getAnnotationsForElementType(ElementType.METHOD);
+            return getAnnotationsForElementType(javaElement, ElementType.METHOD);
         }
 
         if (javaElement instanceof ILocalVariable) {
-            return getAnnotationsForElementType(ElementType.PARAMETER);
+            return getAnnotationsForElementType(javaElement, ElementType.PARAMETER);
         }
 
         if (javaElement instanceof IAnnotation) {
-            return getAnnotationsForElementType(ElementType.ANNOTATION_TYPE);
+            return getAnnotationsForElementType(javaElement, ElementType.ANNOTATION_TYPE);
         }
 
         return Collections.emptyList();
     }
 
-    private static List<AnnotationDefinition> getAnnotationsForElementType(ElementType elementType) {
+    private static List<AnnotationDefinition> getAnnotationsForElementType(IJavaElement javaElement, ElementType elementType) {
         List<AnnotationDefinition> annotationDefinitions = new ArrayList<AnnotationDefinition>();
 
         if (annotationCache == null) {
@@ -368,8 +406,10 @@
         }
 
         for (AnnotationDefinition annotationDefinition : annotationCache) {
-            if (annotationDefinition.getTargets().contains(elementType) &&
-                    !isDeprecated(annotationDefinition)) {
+            annotationDefinition.setJavaProject(javaElement.getJavaProject());
+
+            if (annotationDefinition.getAnnotationTypeTargets().contains(elementType) &&
+                    !annotationDefinition.isDeprecated()) {
                 annotationDefinitions.add(annotationDefinition);
             }
         }
@@ -396,7 +436,7 @@
                     annotationIter.remove();
                 }
                 if (method.isConstructor()
-                        && !annotationDefinition.getTargets().contains(ElementType.CONSTRUCTOR)) {
+                        && !annotationDefinition.getAnnotationTypeTargets().contains(ElementType.CONSTRUCTOR)) {
                     annotationIter.remove();
                 }
 
@@ -464,10 +504,4 @@
         }
         return false;
     }
-
-    //TODO Move the Deprecated option to preferences
-    private static boolean isDeprecated(AnnotationDefinition annotationDefinition) {
-        Class<?> annotationClass = annotationDefinition.getAnnotationClass();
-        return annotationClass.getAnnotation(java.lang.Deprecated.class) != null;
-    }
 }
diff --git a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/AnnotationAttributeInitializer.java b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/AnnotationAttributeInitializer.java
index e4c5d27..a34e14f 100644
--- a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/AnnotationAttributeInitializer.java
+++ b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/AnnotationAttributeInitializer.java
@@ -15,6 +15,7 @@
 import java.util.List;
 
 import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.Expression;
 import org.eclipse.jdt.core.dom.MemberValuePair;
@@ -40,59 +41,65 @@
  */
 public abstract class AnnotationAttributeInitializer implements IAnnotationAttributeInitializer {
 
-    protected static final String MISSING_IDENTIFER = "$missing$";
+	protected static final String MISSING_IDENTIFER = "$missing$";
 
-    protected AnnotationAttributeInitializer() {
+	protected AnnotationAttributeInitializer() {
+	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer#getMemberValuePairs(org.eclipse.jdt.core.IJavaElement, org.eclipse.jdt.core.dom.AST, java.lang.Class)
+	 */
+	@Deprecated
+	public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast,  Class<? extends Annotation> annotationClass) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @see org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer#getMemberValuePairs(org.eclipse.jdt.core.IJavaElement, org.eclipse.jdt.core.dom.AST, java.lang.Class)
+	 * @since 1.1
+	 */
+	public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, IType type) {
+	    return Collections.emptyList();
     }
 
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer#getMemberValuePairs(org.eclipse.jdt.core.IJavaElement, org.eclipse.jdt.core.dom.AST, java.lang.Class)
-     */
-    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast,
-            Class<? extends Annotation> annotationClass) {
-        return Collections.emptyList();
-    }
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer#getCompletionProposalsForMemberValuePair(org.eclipse.jdt.core.IJavaElement, org.eclipse.jdt.core.dom.MemberValuePair)
+	 */
+	public List<ICompletionProposal> getCompletionProposalsForMemberValuePair(IJavaElement javaElement,
+			MemberValuePair memberValuePair) {
+		return Collections.emptyList();
+	}
 
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer#getCompletionProposalsForMemberValuePair(org.eclipse.jdt.core.IJavaElement, org.eclipse.jdt.core.dom.MemberValuePair)
-     */
-    public List<ICompletionProposal> getCompletionProposalsForMemberValuePair(IJavaElement javaElement,
-            MemberValuePair memberValuePair) {
-        return Collections.emptyList();
-    }
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer#getCompletionProposalsForSingleMemberAnnotation(org.eclipse.jdt.core.IJavaElement, org.eclipse.jdt.core.dom.SingleMemberAnnotation)
+	 */
+	public List<ICompletionProposal> getCompletionProposalsForSingleMemberAnnotation(IJavaElement javaElement,
+			SingleMemberAnnotation singleMemberAnnotation) {
+		return Collections.emptyList();
+	}
 
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer#getCompletionProposalsForSingleMemberAnnotation(org.eclipse.jdt.core.IJavaElement, org.eclipse.jdt.core.dom.SingleMemberAnnotation)
-     */
-    public List<ICompletionProposal> getCompletionProposalsForSingleMemberAnnotation(IJavaElement javaElement,
-            SingleMemberAnnotation singleMemberAnnotation) {
-        return Collections.emptyList();
-    }
+	protected CompletionProposal createCompletionProposal(String proposal, Expression value) {
+		Image image = PlatformUI.getWorkbench().getSharedImages().getImage(org.eclipse.ui.ISharedImages.IMG_OBJ_FILE);
+		return createCompletionProposal(proposal, value, image, proposal);
+	}
 
-    protected CompletionProposal createCompletionProposal(String proposal, Expression value) {
-        Image image = PlatformUI.getWorkbench().getSharedImages().getImage(org.eclipse.ui.ISharedImages.IMG_OBJ_FILE);
-        return createCompletionProposal(proposal, value, image, proposal);
-    }
+	protected CompletionProposal createCompletionProposal(String proposal, Expression value, Image image, String displayString) {
+		int replacementOffset = value.getStartPosition();
+		int replacementLength = 0;
+		if (value.toString().equals(MISSING_IDENTIFER)) {
+			if (proposal.charAt(0) != '\"') {
+				proposal = "\"" + proposal;
+			}
+			if (proposal.charAt(proposal.length() - 1) != '\"') {
+				proposal = proposal + "\"";
+			}
+		} else {
+			replacementOffset += 1;
+			replacementLength = value.getLength() - 2;
+		}
 
-    protected CompletionProposal createCompletionProposal(String proposal, Expression value, Image image,
-            String displayString) {
-        int replacementOffset = value.getStartPosition();
-        int replacementLength = 0;
-        if (value.toString().equals(MISSING_IDENTIFER)) {
-            if (proposal.charAt(0) != '\"') {
-                proposal = "\"" + proposal;
-            }
-            if (proposal.charAt(proposal.length() - 1) != '\"') {
-                proposal = proposal + "\"";
-            }
-        } else {
-            replacementOffset += 1;
-            replacementLength = value.getLength() - 2;
-        }
-
-        return new CompletionProposal(proposal, replacementOffset, replacementLength, proposal.length(),
-                image, displayString, null, null);
-    }
+		return new CompletionProposal(proposal, replacementOffset, replacementLength, proposal.length(),
+				image, displayString, null, null);
+	}
 
 }
diff --git a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/DefaultsAnnotationAttributeInitializer.java b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/DefaultsAnnotationAttributeInitializer.java
index 0fb5bae..32dd540 100644
--- a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/DefaultsAnnotationAttributeInitializer.java
+++ b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/DefaultsAnnotationAttributeInitializer.java
@@ -15,10 +15,18 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.jdt.core.IField;
 import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMemberValuePair;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.MemberValuePair;
 import org.eclipse.jst.ws.annotations.core.AnnotationsCore;
+import org.eclipse.jst.ws.annotations.core.AnnotationsCorePlugin;
+import org.eclipse.jst.ws.internal.annotations.core.utils.SignatureUtils;
 
 /**
  * Constructs {@link MemberValuePair} from the defaults found in the given {@link java.lang.annotation.Annotation}.
@@ -40,13 +48,85 @@
      *  @see org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer#getMemberValuePairs(org.eclipse.jdt.core.IJavaElement, org.eclipse.jdt.core.dom.AST, java.lang.Class)
      */
     @Override
-    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast,
-            Class<? extends Annotation> annotationClass) {
+    @Deprecated
+    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, Class<? extends Annotation> annotationClass) {
         return getMemberValuePairs(ast, annotationClass);
     }
 
-    private List<MemberValuePair> getMemberValuePairs(AST ast,
-            Class<? extends Annotation> annotationClass) {
+    @Override
+    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, IType type) {
+        return interalGetMemberValuePairs(javaElement, ast, type);
+    }
+
+    private List<MemberValuePair> interalGetMemberValuePairs(IJavaElement javaElement, AST ast, IType type) {
+        List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
+
+        try {
+            IMethod[] methods = type.getMethods();
+            for (IMethod method : methods) {
+                String name = method.getElementName();
+                String returnType = method.getReturnType();
+                IMemberValuePair defaultValue = method.getDefaultValue();
+                if (defaultValue != null) {
+                    if (SignatureUtils.isString(returnType)) {
+                        memberValuePairs.add(AnnotationsCore.createStringMemberValuePair(ast,
+                                name, defaultValue.getValue().toString()));
+                    }
+
+                    if (SignatureUtils.isBoolean(returnType)) {
+                        memberValuePairs.add(AnnotationsCore.createBooleanMemberValuePair(ast,
+                                name, Boolean.parseBoolean(defaultValue.getValue().toString())));
+                    }
+
+                    int signatureKind = Signature.getTypeSignatureKind(returnType);
+                    if (signatureKind == Signature.BASE_TYPE_SIGNATURE) {
+                        if (returnType.charAt(0) == Signature.C_BYTE
+                                || returnType.charAt(0) == Signature.C_SHORT
+                                || returnType.charAt(0) == Signature.C_INT
+                                || returnType.charAt(0) == Signature.C_LONG
+                                || returnType.charAt(0) == Signature.C_FLOAT
+                                || returnType.charAt(0) == Signature.C_DOUBLE) {
+                            memberValuePairs.add(AnnotationsCore.createNumberMemberValuePair(ast, name, defaultValue.getValue().toString()));
+                        }
+                    }
+
+                    if (SignatureUtils.isArray(returnType)) {
+                        memberValuePairs.add(AnnotationsCore.createArrayMemberValuePair(ast, method.getElementName(),
+                                (Object[]) defaultValue.getValue()));
+                    }
+
+                    if (SignatureUtils.isEnum(method)) {
+                        if (defaultValue.getValueKind() == IMemberValuePair.K_QUALIFIED_NAME) {
+                            String value = defaultValue.getValue().toString();
+                            String enumName = value.substring(0, value.lastIndexOf("."));
+                            String constant = value.substring(value.lastIndexOf(".") + 1, value.length());
+                            IType enumType = javaElement.getJavaProject().findType(enumName);
+                            if (enumType != null && enumType.isEnum()) {
+                                IField[] fields = enumType.getFields();
+                                for (IField field : fields) {
+                                    if (field.isEnumConstant() && field.getElementName().equals(constant)) {
+                                        memberValuePairs.add(AnnotationsCore.createEnumMemberValuePair(ast,
+                                                method.getDeclaringType().getFullyQualifiedName(), name, field));
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    if (SignatureUtils.isClass(returnType)) {
+                        memberValuePairs.add(AnnotationsCore.createTypeMemberValuePair(ast, name,
+                                defaultValue.getValue()));
+                    }
+                }
+            }
+        } catch (JavaModelException jme) {
+            AnnotationsCorePlugin.log(jme.getStatus());
+        }
+
+        return memberValuePairs;
+    }
+
+    private List<MemberValuePair> getMemberValuePairs(AST ast, Class<? extends Annotation> annotationClass) {
         List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
 
         Method[] declaredMethods = annotationClass.getDeclaredMethods();
diff --git a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/IAnnotationAttributeInitializer.java b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/IAnnotationAttributeInitializer.java
index cabef2a..9878c02 100644
--- a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/IAnnotationAttributeInitializer.java
+++ b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/initialization/IAnnotationAttributeInitializer.java
@@ -13,6 +13,7 @@
 import java.util.List;
 
 import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.MemberValuePair;
 import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
@@ -38,11 +39,23 @@
      * @param annotationClass the {@link java.lang.annotation.Annotation} class which may be
      * used to query the declared members of the annotation type and the members default values.
      * @return a list of member value pairs.
+     * @deprecated as of 1.1 replaced by {@link IAnnotationAttributeInitializer2#getMemberValuePairs(IJavaElement, AST, IType)}
      */
+    @Deprecated
     public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast,
             Class<? extends java.lang.annotation.Annotation> annotationClass);
 
     /**
+     * Returns a list of {@link MemberValuePair} that may be added to a {@link NormalAnnotation}.
+     * @param javaElement the java element on which the annotation is declared.
+     * @param ast the <code>AST</code> with which to create the member value pairs.
+     * @param type the {@link org.eclipse.jdt.core.IType} which represents an annotation type,.
+     * @return a list of member value pairs.
+     * @since 1.1
+     */
+    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, IType type);
+
+    /**
      * Used to provide a list of {@link ICompletionProposal} for a {@link MemberValuePair} value.
      * @param javaElement the java element on which the annotation is declared.
      * @param memberValuePair the member value pair in which content assist was invoked.
diff --git a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/utils/AnnotationUtils.java b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/utils/AnnotationUtils.java
index d81033f..cbb7d5e 100644
--- a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/utils/AnnotationUtils.java
+++ b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/annotations/core/utils/AnnotationUtils.java
@@ -317,9 +317,10 @@
         final String annotationSimpleName = qualifiedName.substring(qualifiedName.lastIndexOf(".") + 1);
         final List<String> occurences = new ArrayList<String>();
         AnnotationDefinition annotationDefinition = AnnotationsManager.getAnnotationDefinitionForClass(qualifiedName);
+        annotationDefinition.setJavaProject(javaElement.getJavaProject());
         List<ElementType> elementTypes = Collections.emptyList();
         if (annotationDefinition != null) {
-            elementTypes = annotationDefinition.getTargets();
+            elementTypes = annotationDefinition.getAnnotationTypeTargets();
         }
         for (ElementType elementType : elementTypes) {
             if (elementType == ElementType.PACKAGE) {
diff --git a/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/internal/annotations/core/utils/SignatureUtils.java b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/internal/annotations/core/utils/SignatureUtils.java
new file mode 100644
index 0000000..28ea61e
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.annotations.core/src/org/eclipse/jst/ws/internal/annotations/core/utils/SignatureUtils.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Shane Clarke.
+ * All rights reserved. This program and 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:
+ *    Shane Clarke - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ws.internal.annotations.core.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
+
+public final class SignatureUtils {
+
+    private SignatureUtils() {
+    }
+
+    public static boolean isString(String returnType) {
+        int signatureKind = Signature.getTypeSignatureKind(returnType);
+        if (signatureKind == Signature.CLASS_TYPE_SIGNATURE) {
+            if (returnType.charAt(0) == Signature.C_RESOLVED) {
+                return Signature.toString(returnType).equals(java.lang.String.class.getCanonicalName());
+            }
+            if (returnType.charAt(0) == Signature.C_UNRESOLVED) {
+                return Signature.toString(returnType).equals(java.lang.String.class.getSimpleName());
+            }
+        }
+        return false;
+    }
+
+    public static boolean isClass(String returnType) {
+        int signatureKind = Signature.getTypeSignatureKind(returnType);
+        if (signatureKind == Signature.CLASS_TYPE_SIGNATURE) {
+            if (returnType.charAt(0) == Signature.C_RESOLVED) {
+                returnType = Signature.getTypeErasure(returnType);
+                return Signature.toString(returnType).equals(java.lang.Class.class.getCanonicalName());
+            }
+            if (returnType.charAt(0) == Signature.C_UNRESOLVED) {
+                returnType = Signature.getTypeErasure(returnType);
+                return Signature.toString(returnType).equals(java.lang.Class.class.getSimpleName());
+            }
+        }
+        return false;
+    }
+
+    public static boolean isBoolean(String returnType) {
+        int signatureKind = Signature.getTypeSignatureKind(returnType);
+        if (signatureKind == Signature.CLASS_TYPE_SIGNATURE) {
+            if (returnType.charAt(0) == Signature.C_RESOLVED) {
+                return Signature.toString(returnType).equals(java.lang.Boolean.class.getCanonicalName());
+            }
+            if (returnType.charAt(0) == Signature.C_UNRESOLVED) {
+                return Signature.toString(returnType).equals(java.lang.Boolean.class.getSimpleName());
+            }
+        }
+        if (signatureKind == Signature.BASE_TYPE_SIGNATURE) {
+            return returnType.charAt(0) == Signature.C_BOOLEAN;
+        }
+        return false;
+    }
+
+    public static boolean isArray(String returnType) {
+        return Signature.getTypeSignatureKind(returnType) == Signature.ARRAY_TYPE_SIGNATURE;
+    }
+
+    public static boolean isPrimitive(String returnType) {
+        return Signature.getTypeSignatureKind(returnType) == Signature.BASE_TYPE_SIGNATURE;
+    }
+
+    public static boolean isEnum(IMethod method) throws JavaModelException {
+        return getEnumReturnType(method) != null;
+    }
+
+    public static IType getEnumReturnType(IMethod method) throws JavaModelException {
+        String returnType = method.getReturnType();
+        int signatureKind = Signature.getTypeSignatureKind(returnType);
+        if (signatureKind == Signature.CLASS_TYPE_SIGNATURE) {
+            if (returnType.charAt(0) == Signature.C_RESOLVED) {
+                IType type = method.getJavaProject().findType(Signature.toString(returnType));
+                if (type != null && type.isEnum()) {
+                    return type;
+                }
+            }
+        }
+        return null;
+    }
+
+    public static String[] getEnumConstantsNames(IType enumType) throws JavaModelException {
+        if (enumType.isEnum()) {
+            List<String> enumConstants = new ArrayList<String>();
+            IField[] fields = getEnumConstants(enumType);
+            for (IField field : fields) {
+                enumConstants.add(field.getElementName());
+            }
+            return enumConstants.toArray(new String[enumConstants.size()]);
+        }
+        return new String[] {};
+    }
+
+    public static IField[] getEnumConstants(IType enumType) throws JavaModelException {
+        if (enumType.isEnum()) {
+            List<IField> enumConstants = new ArrayList<IField>();
+            IField[] fields = enumType.getFields();
+            for (IField field : fields) {
+                if (field.isEnumConstant()) {
+                    enumConstants.add(field);
+                }
+            }
+            return enumConstants.toArray(new IField[enumConstants.size()]);
+        }
+        return new IField[] {};
+    }
+
+
+}
diff --git a/bundles/org.eclipse.jst.ws.cxf.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.cxf.core/META-INF/MANIFEST.MF
index 9b15f96..09a34a6 100644
--- a/bundles/org.eclipse.jst.ws.cxf.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.jst.ws.cxf.core/META-INF/MANIFEST.MF
@@ -46,7 +46,7 @@
  org.eclipse.ui.console;bundle-version="[3.3.0,4.0.0)",
  org.eclipse.emf.ecore;bundle-version="[2.4.0,3.0.0)",
  org.eclipse.jdt.apt.core;bundle-version="[3.3.100,4.0.0)",
- org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.2.0)",
  org.eclipse.jst.ws.jaxws.core;bundle-version="[1.0.0,1.1.0)",
  org.eclipse.wst.command.env.core;bundle-version="[1.0.204,1.1.0)",
  javax.jws;bundle-version="[2.0.0,2.1.0)",
diff --git a/bundles/org.eclipse.jst.ws.cxf.core/src/org/eclipse/jst/ws/internal/cxf/core/utils/CXFModelUtils.java b/bundles/org.eclipse.jst.ws.cxf.core/src/org/eclipse/jst/ws/internal/cxf/core/utils/CXFModelUtils.java
index fac978f..b859fd1 100644
--- a/bundles/org.eclipse.jst.ws.cxf.core/src/org/eclipse/jst/ws/internal/cxf/core/utils/CXFModelUtils.java
+++ b/bundles/org.eclipse.jst.ws.cxf.core/src/org/eclipse/jst/ws/internal/cxf/core/utils/CXFModelUtils.java
@@ -40,6 +40,7 @@
 import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
 import org.eclipse.jdt.ui.CodeStyleConfiguration;
 import org.eclipse.jdt.ui.SharedASTProvider;
+import org.eclipse.jst.ws.annotations.core.AnnotationDefinition;
 import org.eclipse.jst.ws.annotations.core.AnnotationsCore;
 import org.eclipse.jst.ws.annotations.core.AnnotationsManager;
 import org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer;
@@ -124,13 +125,12 @@
         } else {
             List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
 
-            IAnnotationAttributeInitializer annotationAttributeInitializer =
-                AnnotationsManager.getAnnotationDefinitionForClass(WebService.class).
-                getAnnotationAttributeInitializer();
+            AnnotationDefinition annotationDefinition = AnnotationsManager.getAnnotationDefinitionForClass(WebService.class.getCanonicalName());
+            IAnnotationAttributeInitializer annotationAttributeInitializer = annotationDefinition.getAnnotationAttributeInitializer();
 
+            IType annotationType = annotationDefinition.getAnnotationType();
             if (annotationAttributeInitializer != null) {
-                memberValuePairs = annotationAttributeInitializer.getMemberValuePairs(type, ast,
-                        WebService.class);
+                memberValuePairs = annotationAttributeInitializer.getMemberValuePairs(type, ast, annotationType);
             }
 
             if (model.isUseServiceEndpointInterface() && type.isClass()) {
@@ -218,11 +218,13 @@
 
         List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
 
-        IAnnotationAttributeInitializer annotationAttributeInitializer = AnnotationsManager
-        .getAnnotationDefinitionForClass(annotationClass).getAnnotationAttributeInitializer();
+        AnnotationDefinition annotationDefinition = AnnotationsManager.getAnnotationDefinitionForClass(annotationClass.getCanonicalName());
+        IAnnotationAttributeInitializer annotationAttributeInitializer = annotationDefinition.getAnnotationAttributeInitializer();
+
+        IType annotationType = annotationDefinition.getAnnotationType();
 
         if (annotationAttributeInitializer != null) {
-            memberValuePairs = annotationAttributeInitializer.getMemberValuePairs(javaElement, ast, annotationClass);
+            memberValuePairs = annotationAttributeInitializer.getMemberValuePairs(javaElement, ast, annotationType);
         }
 
         return AnnotationsCore.createNormalAnnotation(ast, annotationClass.getSimpleName(), memberValuePairs);
diff --git a/bundles/org.eclipse.jst.ws.cxf.creation.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.cxf.creation.core/META-INF/MANIFEST.MF
index 58f19c7..b54ebc1 100644
--- a/bundles/org.eclipse.jst.ws.cxf.creation.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.jst.ws.cxf.creation.core/META-INF/MANIFEST.MF
@@ -23,7 +23,7 @@
  org.eclipse.jst.j2ee;bundle-version="[1.1.100,1.2.0)",
  org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,1.3.0)",
  org.eclipse.text;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.2.0)",
  org.eclipse.jst.ws.jaxws.core;bundle-version="[1.0.0,1.1.0)",
  org.eclipse.emf.ecore;bundle-version="[2.4.0,3.0.0)",
  org.eclipse.jem;bundle-version="[2.0.0,2.1.0)",
diff --git a/bundles/org.eclipse.jst.ws.cxf.creation.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.cxf.creation.ui/META-INF/MANIFEST.MF
index 079c554..2e44690 100644
--- a/bundles/org.eclipse.jst.ws.cxf.creation.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.jst.ws.cxf.creation.ui/META-INF/MANIFEST.MF
@@ -29,7 +29,7 @@
  org.eclipse.jst.ws.creation.ui;bundle-version="[1.0.305,1.1.0)",
  org.eclipse.jst.ws;bundle-version="[1.0.304,1.1.0)",
  org.eclipse.ltk.core.refactoring;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.2.0)",
  org.eclipse.jst.ws.jaxws.core;bundle-version="[1.0.0,1.1.0)",
  org.eclipse.emf.common;bundle-version="[2.4.0,3.0.0)",
  javax.wsdl;bundle-version="[1.6.2,1.7.0)",
diff --git a/bundles/org.eclipse.jst.ws.jaxb.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.jaxb.core/META-INF/MANIFEST.MF
index d07d651..ca75b58 100644
--- a/bundles/org.eclipse.jst.ws.jaxb.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.jst.ws.jaxb.core/META-INF/MANIFEST.MF
@@ -6,11 +6,8 @@
 Bundle-Version: 1.0.0.qualifier
 Bundle-ClassPath: .
 Bundle-Localization: plugin
-Eclipse-RegisterBuddy: org.eclipse.jst.ws.annotations.core
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-Activator: org.eclipse.jst.ws.internal.jaxb.core.JAXBCorePlugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)"
-Export-Package: org.eclipse.jst.ws.internal.jaxb.core
-Import-Package: javax.xml.bind.annotation;version="[2.1.0,2.2.0)",
- javax.xml.bind.annotation.adapters;version="[2.1.0,2.2.0)"
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.jst.ws.annotations.core;bundle-version="1.1.0"
 Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.jst.ws.jaxb.core/plugin.xml b/bundles/org.eclipse.jst.ws.jaxb.core/plugin.xml
index 3120700..4e39150 100644
--- a/bundles/org.eclipse.jst.ws.jaxb.core/plugin.xml
+++ b/bundles/org.eclipse.jst.ws.jaxb.core/plugin.xml
@@ -17,15 +17,6 @@
             category="jaxb.category"
             class="javax.xml.bind.annotation.XmlAccessorType"
             name="XmlAccessorType"/>
-      
-      <!-- TODO Reinstate when XmlAdapter issue is solved
-      <annotation
-            category="jaxb.category"
-            class="javax.xml.bind.annotation.adapters.XmlAdapter"
-            name="XmlAdapter">
-      </annotation>
-      -->
-      
       <annotation
             category="jaxb.category"
             class="javax.xml.bind.annotation.XmlAnyAttribute"
@@ -177,5 +168,5 @@
             name="XmlValue">
       </annotation>
    </extension>
-   
+
 </plugin>
diff --git a/bundles/org.eclipse.jst.ws.jaxws.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.jaxws.core/META-INF/MANIFEST.MF
index 8fd4f15..5ad2752 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.jst.ws.jaxws.core/META-INF/MANIFEST.MF
@@ -6,7 +6,6 @@
 Bundle-Version: 1.0.100.qualifier
 Bundle-ClassPath: .
 Bundle-Localization: plugin
-Eclipse-RegisterBuddy: org.eclipse.jst.ws.annotations.core
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-Activator: org.eclipse.jst.ws.internal.jaxws.core.JAXWSCorePlugin
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
@@ -14,7 +13,7 @@
  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.jdt.apt.core;bundle-version="[3.3.100,4.0.0)",
  org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.2.0)",
  javax.wsdl;bundle-version="[1.6.2,1.7.0)",
  javax.xml.soap;bundle-version="[1.2.0,1.3.0)",
  org.apache.xerces;bundle-version="[2.9.0,3.0.0)",
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.jaxws.ui/META-INF/MANIFEST.MF
index e37f56c..8860e92 100755
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/META-INF/MANIFEST.MF
@@ -17,7 +17,7 @@
  org.eclipse.ltk.core.refactoring;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ui.editors;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.jdt.launching;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.2.0)",
  org.eclipse.jdt.apt.core;bundle-version="[3.3.100,4.0.0)",
  org.eclipse.jst.ws.jaxws.dom.runtime;bundle-version="[1.0.0,1.1.0)",
  org.eclipse.emf.ecore;bundle-version="[2.4.0,3.0.0)"
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/BindingTypeAttributeInitializer.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/BindingTypeAttributeInitializer.java
index cc5a1f2..3199c7c 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/BindingTypeAttributeInitializer.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/BindingTypeAttributeInitializer.java
@@ -11,14 +11,16 @@
 package org.eclipse.jst.ws.internal.jaxws.ui.annotations.initialization;

 

 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.VALUE;

-import java.lang.annotation.Annotation;

+

 import java.util.ArrayList;

 import java.util.HashMap;

 import java.util.Iterator;

 import java.util.List;

 import java.util.Map;

+

 import javax.xml.ws.http.HTTPBinding;

 import javax.xml.ws.soap.SOAPBinding;

+

 import org.eclipse.jdt.core.IJavaElement;

 import org.eclipse.jdt.core.IType;

 import org.eclipse.jdt.core.dom.AST;

@@ -49,10 +51,9 @@
         JAXWSUIPlugin.getDefault().getImageRegistry().put(HTTP_BINDING,

                 JAXWSUIPlugin.getImageDescriptor("icons/obj16/httpbinding_obj.gif").createImage()); //$NON-NLS-1$

     }

-

+    

     @Override

-    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast,

-            Class<? extends Annotation> annotationClass) {

+    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, IType annotationType) {

         List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();

         if (javaElement.getElementType() == IJavaElement.TYPE) {

             MemberValuePair value = AnnotationsCore.createStringMemberValuePair(ast, VALUE, getDefault()); //$NON-NLS-1$

diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/RequestWrapperAttributeInitializer.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/RequestWrapperAttributeInitializer.java
index 77f6d70..0e66985 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/RequestWrapperAttributeInitializer.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/RequestWrapperAttributeInitializer.java
@@ -17,7 +17,6 @@
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.OPERATION_NAME;
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.TARGET_NAMESPACE;
 
-import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -40,10 +39,9 @@
 import org.eclipse.jst.ws.jaxws.core.utils.JDTUtils;
 
 public class RequestWrapperAttributeInitializer extends AnnotationAttributeInitializer {
-
+    
     @Override
-    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast,
-            Class<? extends Annotation> annotationClass) {
+    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, IType annotationType) {
         List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
         if (javaElement.getElementType() == IJavaElement.METHOD) {
             IMethod method = (IMethod) javaElement;
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/SOAPBindingAttributeInitializer.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/SOAPBindingAttributeInitializer.java
index dd1124f..5e9b337 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/SOAPBindingAttributeInitializer.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/SOAPBindingAttributeInitializer.java
@@ -14,7 +14,6 @@
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.STYLE;
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.USE;
 
-import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -24,16 +23,16 @@
 import javax.jws.soap.SOAPBinding.Use;
 
 import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.MemberValuePair;
 import org.eclipse.jst.ws.annotations.core.AnnotationsCore;
 import org.eclipse.jst.ws.annotations.core.initialization.AnnotationAttributeInitializer;
 
 public class SOAPBindingAttributeInitializer extends AnnotationAttributeInitializer {
-
+    
     @Override
-    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast,
-            Class<? extends Annotation> annotationClass) {
+    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, IType annotationType) {
         List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
 
         MemberValuePair styleValuePair = AnnotationsCore.createEnumMemberValuePair(ast,
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebMethodAttributeInitializer.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebMethodAttributeInitializer.java
index 7d1ea92..1297bb2 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebMethodAttributeInitializer.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebMethodAttributeInitializer.java
@@ -13,7 +13,6 @@
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.ACTION;
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.OPERATION_NAME;
 
-import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -30,22 +29,20 @@
 import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
 
 public class WebMethodAttributeInitializer extends AnnotationAttributeInitializer {
-    
+        
     @Override
-    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast,
-            Class<? extends Annotation> annotationClass) {
+    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, IType annotationType) {
 
         List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
 
         if (javaElement.getElementType() == IJavaElement.METHOD) {
             IMethod method = (IMethod) javaElement;
-            IType type = method.getCompilationUnit().findPrimaryType();
             
             MemberValuePair operationValuePair = AnnotationsCore.createStringMemberValuePair(ast, 
-                    OPERATION_NAME, getOperationNameValue(type, method));
+                    OPERATION_NAME, getOperationNameValue(method));
 
             MemberValuePair actionValuePair = AnnotationsCore.createStringMemberValuePair(ast, 
-                    ACTION, getActionValue(type, method));
+                    ACTION, getActionValue(method));
 
             memberValuePairs.add(operationValuePair);
             memberValuePairs.add(actionValuePair);
@@ -61,17 +58,16 @@
         
         if (javaElement.getElementType() == IJavaElement.METHOD) {
             IMethod method = (IMethod) javaElement;
-            IType type = method.getCompilationUnit().findPrimaryType();
             
             String memberValuePairName = memberValuePair.getName().getIdentifier();
 
             if (memberValuePairName.equals(OPERATION_NAME)) {
-                completionProposals.add(createCompletionProposal(getOperationNameValue(type, method), 
+                completionProposals.add(createCompletionProposal(getOperationNameValue(method), 
                 		memberValuePair.getValue()));
             }
             
             if (memberValuePairName.equals(ACTION)) {
-                completionProposals.add(createCompletionProposal(getActionValue(type, method),
+                completionProposals.add(createCompletionProposal(getActionValue(method),
                 		memberValuePair.getValue()));
             }
 
@@ -79,7 +75,7 @@
         return completionProposals;
     }
 
-    private String getOperationNameValue(IType type, IMethod method) {
+    private String getOperationNameValue(IMethod method) {
         try {
             return method.getElementName() + JAXWSUtils.accountForOverloadedMethods(method);
         } catch (JavaModelException jme) {
@@ -88,7 +84,7 @@
         return ""; //$NON-NLS-1$
     }
     
-    private String getActionValue(IType type, IMethod method) {
+    private String getActionValue(IMethod method) {
         try {
             String methodName = method.getElementName();
             return "urn:" + methodName.substring(0, 1).toUpperCase()  //$NON-NLS-1$
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebParamAttributeInitializer.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebParamAttributeInitializer.java
index c6916bc..f2a301e 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebParamAttributeInitializer.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebParamAttributeInitializer.java
@@ -17,7 +17,6 @@
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.PART_NAME;
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.TARGET_NAMESPACE;
 
-import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -43,10 +42,9 @@
 import org.eclipse.jst.ws.jaxws.core.utils.JDTUtils;
 
 public class WebParamAttributeInitializer extends AnnotationAttributeInitializer {
-
+    
     @Override
-    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement,
-            AST ast, Class<? extends Annotation> annotationClass) {
+    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, IType annotationType) {
 
         List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
 
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebResultAttributeInitializer.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebResultAttributeInitializer.java
index bdf5964..e697ba3 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebResultAttributeInitializer.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebResultAttributeInitializer.java
@@ -18,7 +18,6 @@
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.RETURN;
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.TARGET_NAMESPACE;
 
-import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -47,8 +46,7 @@
 public class WebResultAttributeInitializer extends AnnotationAttributeInitializer {
     
     @Override
-    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast,
-            Class<? extends Annotation> annotationClass) {
+    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, IType annotationType) {
         List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
 
         if (javaElement.getElementType() == IJavaElement.METHOD) {
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebServiceAttributeInitializer.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebServiceAttributeInitializer.java
index 1163586..1560b25 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebServiceAttributeInitializer.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/annotations/initialization/WebServiceAttributeInitializer.java
@@ -18,7 +18,6 @@
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.SERVICE_SUFFIX;
 import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.TARGET_NAMESPACE;
 
-import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -40,8 +39,7 @@
 public class WebServiceAttributeInitializer extends AnnotationAttributeInitializer {
 
     @Override
-    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast,
-            Class<? extends Annotation> annotationClass) {
+    public List<MemberValuePair> getMemberValuePairs(IJavaElement javaElement, AST ast, IType annotationType) {
         
         List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
         if (javaElement.getElementType() == IJavaElement.TYPE) {
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationArrayCellEditor.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationArrayCellEditor.java
index e3dff5c..e15a819 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationArrayCellEditor.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationArrayCellEditor.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.jst.ws.internal.jaxws.ui.views;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -20,9 +19,12 @@
 import java.util.Set;
 
 import org.eclipse.jdt.core.IAnnotation;
+import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.IMemberValuePair;
+import org.eclipse.jdt.core.IMethod;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.search.SearchEngine;
 import org.eclipse.jdt.ui.IJavaElementSearchConstants;
 import org.eclipse.jdt.ui.ISharedImages;
@@ -39,6 +41,7 @@
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.window.Window;
+import org.eclipse.jst.ws.internal.annotations.core.utils.SignatureUtils;
 import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIMessages;
 import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
 import org.eclipse.swt.SWT;
@@ -59,7 +62,7 @@
 import org.eclipse.ui.dialogs.SelectionStatusDialog;
 
 public class AnnotationArrayCellEditor extends DialogCellEditor {
-    private Method method;
+    private IMethod method;
     private Object[] values;
 
     private List<Object> originalValues;
@@ -89,7 +92,7 @@
         return values;
     }
 
-    public void setMethod(Method method) {
+    public void setMethod(IMethod method) {
         this.method = method;
         if (updatedValues != null) {
             updatedValues.clear();
@@ -184,263 +187,296 @@
         protected Control createDialogArea(Composite parent) {
             Composite mainComposite = (Composite) super.createDialogArea(parent);
 
-            GridLayout gridLayout = new GridLayout(3, false);
-            mainComposite.setLayout(gridLayout);
+            try {
+                GridLayout gridLayout = new GridLayout(3, false);
+                mainComposite.setLayout(gridLayout);
 
-            GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, false, false);
-            gridData.widthHint = 800;
-            mainComposite.setLayoutData(gridData);
+                GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, false, false);
+                gridData.widthHint = 800;
+                mainComposite.setLayoutData(gridData);
 
-            Composite typeComposite = new Composite(mainComposite, SWT.NONE);
-            gridLayout = new GridLayout(3, false);
-            typeComposite.setLayout(gridLayout);
-            gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, true);
-            typeComposite.setLayoutData(gridData);
+                Composite typeComposite = new Composite(mainComposite, SWT.NONE);
+                gridLayout = new GridLayout(3, false);
+                typeComposite.setLayout(gridLayout);
+                gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, true);
+                typeComposite.setLayoutData(gridData);
 
-            final Class<?> componentType = method.getReturnType().getComponentType();
-            if (componentType.isAnnotation()) {
-                Label compontTypeLabel = new Label(typeComposite, SWT.NONE);
-                compontTypeLabel.setText("@" + componentType.getName()); //$NON-NLS-1$
-                gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-                gridData.horizontalSpan = 3;
-                compontTypeLabel.setLayoutData(gridData);
+                final IType componentType = getComponentType(method);
+                if (componentType != null) {
+                    if (componentType.isAnnotation()) {
+                        Label compontTypeLabel = new Label(typeComposite, SWT.NONE);
+                        compontTypeLabel.setText("@" + componentType.getFullyQualifiedName()); //$NON-NLS-1$
+                        gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+                        gridData.horizontalSpan = 3;
+                        compontTypeLabel.setLayoutData(gridData);
 
-                Method[] methods = componentType.getDeclaredMethods();
-                for (Method method : methods) {
-                    Label label = new Label(typeComposite, SWT.NONE);
-                    label.setText(method.getName() + ":"); //$NON-NLS-1$
-                    createEntryFields(method, typeComposite);
-                }
-            } else {
-                Label label = new Label(typeComposite, SWT.NONE);
-                label.setText(method.getReturnType().getSimpleName());
-                createEntryFields(method, typeComposite);
-            }
-
-            Composite buttonComposite = new Composite(mainComposite, SWT.NONE);
-            gridLayout = new GridLayout(1, false);
-            buttonComposite.setLayout(gridLayout);
-
-            addButton = new Button(buttonComposite, SWT.PUSH);
-            addButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_ADD_LABEL);
-            addButton.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent event) {
-                    Set<Entry<String, Control>> entrySet = controls.entrySet();
-                    Iterator<Map.Entry<String, Control>> iterator = entrySet.iterator();
-                    List<Map<String, Object>> aList = new ArrayList<Map<String,Object>>();
-                    while (iterator.hasNext()) {
-                        Map.Entry<String, Control> entry = iterator.next();
-                        if (entry.getValue() instanceof Text) {
-                            Text textField = (Text) entry.getValue();
-                            Method method = (Method) textField.getData();
-                            if (textField.getText().trim().length() > 0) {
-                                if (componentType.isAnnotation()) {
-                                    Map<String, Object> memberValuePairs = new HashMap<String, Object>();
-                                    memberValuePairs.put(method.getName(), textField.getText());
-                                    aList.add(memberValuePairs);
-                                } else {
-                                    updatedValues.add(textField.getText());
-                                }
-                            }
+                        IMethod[] methods = componentType.getMethods();
+                        for (IMethod method : methods) {
+                            Label label = new Label(typeComposite, SWT.NONE);
+                            label.setText(method.getElementName() + ":"); //$NON-NLS-1$
+                            createEntryFields(method, typeComposite);
                         }
-                        if (entry.getValue() instanceof Button) {
-                            Button button = (Button) entry.getValue();
-                            Method method = (Method) button.getData();
-                            if (componentType.isAnnotation()) {
-                                Map<String, Object> memberValuePairs = new HashMap<String, Object>();
-                                memberValuePairs.put(method.getName(), button.getSelection());
-                                aList.add(memberValuePairs);
-                            } else {
-                                updatedValues.add(button.getSelection());
-                            }
-                        }
-
-                    }
-                    if (aList.size() > 0) {
-                        updatedValues.add(aList);
-                    }
-                    arrayValuesTableViewer.refresh();
-                }
-            });
-            gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
-            addButton.setLayoutData(gridData);
-
-            removeButton = new Button(buttonComposite, SWT.PUSH);
-            removeButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_REMOVE_LABEL);
-            removeButton.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent event) {
-                    ISelection selection = arrayValuesTableViewer.getSelection();
-                    if (selection != null && !selection.isEmpty()) {
-                        int index = arrayValuesTable.getSelectionIndex();
-                        updatedValues.remove(index);
-                        arrayValuesTableViewer.refresh();
+                    } else {
+                        Label label = new Label(typeComposite, SWT.NONE);
+                        label.setText(Signature.getSimpleName(Signature.toString(method.getReturnType())));
+                        createEntryFields(method, typeComposite);
                     }
                 }
-            });
-            gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
-            removeButton.setLayoutData(gridData);
 
-            upButton = new Button(buttonComposite, SWT.PUSH);
-            upButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_UP_LABEL);
-            upButton.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    moveSelectedElememtUp(getSelectedElement(), getTableViewer());
-                }
-            });
+                Composite buttonComposite = new Composite(mainComposite, SWT.NONE);
+                gridLayout = new GridLayout(1, false);
+                buttonComposite.setLayout(gridLayout);
 
-            gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
-            upButton.setLayoutData(gridData);
-
-            downButton = new Button(buttonComposite, SWT.PUSH);
-            downButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_DOWN_LABEL);
-            downButton.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    moveSelectedElememtDown(getSelectedElement(), getTableViewer());
-                }
-            });
-            gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
-            downButton.setLayoutData(gridData);
-
-            Composite valuesComposite = new Composite(mainComposite, SWT.NONE);
-            gridLayout = new GridLayout(1, false);
-            valuesComposite.setLayout(gridLayout);
-            gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-            gridData.widthHint = 200;
-            valuesComposite.setLayoutData(gridData);
-
-            Label valuesLabel = new Label(valuesComposite, SWT.NONE);
-            valuesLabel.setText(method.getName() + ":"); //$NON-NLS-1$
-
-            arrayValuesTableViewer = new TableViewer(valuesComposite, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL
-                    | SWT.H_SCROLL);
-            arrayValuesTableViewer.setLabelProvider(new LabelProvider() {
-                @Override
-                public String getText(Object element) {
-                    if (element instanceof List<?>) {
-                        String annotationName = method.getReturnType().getComponentType().getSimpleName();
-                        annotationName += "("; //$NON-NLS-1$
-                        List<Map<String, Object>> valuesList = (List<Map<String, Object>>)element;
-                        Iterator<Map<String, Object>> valuesIterator = valuesList.iterator();
-                        while (valuesIterator.hasNext()) {
-                            Map<String, Object> valuesMap = valuesIterator.next();
-                            Set<Entry<String, Object>> entrySet = valuesMap.entrySet();
-                            Iterator<Map.Entry<String, Object>> iterator = entrySet.iterator();
+                addButton = new Button(buttonComposite, SWT.PUSH);
+                addButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_ADD_LABEL);
+                addButton.addSelectionListener(new SelectionAdapter() {
+                    @Override
+                    public void widgetSelected(SelectionEvent event) {
+                        try {
+                            Set<Entry<String, Control>> entrySet = controls.entrySet();
+                            Iterator<Map.Entry<String, Control>> iterator = entrySet.iterator();
+                            List<Map<String, Object>> aList = new ArrayList<Map<String,Object>>();
                             while (iterator.hasNext()) {
-                                Map.Entry<String, Object> entry = iterator.next();
-                                Object value = entry.getValue();
-                                boolean isString = value instanceof String && !value.toString().
-                                endsWith(".class"); //$NON-NLS-1$
-                                if (isString) {
-                                    annotationName += entry.getKey() + "=\"" + value + "\""; //$NON-NLS-1$ //$NON-NLS-2$
-                                } else {
-                                    annotationName += entry.getKey() + "=" + value; //$NON-NLS-1$
+                                Map.Entry<String, Control> entry = iterator.next();
+                                if (entry.getValue() instanceof Text) {
+                                    Text textField = (Text) entry.getValue();
+                                    IMethod methodAA = (IMethod) textField.getData();
+                                    if (textField.getText().trim().length() > 0) {
+                                        if (componentType != null && componentType.isAnnotation())  {
+                                            Map<String, Object> memberValuePairs = new HashMap<String, Object>();
+                                            memberValuePairs.put(methodAA.getElementName(), textField.getText());
+                                            aList.add(memberValuePairs);
+                                        } else {
+                                            updatedValues.add(textField.getText());
+                                        }
+                                    }
+                                }
+                                if (entry.getValue() instanceof Button) {
+                                    Button button = (Button) entry.getValue();
+                                    IMethod methodVV = (IMethod) button.getData();
+                                    if (componentType != null && componentType.isAnnotation()) {
+                                        Map<String, Object> memberValuePairs = new HashMap<String, Object>();
+                                        memberValuePairs.put(methodVV.getElementName(), button.getSelection());
+                                        aList.add(memberValuePairs);
+                                    } else {
+                                        updatedValues.add(button.getSelection());
+                                    }
                                 }
                             }
-                            if (valuesIterator.hasNext()) {
-                                annotationName += ", "; //$NON-NLS-1$
+                            if (aList.size() > 0) {
+                                updatedValues.add(aList);
                             }
+                            arrayValuesTableViewer.refresh();
+                        } catch (JavaModelException jme) {
+                            JAXWSUIPlugin.log(jme.getStatus());
                         }
-                        return annotationName += ")"; //$NON-NLS-1$
                     }
-                    return element.toString();
-                }
+                });
+                gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
+                addButton.setLayoutData(gridData);
 
-                @Override
-                public Image getImage(Object element) {
-                    Class<?> returnType = method.getReturnType();
-                    if (returnType.getComponentType().isAnnotation()) {
-                        return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_ANNOTATION);
-                    } if (returnType.equals(Class.class)) {
-                        return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CLASS);
-                    } else {
-                        return PlatformUI.getWorkbench().getSharedImages().getImage(
-                                org.eclipse.ui.ISharedImages.IMG_OBJ_FILE);
+                removeButton = new Button(buttonComposite, SWT.PUSH);
+                removeButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_REMOVE_LABEL);
+                removeButton.addSelectionListener(new SelectionAdapter() {
+                    @Override
+                    public void widgetSelected(SelectionEvent event) {
+                        ISelection selection = arrayValuesTableViewer.getSelection();
+                        if (selection != null && !selection.isEmpty()) {
+                            int index = arrayValuesTable.getSelectionIndex();
+                            updatedValues.remove(index);
+                            arrayValuesTableViewer.refresh();
+                        }
                     }
-                }
-            });
+                });
+                gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
+                removeButton.setLayoutData(gridData);
 
-            arrayValuesTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-                public void selectionChanged(SelectionChangedEvent event) {
-                    int index = arrayValuesTable.getSelectionIndex();
-                    int itemCount = arrayValuesTable.getItemCount();
+                upButton = new Button(buttonComposite, SWT.PUSH);
+                upButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_UP_LABEL);
+                upButton.addSelectionListener(new SelectionAdapter() {
+                    @Override
+                    public void widgetSelected(SelectionEvent e) {
+                        moveSelectedElememtUp(getSelectedElement(), getTableViewer());
+                    }
+                });
 
-                    if (index == 0 && itemCount <= 1) {
-                        upButton.setEnabled(false);
-                        downButton.setEnabled(false);
+                gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
+                upButton.setLayoutData(gridData);
+
+                downButton = new Button(buttonComposite, SWT.PUSH);
+                downButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_DOWN_LABEL);
+                downButton.addSelectionListener(new SelectionAdapter() {
+                    @Override
+                    public void widgetSelected(SelectionEvent e) {
+                        moveSelectedElememtDown(getSelectedElement(), getTableViewer());
+                    }
+                });
+                gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
+                downButton.setLayoutData(gridData);
+
+                Composite valuesComposite = new Composite(mainComposite, SWT.NONE);
+                gridLayout = new GridLayout(1, false);
+                valuesComposite.setLayout(gridLayout);
+                gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+                gridData.widthHint = 200;
+                valuesComposite.setLayoutData(gridData);
+
+                Label valuesLabel = new Label(valuesComposite, SWT.NONE);
+                valuesLabel.setText(method.getElementName() + ":"); //$NON-NLS-1$
+
+                arrayValuesTableViewer = new TableViewer(valuesComposite, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL);
+                arrayValuesTableViewer.setLabelProvider(new LabelProvider() {
+                    @Override
+                    public String getText(Object element) {
+                        if (element instanceof List<?>) {
+                            String annotationName = componentType.getElementName();
+                            annotationName += "("; //$NON-NLS-1$
+                            @SuppressWarnings("unchecked")
+                            List<Map<String, Object>> valuesList = (List<Map<String, Object>>) element;
+                            Iterator<Map<String, Object>> valuesIterator = valuesList.iterator();
+                            while (valuesIterator.hasNext()) {
+                                Map<String, Object> valuesMap = valuesIterator.next();
+                                Set<Entry<String, Object>> entrySet = valuesMap.entrySet();
+                                Iterator<Map.Entry<String, Object>> iterator = entrySet.iterator();
+                                while (iterator.hasNext()) {
+                                    Map.Entry<String, Object> entry = iterator.next();
+                                    Object value = entry.getValue();
+                                    boolean isString = value instanceof String && !value.toString().endsWith(".class"); //$NON-NLS-1$
+                                    if (isString) {
+                                        annotationName += entry.getKey() + "=\"" + value + "\""; //$NON-NLS-1$ //$NON-NLS-2$
+                                    } else {
+                                        annotationName += entry.getKey() + "=" + value; //$NON-NLS-1$
+                                    }
+                                }
+                                if (valuesIterator.hasNext()) {
+                                    annotationName += ", "; //$NON-NLS-1$
+                                }
+                            }
+                            return annotationName += ")"; //$NON-NLS-1$
+                        }
+                        return element.toString();
                     }
 
-                    if (index == 0 && itemCount > 1) {
-                        upButton.setEnabled(false);
-                        downButton.setEnabled(true);
+                    @Override
+                    public Image getImage(Object element) {
+                        try {
+                            if (componentType != null && componentType.isAnnotation()) {
+                                return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_ANNOTATION);
+                            } else if (SignatureUtils.isClass(method.getReturnType())) {
+                                return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CLASS);
+                            } else {
+                                return PlatformUI.getWorkbench().getSharedImages().getImage(
+                                        org.eclipse.ui.ISharedImages.IMG_OBJ_FILE);
+                            }
+                        } catch (JavaModelException jme) {
+                            JAXWSUIPlugin.log(jme.getStatus());
+                        }
+                        return null;
                     }
+                });
 
-                    if (index > 0 && index < itemCount - 1) {
-                        upButton.setEnabled(true);
-                        downButton.setEnabled(true);
+                arrayValuesTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+                    public void selectionChanged(SelectionChangedEvent event) {
+                        int index = arrayValuesTable.getSelectionIndex();
+                        int itemCount = arrayValuesTable.getItemCount();
+
+                        if (index == 0 && itemCount <= 1) {
+                            upButton.setEnabled(false);
+                            downButton.setEnabled(false);
+                        }
+
+                        if (index == 0 && itemCount > 1) {
+                            upButton.setEnabled(false);
+                            downButton.setEnabled(true);
+                        }
+
+                        if (index > 0 && index < itemCount - 1) {
+                            upButton.setEnabled(true);
+                            downButton.setEnabled(true);
+                        }
+
+                        if (index > 0 && index == itemCount - 1) {
+                            upButton.setEnabled(true);
+                            downButton.setEnabled(false);
+                        }
+
+                        if (index != -1) {
+                            removeButton.setEnabled(true);
+                        } else {
+                            removeButton.setEnabled(false);
+                        }
                     }
+                });
 
-                    if (index > 0 && index == itemCount - 1) {
-                        upButton.setEnabled(true);
-                        downButton.setEnabled(false);
-                    }
+                arrayValuesTableViewer.setContentProvider(new ArrayValuesContentProvider());
 
-                    if (index != -1) {
-                        removeButton.setEnabled(true);
-                    } else {
-                        removeButton.setEnabled(false);
-                    }
-                }
-            });
+                arrayValuesTable = arrayValuesTableViewer.getTable();
+                gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+                arrayValuesTable.setLayoutData(gridData);
 
-            arrayValuesTableViewer.setContentProvider(new ArrayValuesContentProvider());
+                arrayValuesTableViewer.setInput(values);
 
-            arrayValuesTable = arrayValuesTableViewer.getTable();
-            gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-            arrayValuesTable.setLayoutData(gridData);
-
-            arrayValuesTableViewer.setInput(values);
-
-            upButton.setEnabled(false);
-            downButton.setEnabled(false);
-            removeButton.setEnabled(false);
+                upButton.setEnabled(false);
+                downButton.setEnabled(false);
+                removeButton.setEnabled(false);
+            } catch (JavaModelException jme) {
+                JAXWSUIPlugin.log(jme.getStatus());
+            }
 
             return mainComposite;
         }
 
-        public void createEntryFields(Method method, Composite typeComposite) {
+        private IType getComponentType(IMethod method) throws JavaModelException {
+            String returnType = method.getReturnType();
+            if (SignatureUtils.isArray(returnType)) {
+                String elementType = Signature.getElementType(returnType);
+                IType declaringType = method.getDeclaringType();
+                IJavaProject javaProject = declaringType.getJavaProject();
+                if (javaProject != null) {
+                    return javaProject.findType(Signature.toString(elementType));
+                }
+            }
+            return null;
+        }
+
+        private void createEntryFields(IMethod method, Composite typeComposite) throws JavaModelException {
             //TODO Handle ENUMS
-            Class<?> returnType = method.getReturnType();
-            Object defaultValue = method.getDefaultValue();
-            GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+            String returnType = method.getReturnType();
+            IMemberValuePair defaultValue = method.getDefaultValue();
+            GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
             //String or String[]
-            if (returnType.equals(String.class) || returnType.isArray() && returnType.getComponentType().equals(String.class)) {
+            if (SignatureUtils.isString(returnType) || SignatureUtils.isArray(returnType) && SignatureUtils.isString(Signature.getElementType(returnType))) {
                 Text text = new Text(typeComposite, SWT.BORDER);
                 text.setData(method);
                 gridData.horizontalSpan = 2;
                 text.setLayoutData(gridData);
                 if (defaultValue != null) {
-                    if (defaultValue instanceof String[] && ((String[]) defaultValue).length == 1) {
-                        String[] values = (String[]) defaultValue;
-                        text.setText(values[0]);
+                    Object value = defaultValue.getValue();
+                    if (value instanceof Object[]) {
+                        Object[] values = (Object[]) value;
+                        if (values.length == 1) {
+                            text.setText(values[0].toString());
+                        }
+                    } else if (value instanceof String[]) {
+                        String[] values = (String[]) value;
+                        if (values.length == 1) {
+                            text.setText(values[0]);
+                        }
                     } else {
-                        text.setText(defaultValue.toString().trim());
+                        text.setText(value.toString().trim());
                     }
                 }
-                controls.put(method.getName(), text);
+                controls.put(method.getElementName(), text);
             }
             //Class or Class[]
-            if (returnType.equals(Class.class) || returnType.isArray() && returnType.getComponentType().equals(Class.class)) {
+            if (SignatureUtils.isClass(returnType) || SignatureUtils.isArray(returnType) && SignatureUtils.isClass(Signature.getElementType(returnType))) {
                 final Text text = new Text(typeComposite, SWT.BORDER);
                 text.setData(method);
-                gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+                gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
                 text.setLayoutData(gridData);
-                if (defaultValue != null) {
-                    Class<?> classValue = (Class<?>)defaultValue;
-                    text.setText(classValue.getCanonicalName() + ".class"); //$NON-NLS-1$
+                if (defaultValue != null && defaultValue.getValueKind() == IMemberValuePair.K_CLASS) {
+                    Object value = defaultValue.getValue();
+                    text.setText(value + ".class"); //$NON-NLS-1$
                 }
                 Button browseClassButton = new Button(typeComposite, SWT.PUSH);
                 browseClassButton.setText(getBrowseButtonLabel());
@@ -462,19 +498,19 @@
                     }
                 });
                 browse_button_count++;
-                controls.put(method.getName(), text);
+                controls.put(method.getElementName(), text);
             }
 
             //Boolean
-            if (returnType.equals(Boolean.TYPE)) {
+            if (SignatureUtils.isBoolean(returnType)) {
                 Button checkbox = new Button(typeComposite, SWT.CHECK);
                 checkbox.setData(method);
                 gridData.horizontalSpan = 2;
                 checkbox.setLayoutData(gridData);
                 if (defaultValue != null) {
-                    checkbox.setSelection((Boolean)defaultValue);
+                    checkbox.setSelection((Boolean) defaultValue.getValue());
                 }
-                controls.put(method.getName(), checkbox);
+                controls.put(method.getElementName(), checkbox);
             }
         }
 
@@ -497,7 +533,7 @@
             }
         }
 
-        public Object getSelectedElement() {
+        private Object getSelectedElement() {
             IStructuredSelection selection= (IStructuredSelection) arrayValuesTableViewer.getSelection();
             return selection.getFirstElement();
         }
@@ -506,7 +542,7 @@
             return arrayValuesTableViewer;
         }
 
-        public void moveSelectedElememtUp(Object selected, TableViewer tableViewer) {
+        private void moveSelectedElememtUp(Object selected, TableViewer tableViewer) {
             int selectionIndex = tableViewer.getTable().getSelectionIndex();
             if (selectionIndex > 0) {
                 updatedValues.remove(selected);
@@ -518,7 +554,7 @@
             }
         }
 
-        public void moveSelectedElememtDown(Object selected, TableViewer tableViewer) {
+        private void moveSelectedElememtDown(Object selected, TableViewer tableViewer) {
             int selectionIndex = tableViewer.getTable().getSelectionIndex();
             int itemCount = tableViewer.getTable().getItemCount();
             if (selectionIndex < itemCount - 1) {
@@ -547,7 +583,7 @@
             }
         }
 
-        public SelectionDialog getClassSelectionDialog() {
+        private SelectionDialog getClassSelectionDialog() {
             try {
                 return JavaUI.createTypeDialog(getShell(), PlatformUI.getWorkbench().getProgressService(),
                         SearchEngine.createWorkspaceScope(), IJavaElementSearchConstants.CONSIDER_CLASSES,
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsColumnLabelProvider.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsColumnLabelProvider.java
index c75726a..9b9019f 100755
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsColumnLabelProvider.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsColumnLabelProvider.java
@@ -10,8 +10,8 @@
  *******************************************************************************/

 package org.eclipse.jst.ws.internal.jaxws.ui.views;

 

-import java.lang.reflect.Method;

-

+import org.eclipse.jdt.core.IMethod;

+import org.eclipse.jdt.core.IType;

 import org.eclipse.jdt.ui.ISharedImages;

 import org.eclipse.jdt.ui.JavaUI;

 import org.eclipse.jface.viewers.ColumnLabelProvider;

@@ -22,22 +22,22 @@
 

     @Override

     public String getText(Object element) {

-        if (element instanceof Class) {

-            return ((Class<?>)element).getName();

+        if (element instanceof IType) {

+            return ((IType) element).getFullyQualifiedName();

         }

         

-        if (element instanceof Method) {

-            return ((Method)element).getName();

+        if (element instanceof IMethod) {

+            return ((IMethod) element).getElementName();

         }

         return ""; //$NON-NLS-1$

     }

 

     @Override

     public Image getImage(Object element) {

-        if (element instanceof Class) {

+        if (element instanceof IType) {

             return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_ANNOTATION);

         }

-        if (element instanceof Method) {

+        if (element instanceof IMethod) {

             return PlatformUI.getWorkbench().getSharedImages().getImage(

                     org.eclipse.ui.ISharedImages.IMG_OBJ_FILE);

         }

diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesColumnLabelProvider.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesColumnLabelProvider.java
index facea9c..437f270 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesColumnLabelProvider.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesColumnLabelProvider.java
@@ -10,11 +10,13 @@
  *******************************************************************************/
 package org.eclipse.jst.ws.internal.jaxws.ui.views;
 
-import java.lang.reflect.Method;
 import java.util.List;
 
 import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.dom.Annotation;
 import org.eclipse.jdt.core.dom.ArrayInitializer;
 import org.eclipse.jdt.core.dom.BooleanLiteral;
@@ -25,6 +27,7 @@
 import org.eclipse.jface.viewers.ColumnLabelProvider;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jst.ws.annotations.core.utils.AnnotationUtils;
+import org.eclipse.jst.ws.internal.annotations.core.utils.SignatureUtils;
 import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
 import org.eclipse.swt.graphics.Image;
 
@@ -43,13 +46,17 @@
 
     @Override
     public String getText(Object element) {
-        if (element instanceof Method) {
-            return getTextForMethod((Method)element);
+        if (element instanceof IMethod) {
+            try {
+                return getTextForMethod((IMethod) element);
+            } catch (JavaModelException jme) {
+                JAXWSUIPlugin.log(jme.getStatus());
+            }
         }
         return ""; //$NON-NLS-1$
     }
 
-    private String getTextForMethod(Method method) {
+    private String getTextForMethod(IMethod method) throws JavaModelException {
         if (annotationTreeViewer.getInput() instanceof IJavaElement) {
             IJavaElement javaElement = (IJavaElement) annotationTreeViewer.getInput();
             if (javaElement.exists()) {
@@ -59,47 +66,51 @@
         return ""; //$NON-NLS-1$
     }
 
-    private String getTextForMethod(Method method, IJavaElement annotatedElement) {
+    private String getTextForMethod(IMethod method, IJavaElement annotatedElement) throws JavaModelException {
         List<Annotation> annotations = AnnotationUtils.getAnnotations(annotatedElement);
         for (Annotation annotation : annotations) {
             String annotationName = AnnotationUtils.getAnnotationName(annotation);
-            Class<?> declaringClass = method.getDeclaringClass();
-            if (annotationName.equals(declaringClass.getSimpleName())
-                    || annotationName.equals(declaringClass.getCanonicalName())) {
+            IType type = method.getDeclaringType();
+            if (type != null && annotationName.equals(type.getElementName())
+                    || annotationName.equals(type.getFullyQualifiedName())) {
                 if (annotation.isNormalAnnotation()) {
                     NormalAnnotation normalAnnotation = (NormalAnnotation) annotation;
                     @SuppressWarnings("unchecked")
                     List<MemberValuePair> memberValuePairs = normalAnnotation.values();
                     for (MemberValuePair memberValuePair : memberValuePairs) {
-                        if (memberValuePair.getName().getIdentifier().equals(method.getName())) {
-                            return getTextForMethod(method.getReturnType(), memberValuePair.getValue());
+                        if (memberValuePair.getName().getIdentifier().equals(method.getElementName())) {
+                            return getTextForMethod(method, memberValuePair.getValue());
                         }
                     }
                 } else if (annotation.isSingleMemberAnnotation()) {
                     SingleMemberAnnotation singleMemberAnnotation = (SingleMemberAnnotation) annotation;
-                    return getTextForMethod(method.getReturnType(), singleMemberAnnotation.getValue());
+                    return getTextForMethod(method, singleMemberAnnotation.getValue());
                 }
             }
         }
         return ""; //$NON-NLS-1$
     }
 
-    private String getTextForMethod(Class<?> returnType, Expression expression) {
-        if (returnType.equals(String.class)) {
+    private String getTextForMethod(IMethod method, Expression expression) throws JavaModelException {
+        String returnType = method.getReturnType();
+
+        if (SignatureUtils.isString(returnType) || SignatureUtils.isClass(returnType)) {
             return expression.toString();
         }
 
-        if (returnType.equals(Class.class)) {
-            return expression.toString() + ".class"; //$NON-NLS-1$
+        if (SignatureUtils.isEnum(method)) {
+            String enumValue = expression.toString();
+            return enumValue.substring(enumValue.lastIndexOf(".") + 1); //$NON-NLS-1$
         }
-        if (returnType.isPrimitive() && (returnType.equals(Byte.TYPE)
-                || returnType.equals(Short.TYPE) || returnType.equals(Integer.TYPE)
-                || returnType.equals(Long.TYPE)  || returnType.equals(Float.TYPE)
-                || returnType.equals(Double.TYPE))) {
+
+        if (SignatureUtils.isPrimitive(returnType) && (returnType.charAt(0) == Signature.C_BYTE
+                || returnType.charAt(0) == Signature.C_SHORT || returnType.charAt(0) == Signature.C_INT
+                || returnType.charAt(0) == Signature.C_LONG  || returnType.charAt(0) == Signature.C_FLOAT
+                || returnType.charAt(0) == Signature.C_DOUBLE)) {
             return expression.toString();
         }
 
-        if (returnType.isArray() && expression instanceof ArrayInitializer) {
+        if (SignatureUtils.isArray(returnType) && expression instanceof ArrayInitializer) {
             ArrayInitializer arrayInitializer = (ArrayInitializer) expression;
             if (arrayInitializer.expressions().size() > 0) {
                 return "[]{...}"; //$NON-NLS-1$
@@ -107,21 +118,17 @@
                 return "[]{}"; //$NON-NLS-1$
             }
         }
-        if (returnType.isEnum()) {
-            String enumValue = expression.toString();
-            return enumValue.substring(enumValue.lastIndexOf(".") + 1); //$NON-NLS-1$
-        }
         return ""; //$NON-NLS-1$
     }
 
     @Override
     public Image getImage(Object element) {
         try {
-            if (element instanceof Class) {
-                return getImageForClass((Class<?>) element);
+            if (element instanceof IType) {
+                return getImageForClass((IType) element);
             }
-            if (element instanceof Method) {
-                return getImageForMethod((Method) element);
+            if (element instanceof IMethod) {
+                return getImageForMethod((IMethod) element);
             }
         } catch (JavaModelException jme) {
             JAXWSUIPlugin.log(jme.getStatus());
@@ -129,30 +136,30 @@
         return null;
     }
 
-    private Image getImageForClass(Class<?> aClass) throws JavaModelException {
+    private Image getImageForClass(IType type) throws JavaModelException {
         if (annotationTreeViewer.getInput() instanceof IJavaElement) {
             IJavaElement javaElement = (IJavaElement) annotationTreeViewer.getInput();
             if (javaElement.exists()) {
-                return getImageForClass(aClass, javaElement);
+                return getImageForClass(type, javaElement);
             }
         }
         return null;
     }
 
-    private Image getImageForClass(Class<?> aClass, IJavaElement javaElement) throws JavaModelException {
+    private Image getImageForClass(IType type, IJavaElement javaElement) throws JavaModelException {
         List<Annotation> annotations = AnnotationUtils.getAnnotations(javaElement);
         for (Annotation annotation : annotations) {
             String annotationName = AnnotationUtils.getAnnotationName(annotation);
-            if (annotationName.equals(aClass.getSimpleName()) ||
-                    annotationName.equals(aClass.getCanonicalName())) {
+            if (annotationName.equals(type.getElementName()) ||
+                    annotationName.equals(type.getFullyQualifiedName())) {
                 return true_image;
             }
         }
         return false_image;
     }
 
-    private Image getImageForMethod(Method method) throws JavaModelException {
-        if (method.getReturnType().equals(Boolean.TYPE) && annotationTreeViewer.getInput() instanceof IJavaElement) {
+    private Image getImageForMethod(IMethod method) throws JavaModelException {
+        if (SignatureUtils.isBoolean(method.getReturnType()) && annotationTreeViewer.getInput() instanceof IJavaElement) {
             IJavaElement javaElement = (IJavaElement) annotationTreeViewer.getInput();
             if (javaElement.exists()) {
                 return getImageForMethod(method, javaElement);
@@ -161,19 +168,19 @@
         return null;
     }
 
-    private Image getImageForMethod(Method method, IJavaElement javaElement) throws JavaModelException {
+    private Image getImageForMethod(IMethod method, IJavaElement javaElement) throws JavaModelException {
         List<Annotation> annotations = AnnotationUtils.getAnnotations(javaElement);
         for (Annotation annotation : annotations) {
             String annotationName = AnnotationUtils.getAnnotationName(annotation);
-            Class<?> declaringClass = method.getDeclaringClass();
-            if (annotationName.equals(declaringClass.getSimpleName())
-                    || annotationName.equals(declaringClass.getCanonicalName())) {
+            IType declaringType = method.getDeclaringType();
+            if (declaringType != null && annotationName.equals(declaringType.getElementName())
+                    || annotationName.equals(declaringType.getFullyQualifiedName())) {
                 if (annotation.isNormalAnnotation()) {
                     NormalAnnotation normalAnnotation = (NormalAnnotation) annotation;
                     @SuppressWarnings("unchecked")
                     List<MemberValuePair> memberValuePairs = normalAnnotation.values();
                     for (MemberValuePair memberValuePair : memberValuePairs) {
-                        if (memberValuePair.getName().getIdentifier().equals(method.getName())
+                        if (memberValuePair.getName().getIdentifier().equals(method.getElementName())
                                 && memberValuePair.getValue() instanceof BooleanLiteral) {
                             if (((BooleanLiteral) memberValuePair.getValue()).booleanValue()) {
                                 return true_image;
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesEditingSupport.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesEditingSupport.java
index 36931eb..21e27c4 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesEditingSupport.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesEditingSupport.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.jst.ws.internal.jaxws.ui.views;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
@@ -27,10 +26,13 @@
 import org.eclipse.jdt.core.IAnnotation;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.ILocalVariable;
 import org.eclipse.jdt.core.IMemberValuePair;
 import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.Annotation;
@@ -53,6 +55,7 @@
 import org.eclipse.jst.ws.annotations.core.AnnotationsManager;
 import org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer;
 import org.eclipse.jst.ws.annotations.core.utils.AnnotationUtils;
+import org.eclipse.jst.ws.internal.annotations.core.utils.SignatureUtils;
 import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIMessages;
 import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
 import org.eclipse.ltk.core.refactoring.Change;
@@ -63,6 +66,7 @@
 import org.eclipse.text.edits.MultiTextEdit;
 
 public class AnnotationsValuesEditingSupport extends EditingSupport {
+
     private AnnotationsView annotationsView;
     private TreeViewer treeViewer;
 
@@ -85,97 +89,99 @@
 
     @Override
     protected boolean canEdit(Object element) {
-        if (element instanceof Method) {
-            Method method = (Method)element;
-            return (Boolean) getValue(method.getDeclaringClass());
+        if (element instanceof IMethod) {
+            IMethod method = (IMethod) element;
+            return (Boolean) getValue(method.getDeclaringType());
         }
         return true;
     }
 
     @Override
     protected CellEditor getCellEditor(Object element) {
-        if (element instanceof Class) {
+        if (element instanceof IType) {
             return checkboxCellEditor;
         }
-        if (element instanceof Method) {
-            Method method = (Method) element;
-            final Class<?> returnType = method.getReturnType();
-            if (returnType.isEnum()) {
-                Object[] enumConstants = returnType.getEnumConstants();
-                String[] values = new String[enumConstants.length];
-                for (int i = 0; i < enumConstants.length; i++) {
-                    values[i] = enumConstants[i].toString();
+        if (element instanceof IMethod) {
+            try {
+                IMethod method = (IMethod) element;
+
+                IType enumType = SignatureUtils.getEnumReturnType(method);
+                if (enumType != null) {
+                    comboBoxCellEditor.setItems(SignatureUtils.getEnumConstantsNames(enumType));
+                    return comboBoxCellEditor;
                 }
-                comboBoxCellEditor.setItems(values);
-                return comboBoxCellEditor;
-            }
-            if (returnType.equals(Boolean.TYPE)) {
-                return checkboxCellEditor;
-            }
 
-            if (returnType.equals(Class.class)) {
-                return classDialogCellEditor;
-            }
+                final String returnType = method.getReturnType();
 
-            if (returnType.isArray()) {
-                annotationArrayCellEditor.setMethod(method);
-                return annotationArrayCellEditor;
-            }
-            if (returnType.isPrimitive()) {
-                textCellEditor.setValidator(new ICellEditorValidator() {
-                    public String isValid(Object value) {
-                        try {
-                            if (returnType.equals(Byte.TYPE)) {
-                                Byte.parseByte((String) value);
+                if (SignatureUtils.isBoolean(returnType)) {
+                    return checkboxCellEditor;
+                }
+
+                if (SignatureUtils.isClass(returnType)) {
+                    return classDialogCellEditor;
+                }
+
+                if (SignatureUtils.isArray(returnType)) {
+                    annotationArrayCellEditor.setMethod(method);
+                    return annotationArrayCellEditor;
+                }
+                if (SignatureUtils.isPrimitive(returnType)) {
+                    textCellEditor.setValidator(new ICellEditorValidator() {
+                        public String isValid(Object value) {
+                            try {
+                                if (returnType.charAt(0) == Signature.C_BYTE) {
+                                    Byte.parseByte((String) value);
+                                }
+                                if (returnType.charAt(0) == Signature.C_SHORT) {
+                                    Short.parseShort((String) value);
+                                }
+                                if (returnType.charAt(0) == Signature.C_INT) {
+                                    Integer.parseInt((String) value);
+                                }
+                                if (returnType.charAt(0) == Signature.C_LONG) {
+                                    Long.parseLong((String) value);
+                                }
+                                if (returnType.charAt(0) == Signature.C_FLOAT) {
+                                    Float.parseFloat((String) value);
+                                }
+                                if (returnType.charAt(0) == Signature.C_DOUBLE) {
+                                    Double.parseDouble((String) value);
+                                }
+                            } catch (NumberFormatException nfe) {
+                                return JAXWSUIMessages.ANNOTATION_EDITING_SUPPORT_NOT_VALID_MESSAGE_PREFIX + value;
                             }
-                            if (returnType.equals(Short.TYPE)) {
-                                Short.parseShort((String) value);
-                            }
-                            if (returnType.equals(Integer.TYPE)) {
-                                Integer.parseInt((String) value);
-                            }
-                            if (returnType.equals(Long.TYPE)) {
-                                Long.parseLong((String) value);
-                            }
-                            if (returnType.equals(Float.TYPE)) {
-                                Float.parseFloat((String) value);
-                            }
-                            if (returnType.equals(Double.TYPE)) {
-                                Double.parseDouble((String) value);
-                            }
-                        } catch (NumberFormatException nfe) {
-                            return JAXWSUIMessages.ANNOTATION_EDITING_SUPPORT_NOT_VALID_MESSAGE_PREFIX
-                            + returnType.getSimpleName();
+                            return null;
                         }
-                        return null;
-                    }
-                });
+                    });
+                    return textCellEditor;
+                }
                 return textCellEditor;
+            } catch (JavaModelException jme) {
+                JAXWSUIPlugin.log(jme.getStatus());
             }
-            return textCellEditor;
         }
         return checkboxCellEditor;
     }
 
     @Override
     protected Object getValue(Object element) {
-        if (element instanceof Class) {
-            return getValueForClass((Class<?>) element);
+        if (element instanceof IType) {
+            return getValueForClass((IType) element);
         }
-        if (element instanceof Method) {
-            return getValueForMethod((Method) element);
+        if (element instanceof IMethod) {
+            return getValueForMethod((IMethod) element);
         }
         return null;
     }
 
-    private Object getValueForClass(Class<?> aClass) {
+    private Object getValueForClass(IType type) {
         if (treeViewer.getInput() instanceof IAnnotatable) {
-            return getValueForClass(aClass, (IAnnotatable) treeViewer.getInput());
+            return getValueForClass(type, (IAnnotatable) treeViewer.getInput());
         }
         return Boolean.FALSE;
     }
 
-    private Object getValueForClass(Class<?> aClass, IAnnotatable annotatedElement) {
+    private Object getValueForClass(IType type, IAnnotatable annotatedElement) {
         if (annotatedElement instanceof ILocalVariable) {
             ILocalVariable localVariable = getLocalVariable(annotatedElement);
             if (localVariable != null) {
@@ -187,8 +193,8 @@
             for (IAnnotation annotation : annotations) {
                 String annotationName = annotation.getElementName();
                 if (AnnotationUtils.isAnnotationPresent((IJavaElement)annotatedElement, annotationName)
-                        && (annotationName.equals(aClass.getSimpleName())
-                                || annotationName.equals(aClass.getCanonicalName()))) {
+                        && (annotationName.equals(type.getElementName())
+                                || annotationName.equals(type.getFullyQualifiedName()))) {
                     return Boolean.TRUE;
                 }
             }
@@ -198,7 +204,7 @@
         return Boolean.FALSE;
     }
 
-    private Object getValueForMethod(Method method) {
+    private Object getValueForMethod(IMethod method) {
         Object value = null;
         try {
             if (treeViewer.getInput() instanceof IAnnotatable) {
@@ -210,50 +216,51 @@
         return value;
     }
 
-    private Object getValueForMethod(Method method, IAnnotatable annotatedElement) throws JavaModelException {
+    private Object getValueForMethod(IMethod method, IAnnotatable annotatedElement) throws JavaModelException {
         if (annotatedElement instanceof ILocalVariable) {
             ILocalVariable localVariable = getLocalVariable(annotatedElement);
             if (localVariable != null) {
                 annotatedElement = localVariable;
             }
         }
-        Class<?> returnType = method.getReturnType();
+        String returnType = method.getReturnType();
         IAnnotation[] annotations = annotatedElement.getAnnotations();
         for (IAnnotation annotation : annotations) {
-            Class<?> declaringClass = method.getDeclaringClass();
+            IType declaringType = method.getDeclaringType();
+
             String annotationName = annotation.getElementName();
-            if (annotationName.equals(declaringClass.getSimpleName())
-                    || annotationName.equals(declaringClass.getCanonicalName())) {
+            if (annotationName.equals(declaringType.getElementName())
+                    || annotationName.equals(declaringType.getFullyQualifiedName())) {
                 IMemberValuePair[] memberValuePairs = annotation.getMemberValuePairs();
                 for (IMemberValuePair memberValuePair : memberValuePairs) {
-                    if (memberValuePair.getMemberName().equals(method.getName())) {
-                        if (returnType.equals(String.class)) {
+                    if (memberValuePair.getMemberName().equals(method.getElementName())) {
+                        if (SignatureUtils.isString(returnType)) {
                             return memberValuePair.getValue();
                         }
 
-                        if (returnType.isEnum()) {
+                        IType enumType = SignatureUtils.getEnumReturnType(method);
+                        if (enumType != null) {
                             String enumValue = memberValuePair.getValue().toString();
                             String literal = enumValue.substring(enumValue.lastIndexOf(".") + 1); //$NON-NLS-1$
-                            Object[] enumConstants = method.getReturnType().getEnumConstants();
+                            String[] enumConstants = SignatureUtils.getEnumConstantsNames(enumType);
                             for (int i = 0; i < enumConstants.length; i++) {
-                                if (enumConstants[i].toString().equals(literal)) {
+                                if (enumConstants[i].equals(literal)) {
                                     return i;
                                 }
                             }
                         }
-
-                        if (returnType.equals(Class.class)) {
+                        if (SignatureUtils.isClass(returnType)) {
                             return memberValuePair.getValue();
                         }
 
-                        if (returnType.equals(Boolean.TYPE)) {
+                        if (SignatureUtils.isBoolean(returnType)) {
                             return memberValuePair.getValue();
                         }
 
-                        if (returnType.isPrimitive()) {
+                        if (SignatureUtils.isPrimitive(returnType)) {
                             return ""; //$NON-NLS-1$
                         }
-                        if (returnType.isArray()) {
+                        if (SignatureUtils.isArray(returnType)) {
                             if (memberValuePair.getValueKind() == IMemberValuePair.K_CLASS) {
                                 Object[] arrayValues = (Object[])memberValuePair.getValue();
                                 for (int i = 0; i < arrayValues.length; i++) {
@@ -266,28 +273,35 @@
                         }
                     }
                 }
-                return getDefaultValueForMethod(returnType);
+                return getDefaultValueForMethod(method);
             }
         }
         return null;
     }
 
-    private Object getDefaultValueForMethod(Class<?> returnType) {
-        if (returnType.equals(String.class)) {
+    private Object getDefaultValueForMethod(IMethod method) throws JavaModelException {
+        String returnType = method.getReturnType();
+
+        if (SignatureUtils.isString(returnType)) {
             return ""; //$NON-NLS-1$
         }
-        if (returnType.equals(Boolean.TYPE)) {
+
+        if (SignatureUtils.isBoolean(returnType)) {
             return Boolean.FALSE;
         }
-        if (returnType.isEnum()) {
+
+        if (SignatureUtils.isEnum(method)) {
             return -1;
         }
-        if (returnType.isPrimitive()) {
+
+        if (SignatureUtils.isPrimitive(returnType)) {
             return ""; //$NON-NLS-1$
         }
-        if (returnType.isArray()) {
+
+        if (SignatureUtils.isArray(returnType)) {
             return new Object[] {};
         }
+
         return null;
     }
 
@@ -310,41 +324,34 @@
         }
 
         try {
-            if (element instanceof Class && ((Class<?>) element).isAnnotation()) {
-                @SuppressWarnings("unchecked")
-                Class<? extends java.lang.annotation.Annotation> annotationClass =
-                    (Class<? extends java.lang.annotation.Annotation>) element;
-                if (annotationClass != null) {
-                    setValueForClass(annotationClass, (Boolean) value);
-                }
+            if (element instanceof IType && ((IType) element).isAnnotation()) {
+                setValueForClass((IType) element, (Boolean) value);
             }
-            if (element instanceof Method) {
-                setValueForMethod((Method) element, value);
+
+            if (element instanceof IMethod) {
+                setValueForMethod((IMethod) element, value);
             }
         } catch (CoreException ce) {
             JAXWSUIPlugin.log(ce.getStatus());
         }
     }
 
-    private void setValueForClass(Class<? extends java.lang.annotation.Annotation> annotationClass,
-            Boolean annotate) throws CoreException {
+    private void setValueForClass(IType type, Boolean annotate) throws CoreException {
         Object viewerInput = treeViewer.getInput();
 
         IAnnotationAttributeInitializer annotationAttributeInitializer =
-            AnnotationsManager.getAnnotationDefinitionForClass(annotationClass).getAnnotationAttributeInitializer();
+            AnnotationsManager.getAnnotationDefinitionForClass(type.getFullyQualifiedName()).getAnnotationAttributeInitializer();
 
         if (viewerInput instanceof IJavaElement) {
-            setValueForClass(annotationClass, annotate, (IJavaElement) viewerInput, annotationAttributeInitializer);
+            setValueForClass(type, annotate, (IJavaElement) viewerInput, annotationAttributeInitializer);
         }
     }
 
-    private Annotation getAnnotation(AST ast, Class<? extends java.lang.annotation.Annotation> annotationClass,
-            List<MemberValuePair> memberValuePairs) {
-
+    private Annotation getAnnotation(AST ast, IType type, List<MemberValuePair> memberValuePairs) throws JavaModelException {
         Annotation annotation =  null;
-        int numberOfDeclaredMethods = annotationClass.getDeclaredMethods().length;
+        int numberOfDeclaredMethods = type.getMethods().length;
         if (numberOfDeclaredMethods == 0) {
-            annotation = AnnotationsCore.createMarkerAnnotation(ast, annotationClass.getSimpleName());
+            annotation = AnnotationsCore.createMarkerAnnotation(ast, type.getElementName());
         } else if (numberOfDeclaredMethods == 1) {
             Expression value = null;
             if (memberValuePairs != null && memberValuePairs.size() == 1) {
@@ -354,28 +361,27 @@
                 }
             }
             if (value != null) {
-                annotation = AnnotationsCore.createSingleMemberAnnotation(ast, annotationClass.getSimpleName(), value);
+                annotation = AnnotationsCore.createSingleMemberAnnotation(ast, type.getElementName(), value);
             } else {
-                annotation = AnnotationsCore.createNormalAnnotation(ast, annotationClass.getSimpleName(), memberValuePairs);
+                annotation = AnnotationsCore.createNormalAnnotation(ast, type.getElementName(), memberValuePairs);
             }
         } else if (numberOfDeclaredMethods > 1) {
-            annotation = AnnotationsCore.createNormalAnnotation(ast, annotationClass.getSimpleName(), memberValuePairs);
+            annotation = AnnotationsCore.createNormalAnnotation(ast, type.getElementName(), memberValuePairs);
         }
 
         return annotation;
     }
 
-    private void setValueForClass(Class<? extends java.lang.annotation.Annotation> annotationClass,
-            Boolean annotate, IJavaElement javaElement, IAnnotationAttributeInitializer annotationAttributeInitializer)
-    throws CoreException {
+    private void setValueForClass(IType type, Boolean annotate, IJavaElement javaElement,
+            IAnnotationAttributeInitializer annotationAttributeInitializer) throws CoreException {
         ICompilationUnit source = AnnotationUtils.getCompilationUnitFromJavaElement(javaElement);
         CompilationUnit compilationUnit = SharedASTProvider.getAST(source, SharedASTProvider.WAIT_YES, null);
         AST ast = compilationUnit.getAST();
 
         List<MemberValuePair> memberValuePairs = getMemberValuePairs(annotationAttributeInitializer, javaElement,
-                ast, annotationClass);
+                ast, type);
 
-        Annotation annotation = getAnnotation(ast, annotationClass, memberValuePairs);
+        Annotation annotation = getAnnotation(ast, type, memberValuePairs);
 
         TextFileChange change = new TextFileChange("Add/Remove Annotation", (IFile) source.getResource()); //$NON-NLS-1$
         MultiTextEdit multiTextEdit = new MultiTextEdit();
@@ -387,7 +393,7 @@
                     || javaElement.getElementType() == IJavaElement.FIELD
                     || javaElement.getElementType() == IJavaElement.METHOD
                     || javaElement.getElementType() == IJavaElement.LOCAL_VARIABLE) {
-                change.addEdit(AnnotationUtils.createAddImportTextEdit(javaElement, annotationClass.getCanonicalName()));
+                change.addEdit(AnnotationUtils.createAddImportTextEdit(javaElement, type.getFullyQualifiedName()));
                 change.addEdit(AnnotationUtils.createAddAnnotationTextEdit(javaElement, annotation));
             }
         } else {
@@ -396,25 +402,37 @@
                     || javaElement.getElementType() == IJavaElement.FIELD
                     || javaElement.getElementType() == IJavaElement.METHOD
                     || javaElement.getElementType() == IJavaElement.LOCAL_VARIABLE) {
-                change.addEdit(AnnotationUtils.createRemoveImportTextEdit(javaElement, annotationClass.getCanonicalName()));
+                change.addEdit(AnnotationUtils.createRemoveImportTextEdit(javaElement, type.getFullyQualifiedName()));
                 change.addEdit(AnnotationUtils.createRemoveAnnotationTextEdit(javaElement, annotation));
             }
         }
         executeChange(new NullProgressMonitor(), change);
     }
 
-    private List<MemberValuePair> getMemberValuePairs(
-            IAnnotationAttributeInitializer annotationAttributeInitializer, IJavaElement javaElement, AST ast,
-            Class<?extends java.lang.annotation.Annotation> annotationClass) {
+    private List<MemberValuePair> getMemberValuePairs(IAnnotationAttributeInitializer annotationAttributeInitializer,
+            IJavaElement javaElement, AST ast, IType type) {
         if (annotationAttributeInitializer != null) {
-            return annotationAttributeInitializer.getMemberValuePairs(javaElement, ast, annotationClass);
+            List<MemberValuePair> memberValuePairs = annotationAttributeInitializer.getMemberValuePairs(javaElement, ast, type);
+            if (memberValuePairs.size() > 0) {
+                return memberValuePairs;
+            } else {
+                return annotationAttributeInitializer.getMemberValuePairs(javaElement, ast,
+                        AnnotationsManager.getAnnotationDefinitionForType(type).getAnnotationClass());
+            }
         }
         return Collections.emptyList();
     }
 
-
-    private void setValueForMethod(Method method, Object value) throws CoreException {
-        if (((Boolean) getValue(method.getDeclaringClass())).booleanValue()) {
+    private void setValueForMethod(IMethod method, Object value) throws CoreException {
+        if (value instanceof String) {
+            Object currentValue = getValue(method);
+            if (currentValue != null && currentValue instanceof String) {
+                if (((String) value).equals(currentValue)) {
+                    return;
+                }
+            }
+        }
+        if (((Boolean) getValue(method.getDeclaringType())).booleanValue()) {
             Object viewerInput = treeViewer.getInput();
             if (viewerInput instanceof IAnnotatable) {
                 setValueForMethod(method, value, (IJavaElement) viewerInput);
@@ -422,7 +440,7 @@
         }
     }
 
-    private void setValueForMethod(Method method, Object value, IJavaElement javaElement) throws CoreException {
+    private void setValueForMethod(IMethod method, Object value, IJavaElement javaElement) throws CoreException {
         ICompilationUnit source = AnnotationUtils.getCompilationUnitFromJavaElement(javaElement);
         CompilationUnit compilationUnit = SharedASTProvider.getAST(source, SharedASTProvider.WAIT_YES, null);
         AST ast = compilationUnit.getAST();
@@ -435,14 +453,14 @@
         for (Annotation annotation : annotations) {
             if (annotation instanceof NormalAnnotation) {
                 NormalAnnotation normalAnnotation = (NormalAnnotation) annotation;
-                Class<?> declaringClass = method.getDeclaringClass();
+                IType declaringType = method.getDeclaringType();
                 String annotationName = normalAnnotation.getTypeName().getFullyQualifiedName();
-                if (annotationName.equals(declaringClass.getSimpleName()) || annotationName.equals(declaringClass.getCanonicalName())) {
+                if (annotationName.equals(declaringType.getElementName()) || annotationName.equals(declaringType.getFullyQualifiedName())) {
                     @SuppressWarnings("unchecked")
                     List<MemberValuePair> memberValuePairs = normalAnnotation.values();
                     boolean hasMemberValuePair = false;
                     for (MemberValuePair memberValuePair : memberValuePairs) {
-                        if (memberValuePair.getName().getIdentifier().equals(method.getName())) {
+                        if (memberValuePair.getName().getIdentifier().equals(method.getElementName())) {
                             ASTNode memberValue = getMemberValuePairValue(ast, method, value);
                             if (memberValue != null) {
                                 change.addEdit(AnnotationUtils.createUpdateMemberValuePairTextEdit(memberValuePair, memberValue));
@@ -461,9 +479,9 @@
                 }
             } else if (annotation instanceof SingleMemberAnnotation) {
                 SingleMemberAnnotation singleMemberAnnotation = (SingleMemberAnnotation) annotation;
-                Class<?> declaringClass = method.getDeclaringClass();
+                IType declaringType = method.getDeclaringType();
                 String annotationName = singleMemberAnnotation.getTypeName().getFullyQualifiedName();
-                if (annotationName.equals(declaringClass.getSimpleName()) || annotationName.equals(declaringClass.getCanonicalName())) {
+                if (annotationName.equals(declaringType.getElementName()) || annotationName.equals(declaringType.getFullyQualifiedName())) {
                     MemberValuePair memberValuePair = getMemberValuePair(ast, method, value);
                     if (memberValuePair != null) {
                         change.addEdit(AnnotationUtils.createUpdateSingleMemberAnnotationTextEdit(singleMemberAnnotation, memberValuePair.getValue()));
@@ -477,76 +495,108 @@
         executeChange(new NullProgressMonitor(), change);
     }
 
-    private ASTNode getMemberValuePairValue(AST ast, Method method, Object value) {
-        Class<?> returnType = method.getReturnType();
-        if (returnType.equals(String.class)) {
-            return AnnotationsCore.createStringLiteral(ast, value.toString());
+    private MemberValuePair getMemberValuePair(AST ast, IMethod method, Object value) throws JavaModelException {
+        String returnType = method.getReturnType();
+        if (SignatureUtils.isString(returnType)) {
+            return AnnotationsCore.createStringMemberValuePair(ast, method.getElementName(), (String) value);
         }
-        if (returnType.equals(Boolean.TYPE)) {
-            return AnnotationsCore.createBooleanLiteral(ast, ((Boolean) value).booleanValue());
+        if (SignatureUtils.isBoolean(returnType)) {
+            return AnnotationsCore.createBooleanMemberValuePair(ast, method.getElementName(), (Boolean) value);
         }
-        if (returnType.isPrimitive()
-                && (returnType.equals(Byte.TYPE) || returnType.equals(Short.TYPE)
-                        || returnType.equals(Integer.TYPE) || returnType.equals(Long.TYPE)
-                        || returnType.equals(Float.TYPE) || returnType.equals(Double.TYPE))) {
-            return AnnotationsCore.createNumberLiteral(ast, value.toString());
-        }
-        if (returnType.isArray()) {
-            if (method.getReturnType().getComponentType().isAnnotation()) {
-                return createArrayValueLiteral(ast, method, (Object[]) value);
-            } else {
-                return AnnotationsCore.createArrayValueLiteral(ast, (Object[]) value);
+
+        if (SignatureUtils.isPrimitive(returnType)) {
+            if (returnType.charAt(0) == Signature.C_BYTE
+                    || returnType.charAt(0) == Signature.C_SHORT
+                    || returnType.charAt(0) == Signature.C_INT
+                    || returnType.charAt(0) == Signature.C_LONG
+                    || returnType.charAt(0) == Signature.C_FLOAT
+                    || returnType.charAt(0) == Signature.C_DOUBLE) {
+                return AnnotationsCore.createNumberMemberValuePair(ast, method.getElementName(), value.toString());
             }
         }
 
-        if (returnType.equals(Class.class)) {
-            return AnnotationsCore.createTypeLiteral(ast, value.toString());
+        if (SignatureUtils.isArray(returnType)) {
+            IType componentType = getComponentType(method);
+            if (componentType != null) {
+                if (componentType.isAnnotation()) {
+                    return createArrayMemberValuePair(ast, method, (Object[]) value);
+                } else {
+                    return AnnotationsCore.createArrayMemberValuePair(ast, method.getElementName(), (Object[]) value);
+                }
+            }
         }
 
-        if (returnType.isEnum()) {
+        if (SignatureUtils.isClass(returnType)) {
+            return AnnotationsCore.createTypeMemberValuePair(ast, method.getElementName(), value.toString());
+        }
+
+        IType enumType = SignatureUtils.getEnumReturnType(method);
+        if (enumType != null) {
             int selected = ((Integer) value).intValue();
             if (selected != -1) {
-                return AnnotationsCore.createEnumLiteral(ast, method.getDeclaringClass().getCanonicalName(),
-                        method.getReturnType().getEnumConstants()[selected]);
+                if (enumType.isMember()) {
+                    return AnnotationsCore.createEnumMemberValuePair(ast, enumType.getDeclaringType().getFullyQualifiedName(),
+                            method.getElementName(), SignatureUtils.getEnumConstants(enumType)[selected]);
+                } else {
+                    return AnnotationsCore.createEnumMemberValuePair(ast, enumType.getFullyQualifiedName(),
+                            method.getElementName(), SignatureUtils.getEnumConstants(enumType)[selected]);
+                }
             }
         }
         return null;
     }
 
-    private MemberValuePair getMemberValuePair(AST ast, Method method, Object value) {
-        Class<?> returnType = method.getReturnType();
-        if (returnType.equals(String.class)) {
-            return AnnotationsCore.createStringMemberValuePair(ast, method.getName(), (String) value);
+    private ASTNode getMemberValuePairValue(AST ast, IMethod method, Object value) throws JavaModelException {
+        String returnType = method.getReturnType();
+        if (SignatureUtils.isString(returnType)) {
+            return AnnotationsCore.createStringLiteral(ast, value.toString());
         }
-        if (returnType.equals(Boolean.TYPE)) {
-            return AnnotationsCore.createBooleanMemberValuePair(ast, method.getName(), (Boolean) value);
+
+        if (SignatureUtils.isBoolean(returnType)) {
+            return AnnotationsCore.createBooleanLiteral(ast, ((Boolean) value).booleanValue());
         }
-        if (returnType.isPrimitive()
-                && (returnType.equals(Byte.TYPE) || returnType.equals(Short.TYPE)
-                        || returnType.equals(Integer.TYPE) || returnType.equals(Long.TYPE)
-                        || returnType.equals(Float.TYPE) || returnType.equals(Double.TYPE))) {
-            return AnnotationsCore.createNumberMemberValuePair(ast, method.getName(), value.toString());
-        }
-        if (returnType.isArray()) {
-            if (method.getReturnType().getComponentType().isAnnotation()) {
-                return createArrayMemberValuePair(ast, method, (Object[]) value);
-            } else {
-                return AnnotationsCore.createArrayMemberValuePair(ast, method.getName(), (Object[]) value);
+
+        if (SignatureUtils.isPrimitive(returnType)) {
+            if (returnType.charAt(0) == Signature.C_BYTE
+                    || returnType.charAt(0) == Signature.C_SHORT
+                    || returnType.charAt(0) == Signature.C_INT
+                    || returnType.charAt(0) == Signature.C_LONG
+                    || returnType.charAt(0) == Signature.C_FLOAT
+                    || returnType.charAt(0) == Signature.C_DOUBLE) {
+                return AnnotationsCore.createNumberLiteral(ast, value.toString());
             }
         }
 
-        if (returnType.equals(Class.class)) {
-            return AnnotationsCore.createTypeMemberValuePair(ast, method.getName(), value.toString());
+        if (SignatureUtils.isArray(returnType)) {
+            IType componentType = getComponentType(method);
+            if (componentType != null) {
+                if (componentType.isAnnotation()) {
+                    return createArrayValueLiteral(ast, method, (Object[]) value);
+                } else {
+                    return AnnotationsCore.createArrayValueLiteral(ast, (Object[]) value);
+                }
+            }
         }
 
-        if (returnType.isEnum()) {
+        if (SignatureUtils.isClass(returnType)) {
+            return AnnotationsCore.createTypeLiteral(ast, value.toString());
+        }
+
+
+        IType enumType = SignatureUtils.getEnumReturnType(method);
+        if (enumType != null) {
             int selected = ((Integer) value).intValue();
             if (selected != -1) {
-                return AnnotationsCore.createEnumMemberValuePair(ast,
-                        method.getDeclaringClass().getCanonicalName(), method.getName(), method.getReturnType()
-                        .getEnumConstants()[selected]);
+                if (enumType.isMember()) {
+                    return AnnotationsCore.createEnumLiteral(ast, enumType.getDeclaringType().getFullyQualifiedName(),
+                            SignatureUtils.getEnumConstants(enumType)[selected]);
+                } else {
+                    return AnnotationsCore.createEnumLiteral(ast, enumType.getFullyQualifiedName(),
+                            SignatureUtils.getEnumConstants(enumType)[selected]);
+                }
             }
         }
+
         return null;
     }
 
@@ -578,65 +628,76 @@
         annotationsView.refreshLabels();
     }
 
-    private MemberValuePair createArrayMemberValuePair(AST ast, Method method, Object[] values) {
-        return AnnotationsCore.createMemberValuePair(ast, method.getName(), createArrayValueLiteral(ast,
+    private MemberValuePair createArrayMemberValuePair(AST ast, IMethod method, Object[] values) throws JavaModelException {
+        return AnnotationsCore.createMemberValuePair(ast, method.getElementName(), createArrayValueLiteral(ast,
                 method, values));
     }
 
-    @SuppressWarnings("unchecked")
-    private ArrayInitializer createArrayValueLiteral(AST ast, Method method, Object[] values) {
+    private IType getComponentType(IMethod method) throws JavaModelException {
+        String returnType = method.getReturnType();
+        if (SignatureUtils.isArray(returnType)) {
+            String elementType = Signature.getElementType(returnType);
+            IType declaringType = method.getDeclaringType();
+            IJavaProject javaProject = declaringType.getJavaProject();
+            if (javaProject != null) {
+                return javaProject.findType(Signature.toString(elementType));
+            }
+        }
+        return null;
+    }
+
+    private ArrayInitializer createArrayValueLiteral(AST ast, IMethod method, Object[] values) throws JavaModelException {
         ArrayInitializer arrayInitializer = ast.newArrayInitializer();
         for (Object value : values) {
-            if (value instanceof List) {
-                Class<? extends java.lang.annotation.Annotation> annotationClass =
-                    (Class<? extends java.lang.annotation.Annotation>) method.getReturnType().getComponentType();
+            if (value instanceof List<?>) {
+                IType componentType = getComponentType(method);
+                if (componentType != null) {
 
-                List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
-
-                List<Map<String, Object>> valuesList = (List<Map<String, Object>>) value;
-                Iterator<Map<String, Object>> valuesIterator = valuesList.iterator();
-                while (valuesIterator.hasNext()) {
-                    Map<String, Object> annotationMap = valuesIterator.next();
-                    Set<Entry<String, Object>> entrySet = annotationMap.entrySet();
-                    Iterator<Map.Entry<String, Object>> iterator = entrySet.iterator();
-                    while (iterator.hasNext()) {
-                        Map.Entry<java.lang.String, Object> entry = iterator.next();
-                        String memberName = entry.getKey();
-                        try {
-                            Method annotationMethod = annotationClass.getMethod(memberName, new Class[0]);
-                            if (annotationMethod != null) {
-                                Object memberValue = entry.getValue();
-                                Class<?> returnType = annotationMethod.getReturnType();
-                                if (returnType.equals(String.class)) {
-                                    memberValuePairs.add(AnnotationsCore.createStringMemberValuePair(ast, memberName,
-                                            memberValue.toString()));
-                                }
-                                if (returnType.equals(Boolean.TYPE)) {
-                                    memberValuePairs.add(AnnotationsCore.createBooleanMemberValuePair(ast, memberName,
-                                            (Boolean) memberValue));
-                                }
-                                if (returnType.equals(Class.class)) {
-                                    String className = memberValue.toString();
-                                    if (className.endsWith(".class")) {
-                                        className = className.substring(0, className.lastIndexOf("."));
+                    List<MemberValuePair> memberValuePairs = new ArrayList<MemberValuePair>();
+                    @SuppressWarnings("unchecked")
+                    List<Map<String, Object>> valuesList = (List<Map<String, Object>>) value;
+                    Iterator<Map<String, Object>> valuesIterator = valuesList.iterator();
+                    while (valuesIterator.hasNext()) {
+                        Map<String, Object> annotationMap = valuesIterator.next();
+                        Set<Entry<String, Object>> entrySet = annotationMap.entrySet();
+                        Iterator<Map.Entry<String, Object>> iterator = entrySet.iterator();
+                        while (iterator.hasNext()) {
+                            Map.Entry<java.lang.String, Object> entry = iterator.next();
+                            String memberName = entry.getKey();
+                            try {
+                                IMethod annotationMethod = componentType.getMethod(memberName, new String[] {});
+                                if (annotationMethod != null) {
+                                    Object memberValue = entry.getValue();
+                                    String returnType = annotationMethod.getReturnType();
+                                    if (SignatureUtils.isString(returnType)) {
+                                        memberValuePairs.add(AnnotationsCore.createStringMemberValuePair(ast, memberName,
+                                                memberValue.toString()));
                                     }
-                                    memberValuePairs.add(AnnotationsCore.createMemberValuePair(ast, memberName,
-                                            AnnotationsCore.createTypeLiteral(ast, className)));
+                                    if (SignatureUtils.isBoolean(returnType)) {
+                                        memberValuePairs.add(AnnotationsCore.createBooleanMemberValuePair(ast, memberName,
+                                                (Boolean) memberValue));
+                                    }
+                                    if (SignatureUtils.isClass(returnType)) {
+                                        String className = memberValue.toString();
+                                        if (className.endsWith(".class")) {
+                                            className = className.substring(0, className.lastIndexOf("."));
+                                        }
+                                        memberValuePairs.add(AnnotationsCore.createMemberValuePair(ast, memberName,
+                                                AnnotationsCore.createTypeLiteral(ast, className)));
+                                    }
+                                    //                                if (returnType.isPrimitive()) {
+                                    //                                    memberValuePairs.add(getNumberMemberValuePair(ast, memberName, memberValue));
+                                    //                                }
                                 }
-                                //                                if (returnType.isPrimitive()) {
-                                //                                    memberValuePairs.add(getNumberMemberValuePair(ast, memberName, memberValue));
-                                //                                }
-                            }
 
-                        } catch (SecurityException se) {
-                            AnnotationsCorePlugin.log(se);
-                        } catch (NoSuchMethodException nsme) {
-                            AnnotationsCorePlugin.log(nsme);
+                            } catch (SecurityException se) {
+                                AnnotationsCorePlugin.log(se);
+                            }
                         }
                     }
+                    arrayInitializer.expressions().add(AnnotationsCore.createNormalAnnotation(ast, componentType.getFullyQualifiedName(),
+                            memberValuePairs));
                 }
-                arrayInitializer.expressions().add(AnnotationsCore.createNormalAnnotation(ast, annotationClass.getCanonicalName(),
-                        memberValuePairs));
             }
         }
         return arrayInitializer;
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsView.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsView.java
index 15b867c..520deee 100755
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsView.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsView.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.jst.ws.internal.jaxws.ui.views;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -134,13 +133,12 @@
         annotationTreeViewer.setComparator(new ViewerComparator() {
             @Override
             public int compare(Viewer viewer, Object obj1, Object obj2) {
-                if (obj1 instanceof Class<?> && ((Class<?>) obj1).isAnnotation()
-                        && obj2 instanceof Class<?> && ((Class<?>) obj2).isAnnotation()) {
-                    return ((Class<? extends java.lang.annotation.Annotation>) obj1).getCanonicalName().compareTo(
-                            ((Class<? extends java.lang.annotation.Annotation>) obj2).getCanonicalName());
+                if (obj1 instanceof IType && obj2 instanceof IType) {
+                    return ((IType) obj1).getFullyQualifiedName().compareTo(
+                            ((IType) obj2).getFullyQualifiedName());
                 }
-                if (obj1 instanceof Method && obj2 instanceof Method) {
-                    return ((Method)obj1).getName().compareTo(((Method)obj2).getName());
+                if (obj1 instanceof IMethod && obj2 instanceof IMethod) {
+                    return ((IMethod) obj1).getElementName().compareTo(((IMethod) obj2).getElementName());
                 }
                 return super.compare(viewer, obj1, obj2);
             }
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewCategoryFilter.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewCategoryFilter.java
index e51bd7b..2ce5ca4 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewCategoryFilter.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewCategoryFilter.java
@@ -10,10 +10,10 @@
  *******************************************************************************/
 package org.eclipse.jst.ws.internal.jaxws.ui.views;
 
-import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.jdt.core.IType;
 import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.jface.viewers.Viewer;
@@ -38,9 +38,8 @@
 
     @Override
     public boolean select(Viewer viewer, Object parentElement, Object element) {
-        if (element instanceof Class && ((Class<?>) element).isAnnotation()) {
-            AnnotationDefinition annotationDefinition = AnnotationsManager.
-            getAnnotationDefinitionForClass((Class<? extends Annotation>) element);
+        if (element instanceof IType) {
+            AnnotationDefinition annotationDefinition = AnnotationsManager.getAnnotationDefinitionForType((IType) element);
             if (annotationDefinition != null) {
                 return !categories.contains(annotationDefinition.getCategory());
             }
@@ -77,5 +76,4 @@
         IDialogSettings settings = JAXWSUIPlugin.getDefault().getDialogSettings();
         settings.put(TAG_CATEGORY_NAME, categories.toArray(new String[categories.size()]));
     }
-
 }
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewContentProvider.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewContentProvider.java
index 5a22bee..39f4867 100755
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewContentProvider.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewContentProvider.java
@@ -11,43 +11,54 @@
 package org.eclipse.jst.ws.internal.jaxws.ui.views;
 
 import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jst.ws.annotations.core.AnnotationsManager;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
 
 public class AnnotationsViewContentProvider implements ITreeContentProvider {
 
-	public Object[] getChildren(Object parentElement) {
-		if (parentElement instanceof Class) {
-			return ((Class<?>)parentElement).getDeclaredMethods();
-		}
-		return new Object[] {};
-	}
+    public Object[] getChildren(Object parentElement) {
+        if (parentElement instanceof IType) {
+            try {
+                return ((IType) parentElement).getMethods();
+            } catch (JavaModelException jme) {
+                JAXWSUIPlugin.log(jme.getStatus());
+            }
+        }
+        return new Object[] {};
+    }
 
-	public Object getParent(Object element) {
-		return null;
-	}
+    public Object getParent(Object element) {
+        return null;
+    }
 
-	public boolean hasChildren(Object element) {
-		if (element instanceof Class) {
-			return ((Class<?>)element).getDeclaredMethods().length > 0;
-		}
-		return false;
-	}
+    public boolean hasChildren(Object element) {
+        if (element instanceof IType) {
+            try {
+                return ((IType) element).getMethods().length > 0;
+            } catch (JavaModelException jme) {
+                JAXWSUIPlugin.log(jme.getStatus());
+            }
+        }
+        return false;
+    }
 
-	public Object[] getElements(Object inputElement) {
-		if (inputElement != null && inputElement instanceof IJavaElement && ((IJavaElement) inputElement).exists()) {
-			IJavaElement javaElement = (IJavaElement) inputElement;
-			return AnnotationsManager.getAnnotations(javaElement).toArray();
-		}
-		return new Object[] {};
-	}
+    public Object[] getElements(Object inputElement) {
+        if (inputElement != null && inputElement instanceof IJavaElement && ((IJavaElement) inputElement).exists()) {
+            IJavaElement javaElement = (IJavaElement) inputElement;
+            return AnnotationsManager.getAnnotationTypes(javaElement).toArray();
+        }
+        return new Object[] {};
+    }
 
-	public void dispose() {
+    public void dispose() {
 
-	}
+    }
 
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-	}
+    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+    }
 
 }
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/ClassDialogCellEditor.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/ClassDialogCellEditor.java
index ebe786b..f1d0942 100644
--- a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/ClassDialogCellEditor.java
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/ClassDialogCellEditor.java
@@ -56,7 +56,7 @@
     
     @Override
     protected void updateContents(Object value) {
-        if (value != null) {
+        if (value != null && value.toString().trim().length() > 0) {
             getDefaultLabel().setText(value.toString() + ".class"); //$NON-NLS-1$
         } else {
             getDefaultLabel().setText(""); //$NON-NLS-1$
diff --git a/tests/org.eclipse.jst.ws.jaxb.core.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.ws.jaxb.core.tests/META-INF/MANIFEST.MF
index 756510d..3ce1f59 100644
--- a/tests/org.eclipse.jst.ws.jaxb.core.tests/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.jst.ws.jaxb.core.tests/META-INF/MANIFEST.MF
@@ -14,7 +14,7 @@
  org.eclipse.jdt.launching;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ltk.core.refactoring;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ltk.ui.refactoring;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.2.0)",
  org.eclipse.jdt.apt.core;bundle-version="[3.3.100,4.0.0)",
  org.eclipse.text;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.jdt.ui;bundle-version="[3.4.0,4.0.0)"
diff --git a/tests/org.eclipse.jst.ws.jaxws.core.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.ws.jaxws.core.tests/META-INF/MANIFEST.MF
index fbe132a..504792c 100644
--- a/tests/org.eclipse.jst.ws.jaxws.core.tests/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.jst.ws.jaxws.core.tests/META-INF/MANIFEST.MF
@@ -14,7 +14,7 @@
  org.eclipse.jdt.launching;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ltk.core.refactoring;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ltk.ui.refactoring;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.jst.ws.annotations.core;bundle-version="[1.0.0,1.2.0)",
  org.eclipse.jdt.apt.core;bundle-version="[3.3.100,4.0.0)",
  org.eclipse.text;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.jdt.ui;bundle-version="[3.4.0,4.0.0)"