Initial Checkin
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/.classpath b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/.classpath
new file mode 100644
index 0000000..751c8f2
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/.cvsignore b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/.project b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/.project
new file mode 100644
index 0000000..6f604a6
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.jsf.metadata.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/META-INF/MANIFEST.MF b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9f3d3b0
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.jst.jsf.metadata.tests Plug-in
+Bundle-SymbolicName: org.eclipse.jst.jsf.metadata.tests; singleton:=true
+Bundle-Version: 0.5.0.qualifier
+Bundle-Activator: org.eclipse.jst.jsf.metadata.tests.Activator
+Bundle-Localization: plugin
+Bundle-ClassPath: jsfmetadatatests.jar
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.jst.jsf.core,
+ org.eclipse.jst.jsf.metadataprocessors,
+ org.eclipse.ui,
+ org.eclipse.core.resources,
+ org.eclipse.wst.common.frameworks,
+ org.eclipse.emf.common,
+ org.eclipse.emf.ecore,
+ org.eclipse.emf.ecore.xmi,
+ org.eclipse.core.runtime.compatibility,
+ org.junit,
+ org.eclipse.jst.jsf.contentmodel.annotations,
+ org.eclipse.jst.jsf.taglibprocessing,
+ org.eclipse.wst.common.project.facet.core,
+ org.eclipse.wst.common.modulecore,
+ org.eclipse.jst.j2ee.web,
+ org.eclipse.jst.jsf.context.resolver.structureddocument,
+ org.eclipse.jst.jsf.context.structureddocument,
+ org.eclipse.wst.sse.core,
+ org.eclipse.jdt.core
+Eclipse-LazyStart: true
+Export-Package: org.eclipse.jst.jsf.metadata.tests
+Plugin-Class: org.eclipse.jst.jsf.metadata.tests.Activator
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/build.properties b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/plugin.xml b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/plugin.xml
new file mode 100644
index 0000000..1546e6e
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/plugin.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension
+         point="org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles">
+      <annotationFile
+            location="/testfiles/metadata/jsf_test.xml"
+            uri="http://org.eclipse.jsf/test"/>
+      <annotationFile
+            location="/testfiles/metadata/jsf_test.xml"
+            uri="http://org.eclipse.jsf/test2"
+            parser="com.foobar.DifferentParser"/>
+      <annotationFile
+            location="/testfiles/metadata/FileA.xml"
+            uri="http://org.eclipse.jsf/dupeTest"/>
+      <annotationFile
+            location="/testfiles/metadata/FileB.xml"
+            uri="http://org.eclipse.jsf/dupeTest"/>  
+      <annotationFile
+            location="/testfiles/metadata/CaseInsensitive.xml"
+            uri="http://org.eclipse.jsf/caseInsensitiveTest"/>     
+      <annotationFile
+            location="/testfiles/metadata/doesntexist.xml"
+            uri=" http://org.eclipse.jsf/missingFile  "/>
+      <annotationFile
+            location="/testfiles/metadata/jsf_metadataprocessing.xml"
+            uri=" http://org.eclipse.jsf/metadataprocessing"/>
+      <annotationFile
+            location="/testfiles/metadata/jsf_tagprocessing.xml"
+            uri="http://org.eclipse.jsf/tagprocessing"/>                                                  
+   </extension>
+   <extension
+         point="org.eclipse.jst.jsf.metadataprocessors.AttributeValueRuntimeTypes">
+      <attributeValueRuntimeType
+            class="org.eclipse.jst.jsf.taglibprocessing.internal.provisional.attributevalues.StringType"
+            id="MyStringArrayType"/>
+      <attributeValueRuntimeType
+            class="org.eclipse.jst.jsf.metadata.tests.metadataprocessing.types.MyBooleanType"
+            id="MyBooleanType"/>
+      <attributeValueRuntimeType
+            class="org.eclipse.jst.jsf.taglibprocessing.internal.provisional.attributevalues.LongType"
+            id="MyLongType"/>
+      <attributeValueRuntimeType id="NoImplType"/>
+   </extension>
+   <extension
+         point="org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledFeatures">
+      <MetaDataEnabledFeature
+            class="org.eclipse.jst.jsf.metadata.tests.metadataprocessing.MetaDataEnabledBarkAdapter"
+            typeid="org.eclipse.jst.jsf.taglibprocessing.attributevalues.BooleanType"/>
+      <MetaDataEnabledFeature
+            class="org.eclipse.jst.jsf.metadata.tests.metadataprocessing.MetaDataEnabledBarkAdapter"
+            typeid="org.eclipse.jst.jsf.metadata.tests.MyBooleanType"/>
+      <MetaDataEnabledFeature
+            class="org.eclipse.wtp.jsf.core.tests.NoImplPossibleVals"
+            typeid="org.eclipse.jst.jsf.metadata.tests.NoImplType"/>
+   </extension>
+</plugin>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/com/foobar/DifferentParser.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/com/foobar/DifferentParser.java
new file mode 100644
index 0000000..053b761
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/com/foobar/DifferentParser.java
@@ -0,0 +1,12 @@
+package com.foobar;
+
+import junit.framework.Assert;
+
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.CMAnnotationFileParser;
+
+public class DifferentParser extends CMAnnotationFileParser {
+	public DifferentParser(){
+		super();
+		Assert.assertTrue("Loaded DifferentParser", true);
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/Activator.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/Activator.java
new file mode 100644
index 0000000..30bed4a
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/Activator.java
@@ -0,0 +1,47 @@
+package org.eclipse.jst.jsf.metadata.tests;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class Activator extends Plugin {
+
+	public static final String ID_BUNDLE = "org.eclipse.jst.jsf.metadata.tests";
+	
+	//The shared instance.
+	private static Activator plugin;
+	
+	/**
+	 * The constructor.
+	 */
+	public Activator() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 *
+	 * @return the shared instance.
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/AllTests.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/AllTests.java
new file mode 100644
index 0000000..17c3763
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/AllTests.java
@@ -0,0 +1,54 @@
+package org.eclipse.jst.jsf.metadata.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.jsf.metadata.tests.annotations.AnnotationHelperTestCases;
+import org.eclipse.jst.jsf.metadata.tests.annotations.AnnotationMapTestCases;
+import org.eclipse.jst.jsf.metadata.tests.annotations.CaseInsensitiveAnnotationsTestCases;
+import org.eclipse.jst.jsf.metadata.tests.annotations.DuplicateAnnotationsTestCases;
+import org.eclipse.jst.jsf.metadata.tests.annotations.NegativeAnnotationFileTestCases;
+import org.eclipse.jst.jsf.metadata.tests.metadataprocessing.AttributeValueRuntimeTypeExtensionsTests;
+import org.eclipse.jst.jsf.metadata.tests.metadataprocessing.AttributeValueRuntimeTypeFactoryTests;
+import org.eclipse.jst.jsf.metadata.tests.metadataprocessing.AttributeValueRuntimeTypesRegistryTests;
+import org.eclipse.jst.jsf.metadata.tests.metadataprocessing.MetaDataProcessorsFactoryTests;
+import org.eclipse.jst.jsf.metadata.tests.taglibprocessing.BooleanTypeTest;
+import org.eclipse.jst.jsf.metadata.tests.taglibprocessing.DoubleTypeTest;
+import org.eclipse.jst.jsf.metadata.tests.taglibprocessing.IntegerTypeTest;
+import org.eclipse.jst.jsf.metadata.tests.taglibprocessing.JavaClassTypeTest;
+import org.eclipse.jst.jsf.metadata.tests.taglibprocessing.LongTypeTest;
+import org.eclipse.jst.jsf.metadata.tests.taglibprocessing.StringTypeTest;
+
+public class AllTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(
+				"Test for org.eclipse.jst.jsf.metadata.tests");
+		//$JUnit-BEGIN$
+		
+		//annotations 
+		suite.addTestSuite(AnnotationMapTestCases.class);
+		suite.addTestSuite(AnnotationHelperTestCases.class);
+		suite.addTestSuite(DuplicateAnnotationsTestCases.class);
+		suite.addTestSuite(CaseInsensitiveAnnotationsTestCases.class);
+		suite.addTestSuite(NegativeAnnotationFileTestCases.class);
+
+		//metadataprocessing
+		suite.addTestSuite(MetaDataProcessorsFactoryTests.class);
+		suite.addTestSuite(AttributeValueRuntimeTypeExtensionsTests.class);
+		suite.addTestSuite(AttributeValueRuntimeTypesRegistryTests.class);
+		suite.addTestSuite(AttributeValueRuntimeTypeFactoryTests.class);
+		
+		//taglib processing
+		suite.addTestSuite(StringTypeTest.class);
+		suite.addTestSuite(BooleanTypeTest.class);
+		suite.addTestSuite(IntegerTypeTest.class);
+		suite.addTestSuite(LongTypeTest.class);
+		suite.addTestSuite(DoubleTypeTest.class);
+		suite.addTestSuite(JavaClassTypeTest.class);
+
+		//$JUnit-END$
+		return suite;
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/AllAnnotationsTests.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/AllAnnotationsTests.java
new file mode 100644
index 0000000..3af7c80
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/AllAnnotationsTests.java
@@ -0,0 +1,21 @@
+package org.eclipse.jst.jsf.metadata.tests.annotations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllAnnotationsTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(
+				"Test for org.eclipse.jst.jsf.metadata.tests.annotations");
+		//$JUnit-BEGIN$
+		suite.addTestSuite(AnnotationMapTestCases.class);
+		suite.addTestSuite(DuplicateAnnotationsTestCases.class);
+		suite.addTestSuite(CaseInsensitiveAnnotationsTestCases.class);
+		suite.addTestSuite(AnnotationHelperTestCases.class);
+		suite.addTestSuite(NegativeAnnotationFileTestCases.class);
+		//$JUnit-END$
+		return suite;
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/AnnotationHelperTestCases.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/AnnotationHelperTestCases.java
new file mode 100644
index 0000000..d27741f
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/AnnotationHelperTestCases.java
@@ -0,0 +1,178 @@
+package org.eclipse.jst.jsf.metadata.tests.annotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.provisional.CMAnnotationHelper;
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.provisional.CMAnnotationPropertyValue;
+
+/**
+ * Test all methods in CMAnnotationHelper
+ * Uses /testfiles/metadata/jsf_test.xml. 
+ * 
+ * @author Gerry Kessler - Oracle
+ */
+public class AnnotationHelperTestCases extends TestCase implements ICMAnnotationTestCases {	
+	
+	public void testGetCMAttributePropertiesAll(){
+		//positive
+		Assert.assertNotNull(CMAnnotationHelper.getCMAttributeProperties(PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST));
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributeProperties(PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST).size(), 1);
+		
+		//negative
+		Assert.assertTrue(CMAnnotationHelper.getCMAttributeProperties(PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, "bogus").isEmpty());
+		//case sensitive test - should not locate		
+		Assert.assertTrue(CMAnnotationHelper.getCMAttributeProperties(PUBLICID, TEST_ELEMENT_VALIDATOR.toUpperCase(), TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST).isEmpty());
+		Assert.assertTrue(CMAnnotationHelper.getCMAttributeProperties(PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID.toUpperCase(), TEST_ATTR_PROPERTY_NAME_CONTENTASSIST).isEmpty());
+		Assert.assertTrue(CMAnnotationHelper.getCMAttributeProperties(PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST.toUpperCase()).isEmpty());
+	}
+	
+	public void testGetCMAttributePropertiesForBundle(){
+		//positive
+		Assert.assertNotNull(CMAnnotationHelper.getCMAttributeProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST));
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributeProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST).size(), 1);		
+		
+		//negative		
+		Assert.assertTrue(CMAnnotationHelper.getCMAttributeProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, "bogus").isEmpty());
+		//case sensitive test - should not locate
+		Assert.assertTrue(CMAnnotationHelper.getCMAttributeProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR.toUpperCase(), TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST).isEmpty());
+		Assert.assertTrue(CMAnnotationHelper.getCMAttributeProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID.toUpperCase(), TEST_ATTR_PROPERTY_NAME_CONTENTASSIST).isEmpty());
+		Assert.assertTrue(CMAnnotationHelper.getCMAttributeProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST.toUpperCase()).isEmpty());
+		
+		
+	}
+	
+	public void testGetCMElementPropertiesAll(){
+		//positive
+		Assert.assertTrue(CMAnnotationHelper.getCMElementProperties(PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST).isEmpty());
+		Assert.assertEquals(CMAnnotationHelper.getCMElementProperties(PUBLICID, TEST_ELEMENT_NAME_NOATTRS, TEST_PROPERTY_NAME_A).size(), 1);
+		Assert.assertNotNull(CMAnnotationHelper.getCMElementProperties(PUBLICID, TEST_ELEMENT_NAME_NOATTRS, TEST_PROPERTY_NAME_A));
+		List propvals = CMAnnotationHelper.getCMElementProperties(PUBLICID, TEST_ELEMENT_NAME_NOATTRS, TEST_PROPERTY_NAME_A);
+		Assert.assertEquals(propvals.size(), 1);
+		Object obj = propvals.get(0);
+		Assert.assertEquals(obj instanceof CMAnnotationPropertyValue, true);
+		Assert.assertEquals(((CMAnnotationPropertyValue)obj).getPropertyValue(), TEST_PROPERTY_VALUE_a);
+		//negative	
+		//case sensitive test - should not locate
+		Assert.assertTrue(CMAnnotationHelper.getCMElementProperties(PUBLICID, TEST_ELEMENT_NAME_NOATTRS.toUpperCase(), TEST_PROPERTY_NAME_A).isEmpty());
+		Assert.assertTrue(CMAnnotationHelper.getCMElementProperties(PUBLICID, TEST_ELEMENT_NAME_NOATTRS, TEST_PROPERTY_NAME_A.toLowerCase()).isEmpty());
+		
+
+	}
+	
+	public void testGetCMElementPropertiesForBundle(){
+		//positive
+		Assert.assertTrue(CMAnnotationHelper.getCMElementProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST).isEmpty());
+		Assert.assertEquals(CMAnnotationHelper.getCMElementProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_NOATTRS, TEST_PROPERTY_NAME_A).size(), 1);
+		Assert.assertNotNull(CMAnnotationHelper.getCMElementProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_NOATTRS, TEST_PROPERTY_NAME_A));
+		List propvals = CMAnnotationHelper.getCMElementProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_NOATTRS, TEST_PROPERTY_NAME_A);
+		Assert.assertEquals(propvals.size(), 1);
+		Object obj = propvals.get(0);
+		Assert.assertEquals(obj instanceof CMAnnotationPropertyValue, true);
+		Assert.assertEquals(((CMAnnotationPropertyValue)obj).getPropertyValue(), TEST_PROPERTY_VALUE_a);		
+		//negative	
+		//case sensitive test - should not locate
+		Assert.assertTrue(CMAnnotationHelper.getCMElementProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_NOATTRS.toUpperCase(), TEST_PROPERTY_NAME_A).isEmpty());
+		Assert.assertTrue(CMAnnotationHelper.getCMElementProperties(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_NOATTRS, TEST_PROPERTY_NAME_A.toLowerCase()).isEmpty());
+
+	}
+	
+	public void testGetCMAttributePropertyValue(){
+//		positive
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributePropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST), TEST_ATTR_PROPERTY_VALUE_CONTENTASSIST);
+//		elements and attrs with props
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributePropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED,TEST_ATTR4_NAMEa, TEST_PROPERTY_NAMEa),TEST_PROPERTY_VALUEa);
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributePropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED,TEST_ATTR4_NAMEb, TEST_PROPERTY_NAMEb),TEST_PROPERTY_VALUEb);
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributePropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED,TEST_ATTR4_NAMEc, TEST_PROPERTY_NAMEc),TEST_PROPERTY_VALUEc);
+
+		//NLS
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributePropertyValue(BUNDLEID, PUBLICID, TEST_NLS,TEST_NLS,"NLS1"), "a day in the life" + getNLSSuffix());
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributePropertyValue(BUNDLEID, PUBLICID, TEST_NLS,TEST_NLS,"NLS2"), "another string" + getNLSSuffix());	
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributePropertyValue(BUNDLEID, PUBLICID, TEST_NLS,TEST_NLS,"NLS3"), "NLS3(key not found)");			
+		
+//		negative			
+		Assert.assertFalse(CMAnnotationHelper.getCMAttributePropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST).equals("bogus"));
+		Assert.assertNull(CMAnnotationHelper.getCMAttributePropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR, TEST_ATTR_VALIDATORID, "bogus"));
+		
+		//no properties or attrs
+		Assert.assertNull(CMAnnotationHelper.getCMAttributePropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_NOPROPSORATTRS, TEST_ATTR_VALIDATORID,TEST_PROPERTY_NAME_A));
+
+	}
+	
+	public void testGetCMAttributePropertyValues(){
+		//positive
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributePropertyValues(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, TEST_ATTR4_NAMEc, TEST_PROPERTY_MULTIVAL).size(), 3);
+		List list = new ArrayList(3);
+		list.add("1");
+		list.add("2");
+		list.add("3");
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributePropertyValues(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, TEST_ATTR4_NAMEc, TEST_PROPERTY_MULTIVAL), list);
+		//negative
+		Assert.assertTrue(CMAnnotationHelper.getCMAttributePropertyValues(BUNDLEID, PUBLICID, TEST_ELEMENT_VALIDATOR,TEST_ATTR_VALIDATORID, TEST_PROPERTY_NAME_A).isEmpty());
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributePropertyValues(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, TEST_ATTR4_NAMEc, TEST_PROPERTY_MULTIVAL).size(), 3);
+	
+	}
+	
+	public void testGetCMElementPropertyValue(){
+		//positive
+		Assert.assertEquals(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, TEST_PROPERTY_NAME_A), TEST_PROPERTY_VALUE_a);
+		//element props but no Attrs in data
+		Assert.assertNotNull(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_NOATTRS,TEST_PROPERTY_NAME_A));
+		Assert.assertEquals(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_NOATTRS,TEST_PROPERTY_NAME_A), TEST_PROPERTY_VALUE_a);
+		Assert.assertEquals(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_NOATTRS,TEST_PROPERTY_NAME_B), TEST_PROPERTY_VALUE_b);
+		//elements and attrs with props
+		Assert.assertNotNull(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED,TEST_PROPERTY_NAME_A));
+		Assert.assertEquals(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED,TEST_PROPERTY_NAME_A), TEST_PROPERTY_VALUE_a);
+		Assert.assertEquals(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED,TEST_PROPERTY_NAME_B), TEST_PROPERTY_VALUE_b);
+		//NLS
+		Assert.assertEquals(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_NLS,"NLS1"), "a day in the life" + getNLSSuffix());
+		Assert.assertEquals(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_NLS,"NLS2"), "another string" + getNLSSuffix());	
+		Assert.assertEquals(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_NLS,"NLS3"), "NLS3(key not found)");	
+		
+		//negative			
+		Assert.assertFalse(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, TEST_PROPERTY_NAME_A).equals("bogus"));
+		Assert.assertNull(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, "bogus"));
+		
+		//no properties or attrs
+		Assert.assertNull(CMAnnotationHelper.getCMElementPropertyValue(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_NOPROPSORATTRS,TEST_PROPERTY_NAME_A));
+
+	}
+	
+	public void testGetCMElementPropertyValues(){
+		//positive
+		Assert.assertEquals(((String)CMAnnotationHelper.getCMElementPropertyValues(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, TEST_PROPERTY_NAME_A).get(0)), TEST_PROPERTY_VALUE_a);
+		Assert.assertEquals(CMAnnotationHelper.getCMElementPropertyValues(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, TEST_PROPERTY_MULTIVAL).size(), 3);
+		List list = new ArrayList(3);
+		list.add("1");
+		list.add("2");
+		list.add("3");
+		Assert.assertEquals(CMAnnotationHelper.getCMElementPropertyValues(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, TEST_PROPERTY_MULTIVAL), list);		
+		
+		//negative			
+		Assert.assertFalse(((String)CMAnnotationHelper.getCMElementPropertyValues(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, TEST_PROPERTY_NAME_A).get(0)).equals("bogus"));
+		Assert.assertNull(CMAnnotationHelper.getCMElementPropertyValues(BUNDLEID, PUBLICID, TEST_ELEMENT_NAME_LOADED, "bogus"));
+		
+	}	
+	public void testHasAnnotationsAll(){
+		//positive		
+		Assert.assertEquals(CMAnnotationHelper.hasAnnotations(PUBLICID), true);
+		//negative		
+		Assert.assertFalse(CMAnnotationHelper.hasAnnotations("bogus"));
+	}
+	
+	public void testHasAnnotationsForBundle(){
+		//positive
+		Assert.assertEquals(CMAnnotationHelper.hasAnnotations(BUNDLEID, PUBLICID), true);
+		//negative	
+		Assert.assertFalse(CMAnnotationHelper.hasAnnotations(BUNDLEID, "bogus"));
+	}	
+	
+	//return "(en_US)" if that is the locale
+	private String getNLSSuffix() {
+		return Platform.getNL().equals("en_US") ? "(en_US)" : "";
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/AnnotationMapTestCases.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/AnnotationMapTestCases.java
new file mode 100644
index 0000000..695923e
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/AnnotationMapTestCases.java
@@ -0,0 +1,99 @@
+package org.eclipse.jst.jsf.metadata.tests.annotations;
+
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.CMAnnotationFileRegistry;
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.CMAnnotationMap;
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.provisional.CMAnnotationHelper;
+
+/**
+ * Test functions in the CMAnnotationMap.  
+ * Uses /testfiles/metadata/jsf_test.xml
+ * 
+ * @author Gerry Kessler - Oracle
+ */
+public class AnnotationMapTestCases extends TestCase implements ICMAnnotationTestCases{ 
+	private CMAnnotationFileRegistry reg;
+	private List maps;
+	
+	public void setUp(){
+		reg = CMAnnotationFileRegistry.getInstance();
+		Assert.assertTrue(reg != null);
+	}
+	
+	public void testAnnotationsMapsDefaultParser(){
+		//get first which is http://org.eclipse.jsf/test
+		boolean hasInfos = CMAnnotationHelper.hasAnnotations(PUBLICID);
+		Assert.assertTrue(hasInfos);
+		
+		maps = reg.getAnnotationMaps(PUBLICID);
+		Assert.assertNotNull(maps);
+		
+		CMAnnotationMap map = (CMAnnotationMap)maps.get(0);
+
+		execAsserts(map);
+	}
+	public void testAnnotationsMapsDifferentParser(){
+		//Test public api w/ non-default parser.   Really just delegates to default, but it is a different class.
+		//http://org.eclipse.jsf/test2
+		boolean hasInfos = CMAnnotationHelper.hasAnnotations(PUBLICID+"2");
+		Assert.assertTrue(hasInfos);
+		
+		maps = reg.getAnnotationMaps(PUBLICID+"2");
+		Assert.assertNotNull(maps);
+		
+		CMAnnotationMap map = (CMAnnotationMap)maps.get(0);
+		
+		execAsserts(map);
+	
+	}
+
+	private void execAsserts(CMAnnotationMap map){
+//		Test annotation map functions
+		// no props on element; only on attr		
+		Assert.assertNull(map.getCMElementProperty(TEST_ELEMENT_VALIDATOR,TEST_ELEMENT1_PROPERTY_NAME));
+		Assert.assertNotNull(map.getCMAttributeProperty(TEST_ELEMENT_VALIDATOR,TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST));
+		Assert.assertEquals(map.getCMAttributeProperty(TEST_ELEMENT_VALIDATOR,TEST_ATTR_VALIDATORID, TEST_ATTR_PROPERTY_NAME_CONTENTASSIST),TEST_ATTR_PROPERTY_VALUE_CONTENTASSIST);
+		Assert.assertNull(map.getCMAttributeProperty(TEST_ELEMENT_VALIDATOR,TEST_ATTR_VALIDATORID, TEST_PROPERTY_NAME_A));
+		
+		//no properties or attrs
+		Assert.assertNull(map.getCMElementProperty(TEST_ELEMENT_NAME_NOPROPSORATTRS,TEST_PROPERTY_NAME_A));
+		Assert.assertNull(map.getCMAttributeProperty(TEST_ELEMENT_NAME_NOPROPSORATTRS, TEST_ATTR_VALIDATORID,TEST_PROPERTY_NAME_A));
+		
+		//element props but no Attrs
+		Assert.assertNotNull(map.getCMElementProperty(TEST_ELEMENT_NAME_NOATTRS,TEST_PROPERTY_NAME_A));
+		Assert.assertEquals(map.getCMElementProperty(TEST_ELEMENT_NAME_NOATTRS,TEST_PROPERTY_NAME_A), TEST_PROPERTY_VALUE_a);
+		Assert.assertEquals(map.getCMElementProperty(TEST_ELEMENT_NAME_NOATTRS,TEST_PROPERTY_NAME_B), TEST_PROPERTY_VALUE_b);
+		
+		//elements and attrs with props
+		Assert.assertNotNull(map.getCMElementProperty(TEST_ELEMENT_NAME_LOADED,TEST_PROPERTY_NAME_A));
+		Assert.assertEquals(map.getCMElementProperty(TEST_ELEMENT_NAME_LOADED,TEST_PROPERTY_NAME_A), TEST_PROPERTY_VALUE_a);
+		Assert.assertEquals(map.getCMElementProperty(TEST_ELEMENT_NAME_LOADED,TEST_PROPERTY_NAME_B), TEST_PROPERTY_VALUE_b);
+		Assert.assertEquals(map.getCMAttributeProperty(TEST_ELEMENT_NAME_LOADED,TEST_ATTR4_NAMEa, TEST_PROPERTY_NAMEa),TEST_PROPERTY_VALUEa);
+		Assert.assertEquals(map.getCMAttributeProperty(TEST_ELEMENT_NAME_LOADED,TEST_ATTR4_NAMEb, TEST_PROPERTY_NAMEb),TEST_PROPERTY_VALUEb);
+		Assert.assertEquals(map.getCMAttributeProperty(TEST_ELEMENT_NAME_LOADED,TEST_ATTR4_NAMEc, TEST_PROPERTY_NAMEc),TEST_PROPERTY_VALUEc);
+
+//		multiple values test
+		Assert.assertEquals(map.getCMAttributePropertyValues(TEST_ELEMENT_NAME_LOADED,TEST_ATTR4_NAMEc, TEST_PROPERTY_MULTIVAL).size(), 3);
+		Assert.assertEquals(map.getCMElementPropertyValues(TEST_ELEMENT_NAME_LOADED, TEST_PROPERTY_MULTIVAL).size(), 3);
+		
+//NLS Test
+		Assert.assertEquals(map.getCMElementProperty(TEST_NLS,"NLS1"), "a day in the life" + getNLSSuffix() );
+		Assert.assertEquals(map.getCMElementProperty(TEST_NLS,"NLS2"), "another string" + getNLSSuffix());	
+		Assert.assertEquals(map.getCMElementProperty(TEST_NLS,"NLS3"), "NLS3(key not found)");	
+		
+		Assert.assertEquals(map.getCMAttributeProperty(TEST_NLS,TEST_NLS,"NLS1"), "a day in the life" + getNLSSuffix());
+		Assert.assertEquals(map.getCMAttributeProperty(TEST_NLS,TEST_NLS,"NLS2"), "another string" + getNLSSuffix());	
+		Assert.assertEquals(map.getCMAttributeProperty(TEST_NLS,TEST_NLS,"NLS3"), "NLS3(key not found)");			
+	}
+
+	//return "(en_US)" if that is the locale
+	private String getNLSSuffix() {
+		return Platform.getNL().equals("en_US") ? "(en_US)" : "";
+	}
+	
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/CaseInsensitiveAnnotationsTestCases.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/CaseInsensitiveAnnotationsTestCases.java
new file mode 100644
index 0000000..9d5a37b
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/CaseInsensitiveAnnotationsTestCases.java
@@ -0,0 +1,45 @@
+package org.eclipse.jst.jsf.metadata.tests.annotations;
+
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.provisional.CMAnnotationHelper;
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.provisional.CMAnnotationPropertyValue;
+/**
+ * Ensure case insensitive meta-data can be located correctly.
+ * Uses /testfiles/metadata/CaseInsensitive.xml
+ * 
+ * @author Gerry Kessler - Oracle
+ */
+public class CaseInsensitiveAnnotationsTestCases extends TestCase {
+	private String uri = "http://org.eclipse.jsf/caseInsensitiveTest";
+	private String cmElementName = "FoO";
+	private String cmAttributeName = "ValuE";
+	private String meta_prop_name = "TypE";
+	private String meta_prop_value = "String";
+
+	public void testCIElementAnnotations(){
+		Assert.assertEquals(CMAnnotationHelper.getCMElementProperties(uri, cmElementName, meta_prop_name).size(), 1);
+		List props = CMAnnotationHelper.getCMElementProperties(uri, cmElementName, meta_prop_name);
+		for (int i = 0;i<props.size();i++){
+			Assert.assertTrue(props.get(i) instanceof CMAnnotationPropertyValue);
+			CMAnnotationPropertyValue prop = (CMAnnotationPropertyValue) props.get(i);
+			Assert.assertTrue(prop.getPropertyValues().size() == 1);
+			Assert.assertEquals(prop.getPropertyValue(), meta_prop_value + String.valueOf(i+1));
+		}
+	}
+	
+	public void testCIDupeAttributeAnnotations(){
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributeProperties(uri, cmElementName, cmAttributeName, meta_prop_name).size(), 1);
+		List props = CMAnnotationHelper.getCMAttributeProperties(uri, cmElementName, cmAttributeName, meta_prop_name);
+		for (int i = 0;i<props.size();i++){
+			Assert.assertTrue(props.get(i) instanceof CMAnnotationPropertyValue);
+			CMAnnotationPropertyValue prop = (CMAnnotationPropertyValue) props.get(i);
+			Assert.assertTrue(prop.getPropertyValues().size() == 1);
+			Assert.assertEquals(prop.getPropertyValue(), meta_prop_value + String.valueOf(i+1));
+		}
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/DuplicateAnnotationsTestCases.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/DuplicateAnnotationsTestCases.java
new file mode 100644
index 0000000..fb26e81
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/DuplicateAnnotationsTestCases.java
@@ -0,0 +1,46 @@
+package org.eclipse.jst.jsf.metadata.tests.annotations;
+
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.provisional.CMAnnotationHelper;
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.provisional.CMAnnotationPropertyValue;
+
+/**
+ * Make sure that multiple annotations are being dealt with correctly.
+ * Uses /testfiles/metadata/FileA.xml, FileB.xml
+ * 
+ * @author Gerry Kessler - Oracle
+ */
+public class DuplicateAnnotationsTestCases extends TestCase {
+	private String uri = "http://org.eclipse.jsf/dupeTest";
+	private String cmElementName = "Foo";
+	private String cmAttributeName = "Value";
+	private String meta_prop_name = "Type";
+	private String meta_prop_value = "String";
+
+	public void testDupeElementAnnotations(){
+		Assert.assertEquals(CMAnnotationHelper.getCMElementProperties(uri, cmElementName, meta_prop_name).size(), 2);
+		List props = CMAnnotationHelper.getCMElementProperties(uri, cmElementName, meta_prop_name);
+		for (int i = 0;i<props.size();i++){
+			Assert.assertTrue(props.get(i) instanceof CMAnnotationPropertyValue);
+			CMAnnotationPropertyValue prop = (CMAnnotationPropertyValue) props.get(i);
+			Assert.assertTrue(prop.getPropertyValues().size() == 1);
+			Assert.assertEquals(prop.getPropertyValue(), meta_prop_value + String.valueOf(i+1));
+		}
+	}
+	
+	public void testDupeAttributeAnnotations(){
+		Assert.assertEquals(CMAnnotationHelper.getCMAttributeProperties(uri, cmElementName, cmAttributeName, meta_prop_name).size(), 2);
+		List props = CMAnnotationHelper.getCMAttributeProperties(uri, cmElementName, cmAttributeName, meta_prop_name);
+		for (int i = 0;i<props.size();i++){
+			Assert.assertTrue(props.get(i) instanceof CMAnnotationPropertyValue);
+			CMAnnotationPropertyValue prop = (CMAnnotationPropertyValue) props.get(i);
+			Assert.assertTrue(prop.getPropertyValues().size() == 1);
+			Assert.assertEquals(prop.getPropertyValue(), meta_prop_value + String.valueOf(i+1));
+		}
+	}
+	
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/ICMAnnotationTestCases.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/ICMAnnotationTestCases.java
new file mode 100644
index 0000000..9c5752a
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/ICMAnnotationTestCases.java
@@ -0,0 +1,37 @@
+package org.eclipse.jst.jsf.metadata.tests.annotations;
+/**
+ * @author Gerry Kessler - Oracle
+ */
+public interface ICMAnnotationTestCases {;
+	public final String BUNDLEID		= "org.eclipse.jst.jsf.metadata.tests";
+	public final String PUBLICID 		= "http://org.eclipse.jsf/test";
+	public final String LOC 			= "jsf_test.xml";
+	public final String JSF_CORE_URI 	= "http://java.sun.com/jsf/core";
+	
+	public final String TEST_ELEMENT_VALIDATOR = "validator";
+	public final String TEST_ATTR_VALIDATORID = "validatorId";
+	
+	public final String TEST_ELEMENT1_PROPERTY_NAME = "foobar";
+	public final String TEST_ATTR_PROPERTY_NAME_CONTENTASSIST = "attr-val-content-assistant";//change me!  must move this test case to jsf.ui
+	public final String TEST_ATTR_PROPERTY_VALUE_CONTENTASSIST = "com.eclipse.wtp.jsf.ui.internal.ValidatorAttrValueContentAssistant";
+	public final String TEST_ELEMENT_NAME_NOPROPSORATTRS = "nopropsOrAttrs";
+	public final String TEST_ELEMENT_NAME_NOATTRS = "noAttrs";
+	public final String TEST_PROPERTY_NAME_A = "A";
+	public final String TEST_PROPERTY_VALUE_a = "a";	
+	public final String TEST_PROPERTY_NAME_B = "B";
+	public final String TEST_PROPERTY_VALUE_b = "b";
+	public final String TEST_ELEMENT_NAME_LOADED = "loaded";
+	public final String TEST_ATTR4_NAMEa = "att1";
+	public final String TEST_PROPERTY_NAMEa = "B1";
+	public final String TEST_PROPERTY_VALUEa = "b1";
+	public final String TEST_ATTR4_NAMEb = "att2";
+	public final String TEST_PROPERTY_NAMEb = "B2";
+	public final String TEST_PROPERTY_VALUEb = "b2";
+	public final String TEST_ATTR4_NAMEc = "att3";
+	public final String TEST_PROPERTY_NAMEc = "B3";
+	public final String TEST_PROPERTY_VALUEc = "b3";
+	public final String TEST_PROPERTY_MULTIVAL = "multival";
+	public final String TEST_NLS="NLS";
+	
+//	public final String TEST_ATTR2_NAME = "validatorId";
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/NegativeAnnotationFileTestCases.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/NegativeAnnotationFileTestCases.java
new file mode 100644
index 0000000..d79f067
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/annotations/NegativeAnnotationFileTestCases.java
@@ -0,0 +1,33 @@
+package org.eclipse.jst.jsf.metadata.tests.annotations;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.provisional.CMAnnotationHelper;
+
+/**
+ * Intended to test system level setup problems
+ * 
+ * @author Gerry Kessler - Oracle
+ */
+public class NegativeAnnotationFileTestCases extends TestCase {
+	private String missing_uri = "http://org.eclipse.jsf/missing";
+	private String missing_file_uri = "http://org.eclipse.jsf/missingFile";
+	private String good_uri = "http://org.eclipse.jsf/test";
+	
+	private String bad_bundle ="foo";
+	private String cmElementName = "FoO";
+	private String meta_prop_name = "TypE";
+
+	public void testMissingAnnotationFile(){
+		//missing uri
+		Assert.assertNull(CMAnnotationHelper.getCMElementProperties(missing_uri, cmElementName, meta_prop_name));
+		//missing annotation file for uri - error should be logged
+		Assert.assertTrue(CMAnnotationHelper.getCMElementProperties(missing_file_uri, cmElementName, meta_prop_name).isEmpty());
+	
+	}
+	
+	public void testBadPassedBundle(){
+		Assert.assertTrue( CMAnnotationHelper.getCMElementProperties(bad_bundle, good_uri, cmElementName, meta_prop_name).isEmpty());
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AllMetaDataProcessingTests.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AllMetaDataProcessingTests.java
new file mode 100644
index 0000000..0f18f42
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AllMetaDataProcessingTests.java
@@ -0,0 +1,20 @@
+package org.eclipse.jst.jsf.metadata.tests.metadataprocessing;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllMetaDataProcessingTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(
+				"Test suite for org.eclipse.jst.jsf.metadata.tests.metadataprocessing");
+		//$JUnit-BEGIN$
+		suite.addTestSuite(AttributeValueRuntimeTypesRegistryTests.class);
+		suite.addTestSuite(AttributeValueRuntimeTypeFactoryTests.class);
+		suite.addTestSuite(MetaDataProcessorsFactoryTests.class);
+		suite.addTestSuite(AttributeValueRuntimeTypeExtensionsTests.class);
+		//$JUnit-END$
+		return suite;
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AttributeValueRuntimeTypeExtensionsTests.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AttributeValueRuntimeTypeExtensionsTests.java
new file mode 100644
index 0000000..50ce78e
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AttributeValueRuntimeTypeExtensionsTests.java
@@ -0,0 +1,58 @@
+package org.eclipse.jst.jsf.metadata.tests.metadataprocessing;
+
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+import org.eclipse.jst.jsf.metadata.tests.metadataprocessing.features.IBarker;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.MetaDataEnabledProcessingFactory;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValues;
+
+public class AttributeValueRuntimeTypeExtensionsTests extends TestCase {
+	private String uri1 = "http://org.eclipse.jsf/metadataprocessing";
+	
+	public void testBarkerExt(){
+		List barkProcessors = MetaDataEnabledProcessingFactory.getInstance().
+		getAttributeValueRuntimeTypeFeatureProcessors(IBarker.class, null, uri1, 
+				"MyTag", "MyLongAttr");  //invalid 
+		
+		Assert.assertNotNull(barkProcessors);
+		Assert.assertTrue(barkProcessors.isEmpty());
+		
+		
+	}
+	public void testGetPossibleValsWithExtensions(){
+		List processors	= MetaDataEnabledProcessingFactory.getInstance().
+			getAttributeValueRuntimeTypeFeatureProcessors(IPossibleValues.class, null, uri1, 
+				"MyTag", "BooleanAttr");   
+		
+		Assert.assertNotNull(processors);
+		Assert.assertTrue(!processors.isEmpty());
+		Assert.assertTrue(processors.size() == 2); //there should be a Boolean and BarkProcessor capable of handling IPossibleValues
+//		Iterator it = processors.iterator();
+//		while (it.hasNext()){
+//			dumpPossibleValues((IPossibleValues)it.next());
+//		}
+
+	}
+	
+	public void testNonFeatureExt(){
+		List testProcessors = MetaDataEnabledProcessingFactory.getInstance().
+		getAttributeValueRuntimeTypeFeatureProcessors(Test.class//invalid
+				,null, uri1, "MyTag", "BooleanAttr");  
+		
+		Assert.assertNotNull(testProcessors);
+		Assert.assertTrue(testProcessors.isEmpty());
+		
+		
+	}
+	private void dumpPossibleValues(IPossibleValues p){
+		Iterator it = p.getPossibleValues().iterator();
+		while (it.hasNext()){
+			System.out.println((String)it.next());
+		}
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AttributeValueRuntimeTypeFactoryTests.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AttributeValueRuntimeTypeFactoryTests.java
new file mode 100644
index 0000000..edd2e5e
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AttributeValueRuntimeTypeFactoryTests.java
@@ -0,0 +1,50 @@
+package org.eclipse.jst.jsf.metadata.tests.metadataprocessing;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.jst.jsf.metadata.tests.Activator;
+import org.eclipse.jst.jsf.metadataprocessors.internal.AttributeValueRuntimeTypeFactory;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.ITypeDescriptor;
+
+public class AttributeValueRuntimeTypeFactoryTests extends TestCase {
+
+	/*
+	 * Test method for 'org.eclipse.jst.jsf.metadataprocessors.internal.AttributeValueRuntimeTypeFactory.getTypes(String)'
+	 * Also tests the simple AbstractMetaDataEnabledType class
+	 */
+	public void testGetTypes() {
+		AttributeValueRuntimeTypeFactory factory = AttributeValueRuntimeTypeFactory.getInstance();
+		Assert.assertNotNull(factory);
+		
+		ITypeDescriptor atype = factory.getType(AttributeValueRuntimeTypesRegistryTests.BOOLEANTYPE_ID);
+		Assert.assertNotNull(atype);
+		Assert.assertNotNull(atype.getRuntimeType().getClassName());
+		Assert.assertTrue(atype.getRuntimeType().getBundleID().equals(Activator.ID_BUNDLE));		
+		Assert.assertTrue(atype.getRuntimeType().getTypeID().equals(AttributeValueRuntimeTypesRegistryTests.BOOLEANTYPE_ID));
+//		List features =  atype.getFeatureAdapters(IPossibleValues.class);
+//		Assert.assertNotNull(features);
+//		Assert.assertFalse(features.isEmpty());
+//		Assert.assertTrue(features.size() == 1);    
+		
+		atype = factory.getType(AttributeValueRuntimeTypesRegistryTests.STRINGARRAYTYPE_ID);
+		Assert.assertNotNull(atype);
+		Assert.assertNotNull(atype.getRuntimeType().getClassName());
+		Assert.assertTrue(atype.getRuntimeType().getBundleID().equals(Activator.ID_BUNDLE));		
+		Assert.assertTrue(atype.getRuntimeType().getTypeID().equals(AttributeValueRuntimeTypesRegistryTests.STRINGARRAYTYPE_ID));
+
+	}
+	
+	public void testNoImplTest(){
+		AttributeValueRuntimeTypeFactory factory = AttributeValueRuntimeTypeFactory.getInstance();
+		Assert.assertNotNull(factory);
+		
+		ITypeDescriptor atype = factory.getType(AttributeValueRuntimeTypesRegistryTests.NOIMPLTYPE_ID);
+		Assert.assertNotNull(atype);
+		Assert.assertNotNull(atype.getRuntimeType().getClassName());
+		Assert.assertTrue(atype.getRuntimeType().getBundleID().equals(Activator.ID_BUNDLE));	
+		
+	}
+
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AttributeValueRuntimeTypesRegistryTests.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AttributeValueRuntimeTypesRegistryTests.java
new file mode 100644
index 0000000..a49591c
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/AttributeValueRuntimeTypesRegistryTests.java
@@ -0,0 +1,41 @@
+package org.eclipse.jst.jsf.metadata.tests.metadataprocessing;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.jst.jsf.metadata.tests.Activator;
+import org.eclipse.jst.jsf.metadataprocessors.internal.AbstractMetaDataEnabledType;
+import org.eclipse.jst.jsf.metadataprocessors.internal.AttributeValueRuntimeTypeRegistry;
+
+public class AttributeValueRuntimeTypesRegistryTests extends TestCase {
+	public final static String BOOLEANTYPE_ID = Activator.ID_BUNDLE + ".MyBooleanType";
+	public final static String STRINGARRAYTYPE_ID = Activator.ID_BUNDLE + ".MyStringArrayType";
+	public final static String NOIMPLTYPE_ID = Activator.ID_BUNDLE + ".NoImplType";
+	
+	/*
+	 * Test method for 'org.eclipse.jst.jsf.metadataprocessors.internal.AbstractMetaDataEnabledTypeRegistry.getTypes(String)'
+	 */
+	public void testGetTypes() {
+		AttributeValueRuntimeTypeRegistry reg = AttributeValueRuntimeTypeRegistry.getInstance();
+		
+		Assert.assertNotNull(reg.getType(BOOLEANTYPE_ID));
+		Object obj = reg.getType(BOOLEANTYPE_ID);
+		Assert.assertTrue( obj instanceof AbstractMetaDataEnabledType);
+		AbstractMetaDataEnabledType type = (AbstractMetaDataEnabledType)obj;
+		
+		Assert.assertTrue(type.getBundleID().equals(Activator.ID_BUNDLE));
+		Assert.assertTrue(type.getTypeID().equals(BOOLEANTYPE_ID));
+		Assert.assertTrue(type.getClassName().equals("org.eclipse.jst.jsf.metadata.tests.metadataprocessing.types.MyBooleanType"));
+				
+		Assert.assertNotNull(reg.getType(STRINGARRAYTYPE_ID));
+		obj = reg.getType(STRINGARRAYTYPE_ID);
+		Assert.assertTrue( obj instanceof AbstractMetaDataEnabledType);
+		type = (AbstractMetaDataEnabledType)obj;
+		
+		Assert.assertTrue(type.getBundleID().equals(Activator.ID_BUNDLE));
+		Assert.assertTrue(type.getTypeID().equals(STRINGARRAYTYPE_ID));
+		Assert.assertTrue(type.getClassName().equals("org.eclipse.jst.jsf.taglibprocessing.internal.provisional.attributevalues.StringType"));
+		
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/MetaDataEnabledBarkAdapter.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/MetaDataEnabledBarkAdapter.java
new file mode 100644
index 0000000..a300317
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/MetaDataEnabledBarkAdapter.java
@@ -0,0 +1,42 @@
+package org.eclipse.jst.jsf.metadata.tests.metadataprocessing;
+
+import java.util.List;
+
+import org.eclipse.jst.jsf.metadata.tests.Activator;
+import org.eclipse.jst.jsf.metadata.tests.metadataprocessing.features.IBarker;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.AbstractMetaDataEnabledFeature;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValues;
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.provisional.CMAnnotationHelper;
+
+/**
+ * Test class implementing existing and new fetaure type for
+ * testing the MetaDataEnabledFeature Extension
+ * 
+ * @author Gerry Kessler - Oracle
+ *
+ */
+public class MetaDataEnabledBarkAdapter extends AbstractMetaDataEnabledFeature
+	implements
+		IBarker, IPossibleValues{
+
+	public MetaDataEnabledBarkAdapter() {
+		super();
+	}
+
+	public boolean canBark() {
+		return true;
+	}
+
+	public List getBarks() {
+		//notice that we want to use the bundle id of the extender
+		return CMAnnotationHelper.getCMAttributePropertyValues(Activator.ID_BUNDLE, getCMAnnotationContext().getUri(),
+					getCMAnnotationContext().getElementName(), getCMAnnotationContext().getAttributeName(), 
+					"barks");
+	}
+
+	public List getPossibleValues() {
+		return getBarks();
+	}
+
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/MetaDataProcessorsFactoryTests.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/MetaDataProcessorsFactoryTests.java
new file mode 100644
index 0000000..7c5f6a7
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/MetaDataProcessorsFactoryTests.java
@@ -0,0 +1,123 @@
+package org.eclipse.jst.jsf.metadata.tests.metadataprocessing;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
+import org.eclipse.jst.jsf.metadata.tests.metadataprocessing.features.IBarker;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.MetaDataEnabledProcessingFactory;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValue;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValues;
+
+public class MetaDataProcessorsFactoryTests extends TestCase {
+	private String uri1 = "http://org.eclipse.jsf/metadataprocessing";
+	/*
+	 * Test method for 'org.eclipse.jst.jsf.metadataprocessors.internal.provisional.MetaDataEnabledProcessorsFactory.getAttributeValueRuntimeTypeProcessors(Class, String, String, String)'
+	 */
+	public void testGetAttributeValueRuntimeTypeProcessors() {
+		IStructuredDocumentContext docContext = null;
+		
+		List possibleValueProcessors = MetaDataEnabledProcessingFactory.getInstance().
+			getAttributeValueRuntimeTypeFeatureProcessors(IPossibleValues.class, docContext, uri1, 
+					"MyTag", "MyBooleanAttr");
+		Assert.assertNotNull(possibleValueProcessors);
+		Assert.assertFalse(possibleValueProcessors.isEmpty());
+		Assert.assertTrue(possibleValueProcessors.size() == 2);
+
+		IPossibleValues processor = (IPossibleValues)possibleValueProcessors.get(0);	
+		Assert.assertNotNull(processor.getPossibleValues());
+//		dumpPossibleValues(processor);		
+		
+		possibleValueProcessors = MetaDataEnabledProcessingFactory.getInstance().
+			getAttributeValueRuntimeTypeFeatureProcessors(IPossibleValues.class, docContext, uri1, 
+				"MyTag", "MyValidValsAttr");
+		
+		Assert.assertNotNull(possibleValueProcessors);
+		Assert.assertFalse(possibleValueProcessors.isEmpty());
+		processor = (IPossibleValues)possibleValueProcessors.get(0);		
+		dumpPossibleValues(processor);
+		
+		//negative tests
+		//not a valid attribute annotation
+		possibleValueProcessors = MetaDataEnabledProcessingFactory.getInstance().
+		getAttributeValueRuntimeTypeFeatureProcessors(IPossibleValues.class, docContext, uri1, 
+				"MyTag", "bogus");  //invalid 
+		
+		Assert.assertTrue(possibleValueProcessors.isEmpty());
+		
+		//missing runtime-type annotation
+		possibleValueProcessors = MetaDataEnabledProcessingFactory.getInstance().
+		getAttributeValueRuntimeTypeFeatureProcessors(IPossibleValues.class, docContext, uri1, 
+				"MyTag", "MyNonMetaDataEnabledAttr");  //invalid 
+		
+		Assert.assertTrue(possibleValueProcessors.isEmpty());
+		
+		//missing processor type
+		possibleValueProcessors = MetaDataEnabledProcessingFactory.getInstance().
+		getAttributeValueRuntimeTypeFeatureProcessors(IPossibleValues.class, docContext, uri1, 
+				"MyTag", "MyMissingType");  //value in attr-val-runtime-type is invalid
+		
+		Assert.assertNotNull(possibleValueProcessors);
+		Assert.assertTrue(possibleValueProcessors.isEmpty());
+		
+		//invalid processor - type exists but does not support specified type
+		possibleValueProcessors = MetaDataEnabledProcessingFactory.getInstance().
+		getAttributeValueRuntimeTypeFeatureProcessors(IPossibleValues.class, docContext, uri1, 
+				"MyTag", "MyLongAttr");  //invalid 
+
+		Assert.assertNotNull(possibleValueProcessors);
+		Assert.assertTrue(possibleValueProcessors.isEmpty());
+		
+		//get extended feature - Bark Processors	
+		List barkProcessors	= MetaDataEnabledProcessingFactory.getInstance().
+		getAttributeValueRuntimeTypeFeatureProcessors(IBarker.class, docContext, uri1, 
+				"MyTag", "BooleanAttr");  //invalid 
+		
+		Assert.assertNotNull(barkProcessors);
+		Assert.assertTrue(!barkProcessors.isEmpty());
+		Assert.assertTrue(barkProcessors.size() == 1);
+		
+		IBarker barker = (IBarker)barkProcessors.get(0);
+		Iterator it = barker.getBarks().iterator();
+		while (it.hasNext()){
+			System.out.println((String)it.next());
+		}
+		
+	}
+	
+	public void testDualTypeTest(){
+		System.out.println("---------------- DualTypeTest ------------------");
+		//second plugin (metadataprocessingtests2 marks the same attr with another type
+		List possibleValueProcessors = MetaDataEnabledProcessingFactory.getInstance().
+			getAttributeValueRuntimeTypeFeatureProcessors(IPossibleValues.class, null, uri1, 
+				"MyTag", "MyDualTypeAttr");
+		Assert.assertNotNull(possibleValueProcessors);
+		Assert.assertEquals(2,possibleValueProcessors.size());
+		
+		List vals = new ArrayList();
+		Iterator it = possibleValueProcessors.iterator();
+		while (it.hasNext()){
+			IPossibleValues p = (IPossibleValues)it.next();
+			vals.addAll(p.getPossibleValues());
+			dumpPossibleValues(p);
+		}
+		Assert.assertTrue(vals.size() == 8);
+		System.out.println("---------------- END DualTypeTest ------------------");
+	}
+	
+	private void dumpPossibleValues(IPossibleValues p){
+		Iterator it = p.getPossibleValues().iterator();
+		while (it.hasNext()){
+			Object obj = it.next();
+			if (obj instanceof String)
+				System.out.println((String)obj);
+			else if (obj instanceof IPossibleValue)
+				System.out.println(((IPossibleValue)obj).getDisplayValue());
+		}
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/features/IBarker.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/features/IBarker.java
new file mode 100644
index 0000000..f39a512
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/features/IBarker.java
@@ -0,0 +1,11 @@
+package org.eclipse.jst.jsf.metadata.tests.metadataprocessing.features;
+
+import java.util.List;
+
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.IMetaDataEnabledFeature;
+
+public interface IBarker extends IMetaDataEnabledFeature {
+
+	public boolean canBark();
+	public List getBarks();
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/types/MyBooleanType.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/types/MyBooleanType.java
new file mode 100644
index 0000000..414b9c4
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/types/MyBooleanType.java
@@ -0,0 +1,7 @@
+package org.eclipse.jst.jsf.metadata.tests.metadataprocessing.types;
+
+import org.eclipse.jst.jsf.taglibprocessing.internal.provisional.attributevalues.BooleanType;
+
+public class MyBooleanType extends BooleanType {
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/types/MyLongType.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/types/MyLongType.java
new file mode 100644
index 0000000..382a048
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/metadataprocessing/types/MyLongType.java
@@ -0,0 +1,7 @@
+package org.eclipse.jst.jsf.metadata.tests.metadataprocessing.types;
+
+import org.eclipse.jst.jsf.taglibprocessing.internal.provisional.attributevalues.LongType;
+
+public class MyLongType extends LongType {
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/AllTests.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/AllTests.java
new file mode 100644
index 0000000..05f9850
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/AllTests.java
@@ -0,0 +1,22 @@
+package org.eclipse.jst.jsf.metadata.tests.taglibprocessing;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(
+				"Test for org.eclipse.jst.jsf.metadata.tests.taglibprocessing");
+		//$JUnit-BEGIN$
+		suite.addTestSuite(StringTypeTest.class);
+		suite.addTestSuite(BooleanTypeTest.class);
+		suite.addTestSuite(IntegerTypeTest.class);
+		suite.addTestSuite(LongTypeTest.class);
+		suite.addTestSuite(DoubleTypeTest.class);
+		suite.addTestSuite(JavaClassTypeTest.class);
+		//$JUnit-END$
+		return suite;
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/BooleanTypeTest.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/BooleanTypeTest.java
new file mode 100644
index 0000000..2fdfc9f
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/BooleanTypeTest.java
@@ -0,0 +1,50 @@
+package org.eclipse.jst.jsf.metadata.tests.taglibprocessing;
+
+
+import junit.framework.Assert;
+
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IDefaultValue;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValues;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IValidValues;
+
+
+public class BooleanTypeTest extends TaglibProcessingTestCase {
+	public void testPossibleValues(){		
+		Assert.assertNotNull(possibleValueAdapters);
+		Assert.assertFalse(possibleValueAdapters.isEmpty());
+		IPossibleValues pv =(IPossibleValues)getProcessorForTaglibProcessingBundle(possibleValueAdapters);
+		Assert.assertTrue(pv.getPossibleValues().size() == 2);
+		
+		//as the tests have added a second impl of IPossibleVals check
+		pv =(IPossibleValues)getBarkProcessingBundle(possibleValueAdapters);
+		Assert.assertNotNull(pv);
+		//however since "barks" metadata is not defined by the annotation file in that bundle, there are no return vals
+		Assert.assertTrue(pv.getPossibleValues().isEmpty());
+
+	}
+	
+	public void testValidValues(){		
+		Assert.assertNotNull(validValuesAdapters);
+		Assert.assertFalse(validValuesAdapters.isEmpty());
+		IValidValues vv =(IValidValues)getProcessorForTaglibProcessingBundle(validValuesAdapters);
+		Assert.assertTrue(vv.isValidValue("true"));
+		Assert.assertTrue(vv.getValidationMessages().size()==0);
+		Assert.assertTrue(vv.isValidValue("false"));
+		Assert.assertFalse(vv.isValidValue("False"));
+		Assert.assertFalse(vv.getValidationMessages().size()==0);
+		Assert.assertFalse(vv.isValidValue("blue"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+	}
+	
+	public void testDefaultValues(){		
+		Assert.assertNotNull(defaultValueAdapters);
+		Assert.assertFalse(defaultValueAdapters.isEmpty());
+		Assert.assertTrue(((IDefaultValue)getProcessorForTaglibProcessingBundle(defaultValueAdapters)).getDefaultValue().equals("true"));
+	}
+	
+	public void testCreateValues(){		
+		Assert.assertNotNull(createValuesAdapters);
+		Assert.assertTrue(createValuesAdapters.isEmpty());
+	}
+	
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/DoubleTypeTest.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/DoubleTypeTest.java
new file mode 100644
index 0000000..f2b4ff3
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/DoubleTypeTest.java
@@ -0,0 +1,52 @@
+package org.eclipse.jst.jsf.metadata.tests.taglibprocessing;
+
+import junit.framework.Assert;
+
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IDefaultValue;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IValidValues;
+
+public class DoubleTypeTest extends TaglibProcessingTestCase {
+	public void testPossibleValues(){		
+		Assert.assertNotNull(possibleValueAdapters);
+		Assert.assertTrue(possibleValueAdapters.isEmpty());
+	}
+	
+	public void testValidValues(){		
+		Assert.assertNotNull(validValuesAdapters);
+		Assert.assertFalse(validValuesAdapters.isEmpty());
+		
+		IValidValues vv =(IValidValues)getProcessorForTaglibProcessingBundle(validValuesAdapters);
+		Assert.assertFalse(vv.isValidValue("0"));
+		Assert.assertFalse(vv.getValidationMessages().size()==0);
+		Assert.assertTrue(vv.isValidValue("188.23"));
+		Assert.assertFalse(vv.isValidValue("0.0"));
+		Assert.assertFalse(vv.isValidValue("False"));
+		Assert.assertFalse(vv.getValidationMessages().size()==0);
+		Assert.assertFalse(vv.isValidValue("-1001"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+		Assert.assertFalse(vv.isValidValue("-1"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+		Assert.assertFalse(vv.isValidValue("555555555555555555"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+		Assert.assertFalse(vv.isValidValue("555f9"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+		Assert.assertFalse(vv.isValidValue("2e1"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+	}
+	
+	public void testDefaultValues(){		
+		Assert.assertNotNull(defaultValueAdapters);
+		Assert.assertFalse(defaultValueAdapters.isEmpty());
+		
+		IDefaultValue dv =(IDefaultValue)getProcessorForTaglibProcessingBundle(defaultValueAdapters);
+		Assert.assertTrue(dv.getDefaultValue() == null);
+//		Assert.assertTrue(dv.getDefaultValue().equals("10"));
+	}
+	
+	public void testCreateValues(){		
+		Assert.assertNotNull(createValuesAdapters);
+		Assert.assertTrue(createValuesAdapters.isEmpty());
+	}
+	
+	
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/IntegerTypeTest.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/IntegerTypeTest.java
new file mode 100644
index 0000000..ad1e464
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/IntegerTypeTest.java
@@ -0,0 +1,48 @@
+package org.eclipse.jst.jsf.metadata.tests.taglibprocessing;
+
+import junit.framework.Assert;
+
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IDefaultValue;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IValidValues;
+
+public class IntegerTypeTest extends TaglibProcessingTestCase {
+	public void testPossibleValues(){		
+		Assert.assertNotNull(possibleValueAdapters);
+		Assert.assertTrue(possibleValueAdapters.isEmpty());
+	}
+	
+	public void testValidValues(){		
+		Assert.assertNotNull(validValuesAdapters);
+		Assert.assertFalse(validValuesAdapters.isEmpty());
+		
+		IValidValues vv =(IValidValues)getProcessorForTaglibProcessingBundle(validValuesAdapters);
+		Assert.assertTrue(vv.isValidValue("0"));
+		Assert.assertTrue(vv.getValidationMessages().size()==0);
+		Assert.assertTrue(vv.isValidValue("255"));
+		Assert.assertFalse(vv.isValidValue("False"));
+		Assert.assertFalse(vv.getValidationMessages().size()==0);
+		Assert.assertFalse(vv.isValidValue("-1"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+		Assert.assertFalse(vv.isValidValue("555555555555555555"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+		Assert.assertFalse(vv.isValidValue("555f9"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+		Assert.assertFalse(vv.isValidValue("2e1"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+	}
+	
+	public void testDefaultValues(){		
+		Assert.assertNotNull(defaultValueAdapters);
+		Assert.assertFalse(defaultValueAdapters.isEmpty());
+		
+		IDefaultValue dv =(IDefaultValue)getProcessorForTaglibProcessingBundle(defaultValueAdapters);
+		Assert.assertTrue(dv.getDefaultValue() != null);
+		Assert.assertTrue(dv.getDefaultValue().equals("10"));
+	}
+	
+	public void testCreateValues(){		
+		Assert.assertNotNull(createValuesAdapters);
+		Assert.assertTrue(createValuesAdapters.isEmpty());
+	}
+	
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/JSFCoreTestCase.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/JSFCoreTestCase.java
new file mode 100644
index 0000000..65e00e4
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/JSFCoreTestCase.java
@@ -0,0 +1,7 @@
+package org.eclipse.jst.jsf.metadata.tests.taglibprocessing;
+
+public abstract class JSFCoreTestCase extends TaglibProcessingTestCase{
+	public void setUp(){
+		uri = "http://java.sun.com/jsf/core";
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/JSFHTMLTestCase.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/JSFHTMLTestCase.java
new file mode 100644
index 0000000..f84654d
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/JSFHTMLTestCase.java
@@ -0,0 +1,7 @@
+package org.eclipse.jst.jsf.metadata.tests.taglibprocessing;
+
+public abstract class JSFHTMLTestCase extends TaglibProcessingTestCase{
+	public void setUp(){
+		uri = "http://java.sun.com/jsf/html";
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/JavaClassTypeTest.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/JavaClassTypeTest.java
new file mode 100644
index 0000000..2e6a1db
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/JavaClassTypeTest.java
@@ -0,0 +1,18 @@
+package org.eclipse.jst.jsf.metadata.tests.taglibprocessing;
+
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValues;
+
+public class JavaClassTypeTest extends TaglibProcessingTestCase {
+	public void testPossibleValues(){
+		Assert.assertNotNull(possibleValueAdapters);
+		Assert.assertFalse(possibleValueAdapters.isEmpty());
+		IPossibleValues pv = (IPossibleValues)possibleValueAdapters.get(0);
+		pv.setStructuredDocumentContext(docContext);
+		List vals = pv.getPossibleValues();
+//		Assert.assertFalse(vals.isEmpty());
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/LongTypeTest.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/LongTypeTest.java
new file mode 100644
index 0000000..2b7cf91
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/LongTypeTest.java
@@ -0,0 +1,53 @@
+package org.eclipse.jst.jsf.metadata.tests.taglibprocessing;
+
+import junit.framework.Assert;
+
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IDefaultValue;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IValidValues;
+
+public class LongTypeTest extends TaglibProcessingTestCase {
+	public void testPossibleValues(){		
+		Assert.assertNotNull(possibleValueAdapters);
+		Assert.assertTrue(possibleValueAdapters.isEmpty());
+	}
+	
+	public void testValidValues(){		
+		Assert.assertNotNull(validValuesAdapters);
+		Assert.assertFalse(validValuesAdapters.isEmpty());
+		
+		IValidValues vv =(IValidValues)getProcessorForTaglibProcessingBundle(validValuesAdapters);
+		Assert.assertTrue(vv.isValidValue("0"));
+		Assert.assertTrue(vv.getValidationMessages().size()==0);
+		Assert.assertTrue(vv.isValidValue("1000"));
+		Assert.assertTrue(vv.isValidValue("-1000"));
+		Assert.assertFalse(vv.isValidValue("-10L"));
+		Assert.assertFalse(vv.isValidValue("False"));
+		Assert.assertFalse(vv.getValidationMessages().size()==0);
+		Assert.assertFalse(vv.isValidValue("-1001"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+		Assert.assertTrue(vv.isValidValue("-1"));
+		Assert.assertTrue(vv.getValidationMessages().size()==0);
+		Assert.assertFalse(vv.isValidValue("555555555555555555"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+		Assert.assertFalse(vv.isValidValue("555f9"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+		Assert.assertFalse(vv.isValidValue("2e1"));
+		Assert.assertTrue(vv.getValidationMessages().size()==1);
+	}
+	
+	public void testDefaultValues(){		
+		Assert.assertNotNull(defaultValueAdapters);
+		Assert.assertFalse(defaultValueAdapters.isEmpty());
+		
+		IDefaultValue dv =(IDefaultValue)getProcessorForTaglibProcessingBundle(defaultValueAdapters);
+		Assert.assertTrue(dv.getDefaultValue() == null);
+//		Assert.assertTrue(dv.getDefaultValue().equals("10"));
+	}
+	
+	public void testCreateValues(){		
+		Assert.assertNotNull(createValuesAdapters);
+		Assert.assertTrue(createValuesAdapters.isEmpty());
+	}
+	
+	
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/StringTypeTest.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/StringTypeTest.java
new file mode 100644
index 0000000..80cca7a
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/StringTypeTest.java
@@ -0,0 +1,55 @@
+package org.eclipse.jst.jsf.metadata.tests.taglibprocessing;
+
+import junit.framework.Assert;
+
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IDefaultValue;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValue;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValues;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IValidValues;
+
+
+public class StringTypeTest extends TaglibProcessingTestCase {
+	public void testPossibleValues(){		
+		Assert.assertNotNull(possibleValueAdapters);
+		Assert.assertFalse(possibleValueAdapters.isEmpty());
+		
+		IPossibleValues pv =(IPossibleValues)getProcessorForTaglibProcessingBundle(possibleValueAdapters);
+		Assert.assertTrue(pv.getPossibleValues().size() == 4);
+		
+		IPossibleValue val = (IPossibleValue)pv.getPossibleValues().get(0);
+		Assert.assertFalse(val.getDisplayValue().equals(val.getValue()));
+		Assert.assertTrue(val.getIcon().equals("/icons/foo.gif"));
+		Assert.assertTrue(val.isDefaultValue());
+		
+		val = (IPossibleValue)pv.getPossibleValues().get(1);
+		Assert.assertFalse(val.getDisplayValue().equals(val.getValue()));
+		Assert.assertTrue(val.getIcon().equals("/icons/foo.gif"));
+		Assert.assertFalse(val.isDefaultValue());
+	}
+	
+	public void testValidValues(){		
+		Assert.assertNotNull(validValuesAdapters);
+		Assert.assertFalse(validValuesAdapters.isEmpty());
+		
+		IValidValues vv =(IValidValues)getProcessorForTaglibProcessingBundle(possibleValueAdapters);
+		Assert.assertTrue(vv.isValidValue("A"));
+		Assert.assertTrue(vv.isValidValue("B"));
+		Assert.assertFalse(vv.isValidValue("a"));
+
+	}
+	
+	public void testDefaultValues(){		
+		Assert.assertNotNull(defaultValueAdapters);
+		Assert.assertFalse(defaultValueAdapters.isEmpty());
+		
+		IDefaultValue dv =(IDefaultValue)getProcessorForTaglibProcessingBundle(possibleValueAdapters);
+		Assert.assertNotNull(dv.getDefaultValue());
+
+	}
+	
+	public void testCreateValues(){		
+		Assert.assertNotNull(createValuesAdapters);
+		Assert.assertTrue(createValuesAdapters.isEmpty());
+	}
+	
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/TaglibProcessingTestCase.java b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/TaglibProcessingTestCase.java
new file mode 100644
index 0000000..cfc840b
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/src/org/eclipse/jst/jsf/metadata/tests/taglibprocessing/TaglibProcessingTestCase.java
@@ -0,0 +1,93 @@
+package org.eclipse.jst.jsf.metadata.tests.taglibprocessing;
+
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
+import org.eclipse.jst.jsf.metadata.tests.Activator;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.IMetaDataEnabledFeature;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.MetaDataEnabledProcessingFactory;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.ICreateValues;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IDefaultValue;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValues;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IValidValues;
+
+public class TaglibProcessingTestCase extends TestCase {
+	protected IStructuredDocumentContext docContext;
+	protected String uri = "http://org.eclipse.jsf/tagprocessing";
+	protected String bundle = "org.eclipse.jst.jsf.taglibprocessing";
+	protected String barkerBundle = Activator.ID_BUNDLE;
+	protected String tag = "MyTag";
+	protected String attributeName;
+	
+	protected List possibleValueAdapters;
+	protected List validValuesAdapters;
+	protected List defaultValueAdapters;
+	protected List createValuesAdapters;
+	
+	public void setUp(){
+		
+		docContext = getTestDocContext();
+		possibleValueAdapters = getProcessorAdapters(IPossibleValues.class);
+		validValuesAdapters = getProcessorAdapters(IValidValues.class);
+		defaultValueAdapters = getProcessorAdapters(IDefaultValue.class);
+		createValuesAdapters = getProcessorAdapters(ICreateValues.class);
+	}
+	
+	private IStructuredDocumentContext getTestDocContext() {
+		IJavaProject jproj = getProject();
+		IDocument doc = null;//figure it out
+		return IStructuredDocumentContextFactory.INSTANCE.getContext(doc, 0);
+	}
+
+	private IJavaProject getProject() {
+//		if (ResourcesPlugin.getWorkspace().getRoot().getProject("testProject")==null){
+//			//do we import??? or create new???
+//			Impor
+//			IJavaProject jp = new JavaProject(
+//		}
+//		return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot().getProject("testProject"));
+		return null;
+	}
+
+	protected String getAttributeNameFromTest(){
+		if (attributeName == null){
+			String test = this.getClass().getName();
+			test = test.substring(test.lastIndexOf(".") + 1);
+			test = test.substring(0,test.length() - 4);
+			return test;
+		} else
+			return attributeName;
+	}
+	
+	private List getProcessorAdapters(Class featureClass) {
+		return MetaDataEnabledProcessingFactory.getInstance().
+			getAttributeValueRuntimeTypeFeatureProcessors(featureClass, docContext, 
+					uri, tag , getAttributeNameFromTest());
+	}
+
+	private IMetaDataEnabledFeature getProcessorForBundle(List processors, String bundleID){
+		IMetaDataEnabledFeature ret = null;
+		Iterator it = processors.iterator();
+		while(it.hasNext()){
+			IMetaDataEnabledFeature feature = (IMetaDataEnabledFeature)it.next();
+			if (feature.getFeatureImplementer().getBundleID().equals(bundleID)){
+				ret = feature;
+				break;
+			}
+		}
+		return ret;
+	}
+	protected IMetaDataEnabledFeature getBarkProcessingBundle(List processors) {
+		return getProcessorForBundle(processors, barkerBundle);		
+	}
+	
+	protected IMetaDataEnabledFeature getProcessorForTaglibProcessingBundle(List processors) {
+		return getProcessorForBundle(processors, bundle);
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/CaseInsensitive.xml b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/CaseInsensitive.xml
new file mode 100644
index 0000000..31a1a01
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/CaseInsensitive.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar-annotations
+	xmlns="http://org.eclipse.wtp.jsf.core/grammarAnnotationSchema"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://org.eclipse.wtp.jsf.core/grammarAnnotationSchema" 	
+	caseSensitive="false">
+	<cm-element name="Foo">
+		<cm-attribute name="Value">
+			<property name="Type">
+				<value>String1</value>
+			</property>
+		</cm-attribute>
+		<property name="Type">
+			<value>String1</value>
+		</property>
+	</cm-element>
+</grammar-annotations>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/FileA.xml b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/FileA.xml
new file mode 100644
index 0000000..c8b9e11
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/FileA.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar-annotation xmlns:p="http://org.eclipse.wtp.jsf.core/grammarAnnotationSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://org.eclipse.wtp.jsf.core/grammarAnnotationSchema ../../../org.eclipse.wtp.jsf.core/schema/grammar-annotations.xsd ">
+  <cm-element name="Foo">
+  	<cm-attribute name="Value">
+  		<property name="Type">
+  			<value>String1</value>
+  		</property>
+  	</cm-attribute>
+	<property name="Type">
+		<value>String1</value>
+	</property>
+  </cm-element>
+</grammar-annotation>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/FileB.xml b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/FileB.xml
new file mode 100644
index 0000000..a77c641
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/FileB.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar-annotation 
+	xmlns="http://org.eclipse.wtp.jsf.core/grammarAnnotationSchema" 
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	>
+  <cm-element name="Foo">
+  	<cm-attribute name="Value">
+  		<property name="Type">
+  			<value>String2</value>
+  		</property>
+  	</cm-attribute>
+	<property name="Type">
+		<value>String2</value>
+	</property>
+  </cm-element>
+</grammar-annotation>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/TestJSP.jsp b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/TestJSP.jsp
new file mode 100644
index 0000000..edd40b1
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/TestJSP.jsp
@@ -0,0 +1,16 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+    pageEncoding="ISO-8859-1"%>
+<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
+<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Insert title here</title>
+</head>
+<body>
+	<f:view>
+		
+	</f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_metadataprocessing.xml b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_metadataprocessing.xml
new file mode 100644
index 0000000..cc14b6b
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_metadataprocessing.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar-annotation 
+	xmlns="http://org.eclipse.jsf.core/grammarAnnotationSchema"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+>
+
+  <cm-element name="MyTag">
+  	<cm-attribute name="MyBooleanAttr">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.metadata.tests.MyBooleanType</value>
+  		</property>
+  	</cm-attribute>
+  	  	<cm-attribute name="BooleanAttr">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.taglibprocessing.attributevalues.BooleanType</value>
+  		</property>
+  		<property name="barks">
+  			<value>woof</value>
+  			<value>ruff</value>
+  			<value>howllllllll</value>
+  		</property>
+  	</cm-attribute>
+  	<cm-attribute name="NutherBooleanAttr">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.taglibprocessing.attributevalues.BooleanType</value>
+  		</property>
+  		<property name="barks">
+  			<value>WOOF</value>
+  			<value>RUFF</value>
+  			<value>HOWLLL</value>
+  		</property>
+  	</cm-attribute>  	
+  	<cm-attribute name="MyValidValsAttr">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.metadata.tests.MyStringArrayType</value>
+  		</property>
+  		<property name="valid-values">
+  			<value>FirstVal</value>
+  			<value>SecondVal</value>
+  			<value>ThirdVal</value>
+  			<value>FourthVal</value>
+  		</property>
+  	</cm-attribute>
+  	<cm-attribute name="MyNonMetaDataEnabledAttr">
+  		<property name="valid-values">
+  			<value>FirstVal</value>
+  			<value>SecondVal</value>
+  			<value>ThirdVal</value>
+  			<value>FourthVal</value>
+  		</property>
+  	</cm-attribute>
+  	<cm-attribute name="MyNoImplMetaDataEnabledAttr">
+  	  	<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.metadata.tests.NoImplType</value>
+  		</property>
+  		<property name="valid-values">
+  			<value>FirstVal</value>
+  			<value>SecondVal</value>
+  			<value>ThirdVal</value>
+  			<value>FourthVal</value>
+  		</property>
+  	</cm-attribute>
+  	<cm-attribute name="MyDualTypeAttr">
+  	  	<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.metadata.tests.MyStringArrayType</value>
+  		</property>
+  		<property name="valid-values">
+  			<value>AFirstVal</value>
+  			<value>ASecondVal</value>
+  			<value>AThirdVal</value>
+  			<value>AFourthVal</value>
+  		</property>
+  	</cm-attribute>
+  	<cm-attribute name="MyLongAttr">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.metadata.tests.MyLongType</value>
+  		</property>
+  	</cm-attribute>
+  	<cm-attribute name="MyMissingType">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.metadata.tests.WhereIsIt</value>
+  		</property>
+  	</cm-attribute>
+  	<cm-attribute name="ValidatorID">
+	  	<property name="attribute-value-runtime-type">
+			<value>org.eclipse.jst.jsf.metadataprocessors.IdentifierType</value>
+		</property>
+	  	<property name="identifier-type">
+	  		<value>javax.faces.validator</value>
+	  	</property>
+  	</cm-attribute>
+  </cm-element>
+</grammar-annotation>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_tagprocessing.xml b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_tagprocessing.xml
new file mode 100644
index 0000000..2270a6a
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_tagprocessing.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar-annotation 
+	xmlns="http://org.eclipse.jsf.core/grammarAnnotationSchema"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+>
+
+  <cm-element name="MyTag">
+  	<cm-attribute name="BooleanType">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.taglibprocessing.attributevalues.BooleanType</value>
+  		</property>
+  		<property name="default-value">
+  			<value>true</value>
+  		</property>
+  	</cm-attribute>  	
+  	<cm-attribute name="StringType">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.taglibprocessing.attributevalues.StringType</value>
+  		</property>
+  		<property name="valid-values">
+  			<value>A</value>
+  			<value>B</value>
+  			<value>C</value>
+  			<value>D</value>
+  		</property>
+  		<property name="displayed-values">
+  			<value>A FirstVal</value>
+  			<value>B SecondVal</value>
+  			<value>C ThirdVal</value>
+  			<value>D FourthVal</value>
+  		</property>  		
+  		<property name = "small-icon">
+  			<value>/icons/foo.gif</value>
+  		</property>
+  		<property name = "default-value">
+  			<value>A</value>
+  		</property>
+  	</cm-attribute> 
+  	<cm-attribute name="IntegerType">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.taglibprocessing.attributevalues.IntegerType</value>
+  		</property>
+  		<property name="valid-minimum"><value>0</value></property>
+  		<property name="default-value"><value>10</value></property>
+  	</cm-attribute> 
+  	<cm-attribute name="LongType">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.taglibprocessing.attributevalues.LongType</value>
+  		</property>
+	  	<property name="valid-minimum"><value>-1000</value></property>
+  		<property name="valid-maximum"><value>1000</value></property>
+  	</cm-attribute>    	
+  	<cm-attribute name="DoubleType">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.taglibprocessing.attributevalues.DoubleType</value>
+  		</property>
+  		<property name="valid-values">
+  			<value>188.23</value>
+  			<value>245.32</value>
+  			<value>1</value>
+  		</property>
+  	</cm-attribute>    	
+  	<cm-attribute name="JavaClassType">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.taglibprocessing.attributevalues.JavaClassType</value>
+  		</property>
+  	</cm-attribute>   
+  	<cm-attribute name="MethodBindingType">
+  		<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.taglibprocessing.attributevalues.MethodBindingType</value>
+  		</property>
+  	</cm-attribute>   
+  </cm-element>
+</grammar-annotation>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_test.properties b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_test.properties
new file mode 100644
index 0000000..7b2299c
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_test.properties
@@ -0,0 +1,5 @@
+NLS1=a day in the life
+NLS2=another string
+
+
+
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_test.xml b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_test.xml
new file mode 100644
index 0000000..ba19d27
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_test.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar-annotations
+	xmlns="http://org.eclipse.wtp.jsf.core/grammarAnnotationSchema"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://org.eclipse.wtp.jsf.core/grammarAnnotationSchema" >
+	<cm-element name="validator">
+		<cm-attribute name="validatorId">
+			<property name="attr-val-content-assistant">
+				<value>com.eclipse.wtp.jsf.ui.internal.ValidatorAttrValueContentAssistant</value>
+			</property>
+			<property name="attr-val-runtime-type">
+				<value>com.eclipse.wtp.jsf.core.internal.model.datatype.Validator</value>
+			</property>
+		</cm-attribute>
+	</cm-element>
+	<cm-element name="nopropsOrAttrs">
+	</cm-element>
+	<cm-element name="noAttrs">
+		<property name="A">
+			<value>a</value>
+		</property>
+		<property name="B"> 
+			<value>b</value>
+		</property>
+	</cm-element>
+	<cm-element name="loaded">
+		<cm-attribute name="att1">
+			<property name="A1">
+				<value>a1</value>
+			</property>
+			<property name="B1">
+				<value>b1</value>
+			</property>
+		</cm-attribute>
+		<cm-attribute name="att2">
+			<property name="A2">
+				<value>a2</value>
+			</property>
+			<property name="B2">
+				<value>b2</value>
+			</property>
+		</cm-attribute>
+		<cm-attribute name="att3">
+			<property name="A3">
+				<value>a3</value>
+			</property>
+			<property name="B3">
+				<value>b3</value>
+			</property>
+			<property name="multival"> 
+				<value>1</value>
+				<value>2</value>
+				<value>3</value>
+			</property>
+		</cm-attribute>	
+		<property name="A">
+			<value>a</value>
+		</property>
+		<property name="B"> 
+			<value>b</value>
+		</property>
+		<property name="multival"> 
+			<value>1</value>
+			<value>2</value>
+			<value>3</value>
+		</property>
+	</cm-element>
+	<cm-element name="NLS">	
+		<cm-attribute name="NLS">	
+			<property name="NLS1">
+				<value>%NLS1</value>
+			</property>
+			<property name="NLS2">
+				<value>%NLS2</value>
+			</property>  
+			<property name="NLS3">
+				<value>%NLS3</value>
+			</property>  			
+			<property name="multival"> 
+				<value>%NLS1</value>
+				<value>%NLS2</value>
+			</property>		
+		</cm-attribute>	
+		<property name="NLS1">
+			<value>%NLS1</value>
+		</property>
+		<property name="NLS2">
+			<value>%NLS2</value>
+		</property>  
+		<property name="NLS3">
+			<value>%NLS3</value>
+		</property>  			
+		<property name="multival"> 
+			<value>%NLS1</value>
+			<value>%NLS2</value>
+		</property>
+		<property name="NullVal">
+			<value></value>
+		</property>					
+	</cm-element>
+</grammar-annotations>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_test_en_US.properties b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_test_en_US.properties
new file mode 100644
index 0000000..94c8b66
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadata.tests/testfiles/metadata/jsf_test_en_US.properties
@@ -0,0 +1,5 @@
+NLS1=a day in the life(en_US)
+NLS2=another string(en_US)
+
+
+
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/.classpath b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/.classpath
new file mode 100644
index 0000000..751c8f2
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/.cvsignore b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/.project b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/.project
new file mode 100644
index 0000000..27dce31
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.jsf.metadataprocessingtests2</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/META-INF/MANIFEST.MF b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3c0a5a9
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Metadataprocessingtests2 Plug-in
+Bundle-SymbolicName: org.eclipse.jst.jsf.metadataprocessingtests2;singleton:=true
+Bundle-Version: 0.5.0.qualifier
+Bundle-Activator: org.eclipse.jst.jsf.metadataprocessingtests2.Activator
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.jst.jsf.contentmodel.annotations,
+ org.eclipse.jst.jsf.metadataprocessors,
+ org.eclipse.jst.jsf.metadata.tests
+Eclipse-LazyStart: true
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/build.properties b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/metadata/jsf_metadataprocessing2.xml b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/metadata/jsf_metadataprocessing2.xml
new file mode 100644
index 0000000..ecbbd4b
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/metadata/jsf_metadataprocessing2.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar-annotation 
+	xmlns="http://org.eclipse.jsf.core/grammarAnnotationSchema"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+>
+
+  <cm-element name="MyTag">
+  	<cm-attribute name="MyDualTypeAttr">
+  	  	<property name="attribute-value-runtime-type">
+  			<value>org.eclipse.jst.jsf.metadata.tests.NoImplType</value>
+  		</property>
+  		<property name="valid-values">
+  			<value>BFirstVal</value>
+  			<value>BSecondVal</value>
+  			<value>BThirdVal</value>
+  			<value>BFourthVal</value>
+  		</property>
+  	</cm-attribute>
+  </cm-element>
+</grammar-annotation>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/plugin.xml b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/plugin.xml
new file mode 100644
index 0000000..5f0dedf
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/plugin.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension
+         point="org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles">
+      <annotationFile
+            location="/metadata/jsf_metadataprocessing2.xml"
+            uri=" http://org.eclipse.jsf/metadataprocessing"/>
+   </extension>
+   <extension
+         point="org.eclipse.jst.jsf.metadataprocessors.AttributeValueRuntimeTypes">
+      <attributeValueRuntimeType id="NoImplType"/>
+   </extension>
+   <extension
+         point="org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledFeatures">
+      <MetaDataEnabledFeature
+            class="org.eclipse.jst.jsf.metadataprocessingtests2.NoImplPossibleVals"
+            typeid="org.eclipse.jst.jsf.metadata.tests.NoImplType"/>
+   </extension>
+
+</plugin>
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/src/org/eclipse/jst/jsf/metadataprocessingtests2/Activator.java b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/src/org/eclipse/jst/jsf/metadataprocessingtests2/Activator.java
new file mode 100644
index 0000000..558981f
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/src/org/eclipse/jst/jsf/metadataprocessingtests2/Activator.java
@@ -0,0 +1,45 @@
+package org.eclipse.jst.jsf.metadataprocessingtests2;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class Activator extends Plugin {
+
+	//The shared instance.
+	private static Activator plugin;
+	
+	/**
+	 * The constructor.
+	 */
+	public Activator() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 *
+	 * @return the shared instance.
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/src/org/eclipse/jst/jsf/metadataprocessingtests2/NoImplPossibleVals.java b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/src/org/eclipse/jst/jsf/metadataprocessingtests2/NoImplPossibleVals.java
new file mode 100644
index 0000000..9f54375
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.metadataprocessingtests2/src/org/eclipse/jst/jsf/metadataprocessingtests2/NoImplPossibleVals.java
@@ -0,0 +1,32 @@
+package org.eclipse.jst.jsf.metadataprocessingtests2;
+
+
+import java.util.List;
+
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.AbstractMetaDataEnabledFeature;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.AbstractRootTypeDescriptor;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.IMetaDataEnabledFeature;
+import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValues;
+import org.eclipse.wtp.jsf.contentmodel.annotation.internal.provisional.CMAnnotationHelper;
+
+public class NoImplPossibleVals extends AbstractMetaDataEnabledFeature implements
+		IPossibleValues {
+
+	public NoImplPossibleVals() {
+		super();
+	}
+
+	public List getPossibleValues() {
+		return getPossibleVals();
+	}
+
+	private List getPossibleVals() {
+		return CMAnnotationHelper.getCMAttributePropertyValues(getCMAnnotationContext().getBundleId(), getCMAnnotationContext().getUri(),
+				getCMAnnotationContext().getElementName(), getCMAnnotationContext().getAttributeName(),
+				IPossibleValues.POSSIBLE_VALUES_PROP_NAME);
+
+	}
+	
+	
+
+}